More variable initializations and curly braces to avoid Linux compiler
[platform/upstream/libSkiaSharp.git] / samplecode / SampleFuzz.cpp
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
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
37 static int R(float x) {
38   return (int)floor(SkScalarToFloat(gRand.nextUScalar1()) * x);
39 }
40
41 static float huge() {
42     double d = 1e100;
43     float f = (float)d;
44     return f;
45 }
46
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
69 static SkColor make_color() {
70   if (R(2) == 1) return 0xFFC0F0A0; else return 0xFF000090;
71 }
72
73
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
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: mode = SkXfermode::kSrcOver_Mode; break;
137           }
138           paint.setXfermodeMode(mode);
139       }
140       break;
141
142     case 3:
143       switch (R(2)) {
144           case 0: paint.setStrokeCap(SkPaint::kRound_Cap); break;
145         case 1: paint.setStrokeCap(SkPaint::kButt_Cap); break;
146       }      
147       break;
148
149     case 4:
150       switch (R(2)) {
151           case 0: paint.setStrokeJoin(SkPaint::kRound_Join); break;
152         case 1: paint.setStrokeJoin(SkPaint::kMiter_Join); break;
153       }      
154       break;
155
156     case 5: 
157       paint.setStrokeWidth(make_number()); 
158       break;
159
160     case 6: 
161       paint.setStrokeMiter(make_number());
162       break;
163
164     case 7: 
165       if (quick == true) break;
166           SkSafeUnref(paint.setMaskFilter(SkBlurMaskFilter::Create(make_number(), SkBlurMaskFilter::kNormal_BlurStyle)));
167       break;
168
169     case 8: 
170       if (quick == true) break;
171       //ctx.shadowColor = make_fill(); 
172       break;
173
174     case 9: 
175       if (quick == true) break;
176       //ctx.shadowOffsetX = make_number();
177       //ctx.shadowOffsetY = make_number();
178       break;
179
180     case 10:
181       canvas->restore();
182       break;
183
184     case 11:
185       canvas->rotate(make_number());
186       break;
187
188     case 12:
189       canvas->save();
190       break;
191
192     case 13:
193       canvas->scale(-1,-1);
194       break;
195
196     case 14:
197
198       if (quick == true) break;
199
200       if (transval == 0) {
201         transval = make_number();
202         canvas->translate(transval,0);
203       } else {
204         canvas->translate(-transval,0);
205         transval = 0;
206       }
207
208       break;
209
210           case 15: {
211               SkRect r;
212               r.set(make_number(),make_number(),make_number(),make_number());
213               SkPaint::Style s = paint.getStyle();
214               paint.setStyle(SkPaint::kFill_Style);
215               canvas->drawRect(r, paint);
216               paint.setStyle(s);
217               // clearrect
218           } break;
219
220     case 16:
221       if (quick == true) break;
222 //      ctx.drawImage(imgObj,make_number(),make_number(),make_number(),make_number(),make_number(),make_number(),make_number(),make_number());
223       break;
224
225           case 17: {
226           SkRect r;
227           r.set(make_number(),make_number(),make_number(),make_number());
228               SkPaint::Style s = paint.getStyle();
229               paint.setStyle(SkPaint::kFill_Style);
230           canvas->drawRect(r, paint);
231               paint.setStyle(s);
232           } break;
233
234     case 18:
235           path.reset();
236       break;
237
238     case 19:
239       // ctx.clip() is evil.
240       break;
241
242     case 20:
243           path.close();
244       break;
245
246           case 21: {
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 22: {
254               SkPaint::Style s = paint.getStyle();
255               paint.setStyle(SkPaint::kFill_Style);
256               canvas->drawPath(path, paint);
257               paint.setStyle(s);
258           } break;
259           
260           case 23: {
261               SkRect r;
262               r.set(make_number(),make_number(),make_number(),make_number());
263               SkPaint::Style s = paint.getStyle();
264               paint.setStyle(SkPaint::kStroke_Style);
265               canvas->drawRect(r, paint);
266               paint.setStyle(s);
267           } break;
268           
269     case 24:
270       if (quick == true) break;
271       //ctx.arc(make_number(),make_number(),make_number(),make_number(),make_number(),true);
272       break;
273
274     case 25:
275       if (quick == true) break;
276       //ctx.arcTo(make_number(),make_number(),make_number(),make_number(),make_number());
277       break;
278
279     case 26:
280       if (quick == true) break;
281       //ctx.bezierCurveTo(make_number(),make_number(),make_number(),make_number(),make_number(),make_number());
282       break;
283
284     case 27:
285       path.lineTo(make_number(),make_number());
286       break;
287
288     case 28:
289       path.moveTo(make_number(),make_number());
290       break;
291
292     case 29:
293       if (quick == true) break;
294       path.quadTo(make_number(),make_number(),make_number(),make_number());
295       break;
296
297           case 30: {
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->concat(matrix);
302           } break;
303
304           case 31: {
305       if (quick == true) break;
306           SkMatrix matrix;
307           set2x3(&matrix, make_number(),make_number(),make_number(),make_number(),make_number(),make_number());
308           canvas->setMatrix(matrix);
309           } break;
310
311     case 32:
312
313       if (scale_large == true) {
314
315         switch (scval) {
316           case 0: canvas->scale(-1000000000,1); 
317                   canvas->scale(-1000000000,1);
318                   scval = 1; break;
319           case 1: canvas->scale(-.000000001f,1); scval = 2; break;
320           case 2: canvas->scale(-.000000001f,1); scval = 0; break;
321         }
322
323       }
324
325       break;
326
327
328
329   }
330   }
331
332 }
333
334 //////////////////////////////////////////////////////////////////////////////
335
336 class FuzzView : public SampleView {
337 public:
338         FuzzView() {
339         this->setBGColor(0xFFDDDDDD);
340     }
341     
342 protected:
343     // overrides from SkEventSink
344     virtual bool onQuery(SkEvent* evt) {
345         if (SampleCode::TitleQ(*evt)) {
346             SampleCode::TitleR(evt, "Fuzzer");
347             return true;
348         }
349         return this->INHERITED::onQuery(evt);
350     }
351     
352     void drawBG(SkCanvas* canvas) {
353         canvas->drawColor(0xFFDDDDDD);
354     }
355     
356     virtual void onDrawContent(SkCanvas* canvas) {
357         SkIRect r = canvas->getTotalClip().getBounds();
358         do_fuzz(canvas);
359         this->inval(NULL);
360     }
361     
362 private:
363     typedef SkView INHERITED;
364 };
365
366 //////////////////////////////////////////////////////////////////////////////
367
368 static SkView* MyFactory() { return new FuzzView; }
369 static SkViewRegister reg(MyFactory);
370