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