• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
ComplexClipGM()11 	ComplexClipGM() {
12     }
13 
14 protected:
15 
onShortName()16     SkString onShortName() {
17         return SkString("complexclip");
18     }
19 
onISize()20     SkISize onISize() { return make_isize(550, 1000); }
21 
drawBG(SkCanvas * canvas)22     void drawBG(SkCanvas* canvas) {
23         canvas->drawColor(SkColorSetRGB(0xA0,0xDD,0xA0));
24     }
25 
onDraw(SkCanvas * canvas)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 
MyFactory(void *)149 static GM* MyFactory(void*) { return new ComplexClipGM; }
150 static GMRegistry reg(MyFactory);
151 
152 }
153