• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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