xref: /aosp_15_r20/external/skia/tests/PathOpsLineIntersectionTest.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2012 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
8*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkDebug.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkIntersections.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkPathOpsLine.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkPathOpsPoint.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "tests/PathOpsTestCommon.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
14*c8dee2aaSAndroid Build Coastguard Worker 
15*c8dee2aaSAndroid Build Coastguard Worker #include <algorithm>
16*c8dee2aaSAndroid Build Coastguard Worker #include <array>
17*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
18*c8dee2aaSAndroid Build Coastguard Worker 
19*c8dee2aaSAndroid Build Coastguard Worker // FIXME: add tests for intersecting, non-intersecting, degenerate, coincident
20*c8dee2aaSAndroid Build Coastguard Worker static const SkDLine tests[][2] = {
21*c8dee2aaSAndroid Build Coastguard Worker {{{{0.00010360032320022583, 1.0172703415155411}, {0.00014114845544099808, 1.0200891587883234}}},
22*c8dee2aaSAndroid Build Coastguard Worker  {{{0.00010259449481964111, 1.017270140349865}, {0.00018215179443359375, 1.022890567779541}}}},
23*c8dee2aaSAndroid Build Coastguard Worker 
24*c8dee2aaSAndroid Build Coastguard Worker #if 0
25*c8dee2aaSAndroid Build Coastguard Worker     // these do intersect at a pair of points, but not close enough for check results liking
26*c8dee2aaSAndroid Build Coastguard Worker     {{{{365.848175,5081.15186}, {368,5103}}}, {{{367.967712,5102.61084}, {368.278717,5105.71045}}}},
27*c8dee2aaSAndroid Build Coastguard Worker #endif
28*c8dee2aaSAndroid Build Coastguard Worker     {{{{30,20}, {30,50}}}, {{{24,30}, {36,30}}}},
29*c8dee2aaSAndroid Build Coastguard Worker     {{{{323,193}, {-317,193}}}, {{{0,994}, {0,0}}}},
30*c8dee2aaSAndroid Build Coastguard Worker     {{{{90,230}, {160,60}}}, {{{60,120}, {260,120}}}},
31*c8dee2aaSAndroid Build Coastguard Worker     {{{{90,230}, {160,60}}}, {{{181.176468,120}, {135.294128,120}}}},
32*c8dee2aaSAndroid Build Coastguard Worker     {{{{181.1764678955078125f, 120}, {186.3661956787109375f, 134.7042236328125f}}},
33*c8dee2aaSAndroid Build Coastguard Worker      {{{175.8309783935546875f, 141.5211334228515625f}, {187.8782806396484375f, 133.7258148193359375f}}}},
34*c8dee2aaSAndroid Build Coastguard Worker #if 0  // FIXME: these fail because one line is too short and appears quasi-coincident
35*c8dee2aaSAndroid Build Coastguard Worker     {{{{158.000000, 926.000000}, {1108.00000, 926.000000}}},
36*c8dee2aaSAndroid Build Coastguard Worker             {{{1108.00000, 926.000000}, {1108.00000, 925.999634}}}},
37*c8dee2aaSAndroid Build Coastguard Worker     {{{{1108,926}, {1108,925.9996337890625}}}, {{{158,926}, {1108,926}}}},
38*c8dee2aaSAndroid Build Coastguard Worker #endif
39*c8dee2aaSAndroid Build Coastguard Worker     {{{{192, 4}, {243, 4}}}, {{{246, 4}, {189, 4}}}},
40*c8dee2aaSAndroid Build Coastguard Worker     {{{{246, 4}, {189, 4}}}, {{{192, 4}, {243, 4}}}},
41*c8dee2aaSAndroid Build Coastguard Worker     {{{{5, 0}, {0, 5}}}, {{{5, 4}, {1, 4}}}},
42*c8dee2aaSAndroid Build Coastguard Worker     {{{{0, 0}, {1, 0}}}, {{{1, 0}, {0, 0}}}},
43*c8dee2aaSAndroid Build Coastguard Worker     {{{{0, 0}, {0, 0}}}, {{{0, 0}, {1, 0}}}},
44*c8dee2aaSAndroid Build Coastguard Worker     {{{{0, 1}, {0, 1}}}, {{{0, 0}, {0, 2}}}},
45*c8dee2aaSAndroid Build Coastguard Worker     {{{{0, 0}, {1, 0}}}, {{{0, 0}, {2, 0}}}},
46*c8dee2aaSAndroid Build Coastguard Worker     {{{{1, 1}, {2, 2}}}, {{{0, 0}, {3, 3}}}},
47*c8dee2aaSAndroid Build Coastguard Worker     {{{{166.86950047022856, 112.69654129527828}, {166.86948801592692, 112.69655741235339}}},
48*c8dee2aaSAndroid Build Coastguard Worker      {{{166.86960700313026, 112.6965477747386}, {166.86925794355412, 112.69656471103423}}}}
49*c8dee2aaSAndroid Build Coastguard Worker };
50*c8dee2aaSAndroid Build Coastguard Worker 
51*c8dee2aaSAndroid Build Coastguard Worker static const size_t tests_count = std::size(tests);
52*c8dee2aaSAndroid Build Coastguard Worker 
53*c8dee2aaSAndroid Build Coastguard Worker static const SkDLine noIntersect[][2] = {
54*c8dee2aaSAndroid Build Coastguard Worker    {{{{(double) (2 - 1e-6f),2}, {(double) (2 - 1e-6f),4}}},
55*c8dee2aaSAndroid Build Coastguard Worker     {{{2,1}, {2,3}}}},
56*c8dee2aaSAndroid Build Coastguard Worker 
57*c8dee2aaSAndroid Build Coastguard Worker     {{{{0, 0}, {1, 0}}}, {{{3, 0}, {2, 0}}}},
58*c8dee2aaSAndroid Build Coastguard Worker     {{{{0, 0}, {0, 0}}}, {{{1, 0}, {2, 0}}}},
59*c8dee2aaSAndroid Build Coastguard Worker     {{{{0, 1}, {0, 1}}}, {{{0, 3}, {0, 2}}}},
60*c8dee2aaSAndroid Build Coastguard Worker     {{{{0, 0}, {1, 0}}}, {{{2, 0}, {3, 0}}}},
61*c8dee2aaSAndroid Build Coastguard Worker     {{{{1, 1}, {2, 2}}}, {{{4, 4}, {3, 3}}}},
62*c8dee2aaSAndroid Build Coastguard Worker };
63*c8dee2aaSAndroid Build Coastguard Worker 
64*c8dee2aaSAndroid Build Coastguard Worker static const size_t noIntersect_count = std::size(noIntersect);
65*c8dee2aaSAndroid Build Coastguard Worker 
66*c8dee2aaSAndroid Build Coastguard Worker static const SkDLine coincidentTests[][2] = {
67*c8dee2aaSAndroid Build Coastguard Worker    {{{ {-1.48383003e-006,-83}, {4.2268899e-014,-60} }},
68*c8dee2aaSAndroid Build Coastguard Worker     {{ {9.5359502e-007,-60}, {5.08227985e-015,-83} }}},
69*c8dee2aaSAndroid Build Coastguard Worker 
70*c8dee2aaSAndroid Build Coastguard Worker    {{{ { 10105, 2510 }, { 10123, 2509.98999f } }},
71*c8dee2aaSAndroid Build Coastguard Worker     {{{10105, 2509.98999f}, { 10123, 2510 } }}},
72*c8dee2aaSAndroid Build Coastguard Worker 
73*c8dee2aaSAndroid Build Coastguard Worker    {{ { { 0, 482.5 }, { -4.4408921e-016, 682.5 } } },
74*c8dee2aaSAndroid Build Coastguard Worker     {{{0,683}, {0,482}}}},
75*c8dee2aaSAndroid Build Coastguard Worker 
76*c8dee2aaSAndroid Build Coastguard Worker    {{{{1.77635684e-015,312}, {-1.24344979e-014,348}}},
77*c8dee2aaSAndroid Build Coastguard Worker     {{{0,348}, {0,312}}}},
78*c8dee2aaSAndroid Build Coastguard Worker 
79*c8dee2aaSAndroid Build Coastguard Worker    {{{{979.304871, 561}, {1036.69507, 291}}},
80*c8dee2aaSAndroid Build Coastguard Worker     {{{985.681519, 531}, {982.159790, 547.568542}}}},
81*c8dee2aaSAndroid Build Coastguard Worker 
82*c8dee2aaSAndroid Build Coastguard Worker    {{{{232.159805, 547.568542}, {235.681549, 531}}},
83*c8dee2aaSAndroid Build Coastguard Worker     {{{286.695129,291}, {229.304855,561}}}},
84*c8dee2aaSAndroid Build Coastguard Worker 
85*c8dee2aaSAndroid Build Coastguard Worker     {{{{186.3661956787109375f, 134.7042236328125f}, {187.8782806396484375f, 133.7258148193359375f}}},
86*c8dee2aaSAndroid Build Coastguard Worker      {{{175.8309783935546875f, 141.5211334228515625f}, {187.8782806396484375f, 133.7258148193359375f}}}},
87*c8dee2aaSAndroid Build Coastguard Worker 
88*c8dee2aaSAndroid Build Coastguard Worker     {{{{235.681549, 531.000000}, {280.318420, 321.000000}}},
89*c8dee2aaSAndroid Build Coastguard Worker      {{{286.695129, 291.000000}, {229.304855, 561.000000}}}},
90*c8dee2aaSAndroid Build Coastguard Worker };
91*c8dee2aaSAndroid Build Coastguard Worker 
92*c8dee2aaSAndroid Build Coastguard Worker static const size_t coincidentTests_count = std::size(coincidentTests);
93*c8dee2aaSAndroid Build Coastguard Worker 
check_results(skiatest::Reporter * reporter,const SkDLine & line1,const SkDLine & line2,const SkIntersections & ts,bool nearAllowed)94*c8dee2aaSAndroid Build Coastguard Worker static void check_results(skiatest::Reporter* reporter, const SkDLine& line1, const SkDLine& line2,
95*c8dee2aaSAndroid Build Coastguard Worker                           const SkIntersections& ts, bool nearAllowed) {
96*c8dee2aaSAndroid Build Coastguard Worker     for (int i = 0; i < ts.used(); ++i) {
97*c8dee2aaSAndroid Build Coastguard Worker         SkDPoint result1 = line1.ptAtT(ts[0][i]);
98*c8dee2aaSAndroid Build Coastguard Worker         SkDPoint result2 = line2.ptAtT(ts[1][i]);
99*c8dee2aaSAndroid Build Coastguard Worker         if (nearAllowed && result1.roughlyEqual(result2)) {
100*c8dee2aaSAndroid Build Coastguard Worker             continue;
101*c8dee2aaSAndroid Build Coastguard Worker         }
102*c8dee2aaSAndroid Build Coastguard Worker         if (!result1.approximatelyEqual(result2) && !ts.nearlySame(i)) {
103*c8dee2aaSAndroid Build Coastguard Worker             REPORTER_ASSERT(reporter, ts.used() != 1);
104*c8dee2aaSAndroid Build Coastguard Worker             result2 = line2.ptAtT(ts[1][i ^ 1]);
105*c8dee2aaSAndroid Build Coastguard Worker             if (!result1.approximatelyEqual(result2)) {
106*c8dee2aaSAndroid Build Coastguard Worker                 SkDebugf(".");
107*c8dee2aaSAndroid Build Coastguard Worker             }
108*c8dee2aaSAndroid Build Coastguard Worker             REPORTER_ASSERT(reporter, result1.approximatelyEqual(result2));
109*c8dee2aaSAndroid Build Coastguard Worker             REPORTER_ASSERT(reporter, result1.approximatelyEqual(ts.pt(i).asSkPoint()));
110*c8dee2aaSAndroid Build Coastguard Worker         }
111*c8dee2aaSAndroid Build Coastguard Worker     }
112*c8dee2aaSAndroid Build Coastguard Worker }
113*c8dee2aaSAndroid Build Coastguard Worker 
testOne(skiatest::Reporter * reporter,const SkDLine & line1,const SkDLine & line2,bool nearAllowed)114*c8dee2aaSAndroid Build Coastguard Worker static void testOne(skiatest::Reporter* reporter, const SkDLine& line1, const SkDLine& line2,
115*c8dee2aaSAndroid Build Coastguard Worker         bool nearAllowed) {
116*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(ValidLine(line1));
117*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(ValidLine(line2));
118*c8dee2aaSAndroid Build Coastguard Worker     SkIntersections i;
119*c8dee2aaSAndroid Build Coastguard Worker     i.allowNear(nearAllowed);
120*c8dee2aaSAndroid Build Coastguard Worker     int pts = i.intersect(line1, line2);
121*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, pts);
122*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, pts == i.used());
123*c8dee2aaSAndroid Build Coastguard Worker     check_results(reporter, line1, line2, i, nearAllowed);
124*c8dee2aaSAndroid Build Coastguard Worker     if (line1[0] == line1[1] || line2[0] == line2[1]) {
125*c8dee2aaSAndroid Build Coastguard Worker         return;
126*c8dee2aaSAndroid Build Coastguard Worker     }
127*c8dee2aaSAndroid Build Coastguard Worker     if (line1[0].fY == line1[1].fY) {
128*c8dee2aaSAndroid Build Coastguard Worker         double left = std::min(line1[0].fX, line1[1].fX);
129*c8dee2aaSAndroid Build Coastguard Worker         double right = std::max(line1[0].fX, line1[1].fX);
130*c8dee2aaSAndroid Build Coastguard Worker         SkIntersections ts;
131*c8dee2aaSAndroid Build Coastguard Worker         ts.horizontal(line2, left, right, line1[0].fY, line1[0].fX != left);
132*c8dee2aaSAndroid Build Coastguard Worker         check_results(reporter, line2, line1, ts, nearAllowed);
133*c8dee2aaSAndroid Build Coastguard Worker     }
134*c8dee2aaSAndroid Build Coastguard Worker     if (line2[0].fY == line2[1].fY) {
135*c8dee2aaSAndroid Build Coastguard Worker         double left = std::min(line2[0].fX, line2[1].fX);
136*c8dee2aaSAndroid Build Coastguard Worker         double right = std::max(line2[0].fX, line2[1].fX);
137*c8dee2aaSAndroid Build Coastguard Worker         SkIntersections ts;
138*c8dee2aaSAndroid Build Coastguard Worker         ts.horizontal(line1, left, right, line2[0].fY, line2[0].fX != left);
139*c8dee2aaSAndroid Build Coastguard Worker         check_results(reporter, line1, line2, ts, nearAllowed);
140*c8dee2aaSAndroid Build Coastguard Worker     }
141*c8dee2aaSAndroid Build Coastguard Worker     if (line1[0].fX == line1[1].fX) {
142*c8dee2aaSAndroid Build Coastguard Worker         double top = std::min(line1[0].fY, line1[1].fY);
143*c8dee2aaSAndroid Build Coastguard Worker         double bottom = std::max(line1[0].fY, line1[1].fY);
144*c8dee2aaSAndroid Build Coastguard Worker         SkIntersections ts;
145*c8dee2aaSAndroid Build Coastguard Worker         ts.vertical(line2, top, bottom, line1[0].fX, line1[0].fY != top);
146*c8dee2aaSAndroid Build Coastguard Worker         check_results(reporter, line2, line1, ts, nearAllowed);
147*c8dee2aaSAndroid Build Coastguard Worker     }
148*c8dee2aaSAndroid Build Coastguard Worker     if (line2[0].fX == line2[1].fX) {
149*c8dee2aaSAndroid Build Coastguard Worker         double top = std::min(line2[0].fY, line2[1].fY);
150*c8dee2aaSAndroid Build Coastguard Worker         double bottom = std::max(line2[0].fY, line2[1].fY);
151*c8dee2aaSAndroid Build Coastguard Worker         SkIntersections ts;
152*c8dee2aaSAndroid Build Coastguard Worker         ts.vertical(line1, top, bottom, line2[0].fX, line2[0].fY != top);
153*c8dee2aaSAndroid Build Coastguard Worker         check_results(reporter, line1, line2, ts, nearAllowed);
154*c8dee2aaSAndroid Build Coastguard Worker     }
155*c8dee2aaSAndroid Build Coastguard Worker     reporter->bumpTestCount();
156*c8dee2aaSAndroid Build Coastguard Worker }
157*c8dee2aaSAndroid Build Coastguard Worker 
testOneCoincident(skiatest::Reporter * reporter,const SkDLine & line1,const SkDLine & line2)158*c8dee2aaSAndroid Build Coastguard Worker static void testOneCoincident(skiatest::Reporter* reporter, const SkDLine& line1,
159*c8dee2aaSAndroid Build Coastguard Worker                               const SkDLine& line2) {
160*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(ValidLine(line1));
161*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(ValidLine(line2));
162*c8dee2aaSAndroid Build Coastguard Worker     SkIntersections i;
163*c8dee2aaSAndroid Build Coastguard Worker     int pts = i.intersect(line1, line2);
164*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, pts == 2);
165*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, pts == i.used());
166*c8dee2aaSAndroid Build Coastguard Worker     check_results(reporter, line1, line2, i, false);
167*c8dee2aaSAndroid Build Coastguard Worker     if (line1[0] == line1[1] || line2[0] == line2[1]) {
168*c8dee2aaSAndroid Build Coastguard Worker         return;
169*c8dee2aaSAndroid Build Coastguard Worker     }
170*c8dee2aaSAndroid Build Coastguard Worker     if (line1[0].fY == line1[1].fY) {
171*c8dee2aaSAndroid Build Coastguard Worker         double left = std::min(line1[0].fX, line1[1].fX);
172*c8dee2aaSAndroid Build Coastguard Worker         double right = std::max(line1[0].fX, line1[1].fX);
173*c8dee2aaSAndroid Build Coastguard Worker         SkIntersections ts;
174*c8dee2aaSAndroid Build Coastguard Worker         ts.horizontal(line2, left, right, line1[0].fY, line1[0].fX != left);
175*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, pts == 2);
176*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, pts == ts.used());
177*c8dee2aaSAndroid Build Coastguard Worker         check_results(reporter, line2, line1, ts, false);
178*c8dee2aaSAndroid Build Coastguard Worker     }
179*c8dee2aaSAndroid Build Coastguard Worker     if (line2[0].fY == line2[1].fY) {
180*c8dee2aaSAndroid Build Coastguard Worker         double left = std::min(line2[0].fX, line2[1].fX);
181*c8dee2aaSAndroid Build Coastguard Worker         double right = std::max(line2[0].fX, line2[1].fX);
182*c8dee2aaSAndroid Build Coastguard Worker         SkIntersections ts;
183*c8dee2aaSAndroid Build Coastguard Worker         ts.horizontal(line1, left, right, line2[0].fY, line2[0].fX != left);
184*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, pts == 2);
185*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, pts == ts.used());
186*c8dee2aaSAndroid Build Coastguard Worker         check_results(reporter, line1, line2, ts, false);
187*c8dee2aaSAndroid Build Coastguard Worker     }
188*c8dee2aaSAndroid Build Coastguard Worker     if (line1[0].fX == line1[1].fX) {
189*c8dee2aaSAndroid Build Coastguard Worker         double top = std::min(line1[0].fY, line1[1].fY);
190*c8dee2aaSAndroid Build Coastguard Worker         double bottom = std::max(line1[0].fY, line1[1].fY);
191*c8dee2aaSAndroid Build Coastguard Worker         SkIntersections ts;
192*c8dee2aaSAndroid Build Coastguard Worker         ts.vertical(line2, top, bottom, line1[0].fX, line1[0].fY != top);
193*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, pts == 2);
194*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, pts == ts.used());
195*c8dee2aaSAndroid Build Coastguard Worker         check_results(reporter, line2, line1, ts, false);
196*c8dee2aaSAndroid Build Coastguard Worker     }
197*c8dee2aaSAndroid Build Coastguard Worker     if (line2[0].fX == line2[1].fX) {
198*c8dee2aaSAndroid Build Coastguard Worker         double top = std::min(line2[0].fY, line2[1].fY);
199*c8dee2aaSAndroid Build Coastguard Worker         double bottom = std::max(line2[0].fY, line2[1].fY);
200*c8dee2aaSAndroid Build Coastguard Worker         SkIntersections ts;
201*c8dee2aaSAndroid Build Coastguard Worker         ts.vertical(line1, top, bottom, line2[0].fX, line2[0].fY != top);
202*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, pts == 2);
203*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, pts == ts.used());
204*c8dee2aaSAndroid Build Coastguard Worker         check_results(reporter, line1, line2, ts, false);
205*c8dee2aaSAndroid Build Coastguard Worker     }
206*c8dee2aaSAndroid Build Coastguard Worker     reporter->bumpTestCount();
207*c8dee2aaSAndroid Build Coastguard Worker }
208*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(PathOpsLineIntersection,reporter)209*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(PathOpsLineIntersection, reporter) {
210*c8dee2aaSAndroid Build Coastguard Worker     size_t index;
211*c8dee2aaSAndroid Build Coastguard Worker     for (index = 0; index < coincidentTests_count; ++index) {
212*c8dee2aaSAndroid Build Coastguard Worker         const SkDLine& line1 = coincidentTests[index][0];
213*c8dee2aaSAndroid Build Coastguard Worker         const SkDLine& line2 = coincidentTests[index][1];
214*c8dee2aaSAndroid Build Coastguard Worker         testOneCoincident(reporter, line1, line2);
215*c8dee2aaSAndroid Build Coastguard Worker     }
216*c8dee2aaSAndroid Build Coastguard Worker     for (index = 0; index < tests_count; ++index) {
217*c8dee2aaSAndroid Build Coastguard Worker         const SkDLine& line1 = tests[index][0];
218*c8dee2aaSAndroid Build Coastguard Worker         const SkDLine& line2 = tests[index][1];
219*c8dee2aaSAndroid Build Coastguard Worker         testOne(reporter, line1, line2, true);
220*c8dee2aaSAndroid Build Coastguard Worker     }
221*c8dee2aaSAndroid Build Coastguard Worker     for (index = 0; index < noIntersect_count; ++index) {
222*c8dee2aaSAndroid Build Coastguard Worker         const SkDLine& line1 = noIntersect[index][0];
223*c8dee2aaSAndroid Build Coastguard Worker         const SkDLine& line2 = noIntersect[index][1];
224*c8dee2aaSAndroid Build Coastguard Worker         SkIntersections ts;
225*c8dee2aaSAndroid Build Coastguard Worker         int pts = ts.intersect(line1, line2);
226*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, !pts);
227*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, pts == ts.used());
228*c8dee2aaSAndroid Build Coastguard Worker         reporter->bumpTestCount();
229*c8dee2aaSAndroid Build Coastguard Worker     }
230*c8dee2aaSAndroid Build Coastguard Worker }
231*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(PathOpsLineIntersectionOneOff,reporter)232*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(PathOpsLineIntersectionOneOff, reporter) {
233*c8dee2aaSAndroid Build Coastguard Worker     int index = 0;
234*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(index < (int) tests_count);
235*c8dee2aaSAndroid Build Coastguard Worker     testOne(reporter, tests[index][0], tests[index][1], true);
236*c8dee2aaSAndroid Build Coastguard Worker }
237*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(PathOpsLineIntersectionExactOneOff,reporter)238*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(PathOpsLineIntersectionExactOneOff, reporter) {
239*c8dee2aaSAndroid Build Coastguard Worker     int index = 0;
240*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(index < (int) tests_count);
241*c8dee2aaSAndroid Build Coastguard Worker     testOne(reporter, tests[index][0], tests[index][1], false);
242*c8dee2aaSAndroid Build Coastguard Worker }
243*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(PathOpsLineIntersectionOneCoincident,reporter)244*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(PathOpsLineIntersectionOneCoincident, reporter) {
245*c8dee2aaSAndroid Build Coastguard Worker     int index = 0;
246*c8dee2aaSAndroid Build Coastguard Worker     SkASSERT(index < (int) coincidentTests_count);
247*c8dee2aaSAndroid Build Coastguard Worker     const SkDLine& line1 = coincidentTests[index][0];
248*c8dee2aaSAndroid Build Coastguard Worker     const SkDLine& line2 = coincidentTests[index][1];
249*c8dee2aaSAndroid Build Coastguard Worker     testOneCoincident(reporter, line1, line2);
250*c8dee2aaSAndroid Build Coastguard Worker }
251