1 #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 "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 34 static float huge() { 35 double d = 1e100; 36 float f = (float)d; 37 return f; 38 } 39 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 47 if (R(2) == 1) v = (float)R(100); else 48 49 switch (sel) { 50 case 0: break; 51 case 1: v = 0; break; 52 case 2: v = 0.000001f; break; 53 case 3: v = 10000; break; 54 case 4: v = 2000000000; break; 55 case 5: v = huge(); break; 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: { 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 } 131 paint.setXfermodeMode(mode); 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; 159 SkSafeUnref(paint.setMaskFilter(SkBlurMaskFilter::Create(make_number(), SkBlurMaskFilter::kNormal_BlurStyle))); 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; 312 case 1: canvas->scale(-.000000001f,1); scval = 2; break; 313 case 2: canvas->scale(-.000000001f,1); scval = 0; break; 314 } 315 316 } 317 318 break; 319 320 321 322 } 323 } 324 325 } 326 327 ////////////////////////////////////////////////////////////////////////////// 328 329 class FuzzView : public SampleView { 330 public: 331 FuzzView() { 332 this->setBGColor(0xFFDDDDDD); 333 } 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 349 virtual void onDrawContent(SkCanvas* canvas) { 350 SkIRect r = canvas->getTotalClip().getBounds(); 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 364