1 2 /* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 #include "SampleCode.h" 9 #include "SkBlurMask.h" 10 #include "SkBlurDrawLooper.h" 11 #include "SkCanvas.h" 12 #include "SkPath.h" 13 #include "SkPathMeasure.h" 14 15 #define REPEAT_COUNT 1 16 17 static void textStrokePath(SkCanvas* canvas) { 18 SkPaint paint; 19 SkPath path; 20 SkRect rect; 21 22 canvas->save(); 23 canvas->scale(SkIntToScalar(250),SkIntToScalar(250)); 24 25 rect.set(0.0f, 0.21f, 26 0.78f, 0.99f); 27 28 path.addArc(rect, SkIntToScalar(280), SkIntToScalar(350)); 29 30 paint.setAntiAlias(true); 31 paint.setStyle(SkPaint::kStroke_Style); 32 paint.setColor(0xFFFF0000); 33 paint.setTextSize(0.085f); 34 paint.setStrokeWidth(.005f); 35 36 canvas->drawPath(path, paint); 37 38 paint.setLooper(SkBlurDrawLooper::Create(SK_ColorBLACK, 39 SkBlurMask::ConvertRadiusToSigma(0.002f), 40 0.0f, 41 0.0f))->unref(); 42 43 const char* text = "DRAWING STROKED TEXT WITH A BLUR ON A PATH"; 44 size_t len = strlen(text); 45 46 canvas->drawTextOnPathHV(text, len, path, 0, 47 -0.025f, paint); 48 canvas->restore(); 49 } 50 51 static void textPathMatrix(SkCanvas* canvas) { 52 SkPaint paint; 53 SkPath path; 54 SkMatrix matrix; 55 56 path.moveTo(SkIntToScalar(050), SkIntToScalar(200)); 57 path.quadTo(SkIntToScalar(250), SkIntToScalar(000), 58 SkIntToScalar(450), SkIntToScalar(200)); 59 60 paint.setAntiAlias(true); 61 62 paint.setStyle(SkPaint::kStroke_Style); 63 canvas->drawPath(path, paint); 64 paint.setStyle(SkPaint::kFill_Style); 65 paint.setTextSize(SkIntToScalar(48)); 66 paint.setTextAlign(SkPaint::kRight_Align); 67 68 const char* text = "Reflection"; 69 size_t len = strlen(text); 70 71 SkPathMeasure meas(path, false); 72 SkScalar pathLen = meas.getLength(); 73 74 canvas->drawTextOnPath(text, len, path, nullptr, paint); 75 76 paint.setColor(SK_ColorRED); 77 matrix.setScale(-SK_Scalar1, SK_Scalar1); 78 matrix.postTranslate(pathLen, 0); 79 canvas->drawTextOnPath(text, len, path, &matrix, paint); 80 81 paint.setColor(SK_ColorBLUE); 82 matrix.setScale(SK_Scalar1, -SK_Scalar1); 83 canvas->drawTextOnPath(text, len, path, &matrix, paint); 84 85 paint.setColor(SK_ColorGREEN); 86 matrix.setScale(-SK_Scalar1, -SK_Scalar1); 87 matrix.postTranslate(pathLen, 0); 88 canvas->drawTextOnPath(text, len, path, &matrix, paint); 89 } 90 91 class TextOnPathView : public SampleView { 92 public: 93 SkPath fPath; 94 SkScalar fHOffset; 95 96 protected: 97 void onOnceBeforeDraw() override { 98 SkRect r; 99 r.set(SkIntToScalar(100), SkIntToScalar(100), 100 SkIntToScalar(300), SkIntToScalar(300)); 101 fPath.addOval(r); 102 fPath.offset(SkIntToScalar(-50), SkIntToScalar(-50)); 103 104 fHOffset = SkIntToScalar(50); 105 } 106 107 // overrides from SkEventSink 108 bool onQuery(SkEvent* evt) override { 109 if (SampleCode::TitleQ(*evt)) { 110 SampleCode::TitleR(evt, "Text On Path"); 111 return true; 112 } 113 return this->INHERITED::onQuery(evt); 114 } 115 116 void onDrawContent(SkCanvas* canvas) override { 117 SkPaint paint; 118 paint.setAntiAlias(true); 119 paint.setTextSize(SkIntToScalar(48)); 120 121 const char* text = "Hamburgefons"; 122 size_t len = strlen(text); 123 124 for (int j = 0; j < REPEAT_COUNT; j++) { 125 SkScalar x = fHOffset; 126 127 paint.setColor(SK_ColorBLACK); 128 canvas->drawTextOnPathHV(text, len, fPath, 129 x, paint.getTextSize()/2, paint); 130 131 paint.setColor(SK_ColorRED); 132 canvas->drawTextOnPathHV(text, len, fPath, 133 x + SkIntToScalar(50), 0, paint); 134 135 paint.setColor(SK_ColorBLUE); 136 canvas->drawTextOnPathHV(text, len, fPath, 137 x + SkIntToScalar(100), -paint.getTextSize()/2, paint); 138 } 139 140 paint.setColor(SK_ColorGREEN); 141 paint.setStyle(SkPaint::kStroke_Style); 142 canvas->drawPath(fPath, paint); 143 144 canvas->translate(SkIntToScalar(275), 0); 145 textStrokePath(canvas); 146 147 canvas->translate(SkIntToScalar(-275), SkIntToScalar(250)); 148 textPathMatrix(canvas); 149 150 if (REPEAT_COUNT > 1) 151 this->inval(nullptr); 152 } 153 154 SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override { 155 fHints += 1; 156 this->inval(nullptr); 157 return this->INHERITED::onFindClickHandler(x, y, modi); 158 } 159 160 bool onClick(Click* click) override { 161 return this->INHERITED::onClick(click); 162 } 163 164 private: 165 int fHints; 166 typedef SampleView INHERITED; 167 }; 168 169 ////////////////////////////////////////////////////////////////////////////// 170 171 static SkView* MyFactory() { 172 return new TextOnPathView; 173 } 174 175 static SkViewRegister reg(MyFactory); 176