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