1
2 /*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8 #include "SampleCode.h"
9 #include "SkView.h"
10 #include "SkCanvas.h"
11 #include "SkBlurMaskFilter.h"
12 #include "SkPaint.h"
13 #include "SkPath.h"
14 #include "SkXfermode.h"
15 #include "SkMatrix.h"
16 #include "SkColor.h"
17 #include "SkRandom.h"
18
set2x3(SkMatrix * m,float a,float b,float c,float d,float e,float f)19 static void set2x3(SkMatrix* m, float a, float b, float c, float d, float e, float f) {
20 m->reset();
21 m->set(0, a);
22 m->set(1, b);
23 m->set(2, c);
24 m->set(3, d);
25 m->set(4, e);
26 m->set(5, f);
27 }
28
29 static SkRandom gRand;
30 static bool return_large;
31 static bool return_undef;
32 static bool quick;
33 static bool scale_large;
34 static int scval = 1;
35 static float transval = 0;
36
R(float x)37 static int R(float x) {
38 return (int)floor(SkScalarToFloat(gRand.nextUScalar1()) * x);
39 }
40
huge()41 static float huge() {
42 double d = 1e100;
43 float f = (float)d;
44 return f;
45 }
46
make_number()47 static float make_number() {
48 float v = 0;
49 int sel;
50
51 if (return_large == true && R(3) == 1) sel = R(6); else sel = R(4);
52 if (return_undef == false && sel == 0) sel = 1;
53
54 if (R(2) == 1) v = (float)R(100); else
55
56 switch (sel) {
57 case 0: break;
58 case 1: v = 0; break;
59 case 2: v = 0.000001f; break;
60 case 3: v = 10000; break;
61 case 4: v = 2000000000; break;
62 case 5: v = huge(); break;
63 }
64
65 if (R(4) == 1) v = -v;
66 return v;
67 }
68
make_color()69 static SkColor make_color() {
70 if (R(2) == 1) return 0xFFC0F0A0; else return 0xFF000090;
71 }
72
73
make_fill()74 static SkColor make_fill() {
75 #if 0
76 int sel;
77
78 if (quick == true) sel = 0; else sel = R(6);
79
80 switch (sel) {
81
82 case 0:
83 case 1:
84 case 2:
85 return make_color();
86 break;
87
88 case 3:
89 var r = ctx.createLinearGradient(make_number(),make_number(),make_number(),make_number());
90 for (i=0;i<4;i++)
91 r.addColorStop(make_number(),make_color());
92 return r;
93 break;
94
95 case 4:
96 var r = ctx.createRadialGradient(make_number(),make_number(),make_number(),make_number(),make_number(),make_number());
97 for (i=0;i<4;i++)
98 r.addColorStop(make_number(),make_color());
99 return r;
100 break;
101
102 case 5:
103 var r = ctx.createPattern(imgObj,"repeat");
104 if (R(6) == 0)
105 r.addColorStop(make_number(),make_color());
106 return r;
107 break;
108 }
109 #else
110 return make_color();
111 #endif
112 }
113
114
do_fuzz(SkCanvas * canvas)115 static void do_fuzz(SkCanvas* canvas) {
116 SkPath path;
117 SkPaint paint;
118 paint.setAntiAlias(true);
119
120 for (int i=0;i<100;i++) {
121 switch (R(33)) {
122
123 case 0:
124 paint.setColor(make_fill());
125 break;
126
127 case 1:
128 paint.setAlpha(gRand.nextU() & 0xFF);
129 break;
130
131 case 2: {
132 SkXfermode::Mode mode;
133 switch (R(3)) {
134 case 0: mode = SkXfermode::kSrc_Mode; break;
135 case 1: mode = SkXfermode::kXor_Mode; break;
136 case 2:
137 default: // silence warning
138 mode = SkXfermode::kSrcOver_Mode; break;
139 }
140 paint.setXfermodeMode(mode);
141 }
142 break;
143
144 case 3:
145 switch (R(2)) {
146 case 0: paint.setStrokeCap(SkPaint::kRound_Cap); break;
147 case 1: paint.setStrokeCap(SkPaint::kButt_Cap); break;
148 }
149 break;
150
151 case 4:
152 switch (R(2)) {
153 case 0: paint.setStrokeJoin(SkPaint::kRound_Join); break;
154 case 1: paint.setStrokeJoin(SkPaint::kMiter_Join); break;
155 }
156 break;
157
158 case 5:
159 paint.setStrokeWidth(make_number());
160 break;
161
162 case 6:
163 paint.setStrokeMiter(make_number());
164 break;
165
166 case 7:
167 if (quick == true) break;
168 SkSafeUnref(paint.setMaskFilter(SkBlurMaskFilter::Create(make_number(), SkBlurMaskFilter::kNormal_BlurStyle)));
169 break;
170
171 case 8:
172 if (quick == true) break;
173 //ctx.shadowColor = make_fill();
174 break;
175
176 case 9:
177 if (quick == true) break;
178 //ctx.shadowOffsetX = make_number();
179 //ctx.shadowOffsetY = make_number();
180 break;
181
182 case 10:
183 canvas->restore();
184 break;
185
186 case 11:
187 canvas->rotate(make_number());
188 break;
189
190 case 12:
191 canvas->save();
192 break;
193
194 case 13:
195 canvas->scale(-1,-1);
196 break;
197
198 case 14:
199
200 if (quick == true) break;
201
202 if (transval == 0) {
203 transval = make_number();
204 canvas->translate(transval,0);
205 } else {
206 canvas->translate(-transval,0);
207 transval = 0;
208 }
209
210 break;
211
212 case 15: {
213 SkRect r;
214 r.set(make_number(),make_number(),make_number(),make_number());
215 SkPaint::Style s = paint.getStyle();
216 paint.setStyle(SkPaint::kFill_Style);
217 canvas->drawRect(r, paint);
218 paint.setStyle(s);
219 // clearrect
220 } break;
221
222 case 16:
223 if (quick == true) break;
224 // ctx.drawImage(imgObj,make_number(),make_number(),make_number(),make_number(),make_number(),make_number(),make_number(),make_number());
225 break;
226
227 case 17: {
228 SkRect r;
229 r.set(make_number(),make_number(),make_number(),make_number());
230 SkPaint::Style s = paint.getStyle();
231 paint.setStyle(SkPaint::kFill_Style);
232 canvas->drawRect(r, paint);
233 paint.setStyle(s);
234 } break;
235
236 case 18:
237 path.reset();
238 break;
239
240 case 19:
241 // ctx.clip() is evil.
242 break;
243
244 case 20:
245 path.close();
246 break;
247
248 case 21: {
249 SkPaint::Style s = paint.getStyle();
250 paint.setStyle(SkPaint::kFill_Style);
251 canvas->drawPath(path, paint);
252 paint.setStyle(s);
253 } break;
254
255 case 22: {
256 SkPaint::Style s = paint.getStyle();
257 paint.setStyle(SkPaint::kFill_Style);
258 canvas->drawPath(path, paint);
259 paint.setStyle(s);
260 } break;
261
262 case 23: {
263 SkRect r;
264 r.set(make_number(),make_number(),make_number(),make_number());
265 SkPaint::Style s = paint.getStyle();
266 paint.setStyle(SkPaint::kStroke_Style);
267 canvas->drawRect(r, paint);
268 paint.setStyle(s);
269 } break;
270
271 case 24:
272 if (quick == true) break;
273 //ctx.arc(make_number(),make_number(),make_number(),make_number(),make_number(),true);
274 break;
275
276 case 25:
277 if (quick == true) break;
278 //ctx.arcTo(make_number(),make_number(),make_number(),make_number(),make_number());
279 break;
280
281 case 26:
282 if (quick == true) break;
283 //ctx.bezierCurveTo(make_number(),make_number(),make_number(),make_number(),make_number(),make_number());
284 break;
285
286 case 27:
287 path.lineTo(make_number(),make_number());
288 break;
289
290 case 28:
291 path.moveTo(make_number(),make_number());
292 break;
293
294 case 29:
295 if (quick == true) break;
296 path.quadTo(make_number(),make_number(),make_number(),make_number());
297 break;
298
299 case 30: {
300 if (quick == true) break;
301 SkMatrix matrix;
302 set2x3(&matrix, make_number(),make_number(),make_number(),make_number(),make_number(),make_number());
303 canvas->concat(matrix);
304 } break;
305
306 case 31: {
307 if (quick == true) break;
308 SkMatrix matrix;
309 set2x3(&matrix, make_number(),make_number(),make_number(),make_number(),make_number(),make_number());
310 canvas->setMatrix(matrix);
311 } break;
312
313 case 32:
314
315 if (scale_large == true) {
316
317 switch (scval) {
318 case 0: canvas->scale(-1000000000,1);
319 canvas->scale(-1000000000,1);
320 scval = 1; break;
321 case 1: canvas->scale(-.000000001f,1); scval = 2; break;
322 case 2: canvas->scale(-.000000001f,1); scval = 0; break;
323 }
324
325 }
326
327 break;
328
329
330
331 }
332 }
333
334 }
335
336 //////////////////////////////////////////////////////////////////////////////
337
338 class FuzzView : public SampleView {
339 public:
FuzzView()340 FuzzView() {
341 this->setBGColor(0xFFDDDDDD);
342 }
343
344 protected:
345 // overrides from SkEventSink
onQuery(SkEvent * evt)346 virtual bool onQuery(SkEvent* evt) {
347 if (SampleCode::TitleQ(*evt)) {
348 SampleCode::TitleR(evt, "Fuzzer");
349 return true;
350 }
351 return this->INHERITED::onQuery(evt);
352 }
353
drawBG(SkCanvas * canvas)354 void drawBG(SkCanvas* canvas) {
355 canvas->drawColor(0xFFDDDDDD);
356 }
357
onDrawContent(SkCanvas * canvas)358 virtual void onDrawContent(SkCanvas* canvas) {
359 do_fuzz(canvas);
360 this->inval(NULL);
361 }
362
363 private:
364 typedef SkView INHERITED;
365 };
366
367 //////////////////////////////////////////////////////////////////////////////
368
MyFactory()369 static SkView* MyFactory() { return new FuzzView; }
370 static SkViewRegister reg(MyFactory);
371
372