Index: tests/PathTest.cpp |
diff --git a/tests/PathTest.cpp b/tests/PathTest.cpp |
index 78cba5ba00a4d2510ddf75ed8a39dad60c0d2591..458861908063d8beb30311081de489e18a42a077 100644 |
--- a/tests/PathTest.cpp |
+++ b/tests/PathTest.cpp |
@@ -1308,6 +1308,79 @@ static void test_convexity(skiatest::Reporter* reporter) { |
REPORTER_ASSERT(reporter, gRec[i].fExpectedConvexity == path.getConvexity()); |
check_direction(reporter, path, gRec[i].fExpectedDirection); |
} |
+ |
+ static const SkPoint nonFinitePts[] = { |
+ { SK_ScalarInfinity, 0 }, |
+ { 0, SK_ScalarInfinity }, |
+ { SK_ScalarInfinity, SK_ScalarInfinity }, |
+ { SK_ScalarNegativeInfinity, 0}, |
+ { 0, SK_ScalarNegativeInfinity }, |
+ { SK_ScalarNegativeInfinity, SK_ScalarNegativeInfinity }, |
+ { SK_ScalarNegativeInfinity, SK_ScalarInfinity }, |
+ { SK_ScalarInfinity, SK_ScalarNegativeInfinity }, |
+ { SK_ScalarNaN, 0 }, |
+ { 0, SK_ScalarNaN }, |
+ { SK_ScalarNaN, SK_ScalarNaN }, |
+ }; |
+ |
+ const size_t nonFinitePtsCount = sizeof(nonFinitePts) / sizeof(nonFinitePts[0]); |
+ |
+ static const SkPoint finitePts[] = { |
+ { SK_ScalarMax, 0 }, |
+ { 0, SK_ScalarMax }, |
+ { SK_ScalarMax, SK_ScalarMax }, |
+ { SK_ScalarMin, 0 }, |
+ { 0, SK_ScalarMin }, |
+ { SK_ScalarMin, SK_ScalarMin }, |
+ }; |
+ |
+ const size_t finitePtsCount = sizeof(finitePts) / sizeof(finitePts[0]); |
+ |
+ for (int index = 0; index < (int) (13 * nonFinitePtsCount * finitePtsCount); ++index) { |
+ int i = (int) (index % nonFinitePtsCount); |
+ int f = (int) (index % finitePtsCount); |
+ int g = (int) ((f + 1) % finitePtsCount); |
+ path.reset(); |
+ switch (index % 13) { |
+ case 0: path.lineTo(nonFinitePts[i]); break; |
+ case 1: path.quadTo(nonFinitePts[i], nonFinitePts[i]); break; |
+ case 2: path.quadTo(nonFinitePts[i], finitePts[f]); break; |
+ case 3: path.quadTo(finitePts[f], nonFinitePts[i]); break; |
+ case 4: path.cubicTo(nonFinitePts[i], finitePts[f], finitePts[f]); break; |
+ case 5: path.cubicTo(finitePts[f], nonFinitePts[i], finitePts[f]); break; |
+ case 6: path.cubicTo(finitePts[f], finitePts[f], nonFinitePts[i]); break; |
+ case 7: path.cubicTo(nonFinitePts[i], nonFinitePts[i], finitePts[f]); break; |
+ case 8: path.cubicTo(nonFinitePts[i], finitePts[f], nonFinitePts[i]); break; |
+ case 9: path.cubicTo(finitePts[f], nonFinitePts[i], nonFinitePts[i]); break; |
+ case 10: path.cubicTo(nonFinitePts[i], nonFinitePts[i], nonFinitePts[i]); break; |
+ case 11: path.cubicTo(nonFinitePts[i], finitePts[f], finitePts[g]); break; |
+ case 12: path.moveTo(nonFinitePts[i]); break; |
+ } |
+ check_convexity(reporter, path, SkPath::kUnknown_Convexity); |
+ } |
+ |
+ for (int index = 0; index < (int) (11 * finitePtsCount); ++index) { |
+ int f = (int) (index % finitePtsCount); |
+ int g = (int) ((f + 1) % finitePtsCount); |
+ path.reset(); |
+ int curveSelect = index % 11; |
+ switch (curveSelect) { |
+ case 0: path.moveTo(finitePts[f]); break; |
+ case 1: path.lineTo(finitePts[f]); break; |
+ case 2: path.quadTo(finitePts[f], finitePts[f]); break; |
+ case 3: path.quadTo(finitePts[f], finitePts[g]); break; |
+ case 4: path.quadTo(finitePts[g], finitePts[f]); break; |
+ case 5: path.cubicTo(finitePts[f], finitePts[f], finitePts[f]); break; |
+ case 6: path.cubicTo(finitePts[f], finitePts[f], finitePts[g]); break; |
+ case 7: path.cubicTo(finitePts[f], finitePts[g], finitePts[f]); break; |
+ case 8: path.cubicTo(finitePts[f], finitePts[g], finitePts[g]); break; |
+ case 9: path.cubicTo(finitePts[g], finitePts[f], finitePts[f]); break; |
+ case 10: path.cubicTo(finitePts[g], finitePts[f], finitePts[g]); break; |
+ } |
+ check_convexity(reporter, path, curveSelect == 0 ? SkPath::kConvex_Convexity |
+ : SkPath::kUnknown_Convexity); |
+ } |
+ |
} |
static void test_isLine(skiatest::Reporter* reporter) { |
@@ -2959,6 +3032,15 @@ static void test_rrect_is_convex(skiatest::Reporter* reporter, SkPath* path, |
path->reset(); |
} |
+static void test_rrect_convexity_is_unknown(skiatest::Reporter* reporter, SkPath* path, |
+ SkPath::Direction dir) { |
+ REPORTER_ASSERT(reporter, path->isConvex()); |
+ REPORTER_ASSERT(reporter, path->cheapIsDirection(dir)); |
+ path->setConvexity(SkPath::kUnknown_Convexity); |
+ REPORTER_ASSERT(reporter, path->getConvexity() == SkPath::kUnknown_Convexity); |
+ path->reset(); |
+} |
+ |
static void test_rrect(skiatest::Reporter* reporter) { |
SkPath p; |
SkRRect rr; |
@@ -3014,11 +3096,11 @@ static void test_rrect(skiatest::Reporter* reporter) { |
SkRect largeR = {0, 0, SK_ScalarMax, SK_ScalarMax}; |
rr.setRectRadii(largeR, radii); |
p.addRRect(rr); |
- test_rrect_is_convex(reporter, &p, SkPath::kCW_Direction); |
+ test_rrect_convexity_is_unknown(reporter, &p, SkPath::kCW_Direction); |
SkRect infR = {0, 0, SK_ScalarMax, SK_ScalarInfinity}; |
rr.setRectRadii(infR, radii); |
p.addRRect(rr); |
- test_rrect_is_convex(reporter, &p, SkPath::kCW_Direction); |
+ test_rrect_convexity_is_unknown(reporter, &p, SkPath::kCW_Direction); |
SkRect tinyR = {0, 0, 1e-9f, 1e-9f}; |
p.addRoundRect(tinyR, 5e-11f, 5e-11f); |
test_rrect_is_convex(reporter, &p, SkPath::kCW_Direction); |