| Index: tests/PathOpsCubicIntersectionTest.cpp
|
| diff --git a/tests/PathOpsCubicIntersectionTest.cpp b/tests/PathOpsCubicIntersectionTest.cpp
|
| index 07852bca9adb720020e194052162e78267facfe3..e69aff86a5f739d7666c403c3d6718aea36c285a 100644
|
| --- a/tests/PathOpsCubicIntersectionTest.cpp
|
| +++ b/tests/PathOpsCubicIntersectionTest.cpp
|
| @@ -19,11 +19,14 @@ const int firstCubicIntersectionTest = 9;
|
| static void standardTestCases(skiatest::Reporter* reporter) {
|
| for (size_t index = firstCubicIntersectionTest; index < tests_count; ++index) {
|
| int iIndex = static_cast<int>(index);
|
| - const SkDCubic& cubic1 = tests[index][0];
|
| - const SkDCubic& cubic2 = tests[index][1];
|
| + const CubicPts& cubic1 = tests[index][0];
|
| + const CubicPts& cubic2 = tests[index][1];
|
| + SkDCubic c1, c2;
|
| + c1.debugSet(cubic1.fPts);
|
| + c2.debugSet(cubic2.fPts);
|
| SkReduceOrder reduce1, reduce2;
|
| - int order1 = reduce1.reduce(cubic1, SkReduceOrder::kNo_Quadratics);
|
| - int order2 = reduce2.reduce(cubic2, SkReduceOrder::kNo_Quadratics);
|
| + int order1 = reduce1.reduce(c1, SkReduceOrder::kNo_Quadratics);
|
| + int order2 = reduce2.reduce(c2, SkReduceOrder::kNo_Quadratics);
|
| const bool showSkipped = false;
|
| if (order1 < 4) {
|
| if (showSkipped) {
|
| @@ -38,7 +41,7 @@ static void standardTestCases(skiatest::Reporter* reporter) {
|
| continue;
|
| }
|
| SkIntersections tIntersections;
|
| - tIntersections.intersect(cubic1, cubic2);
|
| + tIntersections.intersect(c1, c2);
|
| if (!tIntersections.used()) {
|
| if (showSkipped) {
|
| SkDebugf("%s [%d] no intersection\n", __FUNCTION__, iIndex);
|
| @@ -53,9 +56,9 @@ static void standardTestCases(skiatest::Reporter* reporter) {
|
| }
|
| for (int pt = 0; pt < tIntersections.used(); ++pt) {
|
| double tt1 = tIntersections[0][pt];
|
| - SkDPoint xy1 = cubic1.ptAtT(tt1);
|
| + SkDPoint xy1 = c1.ptAtT(tt1);
|
| double tt2 = tIntersections[1][pt];
|
| - SkDPoint xy2 = cubic2.ptAtT(tt2);
|
| + SkDPoint xy2 = c2.ptAtT(tt2);
|
| if (!xy1.approximatelyEqual(xy2)) {
|
| SkDebugf("%s [%d,%d] x!= t1=%g (%g,%g) t2=%g (%g,%g)\n",
|
| __FUNCTION__, (int)index, pt, tt1, xy1.fX, xy1.fY, tt2, xy2.fX, xy2.fY);
|
| @@ -66,7 +69,7 @@ static void standardTestCases(skiatest::Reporter* reporter) {
|
| }
|
| }
|
|
|
| -static const SkDCubic testSet[] = {
|
| +static const CubicPts testSet[] = {
|
| // FIXME: uncommenting these two will cause this to fail
|
| // this results in two curves very nearly but not exactly coincident
|
| #if 0
|
| @@ -164,7 +167,7 @@ static const SkDCubic testSet[] = {
|
|
|
| const int testSetCount = (int) SK_ARRAY_COUNT(testSet);
|
|
|
| -static const SkDCubic newTestSet[] = {
|
| +static const CubicPts newTestSet[] = {
|
| { { { 130.0427549999999997, 11417.41309999999976 },{ 130.2331240000000037, 11418.3192999999992 },{ 131.0370790000000056, 11419 },{ 132, 11419 } } },
|
| { { { 132, 11419 },{ 130.8954319999999996, 11419 },{ 130, 11418.10449999999946 },{ 130, 11417 } } },
|
|
|
| @@ -381,10 +384,13 @@ static const SkDCubic newTestSet[] = {
|
| };
|
|
|
| const int newTestSetCount = (int) SK_ARRAY_COUNT(newTestSet);
|
| -static void oneOff(skiatest::Reporter* reporter, const SkDCubic& cubic1, const SkDCubic& cubic2,
|
| +static void oneOff(skiatest::Reporter* reporter, const CubicPts& cubic1, const CubicPts& cubic2,
|
| bool coin) {
|
| - SkASSERT(ValidCubic(cubic1));
|
| - SkASSERT(ValidCubic(cubic2));
|
| + SkDCubic c1, c2;
|
| + c1.debugSet(cubic1.fPts);
|
| + c2.debugSet(cubic2.fPts);
|
| + SkASSERT(ValidCubic(c1));
|
| + SkASSERT(ValidCubic(c2));
|
| #if ONE_OFF_DEBUG
|
| SkDebugf("computed quadratics given\n");
|
| SkDebugf(" {{%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}},\n",
|
| @@ -395,7 +401,7 @@ static void oneOff(skiatest::Reporter* reporter, const SkDCubic& cubic1, const S
|
| cubic2[2].fX, cubic2[2].fY, cubic2[3].fX, cubic2[3].fY);
|
| #endif
|
| SkIntersections intersections;
|
| - intersections.intersect(cubic1, cubic2);
|
| + intersections.intersect(c1, c2);
|
| #if DEBUG_T_SECT_DUMP == 3
|
| SkDebugf("</div>\n\n");
|
| SkDebugf("<script type=\"text/javascript\">\n\n");
|
| @@ -412,9 +418,9 @@ static void oneOff(skiatest::Reporter* reporter, const SkDCubic& cubic1, const S
|
| SkDPoint xy1, xy2;
|
| for (int pt3 = 0; pt3 < intersections.used(); ++pt3) {
|
| tt1 = intersections[0][pt3];
|
| - xy1 = cubic1.ptAtT(tt1);
|
| + xy1 = c1.ptAtT(tt1);
|
| tt2 = intersections[1][pt3];
|
| - xy2 = cubic2.ptAtT(tt2);
|
| + xy2 = c2.ptAtT(tt2);
|
| const SkDPoint& iPt = intersections.pt(pt3);
|
| #if ONE_OFF_DEBUG
|
| SkDebugf("%s t1=%1.9g (%1.9g, %1.9g) (%1.9g, %1.9g) (%1.9g, %1.9g) t2=%1.9g\n",
|
| @@ -429,20 +435,20 @@ static void oneOff(skiatest::Reporter* reporter, const SkDCubic& cubic1, const S
|
| }
|
|
|
| static void oneOff(skiatest::Reporter* reporter, int outer, int inner) {
|
| - const SkDCubic& cubic1 = testSet[outer];
|
| - const SkDCubic& cubic2 = testSet[inner];
|
| + const CubicPts& cubic1 = testSet[outer];
|
| + const CubicPts& cubic2 = testSet[inner];
|
| oneOff(reporter, cubic1, cubic2, false);
|
| }
|
|
|
| static void newOneOff(skiatest::Reporter* reporter, int outer, int inner) {
|
| - const SkDCubic& cubic1 = newTestSet[outer];
|
| - const SkDCubic& cubic2 = newTestSet[inner];
|
| + const CubicPts& cubic1 = newTestSet[outer];
|
| + const CubicPts& cubic2 = newTestSet[inner];
|
| oneOff(reporter, cubic1, cubic2, false);
|
| }
|
|
|
| static void testsOneOff(skiatest::Reporter* reporter, int index) {
|
| - const SkDCubic& cubic1 = tests[index][0];
|
| - const SkDCubic& cubic2 = tests[index][1];
|
| + const CubicPts& cubic1 = tests[index][0];
|
| + const CubicPts& cubic2 = tests[index][1];
|
| oneOff(reporter, cubic1, cubic2, false);
|
| }
|
|
|
| @@ -468,12 +474,12 @@ static void CubicIntersection_RandTest(skiatest::Reporter* reporter) {
|
| unsigned seed = 0;
|
| #endif
|
| for (int test = 0; test < tests; ++test) {
|
| - SkDCubic cubic1, cubic2;
|
| + CubicPts cubic1, cubic2;
|
| for (int i = 0; i < 4; ++i) {
|
| - cubic1[i].fX = static_cast<double>(SK_RAND(seed)) / RAND_MAX * 100;
|
| - cubic1[i].fY = static_cast<double>(SK_RAND(seed)) / RAND_MAX * 100;
|
| - cubic2[i].fX = static_cast<double>(SK_RAND(seed)) / RAND_MAX * 100;
|
| - cubic2[i].fY = static_cast<double>(SK_RAND(seed)) / RAND_MAX * 100;
|
| + cubic1.fPts[i].fX = static_cast<double>(SK_RAND(seed)) / RAND_MAX * 100;
|
| + cubic1.fPts[i].fY = static_cast<double>(SK_RAND(seed)) / RAND_MAX * 100;
|
| + cubic2.fPts[i].fX = static_cast<double>(SK_RAND(seed)) / RAND_MAX * 100;
|
| + cubic2.fPts[i].fY = static_cast<double>(SK_RAND(seed)) / RAND_MAX * 100;
|
| }
|
| #if DEBUG_CRASH
|
| char str[1024];
|
| @@ -486,15 +492,18 @@ static void CubicIntersection_RandTest(skiatest::Reporter* reporter) {
|
| cubic2[3].fX, cubic2[3].fY);
|
| #endif
|
| SkDRect rect1, rect2;
|
| - rect1.setBounds(cubic1);
|
| - rect2.setBounds(cubic2);
|
| + SkDCubic c1, c2;
|
| + c1.debugSet(cubic1.fPts);
|
| + c2.debugSet(cubic2.fPts);
|
| + rect1.setBounds(c1);
|
| + rect2.setBounds(c2);
|
| bool boundsIntersect = rect1.fLeft <= rect2.fRight && rect2.fLeft <= rect2.fRight
|
| && rect1.fTop <= rect2.fBottom && rect2.fTop <= rect1.fBottom;
|
| if (test == -1) {
|
| SkDebugf("ready...\n");
|
| }
|
| SkIntersections intersections2;
|
| - int newIntersects = intersections2.intersect(cubic1, cubic2);
|
| + int newIntersects = intersections2.intersect(c1, c2);
|
| if (!boundsIntersect && newIntersects) {
|
| #if DEBUG_CRASH
|
| SkDebugf("%s %d unexpected intersection boundsIntersect=%d "
|
| @@ -505,9 +514,9 @@ static void CubicIntersection_RandTest(skiatest::Reporter* reporter) {
|
| }
|
| for (int pt = 0; pt < intersections2.used(); ++pt) {
|
| double tt1 = intersections2[0][pt];
|
| - SkDPoint xy1 = cubic1.ptAtT(tt1);
|
| + SkDPoint xy1 = c1.ptAtT(tt1);
|
| double tt2 = intersections2[1][pt];
|
| - SkDPoint xy2 = cubic2.ptAtT(tt2);
|
| + SkDPoint xy2 = c2.ptAtT(tt2);
|
| REPORTER_ASSERT(reporter, xy1.approximatelyEqual(xy2));
|
| }
|
| reporter->bumpTestCount();
|
| @@ -516,17 +525,20 @@ static void CubicIntersection_RandTest(skiatest::Reporter* reporter) {
|
|
|
| static void intersectionFinder(int index0, int index1, double t1Seed, double t2Seed,
|
| double t1Step, double t2Step) {
|
| - const SkDCubic& cubic1 = newTestSet[index0];
|
| - const SkDCubic& cubic2 = newTestSet[index1];
|
| + const CubicPts& cubic1 = newTestSet[index0];
|
| + const CubicPts& cubic2 = newTestSet[index1];
|
| SkDPoint t1[3], t2[3];
|
| bool toggle = true;
|
| + SkDCubic c1, c2;
|
| + c1.debugSet(cubic1.fPts);
|
| + c2.debugSet(cubic2.fPts);
|
| do {
|
| - t1[0] = cubic1.ptAtT(t1Seed - t1Step);
|
| - t1[1] = cubic1.ptAtT(t1Seed);
|
| - t1[2] = cubic1.ptAtT(t1Seed + t1Step);
|
| - t2[0] = cubic2.ptAtT(t2Seed - t2Step);
|
| - t2[1] = cubic2.ptAtT(t2Seed);
|
| - t2[2] = cubic2.ptAtT(t2Seed + t2Step);
|
| + t1[0] = c1.ptAtT(t1Seed - t1Step);
|
| + t1[1] = c1.ptAtT(t1Seed);
|
| + t1[2] = c1.ptAtT(t1Seed + t1Step);
|
| + t2[0] = c2.ptAtT(t2Seed - t2Step);
|
| + t2[1] = c2.ptAtT(t2Seed);
|
| + t2[2] = c2.ptAtT(t2Seed + t2Step);
|
| double dist[3][3];
|
| dist[1][1] = t1[1].distance(t2[1]);
|
| int best_i = 1, best_j = 1;
|
| @@ -567,38 +579,38 @@ static void intersectionFinder(int index0, int index1, double t1Seed, double t2S
|
| double t22 = t2Seed + t2Step * 2;
|
| SkDPoint test;
|
| while (!approximately_zero(t1Step)) {
|
| - test = cubic1.ptAtT(t10);
|
| + test = c1.ptAtT(t10);
|
| t10 += t1[1].approximatelyEqual(test) ? -t1Step : t1Step;
|
| t1Step /= 2;
|
| }
|
| t1Step = 0.1;
|
| while (!approximately_zero(t1Step)) {
|
| - test = cubic1.ptAtT(t12);
|
| + test = c1.ptAtT(t12);
|
| t12 -= t1[1].approximatelyEqual(test) ? -t1Step : t1Step;
|
| t1Step /= 2;
|
| }
|
| while (!approximately_zero(t2Step)) {
|
| - test = cubic2.ptAtT(t20);
|
| + test = c2.ptAtT(t20);
|
| t20 += t2[1].approximatelyEqual(test) ? -t2Step : t2Step;
|
| t2Step /= 2;
|
| }
|
| t2Step = 0.1;
|
| while (!approximately_zero(t2Step)) {
|
| - test = cubic2.ptAtT(t22);
|
| + test = c2.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 = cubic1.ptAtT(t10);
|
| - SkDPoint p1Seed = cubic1.ptAtT(t1Seed);
|
| - SkDPoint p12 = cubic1.ptAtT(t12);
|
| + SkDPoint p10 = c1.ptAtT(t10);
|
| + SkDPoint p1Seed = c1.ptAtT(t1Seed);
|
| + SkDPoint p12 = c1.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 = cubic2.ptAtT(t20);
|
| - SkDPoint p2Seed = cubic2.ptAtT(t2Seed);
|
| - SkDPoint p22 = cubic2.ptAtT(t22);
|
| + SkDPoint p20 = c2.ptAtT(t20);
|
| + SkDPoint p2Seed = c2.ptAtT(t2Seed);
|
| + SkDPoint p22 = c2.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
|
| @@ -614,7 +626,7 @@ static void CubicIntersection_IntersectionFinder() {
|
| intersectionFinder(0, 1, 0.865213351, 0.865208087, t1Step, t2Step);
|
| }
|
|
|
| -static const SkDCubic selfSet[] = {
|
| +static const CubicPts selfSet[] = {
|
| {{{2, 3}, {0, 4}, {3, 2}, {5, 3}}},
|
| {{{3, 6}, {2, 3}, {4, 0}, {3, 2}}},
|
| {{{0, 2}, {2, 3}, {5, 1}, {3, 2}}},
|
| @@ -628,10 +640,10 @@ static const SkDCubic selfSet[] = {
|
| int selfSetCount = (int) SK_ARRAY_COUNT(selfSet);
|
|
|
| static void selfOneOff(skiatest::Reporter* reporter, int index) {
|
| - const SkDCubic& cubic = selfSet[index];
|
| + const CubicPts& cubic = selfSet[index];
|
| SkPoint c[4];
|
| for (int i = 0; i < 4; ++i) {
|
| - c[i] = cubic[i].asSkPoint();
|
| + c[i] = cubic.fPts[i].asSkPoint();
|
| }
|
| SkScalar loopT;
|
| SkScalar d[3];
|
| @@ -662,7 +674,7 @@ static void cubicIntersectionSelfTest(skiatest::Reporter* reporter) {
|
| }
|
| }
|
|
|
| -static const SkDCubic coinSet[] = {
|
| +static const CubicPts coinSet[] = {
|
| {{{72.350448608398438, 27.966041564941406}, {72.58441162109375, 27.861515045166016},
|
| {72.818222045898437, 27.756658554077148}, {73.394996643066406, 27.49799919128418}}},
|
| {{{73.394996643066406, 27.49799919128418}, {72.818222045898437, 27.756658554077148},
|
| @@ -684,8 +696,8 @@ static const SkDCubic coinSet[] = {
|
| static int coinSetCount = (int) SK_ARRAY_COUNT(coinSet);
|
|
|
| static void coinOneOff(skiatest::Reporter* reporter, int index) {
|
| - const SkDCubic& cubic1 = coinSet[index];
|
| - const SkDCubic& cubic2 = coinSet[index + 1];
|
| + const CubicPts& cubic1 = coinSet[index];
|
| + const CubicPts& cubic2 = coinSet[index + 1];
|
| oneOff(reporter, cubic1, cubic2, true);
|
| }
|
|
|
|
|