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