blob: 36149c391a6540fc6108709b2356935e2697985f [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() {
tomhudson@google.com2c2508d2011-07-29 13:44:30 +000048 float v = 0;
reed@android.com49f0ff22009-03-19 21:52:42 +000049 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)) {
tomhudson@google.com83a44462011-10-27 15:27:51 +0000134 case 0: mode = SkXfermode::kSrc_Mode; break;
reed@android.com048522d2009-06-23 12:19:41 +0000135 case 1: mode = SkXfermode::kXor_Mode; break;
tomhudson@google.com83a44462011-10-27 15:27:51 +0000136 case 2:
137 default: // silence warning
138 mode = SkXfermode::kSrcOver_Mode; break;
reed@android.com048522d2009-06-23 12:19:41 +0000139 }
reed@android.com5ebbe142009-11-05 21:04:00 +0000140 paint.setXfermodeMode(mode);
reed@android.com49f0ff22009-03-19 21:52:42 +0000141 }
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;
bsalomon@google.com96959212011-02-08 22:03:36 +0000168 SkSafeUnref(paint.setMaskFilter(SkBlurMaskFilter::Create(make_number(), SkBlurMaskFilter::kNormal_BlurStyle)));
reed@android.com49f0ff22009-03-19 21:52:42 +0000169 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;
reed@google.com261b8e22011-04-14 17:53:24 +0000321 case 1: canvas->scale(-.000000001f,1); scval = 2; break;
322 case 2: canvas->scale(-.000000001f,1); scval = 0; break;
reed@android.com49f0ff22009-03-19 21:52:42 +0000323 }
324
325 }
326
327 break;
328
329
330
331 }
332 }
333
334}
335
336//////////////////////////////////////////////////////////////////////////////
337
mike@reedtribe.org5fd92432011-05-05 01:59:48 +0000338class FuzzView : public SampleView {
reed@android.com49f0ff22009-03-19 21:52:42 +0000339public:
mike@reedtribe.org5fd92432011-05-05 01:59:48 +0000340 FuzzView() {
341 this->setBGColor(0xFFDDDDDD);
342 }
reed@android.com49f0ff22009-03-19 21:52:42 +0000343
344protected:
345 // overrides from SkEventSink
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
354 void drawBG(SkCanvas* canvas) {
355 canvas->drawColor(0xFFDDDDDD);
356 }
357
mike@reedtribe.org5fd92432011-05-05 01:59:48 +0000358 virtual void onDrawContent(SkCanvas* canvas) {
reed@android.com49f0ff22009-03-19 21:52:42 +0000359 do_fuzz(canvas);
360 this->inval(NULL);
361 }
362
363private:
364 typedef SkView INHERITED;
365};
366
367//////////////////////////////////////////////////////////////////////////////
368
369static SkView* MyFactory() { return new FuzzView; }
370static SkViewRegister reg(MyFactory);
371