• 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      }
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