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