OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 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 "PathOpsTestCommon.h" | 7 #include "PathOpsTestCommon.h" |
8 #include "SkIntersections.h" | 8 #include "SkIntersections.h" |
9 #include "SkOpContour.h" | 9 #include "SkOpContour.h" |
10 #include "SkOpSegment.h" | 10 #include "SkOpSegment.h" |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 REPORTER_ASSERT(reporter, t >= 0 && t <= 1); | 70 REPORTER_ASSERT(reporter, t >= 0 && t <= 1); |
71 return i[1][smallest]; | 71 return i[1][smallest]; |
72 } | 72 } |
73 | 73 |
74 static void orderQuads(skiatest::Reporter* reporter, const SkDQuad& quad, double
radius, | 74 static void orderQuads(skiatest::Reporter* reporter, const SkDQuad& quad, double
radius, |
75 SkTArray<double, false>* tArray) { | 75 SkTArray<double, false>* tArray) { |
76 double r = radius; | 76 double r = radius; |
77 double s = r * SK_ScalarTanPIOver8; | 77 double s = r * SK_ScalarTanPIOver8; |
78 double m = r * SK_ScalarRoot2Over2; | 78 double m = r * SK_ScalarRoot2Over2; |
79 // construct circle from quads | 79 // construct circle from quads |
80 const SkDQuad circle[8] = {{{{ r, 0}, { r, -s}, { m, -m}}}, | 80 const QuadPts circle[8] = {{{{ r, 0}, { r, -s}, { m, -m}}}, |
81 {{{ m, -m}, { s, -r}, { 0, -r}}}, | 81 {{{ m, -m}, { s, -r}, { 0, -r}}}, |
82 {{{ 0, -r}, {-s, -r}, {-m, -m}}}, | 82 {{{ 0, -r}, {-s, -r}, {-m, -m}}}, |
83 {{{-m, -m}, {-r, -s}, {-r, 0}}}, | 83 {{{-m, -m}, {-r, -s}, {-r, 0}}}, |
84 {{{-r, 0}, {-r, s}, {-m, m}}}, | 84 {{{-r, 0}, {-r, s}, {-m, m}}}, |
85 {{{-m, m}, {-s, r}, { 0, r}}}, | 85 {{{-m, m}, {-s, r}, { 0, r}}}, |
86 {{{ 0, r}, { s, r}, { m, m}}}, | 86 {{{ 0, r}, { s, r}, { m, m}}}, |
87 {{{ m, m}, { r, s}, { r, 0}}}}; | 87 {{{ m, m}, { r, s}, { r, 0}}}}; |
88 for (int octant = 0; octant < 8; ++octant) { | 88 for (int octant = 0; octant < 8; ++octant) { |
89 double t = testArc(reporter, quad, circle[octant], octant); | 89 SkDQuad cQuad; |
| 90 cQuad.debugSet(circle[octant].fPts); |
| 91 double t = testArc(reporter, quad, cQuad, octant); |
90 if (t < 0) { | 92 if (t < 0) { |
91 continue; | 93 continue; |
92 } | 94 } |
93 for (int index = 0; index < tArray->count(); ++index) { | 95 for (int index = 0; index < tArray->count(); ++index) { |
94 double matchT = (*tArray)[index]; | 96 double matchT = (*tArray)[index]; |
95 if (approximately_equal(t, matchT)) { | 97 if (approximately_equal(t, matchT)) { |
96 goto next; | 98 goto next; |
97 } | 99 } |
98 } | 100 } |
99 tArray->push_back(t); | 101 tArray->push_back(t); |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 *upperRange = tRange; | 327 *upperRange = tRange; |
326 } | 328 } |
327 if (lowerRange->tMin > tRange.tMin) { | 329 if (lowerRange->tMin > tRange.tMin) { |
328 *lowerRange = tRange; | 330 *lowerRange = tRange; |
329 } | 331 } |
330 } | 332 } |
331 r += stepUp ? rStep : -rStep; | 333 r += stepUp ? rStep : -rStep; |
332 rStep /= 2; | 334 rStep /= 2; |
333 } while (rStep > FLT_EPSILON); | 335 } while (rStep > FLT_EPSILON); |
334 if (bestCCW < 0) { | 336 if (bestCCW < 0) { |
| 337 if (bestR >= maxRadius) { |
| 338 SkDebugf(""); |
| 339 } |
335 REPORTER_ASSERT(reporter, bestR < maxRadius); | 340 REPORTER_ASSERT(reporter, bestR < maxRadius); |
336 return false; | 341 return false; |
337 } | 342 } |
338 double lastHighR = bestR; | 343 double lastHighR = bestR; |
339 r = bestR / 2; | 344 r = bestR / 2; |
340 rStep = r / 2; | 345 rStep = r / 2; |
341 do { // find lower bounds of single result | 346 do { // find lower bounds of single result |
342 TRange tRange; | 347 TRange tRange; |
343 bool success = orderTRange(reporter, quad1, quad2, r, &tRange); | 348 bool success = orderTRange(reporter, quad1, quad2, r, &tRange); |
344 if (success) { | 349 if (success) { |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
548 PathOpsAngleTester::EndsIntersect(*seg1->debugLastAngle(), | 553 PathOpsAngleTester::EndsIntersect(*seg1->debugLastAngle(), |
549 *seg2->debugLastAngle()); | 554 *seg2->debugLastAngle()); |
550 SkASSERT(realEnds == (firstInside ? 1 : 0)); | 555 SkASSERT(realEnds == (firstInside ? 1 : 0)); |
551 } | 556 } |
552 bruteForce(reporter, quad1, quad2, firstInside); | 557 bruteForce(reporter, quad1, quad2, firstInside); |
553 } | 558 } |
554 | 559 |
555 DEF_TEST(PathOpsAngleOverlapHullsOne, reporter) { | 560 DEF_TEST(PathOpsAngleOverlapHullsOne, reporter) { |
556 SkChunkAlloc allocator(4096); | 561 SkChunkAlloc allocator(4096); |
557 // gPathOpsAngleIdeasVerbose = true; | 562 // gPathOpsAngleIdeasVerbose = true; |
558 const SkDQuad quads[] = { | 563 const QuadPts quads[] = { |
559 {{{939.4808349609375, 914.355224609375}, {-357.7921142578125, 590.842529296875},
{736.8936767578125, -350.717529296875}}}, | 564 {{{939.4808349609375, 914.355224609375}, {-357.7921142578125, 590.842529296875},
{736.8936767578125, -350.717529296875}}}, |
560 {{{939.4808349609375, 914.355224609375}, {-182.85418701171875, 634.4552001953125
}, {-509.62615966796875, 576.1182861328125}}} | 565 {{{939.4808349609375, 914.355224609375}, {-182.85418701171875, 634.4552001953125
}, {-509.62615966796875, 576.1182861328125}}} |
561 }; | 566 }; |
562 for (int index = 0; index < (int) SK_ARRAY_COUNT(quads); index += 2) { | 567 for (int index = 0; index < (int) SK_ARRAY_COUNT(quads); index += 2) { |
563 testQuadAngles(reporter, quads[index], quads[index + 1], 0, &allocator); | 568 SkDQuad quad0, quad1; |
| 569 quad0.debugSet(quads[index].fPts); |
| 570 quad1.debugSet(quads[index + 1].fPts); |
| 571 testQuadAngles(reporter, quad0, quad1, 0, &allocator); |
564 } | 572 } |
565 } | 573 } |
566 | 574 |
567 DEF_TEST(PathOpsAngleOverlapHulls, reporter) { | 575 DEF_TEST(PathOpsAngleOverlapHulls, reporter) { |
568 SkChunkAlloc allocator(4096); | 576 SkChunkAlloc allocator(4096); |
569 if (!gPathOpsAngleIdeasVerbose) { // takes a while to run -- so exclude it
by default | 577 if (!gPathOpsAngleIdeasVerbose) { // takes a while to run -- so exclude it
by default |
570 return; | 578 return; |
571 } | 579 } |
572 SkRandom ran; | 580 SkRandom ran; |
573 for (int index = 0; index < 100000; ++index) { | 581 for (int index = 0; index < 100000; ++index) { |
574 if (index % 1000 == 999) SkDebugf("."); | 582 if (index % 1000 == 999) SkDebugf("."); |
575 SkDPoint origin = {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-1000, 10
00)}; | 583 SkDPoint origin = {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-1000, 10
00)}; |
576 SkDQuad quad1 = {{origin, {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-
1000, 1000)}, | 584 QuadPts quad1 = {{origin, {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-
1000, 1000)}, |
577 {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-1000, 1000)}}}; | 585 {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-1000, 1000)}}}; |
578 if (quad1[0] == quad1[2]) { | 586 if (quad1.fPts[0] == quad1.fPts[2]) { |
579 continue; | 587 continue; |
580 } | 588 } |
581 SkDQuad quad2 = {{origin, {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-
1000, 1000)}, | 589 QuadPts quad2 = {{origin, {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-
1000, 1000)}, |
582 {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-1000, 1000)}}}; | 590 {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-1000, 1000)}}}; |
583 if (quad2[0] == quad2[2]) { | 591 if (quad2.fPts[0] == quad2.fPts[2]) { |
584 continue; | 592 continue; |
585 } | 593 } |
586 SkIntersections i; | 594 SkIntersections i; |
587 i.intersect(quad1, quad2); | 595 SkDQuad q1, q2; |
| 596 q1.debugSet(quad1.fPts); |
| 597 q2.debugSet(quad2.fPts); |
| 598 i.intersect(q1, q2); |
588 REPORTER_ASSERT(reporter, i.used() >= 1); | 599 REPORTER_ASSERT(reporter, i.used() >= 1); |
589 if (i.used() > 1) { | 600 if (i.used() > 1) { |
590 continue; | 601 continue; |
591 } | 602 } |
592 testQuadAngles(reporter, quad1, quad2, index, &allocator); | 603 testQuadAngles(reporter, q1, q2, index, &allocator); |
593 } | 604 } |
594 } | 605 } |
595 | 606 |
596 DEF_TEST(PathOpsAngleBruteT, reporter) { | 607 DEF_TEST(PathOpsAngleBruteT, reporter) { |
597 if (!gPathOpsAngleIdeasVerbose) { // takes a while to run -- so exclude it
by default | 608 if (!gPathOpsAngleIdeasVerbose) { // takes a while to run -- so exclude it
by default |
598 return; | 609 return; |
599 } | 610 } |
600 SkRandom ran; | 611 SkRandom ran; |
601 double smaller = SK_Scalar1; | 612 double smaller = SK_Scalar1; |
602 SkDQuad small[2]; | 613 SkDQuad small[2]; |
603 SkDEBUGCODE(int smallIndex); | 614 SkDEBUGCODE(int smallIndex); |
604 for (int index = 0; index < 100000; ++index) { | 615 for (int index = 0; index < 100000; ++index) { |
605 SkDPoint origin = {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-1000, 10
00)}; | 616 SkDPoint origin = {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-1000, 10
00)}; |
606 SkDQuad quad1 = {{origin, {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-
1000, 1000)}, | 617 QuadPts quad1 = {{origin, {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-
1000, 1000)}, |
607 {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-1000, 1000)}}}; | 618 {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-1000, 1000)}}}; |
608 if (quad1[0] == quad1[2]) { | 619 if (quad1.fPts[0] == quad1.fPts[2]) { |
609 continue; | 620 continue; |
610 } | 621 } |
611 SkDQuad quad2 = {{origin, {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-
1000, 1000)}, | 622 QuadPts quad2 = {{origin, {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-
1000, 1000)}, |
612 {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-1000, 1000)}}}; | 623 {ran.nextRangeF(-1000, 1000), ran.nextRangeF(-1000, 1000)}}}; |
613 if (quad2[0] == quad2[2]) { | 624 if (quad2.fPts[0] == quad2.fPts[2]) { |
614 continue; | 625 continue; |
615 } | 626 } |
| 627 SkDQuad q1, q2; |
| 628 q1.debugSet(quad1.fPts); |
| 629 q2.debugSet(quad2.fPts); |
616 SkIntersections i; | 630 SkIntersections i; |
617 i.intersect(quad1, quad2); | 631 i.intersect(q1, q2); |
618 REPORTER_ASSERT(reporter, i.used() >= 1); | 632 REPORTER_ASSERT(reporter, i.used() >= 1); |
619 if (i.used() > 1) { | 633 if (i.used() > 1) { |
620 continue; | 634 continue; |
621 } | 635 } |
622 TRange lowerRange, upperRange; | 636 TRange lowerRange, upperRange; |
623 bool result = bruteMinT(reporter, quad1, quad2, &lowerRange, &upperRange
); | 637 bool result = bruteMinT(reporter, q1, q2, &lowerRange, &upperRange); |
624 REPORTER_ASSERT(reporter, result); | 638 REPORTER_ASSERT(reporter, result); |
625 double min = SkTMin(upperRange.t1, upperRange.t2); | 639 double min = SkTMin(upperRange.t1, upperRange.t2); |
626 if (smaller > min) { | 640 if (smaller > min) { |
627 small[0] = quad1; | 641 small[0] = q1; |
628 small[1] = quad2; | 642 small[1] = q2; |
629 SkDEBUGCODE(smallIndex = index); | 643 SkDEBUGCODE(smallIndex = index); |
630 smaller = min; | 644 smaller = min; |
631 } | 645 } |
632 } | 646 } |
633 #ifdef SK_DEBUG | 647 #ifdef SK_DEBUG |
634 DumpQ(small[0], small[1], smallIndex); | 648 DumpQ(small[0], small[1], smallIndex); |
635 #endif | 649 #endif |
636 } | 650 } |
637 | 651 |
638 DEF_TEST(PathOpsAngleBruteTOne, reporter) { | 652 DEF_TEST(PathOpsAngleBruteTOne, reporter) { |
639 // gPathOpsAngleIdeasVerbose = true; | 653 // gPathOpsAngleIdeasVerbose = true; |
640 const SkDQuad quads[] = { | 654 const QuadPts qPts[] = { |
641 {{{-770.8492431640625, 948.2369384765625}, {-853.37066650390625, 972.03015136718
75}, {-200.62042236328125, -26.7174072265625}}}, | 655 {{{-770.8492431640625, 948.2369384765625}, {-853.37066650390625, 972.03015136718
75}, {-200.62042236328125, -26.7174072265625}}}, |
642 {{{-770.8492431640625, 948.2369384765625}, {513.602783203125, 578.8681640625}, {
960.641357421875, -813.69757080078125}}}, | 656 {{{-770.8492431640625, 948.2369384765625}, {513.602783203125, 578.8681640625}, {
960.641357421875, -813.69757080078125}}}, |
643 {{{563.8267822265625, -107.4566650390625}, {-44.67724609375, -136.57452392578125
}, {492.3856201171875, -268.79644775390625}}}, | 657 {{{563.8267822265625, -107.4566650390625}, {-44.67724609375, -136.57452392578125
}, {492.3856201171875, -268.79644775390625}}}, |
644 {{{563.8267822265625, -107.4566650390625}, {708.049072265625, -100.7778930664062
5}, {-48.88226318359375, 967.9022216796875}}}, | 658 {{{563.8267822265625, -107.4566650390625}, {708.049072265625, -100.7778930664062
5}, {-48.88226318359375, 967.9022216796875}}}, |
645 {{{598.857421875, 846.345458984375}, {-644.095703125, -316.12921142578125}, {-97
.64599609375, 20.6158447265625}}}, | 659 {{{598.857421875, 846.345458984375}, {-644.095703125, -316.12921142578125}, {-97
.64599609375, 20.6158447265625}}}, |
646 {{{598.857421875, 846.345458984375}, {715.7142333984375, 955.3599853515625}, {-9
19.9478759765625, 691.611328125}}}, | 660 {{{598.857421875, 846.345458984375}, {715.7142333984375, 955.3599853515625}, {-9
19.9478759765625, 691.611328125}}}, |
647 }; | 661 }; |
648 TRange lowerRange, upperRange; | 662 TRange lowerRange, upperRange; |
| 663 SkDQuad quads[SK_ARRAY_COUNT(qPts)]; |
| 664 for (int index = 0; index < (int) SK_ARRAY_COUNT(qPts); ++index) { |
| 665 quads[index].debugSet(qPts[index].fPts); |
| 666 } |
649 bruteMinT(reporter, quads[0], quads[1], &lowerRange, &upperRange); | 667 bruteMinT(reporter, quads[0], quads[1], &lowerRange, &upperRange); |
650 bruteMinT(reporter, quads[2], quads[3], &lowerRange, &upperRange); | 668 bruteMinT(reporter, quads[2], quads[3], &lowerRange, &upperRange); |
651 bruteMinT(reporter, quads[4], quads[5], &lowerRange, &upperRange); | 669 bruteMinT(reporter, quads[4], quads[5], &lowerRange, &upperRange); |
652 } | 670 } |
653 | 671 |
654 /* | 672 /* |
655 The sorting problem happens when the inital tangents are not a true indicator of
the curve direction | 673 The sorting problem happens when the inital tangents are not a true indicator of
the curve direction |
656 Nearly always, the initial tangents do give the right answer, | 674 Nearly always, the initial tangents do give the right answer, |
657 so the trick is to figure out when the initial tangent cannot be trusted. | 675 so the trick is to figure out when the initial tangent cannot be trusted. |
658 If the convex hulls of both curves are in the same half plane, and not overlappi
ng, sorting the | 676 If the convex hulls of both curves are in the same half plane, and not overlappi
ng, sorting the |
659 hulls is enough. | 677 hulls is enough. |
660 If the hulls overlap, and have the same general direction, then intersect the sh
orter end point ray | 678 If the hulls overlap, and have the same general direction, then intersect the sh
orter end point ray |
661 with the opposing curve, and see on which side of the shorter curve the opposing
intersection lies. | 679 with the opposing curve, and see on which side of the shorter curve the opposing
intersection lies. |
662 Otherwise, if the control vector is extremely short, likely the point on curve m
ust be computed | 680 Otherwise, if the control vector is extremely short, likely the point on curve m
ust be computed |
663 If moving the control point slightly can change the sign of the cross product, e
ither answer could | 681 If moving the control point slightly can change the sign of the cross product, e
ither answer could |
664 be "right". | 682 be "right". |
665 We need to determine how short is extremely short. Move the control point a set
percentage of | 683 We need to determine how short is extremely short. Move the control point a set
percentage of |
666 the largest length to determine how stable the curve is vis-a-vis the initial ta
ngent. | 684 the largest length to determine how stable the curve is vis-a-vis the initial ta
ngent. |
667 */ | 685 */ |
668 | 686 |
669 static const SkDQuad extremeTests[][2] = { | 687 static const QuadPts extremeTests[][2] = { |
670 { | 688 { |
671 {{{-708.0077926931004,-154.61669472244046}, | 689 {{{-708.0077926931004,-154.61669472244046}, |
672 {-707.9234268635319,-154.30459999551294}, | 690 {-707.9234268635319,-154.30459999551294}, |
673 {505.58447265625,-504.9130859375}}}, | 691 {505.58447265625,-504.9130859375}}}, |
674 {{{-708.0077926931004,-154.61669472244046}, | 692 {{{-708.0077926931004,-154.61669472244046}, |
675 {-711.127526325141,-163.9446090624656}, | 693 {-711.127526325141,-163.9446090624656}, |
676 {-32.39227294921875,-906.3277587890625}}}, | 694 {-32.39227294921875,-906.3277587890625}}}, |
677 }, { | 695 }, { |
678 {{{-708.0077926931004,-154.61669472244046}, | 696 {{{-708.0077926931004,-154.61669472244046}, |
679 {-708.2875337527566,-154.36676458635623}, | 697 {-708.2875337527566,-154.36676458635623}, |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
786 SkDVector m2 = mid2 - q2[0]; | 804 SkDVector m2 = mid2 - q2[0]; |
787 REPORTER_ASSERT(reporter, ccw ? m1.crossCheck(m2) < 0 : m1.crossCheck(m2) >
0); | 805 REPORTER_ASSERT(reporter, ccw ? m1.crossCheck(m2) < 0 : m1.crossCheck(m2) >
0); |
788 } | 806 } |
789 | 807 |
790 DEF_TEST(PathOpsAngleExtreme, reporter) { | 808 DEF_TEST(PathOpsAngleExtreme, reporter) { |
791 if (!gPathOpsAngleIdeasVerbose) { // takes a while to run -- so exclude it
by default | 809 if (!gPathOpsAngleIdeasVerbose) { // takes a while to run -- so exclude it
by default |
792 return; | 810 return; |
793 } | 811 } |
794 double maxR = SK_ScalarMax; | 812 double maxR = SK_ScalarMax; |
795 for (int index = 0; index < (int) SK_ARRAY_COUNT(extremeTests); ++index) { | 813 for (int index = 0; index < (int) SK_ARRAY_COUNT(extremeTests); ++index) { |
796 const SkDQuad& quad1 = extremeTests[index][0]; | 814 const QuadPts& qu1 = extremeTests[index][0]; |
797 const SkDQuad& quad2 = extremeTests[index][1]; | 815 const QuadPts& qu2 = extremeTests[index][1]; |
| 816 SkDQuad quad1, quad2; |
| 817 quad1.debugSet(qu1.fPts); |
| 818 quad2.debugSet(qu2.fPts); |
798 if (gPathOpsAngleIdeasVerbose) { | 819 if (gPathOpsAngleIdeasVerbose) { |
799 SkDebugf("%s %d\n", __FUNCTION__, index); | 820 SkDebugf("%s %d\n", __FUNCTION__, index); |
800 } | 821 } |
801 REPORTER_ASSERT(reporter, quad1[0] == quad2[0]); | 822 REPORTER_ASSERT(reporter, quad1[0] == quad2[0]); |
802 SkIntersections i; | 823 SkIntersections i; |
803 i.intersect(quad1, quad2); | 824 i.intersect(quad1, quad2); |
804 REPORTER_ASSERT(reporter, i.used() == 1); | 825 REPORTER_ASSERT(reporter, i.used() == 1); |
805 REPORTER_ASSERT(reporter, i.pt(0) == quad1[0]); | 826 REPORTER_ASSERT(reporter, i.pt(0) == quad1[0]); |
806 int overlap = quadHullsOverlap(reporter, quad1, quad2); | 827 int overlap = quadHullsOverlap(reporter, quad1, quad2); |
807 REPORTER_ASSERT(reporter, overlap >= 0); | 828 REPORTER_ASSERT(reporter, overlap >= 0); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
853 step /= 2; | 874 step /= 2; |
854 } | 875 } |
855 #ifdef SK_DEBUG | 876 #ifdef SK_DEBUG |
856 // DumpQ(q1, q2, 999); | 877 // DumpQ(q1, q2, 999); |
857 #endif | 878 #endif |
858 } | 879 } |
859 if (gPathOpsAngleIdeasVerbose) { | 880 if (gPathOpsAngleIdeasVerbose) { |
860 SkDebugf("maxR=%1.9g\n", maxR); | 881 SkDebugf("maxR=%1.9g\n", maxR); |
861 } | 882 } |
862 } | 883 } |
OLD | NEW |