give up on quad root if infinite
authorcaryclark <caryclark@google.com>
Tue, 5 Jan 2016 14:20:09 +0000 (06:20 -0800)
committerCommit bot <commit-bot@chromium.org>
Tue, 5 Jan 2016 14:20:09 +0000 (06:20 -0800)
SkPath::contains() uses SkFindUnitQuadRoots to see
which side of a curve a point is on. If the
intermediate exceeds a float, return no found root.

R=reed@google.com
BUG=572406
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1556353002

Review URL: https://codereview.chromium.org/1556353002

src/core/SkGeometry.cpp
tests/PathTest.cpp

index f7c8f57..fb9cb5c 100644 (file)
@@ -90,7 +90,7 @@ int SkFindUnitQuadRoots(SkScalar A, SkScalar B, SkScalar C, SkScalar roots[2]) {
     SkScalar* r = roots;
 
     SkScalar R = B*B - 4*A*C;
-    if (R < 0 || SkScalarIsNaN(R)) {  // complex roots
+    if (R < 0 || !SkScalarIsFinite(R)) {  // complex roots
         return 0;
     }
     R = SkScalarSqrt(R);
index faa091c..7c5ca0e 100644 (file)
@@ -3508,6 +3508,15 @@ static void test_get_point(skiatest::Reporter* reporter) {
 
 static void test_contains(skiatest::Reporter* reporter) {
     SkPath p;
+    p.moveTo(SkBits2Float(0xe085e7b1), SkBits2Float(0x5f512c00));  // -7.7191e+19f, 1.50724e+19f
+    p.conicTo(SkBits2Float(0xdfdaa221), SkBits2Float(0x5eaac338), SkBits2Float(0x60342f13), SkBits2Float(0xdf0cbb58), SkBits2Float(0x3f3504f3));  // -3.15084e+19f, 6.15237e+18f, 5.19345e+19f, -1.01408e+19f, 0.707107f
+    p.conicTo(SkBits2Float(0x60ead799), SkBits2Float(0xdfb76c24), SkBits2Float(0x609b9872), SkBits2Float(0xdf730de8), SkBits2Float(0x3f3504f4));  // 1.35377e+20f, -2.6434e+19f, 8.96947e+19f, -1.75139e+19f, 0.707107f
+    p.lineTo(SkBits2Float(0x609b9872), SkBits2Float(0xdf730de8));  // 8.96947e+19f, -1.75139e+19f
+    p.conicTo(SkBits2Float(0x6018b296), SkBits2Float(0xdeee870d), SkBits2Float(0xe008cd8e), SkBits2Float(0x5ed5b2db), SkBits2Float(0x3f3504f3));  // 4.40121e+19f, -8.59386e+18f, -3.94308e+19f, 7.69931e+18f, 0.707107f
+    p.conicTo(SkBits2Float(0xe0d526d9), SkBits2Float(0x5fa67b31), SkBits2Float(0xe085e7b2), SkBits2Float(0x5f512c01), SkBits2Float(0x3f3504f3));  // -1.22874e+20f, 2.39925e+19f, -7.7191e+19f, 1.50724e+19f, 0.707107f
+    REPORTER_ASSERT(reporter, !p.contains(-77.2027664f, 15.3066053f));
+
+    p.reset();
     p.setFillType(SkPath::kInverseWinding_FillType);
     REPORTER_ASSERT(reporter, p.contains(0, 0));
     p.setFillType(SkPath::kWinding_FillType);