diff options
-rw-r--r-- | src/core/SkAnalyticEdge.cpp | 2 | ||||
-rw-r--r-- | tests/PathTest.cpp | 15 |
2 files changed, 16 insertions, 1 deletions
diff --git a/src/core/SkAnalyticEdge.cpp b/src/core/SkAnalyticEdge.cpp index a9cbc50204..862f88d043 100644 --- a/src/core/SkAnalyticEdge.cpp +++ b/src/core/SkAnalyticEdge.cpp @@ -106,7 +106,7 @@ bool SkAnalyticQuadraticEdge::updateQuadratic() { newx = oldx + (dx >> shift); newy = oldy + (dy >> shift); slope = dy >> 10 > 0 ? QuickSkFDot6Div(dx >> 10, dy >> 10) : SK_MaxS32; - if (SkAbs32(dy) >= SK_Fixed1 * 2) { // only snap when dy is large enough + if (SkAbs32(dy >> shift) >= SK_Fixed1 * 2) { // only snap when dy is large enough newSnappedY = SkTMin<SkFixed>(fQEdge.fQLastY, SkFixedRoundToFixed(newy)); newSnappedX = newx + SkFixedMul(slope, newSnappedY - newy); } else { diff --git a/tests/PathTest.cpp b/tests/PathTest.cpp index f064a16f77..0c0dac3c45 100644 --- a/tests/PathTest.cpp +++ b/tests/PathTest.cpp @@ -216,6 +216,20 @@ static void test_mask_overflow() { canvas->drawPath(path, paint); } +static void test_fuzz_crbug_668907() { + auto surface(SkSurface::MakeRasterN32Premul(400, 500)); + SkCanvas* canvas = surface->getCanvas(); + SkPaint paint; + paint.setAntiAlias(true); + SkPath path; + path.moveTo(SkBits2Float(0x46313741), SkBits2Float(0x3b00e540)); // 11341.8f, 0.00196679f + path.quadTo(SkBits2Float(0x41410041), SkBits2Float(0xc1414141), SkBits2Float(0x41414141), + SkBits2Float(0x414100ff)); // 12.0626f, -12.0784f, 12.0784f, 12.0627f + path.lineTo(SkBits2Float(0x46313741), SkBits2Float(0x3b00e540)); // 11341.8f, 0.00196679f + path.close(); + canvas->drawPath(path, paint); +} + /** * In debug mode, this path was causing an assertion to fail in * SkPathStroker::preJoinTo() and, in Release, the use of an unitialized value. @@ -4378,6 +4392,7 @@ DEF_TEST(Paths, reporter) { test_fuzz_crbug_662730(reporter); test_fuzz_crbug_662780(); test_mask_overflow(); + test_fuzz_crbug_668907(); SkTSize<SkScalar>::Make(3,4); |