aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/core/SkAnalyticEdge.cpp2
-rw-r--r--tests/PathTest.cpp15
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);