• 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 #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         this->inval(nullptr);
384     }
385 
386 private:
387     typedef SkView INHERITED;
388 };
389 
390 //////////////////////////////////////////////////////////////////////////////
391 
MyFactory()392 static SkView* MyFactory() { return new FuzzView; }
393 static SkViewRegister reg(MyFactory);
394