Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(249)

Side by Side Diff: gm/convexpaths.cpp

Issue 23034003: Fix repeated point quads/cubics in convex pr and update convexpaths GM (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Update for Rob's comments Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/gpu/GrAAConvexPathRenderer.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2011 Google Inc. 3 * Copyright 2011 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 #include "gm.h" 8 #include "gm.h"
9 #include "SkRandom.h" 9 #include "SkRandom.h"
10 #include "SkTArray.h" 10 #include "SkTArray.h"
(...skipping 30 matching lines...) Expand all
41 41
42 virtual SkISize onISize() { 42 virtual SkISize onISize() {
43 return make_isize(1200, 1100); 43 return make_isize(1200, 1100);
44 } 44 }
45 45
46 void makePaths() { 46 void makePaths() {
47 if (fOnce.alreadyDone()) { 47 if (fOnce.alreadyDone()) {
48 return; 48 return;
49 } 49 }
50 fOnce.accomplished(); 50 fOnce.accomplished();
51 // CW 51
52 fPaths.push_back().moveTo(0, 0); 52 fPaths.push_back().moveTo(0, 0);
53 fPaths.back().quadTo(50 * SK_Scalar1, 100 * SK_Scalar1, 53 fPaths.back().quadTo(50 * SK_Scalar1, 100 * SK_Scalar1,
54 0, 100 * SK_Scalar1); 54 0, 100 * SK_Scalar1);
55 fPaths.back().lineTo(0, 0); 55 fPaths.back().lineTo(0, 0);
56 56
57 // CCW
58 fPaths.push_back().moveTo(0, 0);
59 fPaths.back().lineTo(0, 100 * SK_Scalar1);
60 fPaths.back().quadTo(50 * SK_Scalar1, 100 * SK_Scalar1,
61 0, 0);
62
63 // CW
64 fPaths.push_back().moveTo(0, 50 * SK_Scalar1); 57 fPaths.push_back().moveTo(0, 50 * SK_Scalar1);
65 fPaths.back().quadTo(50 * SK_Scalar1, 0, 58 fPaths.back().quadTo(50 * SK_Scalar1, 0,
66 100 * SK_Scalar1, 50 * SK_Scalar1); 59 100 * SK_Scalar1, 50 * SK_Scalar1);
67 fPaths.back().quadTo(50 * SK_Scalar1, 100 * SK_Scalar1, 60 fPaths.back().quadTo(50 * SK_Scalar1, 100 * SK_Scalar1,
68 0, 50 * SK_Scalar1); 61 0, 50 * SK_Scalar1);
69 62
70 // CCW
71 fPaths.push_back().moveTo(0, 50 * SK_Scalar1);
72 fPaths.back().quadTo(50 * SK_Scalar1, 100 * SK_Scalar1,
73 100 * SK_Scalar1, 50 * SK_Scalar1);
74 fPaths.back().quadTo(50 * SK_Scalar1, 0,
75 0, 50 * SK_Scalar1);
76
77 fPaths.push_back().addRect(0, 0, 63 fPaths.push_back().addRect(0, 0,
78 100 * SK_Scalar1, 100 * SK_Scalar1, 64 100 * SK_Scalar1, 100 * SK_Scalar1,
79 SkPath::kCW_Direction); 65 SkPath::kCW_Direction);
80 66
81 fPaths.push_back().addRect(0, 0, 67 fPaths.push_back().addRect(0, 0,
82 100 * SK_Scalar1, 100 * SK_Scalar1, 68 100 * SK_Scalar1, 100 * SK_Scalar1,
83 SkPath::kCCW_Direction); 69 SkPath::kCCW_Direction);
84 70
85 fPaths.push_back().addCircle(50 * SK_Scalar1, 50 * SK_Scalar1, 71 fPaths.push_back().addCircle(50 * SK_Scalar1, 50 * SK_Scalar1,
86 50 * SK_Scalar1, SkPath::kCW_Direction); 72 50 * SK_Scalar1, SkPath::kCW_Direction);
87 73
88 fPaths.push_back().addCircle(50 * SK_Scalar1, 50 * SK_Scalar1,
89 40 * SK_Scalar1, SkPath::kCCW_Direction);
90 74
91 fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0, 75 fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0,
92 50 * SK_Scalar1, 76 50 * SK_Scalar1,
93 100 * SK_Scalar1), 77 100 * SK_Scalar1),
94 SkPath::kCW_Direction); 78 SkPath::kCW_Direction);
95 79
96 fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0, 80 fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0,
97 100 * SK_Scalar1, 81 100 * SK_Scalar1,
98 50 * SK_Scalar1),
99 SkPath::kCCW_Direction);
100
101 fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0,
102 100 * SK_Scalar1,
103 5 * SK_Scalar1), 82 5 * SK_Scalar1),
104 SkPath::kCCW_Direction); 83 SkPath::kCCW_Direction);
105 84
106 fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0, 85 fPaths.push_back().addOval(SkRect::MakeXYWH(0, 0,
107 SK_Scalar1, 86 SK_Scalar1,
108 100 * SK_Scalar1), 87 100 * SK_Scalar1),
109 SkPath::kCCW_Direction); 88 SkPath::kCCW_Direction);
110 89
111 fPaths.push_back().addRoundRect(SkRect::MakeXYWH(0, 0, 90 fPaths.push_back().addRoundRect(SkRect::MakeXYWH(0, 0,
112 SK_Scalar1 * 100, 91 SK_Scalar1 * 100,
113 SK_Scalar1 * 100), 92 SK_Scalar1 * 100),
114 40 * SK_Scalar1, 20 * SK_Scalar1, 93 40 * SK_Scalar1, 20 * SK_Scalar1,
115 SkPath::kCW_Direction); 94 SkPath::kCW_Direction);
116 95
117 fPaths.push_back().addRoundRect(SkRect::MakeXYWH(0, 0,
118 SK_Scalar1 * 100,
119 SK_Scalar1 * 100),
120 20 * SK_Scalar1, 40 * SK_Scalar1,
121 SkPath::kCCW_Direction);
122
123 // large number of points 96 // large number of points
124 enum { 97 enum {
125 kLength = 100, 98 kLength = 100,
126 kPtsPerSide = (1 << 12), 99 kPtsPerSide = (1 << 12),
127 }; 100 };
128 fPaths.push_back().moveTo(0, 0); 101 fPaths.push_back().moveTo(0, 0);
129 for (int i = 1; i < kPtsPerSide; ++i) { // skip the first point due to m oveTo. 102 for (int i = 1; i < kPtsPerSide; ++i) { // skip the first point due to m oveTo.
130 fPaths.back().lineTo(kLength * SkIntToScalar(i) / kPtsPerSide, 0); 103 fPaths.back().lineTo(kLength * SkIntToScalar(i) / kPtsPerSide, 0);
131 } 104 }
132 for (int i = 0; i < kPtsPerSide; ++i) { 105 for (int i = 0; i < kPtsPerSide; ++i) {
133 fPaths.back().lineTo(kLength, kLength * SkIntToScalar(i) / kPtsPerSi de); 106 fPaths.back().lineTo(kLength, kLength * SkIntToScalar(i) / kPtsPerSi de);
134 } 107 }
135 for (int i = kPtsPerSide; i > 0; --i) { 108 for (int i = kPtsPerSide; i > 0; --i) {
136 fPaths.back().lineTo(kLength * SkIntToScalar(i) / kPtsPerSide, kLeng th); 109 fPaths.back().lineTo(kLength * SkIntToScalar(i) / kPtsPerSide, kLeng th);
137 } 110 }
138 for (int i = kPtsPerSide; i > 0; --i) { 111 for (int i = kPtsPerSide; i > 0; --i) {
139 fPaths.back().lineTo(0, kLength * SkIntToScalar(i) / kPtsPerSide); 112 fPaths.back().lineTo(0, kLength * SkIntToScalar(i) / kPtsPerSide);
140 } 113 }
141 114
142 // shallow diagonals 115 // shallow diagonals
143 fPaths.push_back().lineTo(100 * SK_Scalar1, SK_Scalar1); 116 fPaths.push_back().lineTo(100 * SK_Scalar1, SK_Scalar1);
144 fPaths.back().lineTo(98 * SK_Scalar1, 100 * SK_Scalar1); 117 fPaths.back().lineTo(98 * SK_Scalar1, 100 * SK_Scalar1);
145 fPaths.back().lineTo(3 * SK_Scalar1, 96 * SK_Scalar1); 118 fPaths.back().lineTo(3 * SK_Scalar1, 96 * SK_Scalar1);
146 119
147 //It turns out arcTos are not automatically marked as convex and they 120 fPaths.push_back().arcTo(SkRect::MakeXYWH(0, 0,
148 //may in fact be ever so slightly concave. 121 50 * SK_Scalar1,
149 //fPaths.push_back().arcTo(SkRect::MakeXYWH(0, 0, 122 100 * SK_Scalar1),
150 // 50 * SK_Scalar1, 123 25 * SK_Scalar1, 130 * SK_Sca lar1, false);
151 // 100 * SK_Scalar1),
152 // 25 * SK_Scalar1, 130 * SK_Scalar1, false);
153 124
154 // cubics 125 // cubics
155 fPaths.push_back().cubicTo( 1 * SK_Scalar1, 1 * SK_Scalar1, 126 fPaths.push_back().cubicTo( 1 * SK_Scalar1, 1 * SK_Scalar1,
156 10 * SK_Scalar1, 90 * SK_Scalar1, 127 10 * SK_Scalar1, 90 * SK_Scalar1,
157 0 * SK_Scalar1, 100 * SK_Scalar1); 128 0 * SK_Scalar1, 100 * SK_Scalar1);
158 fPaths.push_back().cubicTo(100 * SK_Scalar1, 50 * SK_Scalar1, 129 fPaths.push_back().cubicTo(100 * SK_Scalar1, 50 * SK_Scalar1,
159 20 * SK_Scalar1, 100 * SK_Scalar1, 130 20 * SK_Scalar1, 100 * SK_Scalar1,
160 0 * SK_Scalar1, 0 * SK_Scalar1); 131 0 * SK_Scalar1, 0 * SK_Scalar1);
161 132
162 // path that has a cubic with a repeated first control point and 133 // path that has a cubic with a repeated first control point and
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 20 * SK_Scalar1, SK_Scalar1, 175 20 * SK_Scalar1, SK_Scalar1,
205 30 * SK_Scalar1, 0); 176 30 * SK_Scalar1, 0);
206 177
207 // triangle where one edge is a degenerate quad 178 // triangle where one edge is a degenerate quad
208 fPaths.push_back().moveTo(SkFloatToScalar(8.59375f), 45 * SK_Scalar1); 179 fPaths.push_back().moveTo(SkFloatToScalar(8.59375f), 45 * SK_Scalar1);
209 fPaths.back().quadTo(SkFloatToScalar(16.9921875f), 45 * SK_Scalar1, 180 fPaths.back().quadTo(SkFloatToScalar(16.9921875f), 45 * SK_Scalar1,
210 SkFloatToScalar(31.25f), 45 * SK_Scalar1); 181 SkFloatToScalar(31.25f), 45 * SK_Scalar1);
211 fPaths.back().lineTo(100 * SK_Scalar1, 100 * SK_Scalar1); 182 fPaths.back().lineTo(100 * SK_Scalar1, 100 * SK_Scalar1);
212 fPaths.back().lineTo(SkFloatToScalar(8.59375f), 45 * SK_Scalar1); 183 fPaths.back().lineTo(SkFloatToScalar(8.59375f), 45 * SK_Scalar1);
213 184
214 // point degenerate 185 // triangle where one edge is a quad with a repeated point
186 fPaths.push_back().moveTo(0, 25 * SK_Scalar1);
187 fPaths.back().lineTo(50 * SK_Scalar1, 0);
188 fPaths.back().quadTo(50 * SK_Scalar1, 50 * SK_Scalar1, 50 * SK_Scalar1, 50 * SK_Scalar1);
189
190 // triangle where one edge is a cubic with a 2x repeated point
191 fPaths.push_back().moveTo(0, 25 * SK_Scalar1);
192 fPaths.back().lineTo(50 * SK_Scalar1, 0);
193 fPaths.back().cubicTo(50 * SK_Scalar1, 0,
194 50 * SK_Scalar1, 50 * SK_Scalar1,
195 50 * SK_Scalar1, 50 * SK_Scalar1);
196
197 // triangle where one edge is a quad with a nearly repeated point
198 fPaths.push_back().moveTo(0, 25 * SK_Scalar1);
199 fPaths.back().lineTo(50 * SK_Scalar1, 0);
200 fPaths.back().quadTo(50 * SK_Scalar1, SkFloatToScalar(49.95f),
201 50 * SK_Scalar1, 50 * SK_Scalar1);
202
203 // triangle where one edge is a cubic with a 3x nearly repeated point
204 fPaths.push_back().moveTo(0, 25 * SK_Scalar1);
205 fPaths.back().lineTo(50 * SK_Scalar1, 0);
206 fPaths.back().cubicTo(50 * SK_Scalar1, SkFloatToScalar(49.95f),
207 50 * SK_Scalar1, SkFloatToScalar(49.97f),
208 50 * SK_Scalar1, 50 * SK_Scalar1);
209
210 // triangle where there is a point degenerate cubic at one corner
211 fPaths.push_back().moveTo(0, 25 * SK_Scalar1);
212 fPaths.back().lineTo(50 * SK_Scalar1, 0);
213 fPaths.back().lineTo(50 * SK_Scalar1, 50 * SK_Scalar1);
214 fPaths.back().cubicTo(50 * SK_Scalar1, 50 * SK_Scalar1,
215 50 * SK_Scalar1, 50 * SK_Scalar1,
216 50 * SK_Scalar1, 50 * SK_Scalar1);
217
218 // point line
215 fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1); 219 fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1);
216 fPaths.back().lineTo(50 * SK_Scalar1, 50 * SK_Scalar1); 220 fPaths.back().lineTo(50 * SK_Scalar1, 50 * SK_Scalar1);
217 221
222 // point quad
218 fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1); 223 fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1);
219 fPaths.back().quadTo(50 * SK_Scalar1, 50 * SK_Scalar1, 224 fPaths.back().quadTo(50 * SK_Scalar1, 50 * SK_Scalar1,
220 50 * SK_Scalar1, 50 * SK_Scalar1); 225 50 * SK_Scalar1, 50 * SK_Scalar1);
226
227 // point cubic
221 fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1); 228 fPaths.push_back().moveTo(50 * SK_Scalar1, 50 * SK_Scalar1);
222 fPaths.back().cubicTo(50 * SK_Scalar1, 50 * SK_Scalar1, 229 fPaths.back().cubicTo(50 * SK_Scalar1, 50 * SK_Scalar1,
223 50 * SK_Scalar1, 50 * SK_Scalar1, 230 50 * SK_Scalar1, 50 * SK_Scalar1,
224 50 * SK_Scalar1, 50 * SK_Scalar1); 231 50 * SK_Scalar1, 50 * SK_Scalar1);
225 232
226 // moveTo only paths 233 // moveTo only paths
227 fPaths.push_back().moveTo(0, 0); 234 fPaths.push_back().moveTo(0, 0);
228 fPaths.back().moveTo(0, 0); 235 fPaths.back().moveTo(0, 0);
229 fPaths.back().moveTo(SK_Scalar1, SK_Scalar1); 236 fPaths.back().moveTo(SK_Scalar1, SK_Scalar1);
230 fPaths.back().moveTo(SK_Scalar1, SK_Scalar1); 237 fPaths.back().moveTo(SK_Scalar1, SK_Scalar1);
231 fPaths.back().moveTo(10 * SK_Scalar1, 10 * SK_Scalar1); 238 fPaths.back().moveTo(10 * SK_Scalar1, 10 * SK_Scalar1);
232 239
233 fPaths.push_back().moveTo(0, 0); 240 fPaths.push_back().moveTo(0, 0);
234 fPaths.back().moveTo(0, 0); 241 fPaths.back().moveTo(0, 0);
235 242
236 // line degenerate 243 // line degenerate
237 fPaths.push_back().lineTo(100 * SK_Scalar1, 100 * SK_Scalar1); 244 fPaths.push_back().lineTo(100 * SK_Scalar1, 100 * SK_Scalar1);
238 fPaths.push_back().quadTo(100 * SK_Scalar1, 100 * SK_Scalar1, 0, 0); 245 fPaths.push_back().quadTo(100 * SK_Scalar1, 100 * SK_Scalar1, 0, 0);
239 fPaths.push_back().quadTo(100 * SK_Scalar1, 100 * SK_Scalar1, 246 fPaths.push_back().quadTo(100 * SK_Scalar1, 100 * SK_Scalar1,
240 50 * SK_Scalar1, 50 * SK_Scalar1); 247 50 * SK_Scalar1, 50 * SK_Scalar1);
241 fPaths.push_back().quadTo(50 * SK_Scalar1, 50 * SK_Scalar1, 248 fPaths.push_back().quadTo(50 * SK_Scalar1, 50 * SK_Scalar1,
242 100 * SK_Scalar1, 100 * SK_Scalar1); 249 100 * SK_Scalar1, 100 * SK_Scalar1);
243 fPaths.push_back().cubicTo(0, 0, 250 fPaths.push_back().cubicTo(0, 0,
244 0, 0, 251 0, 0,
245 100 * SK_Scalar1, 100 * SK_Scalar1); 252 100 * SK_Scalar1, 100 * SK_Scalar1);
246 253
247 // small circle. This is listed last so that it has device coords far 254 // small circle. This is listed last so that it has device coords far
248 // from the origin (small area relative to x,y values). 255 // from the origin (small area relative to x,y values).
249 fPaths.push_back().addCircle(0, 0, SkFloatToScalar(0.8f)); 256 fPaths.push_back().addCircle(0, 0, SkFloatToScalar(1.2f));
250 } 257 }
251 258
252 virtual void onDraw(SkCanvas* canvas) { 259 virtual void onDraw(SkCanvas* canvas) {
253 this->makePaths(); 260 this->makePaths();
254 261
255 SkPaint paint; 262 SkPaint paint;
256 paint.setAntiAlias(true); 263 paint.setAntiAlias(true);
257 SkRandom rand; 264 SkRandom rand;
258 canvas->translate(20 * SK_Scalar1, 20 * SK_Scalar1); 265 canvas->translate(20 * SK_Scalar1, 20 * SK_Scalar1);
266
267 // As we've added more paths this has gotten pretty big. Scale the whole thi ng down.
268 canvas->scale(2 * SK_Scalar1 / 3, 2 * SK_Scalar1 / 3);
269
259 for (int i = 0; i < fPaths.count(); ++i) { 270 for (int i = 0; i < fPaths.count(); ++i) {
260 canvas->save(); 271 canvas->save();
261 // position the path, and make it at off-integer coords. 272 // position the path, and make it at off-integer coords.
262 canvas->translate(SK_Scalar1 * 200 * (i % 5) + SK_Scalar1 / 4, 273 canvas->translate(SK_Scalar1 * 200 * (i % 5) + SK_Scalar1 / 10,
263 SK_Scalar1 * 200 * (i / 5) + 3 * SK_Scalar1 / 4); 274 SK_Scalar1 * 200 * (i / 5) + 9 * SK_Scalar1 / 10);
264 SkColor color = rand.nextU(); 275 SkColor color = rand.nextU();
265 color |= 0xff000000; 276 color |= 0xff000000;
266 paint.setColor(color); 277 paint.setColor(color);
267 SkASSERT(fPaths[i].isConvex()); 278 SkASSERT(fPaths[i].isConvex());
268 canvas->drawPath(fPaths[i], paint); 279 canvas->drawPath(fPaths[i], paint);
269 canvas->restore(); 280 canvas->restore();
270 } 281 }
271 } 282 }
272 283
273 private: 284 private:
274 typedef GM INHERITED; 285 typedef GM INHERITED;
275 SkTArray<SkPath> fPaths; 286 SkTArray<SkPath> fPaths;
276 }; 287 };
277 288
278 ////////////////////////////////////////////////////////////////////////////// 289 //////////////////////////////////////////////////////////////////////////////
279 290
280 static GM* MyFactory(void*) { return new ConvexPathsGM; } 291 static GM* MyFactory(void*) { return new ConvexPathsGM; }
281 static GMRegistry reg(MyFactory); 292 static GMRegistry reg(MyFactory);
282 293
283 } 294 }
OLDNEW
« no previous file with comments | « no previous file | src/gpu/GrAAConvexPathRenderer.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698