blob: 1036db611ad19386940e54d44bdf85ee7b1ada8d [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001#include "SampleCode.h"
2#include "SkView.h"
3#include "SkCanvas.h"
4#include "SkGradientShader.h"
5#include "SkPath.h"
6#include "SkRegion.h"
7#include "SkShader.h"
8#include "SkUtils.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +00009#include "Sk1DPathEffect.h"
10#include "SkCornerPathEffect.h"
11#include "SkPathMeasure.h"
12#include "SkRandom.h"
13#include "SkColorPriv.h"
14#include "SkPixelXorXfermode.h"
15
16static void test_grow(SkPath* path)
17{
18 for (int i = 0; i < 100000; i++)
19 {
20 path->lineTo(i, i);
21 path->lineTo(i, i*2);
22 }
23}
24
25#define CORNER_RADIUS 12
26static SkScalar gPhase;
27
28static const int gXY[] = {
29 4, 0, 0, -4, 8, -4, 12, 0, 8, 4, 0, 4
30};
31
32static SkPathEffect* make_pe(int flags)
33{
34 if (flags == 1)
35 return new SkCornerPathEffect(SkIntToScalar(CORNER_RADIUS));
36
37 SkPath path;
38 path.moveTo(SkIntToScalar(gXY[0]), SkIntToScalar(gXY[1]));
39 for (unsigned i = 2; i < SK_ARRAY_COUNT(gXY); i += 2)
40 path.lineTo(SkIntToScalar(gXY[i]), SkIntToScalar(gXY[i+1]));
41 path.close();
42 path.offset(SkIntToScalar(-6), 0);
43
44 SkPathEffect* outer = new SkPath1DPathEffect(path, SkIntToScalar(12), gPhase, SkPath1DPathEffect::kRotate_Style);
45
46 if (flags == 2)
47 return outer;
48
49 SkPathEffect* inner = new SkCornerPathEffect(SkIntToScalar(CORNER_RADIUS));
50
51 SkPathEffect* pe = new SkComposePathEffect(outer, inner);
52 outer->unref();
53 inner->unref();
54 return pe;
55}
56
57static SkPathEffect* make_warp_pe()
58{
59 SkPath path;
60 path.moveTo(SkIntToScalar(gXY[0]), SkIntToScalar(gXY[1]));
61 for (unsigned i = 2; i < SK_ARRAY_COUNT(gXY); i += 2)
62 path.lineTo(SkIntToScalar(gXY[i]), SkIntToScalar(gXY[i+1]));
63 path.close();
64 path.offset(SkIntToScalar(-6), 0);
65
66 SkPathEffect* outer = new SkPath1DPathEffect(path, SkIntToScalar(12), gPhase, SkPath1DPathEffect::kMorph_Style);
67 SkPathEffect* inner = new SkCornerPathEffect(SkIntToScalar(CORNER_RADIUS));
68
69 SkPathEffect* pe = new SkComposePathEffect(outer, inner);
70 outer->unref();
71 inner->unref();
72 return pe;
73}
74
75///////////////////////////////////////////////////////////
76
77#include "SkColorFilter.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000078#include "SkLayerRasterizer.h"
79
80class testrast : public SkLayerRasterizer {
81public:
82 testrast()
83 {
84 SkPaint paint;
85 paint.setAntiAlias(true);
86
87#if 0
88 paint.setStyle(SkPaint::kStroke_Style);
89 paint.setStrokeWidth(SK_Scalar1*4);
90 this->addLayer(paint);
91
92 paint.setStrokeWidth(SK_Scalar1*1);
reed@android.com048522d2009-06-23 12:19:41 +000093 paint.setXfermode(SkXfermode::kClear_Mode);
reed@android.com8a1c16f2008-12-17 15:59:43 +000094 this->addLayer(paint);
95#else
96 paint.setAlpha(0x66);
97 this->addLayer(paint, SkIntToScalar(4), SkIntToScalar(4));
98
99 paint.setAlpha(0xFF);
100 this->addLayer(paint);
101#endif
102 }
103};
104
105class PathEffectView : public SkView {
106 SkPath fPath;
107 SkPoint fClickPt;
108public:
109 PathEffectView()
110 {
111 SkRandom rand;
112 int steps = 20;
113 SkScalar dist = SkIntToScalar(500);
114 SkScalar x = SkIntToScalar(20);
115 SkScalar y = SkIntToScalar(50);
116
117 fPath.moveTo(x, y);
118 for (int i = 0; i < steps; i++)
119 {
120 x += dist/steps;
121 fPath.lineTo(x, y + SkIntToScalar(rand.nextS() % 25));
122 }
123
124 fClickPt.set(SkIntToScalar(200), SkIntToScalar(200));
125 }
126
127protected:
128 // overrides from SkEventSink
129 virtual bool onQuery(SkEvent* evt)
130 {
131 if (SampleCode::TitleQ(*evt))
132 {
133 SampleCode::TitleR(evt, "PathEffects");
134 return true;
135 }
136 return this->INHERITED::onQuery(evt);
137 }
138
139 void drawBG(SkCanvas* canvas)
140 {
141 canvas->drawColor(0xFFDDDDDD);
142
143#if 0
144 SkPath path;
145 test_grow(&path);
146 SkPaint p;
147
148 p.setAntiAlias(true);
149 p.setStyle(SkPaint::kStroke_Style);
150 p.setStrokeWidth(SK_Scalar1);
151 canvas->drawPath(path, p);
152 path.close();
153#endif
154 }
155
156 virtual void onDraw(SkCanvas* canvas)
157 {
158 this->drawBG(canvas);
159
160 if (true)
161 {
162 canvas->drawColor(SK_ColorWHITE);
163
164 SkPixelXorXfermode mode(SK_ColorWHITE);
165 SkPaint paint;
166
167 paint.setColor(SK_ColorRED);
168 paint.setXfermode(&mode);
169 paint.setStrokeWidth(SkIntToScalar(8));
170
171 canvas->drawLine(SkIntToScalar(100), SkIntToScalar(100),
172 SkIntToScalar(200), SkIntToScalar(200), paint);
173 canvas->drawLine(SkIntToScalar(100), SkIntToScalar(200),
174 SkIntToScalar(200), SkIntToScalar(100), paint);
175 // return;
176 }
177
178 if (false)
179 {
180 SkPath path;
181 SkPoint pts[] = { SkIntToScalar(100), SkIntToScalar(100),
182 SkIntToScalar(200), SkIntToScalar(100),
183 SkIntToScalar(100), SkIntToScalar(200)
184 };
185 SkPaint paint;
186
187 pts[2] = fClickPt;
188
189 paint.setAntiAlias(true);
190 paint.setStyle(SkPaint::kStroke_Style);
191 paint.setStrokeWidth(SkIntToScalar(5));
192
193 path.moveTo(pts[0]);
194 path.arcTo(pts[1], pts[2], SkIntToScalar(50));
195 canvas->drawPath(path, paint);
196
197 paint.setStrokeWidth(0);
198 paint.setColor(SK_ColorRED);
199 canvas->drawLine(pts[0].fX, pts[0].fY, pts[1].fX, pts[1].fY, paint);
200 canvas->drawLine(pts[1].fX, pts[1].fY, pts[2].fX, pts[2].fY, paint);
201 return;
202 }
203
204 gPhase -= SK_Scalar1;
reed@android.com671cd652009-05-22 20:44:12 +0000205 this->inval(NULL);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000206
207 SkPaint paint;
208
209 paint.setAntiAlias(true);
210 paint.setStyle(SkPaint::kStroke_Style);
211 paint.setStrokeWidth(SkIntToScalar(5));
212 canvas->drawPath(fPath, paint);
213 paint.setStrokeWidth(0);
214
215 paint.setColor(SK_ColorRED);
216 paint.setPathEffect(make_pe(1))->unref();
217 canvas->drawPath(fPath, paint);
218
219 canvas->translate(0, SkIntToScalar(50));
220
221 paint.setColor(SK_ColorBLUE);
222 paint.setPathEffect(make_pe(2))->unref();
223 canvas->drawPath(fPath, paint);
224
225 canvas->translate(0, SkIntToScalar(50));
226
227 paint.setARGB(0xFF, 0, 0xBB, 0);
228 paint.setPathEffect(make_pe(3))->unref();
229 canvas->drawPath(fPath, paint);
230
231 canvas->translate(0, SkIntToScalar(50));
232
233 paint.setARGB(0xFF, 0, 0, 0);
234 paint.setPathEffect(make_warp_pe())->unref();
235 paint.setRasterizer(new testrast)->unref();
236 canvas->drawPath(fPath, paint);
237
238 {
239 SkRect oval;
240
241 oval.set(SkIntToScalar(50), SkIntToScalar(100),
242 SkIntToScalar(150), SkIntToScalar(150));
243 canvas->drawRoundRect(oval, SkIntToScalar(8), SkIntToScalar(8), paint);
244 }
245
246 {
247 SkRect bounds;
248 SkPaint paint;
249
250 paint.setAntiAlias(true);
251 paint.setAlpha(0x80);
252 paint.setColorFilter(
reed@android.com845fdac2009-06-23 03:01:32 +0000253 SkColorFilter::CreateModeFilter(
254 SkColorSetARGB(0x44, 0, 0xFF, 0), SkXfermode::kSrcATop_Mode))->unref();
reed@android.com8a1c16f2008-12-17 15:59:43 +0000255
256 bounds.set(SkIntToScalar(10), SkIntToScalar(10), SkIntToScalar(150), SkIntToScalar(70));
257 canvas->saveLayer(&bounds, &paint,
258 (SkCanvas::SaveFlags)(SkCanvas::kHasAlphaLayer_SaveFlag | SkCanvas::kFullColorLayer_SaveFlag));
259
260 paint.setColorFilter(NULL);
261 paint.setColor(SK_ColorRED);
262 canvas->drawOval(bounds, paint);
263
264 paint.setColor(SK_ColorBLUE);
265 paint.setAlpha(0x80);
266 bounds.inset(SkIntToScalar(10), SkIntToScalar(10));
267 canvas->drawOval(bounds, paint);
268
269 canvas->restore();
270 }
271 }
272
273private:
274 typedef SkView INHERITED;
275};
276
277//////////////////////////////////////////////////////////////////////////////
278
279static SkView* MyFactory() { return new PathEffectView; }
280static SkViewRegister reg(MyFactory);
281