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