blob: a6495b33e0d997b394ca75e7c2892d890a08fd5c [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
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 */
reed@android.com49f0ff22009-03-19 21:52:42 +00008#include "SampleCode.h"
9#include "SkView.h"
10#include "SkCanvas.h"
11#include "SkBlurMaskFilter.h"
12#include "SkPaint.h"
13#include "SkPath.h"
reed@android.com49f0ff22009-03-19 21:52:42 +000014#include "SkXfermode.h"
15#include "SkMatrix.h"
16#include "SkColor.h"
17#include "SkRandom.h"
18
19static 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
29static SkRandom gRand;
30static bool return_large;
31static bool return_undef;
32static bool quick;
33static bool scale_large;
34static int scval = 1;
35static float transval = 0;
36
37static int R(float x) {
38 return (int)floor(SkScalarToFloat(gRand.nextUScalar1()) * x);
39}
40
reed@google.com261b8e22011-04-14 17:53:24 +000041static float huge() {
42 double d = 1e100;
43 float f = (float)d;
44 return f;
45}
46
reed@android.com49f0ff22009-03-19 21:52:42 +000047static float make_number() {
48 float v;
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
reed@google.com261b8e22011-04-14 17:53:24 +000054 if (R(2) == 1) v = (float)R(100); else
reed@android.com49f0ff22009-03-19 21:52:42 +000055
56 switch (sel) {
57 case 0: break;
58 case 1: v = 0; break;
reed@google.com261b8e22011-04-14 17:53:24 +000059 case 2: v = 0.000001f; break;
reed@android.com49f0ff22009-03-19 21:52:42 +000060 case 3: v = 10000; break;
61 case 4: v = 2000000000; break;
reed@google.com261b8e22011-04-14 17:53:24 +000062 case 5: v = huge(); break;
reed@android.com49f0ff22009-03-19 21:52:42 +000063 }
64
65 if (R(4) == 1) v = -v;
66 return v;
67}
68
69static SkColor make_color() {
70 if (R(2) == 1) return 0xFFC0F0A0; else return 0xFF000090;
71}
72
73
74static 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
115static 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: {
reed@android.com048522d2009-06-23 12:19:41 +0000132 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 }
reed@android.com5ebbe142009-11-05 21:04:00 +0000138 paint.setXfermodeMode(mode);
reed@android.com49f0ff22009-03-19 21:52:42 +0000139 }
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;
bsalomon@google.com96959212011-02-08 22:03:36 +0000166 SkSafeUnref(paint.setMaskFilter(SkBlurMaskFilter::Create(make_number(), SkBlurMaskFilter::kNormal_BlurStyle)));
reed@android.com49f0ff22009-03-19 21:52:42 +0000167 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;
reed@google.com261b8e22011-04-14 17:53:24 +0000319 case 1: canvas->scale(-.000000001f,1); scval = 2; break;
320 case 2: canvas->scale(-.000000001f,1); scval = 0; break;
reed@android.com49f0ff22009-03-19 21:52:42 +0000321 }
322
323 }
324
325 break;
326
327
328
329 }
330 }
331
332}
333
334//////////////////////////////////////////////////////////////////////////////
335
mike@reedtribe.org5fd92432011-05-05 01:59:48 +0000336class FuzzView : public SampleView {
reed@android.com49f0ff22009-03-19 21:52:42 +0000337public:
mike@reedtribe.org5fd92432011-05-05 01:59:48 +0000338 FuzzView() {
339 this->setBGColor(0xFFDDDDDD);
340 }
reed@android.com49f0ff22009-03-19 21:52:42 +0000341
342protected:
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
mike@reedtribe.org5fd92432011-05-05 01:59:48 +0000356 virtual void onDrawContent(SkCanvas* canvas) {
reed@android.com5ebbe142009-11-05 21:04:00 +0000357 SkIRect r = canvas->getTotalClip().getBounds();
reed@android.com49f0ff22009-03-19 21:52:42 +0000358 do_fuzz(canvas);
359 this->inval(NULL);
360 }
361
362private:
363 typedef SkView INHERITED;
364};
365
366//////////////////////////////////////////////////////////////////////////////
367
368static SkView* MyFactory() { return new FuzzView; }
369static SkViewRegister reg(MyFactory);
370