blob: fbb005ffc0b4d9d508b58bd6ec55dbeca47f36cd [file] [log] [blame]
commit-bot@chromium.orga534b842013-04-22 18:05:19 +00001/*
2 * Copyright 2013 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 */
7
8#include "gm.h"
9#include "SkTArray.h"
10#include "SkRandom.h"
11#include "SkMatrix.h"
12#include "SkBlurMaskFilter.h"
mtklein7a1f45f2016-08-04 06:19:33 -070013#include "SkColorFilter.h"
commit-bot@chromium.orga534b842013-04-22 18:05:19 +000014#include "SkGradientShader.h"
15#include "SkBlurDrawLooper.h"
16#include "SkRect.h"
17#include "SkRRect.h"
18
19namespace skiagm {
20
robertphillips05302f82015-09-29 11:24:07 -070021static 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
commit-bot@chromium.orga534b842013-04-22 18:05:19 +000030class RoundRectGM : public GM {
31public:
32 RoundRectGM() {
33 this->setBGColor(0xFF000000);
34 this->makePaints();
35 this->makeMatrices();
36 }
37
38protected:
commit-bot@chromium.orga90c6802014-04-30 13:20:45 +000039
mtklein36352bf2015-03-25 18:17:31 -070040 SkString onShortName() override {
commit-bot@chromium.orga534b842013-04-22 18:05:19 +000041 return SkString("roundrects");
42 }
43
mtklein36352bf2015-03-25 18:17:31 -070044 SkISize onISize() override {
tfarinaf5393182014-06-09 23:59:03 -070045 return SkISize::Make(1200, 900);
commit-bot@chromium.orga534b842013-04-22 18:05:19 +000046 }
47
48 void makePaints() {
49 {
jvanverth250d00b2016-08-25 05:53:00 -070050 // no AA
51 SkPaint p;
52 fPaints.push_back(p);
commit-bot@chromium.orga534b842013-04-22 18:05:19 +000053 }
54
55 {
jvanverth250d00b2016-08-25 05:53:00 -070056 // AA
57 SkPaint p;
58 p.setAntiAlias(true);
59 fPaints.push_back(p);
commit-bot@chromium.orga534b842013-04-22 18:05:19 +000060 }
61
62 {
jvanverth250d00b2016-08-25 05:53:00 -070063 // AA with stroke style
64 SkPaint p;
65 p.setAntiAlias(true);
66 p.setStyle(SkPaint::kStroke_Style);
67 p.setStrokeWidth(SkIntToScalar(5));
68 fPaints.push_back(p);
commit-bot@chromium.orga534b842013-04-22 18:05:19 +000069 }
70
71 {
jvanverth250d00b2016-08-25 05:53:00 -070072 // AA with stroke style, width = 0
73 SkPaint p;
74 p.setAntiAlias(true);
75 p.setStyle(SkPaint::kStroke_Style);
76 fPaints.push_back(p);
commit-bot@chromium.orga534b842013-04-22 18:05:19 +000077 }
78
79 {
jvanverth250d00b2016-08-25 05:53:00 -070080 // AA with stroke and fill style
81 SkPaint p;
82 p.setAntiAlias(true);
83 p.setStyle(SkPaint::kStrokeAndFill_Style);
84 p.setStrokeWidth(SkIntToScalar(3));
85 fPaints.push_back(p);
commit-bot@chromium.orga534b842013-04-22 18:05:19 +000086 }
87 }
88
89 void makeMatrices() {
90 {
jvanverth250d00b2016-08-25 05:53:00 -070091 SkMatrix m;
92 m.setIdentity();
93 fMatrices.push_back(m);
commit-bot@chromium.orga534b842013-04-22 18:05:19 +000094 }
95
96 {
jvanverth250d00b2016-08-25 05:53:00 -070097 SkMatrix m;
98 m.setScale(SkIntToScalar(3), SkIntToScalar(2));
99 fMatrices.push_back(m);
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000100 }
101
102 {
jvanverth250d00b2016-08-25 05:53:00 -0700103 SkMatrix m;
104 m.setScale(SkIntToScalar(2), SkIntToScalar(2));
105 fMatrices.push_back(m);
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000106 }
107
108 {
jvanverth250d00b2016-08-25 05:53:00 -0700109 SkMatrix m;
110 m.setScale(SkIntToScalar(1), SkIntToScalar(2));
111 fMatrices.push_back(m);
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000112 }
113
114 {
jvanverth250d00b2016-08-25 05:53:00 -0700115 SkMatrix m;
116 m.setScale(SkIntToScalar(4), SkIntToScalar(1));
117 fMatrices.push_back(m);
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000118 }
119
120 {
jvanverth250d00b2016-08-25 05:53:00 -0700121 SkMatrix m;
122 m.setRotate(SkIntToScalar(90));
123 fMatrices.push_back(m);
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000124 }
125
126 {
jvanverth250d00b2016-08-25 05:53:00 -0700127 SkMatrix m;
128 m.setSkew(SkIntToScalar(2), SkIntToScalar(3));
129 fMatrices.push_back(m);
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000130 }
131
132 {
jvanverth250d00b2016-08-25 05:53:00 -0700133 SkMatrix m;
134 m.setRotate(SkIntToScalar(60));
135 fMatrices.push_back(m);
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000136 }
137 }
138
mtklein36352bf2015-03-25 18:17:31 -0700139 void onDraw(SkCanvas* canvas) override {
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +0000140 SkRandom rand(1);
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000141 canvas->translate(20 * SK_Scalar1, 20 * SK_Scalar1);
robertphillips05302f82015-09-29 11:24:07 -0700142 const SkRect rect = SkRect::MakeLTRB(-20, -30, 20, 30);
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000143 SkRRect circleRect;
144 circleRect.setRectXY(rect, 5, 5);
145
146 const SkScalar kXStart = 60.0f;
147 const SkScalar kYStart = 80.0f;
148 const int kXStep = 150;
149 const int kYStep = 160;
150 int maxX = fMatrices.count();
151
152 SkPaint rectPaint;
153 rectPaint.setAntiAlias(true);
154 rectPaint.setStyle(SkPaint::kStroke_Style);
155 rectPaint.setStrokeWidth(SkIntToScalar(0));
caryclarkf597c422015-07-28 10:37:53 -0700156 rectPaint.setColor(sk_tool_utils::color_to_565(SK_ColorLTGRAY));
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000157
158 int testCount = 0;
skia.committer@gmail.come36a1682013-04-23 07:01:29 +0000159 for (int i = 0; i < fPaints.count(); ++i) {
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000160 for (int j = 0; j < fMatrices.count(); ++j) {
161 canvas->save();
162 SkMatrix mat = fMatrices[j];
163 // position the roundrect, and make it at off-integer coords.
skia.committer@gmail.come36a1682013-04-23 07:01:29 +0000164 mat.postTranslate(kXStart + SK_Scalar1 * kXStep * (testCount % maxX) +
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000165 SK_Scalar1 / 4,
skia.committer@gmail.come36a1682013-04-23 07:01:29 +0000166 kYStart + SK_Scalar1 * kYStep * (testCount / maxX) +
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000167 3 * SK_Scalar1 / 4);
168 canvas->concat(mat);
skia.committer@gmail.come36a1682013-04-23 07:01:29 +0000169
robertphillips05302f82015-09-29 11:24:07 -0700170 SkColor color = gen_color(&rand);
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000171 fPaints[i].setColor(color);
172
173 canvas->drawRect(rect, rectPaint);
174 canvas->drawRRect(circleRect, fPaints[i]);
175
176 canvas->restore();
177
178 ++testCount;
179 }
180 }
181
182 // special cases
183
184 // non-scaled tall and skinny roundrect
skia.committer@gmail.come36a1682013-04-23 07:01:29 +0000185 for (int i = 0; i < fPaints.count(); ++i) {
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000186 SkRect rect = SkRect::MakeLTRB(-20, -60, 20, 60);
187 SkRRect ellipseRect;
188 ellipseRect.setRectXY(rect, 5, 10);
189
190 canvas->save();
191 // position the roundrect, and make it at off-integer coords.
192 canvas->translate(kXStart + SK_Scalar1 * kXStep * 2.55f + SK_Scalar1 / 4,
193 kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4);
skia.committer@gmail.come36a1682013-04-23 07:01:29 +0000194
robertphillips05302f82015-09-29 11:24:07 -0700195 SkColor color = gen_color(&rand);
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000196 fPaints[i].setColor(color);
197
198 canvas->drawRect(rect, rectPaint);
199 canvas->drawRRect(ellipseRect, fPaints[i]);
200 canvas->restore();
201 }
202
203 // non-scaled wide and short roundrect
skia.committer@gmail.come36a1682013-04-23 07:01:29 +0000204 for (int i = 0; i < fPaints.count(); ++i) {
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000205 SkRect rect = SkRect::MakeLTRB(-80, -30, 80, 30);
206 SkRRect ellipseRect;
207 ellipseRect.setRectXY(rect, 20, 5);
208
209 canvas->save();
210 // position the roundrect, and make it at off-integer coords.
211 canvas->translate(kXStart + SK_Scalar1 * kXStep * 4 + SK_Scalar1 / 4,
212 kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
213 SK_ScalarHalf * kYStep);
skia.committer@gmail.come36a1682013-04-23 07:01:29 +0000214
robertphillips05302f82015-09-29 11:24:07 -0700215 SkColor color = gen_color(&rand);
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000216 fPaints[i].setColor(color);
217
218 canvas->drawRect(rect, rectPaint);
219 canvas->drawRRect(ellipseRect, fPaints[i]);
220 canvas->restore();
221 }
222
223 // super skinny roundrect
skia.committer@gmail.come36a1682013-04-23 07:01:29 +0000224 for (int i = 0; i < fPaints.count(); ++i) {
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000225 SkRect rect = SkRect::MakeLTRB(0, -60, 1, 60);
226 SkRRect circleRect;
227 circleRect.setRectXY(rect, 5, 5);
228
229 canvas->save();
230 // position the roundrect, and make it at off-integer coords.
231 canvas->translate(kXStart + SK_Scalar1 * kXStep * 3.25f + SK_Scalar1 / 4,
232 kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4);
skia.committer@gmail.come36a1682013-04-23 07:01:29 +0000233
robertphillips05302f82015-09-29 11:24:07 -0700234 SkColor color = gen_color(&rand);
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000235 fPaints[i].setColor(color);
236
237 canvas->drawRRect(circleRect, fPaints[i]);
238 canvas->restore();
239 }
240
241 // super short roundrect
skia.committer@gmail.come36a1682013-04-23 07:01:29 +0000242 for (int i = 0; i < fPaints.count(); ++i) {
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000243 SkRect rect = SkRect::MakeLTRB(-80, -1, 80, 0);
244 SkRRect circleRect;
245 circleRect.setRectXY(rect, 5, 5);
246
247 canvas->save();
248 // position the roundrect, and make it at off-integer coords.
249 canvas->translate(kXStart + SK_Scalar1 * kXStep * 2.5f + SK_Scalar1 / 4,
250 kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
251 SK_ScalarHalf * kYStep);
skia.committer@gmail.come36a1682013-04-23 07:01:29 +0000252
robertphillips05302f82015-09-29 11:24:07 -0700253 SkColor color = gen_color(&rand);
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000254 fPaints[i].setColor(color);
255
256 canvas->drawRRect(circleRect, fPaints[i]);
257 canvas->restore();
258 }
skia.committer@gmail.come36a1682013-04-23 07:01:29 +0000259
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000260 // radial gradient
261 SkPoint center = SkPoint::Make(SkIntToScalar(0), SkIntToScalar(0));
262 SkColor colors[] = { SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN };
263 SkScalar pos[] = { 0, SK_ScalarHalf, SK_Scalar1 };
reed1a9b9642016-03-13 14:13:58 -0700264 auto shader = SkGradientShader::MakeRadial(center, 20, colors, pos, SK_ARRAY_COUNT(colors),
265 SkShader::kClamp_TileMode);
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000266
267 for (int i = 0; i < fPaints.count(); ++i) {
268 canvas->save();
269 // position the path, and make it at off-integer coords.
270 canvas->translate(kXStart + SK_Scalar1 * kXStep * 0 + SK_Scalar1 / 4,
271 kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
272 SK_ScalarHalf * kYStep);
skia.committer@gmail.come36a1682013-04-23 07:01:29 +0000273
robertphillips05302f82015-09-29 11:24:07 -0700274 SkColor color = gen_color(&rand);
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000275 fPaints[i].setColor(color);
276 fPaints[i].setShader(shader);
277
278 canvas->drawRect(rect, rectPaint);
279 canvas->drawRRect(circleRect, fPaints[i]);
280
halcanary96fcdcc2015-08-27 07:41:13 -0700281 fPaints[i].setShader(nullptr);
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000282
283 canvas->restore();
284 }
285
286 // strokes and radii
skia.committer@gmail.come36a1682013-04-23 07:01:29 +0000287 {
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000288 SkScalar radii[][2] = {
289 {10,10},
290 {5,15},
291 {5,15},
292 {5,15}
293 };
294
295 SkScalar strokeWidths[] = {
296 20, 10, 20, 40
297 };
298
299 for (int i = 0; i < 4; ++i) {
300 SkRRect circleRect;
301 circleRect.setRectXY(rect, radii[i][0], radii[i][1]);
302
303 canvas->save();
304 // position the roundrect, and make it at off-integer coords.
305 canvas->translate(kXStart + SK_Scalar1 * kXStep * 5 + SK_Scalar1 / 4,
306 kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
307 SK_ScalarHalf * kYStep);
skia.committer@gmail.come36a1682013-04-23 07:01:29 +0000308
robertphillips05302f82015-09-29 11:24:07 -0700309 SkColor color = gen_color(&rand);
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000310
311 SkPaint p;
312 p.setAntiAlias(true);
313 p.setStyle(SkPaint::kStroke_Style);
314 p.setStrokeWidth(strokeWidths[i]);
315 p.setColor(color);
316
317 canvas->drawRRect(circleRect, p);
318 canvas->restore();
319 }
320 }
321
halcanary6950de62015-11-07 05:29:00 -0800322 // test old entry point ( https://bug.skia.org/3786 )
robertphillips05302f82015-09-29 11:24:07 -0700323 {
324 canvas->save();
325
326 canvas->translate(kXStart + SK_Scalar1 * kXStep * 5 + SK_Scalar1 / 4,
327 kYStart + SK_Scalar1 * kYStep * 4 + SK_Scalar1 / 4 +
328 SK_ScalarHalf * kYStep);
329
330 const SkColor color = gen_color(&rand);
331
332 SkPaint p;
333 p.setColor(color);
334
335 const SkRect oooRect = { 20, 30, -20, -30 }; // intentionally out of order
336 canvas->drawRoundRect(oooRect, 10, 10, p);
337
338 canvas->restore();
339 }
jvanverth250d00b2016-08-25 05:53:00 -0700340
341 // rrect with stroke > radius/2
342 {
343 SkRect smallRect = { -30, -20, 30, 20 };
344 SkRRect circleRect;
345 circleRect.setRectXY(smallRect, 5, 5);
346
347 canvas->save();
348 // position the roundrect, and make it at off-integer coords.
349 canvas->translate(kXStart + SK_Scalar1 * kXStep * 5 + SK_Scalar1 / 4,
350 kYStart - SK_Scalar1 * kYStep + 73 * SK_Scalar1 / 4 +
351 SK_ScalarHalf * kYStep);
352
353 SkColor color = gen_color(&rand);
354
355 SkPaint p;
356 p.setAntiAlias(true);
357 p.setStyle(SkPaint::kStroke_Style);
358 p.setStrokeWidth(25);
359 p.setColor(color);
360
361 canvas->drawRRect(circleRect, p);
362 canvas->restore();
363 }
commit-bot@chromium.orga534b842013-04-22 18:05:19 +0000364 }
365
366private:
367 SkTArray<SkPaint> fPaints;
368 SkTArray<SkMatrix> fMatrices;
369
370 typedef GM INHERITED;
371};
372
373//////////////////////////////////////////////////////////////////////////////
374
375static GM* MyFactory(void*) { return new RoundRectGM; }
376static GMRegistry reg(MyFactory);
377
378}