diff options
author | fmalita <fmalita@chromium.org> | 2015-11-19 10:35:34 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-11-19 10:35:34 -0800 |
commit | 8d381022e72f49c2ad02c6fc3fbbb6f03c95bdf2 (patch) | |
tree | 1d14d6741d9ab09e34e23a6d493d8e70ef50a11e | |
parent | f38b0d86b888692f7d703916114781be43249600 (diff) |
Fix nearly-vertical gradient assert
Use a SkScalarNearlyZero(dx) test instead of !SkScalarIsFinite(invDx).
R=reed@google.com
Review URL: https://codereview.chromium.org/1456783005
-rw-r--r-- | src/effects/gradients/SkLinearGradient.cpp | 2 | ||||
-rw-r--r-- | tests/GradientTest.cpp | 17 |
2 files changed, 18 insertions, 1 deletions
diff --git a/src/effects/gradients/SkLinearGradient.cpp b/src/effects/gradients/SkLinearGradient.cpp index 0bb896959e..013c1f1dde 100644 --- a/src/effects/gradients/SkLinearGradient.cpp +++ b/src/effects/gradients/SkLinearGradient.cpp @@ -893,7 +893,7 @@ void SkLinearGradient::LinearGradientContext::shade4_clamp(int x, int y, SkPMCol const float dither[2] = { dither0, dither1 }; const float invDx = 1 / dx; - if (!SkScalarIsFinite(invDx)) { // dx is effectively zero, gradient is vertical + if (SkScalarNearlyZero(dx)) { // gradient is vertical Sk4f c = lerp_color(fx, find_forward(fRecs.begin(), SkTPin(fx, 0.0f, 1.0f))); if (fApplyAlphaAfterInterp) { fill<true>(dstC, count, c + dither0, c + dither1); diff --git a/tests/GradientTest.cpp b/tests/GradientTest.cpp index d0ea1f2b4d..8d73569f64 100644 --- a/tests/GradientTest.cpp +++ b/tests/GradientTest.cpp @@ -9,6 +9,7 @@ #include "SkColorShader.h" #include "SkGradientShader.h" #include "SkShader.h" +#include "SkSurface.h" #include "SkTemplates.h" #include "Test.h" @@ -196,8 +197,24 @@ static void TestGradientShaders(skiatest::Reporter* reporter) { } } +static void test_nearly_vertical(skiatest::Reporter* reporter) { + SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterN32Premul(200, 200)); + + const SkPoint pts[] = {{ 100, 50 }, { 100.0001f, 50000 }}; + const SkColor colors[] = { SK_ColorBLACK, SK_ColorWHITE }; + const SkScalar pos[] = { 0, 1 }; + SkAutoTUnref<SkShader> gradient( + SkGradientShader::CreateLinear(pts, colors, pos, 2, SkShader::kClamp_TileMode)); + + SkPaint paint; + paint.setShader(gradient); + + surface->getCanvas()->drawPaint(paint); +} + DEF_TEST(Gradient, reporter) { TestGradientShaders(reporter); TestConstantGradient(reporter); test_big_grad(reporter); + test_nearly_vertical(reporter); } |