blob: f5abb07efc235e93d9e239d75ffaf519ca9bb6ba [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.org3339ac52014-05-22 02:55:59 +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.org3339ac52014-05-22 02:55:59 +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.org3339ac52014-05-22 02:55:59 +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.org3339ac52014-05-22 02:55:59 +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.org3339ac52014-05-22 02:55:59 +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.org3339ac52014-05-22 02:55:59 +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.org3339ac52014-05-22 02:55:59 +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.org3339ac52014-05-22 02:55:59 +000080 data.fColors, data.fPos, data.fCount, tm, mapper,
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +000081 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.org3339ac52014-05-22 02:55:59 +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.org3339ac52014-05-22 02:55:59 +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.org3339ac52014-05-22 02:55:59 +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:
commit-bot@chromium.orga90c6802014-04-30 13:20:45 +0000115 virtual uint32_t onGetFlags() const SK_OVERRIDE {
116 return kSkipTiled_Flag;
117 }
118
reed@android.com42309d42009-06-22 02:06:35 +0000119 SkString onShortName() {
120 return SkString("gradients");
121 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000122
edisonn@google.com1da3a802013-09-19 17:55:49 +0000123 virtual SkISize onISize() { return SkISize::Make(840, 815); }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000124
reed@android.com42309d42009-06-22 02:06:35 +0000125 virtual void onDraw(SkCanvas* canvas) {
rmistry@google.comd6176b02012-08-23 18:14:13 +0000126
reed@android.com42309d42009-06-22 02:06:35 +0000127 SkPoint pts[2] = {
128 { 0, 0 },
129 { SkIntToScalar(100), SkIntToScalar(100) }
130 };
131 SkShader::TileMode tm = SkShader::kClamp_TileMode;
132 SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) };
133 SkPaint paint;
134 paint.setAntiAlias(true);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000135
reed@android.com42309d42009-06-22 02:06:35 +0000136 canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
137 for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) {
138 canvas->save();
139 for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) {
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +0000140 SkMatrix scale = SkMatrix::I();
commit-bot@chromium.org8ba1ad32013-08-07 15:22:13 +0000141
142 if (i == 5) { // if the clamp case
commit-bot@chromium.org8ba1ad32013-08-07 15:22:13 +0000143 scale.setScale(0.5f, 0.5f);
144 scale.postTranslate(25.f, 25.f);
commit-bot@chromium.org8ba1ad32013-08-07 15:22:13 +0000145 }
skia.committer@gmail.comd55e3572013-08-08 07:01:20 +0000146
commit-bot@chromium.org3339ac52014-05-22 02:55:59 +0000147 SkShader* shader = gGradMakers[j](pts, gGradData[i], tm, NULL, scale);
commit-bot@chromium.org9c9005a2014-04-28 14:55:39 +0000148
reed@android.com42309d42009-06-22 02:06:35 +0000149 paint.setShader(shader);
150 canvas->drawRect(r, paint);
151 shader->unref();
152 canvas->translate(0, SkIntToScalar(120));
153 }
154 canvas->restore();
155 canvas->translate(SkIntToScalar(120), 0);
156 }
157 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000158
reed@android.com42309d42009-06-22 02:06:35 +0000159private:
160 typedef GM INHERITED;
161};
162
rileya@google.com5cf2c282012-07-09 14:42:16 +0000163// Based on the original gradient slide, but with perspective applied to the
164// gradient shaders' local matrices
165class GradientsLocalPerspectiveGM : public GM {
166public:
rmistry@google.comd6176b02012-08-23 18:14:13 +0000167 GradientsLocalPerspectiveGM() {
rileya@google.com5cf2c282012-07-09 14:42:16 +0000168 this->setBGColor(0xFFDDDDDD);
169 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000170
rileya@google.com5cf2c282012-07-09 14:42:16 +0000171protected:
commit-bot@chromium.orga90c6802014-04-30 13:20:45 +0000172 virtual uint32_t onGetFlags() const SK_OVERRIDE {
173 return kSkipTiled_Flag;
174 }
175
rileya@google.com5cf2c282012-07-09 14:42:16 +0000176 SkString onShortName() {
177 return SkString("gradients_local_perspective");
178 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000179
edisonn@google.com1da3a802013-09-19 17:55:49 +0000180 virtual SkISize onISize() { return SkISize::Make(840, 815); }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000181
rileya@google.com5cf2c282012-07-09 14:42:16 +0000182 virtual void onDraw(SkCanvas* canvas) {
rmistry@google.comd6176b02012-08-23 18:14:13 +0000183
rileya@google.com5cf2c282012-07-09 14:42:16 +0000184 SkPoint pts[2] = {
185 { 0, 0 },
186 { SkIntToScalar(100), SkIntToScalar(100) }
187 };
188 SkShader::TileMode tm = SkShader::kClamp_TileMode;
189 SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) };
190 SkPaint paint;
191 paint.setAntiAlias(true);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000192
rileya@google.com5cf2c282012-07-09 14:42:16 +0000193 canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
194 for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) {
195 canvas->save();
196 for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) {
rileya@google.com5cf2c282012-07-09 14:42:16 +0000197 // apply an increasing y perspective as we move to the right
198 SkMatrix perspective;
199 perspective.setIdentity();
borenet@google.comb7961192012-08-20 18:58:26 +0000200 perspective.setPerspY(SkScalarDiv(SkIntToScalar((unsigned) i+1),
rileya@google.com5cf2c282012-07-09 14:42:16 +0000201 SkIntToScalar(500)));
borenet@google.comb7961192012-08-20 18:58:26 +0000202 perspective.setSkewX(SkScalarDiv(SkIntToScalar((unsigned) i+1),
rileya@google.com5cf2c282012-07-09 14:42:16 +0000203 SkIntToScalar(10)));
commit-bot@chromium.org8ba1ad32013-08-07 15:22:13 +0000204
commit-bot@chromium.org3339ac52014-05-22 02:55:59 +0000205 SkShader* shader = gGradMakers[j](pts, gGradData[i], tm, NULL, perspective);
rileya@google.com5cf2c282012-07-09 14:42:16 +0000206
207 paint.setShader(shader);
208 canvas->drawRect(r, paint);
209 shader->unref();
210 canvas->translate(0, SkIntToScalar(120));
211 }
212 canvas->restore();
213 canvas->translate(SkIntToScalar(120), 0);
214 }
215 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000216
rileya@google.com5cf2c282012-07-09 14:42:16 +0000217private:
218 typedef GM INHERITED;
219};
220
221// Based on the original gradient slide, but with perspective applied to
222// the view matrix
223class GradientsViewPerspectiveGM : public GradientsGM {
224protected:
225 SkString onShortName() {
226 return SkString("gradients_view_perspective");
227 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000228
edisonn@google.com1da3a802013-09-19 17:55:49 +0000229 virtual SkISize onISize() { return SkISize::Make(840, 500); }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000230
rileya@google.com5cf2c282012-07-09 14:42:16 +0000231 virtual void onDraw(SkCanvas* canvas) {
232 SkMatrix perspective;
233 perspective.setIdentity();
234 perspective.setPerspY(SkScalarDiv(SK_Scalar1, SkIntToScalar(1000)));
235 perspective.setSkewX(SkScalarDiv(SkIntToScalar(8), SkIntToScalar(25)));
scroggo@google.com837d31a2012-08-15 18:42:45 +0000236 canvas->concat(perspective);
rileya@google.com5cf2c282012-07-09 14:42:16 +0000237 INHERITED::onDraw(canvas);
238 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000239
rileya@google.com5cf2c282012-07-09 14:42:16 +0000240private:
241 typedef GradientsGM INHERITED;
242};
243
reed@google.comac864a92011-06-27 18:11:17 +0000244/*
245 Inspired by this <canvas> javascript, where we need to detect that we are not
246 solving a quadratic equation, but must instead solve a linear (since our X^2
247 coefficient is 0)
248
249 ctx.fillStyle = '#f00';
250 ctx.fillRect(0, 0, 100, 50);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000251
reed@google.comac864a92011-06-27 18:11:17 +0000252 var g = ctx.createRadialGradient(-80, 25, 70, 0, 25, 150);
253 g.addColorStop(0, '#f00');
254 g.addColorStop(0.01, '#0f0');
255 g.addColorStop(0.99, '#0f0');
256 g.addColorStop(1, '#f00');
257 ctx.fillStyle = g;
258 ctx.fillRect(0, 0, 100, 50);
259 */
260class GradientsDegenrate2PointGM : public GM {
261public:
262 GradientsDegenrate2PointGM() {}
rmistry@google.comd6176b02012-08-23 18:14:13 +0000263
reed@google.comac864a92011-06-27 18:11:17 +0000264protected:
265 SkString onShortName() {
266 return SkString("gradients_degenerate_2pt");
267 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000268
edisonn@google.com1da3a802013-09-19 17:55:49 +0000269 virtual SkISize onISize() { return SkISize::Make(320, 320); }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000270
reed@google.comac864a92011-06-27 18:11:17 +0000271 void drawBG(SkCanvas* canvas) {
272 canvas->drawColor(SK_ColorBLUE);
273 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000274
reed@google.comac864a92011-06-27 18:11:17 +0000275 virtual void onDraw(SkCanvas* canvas) {
276 this->drawBG(canvas);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000277
reed@google.comac864a92011-06-27 18:11:17 +0000278 SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorGREEN, SK_ColorRED };
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +0000279 SkScalar pos[] = { 0, 0.01f, 0.99f, SK_Scalar1 };
epoger@google.com59f3abf2011-07-21 15:50:33 +0000280 SkPoint c0;
281 c0.iset(-80, 25);
282 SkScalar r0 = SkIntToScalar(70);
283 SkPoint c1;
284 c1.iset(0, 25);
285 SkScalar r1 = SkIntToScalar(150);
reed@google.comac864a92011-06-27 18:11:17 +0000286 SkShader* s = SkGradientShader::CreateTwoPointRadial(c0, r0, c1, r1, colors,
287 pos, SK_ARRAY_COUNT(pos),
288 SkShader::kClamp_TileMode);
289 SkPaint paint;
290 paint.setShader(s)->unref();
291 canvas->drawPaint(paint);
292 }
rmistry@google.comd6176b02012-08-23 18:14:13 +0000293
reed@google.comac864a92011-06-27 18:11:17 +0000294private:
295 typedef GM INHERITED;
296};
297
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000298/// Tests correctness of *optimized* codepaths in gradients.
299
300class ClampedGradientsGM : public GM {
301public:
302 ClampedGradientsGM() {}
303
304protected:
commit-bot@chromium.orga90c6802014-04-30 13:20:45 +0000305 virtual uint32_t onGetFlags() const SK_OVERRIDE {
306 return kSkipTiled_Flag;
307 }
308
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000309 SkString onShortName() { return SkString("clamped_gradients"); }
310
edisonn@google.com1da3a802013-09-19 17:55:49 +0000311 virtual SkISize onISize() { return SkISize::Make(640, 510); }
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000312
313 void drawBG(SkCanvas* canvas) {
314 canvas->drawColor(0xFFDDDDDD);
315 }
316
317 virtual void onDraw(SkCanvas* canvas) {
318 this->drawBG(canvas);
319
320 SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(300) };
321 SkPaint paint;
322 paint.setAntiAlias(true);
323
324 SkPoint center;
325 center.iset(0, 300);
326 canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
327 SkShader* shader = SkGradientShader::CreateRadial(
328 SkPoint(center),
bungeman@google.com01744a42011-10-06 19:37:39 +0000329 SkIntToScalar(200), gColors, NULL, 5,
commit-bot@chromium.org3339ac52014-05-22 02:55:59 +0000330 SkShader::kClamp_TileMode, NULL);
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000331 paint.setShader(shader);
332 canvas->drawRect(r, paint);
333 shader->unref();
334 }
335
336private:
337 typedef GM INHERITED;
338};
339
tomhudson@google.comb18e58c2012-01-30 20:00:13 +0000340/// Checks quality of large radial gradients, which may display
341/// some banding.
342
343class RadialGradientGM : public GM {
344public:
345 RadialGradientGM() {}
346
347protected:
commit-bot@chromium.orga90c6802014-04-30 13:20:45 +0000348 virtual uint32_t onGetFlags() const SK_OVERRIDE {
349 return kSkipTiled_Flag;
350 }
351
tomhudson@google.comb18e58c2012-01-30 20:00:13 +0000352 SkString onShortName() { return SkString("radial_gradient"); }
edisonn@google.com1da3a802013-09-19 17:55:49 +0000353 virtual SkISize onISize() { return SkISize::Make(1280, 1280); }
tomhudson@google.comb18e58c2012-01-30 20:00:13 +0000354 void drawBG(SkCanvas* canvas) {
355 canvas->drawColor(0xFF000000);
356 }
357 virtual void onDraw(SkCanvas* canvas) {
reed@google.combb0948f2012-01-31 14:44:13 +0000358 const SkISize dim = this->getISize();
359
tomhudson@google.comb18e58c2012-01-30 20:00:13 +0000360 this->drawBG(canvas);
rmistry@google.comd6176b02012-08-23 18:14:13 +0000361
tomhudson@google.comb18e58c2012-01-30 20:00:13 +0000362 SkPaint paint;
363 paint.setDither(true);
364 SkPoint center;
reed@google.combb0948f2012-01-31 14:44:13 +0000365 center.set(SkIntToScalar(dim.width())/2, SkIntToScalar(dim.height())/2);
366 SkScalar radius = SkIntToScalar(dim.width())/2;
367 const SkColor colors[] = { 0x7f7f7f7f, 0x7f7f7f7f, 0xb2000000 };
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +0000368 const SkScalar pos[] = { 0.0f,
369 0.35f,
370 1.0f };
tomhudson@google.comb18e58c2012-01-30 20:00:13 +0000371 SkShader* shader =
372 SkGradientShader::CreateRadial(center, radius, colors,
reed@google.combb0948f2012-01-31 14:44:13 +0000373 pos, SK_ARRAY_COUNT(pos),
374 SkShader::kClamp_TileMode);
tomhudson@google.comb18e58c2012-01-30 20:00:13 +0000375 paint.setShader(shader)->unref();
reed@google.combb0948f2012-01-31 14:44:13 +0000376 SkRect r = {
377 0, 0, SkIntToScalar(dim.width()), SkIntToScalar(dim.height())
378 };
tomhudson@google.comb18e58c2012-01-30 20:00:13 +0000379 canvas->drawRect(r, paint);
380 }
381private:
382 typedef GM INHERITED;
383};
384
385
mtklein@google.com361a72f2013-08-19 18:43:34 +0000386class RadialGradient2GM : public GM {
387public:
388 RadialGradient2GM() {}
389
390protected:
commit-bot@chromium.orga90c6802014-04-30 13:20:45 +0000391 virtual uint32_t onGetFlags() const SK_OVERRIDE {
392 return kSkipTiled_Flag;
393 }
394
mtklein@google.com361a72f2013-08-19 18:43:34 +0000395 SkString onShortName() { return SkString("radial_gradient2"); }
edisonn@google.com1da3a802013-09-19 17:55:49 +0000396 virtual SkISize onISize() { return SkISize::Make(800, 400); }
mtklein@google.com361a72f2013-08-19 18:43:34 +0000397 void drawBG(SkCanvas* canvas) {
398 canvas->drawColor(0xFF000000);
399 }
400
401 // Reproduces the example given in bug 7671058.
402 virtual void onDraw(SkCanvas* canvas) {
403 SkPaint paint1, paint2, paint3;
404 paint1.setStyle(SkPaint::kFill_Style);
405 paint2.setStyle(SkPaint::kFill_Style);
406 paint3.setStyle(SkPaint::kFill_Style);
407
408 const SkColor sweep_colors[] =
409 { 0xFFFF0000, 0xFFFFFF00, 0xFF00FF00, 0xFF00FFFF, 0xFF0000FF, 0xFFFF00FF, 0xFFFF0000 };
410 const SkColor colors1[] = { 0xFFFFFFFF, 0x00000000 };
411 const SkColor colors2[] = { 0xFF000000, 0x00000000 };
412
413 const SkScalar cx = 200, cy = 200, radius = 150;
414 SkPoint center;
415 center.set(cx, cy);
416
mtklein@google.com3ef7eea2013-09-16 13:02:52 +0000417 // We can either interpolate endpoints and premultiply each point (default, more precision),
418 // or premultiply the endpoints first, avoiding the need to premultiply each point (cheap).
419 const uint32_t flags[] = { 0, SkGradientShader::kInterpolateColorsInPremul_Flag };
mtklein@google.com361a72f2013-08-19 18:43:34 +0000420
mtklein@google.com3ef7eea2013-09-16 13:02:52 +0000421 for (size_t i = 0; i < SK_ARRAY_COUNT(flags); i++) {
422 SkAutoTUnref<SkShader> sweep(
423 SkGradientShader::CreateSweep(cx, cy, sweep_colors,
424 NULL, SK_ARRAY_COUNT(sweep_colors),
commit-bot@chromium.org3339ac52014-05-22 02:55:59 +0000425 NULL, flags[i]));
mtklein@google.com3ef7eea2013-09-16 13:02:52 +0000426 SkAutoTUnref<SkShader> radial1(
427 SkGradientShader::CreateRadial(center, radius, colors1,
428 NULL, SK_ARRAY_COUNT(colors1),
429 SkShader::kClamp_TileMode,
commit-bot@chromium.org3339ac52014-05-22 02:55:59 +0000430 NULL, flags[i]));
mtklein@google.com3ef7eea2013-09-16 13:02:52 +0000431 SkAutoTUnref<SkShader> radial2(
432 SkGradientShader::CreateRadial(center, radius, colors2,
433 NULL, SK_ARRAY_COUNT(colors2),
434 SkShader::kClamp_TileMode,
commit-bot@chromium.org3339ac52014-05-22 02:55:59 +0000435 NULL, flags[i]));
mtklein@google.com3ef7eea2013-09-16 13:02:52 +0000436 paint1.setShader(sweep);
437 paint2.setShader(radial1);
438 paint3.setShader(radial2);
439
440 canvas->drawCircle(cx, cy, radius, paint1);
441 canvas->drawCircle(cx, cy, radius, paint3);
442 canvas->drawCircle(cx, cy, radius, paint2);
443
444 canvas->translate(400, 0);
445 }
mtklein@google.com361a72f2013-08-19 18:43:34 +0000446 }
447
448private:
449 typedef GM INHERITED;
450};
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000451
reed@android.com42309d42009-06-22 02:06:35 +0000452///////////////////////////////////////////////////////////////////////////////
453
454static GM* MyFactory(void*) { return new GradientsGM; }
455static GMRegistry reg(MyFactory);
456
reed@google.comac864a92011-06-27 18:11:17 +0000457static GM* MyFactory2(void*) { return new GradientsDegenrate2PointGM; }
458static GMRegistry reg2(MyFactory2);
459
tomhudson@google.com5ea050f2011-09-26 15:03:55 +0000460static GM* MyFactory3(void*) { return new ClampedGradientsGM; }
461static GMRegistry reg3(MyFactory3);
462
tomhudson@google.comb18e58c2012-01-30 20:00:13 +0000463static GM* MyFactory4(void*) { return new RadialGradientGM; }
464static GMRegistry reg4(MyFactory4);
rileya@google.com5cf2c282012-07-09 14:42:16 +0000465
466static GM* MyFactory5(void*) { return new GradientsLocalPerspectiveGM; }
467static GMRegistry reg5(MyFactory5);
468
469static GM* MyFactory6(void*) { return new GradientsViewPerspectiveGM; }
470static GMRegistry reg6(MyFactory6);
mtklein@google.com361a72f2013-08-19 18:43:34 +0000471
472static GM* MyFactory7(void*) { return new RadialGradient2GM; }
473static GMRegistry reg7(MyFactory7);
reed@android.com42309d42009-06-22 02:06:35 +0000474}