OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |