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

Side by Side Diff: gm/roundrects.cpp

Issue 1373293002: Handle inverted rects in SkRRect creation methods (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Fixed SK_ARRAY_COUNT error Created 5 years, 2 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
« no previous file with comments | « no previous file | include/core/SkRRect.h » ('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 2013 Google Inc. 3 * Copyright 2013 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 8
9 #include "gm.h" 9 #include "gm.h"
10 #include "SkTArray.h" 10 #include "SkTArray.h"
11 #include "SkRandom.h" 11 #include "SkRandom.h"
12 #include "SkMatrix.h" 12 #include "SkMatrix.h"
13 #include "SkBlurMaskFilter.h" 13 #include "SkBlurMaskFilter.h"
14 #include "SkGradientShader.h" 14 #include "SkGradientShader.h"
15 #include "SkBlurDrawLooper.h" 15 #include "SkBlurDrawLooper.h"
16 #include "SkRect.h" 16 #include "SkRect.h"
17 #include "SkRRect.h" 17 #include "SkRRect.h"
18 18
19 namespace skiagm { 19 namespace skiagm {
20 20
21 static SkColor gen_color(SkRandom* rand) {
22 SkScalar hsv[3];
23 hsv[0] = rand->nextRangeF(0.0f, 360.0f);
24 hsv[1] = rand->nextRangeF(0.75f, 1.0f);
25 hsv[2] = rand->nextRangeF(0.75f, 1.0f);
26
27 return sk_tool_utils::color_to_565(SkHSVToColor(hsv));
28 }
29
21 class RoundRectGM : public GM { 30 class RoundRectGM : public GM {
22 public: 31 public:
23 RoundRectGM() { 32 RoundRectGM() {
24 this->setBGColor(0xFF000000); 33 this->setBGColor(0xFF000000);
25 this->makePaints(); 34 this->makePaints();
26 this->makeMatrices(); 35 this->makeMatrices();
27 } 36 }
28 37
29 protected: 38 protected:
30 39
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 fMatrices.push_back(m); 129 fMatrices.push_back(m);
121 } 130 }
122 131
123 { 132 {
124 SkMatrix m; 133 SkMatrix m;
125 m.setRotate(SkIntToScalar(60)); 134 m.setRotate(SkIntToScalar(60));
126 fMatrices.push_back(m); 135 fMatrices.push_back(m);
127 } 136 }
128 } 137 }
129 138
130 SkColor genColor(SkRandom* rand) {
131 SkScalar hsv[3];
132 hsv[0] = rand->nextRangeF(0.0f, 360.0f);
133 hsv[1] = rand->nextRangeF(0.75f, 1.0f);
134 hsv[2] = rand->nextRangeF(0.75f, 1.0f);
135
136 return sk_tool_utils::color_to_565(SkHSVToColor(hsv));
137 }
138
139 void onDraw(SkCanvas* canvas) override { 139 void onDraw(SkCanvas* canvas) override {
140 SkRandom rand(1); 140 SkRandom rand(1);
141 canvas->translate(20 * SK_Scalar1, 20 * SK_Scalar1); 141 canvas->translate(20 * SK_Scalar1, 20 * SK_Scalar1);
142 SkRect rect = SkRect::MakeLTRB(-20, -30, 20, 30); 142 const SkRect rect = SkRect::MakeLTRB(-20, -30, 20, 30);
143 SkRRect circleRect; 143 SkRRect circleRect;
144 circleRect.setRectXY(rect, 5, 5); 144 circleRect.setRectXY(rect, 5, 5);
145 145
146 const SkScalar kXStart = 60.0f; 146 const SkScalar kXStart = 60.0f;
147 const SkScalar kYStart = 80.0f; 147 const SkScalar kYStart = 80.0f;
148 const int kXStep = 150; 148 const int kXStep = 150;
149 const int kYStep = 160; 149 const int kYStep = 160;
150 int maxX = fMatrices.count(); 150 int maxX = fMatrices.count();
151 151
152 SkPaint rectPaint; 152 SkPaint rectPaint;
153 rectPaint.setAntiAlias(true); 153 rectPaint.setAntiAlias(true);
154 rectPaint.setStyle(SkPaint::kStroke_Style); 154 rectPaint.setStyle(SkPaint::kStroke_Style);
155 rectPaint.setStrokeWidth(SkIntToScalar(0)); 155 rectPaint.setStrokeWidth(SkIntToScalar(0));
156 rectPaint.setColor(sk_tool_utils::color_to_565(SK_ColorLTGRAY)); 156 rectPaint.setColor(sk_tool_utils::color_to_565(SK_ColorLTGRAY));
157 157
158 int testCount = 0; 158 int testCount = 0;
159 for (int i = 0; i < fPaints.count(); ++i) { 159 for (int i = 0; i < fPaints.count(); ++i) {
160 for (int j = 0; j < fMatrices.count(); ++j) { 160 for (int j = 0; j < fMatrices.count(); ++j) {
161 canvas->save(); 161 canvas->save();
162 SkMatrix mat = fMatrices[j]; 162 SkMatrix mat = fMatrices[j];
163 // position the roundrect, and make it at off-integer coords. 163 // position the roundrect, and make it at off-integer coords.
164 mat.postTranslate(kXStart + SK_Scalar1 * kXStep * (testCount % m axX) + 164 mat.postTranslate(kXStart + SK_Scalar1 * kXStep * (testCount % m axX) +
165 SK_Scalar1 / 4, 165 SK_Scalar1 / 4,
166 kYStart + SK_Scalar1 * kYStep * (testCount / m axX) + 166 kYStart + SK_Scalar1 * kYStep * (testCount / m axX) +
167 3 * SK_Scalar1 / 4); 167 3 * SK_Scalar1 / 4);
168 canvas->concat(mat); 168 canvas->concat(mat);
169 169
170 SkColor color = genColor(&rand); 170 SkColor color = gen_color(&rand);
171 fPaints[i].setColor(color); 171 fPaints[i].setColor(color);
172 172
173 canvas->drawRect(rect, rectPaint); 173 canvas->drawRect(rect, rectPaint);
174 canvas->drawRRect(circleRect, fPaints[i]); 174 canvas->drawRRect(circleRect, fPaints[i]);
175 175
176 canvas->restore(); 176 canvas->restore();
177 177
178 ++testCount; 178 ++testCount;
179 } 179 }
180 } 180 }
181 181
182 // special cases 182 // special cases
183 183
184 // non-scaled tall and skinny roundrect 184 // non-scaled tall and skinny roundrect
185 for (int i = 0; i < fPaints.count(); ++i) { 185 for (int i = 0; i < fPaints.count(); ++i) {
186 SkRect rect = SkRect::MakeLTRB(-20, -60, 20, 60); 186 SkRect rect = SkRect::MakeLTRB(-20, -60, 20, 60);
187 SkRRect ellipseRect; 187 SkRRect ellipseRect;
188 ellipseRect.setRectXY(rect, 5, 10); 188 ellipseRect.setRectXY(rect, 5, 10);
189 189
190 canvas->save(); 190 canvas->save();
191 // position the roundrect, and make it at off-integer coords. 191 // position the roundrect, and make it at off-integer coords.
192 canvas->translate(kXStart + SK_Scalar1 * kXStep * 2.55f + SK_Scalar1 / 4, 192 canvas->translate(kXStart + SK_Scalar1 * kXStep * 2.55f + SK_Scalar1 / 4,
193 kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4); 193 kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4);
194 194
195 SkColor color = genColor(&rand); 195 SkColor color = gen_color(&rand);
196 fPaints[i].setColor(color); 196 fPaints[i].setColor(color);
197 197
198 canvas->drawRect(rect, rectPaint); 198 canvas->drawRect(rect, rectPaint);
199 canvas->drawRRect(ellipseRect, fPaints[i]); 199 canvas->drawRRect(ellipseRect, fPaints[i]);
200 canvas->restore(); 200 canvas->restore();
201 } 201 }
202 202
203 // non-scaled wide and short roundrect 203 // non-scaled wide and short roundrect
204 for (int i = 0; i < fPaints.count(); ++i) { 204 for (int i = 0; i < fPaints.count(); ++i) {
205 SkRect rect = SkRect::MakeLTRB(-80, -30, 80, 30); 205 SkRect rect = SkRect::MakeLTRB(-80, -30, 80, 30);
206 SkRRect ellipseRect; 206 SkRRect ellipseRect;
207 ellipseRect.setRectXY(rect, 20, 5); 207 ellipseRect.setRectXY(rect, 20, 5);
208 208
209 canvas->save(); 209 canvas->save();
210 // position the roundrect, and make it at off-integer coords. 210 // position the roundrect, and make it at off-integer coords.
211 canvas->translate(kXStart + SK_Scalar1 * kXStep * 4 + SK_Scalar1 / 4 , 211 canvas->translate(kXStart + SK_Scalar1 * kXStep * 4 + SK_Scalar1 / 4 ,
212 kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 + 212 kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
213 SK_ScalarHalf * kYStep); 213 SK_ScalarHalf * kYStep);
214 214
215 SkColor color = genColor(&rand); 215 SkColor color = gen_color(&rand);
216 fPaints[i].setColor(color); 216 fPaints[i].setColor(color);
217 217
218 canvas->drawRect(rect, rectPaint); 218 canvas->drawRect(rect, rectPaint);
219 canvas->drawRRect(ellipseRect, fPaints[i]); 219 canvas->drawRRect(ellipseRect, fPaints[i]);
220 canvas->restore(); 220 canvas->restore();
221 } 221 }
222 222
223 // super skinny roundrect 223 // super skinny roundrect
224 for (int i = 0; i < fPaints.count(); ++i) { 224 for (int i = 0; i < fPaints.count(); ++i) {
225 SkRect rect = SkRect::MakeLTRB(0, -60, 1, 60); 225 SkRect rect = SkRect::MakeLTRB(0, -60, 1, 60);
226 SkRRect circleRect; 226 SkRRect circleRect;
227 circleRect.setRectXY(rect, 5, 5); 227 circleRect.setRectXY(rect, 5, 5);
228 228
229 canvas->save(); 229 canvas->save();
230 // position the roundrect, and make it at off-integer coords. 230 // position the roundrect, and make it at off-integer coords.
231 canvas->translate(kXStart + SK_Scalar1 * kXStep * 3.25f + SK_Scalar1 / 4, 231 canvas->translate(kXStart + SK_Scalar1 * kXStep * 3.25f + SK_Scalar1 / 4,
232 kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4); 232 kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4);
233 233
234 SkColor color = genColor(&rand); 234 SkColor color = gen_color(&rand);
235 fPaints[i].setColor(color); 235 fPaints[i].setColor(color);
236 236
237 canvas->drawRRect(circleRect, fPaints[i]); 237 canvas->drawRRect(circleRect, fPaints[i]);
238 canvas->restore(); 238 canvas->restore();
239 } 239 }
240 240
241 // super short roundrect 241 // super short roundrect
242 for (int i = 0; i < fPaints.count(); ++i) { 242 for (int i = 0; i < fPaints.count(); ++i) {
243 SkRect rect = SkRect::MakeLTRB(-80, -1, 80, 0); 243 SkRect rect = SkRect::MakeLTRB(-80, -1, 80, 0);
244 SkRRect circleRect; 244 SkRRect circleRect;
245 circleRect.setRectXY(rect, 5, 5); 245 circleRect.setRectXY(rect, 5, 5);
246 246
247 canvas->save(); 247 canvas->save();
248 // position the roundrect, and make it at off-integer coords. 248 // position the roundrect, and make it at off-integer coords.
249 canvas->translate(kXStart + SK_Scalar1 * kXStep * 2.5f + SK_Scalar1 / 4, 249 canvas->translate(kXStart + SK_Scalar1 * kXStep * 2.5f + SK_Scalar1 / 4,
250 kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 + 250 kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
251 SK_ScalarHalf * kYStep); 251 SK_ScalarHalf * kYStep);
252 252
253 SkColor color = genColor(&rand); 253 SkColor color = gen_color(&rand);
254 fPaints[i].setColor(color); 254 fPaints[i].setColor(color);
255 255
256 canvas->drawRRect(circleRect, fPaints[i]); 256 canvas->drawRRect(circleRect, fPaints[i]);
257 canvas->restore(); 257 canvas->restore();
258 } 258 }
259 259
260 // radial gradient 260 // radial gradient
261 SkPoint center = SkPoint::Make(SkIntToScalar(0), SkIntToScalar(0)); 261 SkPoint center = SkPoint::Make(SkIntToScalar(0), SkIntToScalar(0));
262 SkColor colors[] = { SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN }; 262 SkColor colors[] = { SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN };
263 SkScalar pos[] = { 0, SK_ScalarHalf, SK_Scalar1 }; 263 SkScalar pos[] = { 0, SK_ScalarHalf, SK_Scalar1 };
264 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateRadial(center, 264 SkAutoTUnref<SkShader> shader(SkGradientShader::CreateRadial(center,
265 SkIntToScalar(20), 265 SkIntToScalar(20),
266 colors, 266 colors,
267 pos, 267 pos,
268 SK_ARRAY_COUNT(colors), 268 SK_ARRAY_COUNT(colors),
269 SkShader::kClamp_TileMode)) ; 269 SkShader::kClamp_TileMode)) ;
270 270
271 for (int i = 0; i < fPaints.count(); ++i) { 271 for (int i = 0; i < fPaints.count(); ++i) {
272 canvas->save(); 272 canvas->save();
273 // position the path, and make it at off-integer coords. 273 // position the path, and make it at off-integer coords.
274 canvas->translate(kXStart + SK_Scalar1 * kXStep * 0 + SK_Scalar1 / 4 , 274 canvas->translate(kXStart + SK_Scalar1 * kXStep * 0 + SK_Scalar1 / 4 ,
275 kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 + 275 kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
276 SK_ScalarHalf * kYStep); 276 SK_ScalarHalf * kYStep);
277 277
278 SkColor color = genColor(&rand); 278 SkColor color = gen_color(&rand);
279 fPaints[i].setColor(color); 279 fPaints[i].setColor(color);
280 fPaints[i].setShader(shader); 280 fPaints[i].setShader(shader);
281 281
282 canvas->drawRect(rect, rectPaint); 282 canvas->drawRect(rect, rectPaint);
283 canvas->drawRRect(circleRect, fPaints[i]); 283 canvas->drawRRect(circleRect, fPaints[i]);
284 284
285 fPaints[i].setShader(nullptr); 285 fPaints[i].setShader(nullptr);
286 286
287 canvas->restore(); 287 canvas->restore();
288 } 288 }
(...skipping 14 matching lines...) Expand all
303 for (int i = 0; i < 4; ++i) { 303 for (int i = 0; i < 4; ++i) {
304 SkRRect circleRect; 304 SkRRect circleRect;
305 circleRect.setRectXY(rect, radii[i][0], radii[i][1]); 305 circleRect.setRectXY(rect, radii[i][0], radii[i][1]);
306 306
307 canvas->save(); 307 canvas->save();
308 // position the roundrect, and make it at off-integer coords. 308 // position the roundrect, and make it at off-integer coords.
309 canvas->translate(kXStart + SK_Scalar1 * kXStep * 5 + SK_Scalar1 / 4, 309 canvas->translate(kXStart + SK_Scalar1 * kXStep * 5 + SK_Scalar1 / 4,
310 kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Sca lar1 / 4 + 310 kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Sca lar1 / 4 +
311 SK_ScalarHalf * kYStep); 311 SK_ScalarHalf * kYStep);
312 312
313 SkColor color = genColor(&rand); 313 SkColor color = gen_color(&rand);
314 314
315 SkPaint p; 315 SkPaint p;
316 p.setAntiAlias(true); 316 p.setAntiAlias(true);
317 p.setStyle(SkPaint::kStroke_Style); 317 p.setStyle(SkPaint::kStroke_Style);
318 p.setStrokeWidth(strokeWidths[i]); 318 p.setStrokeWidth(strokeWidths[i]);
319 p.setColor(color); 319 p.setColor(color);
320 320
321 canvas->drawRRect(circleRect, p); 321 canvas->drawRRect(circleRect, p);
322 canvas->restore(); 322 canvas->restore();
323 } 323 }
324 } 324 }
325 325
326 // test old entry point (skbug.com/3786)
327 {
328 canvas->save();
329
330 canvas->translate(kXStart + SK_Scalar1 * kXStep * 5 + SK_Scalar1 / 4 ,
331 kYStart + SK_Scalar1 * kYStep * 4 + SK_Scalar1 / 4 +
332 SK_ScalarHalf * kYStep);
333
334 const SkColor color = gen_color(&rand);
335
336 SkPaint p;
337 p.setColor(color);
338
339 const SkRect oooRect = { 20, 30, -20, -30 }; // intentionally ou t of order
340 canvas->drawRoundRect(oooRect, 10, 10, p);
341
342 canvas->restore();
343 }
326 } 344 }
327 345
328 private: 346 private:
329 SkTArray<SkPaint> fPaints; 347 SkTArray<SkPaint> fPaints;
330 SkTArray<SkMatrix> fMatrices; 348 SkTArray<SkMatrix> fMatrices;
331 349
332 typedef GM INHERITED; 350 typedef GM INHERITED;
333 }; 351 };
334 352
335 ////////////////////////////////////////////////////////////////////////////// 353 //////////////////////////////////////////////////////////////////////////////
336 354
337 static GM* MyFactory(void*) { return new RoundRectGM; } 355 static GM* MyFactory(void*) { return new RoundRectGM; }
338 static GMRegistry reg(MyFactory); 356 static GMRegistry reg(MyFactory);
339 357
340 } 358 }
OLDNEW
« no previous file with comments | « no previous file | include/core/SkRRect.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698