diff options
-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); } |