| 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 |