Index: tests/PathTest.cpp |
diff --git a/tests/PathTest.cpp b/tests/PathTest.cpp |
index eda7f7961332526e7482cd95799e7e80ef87bbd9..464943b8dcc8f271d211a59a6f2d7c1e8a6c422a 100644 |
--- a/tests/PathTest.cpp |
+++ b/tests/PathTest.cpp |
@@ -6,6 +6,7 @@ |
*/ |
#include "SkCanvas.h" |
+#include "SkGeometry.h" |
#include "SkPaint.h" |
#include "SkParse.h" |
#include "SkParsePath.h" |
@@ -3514,6 +3515,10 @@ static void test_contains(skiatest::Reporter* reporter) { |
p.moveTo(4, 4); |
p.lineTo(6, 8); |
p.lineTo(8, 4); |
+ // test on edge |
+ REPORTER_ASSERT(reporter, p.contains(6, 4)); |
+ REPORTER_ASSERT(reporter, p.contains(5, 6)); |
+ REPORTER_ASSERT(reporter, p.contains(7, 6)); |
// test quick reject |
REPORTER_ASSERT(reporter, !p.contains(4, 0)); |
REPORTER_ASSERT(reporter, !p.contains(0, 4)); |
@@ -3527,10 +3532,43 @@ static void test_contains(skiatest::Reporter* reporter) { |
p.moveTo(4, 4); |
p.lineTo(8, 6); |
p.lineTo(4, 8); |
+ // test on edge |
+ REPORTER_ASSERT(reporter, p.contains(4, 6)); |
+ REPORTER_ASSERT(reporter, p.contains(6, 5)); |
+ REPORTER_ASSERT(reporter, p.contains(6, 7)); |
// test various crossings in y |
REPORTER_ASSERT(reporter, !p.contains(7, 5)); |
REPORTER_ASSERT(reporter, p.contains(7, 6)); |
REPORTER_ASSERT(reporter, !p.contains(7, 7)); |
+ p.reset(); |
+ p.moveTo(4, 4); |
+ p.lineTo(6, 8); |
+ p.lineTo(2, 8); |
+ // test on edge |
+ REPORTER_ASSERT(reporter, p.contains(5, 6)); |
+ REPORTER_ASSERT(reporter, p.contains(4, 8)); |
+ REPORTER_ASSERT(reporter, p.contains(3, 6)); |
+ p.reset(); |
+ p.moveTo(4, 4); |
+ p.lineTo(0, 6); |
+ p.lineTo(4, 8); |
+ // test on edge |
+ REPORTER_ASSERT(reporter, p.contains(2, 5)); |
+ REPORTER_ASSERT(reporter, p.contains(2, 7)); |
+ REPORTER_ASSERT(reporter, p.contains(4, 6)); |
+ // test canceling coincident edge (a smaller triangle is coincident with a larger one) |
+ p.reset(); |
+ p.moveTo(4, 0); |
+ p.lineTo(6, 4); |
+ p.lineTo(2, 4); |
+ p.moveTo(4, 0); |
+ p.lineTo(0, 8); |
+ p.lineTo(8, 8); |
+ REPORTER_ASSERT(reporter, !p.contains(1, 2)); |
+ REPORTER_ASSERT(reporter, !p.contains(3, 2)); |
+ REPORTER_ASSERT(reporter, !p.contains(4, 0)); |
+ REPORTER_ASSERT(reporter, p.contains(4, 4)); |
+ |
// test quads |
p.reset(); |
p.moveTo(4, 4); |
@@ -3539,25 +3577,41 @@ static void test_contains(skiatest::Reporter* reporter) { |
p.quadTo(4, 6, 4, 4); |
REPORTER_ASSERT(reporter, p.contains(5, 6)); |
REPORTER_ASSERT(reporter, !p.contains(6, 5)); |
+ // test quad edge |
+ REPORTER_ASSERT(reporter, p.contains(5, 5)); |
+ REPORTER_ASSERT(reporter, p.contains(5, 8)); |
+ REPORTER_ASSERT(reporter, p.contains(4, 5)); |
p.reset(); |
- p.moveTo(6, 6); |
- p.quadTo(8, 8, 6, 8); |
- p.quadTo(4, 8, 4, 6); |
- p.quadTo(4, 4, 6, 6); |
+ const SkPoint qPts[] = {{6, 6}, {8, 8}, {6, 8}, {4, 8}, {4, 6}, {4, 4}, {6, 6}}; |
+ p.moveTo(qPts[0]); |
+ for (int index = 1; index < (int) SK_ARRAY_COUNT(qPts); index += 2) { |
+ p.quadTo(qPts[index], qPts[index + 1]); |
+ } |
REPORTER_ASSERT(reporter, p.contains(5, 6)); |
REPORTER_ASSERT(reporter, !p.contains(6, 5)); |
+ // test quad edge |
+ SkPoint halfway; |
+ for (int index = 0; index < (int) SK_ARRAY_COUNT(qPts) - 2; index += 2) { |
+ SkEvalQuadAt(&qPts[index], 0.5f, &halfway, nullptr); |
+ REPORTER_ASSERT(reporter, p.contains(halfway.fX, halfway.fY)); |
+ } |
-#define CONIC_CONTAINS_BUG_FIXED 0 |
-#if CONIC_CONTAINS_BUG_FIXED |
+ // test conics |
p.reset(); |
- p.moveTo(4, 4); |
- p.conicTo(6, 6, 8, 8, 0.5f); |
- p.conicTo(6, 8, 4, 8, 0.5f); |
- p.conicTo(4, 6, 4, 4, 0.5f); |
+ const SkPoint kPts[] = {{4, 4}, {6, 6}, {8, 8}, {6, 8}, {4, 8}, {4, 6}, {4, 4}}; |
+ p.moveTo(kPts[0]); |
+ for (int index = 1; index < (int) SK_ARRAY_COUNT(kPts); index += 2) { |
+ p.conicTo(kPts[index], kPts[index + 1], 0.5f); |
+ } |
REPORTER_ASSERT(reporter, p.contains(5, 6)); |
REPORTER_ASSERT(reporter, !p.contains(6, 5)); |
-#endif |
+ // test conic edge |
+ for (int index = 0; index < (int) SK_ARRAY_COUNT(kPts) - 2; index += 2) { |
+ SkConic conic(&kPts[index], 0.5f); |
+ halfway = conic.evalAt(0.5f); |
+ REPORTER_ASSERT(reporter, p.contains(halfway.fX, halfway.fY)); |
+ } |
// test cubics |
SkPoint pts[] = {{5, 4}, {6, 5}, {7, 6}, {6, 6}, {4, 6}, {5, 7}, {5, 5}, {5, 4}, {6, 5}, {7, 6}}; |
@@ -3570,6 +3624,11 @@ static void test_contains(skiatest::Reporter* reporter) { |
p.close(); |
REPORTER_ASSERT(reporter, p.contains(5.5f, 5.5f)); |
REPORTER_ASSERT(reporter, !p.contains(4.5f, 5.5f)); |
+ // test cubic edge |
+ SkEvalCubicAt(&pts[i], 0.5f, &halfway, nullptr, nullptr); |
+ REPORTER_ASSERT(reporter, p.contains(halfway.fX, halfway.fY)); |
+ SkEvalCubicAt(&pts[i + 3], 0.5f, &halfway, nullptr, nullptr); |
+ REPORTER_ASSERT(reporter, p.contains(halfway.fX, halfway.fY)); |
} |
} |
@@ -3796,6 +3855,10 @@ public: |
} |
}; |
+DEF_TEST(PathContains, reporter) { |
+ test_contains(reporter); |
+} |
+ |
DEF_TEST(Paths, reporter) { |
test_path_crbug364224(); |