complexclip3.cpp revision 669983856d99b9312be3166b7dd1f8483a90c315
1df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel/*
2df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel * Copyright 2014 Google Inc.
3df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel *
4df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel * Use of this source code is governed by a BSD-style license that can be
5df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel * found in the LICENSE file.
6df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel */
7df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel#include "gm.h"
8df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel#include "SkCanvas.h"
9df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel#include "SkPath.h"
10df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel
11df795036fdff68d0c3e1d53d50e1e3777df88668egdanielnamespace skiagm {
12df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel
13dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr SkColor gPathColor = SK_ColorYELLOW;
14df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel
15df795036fdff68d0c3e1d53d50e1e3777df88668egdanielclass ComplexClip3GM : public GM {
16df795036fdff68d0c3e1d53d50e1e3777df88668egdanielpublic:
17df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel    ComplexClip3GM(bool doSimpleClipFirst)
18df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        : fDoSimpleClipFirst(doSimpleClipFirst) {
1965cdba6ba78aaec0c0a4596bb5941020c789482bcaryclark        this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD));
20df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel    }
21df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel
22df795036fdff68d0c3e1d53d50e1e3777df88668egdanielprotected:
23df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel
24df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel    SkString onShortName() {
25df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        SkString str;
26df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        str.printf("complexclip3_%s", fDoSimpleClipFirst ? "simple" : "complex");
27df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        return str;
289d524f22bfde5dc3dc8f48e1be39bdebd3bb0304halcanary    }
29df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel
30df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel    SkISize onISize() { return SkISize::Make(1000, 950); }
31df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel
32df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel    virtual void onDraw(SkCanvas* canvas) {
33df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        SkPath clipSimple;
34df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        clipSimple.addCircle(SkIntToScalar(70), SkIntToScalar(50), SkIntToScalar(20));
35df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel
36df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        SkRect r1 = { 10, 20, 70, 80 };
37df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        SkPath clipComplex;
38df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        clipComplex.moveTo(SkIntToScalar(40),  SkIntToScalar(50));
39df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        clipComplex.arcTo(r1, SkIntToScalar(30), SkIntToScalar(300), false);
40df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        clipComplex.close();
41df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel
42df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        SkPath* firstClip = &clipSimple;
43df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        SkPath* secondClip = &clipComplex;
44df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel
45df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        if (!fDoSimpleClipFirst) {
46df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel            SkTSwap<SkPath*>(firstClip, secondClip);
47df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        }
48df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel
49df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        SkPaint paint;
50df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        paint.setAntiAlias(true);
511818acb6a4b11cd9a1d44ce5dde77452502a9796caryclark        sk_tool_utils::set_portable_typeface(&paint);
52df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        paint.setTextSize(SkIntToScalar(20));
53df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel
54dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein        constexpr struct {
5573603f3c52ffd89fe9d035be827b566a0e7d3b79reed            SkCanvas::ClipOp fOp;
5673603f3c52ffd89fe9d035be827b566a0e7d3b79reed            const char*      fName;
57df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        } gOps[] = {
5873603f3c52ffd89fe9d035be827b566a0e7d3b79reed            {SkCanvas::kIntersect_Op,         "I"},
5973603f3c52ffd89fe9d035be827b566a0e7d3b79reed            {SkCanvas::kDifference_Op,        "D" },
6073603f3c52ffd89fe9d035be827b566a0e7d3b79reed            {SkCanvas::kUnion_Op,             "U"},
6173603f3c52ffd89fe9d035be827b566a0e7d3b79reed            {SkCanvas::kXOR_Op,               "X"  },
6273603f3c52ffd89fe9d035be827b566a0e7d3b79reed            {SkCanvas::kReverseDifference_Op, "R"}
63df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        };
64df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel
65df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
66df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        canvas->scale(3 * SK_Scalar1 / 4, 3 * SK_Scalar1 / 4);
67df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel
68df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        SkPaint pathPaint;
69df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        pathPaint.setAntiAlias(true);
70df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        pathPaint.setColor(gPathColor);
71df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel
72df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        for (int invA = 0; invA < 2; ++invA) {
73df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel            for (int aaBits = 0; aaBits < 4; ++aaBits) {
74df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                canvas->save();
75df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); ++op) {
76df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                    for (int invB = 0; invB < 2; ++invB) {
77df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                        bool doAAA = SkToBool(aaBits & 1);
78df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                        bool doAAB = SkToBool(aaBits & 2);
79df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                        bool doInvA = SkToBool(invA);
80df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                        bool doInvB = SkToBool(invB);
81df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                        canvas->save();
82df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                        // set clip
83df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                        firstClip->setFillType(doInvA ? SkPath::kInverseEvenOdd_FillType :
84df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                                               SkPath::kEvenOdd_FillType);
85df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                        secondClip->setFillType(doInvB ? SkPath::kInverseEvenOdd_FillType :
86df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                                                SkPath::kEvenOdd_FillType);
87669983856d99b9312be3166b7dd1f8483a90c315reed                        canvas->clipPath(*firstClip, doAAA);
88df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                        canvas->clipPath(*secondClip, gOps[op].fOp, doAAB);
89df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel
90df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                        // draw rect clipped
91df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                        SkRect r = { 0, 0, 100, 100 };
92df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                        canvas->drawRect(r, pathPaint);
93df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                        canvas->restore();
94df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel
95df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel
96df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                        SkScalar txtX = SkIntToScalar(10);
97df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                        paint.setColor(SK_ColorBLACK);
98df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                        SkString str;
99df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                        str.printf("%s%s %s %s%s", doAAA ? "A" : "B",
100df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                                                   doInvA ? "I" : "N",
101df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                                                   gOps[op].fName,
102df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                                                   doAAB ? "A" : "B",
103df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                                                   doInvB ? "I" : "N");
104df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel
105df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                        canvas->drawText(str.c_str(), strlen(str.c_str()), txtX, SkIntToScalar(130),
106df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                                         paint);
107df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                        if (doInvB) {
108df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                            canvas->translate(SkIntToScalar(150),0);
109df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                        } else {
110df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                            canvas->translate(SkIntToScalar(120),0);
111df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                        }
112df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                    }
113df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                }
114df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                canvas->restore();
115df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel                canvas->translate(0, SkIntToScalar(150));
116df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel            }
117df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel        }
118df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel    }
119df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel
120df795036fdff68d0c3e1d53d50e1e3777df88668egdanielprivate:
121df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel    bool fDoSimpleClipFirst;
122df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel
123df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel    typedef GM INHERITED;
124df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel};
125df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel
126df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel//////////////////////////////////////////////////////////////////////////////
127df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel
128df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel// Simple clip first
129df795036fdff68d0c3e1d53d50e1e3777df88668egdanielDEF_GM( return new ComplexClip3GM(true); )
130df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel// Complex clip first
131df795036fdff68d0c3e1d53d50e1e3777df88668egdanielDEF_GM( return new ComplexClip3GM(false); )
132df795036fdff68d0c3e1d53d50e1e3777df88668egdaniel}
133