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

Side by Side Diff: gm/gradients.cpp

Issue 1400813006: Remove SK_SUPPORT_LEGACY_GRADIENT_DITHERING from Skia proper (Closed) Base URL: https://chromium.googlesource.com/skia.git@master
Patch Set: 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
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "gm.h" 8 #include "gm.h"
9 #include "SkGradientShader.h" 9 #include "SkGradientShader.h"
10 10
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 typedef SkShader* (*GradMaker)(const SkPoint pts[2], const GradData& data, 93 typedef SkShader* (*GradMaker)(const SkPoint pts[2], const GradData& data,
94 SkShader::TileMode tm, const SkMatrix& localMatri x); 94 SkShader::TileMode tm, const SkMatrix& localMatri x);
95 static const GradMaker gGradMakers[] = { 95 static const GradMaker gGradMakers[] = {
96 MakeLinear, MakeRadial, MakeSweep, Make2Radial, Make2Conical 96 MakeLinear, MakeRadial, MakeSweep, Make2Radial, Make2Conical
97 }; 97 };
98 98
99 /////////////////////////////////////////////////////////////////////////////// 99 ///////////////////////////////////////////////////////////////////////////////
100 100
101 class GradientsGM : public GM { 101 class GradientsGM : public GM {
102 public: 102 public:
103 GradientsGM() { 103 GradientsGM(bool dither) : fDither(dither) {
104 this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD)); 104 this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD));
105 } 105 }
106 106
107 protected: 107 protected:
108 108
109 SkString onShortName() { 109 SkString onShortName() {
110 return SkString("gradients"); 110 return SkString(fDither ? "gradients" : "gradients_nodither");
111 } 111 }
112 112
113 virtual SkISize onISize() { return SkISize::Make(840, 815); } 113 virtual SkISize onISize() { return SkISize::Make(840, 815); }
114 114
115 virtual void onDraw(SkCanvas* canvas) { 115 virtual void onDraw(SkCanvas* canvas) {
116 116
117 SkPoint pts[2] = { 117 SkPoint pts[2] = {
118 { 0, 0 }, 118 { 0, 0 },
119 { SkIntToScalar(100), SkIntToScalar(100) } 119 { SkIntToScalar(100), SkIntToScalar(100) }
120 }; 120 };
121 SkShader::TileMode tm = SkShader::kClamp_TileMode; 121 SkShader::TileMode tm = SkShader::kClamp_TileMode;
122 SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) }; 122 SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) };
123 SkPaint paint; 123 SkPaint paint;
124 paint.setAntiAlias(true); 124 paint.setAntiAlias(true);
125 paint.setDither(fDither);
125 126
126 canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); 127 canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
127 for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) { 128 for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) {
128 canvas->save(); 129 canvas->save();
129 for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) { 130 for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) {
130 SkMatrix scale = SkMatrix::I(); 131 SkMatrix scale = SkMatrix::I();
131 132
132 if (i == 5) { // if the clamp case 133 if (i == 5) { // if the clamp case
133 scale.setScale(0.5f, 0.5f); 134 scale.setScale(0.5f, 0.5f);
134 scale.postTranslate(25.f, 25.f); 135 scale.postTranslate(25.f, 25.f);
135 } 136 }
136 137
137 SkShader* shader = gGradMakers[j](pts, gGradData[i], tm, scale); 138 SkShader* shader = gGradMakers[j](pts, gGradData[i], tm, scale);
138 139
139 paint.setShader(shader); 140 paint.setShader(shader);
140 canvas->drawRect(r, paint); 141 canvas->drawRect(r, paint);
141 shader->unref(); 142 shader->unref();
142 canvas->translate(0, SkIntToScalar(120)); 143 canvas->translate(0, SkIntToScalar(120));
143 } 144 }
144 canvas->restore(); 145 canvas->restore();
145 canvas->translate(SkIntToScalar(120), 0); 146 canvas->translate(SkIntToScalar(120), 0);
146 } 147 }
147 } 148 }
148 149
150 protected:
151 bool fDither;
152
149 private: 153 private:
150 typedef GM INHERITED; 154 typedef GM INHERITED;
151 }; 155 };
152 DEF_GM( return new GradientsGM; ) 156 DEF_GM( return new GradientsGM(true); )
157 DEF_GM( return new GradientsGM(false); )
153 158
154 // Based on the original gradient slide, but with perspective applied to the 159 // Based on the original gradient slide, but with perspective applied to the
155 // gradient shaders' local matrices 160 // gradient shaders' local matrices
156 class GradientsLocalPerspectiveGM : public GM { 161 class GradientsLocalPerspectiveGM : public GM {
157 public: 162 public:
158 GradientsLocalPerspectiveGM() { 163 GradientsLocalPerspectiveGM(bool dither) : fDither(dither) {
159 this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD)); 164 this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD));
160 } 165 }
161 166
162 protected: 167 protected:
163 168
164 SkString onShortName() { 169 SkString onShortName() {
165 return SkString("gradients_local_perspective"); 170 return SkString(fDither ? "gradients_local_perspective" :
171 "gradients_local_perspective_nodither");
166 } 172 }
167 173
168 virtual SkISize onISize() { return SkISize::Make(840, 815); } 174 virtual SkISize onISize() { return SkISize::Make(840, 815); }
169 175
170 virtual void onDraw(SkCanvas* canvas) { 176 virtual void onDraw(SkCanvas* canvas) {
171 177
172 SkPoint pts[2] = { 178 SkPoint pts[2] = {
173 { 0, 0 }, 179 { 0, 0 },
174 { SkIntToScalar(100), SkIntToScalar(100) } 180 { SkIntToScalar(100), SkIntToScalar(100) }
175 }; 181 };
176 SkShader::TileMode tm = SkShader::kClamp_TileMode; 182 SkShader::TileMode tm = SkShader::kClamp_TileMode;
177 SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) }; 183 SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) };
178 SkPaint paint; 184 SkPaint paint;
179 paint.setAntiAlias(true); 185 paint.setAntiAlias(true);
186 paint.setDither(fDither);
180 187
181 canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); 188 canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
182 for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) { 189 for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) {
183 canvas->save(); 190 canvas->save();
184 for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) { 191 for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) {
185 // apply an increasing y perspective as we move to the right 192 // apply an increasing y perspective as we move to the right
186 SkMatrix perspective; 193 SkMatrix perspective;
187 perspective.setIdentity(); 194 perspective.setIdentity();
188 perspective.setPerspY(SkIntToScalar(i+1) / 500); 195 perspective.setPerspY(SkIntToScalar(i+1) / 500);
189 perspective.setSkewX(SkIntToScalar(i+1) / 10); 196 perspective.setSkewX(SkIntToScalar(i+1) / 10);
190 197
191 SkShader* shader = gGradMakers[j](pts, gGradData[i], tm, perspec tive); 198 SkShader* shader = gGradMakers[j](pts, gGradData[i], tm, perspec tive);
192 199
193 paint.setShader(shader); 200 paint.setShader(shader);
194 canvas->drawRect(r, paint); 201 canvas->drawRect(r, paint);
195 shader->unref(); 202 shader->unref();
196 canvas->translate(0, SkIntToScalar(120)); 203 canvas->translate(0, SkIntToScalar(120));
197 } 204 }
198 canvas->restore(); 205 canvas->restore();
199 canvas->translate(SkIntToScalar(120), 0); 206 canvas->translate(SkIntToScalar(120), 0);
200 } 207 }
201 } 208 }
202 209
203 private: 210 private:
211 bool fDither;
212
204 typedef GM INHERITED; 213 typedef GM INHERITED;
205 }; 214 };
206 DEF_GM( return new GradientsLocalPerspectiveGM; ) 215 DEF_GM( return new GradientsLocalPerspectiveGM(true); )
216 DEF_GM( return new GradientsLocalPerspectiveGM(false); )
207 217
208 // Based on the original gradient slide, but with perspective applied to 218 // Based on the original gradient slide, but with perspective applied to
209 // the view matrix 219 // the view matrix
210 class GradientsViewPerspectiveGM : public GradientsGM { 220 class GradientsViewPerspectiveGM : public GradientsGM {
221 public:
222 GradientsViewPerspectiveGM(bool dither) : INHERITED(dither) { }
223
211 protected: 224 protected:
212 SkString onShortName() { 225 SkString onShortName() {
213 return SkString("gradients_view_perspective"); 226 return SkString(fDither ? "gradients_view_perspective" :
227 "gradients_view_perspective_nodither");
214 } 228 }
215 229
216 virtual SkISize onISize() { return SkISize::Make(840, 500); } 230 virtual SkISize onISize() { return SkISize::Make(840, 500); }
217 231
218 virtual void onDraw(SkCanvas* canvas) { 232 virtual void onDraw(SkCanvas* canvas) {
219 SkMatrix perspective; 233 SkMatrix perspective;
220 perspective.setIdentity(); 234 perspective.setIdentity();
221 perspective.setPerspY(0.001f); 235 perspective.setPerspY(0.001f);
222 perspective.setSkewX(SkIntToScalar(8) / 25); 236 perspective.setSkewX(SkIntToScalar(8) / 25);
223 canvas->concat(perspective); 237 canvas->concat(perspective);
224 INHERITED::onDraw(canvas); 238 INHERITED::onDraw(canvas);
225 } 239 }
226 240
227 private: 241 private:
228 typedef GradientsGM INHERITED; 242 typedef GradientsGM INHERITED;
229 }; 243 };
230 DEF_GM( return new GradientsViewPerspectiveGM; ) 244 DEF_GM( return new GradientsViewPerspectiveGM(true); )
245 DEF_GM( return new GradientsViewPerspectiveGM(false); )
231 246
232 /* 247 /*
233 Inspired by this <canvas> javascript, where we need to detect that we are not 248 Inspired by this <canvas> javascript, where we need to detect that we are not
234 solving a quadratic equation, but must instead solve a linear (since our X^2 249 solving a quadratic equation, but must instead solve a linear (since our X^2
235 coefficient is 0) 250 coefficient is 0)
236 251
237 ctx.fillStyle = '#f00'; 252 ctx.fillStyle = '#f00';
238 ctx.fillRect(0, 0, 100, 50); 253 ctx.fillRect(0, 0, 100, 50);
239 254
240 var g = ctx.createRadialGradient(-80, 25, 70, 0, 25, 150); 255 var g = ctx.createRadialGradient(-80, 25, 70, 0, 25, 150);
241 g.addColorStop(0, '#f00'); 256 g.addColorStop(0, '#f00');
242 g.addColorStop(0.01, '#0f0'); 257 g.addColorStop(0.01, '#0f0');
243 g.addColorStop(0.99, '#0f0'); 258 g.addColorStop(0.99, '#0f0');
244 g.addColorStop(1, '#f00'); 259 g.addColorStop(1, '#f00');
245 ctx.fillStyle = g; 260 ctx.fillStyle = g;
246 ctx.fillRect(0, 0, 100, 50); 261 ctx.fillRect(0, 0, 100, 50);
247 */ 262 */
248 class GradientsDegenrate2PointGM : public GM { 263 class GradientsDegenrate2PointGM : public GM {
249 public: 264 public:
250 GradientsDegenrate2PointGM() {} 265 GradientsDegenrate2PointGM(bool dither) : fDither(dither) {}
251 266
252 protected: 267 protected:
253 SkString onShortName() { 268 SkString onShortName() {
254 return SkString("gradients_degenerate_2pt"); 269 return SkString(fDither ? "gradients_degenerate_2pt" : "gradients_degene rate_2pt_nodither");
255 } 270 }
256 271
257 virtual SkISize onISize() { return SkISize::Make(320, 320); } 272 virtual SkISize onISize() { return SkISize::Make(320, 320); }
258 273
259 void drawBG(SkCanvas* canvas) { 274 void drawBG(SkCanvas* canvas) {
260 canvas->drawColor(SK_ColorBLUE); 275 canvas->drawColor(SK_ColorBLUE);
261 } 276 }
262 277
263 virtual void onDraw(SkCanvas* canvas) { 278 virtual void onDraw(SkCanvas* canvas) {
264 this->drawBG(canvas); 279 this->drawBG(canvas);
265 280
266 SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorGREEN, SK_Color RED }; 281 SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorGREEN, SK_Color RED };
267 SkScalar pos[] = { 0, 0.01f, 0.99f, SK_Scalar1 }; 282 SkScalar pos[] = { 0, 0.01f, 0.99f, SK_Scalar1 };
268 SkPoint c0; 283 SkPoint c0;
269 c0.iset(-80, 25); 284 c0.iset(-80, 25);
270 SkScalar r0 = SkIntToScalar(70); 285 SkScalar r0 = SkIntToScalar(70);
271 SkPoint c1; 286 SkPoint c1;
272 c1.iset(0, 25); 287 c1.iset(0, 25);
273 SkScalar r1 = SkIntToScalar(150); 288 SkScalar r1 = SkIntToScalar(150);
274 SkShader* s = SkGradientShader::CreateTwoPointConical(c0, r0, c1, r1, co lors, 289 SkShader* s = SkGradientShader::CreateTwoPointConical(c0, r0, c1, r1, co lors,
275 pos, SK_ARRAY_COUN T(pos), 290 pos, SK_ARRAY_COUN T(pos),
276 SkShader::kClamp_T ileMode); 291 SkShader::kClamp_T ileMode);
277 SkPaint paint; 292 SkPaint paint;
293 paint.setDither(fDither);
278 paint.setShader(s)->unref(); 294 paint.setShader(s)->unref();
279 canvas->drawPaint(paint); 295 canvas->drawPaint(paint);
280 } 296 }
281 297
282 private: 298 private:
299 bool fDither;
300
283 typedef GM INHERITED; 301 typedef GM INHERITED;
284 }; 302 };
285 DEF_GM( return new GradientsDegenrate2PointGM; ) 303 DEF_GM( return new GradientsDegenrate2PointGM(true); )
304 DEF_GM( return new GradientsDegenrate2PointGM(false); )
286 305
287 /// Tests correctness of *optimized* codepaths in gradients. 306 /// Tests correctness of *optimized* codepaths in gradients.
288 307
289 class ClampedGradientsGM : public GM { 308 class ClampedGradientsGM : public GM {
290 public: 309 public:
291 ClampedGradientsGM() {} 310 ClampedGradientsGM(bool dither) : fDither(dither) {}
292 311
293 protected: 312 protected:
294 SkString onShortName() { return SkString("clamped_gradients"); } 313 SkString onShortName() {
314 return SkString(fDither ? "clamped_gradients" : "clamped_gradients_nodit her");
315 }
295 316
296 virtual SkISize onISize() { return SkISize::Make(640, 510); } 317 virtual SkISize onISize() { return SkISize::Make(640, 510); }
297 318
298 void drawBG(SkCanvas* canvas) { 319 void drawBG(SkCanvas* canvas) {
299 canvas->drawColor(sk_tool_utils::color_to_565(0xFFDDDDDD)); 320 canvas->drawColor(sk_tool_utils::color_to_565(0xFFDDDDDD));
300 } 321 }
301 322
302 virtual void onDraw(SkCanvas* canvas) { 323 virtual void onDraw(SkCanvas* canvas) {
303 this->drawBG(canvas); 324 this->drawBG(canvas);
304 325
305 SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(300) }; 326 SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(300) };
306 SkPaint paint; 327 SkPaint paint;
328 paint.setDither(fDither);
307 paint.setAntiAlias(true); 329 paint.setAntiAlias(true);
308 330
309 SkPoint center; 331 SkPoint center;
310 center.iset(0, 300); 332 center.iset(0, 300);
311 canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); 333 canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
312 SkShader* shader = SkGradientShader::CreateRadial( 334 SkShader* shader = SkGradientShader::CreateRadial(
313 SkPoint(center), 335 SkPoint(center),
314 SkIntToScalar(200), gColors, nullptr, 5, 336 SkIntToScalar(200), gColors, nullptr, 5,
315 SkShader::kClamp_TileMode); 337 SkShader::kClamp_TileMode);
316 paint.setShader(shader); 338 paint.setShader(shader);
317 canvas->drawRect(r, paint); 339 canvas->drawRect(r, paint);
318 shader->unref(); 340 shader->unref();
319 } 341 }
320 342
321 private: 343 private:
344 bool fDither;
345
322 typedef GM INHERITED; 346 typedef GM INHERITED;
323 }; 347 };
324 DEF_GM( return new ClampedGradientsGM; ) 348 DEF_GM( return new ClampedGradientsGM(true); )
349 DEF_GM( return new ClampedGradientsGM(false); )
325 350
326 /// Checks quality of large radial gradients, which may display 351 /// Checks quality of large radial gradients, which may display
327 /// some banding. 352 /// some banding.
328 353
329 class RadialGradientGM : public GM { 354 class RadialGradientGM : public GM {
330 public: 355 public:
331 RadialGradientGM() {} 356 RadialGradientGM() {}
332 357
333 protected: 358 protected:
334 359
(...skipping 26 matching lines...) Expand all
361 }; 386 };
362 canvas->drawRect(r, paint); 387 canvas->drawRect(r, paint);
363 } 388 }
364 private: 389 private:
365 typedef GM INHERITED; 390 typedef GM INHERITED;
366 }; 391 };
367 DEF_GM( return new RadialGradientGM; ) 392 DEF_GM( return new RadialGradientGM; )
368 393
369 class RadialGradient2GM : public GM { 394 class RadialGradient2GM : public GM {
370 public: 395 public:
371 RadialGradient2GM() {} 396 RadialGradient2GM(bool dither) : fDither(dither) {}
372 397
373 protected: 398 protected:
374 399
375 SkString onShortName() override { return SkString("radial_gradient2"); } 400 SkString onShortName() override {
401 return SkString(fDither ? "radial_gradient2" : "radial_gradient2_nodithe r");
402 }
403
376 SkISize onISize() override { return SkISize::Make(800, 400); } 404 SkISize onISize() override { return SkISize::Make(800, 400); }
377 void drawBG(SkCanvas* canvas) { 405 void drawBG(SkCanvas* canvas) {
378 canvas->drawColor(0xFF000000); 406 canvas->drawColor(0xFF000000);
379 } 407 }
380 408
381 // Reproduces the example given in bug 7671058. 409 // Reproduces the example given in bug 7671058.
382 void onDraw(SkCanvas* canvas) override { 410 void onDraw(SkCanvas* canvas) override {
383 SkPaint paint1, paint2, paint3; 411 SkPaint paint1, paint2, paint3;
384 paint1.setStyle(SkPaint::kFill_Style); 412 paint1.setStyle(SkPaint::kFill_Style);
385 paint2.setStyle(SkPaint::kFill_Style); 413 paint2.setStyle(SkPaint::kFill_Style);
(...skipping 21 matching lines...) Expand all
407 SkGradientShader::CreateRadial(center, radius, colors1, 435 SkGradientShader::CreateRadial(center, radius, colors1,
408 nullptr, SK_ARRAY_COUNT(color s1), 436 nullptr, SK_ARRAY_COUNT(color s1),
409 SkShader::kClamp_TileMode, 437 SkShader::kClamp_TileMode,
410 flags[i], nullptr)); 438 flags[i], nullptr));
411 SkAutoTUnref<SkShader> radial2( 439 SkAutoTUnref<SkShader> radial2(
412 SkGradientShader::CreateRadial(center, radius, colors2, 440 SkGradientShader::CreateRadial(center, radius, colors2,
413 nullptr, SK_ARRAY_COUNT(color s2), 441 nullptr, SK_ARRAY_COUNT(color s2),
414 SkShader::kClamp_TileMode, 442 SkShader::kClamp_TileMode,
415 flags[i], nullptr)); 443 flags[i], nullptr));
416 paint1.setShader(sweep); 444 paint1.setShader(sweep);
445 paint1.setDither(fDither);
417 paint2.setShader(radial1); 446 paint2.setShader(radial1);
447 paint2.setDither(fDither);
418 paint3.setShader(radial2); 448 paint3.setShader(radial2);
449 paint3.setDither(fDither);
419 450
420 canvas->drawCircle(cx, cy, radius, paint1); 451 canvas->drawCircle(cx, cy, radius, paint1);
421 canvas->drawCircle(cx, cy, radius, paint3); 452 canvas->drawCircle(cx, cy, radius, paint3);
422 canvas->drawCircle(cx, cy, radius, paint2); 453 canvas->drawCircle(cx, cy, radius, paint2);
423 454
424 canvas->translate(400, 0); 455 canvas->translate(400, 0);
425 } 456 }
426 } 457 }
427 458
428 private: 459 private:
460 bool fDither;
461
429 typedef GM INHERITED; 462 typedef GM INHERITED;
430 }; 463 };
431 DEF_GM( return new RadialGradient2GM; ) 464 DEF_GM( return new RadialGradient2GM(true); )
465 DEF_GM( return new RadialGradient2GM(false); )
432 466
433 // Shallow radial (shows banding on raster) 467 // Shallow radial (shows banding on raster)
434 class RadialGradient3GM : public GM { 468 class RadialGradient3GM : public GM {
435 SkAutoTUnref<SkShader> fShader; 469 public:
470 RadialGradient3GM(bool dither) : fDither(dither) { }
436 471
437 protected: 472 protected:
438 SkString onShortName() override { return SkString("radial_gradient3"); } 473 SkString onShortName() override {
474 return SkString(fDither ? "radial_gradient3" : "radial_gradient3_nodithe r");
475 }
439 476
440 SkISize onISize() override { return SkISize::Make(500, 500); } 477 SkISize onISize() override { return SkISize::Make(500, 500); }
441 478
442 bool runAsBench() const override { return true; } 479 bool runAsBench() const override { return true; }
443 480
444 void onOnceBeforeDraw() override { 481 void onOnceBeforeDraw() override {
445 const SkPoint center = { 0, 0 }; 482 const SkPoint center = { 0, 0 };
446 const SkScalar kRadius = 3000; 483 const SkScalar kRadius = 3000;
447 const SkColor gColors[] = { 0xFFFFFFFF, 0xFF000000 }; 484 const SkColor gColors[] = { 0xFFFFFFFF, 0xFF000000 };
448 fShader.reset(SkGradientShader::CreateRadial(center, kRadius, gColors, n ullptr, 2, 485 fShader.reset(SkGradientShader::CreateRadial(center, kRadius, gColors, n ullptr, 2,
449 SkShader::kClamp_TileMode)) ; 486 SkShader::kClamp_TileMode)) ;
450 } 487 }
451 488
452 void onDraw(SkCanvas* canvas) override { 489 void onDraw(SkCanvas* canvas) override {
453 SkPaint paint; 490 SkPaint paint;
454 paint.setShader(fShader); 491 paint.setShader(fShader);
492 paint.setDither(fDither);
455 canvas->drawRect(SkRect::MakeWH(500, 500), paint); 493 canvas->drawRect(SkRect::MakeWH(500, 500), paint);
456 } 494 }
457 495
458 private: 496 private:
497 SkAutoTUnref<SkShader> fShader;
498 bool fDither;
499
459 typedef GM INHERITED; 500 typedef GM INHERITED;
460 }; 501 };
461 DEF_GM( return new RadialGradient3GM; ) 502 DEF_GM( return new RadialGradient3GM(true); )
503 DEF_GM( return new RadialGradient3GM(false); )
462 504
463 class RadialGradient4GM : public GM { 505 class RadialGradient4GM : public GM {
464 SkAutoTUnref<SkShader> fShader; 506 public:
507 RadialGradient4GM(bool dither) : fDither(dither) { }
465 508
466 protected: 509 protected:
467 SkString onShortName() override { return SkString("radial_gradient4"); } 510 SkString onShortName() override {
511 return SkString(fDither ? "radial_gradient4" : "radial_gradient4_nodithe r");
512 }
468 513
469 SkISize onISize() override { return SkISize::Make(500, 500); } 514 SkISize onISize() override { return SkISize::Make(500, 500); }
470 515
471 void onOnceBeforeDraw() override { 516 void onOnceBeforeDraw() override {
472 const SkPoint center = { 250, 250 }; 517 const SkPoint center = { 250, 250 };
473 const SkScalar kRadius = 250; 518 const SkScalar kRadius = 250;
474 const SkColor colors[] = { SK_ColorRED, SK_ColorRED, SK_ColorWHITE, SK_C olorWHITE, 519 const SkColor colors[] = { SK_ColorRED, SK_ColorRED, SK_ColorWHITE, SK_C olorWHITE,
475 SK_ColorRED }; 520 SK_ColorRED };
476 const SkScalar pos[] = { 0, .4f, .4f, .8f, .8f, 1 }; 521 const SkScalar pos[] = { 0, .4f, .4f, .8f, .8f, 1 };
477 fShader.reset(SkGradientShader::CreateRadial(center, kRadius, colors, po s, 522 fShader.reset(SkGradientShader::CreateRadial(center, kRadius, colors, po s,
478 SK_ARRAY_COUNT(gColors), SkShader::kClamp_TileMode)); 523 SK_ARRAY_COUNT(gColors), SkShader::kClamp_TileMode));
479 } 524 }
480 525
481 void onDraw(SkCanvas* canvas) override { 526 void onDraw(SkCanvas* canvas) override {
482 SkPaint paint; 527 SkPaint paint;
483 paint.setAntiAlias(true); 528 paint.setAntiAlias(true);
529 paint.setDither(fDither);
484 paint.setShader(fShader); 530 paint.setShader(fShader);
485 canvas->drawRect(SkRect::MakeWH(500, 500), paint); 531 canvas->drawRect(SkRect::MakeWH(500, 500), paint);
486 } 532 }
487 533
488 private: 534 private:
535 SkAutoTUnref<SkShader> fShader;
536 bool fDither;
537
489 typedef GM INHERITED; 538 typedef GM INHERITED;
490 }; 539 };
491 DEF_GM( return new RadialGradient4GM; ) 540 DEF_GM( return new RadialGradient4GM(true); )
541 DEF_GM( return new RadialGradient4GM(false); )
492 542
493 class LinearGradientGM : public GM { 543 class LinearGradientGM : public GM {
494 SkAutoTUnref<SkShader> fShader[100]; 544 public:
545 LinearGradientGM(bool dither) : fDither(dither) { }
495 546
496 protected: 547 protected:
497 SkString onShortName() override { return SkString("linear_gradient"); } 548 SkString onShortName() override {
549 return SkString(fDither ? "linear_gradient" : "linear_gradient_nodither" );
550 }
551
498 const SkScalar kWidthBump = 30.f; 552 const SkScalar kWidthBump = 30.f;
499 const SkScalar kHeight = 5.f; 553 const SkScalar kHeight = 5.f;
500 const SkScalar kMinWidth = 540.f; 554 const SkScalar kMinWidth = 540.f;
501 555
502 SkISize onISize() override { return SkISize::Make(500, 500); } 556 SkISize onISize() override { return SkISize::Make(500, 500); }
503 557
504 void onOnceBeforeDraw() override { 558 void onOnceBeforeDraw() override {
505 SkPoint pts[2] = { {0, 0}, {0, 0} }; 559 SkPoint pts[2] = { {0, 0}, {0, 0} };
506 const SkColor colors[] = { SK_ColorWHITE, SK_ColorWHITE, 0xFF008200, 0xF F008200, 560 const SkColor colors[] = { SK_ColorWHITE, SK_ColorWHITE, 0xFF008200, 0xF F008200,
507 SK_ColorWHITE, SK_ColorWHITE }; 561 SK_ColorWHITE, SK_ColorWHITE };
508 const SkScalar unitPos[] = { 0, 50, 70, 500, 540 }; 562 const SkScalar unitPos[] = { 0, 50, 70, 500, 540 };
509 SkScalar pos[6]; 563 SkScalar pos[6];
510 pos[5] = 1; 564 pos[5] = 1;
511 for (int index = 0; index < (int) SK_ARRAY_COUNT(fShader); ++index) { 565 for (int index = 0; index < (int) SK_ARRAY_COUNT(fShader); ++index) {
512 pts[1].fX = 500.f + index * kWidthBump; 566 pts[1].fX = 500.f + index * kWidthBump;
513 for (int inner = 0; inner < (int) SK_ARRAY_COUNT(unitPos); ++inner) { 567 for (int inner = 0; inner < (int) SK_ARRAY_COUNT(unitPos); ++inner) {
514 pos[inner] = unitPos[inner] / (kMinWidth + index * kWidthBump); 568 pos[inner] = unitPos[inner] / (kMinWidth + index * kWidthBump);
515 } 569 }
516 fShader[index].reset(SkGradientShader::CreateLinear(pts, colors, pos , 570 fShader[index].reset(SkGradientShader::CreateLinear(pts, colors, pos ,
517 SK_ARRAY_COUNT(gColors), SkShader::kClamp_TileMode)); 571 SK_ARRAY_COUNT(gColors), SkShader::kClamp_TileMode));
518 } 572 }
519 } 573 }
520 574
521 void onDraw(SkCanvas* canvas) override { 575 void onDraw(SkCanvas* canvas) override {
522 SkPaint paint; 576 SkPaint paint;
523 paint.setAntiAlias(true); 577 paint.setAntiAlias(true);
578 paint.setDither(fDither);
524 for (int index = 0; index < (int) SK_ARRAY_COUNT(fShader); ++index) { 579 for (int index = 0; index < (int) SK_ARRAY_COUNT(fShader); ++index) {
525 paint.setShader(fShader[index]); 580 paint.setShader(fShader[index]);
526 canvas->drawRect(SkRect::MakeLTRB(0, index * kHeight, kMinWidth + in dex * kWidthBump, 581 canvas->drawRect(SkRect::MakeLTRB(0, index * kHeight, kMinWidth + in dex * kWidthBump,
527 (index + 1) * kHeight), paint); 582 (index + 1) * kHeight), paint);
528 } 583 }
529 } 584 }
530 585
531 private: 586 private:
587 SkAutoTUnref<SkShader> fShader[100];
588 bool fDither;
589
532 typedef GM INHERITED; 590 typedef GM INHERITED;
533 }; 591 };
534 DEF_GM( return new LinearGradientGM; ) 592 DEF_GM( return new LinearGradientGM(true); )
593 DEF_GM( return new LinearGradientGM(false); )
535 594
536 } 595 }
OLDNEW
« no previous file with comments | « no previous file | gm/gradients_2pt_conical.cpp » ('j') | gyp/skia_for_android_framework_defines.gypi » ('J')

Powered by Google App Engine
This is Rietveld 408576698