diff --git a/gm/gradients.cpp b/gm/gradients.cpp index 9438c33bdc..3cba41cc9d 100644 --- a/gm/gradients.cpp +++ b/gm/gradients.cpp @@ -367,7 +367,7 @@ public: protected: SkString onShortName() { return SkString("radial_gradient2"); } - virtual SkISize onISize() { return make_isize(400, 400); } + virtual SkISize onISize() { return make_isize(800, 400); } void drawBG(SkCanvas* canvas) { canvas->drawColor(0xFF000000); } @@ -388,24 +388,35 @@ protected: SkPoint center; center.set(cx, cy); - SkAutoTUnref sweep( - SkGradientShader::CreateSweep(cx, cy, sweep_colors, - NULL, SK_ARRAY_COUNT(sweep_colors))); - SkAutoTUnref radial1( - SkGradientShader::CreateRadial(center, radius, colors1, - NULL, SK_ARRAY_COUNT(colors1), - SkShader::kClamp_TileMode)); - SkAutoTUnref radial2( - SkGradientShader::CreateRadial(center, radius, colors2, - NULL, SK_ARRAY_COUNT(colors2), - SkShader::kClamp_TileMode)); - paint1.setShader(sweep); - paint2.setShader(radial1); - paint3.setShader(radial2); + // We can either interpolate endpoints and premultiply each point (default, more precision), + // or premultiply the endpoints first, avoiding the need to premultiply each point (cheap). + const uint32_t flags[] = { 0, SkGradientShader::kInterpolateColorsInPremul_Flag }; - canvas->drawCircle(cx, cy, radius, paint1); - canvas->drawCircle(cx, cy, radius, paint3); - canvas->drawCircle(cx, cy, radius, paint2); + for (size_t i = 0; i < SK_ARRAY_COUNT(flags); i++) { + SkAutoTUnref sweep( + SkGradientShader::CreateSweep(cx, cy, sweep_colors, + NULL, SK_ARRAY_COUNT(sweep_colors), + NULL, flags[i])); + SkAutoTUnref radial1( + SkGradientShader::CreateRadial(center, radius, colors1, + NULL, SK_ARRAY_COUNT(colors1), + SkShader::kClamp_TileMode, + NULL, flags[i])); + SkAutoTUnref radial2( + SkGradientShader::CreateRadial(center, radius, colors2, + NULL, SK_ARRAY_COUNT(colors2), + SkShader::kClamp_TileMode, + NULL, flags[i])); + paint1.setShader(sweep); + paint2.setShader(radial1); + paint3.setShader(radial2); + + canvas->drawCircle(cx, cy, radius, paint1); + canvas->drawCircle(cx, cy, radius, paint3); + canvas->drawCircle(cx, cy, radius, paint2); + + canvas->translate(400, 0); + } } private: