blob: 5f84d9f3fa1219998f87aac07e1acec29fcaa57a [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +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 */
reed@android.com42309d42009-06-22 02:06:35 +00008#include "gm.h"
9#include "SkGradientShader.h"
10
11namespace skiagm {
12
13struct GradData {
14 int fCount;
15 const SkColor* fColors;
16 const SkScalar* fPos;
17};
18
19static const SkColor gColors[] = {
20 SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK
21};
22static const SkScalar gPos0[] = { 0, SK_Scalar1 };
23static const SkScalar gPos1[] = { SK_Scalar1/4, SK_Scalar1*3/4 };
24static const SkScalar gPos2[] = {
25 0, SK_Scalar1/8, SK_Scalar1/2, SK_Scalar1*7/8, SK_Scalar1
26};
27
commit-bot@chromium.org8ba1ad32013-08-07 15:22:13 +000028static const SkScalar gPosClamp[] = {0.0f, 0.0f, 1.0f, 1.0f};
29static const SkColor gColorClamp[] = {
30 SK_ColorRED, SK_ColorGREEN, SK_ColorGREEN, SK_ColorBLUE
31};
32
reed@android.com42309d42009-06-22 02:06:35 +000033static const GradData gGradData[] = {
34 { 2, gColors, NULL },
35 { 2, gColors, gPos0 },
36 { 2, gColors, gPos1 },
37 { 5, gColors, NULL },
commit-bot@chromium.org8ba1ad32013-08-07 15:22:13 +000038 { 5, gColors, gPos2 },
39 { 4, gColorClamp, gPosClamp }
reed@android.com42309d42009-06-22 02:06:35 +000040};
41
42static SkShader* MakeLinear(const SkPoint pts[2], const GradData& data,
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000043 SkShader::TileMode tm, SkUnitMapper* mapper,
44 const SkMatrix& localMatrix) {
reed@android.com42309d42009-06-22 02:06:35 +000045 return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos,
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000046 data.fCount, tm, mapper, 0, &localMatrix);
reed@android.com42309d42009-06-22 02:06:35 +000047}
reed@google.comf3c1cc92010-12-23 16:45:33 +000048
reed@android.com42309d42009-06-22 02:06:35 +000049static SkShader* MakeRadial(const SkPoint pts[2], const GradData& data,
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000050 SkShader::TileMode tm, SkUnitMapper* mapper,
51 const SkMatrix& localMatrix) {
reed@android.com42309d42009-06-22 02:06:35 +000052 SkPoint center;
53 center.set(SkScalarAve(pts[0].fX, pts[1].fX),
54 SkScalarAve(pts[0].fY, pts[1].fY));
55 return SkGradientShader::CreateRadial(center, center.fX, data.fColors,
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000056 data.fPos, data.fCount, tm, mapper, 0, &localMatrix);
reed@android.com42309d42009-06-22 02:06:35 +000057}
58
59static SkShader* MakeSweep(const SkPoint pts[2], const GradData& data,
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000060 SkShader::TileMode, SkUnitMapper* mapper,
61 const SkMatrix& localMatrix) {
reed@android.com42309d42009-06-22 02:06:35 +000062 SkPoint center;
63 center.set(SkScalarAve(pts[0].fX, pts[1].fX),
64 SkScalarAve(pts[0].fY, pts[1].fY));
65 return SkGradientShader::CreateSweep(center.fX, center.fY, data.fColors,
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000066 data.fPos, data.fCount, mapper, 0, &localMatrix);
reed@android.com42309d42009-06-22 02:06:35 +000067}
68
reed@google.comf3c1cc92010-12-23 16:45:33 +000069static SkShader* Make2Radial(const SkPoint pts[2], const GradData& data,
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000070 SkShader::TileMode tm, SkUnitMapper* mapper,
71 const SkMatrix& localMatrix) {
reed@google.comf3c1cc92010-12-23 16:45:33 +000072 SkPoint center0, center1;
73 center0.set(SkScalarAve(pts[0].fX, pts[1].fX),
74 SkScalarAve(pts[0].fY, pts[1].fY));
75 center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5),
76 SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4));
77 return SkGradientShader::CreateTwoPointRadial(
78 center1, (pts[1].fX - pts[0].fX) / 7,
79 center0, (pts[1].fX - pts[0].fX) / 2,
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000080 data.fColors, data.fPos, data.fCount, tm, mapper,
81 0, &localMatrix);
reed@google.comf3c1cc92010-12-23 16:45:33 +000082}
83
rileya@google.com5cf2c282012-07-09 14:42:16 +000084static SkShader* Make2Conical(const SkPoint pts[2], const GradData& data,
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000085 SkShader::TileMode tm, SkUnitMapper* mapper,
86 const SkMatrix& localMatrix) {
rileya@google.com5cf2c282012-07-09 14:42:16 +000087 SkPoint center0, center1;
88 SkScalar radius0 = SkScalarDiv(pts[1].fX - pts[0].fX, 10);
89 SkScalar radius1 = SkScalarDiv(pts[1].fX - pts[0].fX, 3);
90 center0.set(pts[0].fX + radius0, pts[0].fY + radius0);
91 center1.set(pts[1].fX - radius1, pts[1].fY - radius1);
rmistry@google.comd6176b02012-08-23 18:14:13 +000092 return SkGradientShader::CreateTwoPointConical(center1, radius1,
93 center0, radius0,
94 data.fColors, data.fPos,
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000095 data.fCount, tm, mapper,
96 0, &localMatrix);
rileya@google.com5cf2c282012-07-09 14:42:16 +000097}
98
reed@android.com42309d42009-06-22 02:06:35 +000099typedef SkShader* (*GradMaker)(const SkPoint pts[2], const GradData& data,
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +0000100 SkShader::TileMode tm, SkUnitMapper* mapper,
101 const SkMatrix& localMatrix);
reed@android.com42309d42009-06-22 02:06:35 +0000102static const GradMaker gGradMakers[] = {
rileya@google.com5cf2c282012-07-09 14:42:16 +0000103 MakeLinear, MakeRadial, MakeSweep, Make2Radial, Make2Conical
reed@android.com42309d42009-06-22 02:06:35 +0000104};
105
106///////////////////////////////////////////////////////////////////////////////
107
108class GradientsGM : public GM {
109public:
rmistry@google.comd6176b02012-08-23 18:14:13 +0000110 GradientsGM() {
bsalomon@google.com48dd1a22011-10-31 14:18:20 +0000111 this->setBGColor(0xFFDDDDDD);
112 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000113
reed@android.com42309d42009-06-22 02:06:35 +0000114protected:
115 SkString onShortName() {
116 return SkString("gradients");
117 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000118
edisonn@google.com1da3a802013-09-19 17:55:49 +0000119 virtual SkISize onISize() { return SkISize::Make(840, 815); }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000120
reed@android.com42309d42009-06-22 02:06:35 +0000121 virtual void onDraw(SkCanvas* canvas) {
rmistry@google.comd6176b02012-08-23 18:14:13 +0000122
reed@android.com42309d42009-06-22 02:06:35 +0000123 SkPoint pts[2] = {
124 { 0, 0 },
125 { SkIntToScalar(100), SkIntToScalar(100) }
126 };
127 SkShader::TileMode tm = SkShader::kClamp_TileMode;
128 SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) };
129 SkPaint paint;
130 paint.setAntiAlias(true);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000131
reed@android.com42309d42009-06-22 02:06:35 +0000132 canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
133 for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) {
134 canvas->save();
135 for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) {
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +0000136 SkMatrix scale = SkMatrix::I();
commit-bot@chromium.org8ba1ad32013-08-07 15:22:13 +0000137
138 if (i == 5) { // if the clamp case
commit-bot@chromium.org8ba1ad32013-08-07 15:22:13 +0000139 scale.setScale(0.5f, 0.5f);
140 scale.postTranslate(25.f, 25.f);
commit-bot@chromium.org8ba1ad32013-08-07 15:22:13 +0000141 }
skia.committer@gmail.comd55e3572013-08-08 07:01:20 +0000142
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +0000143 SkShader* shader = gGradMakers[j](pts, gGradData[i], tm, NULL, scale);
144
reed@android.com42309d42009-06-22 02:06:35 +0000145 paint.setShader(shader);
146 canvas->drawRect(r, paint);
147 shader->unref();
148 canvas->translate(0, SkIntToScalar(120));
149 }
150 canvas->restore();
151 canvas->translate(SkIntToScalar(120), 0);
152 }
153 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000154
reed@android.com42309d42009-06-22 02:06:35 +0000155private:
156 typedef GM INHERITED;
157};
158
rileya@google.com5cf2c282012-07-09 14:42:16 +0000159// Based on the original gradient slide, but with perspective applied to the
160// gradient shaders' local matrices
161class GradientsLocalPerspectiveGM : public GM {
162public:
rmistry@google.comd6176b02012-08-23 18:14:13 +0000163 GradientsLocalPerspectiveGM() {
rileya@google.com5cf2c282012-07-09 14:42:16 +0000164 this->setBGColor(0xFFDDDDDD);
165 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000166
rileya@google.com5cf2c282012-07-09 14:42:16 +0000167protected:
168 SkString onShortName() {
169 return SkString("gradients_local_perspective");
170 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000171
edisonn@google.com1da3a802013-09-19 17:55:49 +0000172 virtual SkISize onISize() { return SkISize::Make(840, 815); }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000173
rileya@google.com5cf2c282012-07-09 14:42:16 +0000174 virtual void onDraw(SkCanvas* canvas) {
rmistry@google.comd6176b02012-08-23 18:14:13 +0000175
rileya@google.com5cf2c282012-07-09 14:42:16 +0000176 SkPoint pts[2] = {
177 { 0, 0 },
178 { SkIntToScalar(100), SkIntToScalar(100) }
179 };
180 SkShader::TileMode tm = SkShader::kClamp_TileMode;
181 SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) };
182 SkPaint paint;
183 paint.setAntiAlias(true);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000184
rileya@google.com5cf2c282012-07-09 14:42:16 +0000185 canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
186 for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) {
187 canvas->save();
188 for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) {
rileya@google.com5cf2c282012-07-09 14:42:16 +0000189 // apply an increasing y perspective as we move to the right
190 SkMatrix perspective;
191 perspective.setIdentity();
borenet@google.comb7961192012-08-20 18:58:26 +0000192 perspective.setPerspY(SkScalarDiv(SkIntToScalar((unsigned) i+1),
rileya@google.com5cf2c282012-07-09 14:42:16 +0000193 SkIntToScalar(500)));
borenet@google.comb7961192012-08-20 18:58:26 +0000194 perspective.setSkewX(SkScalarDiv(SkIntToScalar((unsigned) i+1),
rileya@google.com5cf2c282012-07-09 14:42:16 +0000195 SkIntToScalar(10)));
commit-bot@chromium.org8ba1ad32013-08-07 15:22:13 +0000196
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +0000197 SkShader* shader = gGradMakers[j](pts, gGradData[i], tm, NULL, perspective);
rileya@google.com5cf2c282012-07-09 14:42:16 +0000198
199 paint.setShader(shader);
200 canvas->drawRect(r, paint);
201 shader->unref();
202 canvas->translate(0, SkIntToScalar(120));
203 }
204 canvas->restore();
205 canvas->translate(SkIntToScalar(120), 0);
206 }
207 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000208
rileya@google.com5cf2c282012-07-09 14:42:16 +0000209private:
210 typedef GM INHERITED;
211};
212
213// Based on the original gradient slide, but with perspective applied to
214// the view matrix
215class GradientsViewPerspectiveGM : public GradientsGM {
216protected:
217 SkString onShortName() {
218 return SkString("gradients_view_perspective");
219 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000220
edisonn@google.com1da3a802013-09-19 17:55:49 +0000221 virtual SkISize onISize() { return SkISize::Make(840, 500); }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000222
rileya@google.com5cf2c282012-07-09 14:42:16 +0000223 virtual void onDraw(SkCanvas* canvas) {
224 SkMatrix perspective;
225 perspective.setIdentity();
226 perspective.setPerspY(SkScalarDiv(SK_Scalar1, SkIntToScalar(1000)));
227 perspective.setSkewX(SkScalarDiv(SkIntToScalar(8), SkIntToScalar(25)));
scroggo@google.com837d31a2012-08-15 18:42:45 +0000228 canvas->concat(perspective);
rileya@google.com5cf2c282012-07-09 14:42:16 +0000229 INHERITED::onDraw(canvas);
230 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000231
rileya@google.com5cf2c282012-07-09 14:42:16 +0000232private:
233 typedef GradientsGM INHERITED;
234};
235
reed@google.comac864a92011-06-27 18:11:17 +0000236/*
237 Inspired by this <canvas> javascript, where we need to detect that we are not
238 solving a quadratic equation, but must instead solve a linear (since our X^2
239 coefficient is 0)
240
241 ctx.fillStyle = '#f00';
242 ctx.fillRect(0, 0, 100, 50);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000243
reed@google.comac864a92011-06-27 18:11:17 +0000244 var g = ctx.createRadialGradient(-80, 25, 70, 0, 25, 150);
245 g.addColorStop(0, '#f00');
246 g.addColorStop(0.01, '#0f0');
247 g.addColorStop(0.99, '#0f0');
248 g.addColorStop(1, '#f00');
249 ctx.fillStyle = g;
250 ctx.fillRect(0, 0, 100, 50);
251 */
252class GradientsDegenrate2PointGM : public GM {
253public:
254 GradientsDegenrate2PointGM() {}
rmistry@google.comd6176b02012-08-23 18:14:13 +0000255
reed@google.comac864a92011-06-27 18:11:17 +0000256protected:
257 SkString onShortName() {
258 return SkString("gradients_degenerate_2pt");
259 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000260
edisonn@google.com1da3a802013-09-19 17:55:49 +0000261 virtual SkISize onISize() { return SkISize::Make(320, 320); }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000262
reed@google.comac864a92011-06-27 18:11:17 +0000263 void drawBG(SkCanvas* canvas) {
264 canvas->drawColor(SK_ColorBLUE);
265 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000266
reed@google.comac864a92011-06-27 18:11:17 +0000267 virtual void onDraw(SkCanvas* canvas) {
268 this->drawBG(canvas);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000269
reed@google.comac864a92011-06-27 18:11:17 +0000270 SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorGREEN, SK_ColorRED };
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +0000271 SkScalar pos[] = { 0, 0.01f, 0.99f, SK_Scalar1 };
epoger@google.com59f3abf2011-07-21 15:50:33 +0000272 SkPoint c0;
273 c0.iset(-80, 25);
274 SkScalar r0 = SkIntToScalar(70);
275 SkPoint c1;
276 c1.iset(0, 25);
277 SkScalar r1 = SkIntToScalar(150);
reed@google.comac864a92011-06-27 18:11:17 +0000278 SkShader* s = SkGradientShader::CreateTwoPointRadial(c0, r0, c1, r1, colors,
279 pos, SK_ARRAY_COUNT(pos),
280 SkShader::kClamp_TileMode);
281 SkPaint paint;
282 paint.setShader(s)->unref();
283 canvas->drawPaint(paint);
284 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000285
reed@google.comac864a92011-06-27 18:11:17 +0000286private:
287 typedef GM INHERITED;
288};
289
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000290/// Tests correctness of *optimized* codepaths in gradients.
291
292class ClampedGradientsGM : public GM {
293public:
294 ClampedGradientsGM() {}
295
296protected:
297 SkString onShortName() { return SkString("clamped_gradients"); }
298
edisonn@google.com1da3a802013-09-19 17:55:49 +0000299 virtual SkISize onISize() { return SkISize::Make(640, 510); }
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000300
301 void drawBG(SkCanvas* canvas) {
302 canvas->drawColor(0xFFDDDDDD);
303 }
304
305 virtual void onDraw(SkCanvas* canvas) {
306 this->drawBG(canvas);
307
308 SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(300) };
309 SkPaint paint;
310 paint.setAntiAlias(true);
311
312 SkPoint center;
313 center.iset(0, 300);
314 canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
315 SkShader* shader = SkGradientShader::CreateRadial(
316 SkPoint(center),
bungeman@google.com01744a42011-10-06 19:37:39 +0000317 SkIntToScalar(200), gColors, NULL, 5,
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000318 SkShader::kClamp_TileMode, NULL);
319 paint.setShader(shader);
320 canvas->drawRect(r, paint);
321 shader->unref();
322 }
323
324private:
325 typedef GM INHERITED;
326};
327
tomhudson@google.comb18e58c2012-01-30 20:00:13 +0000328/// Checks quality of large radial gradients, which may display
329/// some banding.
330
331class RadialGradientGM : public GM {
332public:
333 RadialGradientGM() {}
334
335protected:
336 SkString onShortName() { return SkString("radial_gradient"); }
edisonn@google.com1da3a802013-09-19 17:55:49 +0000337 virtual SkISize onISize() { return SkISize::Make(1280, 1280); }
tomhudson@google.comb18e58c2012-01-30 20:00:13 +0000338 void drawBG(SkCanvas* canvas) {
339 canvas->drawColor(0xFF000000);
340 }
341 virtual void onDraw(SkCanvas* canvas) {
reed@google.combb0948f2012-01-31 14:44:13 +0000342 const SkISize dim = this->getISize();
343
tomhudson@google.comb18e58c2012-01-30 20:00:13 +0000344 this->drawBG(canvas);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000345
tomhudson@google.comb18e58c2012-01-30 20:00:13 +0000346 SkPaint paint;
347 paint.setDither(true);
348 SkPoint center;
reed@google.combb0948f2012-01-31 14:44:13 +0000349 center.set(SkIntToScalar(dim.width())/2, SkIntToScalar(dim.height())/2);
350 SkScalar radius = SkIntToScalar(dim.width())/2;
351 const SkColor colors[] = { 0x7f7f7f7f, 0x7f7f7f7f, 0xb2000000 };
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +0000352 const SkScalar pos[] = { 0.0f,
353 0.35f,
354 1.0f };
tomhudson@google.comb18e58c2012-01-30 20:00:13 +0000355 SkShader* shader =
356 SkGradientShader::CreateRadial(center, radius, colors,
reed@google.combb0948f2012-01-31 14:44:13 +0000357 pos, SK_ARRAY_COUNT(pos),
358 SkShader::kClamp_TileMode);
tomhudson@google.comb18e58c2012-01-30 20:00:13 +0000359 paint.setShader(shader)->unref();
reed@google.combb0948f2012-01-31 14:44:13 +0000360 SkRect r = {
361 0, 0, SkIntToScalar(dim.width()), SkIntToScalar(dim.height())
362 };
tomhudson@google.comb18e58c2012-01-30 20:00:13 +0000363 canvas->drawRect(r, paint);
364 }
365private:
366 typedef GM INHERITED;
367};
368
369
mtklein@google.com361a72f2013-08-19 18:43:34 +0000370class RadialGradient2GM : public GM {
371public:
372 RadialGradient2GM() {}
373
374protected:
375 SkString onShortName() { return SkString("radial_gradient2"); }
edisonn@google.com1da3a802013-09-19 17:55:49 +0000376 virtual SkISize onISize() { return SkISize::Make(800, 400); }
mtklein@google.com361a72f2013-08-19 18:43:34 +0000377 void drawBG(SkCanvas* canvas) {
378 canvas->drawColor(0xFF000000);
379 }
380
381 // Reproduces the example given in bug 7671058.
382 virtual void onDraw(SkCanvas* canvas) {
383 SkPaint paint1, paint2, paint3;
384 paint1.setStyle(SkPaint::kFill_Style);
385 paint2.setStyle(SkPaint::kFill_Style);
386 paint3.setStyle(SkPaint::kFill_Style);
387
388 const SkColor sweep_colors[] =
389 { 0xFFFF0000, 0xFFFFFF00, 0xFF00FF00, 0xFF00FFFF, 0xFF0000FF, 0xFFFF00FF, 0xFFFF0000 };
390 const SkColor colors1[] = { 0xFFFFFFFF, 0x00000000 };
391 const SkColor colors2[] = { 0xFF000000, 0x00000000 };
392
393 const SkScalar cx = 200, cy = 200, radius = 150;
394 SkPoint center;
395 center.set(cx, cy);
396
mtklein@google.com3ef7eea2013-09-16 13:02:52 +0000397 // We can either interpolate endpoints and premultiply each point (default, more precision),
398 // or premultiply the endpoints first, avoiding the need to premultiply each point (cheap).
399 const uint32_t flags[] = { 0, SkGradientShader::kInterpolateColorsInPremul_Flag };
mtklein@google.com361a72f2013-08-19 18:43:34 +0000400
mtklein@google.com3ef7eea2013-09-16 13:02:52 +0000401 for (size_t i = 0; i < SK_ARRAY_COUNT(flags); i++) {
402 SkAutoTUnref<SkShader> sweep(
403 SkGradientShader::CreateSweep(cx, cy, sweep_colors,
404 NULL, SK_ARRAY_COUNT(sweep_colors),
405 NULL, flags[i]));
406 SkAutoTUnref<SkShader> radial1(
407 SkGradientShader::CreateRadial(center, radius, colors1,
408 NULL, SK_ARRAY_COUNT(colors1),
409 SkShader::kClamp_TileMode,
410 NULL, flags[i]));
411 SkAutoTUnref<SkShader> radial2(
412 SkGradientShader::CreateRadial(center, radius, colors2,
413 NULL, SK_ARRAY_COUNT(colors2),
414 SkShader::kClamp_TileMode,
415 NULL, flags[i]));
416 paint1.setShader(sweep);
417 paint2.setShader(radial1);
418 paint3.setShader(radial2);
419
420 canvas->drawCircle(cx, cy, radius, paint1);
421 canvas->drawCircle(cx, cy, radius, paint3);
422 canvas->drawCircle(cx, cy, radius, paint2);
423
424 canvas->translate(400, 0);
425 }
mtklein@google.com361a72f2013-08-19 18:43:34 +0000426 }
427
428private:
429 typedef GM INHERITED;
430};
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000431
reed@android.com42309d42009-06-22 02:06:35 +0000432///////////////////////////////////////////////////////////////////////////////
433
434static GM* MyFactory(void*) { return new GradientsGM; }
435static GMRegistry reg(MyFactory);
436
reed@google.comac864a92011-06-27 18:11:17 +0000437static GM* MyFactory2(void*) { return new GradientsDegenrate2PointGM; }
438static GMRegistry reg2(MyFactory2);
439
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000440static GM* MyFactory3(void*) { return new ClampedGradientsGM; }
441static GMRegistry reg3(MyFactory3);
442
tomhudson@google.comb18e58c2012-01-30 20:00:13 +0000443static GM* MyFactory4(void*) { return new RadialGradientGM; }
444static GMRegistry reg4(MyFactory4);
rileya@google.com5cf2c282012-07-09 14:42:16 +0000445
446static GM* MyFactory5(void*) { return new GradientsLocalPerspectiveGM; }
447static GMRegistry reg5(MyFactory5);
448
449static GM* MyFactory6(void*) { return new GradientsViewPerspectiveGM; }
450static GMRegistry reg6(MyFactory6);
mtklein@google.com361a72f2013-08-19 18:43:34 +0000451
452static GM* MyFactory7(void*) { return new RadialGradient2GM; }
453static GMRegistry reg7(MyFactory7);
reed@android.com42309d42009-06-22 02:06:35 +0000454}