blob: 9af466914b9f0e868f27e7189f56e73b72b800e1 [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 */
Mike Reedebfce6d2016-12-12 10:02:12 -05007
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "include/core/SkCanvas.h"
9#include "include/core/SkFont.h"
10#include "include/core/SkPath.h"
11#include "samplecode/Sample.h"
12#include "src/core/SkClipOpPriv.h"
bsalomon@google.com7239aab2011-03-02 15:35:28 +000013
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040014class ComplexClipView : public Sample {
bsalomon@google.com7239aab2011-03-02 15:35:28 +000015public:
rmistry@google.comae933ce2012-08-23 18:19:56 +000016 ComplexClipView() {
reed@google.com961ddb02011-05-05 14:03:48 +000017 this->setBGColor(0xFFA0DDA0);
bsalomon@google.com7239aab2011-03-02 15:35:28 +000018 }
reed@google.com55b6b582011-03-02 15:58:18 +000019
bsalomon@google.com7239aab2011-03-02 15:35:28 +000020protected:
Hal Canary8a027312019-07-03 10:55:44 -040021 virtual SkString name() { return SkString("ComplexClip"); }
reed@google.com55b6b582011-03-02 15:58:18 +000022
reed@google.com961ddb02011-05-05 14:03:48 +000023 virtual void onDrawContent(SkCanvas* canvas) {
bsalomon@google.com7239aab2011-03-02 15:35:28 +000024 SkPath path;
25 path.moveTo(SkIntToScalar(0), SkIntToScalar(50));
26 path.quadTo(SkIntToScalar(0), SkIntToScalar(0), SkIntToScalar(50), SkIntToScalar(0));
27 path.lineTo(SkIntToScalar(175), SkIntToScalar(0));
28 path.quadTo(SkIntToScalar(200), SkIntToScalar(0), SkIntToScalar(200), SkIntToScalar(25));
29 path.lineTo(SkIntToScalar(200), SkIntToScalar(150));
30 path.quadTo(SkIntToScalar(200), SkIntToScalar(200), SkIntToScalar(150), SkIntToScalar(200));
31 path.lineTo(SkIntToScalar(0), SkIntToScalar(200));
32 path.close();
33 path.moveTo(SkIntToScalar(50), SkIntToScalar(50));
34 path.lineTo(SkIntToScalar(150), SkIntToScalar(50));
35 path.lineTo(SkIntToScalar(150), SkIntToScalar(125));
36 path.quadTo(SkIntToScalar(150), SkIntToScalar(150), SkIntToScalar(125), SkIntToScalar(150));
37 path.lineTo(SkIntToScalar(50), SkIntToScalar(150));
38 path.close();
39 path.setFillType(SkPath::kEvenOdd_FillType);
40 SkColor pathColor = SK_ColorBLACK;
41 SkPaint pathPaint;
42 pathPaint.setAntiAlias(true);
43 pathPaint.setColor(pathColor);
44
45 SkPath clipA;
46 clipA.moveTo(SkIntToScalar(10), SkIntToScalar(20));
47 clipA.lineTo(SkIntToScalar(165), SkIntToScalar(22));
48 clipA.lineTo(SkIntToScalar(70), SkIntToScalar(105));
49 clipA.lineTo(SkIntToScalar(165), SkIntToScalar(177));
50 clipA.lineTo(SkIntToScalar(-5), SkIntToScalar(180));
51 clipA.close();
52 SkColor colorA = SK_ColorCYAN;
53
54 SkPath clipB;
55 clipB.moveTo(SkIntToScalar(40), SkIntToScalar(10));
56 clipB.lineTo(SkIntToScalar(190), SkIntToScalar(15));
57 clipB.lineTo(SkIntToScalar(195), SkIntToScalar(190));
58 clipB.lineTo(SkIntToScalar(40), SkIntToScalar(185));
59 clipB.lineTo(SkIntToScalar(155), SkIntToScalar(100));
60 clipB.close();
61 SkColor colorB = SK_ColorRED;
62
Mike Reed91919132019-01-02 12:21:01 -050063 SkFont font;
64 font.setSize(20);
65
bsalomon@google.com7239aab2011-03-02 15:35:28 +000066 SkPaint paint;
67 paint.setAntiAlias(true);
68
69 paint.setStyle(SkPaint::kStroke_Style);
70 paint.setStrokeWidth(0);
71
72 canvas->translate(SkIntToScalar(10),SkIntToScalar(10));
73 canvas->drawPath(path, pathPaint);
74 paint.setColor(colorA);
75 canvas->drawPath(clipA, paint);
76 paint.setColor(colorB);
77 canvas->drawPath(clipB, paint);
78
79 static const struct {
Mike Reedc1f77742016-12-09 09:00:50 -050080 SkClipOp fOp;
81 const char* fName;
bsalomon@google.com7239aab2011-03-02 15:35:28 +000082 } gOps[] = { //extra spaces in names for measureText
Mike Reedc1f77742016-12-09 09:00:50 -050083 {kIntersect_SkClipOp, "Isect "},
84 {kDifference_SkClipOp, "Diff " },
85 {kUnion_SkClipOp, "Union "},
86 {kXOR_SkClipOp, "Xor " },
87 {kReverseDifference_SkClipOp, "RDiff "}
bsalomon@google.com7239aab2011-03-02 15:35:28 +000088 };
89
90 canvas->translate(0, SkIntToScalar(40));
91 canvas->scale(3 * SK_Scalar1 / 4, 3 * SK_Scalar1 / 4);
92 canvas->save();
93
bsalomon@google.com807cec42011-03-10 19:20:15 +000094 for (int invA = 0; invA < 2; ++invA) {
senorblanco@chromium.org64cc5792011-05-19 19:58:58 +000095 for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); ++op) {
reed@google.com7fa2a652014-01-27 13:42:58 +000096 size_t idx = invA * SK_ARRAY_COUNT(gOps) + op;
bsalomon@google.com7239aab2011-03-02 15:35:28 +000097 if (!(idx % 3)) {
98 canvas->restore();
99 canvas->translate(0, SkIntToScalar(250));
100 canvas->save();
101 }
102 canvas->save();
103 // set clip
104 clipA.setFillType(invA ? SkPath::kInverseEvenOdd_FillType :
105 SkPath::kEvenOdd_FillType);
106 canvas->clipPath(clipA);
107 canvas->clipPath(clipB, gOps[op].fOp);
108
109 // draw path clipped
110 canvas->drawPath(path, pathPaint);
111 canvas->restore();
112
113 // draw path in hairline
114 paint.setColor(pathColor);
115 canvas->drawPath(path, paint);
116
117 // draw clips in hair line
118 paint.setColor(colorA);
119 canvas->drawPath(clipA, paint);
120 paint.setColor(colorB);
121 canvas->drawPath(clipB, paint);
122
bsalomon@google.com7239aab2011-03-02 15:35:28 +0000123 SkScalar txtX = SkIntToScalar(55);
124 paint.setColor(colorA);
125 const char* aTxt = invA ? "InverseA " : "A ";
Ben Wagner51e15a62019-05-07 15:38:46 -0400126 canvas->drawSimpleText(aTxt, strlen(aTxt), SkTextEncoding::kUTF8, txtX, SkIntToScalar(220), font, paint);
127 txtX += font.measureText(aTxt, strlen(aTxt), SkTextEncoding::kUTF8);
bsalomon@google.com7239aab2011-03-02 15:35:28 +0000128 paint.setColor(SK_ColorBLACK);
Ben Wagner51e15a62019-05-07 15:38:46 -0400129 canvas->drawSimpleText(gOps[op].fName, strlen(gOps[op].fName), SkTextEncoding::kUTF8,
Mike Reed91919132019-01-02 12:21:01 -0500130 txtX, 220, font, paint);
Ben Wagner51e15a62019-05-07 15:38:46 -0400131 txtX += font.measureText(gOps[op].fName, strlen(gOps[op].fName), SkTextEncoding::kUTF8);
bsalomon@google.com7239aab2011-03-02 15:35:28 +0000132 paint.setColor(colorB);
Ben Wagner51e15a62019-05-07 15:38:46 -0400133 canvas->drawSimpleText("B", 1, SkTextEncoding::kUTF8, txtX, 220, font, paint);
bsalomon@google.com7239aab2011-03-02 15:35:28 +0000134
135 canvas->translate(SkIntToScalar(250),0);
136 }
137 }
138 canvas->restore();
139 }
140
bsalomon@google.com7239aab2011-03-02 15:35:28 +0000141private:
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400142 typedef Sample INHERITED;
bsalomon@google.com7239aab2011-03-02 15:35:28 +0000143};
144
145//////////////////////////////////////////////////////////////////////////////
146
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400147DEF_SAMPLE( return new ComplexClipView(); )