diff options
author | caryclark@google.com <caryclark@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-07-23 15:27:41 +0000 |
---|---|---|
committer | caryclark@google.com <caryclark@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-07-23 15:27:41 +0000 |
commit | 4fdbb229649caf74e5c1b55a1823926df903af34 (patch) | |
tree | 5f822b5335b213ce7f9857cac288e79e4f3cc8f9 /tests/PathOpsQuadIntersectionTest.cpp | |
parent | 672222e400ec10024106a394512ce864d5b839ea (diff) |
turn off debugging printfs
fix pathops issues 1417, 1418
be more rigorous about pulling intersections of lines to end points
rewrite cubic/line and quad/line intersections to share style
BUG=
Review URL: https://codereview.chromium.org/19543005
git-svn-id: http://skia.googlecode.com/svn/trunk@10270 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'tests/PathOpsQuadIntersectionTest.cpp')
-rw-r--r-- | tests/PathOpsQuadIntersectionTest.cpp | 83 |
1 files changed, 48 insertions, 35 deletions
diff --git a/tests/PathOpsQuadIntersectionTest.cpp b/tests/PathOpsQuadIntersectionTest.cpp index ee2e8de8a1..2d72b41d2d 100644 --- a/tests/PathOpsQuadIntersectionTest.cpp +++ b/tests/PathOpsQuadIntersectionTest.cpp @@ -37,9 +37,9 @@ static void standardTestCases(skiatest::Reporter* reporter) { if (intersections.used() > 0) { for (int pt = 0; pt < intersections.used(); ++pt) { double tt1 = intersections[0][pt]; - SkDPoint xy1 = quad1.xyAtT(tt1); + SkDPoint xy1 = quad1.ptAtT(tt1); double tt2 = intersections[1][pt]; - SkDPoint xy2 = quad2.xyAtT(tt2); + SkDPoint xy2 = quad2.ptAtT(tt2); if (!xy1.approximatelyEqual(xy2)) { SkDebugf("%s [%d,%d] x!= t1=%g (%g,%g) t2=%g (%g,%g)\n", __FUNCTION__, static_cast<int>(index), pt, tt1, xy1.fX, xy1.fY, @@ -256,9 +256,9 @@ static void oneOffTest1(skiatest::Reporter* reporter, size_t outer, size_t inner intersections2.intersect(quad1, quad2); for (int pt = 0; pt < intersections2.used(); ++pt) { double tt1 = intersections2[0][pt]; - SkDPoint xy1 = quad1.xyAtT(tt1); + SkDPoint xy1 = quad1.ptAtT(tt1); double tt2 = intersections2[1][pt]; - SkDPoint xy2 = quad2.xyAtT(tt2); + SkDPoint xy2 = quad2.ptAtT(tt2); if (!xy1.approximatelyEqual(xy2)) { SkDebugf("%s [%d,%d] x!= t1=%g (%g,%g) t2=%g (%g,%g)\n", __FUNCTION__, static_cast<int>(outer), static_cast<int>(inner), @@ -285,6 +285,8 @@ static void oneOffTests(skiatest::Reporter* reporter) { } static const SkDQuad coincidentTestSet[] = { + {{{97.9337615966796875,100}, {88,112.94264984130859375}, {88,130}}}, + {{{88,130}, {88,124.80951690673828125}, {88.91983795166015625,120}}}, {{{369.850525, 145.675964}, {382.362915, 121.29287}, {406.211273, 121.29287}}}, {{{369.850525, 145.675964}, {382.362915, 121.29287}, {406.211273, 121.29287}}}, {{{8, 8}, {10, 10}, {8, -10}}}, @@ -293,25 +295,34 @@ static const SkDQuad coincidentTestSet[] = { const size_t coincidentTestSetCount = SK_ARRAY_COUNT(coincidentTestSet); +static void coincidentTestOne(skiatest::Reporter* reporter, int test1, int test2) { + const SkDQuad& quad1 = coincidentTestSet[test1]; + SkASSERT(ValidQuad(quad1)); + const SkDQuad& quad2 = coincidentTestSet[test2]; + SkASSERT(ValidQuad(quad2)); + SkIntersections intersections2; + intersections2.intersect(quad1, quad2); + REPORTER_ASSERT(reporter, intersections2.coincidentUsed() == 2); + REPORTER_ASSERT(reporter, intersections2.used() == 2); + for (int pt = 0; pt < intersections2.coincidentUsed(); ++pt) { + double tt1 = intersections2[0][pt]; + double tt2 = intersections2[1][pt]; + SkDPoint pt1 = quad1.ptAtT(tt1); + SkDPoint pt2 = quad2.ptAtT(tt2); + REPORTER_ASSERT(reporter, pt1.approximatelyEqual(pt2)); + } +} + static void coincidentTest(skiatest::Reporter* reporter) { for (size_t testIndex = 0; testIndex < coincidentTestSetCount - 1; testIndex += 2) { - const SkDQuad& quad1 = coincidentTestSet[testIndex]; - SkASSERT(ValidQuad(quad1)); - const SkDQuad& quad2 = coincidentTestSet[testIndex + 1]; - SkASSERT(ValidQuad(quad2)); - SkIntersections intersections2; - intersections2.intersect(quad1, quad2); - REPORTER_ASSERT(reporter, intersections2.coincidentUsed() == 2); - REPORTER_ASSERT(reporter, intersections2.used() == 2); - for (int pt = 0; pt < intersections2.coincidentUsed(); ++pt) { - double tt1 = intersections2[0][pt]; - double tt2 = intersections2[1][pt]; - REPORTER_ASSERT(reporter, approximately_equal(1, tt1) || approximately_zero(tt1)); - REPORTER_ASSERT(reporter, approximately_equal(1, tt2) || approximately_zero(tt2)); - } + coincidentTestOne(reporter, testIndex, testIndex + 1); } } +static void PathOpsQuadIntersectionCoincidenceOneOffTest(skiatest::Reporter* reporter) { + coincidentTestOne(reporter, 0, 1); +} + static int floatSign(double x) { return x < 0 ? -1 : x > 0 ? 1 : 0; } @@ -338,7 +349,7 @@ static const SkDQuad pointFinderTestSet[] = { static void pointFinder(const SkDQuad& q1, const SkDQuad& q2) { for (int index = 0; index < 3; ++index) { double t = q1.nearestT(q2[index]); - SkDPoint onQuad = q1.xyAtT(t); + SkDPoint onQuad = q1.ptAtT(t); SkDebugf("%s t=%1.9g (%1.9g,%1.9g) dist=%1.9g\n", __FUNCTION__, t, onQuad.fX, onQuad.fY, onQuad.distance(q2[index])); double left[3]; @@ -388,12 +399,12 @@ static void intersectionFinder(int test1, int test2) { SkDPoint t1[3], t2[3]; bool toggle = true; do { - t1[0] = quad1.xyAtT(t1Seed - t1Step); - t1[1] = quad1.xyAtT(t1Seed); - t1[2] = quad1.xyAtT(t1Seed + t1Step); - t2[0] = quad2.xyAtT(t2Seed - t2Step); - t2[1] = quad2.xyAtT(t2Seed); - t2[2] = quad2.xyAtT(t2Seed + t2Step); + t1[0] = quad1.ptAtT(t1Seed - t1Step); + t1[1] = quad1.ptAtT(t1Seed); + t1[2] = quad1.ptAtT(t1Seed + t1Step); + t2[0] = quad2.ptAtT(t2Seed - t2Step); + t2[1] = quad2.ptAtT(t2Seed); + t2[2] = quad2.ptAtT(t2Seed + t2Step); double dist[3][3]; dist[1][1] = t1[1].distance(t2[1]); int best_i = 1, best_j = 1; @@ -434,38 +445,38 @@ static void intersectionFinder(int test1, int test2) { double t22 = t2Seed + t2Step * 2; SkDPoint test; while (!approximately_zero(t1Step)) { - test = quad1.xyAtT(t10); + test = quad1.ptAtT(t10); t10 += t1[1].approximatelyEqual(test) ? -t1Step : t1Step; t1Step /= 2; } t1Step = 0.1; while (!approximately_zero(t1Step)) { - test = quad1.xyAtT(t12); + test = quad1.ptAtT(t12); t12 -= t1[1].approximatelyEqual(test) ? -t1Step : t1Step; t1Step /= 2; } while (!approximately_zero(t2Step)) { - test = quad2.xyAtT(t20); + test = quad2.ptAtT(t20); t20 += t2[1].approximatelyEqual(test) ? -t2Step : t2Step; t2Step /= 2; } t2Step = 0.1; while (!approximately_zero(t2Step)) { - test = quad2.xyAtT(t22); + test = quad2.ptAtT(t22); t22 -= t2[1].approximatelyEqual(test) ? -t2Step : t2Step; t2Step /= 2; } #if ONE_OFF_DEBUG SkDebugf("%s t1=(%1.9g<%1.9g<%1.9g) t2=(%1.9g<%1.9g<%1.9g)\n", __FUNCTION__, t10, t1Seed, t12, t20, t2Seed, t22); - SkDPoint p10 = quad1.xyAtT(t10); - SkDPoint p1Seed = quad1.xyAtT(t1Seed); - SkDPoint p12 = quad1.xyAtT(t12); + SkDPoint p10 = quad1.ptAtT(t10); + SkDPoint p1Seed = quad1.ptAtT(t1Seed); + SkDPoint p12 = quad1.ptAtT(t12); SkDebugf("%s p1=(%1.9g,%1.9g)<(%1.9g,%1.9g)<(%1.9g,%1.9g)\n", __FUNCTION__, p10.fX, p10.fY, p1Seed.fX, p1Seed.fY, p12.fX, p12.fY); - SkDPoint p20 = quad2.xyAtT(t20); - SkDPoint p2Seed = quad2.xyAtT(t2Seed); - SkDPoint p22 = quad2.xyAtT(t22); + SkDPoint p20 = quad2.ptAtT(t20); + SkDPoint p2Seed = quad2.ptAtT(t2Seed); + SkDPoint p22 = quad2.ptAtT(t22); SkDebugf("%s p2=(%1.9g,%1.9g)<(%1.9g,%1.9g)<(%1.9g,%1.9g)\n", __FUNCTION__, p20.fX, p20.fY, p2Seed.fX, p2Seed.fY, p22.fX, p22.fY); #endif @@ -488,3 +499,5 @@ static void PathOpsQuadIntersectionTest(skiatest::Reporter* reporter) { DEFINE_TESTCLASS_SHORT(PathOpsQuadIntersectionTest) DEFINE_TESTCLASS_SHORT(PathOpsQuadIntersectionOneOffTest) + +DEFINE_TESTCLASS_SHORT(PathOpsQuadIntersectionCoincidenceOneOffTest) |