2 * Copyright 2013 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
9 #include "sk_tool_utils.h"
13 #include "SkBlurMaskFilter.h"
14 #include "SkColorFilter.h"
15 #include "SkGradientShader.h"
16 #include "SkBlurDrawLooper.h"
21 class OvalGM : public GM {
24 this->setBGColor(0xFF000000);
31 SkString onShortName() override {
32 return SkString("ovals");
35 SkISize onISize() override {
36 return SkISize::Make(1200, 900);
54 // AA with stroke style
57 p.setStyle(SkPaint::kStroke_Style);
58 p.setStrokeWidth(SkIntToScalar(5));
63 // AA with stroke style, width = 0
66 p.setStyle(SkPaint::kStroke_Style);
71 // AA with stroke and fill style
74 p.setStyle(SkPaint::kStrokeAndFill_Style);
75 p.setStrokeWidth(SkIntToScalar(3));
84 fMatrices.push_back(m);
89 m.setScale(SkIntToScalar(3), SkIntToScalar(2));
90 fMatrices.push_back(m);
95 m.setScale(SkIntToScalar(2), SkIntToScalar(2));
96 fMatrices.push_back(m);
101 m.setScale(SkIntToScalar(1), SkIntToScalar(2));
102 fMatrices.push_back(m);
107 m.setScale(SkIntToScalar(4), SkIntToScalar(1));
108 fMatrices.push_back(m);
113 m.setRotate(SkIntToScalar(90));
114 fMatrices.push_back(m);
119 m.setSkew(SkIntToScalar(2), SkIntToScalar(3));
120 fMatrices.push_back(m);
125 m.setRotate(SkIntToScalar(60));
126 fMatrices.push_back(m);
130 SkColor genColor(SkRandom* rand) {
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);
136 return sk_tool_utils::color_to_565(SkHSVToColor(hsv));
139 void onDraw(SkCanvas* canvas) override {
141 canvas->translate(20 * SK_Scalar1, 20 * SK_Scalar1);
142 SkRect oval = SkRect::MakeLTRB(-20, -30, 20, 30);
144 const SkScalar kXStart = 60.0f;
145 const SkScalar kYStart = 80.0f;
146 const int kXStep = 150;
147 const int kYStep = 160;
148 int maxX = fMatrices.count();
151 rectPaint.setAntiAlias(true);
152 rectPaint.setStyle(SkPaint::kStroke_Style);
153 rectPaint.setStrokeWidth(SkIntToScalar(0));
154 rectPaint.setColor(sk_tool_utils::color_to_565(SK_ColorLTGRAY));
157 for (int i = 0; i < fPaints.count(); ++i) {
158 for (int j = 0; j < fMatrices.count(); ++j) {
160 SkMatrix mat = fMatrices[j];
161 // position the oval, and make it at off-integer coords.
162 mat.postTranslate(kXStart + SK_Scalar1 * kXStep * (testCount % maxX) +
164 kYStart + SK_Scalar1 * kYStep * (testCount / maxX) +
168 SkColor color = genColor(&rand);
169 fPaints[i].setColor(color);
171 canvas->drawRect(oval, rectPaint);
172 canvas->drawOval(oval, fPaints[i]);
182 // non-scaled tall and skinny oval
183 for (int i = 0; i < fPaints.count(); ++i) {
184 SkRect oval = SkRect::MakeLTRB(-20, -60, 20, 60);
186 // position the oval, and make it at off-integer coords.
187 canvas->translate(kXStart + SK_Scalar1 * kXStep * 2.55f + SK_Scalar1 / 4,
188 kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4);
190 SkColor color = genColor(&rand);
191 fPaints[i].setColor(color);
193 canvas->drawRect(oval, rectPaint);
194 canvas->drawOval(oval, fPaints[i]);
198 // non-scaled wide and short oval
199 for (int i = 0; i < fPaints.count(); ++i) {
200 SkRect oval = SkRect::MakeLTRB(-80, -30, 80, 30);
202 // position the oval, and make it at off-integer coords.
203 canvas->translate(kXStart + SK_Scalar1 * kXStep * 4 + SK_Scalar1 / 4,
204 kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
205 SK_ScalarHalf * kYStep);
207 SkColor color = genColor(&rand);
208 fPaints[i].setColor(color);
210 canvas->drawRect(oval, rectPaint);
211 canvas->drawOval(oval, fPaints[i]);
216 for (int i = 0; i < fPaints.count(); ++i) {
217 SkRect oval = SkRect::MakeLTRB(0, -60, 1, 60);
219 // position the oval, and make it at off-integer coords.
220 canvas->translate(kXStart + SK_Scalar1 * kXStep * 3.25f + SK_Scalar1 / 4,
221 kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4);
223 SkColor color = genColor(&rand);
224 fPaints[i].setColor(color);
226 canvas->drawOval(oval, fPaints[i]);
231 for (int i = 0; i < fPaints.count(); ++i) {
232 SkRect oval = SkRect::MakeLTRB(-80, -1, 80, 0);
234 // position the oval, and make it at off-integer coords.
235 canvas->translate(kXStart + SK_Scalar1 * kXStep * 2.5f + SK_Scalar1 / 4,
236 kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
237 SK_ScalarHalf * kYStep);
239 SkColor color = genColor(&rand);
240 fPaints[i].setColor(color);
242 canvas->drawOval(oval, fPaints[i]);
247 SkPoint center = SkPoint::Make(SkIntToScalar(0), SkIntToScalar(0));
248 SkColor colors[] = { SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN };
249 SkScalar pos[] = { 0, SK_ScalarHalf, SK_Scalar1 };
250 auto shader = SkGradientShader::MakeRadial(center, 20, colors, pos, SK_ARRAY_COUNT(colors),
251 SkShader::kClamp_TileMode);
253 for (int i = 0; i < fPaints.count(); ++i) {
255 // position the path, and make it at off-integer coords.
256 canvas->translate(kXStart + SK_Scalar1 * kXStep * 0 + SK_Scalar1 / 4,
257 kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
258 SK_ScalarHalf * kYStep);
260 SkColor color = genColor(&rand);
261 fPaints[i].setColor(color);
262 fPaints[i].setShader(shader);
264 canvas->drawRect(oval, rectPaint);
265 canvas->drawOval(oval, fPaints[i]);
267 fPaints[i].setShader(nullptr);
273 for (int i = 0; i < fPaints.count(); ++i) {
274 SkRect oval = SkRect::MakeLTRB(-30, -30, 30, 30);
276 // position the oval, and make it at off-integer coords.
277 canvas->translate(kXStart + SK_Scalar1 * kXStep * 5 + SK_Scalar1 / 4,
278 kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
279 SK_ScalarHalf * kYStep);
281 canvas->scale(1, -1);
282 canvas->scale(1, 0.66f);
284 SkColor color = genColor(&rand);
285 fPaints[i].setColor(color);
287 canvas->drawRect(oval, rectPaint);
288 canvas->drawOval(oval, fPaints[i]);
294 SkTArray<SkPaint> fPaints;
295 SkTArray<SkMatrix> fMatrices;
297 typedef GM INHERITED;
300 //////////////////////////////////////////////////////////////////////////////
302 static GM* MyFactory(void*) { return new OvalGM; }
303 static GMRegistry reg(MyFactory);