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