Home | History | Annotate | Download | only in gm
      1 #include "gm.h"
      2 #include "SkCanvas.h"
      3 //#include "SkParsePath.h"
      4 #include "SkPath.h"
      5 //#include "SkRandom.h"
      6 
      7 namespace skiagm {
      8 
      9 class ComplexClipGM : public GM {
     10 public:
     11 	ComplexClipGM() {
     12     }
     13 
     14 protected:
     15 
     16     SkString onShortName() {
     17         return SkString("complexclip");
     18     }
     19 
     20     SkISize onISize() { return make_isize(550, 1000); }
     21 
     22     void drawBG(SkCanvas* canvas) {
     23         canvas->drawColor(SkColorSetRGB(0xA0,0xDD,0xA0));
     24     }
     25 
     26     virtual void onDraw(SkCanvas* canvas) {
     27         SkPath path;
     28         path.moveTo(SkIntToScalar(0),   SkIntToScalar(50));
     29         path.quadTo(SkIntToScalar(0),   SkIntToScalar(0),   SkIntToScalar(50),  SkIntToScalar(0));
     30         path.lineTo(SkIntToScalar(175), SkIntToScalar(0));
     31         path.quadTo(SkIntToScalar(200), SkIntToScalar(0),   SkIntToScalar(200), SkIntToScalar(25));
     32         path.lineTo(SkIntToScalar(200), SkIntToScalar(150));
     33         path.quadTo(SkIntToScalar(200), SkIntToScalar(200), SkIntToScalar(150), SkIntToScalar(200));
     34         path.lineTo(SkIntToScalar(0),   SkIntToScalar(200));
     35         path.close();
     36         path.moveTo(SkIntToScalar(50),  SkIntToScalar(50));
     37         path.lineTo(SkIntToScalar(150), SkIntToScalar(50));
     38         path.lineTo(SkIntToScalar(150), SkIntToScalar(125));
     39         path.quadTo(SkIntToScalar(150), SkIntToScalar(150), SkIntToScalar(125), SkIntToScalar(150));
     40         path.lineTo(SkIntToScalar(50),  SkIntToScalar(150));
     41         path.close();
     42         path.setFillType(SkPath::kEvenOdd_FillType);
     43         SkColor pathColor = SK_ColorBLACK;
     44         SkPaint pathPaint;
     45         pathPaint.setAntiAlias(true);
     46         pathPaint.setColor(pathColor);
     47 
     48         SkPath clipA;
     49         clipA.moveTo(SkIntToScalar(10),  SkIntToScalar(20));
     50         clipA.lineTo(SkIntToScalar(165), SkIntToScalar(22));
     51         clipA.lineTo(SkIntToScalar(70),  SkIntToScalar(105));
     52         clipA.lineTo(SkIntToScalar(165), SkIntToScalar(177));
     53         clipA.lineTo(SkIntToScalar(-5),  SkIntToScalar(180));
     54         clipA.close();
     55         SkColor colorA = SK_ColorCYAN;
     56 
     57         SkPath clipB;
     58         clipB.moveTo(SkIntToScalar(40),  SkIntToScalar(10));
     59         clipB.lineTo(SkIntToScalar(190), SkIntToScalar(15));
     60         clipB.lineTo(SkIntToScalar(195), SkIntToScalar(190));
     61         clipB.lineTo(SkIntToScalar(40),  SkIntToScalar(185));
     62         clipB.lineTo(SkIntToScalar(155), SkIntToScalar(100));
     63         clipB.close();
     64         SkColor colorB = SK_ColorRED;
     65 
     66         drawBG(canvas);
     67         SkPaint paint;
     68         paint.setAntiAlias(true);
     69 
     70         paint.setStyle(SkPaint::kStroke_Style);
     71         paint.setStrokeWidth(0);
     72 
     73         canvas->translate(SkIntToScalar(10),SkIntToScalar(10));
     74         canvas->drawPath(path, pathPaint);
     75         paint.setColor(colorA);
     76         canvas->drawPath(clipA, paint);
     77         paint.setColor(colorB);
     78         canvas->drawPath(clipB, paint);
     79 
     80         static const struct {
     81             SkRegion::Op fOp;
     82             const char*  fName;
     83         } gOps[] = { //extra spaces in names for measureText
     84             {SkRegion::kIntersect_Op,         "Isect "},
     85             {SkRegion::kDifference_Op,        "Diff " },
     86             {SkRegion::kUnion_Op,             "Union "},
     87             {SkRegion::kXOR_Op,               "Xor "  },
     88             {SkRegion::kReverseDifference_Op, "RDiff "}
     89         };
     90 
     91         canvas->translate(0, SkIntToScalar(40));
     92         canvas->scale(3 * SK_Scalar1 / 4, 3 * SK_Scalar1 / 4);
     93         canvas->save();
     94 
     95         for (int invA = 0; invA < 2; ++invA) {
     96             for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); ++op) {
     97                 int idx = invA * SK_ARRAY_COUNT(gOps) + op;
     98                 if (!(idx % 3)) {
     99                     canvas->restore();
    100                     canvas->translate(0, SkIntToScalar(250));
    101                     canvas->save();
    102                 }
    103                 canvas->save();
    104                     // set clip
    105                     clipA.setFillType(invA ? SkPath::kInverseEvenOdd_FillType :
    106                                              SkPath::kEvenOdd_FillType);
    107                     canvas->clipPath(clipA);
    108                     canvas->clipPath(clipB, gOps[op].fOp);
    109 
    110                     // draw path clipped
    111                     canvas->drawPath(path, pathPaint);
    112                 canvas->restore();
    113 
    114                 // draw path in hairline
    115                 paint.setColor(pathColor);
    116                 canvas->drawPath(path, paint);
    117 
    118                 // draw clips in hair line
    119                 paint.setColor(colorA);
    120                 canvas->drawPath(clipA, paint);
    121                 paint.setColor(colorB);
    122                 canvas->drawPath(clipB, paint);
    123 
    124                 paint.setTextSize(SkIntToScalar(20));
    125 
    126                 SkScalar txtX = SkIntToScalar(55);
    127                 paint.setColor(colorA);
    128                 const char* aTxt = invA ? "InverseA " : "A ";
    129                 canvas->drawText(aTxt, strlen(aTxt), txtX, SkIntToScalar(220), paint);
    130                 txtX += paint.measureText(aTxt, strlen(aTxt));
    131                 paint.setColor(SK_ColorBLACK);
    132                 canvas->drawText(gOps[op].fName, strlen(gOps[op].fName),
    133                                     txtX, SkIntToScalar(220), paint);
    134                 txtX += paint.measureText(gOps[op].fName, strlen(gOps[op].fName));
    135                 paint.setColor(colorB);
    136                 canvas->drawText("B", 1, txtX, SkIntToScalar(220), paint);
    137 
    138                 canvas->translate(SkIntToScalar(250),0);
    139             }
    140         }
    141         canvas->restore();
    142     }
    143 private:
    144     typedef GM INHERITED;
    145 };
    146 
    147 //////////////////////////////////////////////////////////////////////////////
    148 
    149 static GM* MyFactory(void*) { return new ComplexClipGM; }
    150 static GMRegistry reg(MyFactory);
    151 
    152 }
    153