| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 #include "PathOpsCubicIntersectionTestData.h" | 7 #include "PathOpsCubicIntersectionTestData.h" |
| 8 #include "PathOpsTestCommon.h" | 8 #include "PathOpsTestCommon.h" |
| 9 #include "SkIntersections.h" | 9 #include "SkIntersections.h" |
| 10 #include "SkPathOpsRect.h" | 10 #include "SkPathOpsRect.h" |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 {35.597065061143162, 79.872482633158796}, {75.38634169631932, 18.2448900
38969412}}}, | 152 {35.597065061143162, 79.872482633158796}, {75.38634169631932, 18.2448900
38969412}}}, |
| 153 {{{61.336508189019057, 82.693132843213675}, {44.639380902349664, 54.074825790745
592}, | 153 {{{61.336508189019057, 82.693132843213675}, {44.639380902349664, 54.074825790745
592}, |
| 154 {16.815615499771951, 20.049704667203923}, {41.866884958868326, 56.735503
699973002}}}, | 154 {16.815615499771951, 20.049704667203923}, {41.866884958868326, 56.735503
699973002}}}, |
| 155 | 155 |
| 156 {{{18.1312339, 31.6473732}, {95.5711034, 63.5350219}, {92.3283165, 62.0158945}, | 156 {{{18.1312339, 31.6473732}, {95.5711034, 63.5350219}, {92.3283165, 62.0158945}, |
| 157 {18.5656052, 32.1268808}}}, | 157 {18.5656052, 32.1268808}}}, |
| 158 {{{97.402018, 35.7169972}, {33.1127443, 25.8935163}, {1.13970027, 54.9424981}, | 158 {{{97.402018, 35.7169972}, {33.1127443, 25.8935163}, {1.13970027, 54.9424981}, |
| 159 {56.4860195, 60.529264}}}, | 159 {56.4860195, 60.529264}}}, |
| 160 }; | 160 }; |
| 161 | 161 |
| 162 const size_t testSetCount = SK_ARRAY_COUNT(testSet); | 162 const int testSetCount = (int) SK_ARRAY_COUNT(testSet); |
| 163 | 163 |
| 164 static const SkDCubic newTestSet[] = { | 164 static const SkDCubic newTestSet[] = { |
| 165 {{{275,532}, {277.209137,532}, {279,530.209106}, {279,528}}}, | 165 {{{275,532}, {277.209137,532}, {279,530.209106}, {279,528}}}, |
| 166 {{{278,529}, {278,530.65686}, {276.65686,532}, {275,532}}}, | 166 {{{278,529}, {278,530.65686}, {276.65686,532}, {275,532}}}, |
| 167 | 167 |
| 168 #if 0 // FIXME: asserts coincidence, not working yet | 168 #if 0 // FIXME: asserts coincidence, not working yet |
| 169 {{{195, 785}, {124.30755615234375, 785}, {67, 841.85986328125}, {67, 912}}}, | 169 {{{195, 785}, {124.30755615234375, 785}, {67, 841.85986328125}, {67, 912}}}, |
| 170 {{{67, 913}, {67, 842.30755615234375}, {123.85984039306641, 785}, {194, 785}}}, | 170 {{{67, 913}, {67, 842.30755615234375}, {123.85984039306641, 785}, {194, 785}}}, |
| 171 #endif | 171 #endif |
| 172 | 172 |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 295 {{{1, 2}, {5, 6}, {1, 0}, {1, 0}}}, | 295 {{{1, 2}, {5, 6}, {1, 0}, {1, 0}}}, |
| 296 {{{0, 1}, {0, 1}, {2, 1}, {6, 5}}}, | 296 {{{0, 1}, {0, 1}, {2, 1}, {6, 5}}}, |
| 297 | 297 |
| 298 {{{0, 6}, {1, 2}, {1, 0}, {1, 0}}}, | 298 {{{0, 6}, {1, 2}, {1, 0}, {1, 0}}}, |
| 299 {{{0, 1}, {0, 1}, {6, 0}, {2, 1}}}, | 299 {{{0, 1}, {0, 1}, {6, 0}, {2, 1}}}, |
| 300 | 300 |
| 301 {{{0, 2}, {0, 1}, {3, 0}, {1, 0}}}, | 301 {{{0, 2}, {0, 1}, {3, 0}, {1, 0}}}, |
| 302 {{{0, 3}, {0, 1}, {2, 0}, {1, 0}}}, | 302 {{{0, 3}, {0, 1}, {2, 0}, {1, 0}}}, |
| 303 }; | 303 }; |
| 304 | 304 |
| 305 const size_t newTestSetCount = SK_ARRAY_COUNT(newTestSet); | 305 const int newTestSetCount = (int) SK_ARRAY_COUNT(newTestSet); |
| 306 | 306 |
| 307 static void oneOff(skiatest::Reporter* reporter, const SkDCubic& cubic1, const S
kDCubic& cubic2, | 307 static void oneOff(skiatest::Reporter* reporter, const SkDCubic& cubic1, const S
kDCubic& cubic2, |
| 308 bool coin) { | 308 bool coin) { |
| 309 SkASSERT(ValidCubic(cubic1)); | 309 SkASSERT(ValidCubic(cubic1)); |
| 310 SkASSERT(ValidCubic(cubic2)); | 310 SkASSERT(ValidCubic(cubic2)); |
| 311 #if ONE_OFF_DEBUG | 311 #if ONE_OFF_DEBUG |
| 312 SkDebugf("computed quadratics given\n"); | 312 SkDebugf("computed quadratics given\n"); |
| 313 SkDebugf(" {{%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}},\n"
, | 313 SkDebugf(" {{%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}, {%1.9g,%1.9g}},\n"
, |
| 314 cubic1[0].fX, cubic1[0].fY, cubic1[1].fX, cubic1[1].fY, | 314 cubic1[0].fX, cubic1[0].fY, cubic1[1].fX, cubic1[1].fY, |
| 315 cubic1[2].fX, cubic1[2].fY, cubic1[3].fX, cubic1[3].fY); | 315 cubic1[2].fX, cubic1[2].fY, cubic1[3].fX, cubic1[3].fY); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 oneOff(reporter, cubic1, cubic2, false); | 366 oneOff(reporter, cubic1, cubic2, false); |
| 367 } | 367 } |
| 368 | 368 |
| 369 static void newOneOff(skiatest::Reporter* reporter, int outer, int inner) { | 369 static void newOneOff(skiatest::Reporter* reporter, int outer, int inner) { |
| 370 const SkDCubic& cubic1 = newTestSet[outer]; | 370 const SkDCubic& cubic1 = newTestSet[outer]; |
| 371 const SkDCubic& cubic2 = newTestSet[inner]; | 371 const SkDCubic& cubic2 = newTestSet[inner]; |
| 372 oneOff(reporter, cubic1, cubic2, false); | 372 oneOff(reporter, cubic1, cubic2, false); |
| 373 } | 373 } |
| 374 | 374 |
| 375 static void oneOffTests(skiatest::Reporter* reporter) { | 375 static void oneOffTests(skiatest::Reporter* reporter) { |
| 376 for (size_t outer = 0; outer < testSetCount - 1; ++outer) { | 376 for (int outer = 0; outer < testSetCount - 1; ++outer) { |
| 377 for (size_t inner = outer + 1; inner < testSetCount; ++inner) { | 377 for (int inner = outer + 1; inner < testSetCount; ++inner) { |
| 378 oneOff(reporter, outer, inner); | 378 oneOff(reporter, outer, inner); |
| 379 } | 379 } |
| 380 } | 380 } |
| 381 for (size_t outer = 0; outer < newTestSetCount - 1; ++outer) { | 381 for (int outer = 0; outer < newTestSetCount - 1; ++outer) { |
| 382 for (size_t inner = outer + 1; inner < newTestSetCount; ++inner) { | 382 for (int inner = outer + 1; inner < newTestSetCount; ++inner) { |
| 383 newOneOff(reporter, outer, inner); | 383 newOneOff(reporter, outer, inner); |
| 384 } | 384 } |
| 385 } | 385 } |
| 386 } | 386 } |
| 387 | 387 |
| 388 #define DEBUG_CRASH 0 | 388 #define DEBUG_CRASH 0 |
| 389 | 389 |
| 390 static void CubicIntersection_RandTest(skiatest::Reporter* reporter) { | 390 static void CubicIntersection_RandTest(skiatest::Reporter* reporter) { |
| 391 srand(0); | 391 srand(0); |
| 392 const int tests = 10000000; | 392 const int tests = 10000000; |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 543 static const SkDCubic selfSet[] = { | 543 static const SkDCubic selfSet[] = { |
| 544 {{{2, 3}, {0, 4}, {3, 2}, {5, 3}}}, | 544 {{{2, 3}, {0, 4}, {3, 2}, {5, 3}}}, |
| 545 {{{3, 6}, {2, 3}, {4, 0}, {3, 2}}}, | 545 {{{3, 6}, {2, 3}, {4, 0}, {3, 2}}}, |
| 546 {{{0, 2}, {2, 3}, {5, 1}, {3, 2}}}, | 546 {{{0, 2}, {2, 3}, {5, 1}, {3, 2}}}, |
| 547 {{{0, 2}, {3, 5}, {5, 0}, {4, 2}}}, | 547 {{{0, 2}, {3, 5}, {5, 0}, {4, 2}}}, |
| 548 {{{3.34, 8.98}, {1.95, 10.27}, {3.76, 7.65}, {4.96, 10.64}}}, | 548 {{{3.34, 8.98}, {1.95, 10.27}, {3.76, 7.65}, {4.96, 10.64}}}, |
| 549 {{{3.13, 2.74}, {1.08, 4.62}, {3.71, 0.94}, {2.01, 3.81}}}, | 549 {{{3.13, 2.74}, {1.08, 4.62}, {3.71, 0.94}, {2.01, 3.81}}}, |
| 550 {{{6.71, 3.14}, {7.99, 2.75}, {8.27, 1.96}, {6.35, 3.57}}}, | 550 {{{6.71, 3.14}, {7.99, 2.75}, {8.27, 1.96}, {6.35, 3.57}}}, |
| 551 {{{12.81, 7.27}, {7.22, 6.98}, {12.49, 8.97}, {11.42, 6.18}}}, | 551 {{{12.81, 7.27}, {7.22, 6.98}, {12.49, 8.97}, {11.42, 6.18}}}, |
| 552 }; | 552 }; |
| 553 size_t selfSetCount = SK_ARRAY_COUNT(selfSet); | 553 |
| 554 int selfSetCount = (int) SK_ARRAY_COUNT(selfSet); |
| 554 | 555 |
| 555 static void selfOneOff(skiatest::Reporter* reporter, int index) { | 556 static void selfOneOff(skiatest::Reporter* reporter, int index) { |
| 556 const SkDCubic& cubic = selfSet[index]; | 557 const SkDCubic& cubic = selfSet[index]; |
| 557 #if ONE_OFF_DEBUG | 558 #if ONE_OFF_DEBUG |
| 558 int idx2; | 559 int idx2; |
| 559 double max[3]; | 560 double max[3]; |
| 560 int ts = cubic.findMaxCurvature(max); | 561 int ts = cubic.findMaxCurvature(max); |
| 561 for (idx2 = 0; idx2 < ts; ++idx2) { | 562 for (idx2 = 0; idx2 < ts; ++idx2) { |
| 562 SkDebugf("%s max[%d]=%1.9g (%1.9g, %1.9g)\n", __FUNCTION__, idx2, | 563 SkDebugf("%s max[%d]=%1.9g (%1.9g, %1.9g)\n", __FUNCTION__, idx2, |
| 563 max[idx2], cubic.ptAtT(max[idx2]).fX, cubic.ptAtT(max[idx2]).fY)
; | 564 max[idx2], cubic.ptAtT(max[idx2]).fX, cubic.ptAtT(max[idx2]).fY)
; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 581 REPORTER_ASSERT(reporter, result == 1); | 582 REPORTER_ASSERT(reporter, result == 1); |
| 582 REPORTER_ASSERT(reporter, i.used() == 1); | 583 REPORTER_ASSERT(reporter, i.used() == 1); |
| 583 REPORTER_ASSERT(reporter, !approximately_equal(i[0][0], i[1][0])); | 584 REPORTER_ASSERT(reporter, !approximately_equal(i[0][0], i[1][0])); |
| 584 SkDPoint pt1 = cubic.ptAtT(i[0][0]); | 585 SkDPoint pt1 = cubic.ptAtT(i[0][0]); |
| 585 SkDPoint pt2 = cubic.ptAtT(i[1][0]); | 586 SkDPoint pt2 = cubic.ptAtT(i[1][0]); |
| 586 REPORTER_ASSERT(reporter, pt1.approximatelyEqual(pt2)); | 587 REPORTER_ASSERT(reporter, pt1.approximatelyEqual(pt2)); |
| 587 reporter->bumpTestCount(); | 588 reporter->bumpTestCount(); |
| 588 } | 589 } |
| 589 | 590 |
| 590 static void cubicIntersectionSelfTest(skiatest::Reporter* reporter) { | 591 static void cubicIntersectionSelfTest(skiatest::Reporter* reporter) { |
| 591 size_t firstFail = 0; | 592 int firstFail = 0; |
| 592 for (size_t index = firstFail; index < selfSetCount; ++index) { | 593 for (int index = firstFail; index < selfSetCount; ++index) { |
| 593 selfOneOff(reporter, index); | 594 selfOneOff(reporter, index); |
| 594 } | 595 } |
| 595 } | 596 } |
| 596 | 597 |
| 597 static const SkDCubic coinSet[] = { | 598 static const SkDCubic coinSet[] = { |
| 598 {{{317, 711}, {322.52285766601562, 711}, {327, 715.4771728515625}, {327, 721
}}}, | 599 {{{317, 711}, {322.52285766601562, 711}, {327, 715.4771728515625}, {327, 721
}}}, |
| 599 {{{324.07107543945312, 713.928955078125}, {324.4051513671875, 714.2630004882
8125}, | 600 {{{324.07107543945312, 713.928955078125}, {324.4051513671875, 714.2630004882
8125}, |
| 600 {324.71566772460937, 714.62060546875}, {325, 714.9990234375}}}, | 601 {324.71566772460937, 714.62060546875}, {325, 714.9990234375}}}, |
| 601 | 602 |
| 602 {{{2, 3}, {0, 4}, {3, 2}, {5, 3}}}, | 603 {{{2, 3}, {0, 4}, {3, 2}, {5, 3}}}, |
| 603 {{{2, 3}, {0, 4}, {3, 2}, {5, 3}}}, | 604 {{{2, 3}, {0, 4}, {3, 2}, {5, 3}}}, |
| 604 }; | 605 }; |
| 605 | 606 |
| 606 size_t coinSetCount = SK_ARRAY_COUNT(coinSet); | 607 static int coinSetCount = (int) SK_ARRAY_COUNT(coinSet); |
| 607 | 608 |
| 608 static void coinOneOff(skiatest::Reporter* reporter, int index) { | 609 static void coinOneOff(skiatest::Reporter* reporter, int index) { |
| 609 const SkDCubic& cubic1 = coinSet[index]; | 610 const SkDCubic& cubic1 = coinSet[index]; |
| 610 const SkDCubic& cubic2 = coinSet[index + 1]; | 611 const SkDCubic& cubic2 = coinSet[index + 1]; |
| 611 oneOff(reporter, cubic1, cubic2, true); | 612 oneOff(reporter, cubic1, cubic2, true); |
| 612 } | 613 } |
| 613 | 614 |
| 614 static void cubicIntersectionCoinTest(skiatest::Reporter* reporter) { | 615 static void cubicIntersectionCoinTest(skiatest::Reporter* reporter) { |
| 615 size_t firstFail = 0; | 616 int firstFail = 0; |
| 616 for (size_t index = firstFail; index < coinSetCount; index += 2) { | 617 for (int index = firstFail; index < coinSetCount; index += 2) { |
| 617 coinOneOff(reporter, index); | 618 coinOneOff(reporter, index); |
| 618 } | 619 } |
| 619 } | 620 } |
| 620 | 621 |
| 621 DEF_TEST(PathOpsCubicCoinOneOff, reporter) { | 622 DEF_TEST(PathOpsCubicCoinOneOff, reporter) { |
| 622 coinOneOff(reporter, 0); | 623 coinOneOff(reporter, 0); |
| 623 } | 624 } |
| 624 | 625 |
| 625 DEF_TEST(PathOpsCubicIntersectionOneOff, reporter) { | 626 DEF_TEST(PathOpsCubicIntersectionOneOff, reporter) { |
| 626 newOneOff(reporter, 0, 1); | 627 newOneOff(reporter, 0, 1); |
| 627 } | 628 } |
| 628 | 629 |
| 629 DEF_TEST(PathOpsCubicSelfOneOff, reporter) { | 630 DEF_TEST(PathOpsCubicSelfOneOff, reporter) { |
| 630 selfOneOff(reporter, 0); | 631 selfOneOff(reporter, 0); |
| 631 } | 632 } |
| 632 | 633 |
| 633 DEF_TEST(PathOpsCubicIntersection, reporter) { | 634 DEF_TEST(PathOpsCubicIntersection, reporter) { |
| 634 oneOffTests(reporter); | 635 oneOffTests(reporter); |
| 635 cubicIntersectionSelfTest(reporter); | 636 cubicIntersectionSelfTest(reporter); |
| 636 cubicIntersectionCoinTest(reporter); | 637 cubicIntersectionCoinTest(reporter); |
| 637 standardTestCases(reporter); | 638 standardTestCases(reporter); |
| 638 if (false) CubicIntersection_IntersectionFinder(); | 639 if (false) CubicIntersection_IntersectionFinder(); |
| 639 if (false) CubicIntersection_RandTest(reporter); | 640 if (false) CubicIntersection_RandTest(reporter); |
| 640 } | 641 } |
| OLD | NEW |