blob: aab759c65aee7c421b12b5e230331b41df3473e2 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
bsalomon@google.com7239aab2011-03-02 15:35:28 +00007#include "SampleCode.h"
8#include "SkCanvas.h"
bsalomon@google.com7239aab2011-03-02 15:35:28 +00009#include "SkPath.h"
bsalomon@google.com7239aab2011-03-02 15:35:28 +000010#include "SkView.h"
11
reed@google.com961ddb02011-05-05 14:03:48 +000012class ComplexClipView : public SampleView {
bsalomon@google.com7239aab2011-03-02 15:35:28 +000013public:
rmistry@google.comae933ce2012-08-23 18:19:56 +000014 ComplexClipView() {
reed@google.com961ddb02011-05-05 14:03:48 +000015 this->setBGColor(0xFFA0DDA0);
bsalomon@google.com7239aab2011-03-02 15:35:28 +000016 }
reed@google.com55b6b582011-03-02 15:58:18 +000017
bsalomon@google.com7239aab2011-03-02 15:35:28 +000018protected:
19 // overrides from SkEventSink
20 virtual bool onQuery(SkEvent* evt) {
21 if (SampleCode::TitleQ(*evt)) {
22 SampleCode::TitleR(evt, "ComplexClip");
23 return true;
24 }
25 return this->INHERITED::onQuery(evt);
26 }
reed@google.com55b6b582011-03-02 15:58:18 +000027
reed@google.com961ddb02011-05-05 14:03:48 +000028 virtual void onDrawContent(SkCanvas* canvas) {
bsalomon@google.com7239aab2011-03-02 15:35:28 +000029 SkPath path;
30 path.moveTo(SkIntToScalar(0), SkIntToScalar(50));
31 path.quadTo(SkIntToScalar(0), SkIntToScalar(0), SkIntToScalar(50), SkIntToScalar(0));
32 path.lineTo(SkIntToScalar(175), SkIntToScalar(0));
33 path.quadTo(SkIntToScalar(200), SkIntToScalar(0), SkIntToScalar(200), SkIntToScalar(25));
34 path.lineTo(SkIntToScalar(200), SkIntToScalar(150));
35 path.quadTo(SkIntToScalar(200), SkIntToScalar(200), SkIntToScalar(150), SkIntToScalar(200));
36 path.lineTo(SkIntToScalar(0), SkIntToScalar(200));
37 path.close();
38 path.moveTo(SkIntToScalar(50), SkIntToScalar(50));
39 path.lineTo(SkIntToScalar(150), SkIntToScalar(50));
40 path.lineTo(SkIntToScalar(150), SkIntToScalar(125));
41 path.quadTo(SkIntToScalar(150), SkIntToScalar(150), SkIntToScalar(125), SkIntToScalar(150));
42 path.lineTo(SkIntToScalar(50), SkIntToScalar(150));
43 path.close();
44 path.setFillType(SkPath::kEvenOdd_FillType);
45 SkColor pathColor = SK_ColorBLACK;
46 SkPaint pathPaint;
47 pathPaint.setAntiAlias(true);
48 pathPaint.setColor(pathColor);
49
50 SkPath clipA;
51 clipA.moveTo(SkIntToScalar(10), SkIntToScalar(20));
52 clipA.lineTo(SkIntToScalar(165), SkIntToScalar(22));
53 clipA.lineTo(SkIntToScalar(70), SkIntToScalar(105));
54 clipA.lineTo(SkIntToScalar(165), SkIntToScalar(177));
55 clipA.lineTo(SkIntToScalar(-5), SkIntToScalar(180));
56 clipA.close();
57 SkColor colorA = SK_ColorCYAN;
58
59 SkPath clipB;
60 clipB.moveTo(SkIntToScalar(40), SkIntToScalar(10));
61 clipB.lineTo(SkIntToScalar(190), SkIntToScalar(15));
62 clipB.lineTo(SkIntToScalar(195), SkIntToScalar(190));
63 clipB.lineTo(SkIntToScalar(40), SkIntToScalar(185));
64 clipB.lineTo(SkIntToScalar(155), SkIntToScalar(100));
65 clipB.close();
66 SkColor colorB = SK_ColorRED;
67
bsalomon@google.com7239aab2011-03-02 15:35:28 +000068 SkPaint paint;
69 paint.setAntiAlias(true);
70
71 paint.setStyle(SkPaint::kStroke_Style);
72 paint.setStrokeWidth(0);
73
74 canvas->translate(SkIntToScalar(10),SkIntToScalar(10));
75 canvas->drawPath(path, pathPaint);
76 paint.setColor(colorA);
77 canvas->drawPath(clipA, paint);
78 paint.setColor(colorB);
79 canvas->drawPath(clipB, paint);
80
81 static const struct {
82 SkRegion::Op fOp;
83 const char* fName;
84 } gOps[] = { //extra spaces in names for measureText
85 {SkRegion::kIntersect_Op, "Isect "},
86 {SkRegion::kDifference_Op, "Diff " },
87 {SkRegion::kUnion_Op, "Union "},
88 {SkRegion::kXOR_Op, "Xor " },
89 {SkRegion::kReverseDifference_Op, "RDiff "}
90 };
91
92 canvas->translate(0, SkIntToScalar(40));
93 canvas->scale(3 * SK_Scalar1 / 4, 3 * SK_Scalar1 / 4);
94 canvas->save();
95
bsalomon@google.com807cec42011-03-10 19:20:15 +000096 for (int invA = 0; invA < 2; ++invA) {
senorblanco@chromium.org64cc5792011-05-19 19:58:58 +000097 for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); ++op) {
reed@google.com7fa2a652014-01-27 13:42:58 +000098 size_t idx = invA * SK_ARRAY_COUNT(gOps) + op;
bsalomon@google.com7239aab2011-03-02 15:35:28 +000099 if (!(idx % 3)) {
100 canvas->restore();
101 canvas->translate(0, SkIntToScalar(250));
102 canvas->save();
103 }
104 canvas->save();
105 // set clip
106 clipA.setFillType(invA ? SkPath::kInverseEvenOdd_FillType :
107 SkPath::kEvenOdd_FillType);
108 canvas->clipPath(clipA);
109 canvas->clipPath(clipB, gOps[op].fOp);
110
111 // draw path clipped
112 canvas->drawPath(path, pathPaint);
113 canvas->restore();
114
115 // draw path in hairline
116 paint.setColor(pathColor);
117 canvas->drawPath(path, paint);
118
119 // draw clips in hair line
120 paint.setColor(colorA);
121 canvas->drawPath(clipA, paint);
122 paint.setColor(colorB);
123 canvas->drawPath(clipB, paint);
124
125 paint.setTextSize(SkIntToScalar(20));
126
127 SkScalar txtX = SkIntToScalar(55);
128 paint.setColor(colorA);
129 const char* aTxt = invA ? "InverseA " : "A ";
130 canvas->drawText(aTxt, strlen(aTxt), txtX, SkIntToScalar(220), paint);
131 txtX += paint.measureText(aTxt, strlen(aTxt));
132 paint.setColor(SK_ColorBLACK);
133 canvas->drawText(gOps[op].fName, strlen(gOps[op].fName),
134 txtX, SkIntToScalar(220), paint);
135 txtX += paint.measureText(gOps[op].fName, strlen(gOps[op].fName));
136 paint.setColor(colorB);
137 canvas->drawText("B", 1, txtX, SkIntToScalar(220), paint);
138
139 canvas->translate(SkIntToScalar(250),0);
140 }
141 }
142 canvas->restore();
143 }
144
bsalomon@google.com7239aab2011-03-02 15:35:28 +0000145private:
reed@google.com961ddb02011-05-05 14:03:48 +0000146 typedef SampleView INHERITED;
bsalomon@google.com7239aab2011-03-02 15:35:28 +0000147};
148
149//////////////////////////////////////////////////////////////////////////////
150
151static SkView* MyFactory() { return new ComplexClipView; }
152static SkViewRegister reg(MyFactory);