complexclip.cpp revision 807cec4397cb50a64de7355ae129cc7c8f2c772b
1#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}
153