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