Home | History | Annotate | Download | only in samplecode
      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