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