• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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