| 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 "PathOpsQuadIntersectionTestData.h" | 7 #include "PathOpsQuadIntersectionTestData.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 35 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 46                                 tt2, xy2.fX, xy2.fY); | 46                                 tt2, xy2.fX, xy2.fY); | 
| 47                         REPORTER_ASSERT(reporter, 0); | 47                         REPORTER_ASSERT(reporter, 0); | 
| 48                     } | 48                     } | 
| 49                 } | 49                 } | 
| 50             } | 50             } | 
| 51         } | 51         } | 
| 52     } | 52     } | 
| 53 } | 53 } | 
| 54 | 54 | 
| 55 static const SkDQuad testSet[] = { | 55 static const SkDQuad testSet[] = { | 
|  | 56 {{{4981.9990234375, 1590}, {4981.9990234375, 1617.7523193359375}, {4962.375, 163
     7.3760986328125}}}, | 
|  | 57 {{{4962.3759765625, 1637.3760986328125}, {4982, 1617.7523193359375}, {4982, 1590
     }}}, | 
|  | 58 | 
|  | 59 {{{48.7416f, 7.74160004f}, {96.4831848f, -40}, {164, -40}}}, | 
|  | 60 {{{56.9671326f, 0}, {52.7835083f, 3.69968891f}, {48.7416f, 7.74160004f}}}, | 
|  | 61 | 
|  | 62 {{{138, 80}, {147.15692138671875, 80}, {155.12803649902344, 82.86279296875}}}, | 
|  | 63 {{{155.12803649902344, 82.86279296875}, {153.14971923828125, 82.152290344238281}
     , {151.09841918945312, 81.618133544921875}}}, | 
|  | 64 | 
|  | 65 {{{88, 130}, {88, 131.54483032226562}, {88.081489562988281, 133.0560302734375}}}
     , | 
|  | 66 {{{88.081489562988281, 133.0560302734375}, {88, 131.54483032226562}, {88, 130}}}
     , | 
|  | 67 | 
|  | 68 {{{0.59987992,2.14448452}, {0.775417507,1.95606446}, {1.00564098,1.79310346}}}, | 
|  | 69 {{{1.00564098,1.79310346}, {1.25936198,1.615623}, {1.35901463,1.46834028}}}, | 
|  | 70 | 
|  | 71 {{{3,0}, {0,1}, {3,2}}}, | 
|  | 72 {{{2,0}, {1,1}, {2,2}}}, | 
|  | 73 | 
|  | 74 {{{38.656852722167969, 38.656852722167969}, {38.651023864746094, 38.662681579589
     844}, {38.644744873046875, 38.668937683105469}}}, | 
|  | 75 {{{38.656852722167969, 38.656852722167969}, {36.313709259033203, 41}, {33, 41}}}
     , | 
|  | 76 | 
|  | 77 {{{4914.9990234375, 1523}, {4942.75146484375, 1523}, {4962.375, 1542.62390136718
     75}}}, | 
|  | 78 {{{4962.3759765625, 1542.6239013671875}, {4942.75244140625, 1523}, {4915, 1523}}
     }, | 
|  | 79 | 
|  | 80 {{{4867.623046875, 1637.3760986328125}, {4847.9990234375, 1617.7523193359375}, {
     4847.9990234375, 1590}}}, | 
|  | 81 {{{4848, 1590}, {4848, 1617.7523193359375}, {4867.6240234375, 1637.3760986328125
     }}}, | 
|  | 82 | 
|  | 83 {{{102.64466094970703, 165.3553466796875}, {110.79246520996094, 173.503143310546
     87}, {120.81797790527344, 177.11778259277344}}}, | 
|  | 84 {{{113.232177734375, 173.57899475097656}, {116.88026428222656, 175.6980590820312
     5}, {120.81797790527344, 177.11778259277344}}}, | 
|  | 85 | 
| 56 {{{-37.3484879,10.0192947}, {-36.4966316,13.2140198}, {-38.1506348,16.0788383}}}
     , | 86 {{{-37.3484879,10.0192947}, {-36.4966316,13.2140198}, {-38.1506348,16.0788383}}}
     , | 
| 57 {{{-38.1462746,16.08918}, {-36.4904327,13.2193804}, {-37.3484879,10.0192947}}}, | 87 {{{-38.1462746,16.08918}, {-36.4904327,13.2193804}, {-37.3484879,10.0192947}}}, | 
| 58 | 88 | 
| 59 {{{-37.3513985,10.0082998}, {-36.4938011,13.2090998}, {-38.1506004,16.0788002}}}
     , | 89 {{{-37.3513985,10.0082998}, {-36.4938011,13.2090998}, {-38.1506004,16.0788002}}}
     , | 
| 60 {{{-37.3508987,10.0102997}, {-36.4930992,13.2110004}, {-38.1497993,16.0809002}}}
     , | 90 {{{-37.3508987,10.0102997}, {-36.4930992,13.2110004}, {-38.1497993,16.0809002}}}
     , | 
| 61 | 91 | 
| 62 {{{-37.3508987,10.0102997}, {-37.3510017,10.0098}, {-37.3512001,10.0093002}}}, | 92 {{{-37.3508987,10.0102997}, {-37.3510017,10.0098}, {-37.3512001,10.0093002}}}, | 
| 63 {{{-49.0778008,19.0097008}, {-38.2086983,6.80954981}, {-37.3508987,10.0102997}}}
     , | 93 {{{-49.0778008,19.0097008}, {-38.2086983,6.80954981}, {-37.3508987,10.0102997}}}
     , | 
| 64 | 94 | 
| 65 {{{SkBits2Float(0xc22423b2), SkBits2Float(0x40afae2c)}, | 95 {{{SkBits2Float(0xc22423b2), SkBits2Float(0x40afae2c)}, | 
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 313 | 343 | 
| 314 static void oneOffTests(skiatest::Reporter* reporter) { | 344 static void oneOffTests(skiatest::Reporter* reporter) { | 
| 315     for (size_t outer = 0; outer < testSetCount - 1; ++outer) { | 345     for (size_t outer = 0; outer < testSetCount - 1; ++outer) { | 
| 316         for (size_t inner = outer + 1; inner < testSetCount; ++inner) { | 346         for (size_t inner = outer + 1; inner < testSetCount; ++inner) { | 
| 317             oneOffTest1(reporter, outer, inner); | 347             oneOffTest1(reporter, outer, inner); | 
| 318         } | 348         } | 
| 319     } | 349     } | 
| 320 } | 350 } | 
| 321 | 351 | 
| 322 static const SkDQuad coincidentTestSet[] = { | 352 static const SkDQuad coincidentTestSet[] = { | 
|  | 353     {{{4914.9990234375, 1523}, {4942.75146484375, 1523}, {4962.375, 1542.6239013
     671875}}}, | 
|  | 354     {{{4962.3759765625, 1542.6239013671875}, {4942.75244140625, 1523}, {4915, 15
     23}}}, | 
| 323 #if 0 | 355 #if 0 | 
| 324     {{{97.9337615966796875,100}, {88,112.94264984130859375}, {88,130}}}, | 356     {{{97.9337615966796875,100}, {88,112.94264984130859375}, {88,130}}}, | 
| 325     {{{88,130}, {88,124.80951690673828125}, {88.91983795166015625,120}}}, | 357     {{{88,130}, {88,124.80951690673828125}, {88.91983795166015625,120}}}, | 
| 326 #endif | 358 #endif | 
| 327     {{{369.850525, 145.675964}, {382.362915, 121.29287}, {406.211273, 121.29287}
     }}, | 359     {{{369.850525, 145.675964}, {382.362915, 121.29287}, {406.211273, 121.29287}
     }}, | 
| 328     {{{369.850525, 145.675964}, {382.362915, 121.29287}, {406.211273, 121.29287}
     }}, | 360     {{{369.850525, 145.675964}, {382.362915, 121.29287}, {406.211273, 121.29287}
     }}, | 
| 329     {{{8, 8}, {10, 10}, {8, -10}}}, | 361     {{{8, 8}, {10, 10}, {8, -10}}}, | 
| 330     {{{8, -10}, {10, 10}, {8, 8}}}, | 362     {{{8, -10}, {10, 10}, {8, 8}}}, | 
| 331 }; | 363 }; | 
| 332 | 364 | 
| 333 static const int coincidentTestSetCount = (int) SK_ARRAY_COUNT(coincidentTestSet
     ); | 365 static const int coincidentTestSetCount = (int) SK_ARRAY_COUNT(coincidentTestSet
     ); | 
| 334 | 366 | 
| 335 static void coincidentTestOne(skiatest::Reporter* reporter, int test1, int test2
     ) { | 367 static void coincidentTestOne(skiatest::Reporter* reporter, int test1, int test2
     ) { | 
| 336     const SkDQuad& quad1 = coincidentTestSet[test1]; | 368     const SkDQuad& quad1 = coincidentTestSet[test1]; | 
| 337     SkASSERT(ValidQuad(quad1)); | 369     SkASSERT(ValidQuad(quad1)); | 
| 338     const SkDQuad& quad2 = coincidentTestSet[test2]; | 370     const SkDQuad& quad2 = coincidentTestSet[test2]; | 
| 339     SkASSERT(ValidQuad(quad2)); | 371     SkASSERT(ValidQuad(quad2)); | 
| 340     SkIntersections intersections2; | 372     SkIntersections intersections2; | 
| 341     intersections2.intersect(quad1, quad2); | 373     intersections2.intersect(quad1, quad2); | 
| 342     REPORTER_ASSERT(reporter, intersections2.coincidentUsed() == 2); | 374     REPORTER_ASSERT(reporter, intersections2.coincidentUsed() >= 2); | 
| 343     REPORTER_ASSERT(reporter, intersections2.used() == 2); | 375     REPORTER_ASSERT(reporter, intersections2.used() >= 2); | 
| 344     for (int pt = 0; pt < intersections2.coincidentUsed(); ++pt) { | 376     for (int pt = 0; pt < intersections2.coincidentUsed(); pt += 2) { | 
| 345         double tt1 = intersections2[0][pt]; | 377         double tt1 = intersections2[0][pt]; | 
| 346         double tt2 = intersections2[1][pt]; | 378         double tt2 = intersections2[1][pt]; | 
| 347         SkDPoint pt1 = quad1.ptAtT(tt1); | 379         SkDPoint pt1 = quad1.ptAtT(tt1); | 
| 348         SkDPoint pt2 = quad2.ptAtT(tt2); | 380         SkDPoint pt2 = quad2.ptAtT(tt2); | 
| 349         REPORTER_ASSERT(reporter, pt1.approximatelyEqual(pt2)); | 381         REPORTER_ASSERT(reporter, pt1.approximatelyEqual(pt2)); | 
| 350     } | 382     } | 
| 351 } | 383 } | 
| 352 | 384 | 
| 353 static void coincidentTest(skiatest::Reporter* reporter) { | 385 static void coincidentTest(skiatest::Reporter* reporter) { | 
| 354     for (int testIndex = 0; testIndex < coincidentTestSetCount - 1; testIndex +=
      2) { | 386     for (int testIndex = 0; testIndex < coincidentTestSetCount - 1; testIndex +=
      2) { | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
| 383     for (int index = 0; index < 3; ++index) { | 415     for (int index = 0; index < 3; ++index) { | 
| 384         double t = q1.nearestT(q2[index]); | 416         double t = q1.nearestT(q2[index]); | 
| 385         SkDPoint onQuad = q1.ptAtT(t); | 417         SkDPoint onQuad = q1.ptAtT(t); | 
| 386         SkDebugf("%s t=%1.9g (%1.9g,%1.9g) dist=%1.9g\n", __FUNCTION__, t, onQua
     d.fX, onQuad.fY, | 418         SkDebugf("%s t=%1.9g (%1.9g,%1.9g) dist=%1.9g\n", __FUNCTION__, t, onQua
     d.fX, onQuad.fY, | 
| 387                 onQuad.distance(q2[index])); | 419                 onQuad.distance(q2[index])); | 
| 388         double left[3]; | 420         double left[3]; | 
| 389         left[0] = ((const SkDLine&) q1[0]).isLeft(q2[index]); | 421         left[0] = ((const SkDLine&) q1[0]).isLeft(q2[index]); | 
| 390         left[1] = ((const SkDLine&) q1[1]).isLeft(q2[index]); | 422         left[1] = ((const SkDLine&) q1[1]).isLeft(q2[index]); | 
| 391         SkDLine diag = {{q1[0], q1[2]}}; | 423         SkDLine diag = {{q1[0], q1[2]}}; | 
| 392         left[2] = diag.isLeft(q2[index]); | 424         left[2] = diag.isLeft(q2[index]); | 
| 393         SkDebugf("%s left=(%d, %d, %d) inHull=%s\n", __FUNCTION__, floatSign(lef
     t[0]), | 425         SkDebugf("%s left=(%d, %d, %d)\n", __FUNCTION__, floatSign(left[0]), | 
| 394                 floatSign(left[1]), floatSign(left[2]), | 426                 floatSign(left[1]), floatSign(left[2])); | 
| 395                 q1.pointInHull(q2[index]) ? "true" : "false"); |  | 
| 396     } | 427     } | 
| 397     SkDebugf("\n"); | 428     SkDebugf("\n"); | 
| 398 } | 429 } | 
| 399 | 430 | 
| 400 static void hullIntersect(const SkDQuad& q1, const SkDQuad& q2) { | 431 static void hullIntersect(const SkDQuad& q1, const SkDQuad& q2) { | 
| 401     SkDebugf("%s", __FUNCTION__); | 432     SkDebugf("%s", __FUNCTION__); | 
| 402     SkIntersections ts; | 433     SkIntersections ts; | 
| 403     for (int i1 = 0; i1 < 3; ++i1) { | 434     for (int i1 = 0; i1 < 3; ++i1) { | 
| 404         SkDLine l1 = {{q1[i1], q1[(i1 + 1) % 3]}}; | 435         SkDLine l1 = {{q1[i1], q1[(i1 + 1) % 3]}}; | 
| 405         for (int i2 = 0; i2 < 3; ++i2) { | 436         for (int i2 = 0; i2 < 3; ++i2) { | 
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 512     SkDPoint p22 = quad2.ptAtT(t22); | 543     SkDPoint p22 = quad2.ptAtT(t22); | 
| 513     SkDebugf("%s p2=(%1.9g,%1.9g)<(%1.9g,%1.9g)<(%1.9g,%1.9g)\n", __FUNCTION__, | 544     SkDebugf("%s p2=(%1.9g,%1.9g)<(%1.9g,%1.9g)<(%1.9g,%1.9g)\n", __FUNCTION__, | 
| 514         p20.fX, p20.fY, p2Seed.fX, p2Seed.fY, p22.fX, p22.fY); | 545         p20.fX, p20.fY, p2Seed.fX, p2Seed.fY, p22.fX, p22.fY); | 
| 515 #endif | 546 #endif | 
| 516 } | 547 } | 
| 517 | 548 | 
| 518 static void QuadraticIntersection_IntersectionFinder() { | 549 static void QuadraticIntersection_IntersectionFinder() { | 
| 519     intersectionFinder(0, 1); | 550     intersectionFinder(0, 1); | 
| 520 } | 551 } | 
| 521 | 552 | 
|  | 553 DEF_TEST(PathOpsQuadIntersectionOneOff, reporter) { | 
|  | 554     oneOffTest1(reporter, 10, 11); | 
|  | 555 } | 
|  | 556 | 
|  | 557 DEF_TEST(PathOpsQuadIntersectionCoincidenceOneOff, reporter) { | 
|  | 558     coincidentTestOne(reporter, 0, 1); | 
|  | 559 } | 
|  | 560 | 
| 522 DEF_TEST(PathOpsQuadIntersection, reporter) { | 561 DEF_TEST(PathOpsQuadIntersection, reporter) { | 
| 523     oneOffTests(reporter); | 562     oneOffTests(reporter); | 
| 524     coincidentTest(reporter); | 563     coincidentTest(reporter); | 
| 525     standardTestCases(reporter); | 564     standardTestCases(reporter); | 
| 526     if (false) QuadraticIntersection_IntersectionFinder(); | 565     if (false) QuadraticIntersection_IntersectionFinder(); | 
| 527     if (false) QuadraticIntersection_PointFinder(); | 566     if (false) QuadraticIntersection_PointFinder(); | 
| 528 } | 567 } | 
| 529 | 568 | 
| 530 DEF_TEST(PathOpsQuadIntersectionCoincidenceOneOff, reporter) { | 569 #include "SkCommonFlags.h" | 
| 531     coincidentTestOne(reporter, 0, 1); | 570 | 
|  | 571 DEF_TEST(PathOpsQuadBinaryProfile, reporter) { | 
|  | 572     if (!FLAGS_veryVerbose) { | 
|  | 573             return; | 
|  | 574     } | 
|  | 575     SkIntersections intersections; | 
|  | 576     for (int x = 0; x < 100; ++x) { | 
|  | 577         int outer = 0; | 
|  | 578         int inner = outer + 1; | 
|  | 579         do { | 
|  | 580             const SkDQuad& quad1 = testSet[outer]; | 
|  | 581             const SkDQuad& quad2 = testSet[inner]; | 
|  | 582             (void) intersections.intersect(quad1, quad2); | 
|  | 583             REPORTER_ASSERT(reporter, intersections.used() >= 0);  // make sure 
     code isn't tossed | 
|  | 584             inner += 2; | 
|  | 585             outer += 2; | 
|  | 586         } while (outer < (int) testSetCount); | 
|  | 587     } | 
|  | 588     for (int x = 0; x < 100; ++x) { | 
|  | 589         for (size_t test = 0; test < quadraticTests_count; ++test) { | 
|  | 590             const SkDQuad& quad1 = quadraticTests[test][0]; | 
|  | 591             const SkDQuad& quad2 = quadraticTests[test][1]; | 
|  | 592             (void) intersections.intersect(quad1, quad2); | 
|  | 593             REPORTER_ASSERT(reporter, intersections.used() >= 0);  // make sure 
     code isn't tossed | 
|  | 594         } | 
|  | 595     } | 
| 532 } | 596 } | 
| 533 |  | 
| 534 DEF_TEST(PathOpsQuadIntersectionOneOff, reporter) { |  | 
| 535     oneOffTest1(reporter, 0, 1); |  | 
| 536 } |  | 
| OLD | NEW | 
|---|