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
8 #include "gm.h"
9 #include "SkFlattenableBuffers.h"
10 #include "SkLayerRasterizer.h"
11 #include "SkBlurMaskFilter.h"
12
r0(SkLayerRasterizer * rast,SkPaint & p)13 static void r0(SkLayerRasterizer* rast, SkPaint& p) {
14 p.setMaskFilter(SkBlurMaskFilter::Create(SkIntToScalar(3),
15 SkBlurMaskFilter::kNormal_BlurStyle))->unref();
16 rast->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
17
18 p.setMaskFilter(NULL);
19 p.setStyle(SkPaint::kStroke_Style);
20 p.setStrokeWidth(SK_Scalar1);
21 rast->addLayer(p);
22
23 p.setAlpha(0x11);
24 p.setStyle(SkPaint::kFill_Style);
25 p.setXfermodeMode(SkXfermode::kSrc_Mode);
26 rast->addLayer(p);
27 }
28
r1(SkLayerRasterizer * rast,SkPaint & p)29 static void r1(SkLayerRasterizer* rast, SkPaint& p) {
30 rast->addLayer(p);
31
32 p.setAlpha(0x40);
33 p.setXfermodeMode(SkXfermode::kSrc_Mode);
34 p.setStyle(SkPaint::kStroke_Style);
35 p.setStrokeWidth(SK_Scalar1*2);
36 rast->addLayer(p);
37 }
38
r2(SkLayerRasterizer * rast,SkPaint & p)39 static void r2(SkLayerRasterizer* rast, SkPaint& p) {
40 p.setStyle(SkPaint::kStrokeAndFill_Style);
41 p.setStrokeWidth(SK_Scalar1*4);
42 rast->addLayer(p);
43
44 p.setStyle(SkPaint::kStroke_Style);
45 p.setStrokeWidth(SK_Scalar1*3/2);
46 p.setXfermodeMode(SkXfermode::kClear_Mode);
47 rast->addLayer(p);
48 }
49
r3(SkLayerRasterizer * rast,SkPaint & p)50 static void r3(SkLayerRasterizer* rast, SkPaint& p) {
51 p.setStyle(SkPaint::kStroke_Style);
52 p.setStrokeWidth(SK_Scalar1*3);
53 rast->addLayer(p);
54
55 p.setAlpha(0x20);
56 p.setStyle(SkPaint::kFill_Style);
57 p.setXfermodeMode(SkXfermode::kSrc_Mode);
58 rast->addLayer(p);
59 }
60
r4(SkLayerRasterizer * rast,SkPaint & p)61 static void r4(SkLayerRasterizer* rast, SkPaint& p) {
62 p.setAlpha(0x60);
63 rast->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
64
65 p.setAlpha(0xFF);
66 p.setXfermodeMode(SkXfermode::kClear_Mode);
67 rast->addLayer(p, SK_Scalar1*3/2, SK_Scalar1*3/2);
68
69 p.setXfermode(NULL);
70 rast->addLayer(p);
71 }
72
73 #include "SkDiscretePathEffect.h"
74
r5(SkLayerRasterizer * rast,SkPaint & p)75 static void r5(SkLayerRasterizer* rast, SkPaint& p) {
76 rast->addLayer(p);
77
78 p.setPathEffect(new SkDiscretePathEffect(SK_Scalar1*4, SK_Scalar1*3))->unref();
79 p.setXfermodeMode(SkXfermode::kSrcOut_Mode);
80 rast->addLayer(p);
81 }
82
r6(SkLayerRasterizer * rast,SkPaint & p)83 static void r6(SkLayerRasterizer* rast, SkPaint& p) {
84 rast->addLayer(p);
85
86 p.setAntiAlias(false);
87 SkLayerRasterizer* rast2 = new SkLayerRasterizer;
88 r5(rast2, p);
89 p.setRasterizer(rast2)->unref();
90 p.setXfermodeMode(SkXfermode::kClear_Mode);
91 rast->addLayer(p);
92 }
93
94 #include "Sk2DPathEffect.h"
95
MakeDotEffect(SkScalar radius,const SkMatrix & matrix)96 static SkPathEffect* MakeDotEffect(SkScalar radius, const SkMatrix& matrix) {
97 SkPath path;
98 path.addCircle(0, 0, radius);
99 return new SkPath2DPathEffect(matrix, path);
100 }
101
r7(SkLayerRasterizer * rast,SkPaint & p)102 static void r7(SkLayerRasterizer* rast, SkPaint& p) {
103 SkMatrix lattice;
104 lattice.setScale(SK_Scalar1*6, SK_Scalar1*6, 0, 0);
105 lattice.postSkew(SK_Scalar1/3, 0, 0, 0);
106 p.setPathEffect(MakeDotEffect(SK_Scalar1*4, lattice))->unref();
107 rast->addLayer(p);
108 }
109
r8(SkLayerRasterizer * rast,SkPaint & p)110 static void r8(SkLayerRasterizer* rast, SkPaint& p) {
111 rast->addLayer(p);
112
113 SkMatrix lattice;
114 lattice.setScale(SK_Scalar1*6, SK_Scalar1*6, 0, 0);
115 lattice.postSkew(SK_Scalar1/3, 0, 0, 0);
116 p.setPathEffect(MakeDotEffect(SK_Scalar1*2, lattice))->unref();
117 p.setXfermodeMode(SkXfermode::kClear_Mode);
118 rast->addLayer(p);
119
120 p.setPathEffect(NULL);
121 p.setXfermode(NULL);
122 p.setStyle(SkPaint::kStroke_Style);
123 p.setStrokeWidth(SK_Scalar1);
124 rast->addLayer(p);
125 }
126
r9(SkLayerRasterizer * rast,SkPaint & p)127 static void r9(SkLayerRasterizer* rast, SkPaint& p) {
128 rast->addLayer(p);
129
130 SkMatrix lattice;
131 lattice.setScale(SK_Scalar1, SK_Scalar1*6, 0, 0);
132 lattice.postRotate(SkIntToScalar(30), 0, 0);
133 p.setPathEffect(new SkLine2DPathEffect(SK_Scalar1*2, lattice))->unref();
134 p.setXfermodeMode(SkXfermode::kClear_Mode);
135 rast->addLayer(p);
136
137 p.setPathEffect(NULL);
138 p.setXfermode(NULL);
139 p.setStyle(SkPaint::kStroke_Style);
140 p.setStrokeWidth(SK_Scalar1);
141 rast->addLayer(p);
142 }
143
144 typedef void (*raster_proc)(SkLayerRasterizer*, SkPaint&);
145
146 static const raster_proc gRastProcs[] = {
147 r0, r1, r2, r3, r4, r5, r6, r7, r8, r9
148 };
149
150 #include "SkXfermode.h"
151
apply_shader(SkPaint * paint,int index)152 static void apply_shader(SkPaint* paint, int index) {
153 raster_proc proc = gRastProcs[index];
154 if (proc)
155 {
156 SkPaint p;
157 SkLayerRasterizer* rast = new SkLayerRasterizer;
158
159 p.setAntiAlias(true);
160 proc(rast, p);
161 paint->setRasterizer(rast)->unref();
162 }
163
164 #if 0
165 SkScalar dir[] = { SK_Scalar1, SK_Scalar1, SK_Scalar1 };
166 paint->setMaskFilter(SkBlurMaskFilter::CreateEmboss(dir, SK_Scalar1/4, SkIntToScalar(4), SkIntToScalar(3)))->unref();
167 #endif
168 paint->setColor(SK_ColorBLUE);
169 }
170
171 class TextEffectsGM : public skiagm::GM {
172 public:
TextEffectsGM()173 TextEffectsGM() {}
174
175 protected:
onShortName()176 virtual SkString onShortName() SK_OVERRIDE {
177 return SkString("texteffects");
178 }
179
onISize()180 virtual SkISize onISize() SK_OVERRIDE {
181 return SkISize::Make(460, 680);
182 }
183
onDraw(SkCanvas * canvas)184 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
185 canvas->save();
186
187 SkPaint paint;
188 paint.setAntiAlias(true);
189 paint.setTextSize(SkIntToScalar(56));
190
191 SkScalar x = SkIntToScalar(20);
192 SkScalar y = paint.getTextSize();
193
194 SkString str("Hamburgefons");
195
196 for (size_t i = 0; i < SK_ARRAY_COUNT(gRastProcs); i++) {
197 apply_shader(&paint, i);
198
199 // paint.setMaskFilter(NULL);
200 // paint.setColor(SK_ColorBLACK);
201
202 canvas->drawText(str.c_str(), str.size(), x, y, paint);
203
204 y += paint.getFontSpacing();
205 }
206
207 canvas->restore();
208 }
209
210 private:
211 typedef skiagm::GM INHERITED;
212 };
213
214 //////////////////////////////////////////////////////////////////////////////
215
MyFactory(void *)216 static skiagm::GM* MyFactory(void*) { return new TextEffectsGM; }
217 static skiagm::GMRegistry reg(MyFactory);
218