1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2011 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SampleCode.h"
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h"
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPath.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkView.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkClipOpPriv.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ComplexClipView : public SampleView {
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ComplexClipView() {
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->setBGColor(0xFFA0DDA0);
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // overrides from SkEventSink
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual bool onQuery(SkEvent* evt) {
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (SampleCode::TitleQ(*evt)) {
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SampleCode::TitleR(evt, "ComplexClip");
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            return true;
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return this->INHERITED::onQuery(evt);
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual void onDrawContent(SkCanvas* canvas) {
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPath path;
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path.moveTo(SkIntToScalar(0),   SkIntToScalar(50));
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path.quadTo(SkIntToScalar(0),   SkIntToScalar(0),   SkIntToScalar(50),  SkIntToScalar(0));
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path.lineTo(SkIntToScalar(175), SkIntToScalar(0));
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path.quadTo(SkIntToScalar(200), SkIntToScalar(0),   SkIntToScalar(200), SkIntToScalar(25));
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path.lineTo(SkIntToScalar(200), SkIntToScalar(150));
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path.quadTo(SkIntToScalar(200), SkIntToScalar(200), SkIntToScalar(150), SkIntToScalar(200));
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path.lineTo(SkIntToScalar(0),   SkIntToScalar(200));
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path.close();
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path.moveTo(SkIntToScalar(50),  SkIntToScalar(50));
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path.lineTo(SkIntToScalar(150), SkIntToScalar(50));
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path.lineTo(SkIntToScalar(150), SkIntToScalar(125));
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path.quadTo(SkIntToScalar(150), SkIntToScalar(150), SkIntToScalar(125), SkIntToScalar(150));
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path.lineTo(SkIntToScalar(50),  SkIntToScalar(150));
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path.close();
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        path.setFillType(SkPath::kEvenOdd_FillType);
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkColor pathColor = SK_ColorBLACK;
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPaint pathPaint;
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        pathPaint.setAntiAlias(true);
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        pathPaint.setColor(pathColor);
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPath clipA;
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        clipA.moveTo(SkIntToScalar(10),  SkIntToScalar(20));
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        clipA.lineTo(SkIntToScalar(165), SkIntToScalar(22));
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        clipA.lineTo(SkIntToScalar(70),  SkIntToScalar(105));
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        clipA.lineTo(SkIntToScalar(165), SkIntToScalar(177));
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        clipA.lineTo(SkIntToScalar(-5),  SkIntToScalar(180));
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        clipA.close();
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkColor colorA = SK_ColorCYAN;
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPath clipB;
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        clipB.moveTo(SkIntToScalar(40),  SkIntToScalar(10));
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        clipB.lineTo(SkIntToScalar(190), SkIntToScalar(15));
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        clipB.lineTo(SkIntToScalar(195), SkIntToScalar(190));
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        clipB.lineTo(SkIntToScalar(40),  SkIntToScalar(185));
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        clipB.lineTo(SkIntToScalar(155), SkIntToScalar(100));
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        clipB.close();
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkColor colorB = SK_ColorRED;
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPaint paint;
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setAntiAlias(true);
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setStyle(SkPaint::kStroke_Style);
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setStrokeWidth(0);
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->translate(SkIntToScalar(10),SkIntToScalar(10));
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->drawPath(path, pathPaint);
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setColor(colorA);
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->drawPath(clipA, paint);
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setColor(colorB);
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->drawPath(clipB, paint);
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        static const struct {
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkClipOp    fOp;
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const char* fName;
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        } gOps[] = { //extra spaces in names for measureText
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            {kIntersect_SkClipOp,         "Isect "},
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            {kDifference_SkClipOp,        "Diff " },
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            {kUnion_SkClipOp,             "Union "},
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            {kXOR_SkClipOp,               "Xor "  },
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            {kReverseDifference_SkClipOp, "RDiff "}
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        };
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->translate(0, SkIntToScalar(40));
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->scale(3 * SK_Scalar1 / 4, 3 * SK_Scalar1 / 4);
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->save();
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (int invA = 0; invA < 2; ++invA) {
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); ++op) {
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                size_t idx = invA * SK_ARRAY_COUNT(gOps) + op;
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                if (!(idx % 3)) {
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    canvas->restore();
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    canvas->translate(0, SkIntToScalar(250));
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    canvas->save();
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                }
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->save();
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    // set clip
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    clipA.setFillType(invA ? SkPath::kInverseEvenOdd_FillType :
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                             SkPath::kEvenOdd_FillType);
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    canvas->clipPath(clipA);
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    canvas->clipPath(clipB, gOps[op].fOp);
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    // draw path clipped
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    canvas->drawPath(path, pathPaint);
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->restore();
116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                // draw path in hairline
118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                paint.setColor(pathColor);
119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->drawPath(path, paint);
120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                // draw clips in hair line
122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                paint.setColor(colorA);
123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->drawPath(clipA, paint);
124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                paint.setColor(colorB);
125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->drawPath(clipB, paint);
126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                paint.setTextSize(SkIntToScalar(20));
128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                SkScalar txtX = SkIntToScalar(55);
130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                paint.setColor(colorA);
131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                const char* aTxt = invA ? "InverseA " : "A ";
132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->drawString(aTxt, txtX, SkIntToScalar(220), paint);
133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                txtX += paint.measureText(aTxt, strlen(aTxt));
134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                paint.setColor(SK_ColorBLACK);
135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->drawString(gOps[op].fName,
136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                    txtX, SkIntToScalar(220), paint);
137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                txtX += paint.measureText(gOps[op].fName, strlen(gOps[op].fName));
138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                paint.setColor(colorB);
139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->drawString("B", txtX, SkIntToScalar(220), paint);
140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                canvas->translate(SkIntToScalar(250),0);
142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            }
143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->restore();
145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef SampleView INHERITED;
149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot//////////////////////////////////////////////////////////////////////////////
152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic SkView* MyFactory() { return new ComplexClipView; }
154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic SkViewRegister reg(MyFactory);
155