blob: 867d230db264c263d72a2b6ed6d7703544019542 [file] [log] [blame]
bsalomon@google.com807cec42011-03-10 19:20:15 +00001#include "gm.h"
2#include "SkCanvas.h"
3//#include "SkParsePath.h"
4#include "SkPath.h"
5//#include "SkRandom.h"
6
7namespace skiagm {
8
9class ComplexClipGM : public GM {
10public:
11 ComplexClipGM() {
12 }
13
14protected:
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 }
143private:
144 typedef GM INHERITED;
145};
146
147//////////////////////////////////////////////////////////////////////////////
148
149static GM* MyFactory(void*) { return new ComplexClipGM; }
150static GMRegistry reg(MyFactory);
151
152}