blob: 9aedcbc4fcc1db2757583e1162c2569612e95f9a [file] [log] [blame]
bsalomon@google.com69cc6ad2012-01-17 14:25:10 +00001
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8#include "gm.h"
9#include "SkRandom.h"
10#include "SkTArray.h"
11
12namespace skiagm {
13
14class ConvexPathsGM : public GM {
15public:
16 ConvexPathsGM() {
bsalomon@google.com72b55be2012-01-26 20:33:19 +000017 this->setBGColor(0xFF000000);
bsalomon@google.com69cc6ad2012-01-17 14:25:10 +000018 this->makePaths();
19 }
20
21protected:
22 virtual SkString onShortName() {
23 return SkString("convexpaths");
24 }
25
26
27 virtual SkISize onISize() {
28 return make_isize(1200, 900);
29 }
30
31 void makePaths() {
bsalomon@google.com278dc692012-02-15 16:52:51 +000032 // CW
33 fPaths.push_back().moveTo(0, 0);
34 fPaths.back().quadTo(50 * SK_Scalar1, 100 * SK_Scalar1,
35 0, 100 * SK_Scalar1);
36 fPaths.back().lineTo(0, 0);
37
38 // CCW
39 fPaths.push_back().moveTo(0, 0);
40 fPaths.back().lineTo(0, 100 * SK_Scalar1);
41 fPaths.back().quadTo(50 * SK_Scalar1, 100 * SK_Scalar1,
42 0, 0);
43
44 // CW
45 fPaths.push_back().moveTo(0, 50 * SK_Scalar1);
46 fPaths.back().quadTo(50 * SK_Scalar1, 0,
47 100 * SK_Scalar1, 50 * SK_Scalar1);
48 fPaths.back().quadTo(50 * SK_Scalar1, 100 * SK_Scalar1,
49 0, 50 * SK_Scalar1);
50
51 // CCW
52 fPaths.push_back().moveTo(0, 50 * SK_Scalar1);
53 fPaths.back().quadTo(50 * SK_Scalar1, 100 * SK_Scalar1,
54 100 * SK_Scalar1, 50 * SK_Scalar1);
55 fPaths.back().quadTo(50 * SK_Scalar1, 0,
56 0, 50 * SK_Scalar1);
57
bsalomon@google.com69cc6ad2012-01-17 14:25:10 +000058 fPaths.push_back().addRect(0, 0,
59 100 * SK_Scalar1, 100 * SK_Scalar1,
60 SkPath::kCW_Direction);
61
62 fPaths.push_back().addRect(0, 0,
63 100 * SK_Scalar1, 100 * SK_Scalar1,
64 SkPath::kCCW_Direction);
65
66 fPaths.push_back().addCircle(50 * SK_Scalar1, 50 * SK_Scalar1,
67 50 * SK_Scalar1, SkPath::kCW_Direction);
68
69 fPaths.push_back().addCircle(50 * SK_Scalar1, 50 * SK_Scalar1,
70 40 * SK_Scalar1, SkPath::kCCW_Direction);
71
72 fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0,
73 50 * SK_Scalar1,
74 100 * SK_Scalar1),
75 SkPath::kCW_Direction);
76
77 fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0,
78 100 * SK_Scalar1,
79 50 * SK_Scalar1),
80 SkPath::kCCW_Direction);
81
82 fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0,
83 100 * SK_Scalar1,
84 5 * SK_Scalar1),
85 SkPath::kCCW_Direction);
86
87 fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0,
88 SK_Scalar1,
89 100 * SK_Scalar1),
90 SkPath::kCCW_Direction);
91
bsalomon@google.com69cc6ad2012-01-17 14:25:10 +000092 fPaths.push_back().addRoundRect(SkRect::MakeXYWH(0, 0,
93 SK_Scalar1 * 100,
94 SK_Scalar1 * 100),
95 40 * SK_Scalar1, 20 * SK_Scalar1,
96 SkPath::kCW_Direction);
97
98 fPaths.push_back().addRoundRect(SkRect::MakeXYWH(0, 0,
99 SK_Scalar1 * 100,
100 SK_Scalar1 * 100),
101 20 * SK_Scalar1, 40 * SK_Scalar1,
102 SkPath::kCCW_Direction);
bsalomon@google.com72b55be2012-01-26 20:33:19 +0000103
104 // shallow diagonals
105 fPaths.push_back().lineTo(100 * SK_Scalar1, SK_Scalar1);
106 fPaths.back().lineTo(98 * SK_Scalar1, 100 * SK_Scalar1);
107 fPaths.back().lineTo(3 * SK_Scalar1, 96 * SK_Scalar1);
bsalomon@google.com9732f622012-01-31 15:19:21 +0000108
bsalomon@google.com69cc6ad2012-01-17 14:25:10 +0000109 /*
bsalomon@google.com5cc90d12012-01-17 16:28:34 +0000110 It turns out arcTos are not automatically marked as convex and they
111 may in fact be ever so slightly concave.
bsalomon@google.com69cc6ad2012-01-17 14:25:10 +0000112 fPaths.push_back().arcTo(SkRect::MakeXYWH(0, 0,
113 50 * SK_Scalar1,
114 100 * SK_Scalar1),
115 25 * SK_Scalar1, 130 * SK_Scalar1, false);
116 */
117
bsalomon@google.com72b55be2012-01-26 20:33:19 +0000118 // cubics
119 fPaths.push_back().cubicTo( 1 * SK_Scalar1, 1 * SK_Scalar1,
120 10 * SK_Scalar1, 90 * SK_Scalar1,
121 0 * SK_Scalar1, 100 * SK_Scalar1);
122 fPaths.push_back().cubicTo(100 * SK_Scalar1, 50 * SK_Scalar1,
123 20 * SK_Scalar1, 100 * SK_Scalar1,
124 0 * SK_Scalar1, 0 * SK_Scalar1);
125
bsalomon@google.comdc3c7802012-01-31 20:46:32 +0000126 // triangle where one edge is a degenerate quad
127 fPaths.push_back().moveTo(SkFloatToScalar(8.59375f), 45 * SK_Scalar1);
128 fPaths.back().quadTo(SkFloatToScalar(16.9921875f), 45 * SK_Scalar1,
129 SkFloatToScalar(31.25f), 45 * SK_Scalar1);
130 fPaths.back().lineTo(100 * SK_Scalar1, 100 * SK_Scalar1);
131 fPaths.back().lineTo(SkFloatToScalar(8.59375f), 45 * SK_Scalar1);
132
bsalomon@google.com69cc6ad2012-01-17 14:25:10 +0000133 // point degenerate
bsalomon@google.com5cc90d12012-01-17 16:28:34 +0000134 fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1);
135 fPaths.back().lineTo(50 * SK_Scalar1, 50 * SK_Scalar1);
136
137 fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1);
138 fPaths.back().quadTo(50 * SK_Scalar1, 50 * SK_Scalar1,
139 50 * SK_Scalar1, 50 * SK_Scalar1);
140 fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1);
141 fPaths.back().cubicTo(50 * SK_Scalar1, 50 * SK_Scalar1,
142 50 * SK_Scalar1, 50 * SK_Scalar1,
143 50 * SK_Scalar1, 50 * SK_Scalar1);
bsalomon@google.comdc3c7802012-01-31 20:46:32 +0000144
bsalomon@google.com9732f622012-01-31 15:19:21 +0000145 // moveTo only paths
146 fPaths.push_back().moveTo(0, 0);
147 fPaths.back().moveTo(0, 0);
148 fPaths.back().moveTo(SK_Scalar1, SK_Scalar1);
149 fPaths.back().moveTo(SK_Scalar1, SK_Scalar1);
150 fPaths.back().moveTo(10 * SK_Scalar1, 10 * SK_Scalar1);
151
152 fPaths.push_back().moveTo(0, 0);
153 fPaths.back().moveTo(0, 0);
bsalomon@google.com69cc6ad2012-01-17 14:25:10 +0000154
155 // line degenerate
156 fPaths.push_back().lineTo(100 * SK_Scalar1, 100 * SK_Scalar1);
157 fPaths.push_back().quadTo(100 * SK_Scalar1, 100 * SK_Scalar1, 0, 0);
158 fPaths.push_back().quadTo(100 * SK_Scalar1, 100 * SK_Scalar1,
159 50 * SK_Scalar1, 50 * SK_Scalar1);
160 fPaths.push_back().quadTo(50 * SK_Scalar1, 50 * SK_Scalar1,
161 100 * SK_Scalar1, 100 * SK_Scalar1);
162 fPaths.push_back().cubicTo(0, 0,
163 0, 0,
164 100 * SK_Scalar1, 100 * SK_Scalar1);
165 }
166
167 virtual void onDraw(SkCanvas* canvas) {
168
169 SkPaint paint;
170 paint.setAntiAlias(true);
171 SkRandom rand;
172 canvas->translate(20 * SK_Scalar1, 20 * SK_Scalar1);
bsalomon@google.com72b55be2012-01-26 20:33:19 +0000173 for (int i = 0; i < fPaths.count(); ++i) {
bsalomon@google.com69cc6ad2012-01-17 14:25:10 +0000174 canvas->save();
175 // position the path, and make it at off-integer coords.
176 canvas->translate(SK_Scalar1 * 200 * (i % 5) + SK_Scalar1 / 4,
177 SK_Scalar1 * 200 * (i / 5) + 3 * SK_Scalar1 / 4);
178 SkColor color = rand.nextU();
179 color |= 0xff000000;
180 paint.setColor(color);
181 SkASSERT(fPaths[i].isConvex());
182 canvas->drawPath(fPaths[i], paint);
183 canvas->restore();
184 }
185 }
186
187private:
188 typedef GM INHERITED;
189 SkTArray<SkPath> fPaths;
190};
191
192//////////////////////////////////////////////////////////////////////////////
193
194static GM* MyFactory(void*) { return new ConvexPathsGM; }
195static GMRegistry reg(MyFactory);
196
197}
198