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 "PathOpsTestCommon.h" | 7 #include "PathOpsTestCommon.h" |
8 #include "SkIntersections.h" | 8 #include "SkIntersections.h" |
9 #include "SkPathOpsLine.h" | 9 #include "SkPathOpsLine.h" |
10 #include "Test.h" | 10 #include "Test.h" |
(...skipping 30 matching lines...) Expand all Loading... |
41 {{{{0, 0}, {1, 0}}}, {{{3, 0}, {2, 0}}}}, | 41 {{{{0, 0}, {1, 0}}}, {{{3, 0}, {2, 0}}}}, |
42 {{{{0, 0}, {0, 0}}}, {{{1, 0}, {2, 0}}}}, | 42 {{{{0, 0}, {0, 0}}}, {{{1, 0}, {2, 0}}}}, |
43 {{{{0, 1}, {0, 1}}}, {{{0, 3}, {0, 2}}}}, | 43 {{{{0, 1}, {0, 1}}}, {{{0, 3}, {0, 2}}}}, |
44 {{{{0, 0}, {1, 0}}}, {{{2, 0}, {3, 0}}}}, | 44 {{{{0, 0}, {1, 0}}}, {{{2, 0}, {3, 0}}}}, |
45 {{{{1, 1}, {2, 2}}}, {{{4, 4}, {3, 3}}}}, | 45 {{{{1, 1}, {2, 2}}}, {{{4, 4}, {3, 3}}}}, |
46 }; | 46 }; |
47 | 47 |
48 static const size_t noIntersect_count = SK_ARRAY_COUNT(noIntersect); | 48 static const size_t noIntersect_count = SK_ARRAY_COUNT(noIntersect); |
49 | 49 |
50 static const SkDLine coincidentTests[][2] = { | 50 static const SkDLine coincidentTests[][2] = { |
| 51 {{{{0,482.5}, {-4.4408921e-016,682.5}}}, |
| 52 {{{0,683}, {0,482}}}}, |
| 53 |
| 54 {{{{1.77635684e-015,312}, {-1.24344979e-014,348}}}, |
| 55 {{{0,348}, {0,312}}}}, |
| 56 |
51 {{{{979.304871, 561}, {1036.69507, 291}}}, | 57 {{{{979.304871, 561}, {1036.69507, 291}}}, |
52 {{{985.681519, 531}, {982.159790, 547.568542}}}}, | 58 {{{985.681519, 531}, {982.159790, 547.568542}}}}, |
53 | 59 |
54 {{{{232.159805, 547.568542}, {235.681549, 531}}}, | 60 {{{{232.159805, 547.568542}, {235.681549, 531}}}, |
55 {{{286.695129,291}, {229.304855,561}}}}, | 61 {{{286.695129,291}, {229.304855,561}}}}, |
56 | 62 |
57 {{{{186.3661956787109375f, 134.7042236328125f}, {187.8782806396484375f, 133.
7258148193359375f}}}, | 63 {{{{186.3661956787109375f, 134.7042236328125f}, {187.8782806396484375f, 133.
7258148193359375f}}}, |
58 {{{175.8309783935546875f, 141.5211334228515625f}, {187.8782806396484375f, 1
33.7258148193359375f}}}}, | 64 {{{175.8309783935546875f, 141.5211334228515625f}, {187.8782806396484375f, 1
33.7258148193359375f}}}}, |
59 | 65 |
60 {{{{235.681549, 531.000000}, {280.318420, 321.000000}}}, | 66 {{{{235.681549, 531.000000}, {280.318420, 321.000000}}}, |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 ts.vertical(line2, top, bottom, line1[0].fX, line1[0].fY != top); | 115 ts.vertical(line2, top, bottom, line1[0].fX, line1[0].fY != top); |
110 check_results(reporter, line2, line1, ts); | 116 check_results(reporter, line2, line1, ts); |
111 } | 117 } |
112 if (line2[0].fX == line2[1].fX) { | 118 if (line2[0].fX == line2[1].fX) { |
113 double top = SkTMin(line2[0].fY, line2[1].fY); | 119 double top = SkTMin(line2[0].fY, line2[1].fY); |
114 double bottom = SkTMax(line2[0].fY, line2[1].fY); | 120 double bottom = SkTMax(line2[0].fY, line2[1].fY); |
115 SkIntersections ts; | 121 SkIntersections ts; |
116 ts.vertical(line1, top, bottom, line2[0].fX, line2[0].fY != top); | 122 ts.vertical(line1, top, bottom, line2[0].fX, line2[0].fY != top); |
117 check_results(reporter, line1, line2, ts); | 123 check_results(reporter, line1, line2, ts); |
118 } | 124 } |
| 125 reporter->bumpTestCount(); |
119 } | 126 } |
120 | 127 |
121 static void testOneCoincident(skiatest::Reporter* reporter, const SkDLine& line1
, | 128 static void testOneCoincident(skiatest::Reporter* reporter, const SkDLine& line1
, |
122 const SkDLine& line2) { | 129 const SkDLine& line2) { |
123 SkASSERT(ValidLine(line1)); | 130 SkASSERT(ValidLine(line1)); |
124 SkASSERT(ValidLine(line2)); | 131 SkASSERT(ValidLine(line2)); |
125 SkIntersections ts; | 132 SkIntersections ts; |
126 int pts = ts.intersect(line1, line2); | 133 int pts = ts.intersect(line1, line2); |
127 REPORTER_ASSERT(reporter, pts == 2); | 134 REPORTER_ASSERT(reporter, pts == 2); |
128 REPORTER_ASSERT(reporter, pts == ts.used()); | 135 REPORTER_ASSERT(reporter, pts == ts.used()); |
129 check_results(reporter, line1, line2, ts); | 136 check_results(reporter, line1, line2, ts); |
| 137 if (line1[0] == line1[1] || line2[0] == line2[1]) { |
| 138 return; |
| 139 } |
| 140 if (line1[0].fY == line1[1].fY) { |
| 141 double left = SkTMin(line1[0].fX, line1[1].fX); |
| 142 double right = SkTMax(line1[0].fX, line1[1].fX); |
| 143 SkIntersections ts; |
| 144 ts.horizontal(line2, left, right, line1[0].fY, line1[0].fX != left); |
| 145 REPORTER_ASSERT(reporter, pts == 2); |
| 146 REPORTER_ASSERT(reporter, pts == ts.used()); |
| 147 check_results(reporter, line2, line1, ts); |
| 148 } |
| 149 if (line2[0].fY == line2[1].fY) { |
| 150 double left = SkTMin(line2[0].fX, line2[1].fX); |
| 151 double right = SkTMax(line2[0].fX, line2[1].fX); |
| 152 SkIntersections ts; |
| 153 ts.horizontal(line1, left, right, line2[0].fY, line2[0].fX != left); |
| 154 REPORTER_ASSERT(reporter, pts == 2); |
| 155 REPORTER_ASSERT(reporter, pts == ts.used()); |
| 156 check_results(reporter, line1, line2, ts); |
| 157 } |
| 158 if (line1[0].fX == line1[1].fX) { |
| 159 double top = SkTMin(line1[0].fY, line1[1].fY); |
| 160 double bottom = SkTMax(line1[0].fY, line1[1].fY); |
| 161 SkIntersections ts; |
| 162 ts.vertical(line2, top, bottom, line1[0].fX, line1[0].fY != top); |
| 163 REPORTER_ASSERT(reporter, pts == 2); |
| 164 REPORTER_ASSERT(reporter, pts == ts.used()); |
| 165 check_results(reporter, line2, line1, ts); |
| 166 } |
| 167 if (line2[0].fX == line2[1].fX) { |
| 168 double top = SkTMin(line2[0].fY, line2[1].fY); |
| 169 double bottom = SkTMax(line2[0].fY, line2[1].fY); |
| 170 SkIntersections ts; |
| 171 ts.vertical(line1, top, bottom, line2[0].fX, line2[0].fY != top); |
| 172 REPORTER_ASSERT(reporter, pts == 2); |
| 173 REPORTER_ASSERT(reporter, pts == ts.used()); |
| 174 check_results(reporter, line1, line2, ts); |
| 175 } |
| 176 reporter->bumpTestCount(); |
130 } | 177 } |
131 | 178 |
132 static void PathOpsLineIntersectionTest(skiatest::Reporter* reporter) { | 179 static void PathOpsLineIntersectionTest(skiatest::Reporter* reporter) { |
133 size_t index; | 180 size_t index; |
134 for (index = 0; index < coincidentTests_count; ++index) { | 181 for (index = 0; index < coincidentTests_count; ++index) { |
135 const SkDLine& line1 = coincidentTests[index][0]; | 182 const SkDLine& line1 = coincidentTests[index][0]; |
136 const SkDLine& line2 = coincidentTests[index][1]; | 183 const SkDLine& line2 = coincidentTests[index][1]; |
137 testOneCoincident(reporter, line1, line2); | 184 testOneCoincident(reporter, line1, line2); |
138 reporter->bumpTestCount(); | |
139 } | 185 } |
140 for (index = 0; index < tests_count; ++index) { | 186 for (index = 0; index < tests_count; ++index) { |
141 const SkDLine& line1 = tests[index][0]; | 187 const SkDLine& line1 = tests[index][0]; |
142 const SkDLine& line2 = tests[index][1]; | 188 const SkDLine& line2 = tests[index][1]; |
143 testOne(reporter, line1, line2); | 189 testOne(reporter, line1, line2); |
144 reporter->bumpTestCount(); | |
145 } | 190 } |
146 for (index = 0; index < noIntersect_count; ++index) { | 191 for (index = 0; index < noIntersect_count; ++index) { |
147 const SkDLine& line1 = noIntersect[index][0]; | 192 const SkDLine& line1 = noIntersect[index][0]; |
148 const SkDLine& line2 = noIntersect[index][1]; | 193 const SkDLine& line2 = noIntersect[index][1]; |
149 SkIntersections ts; | 194 SkIntersections ts; |
150 int pts = ts.intersect(line1, line2); | 195 int pts = ts.intersect(line1, line2); |
151 REPORTER_ASSERT(reporter, !pts); | 196 REPORTER_ASSERT(reporter, !pts); |
152 REPORTER_ASSERT(reporter, pts == ts.used()); | 197 REPORTER_ASSERT(reporter, pts == ts.used()); |
153 reporter->bumpTestCount(); | 198 reporter->bumpTestCount(); |
154 } | 199 } |
(...skipping 13 matching lines...) Expand all Loading... |
168 const SkDLine& line2 = coincidentTests[index][1]; | 213 const SkDLine& line2 = coincidentTests[index][1]; |
169 testOneCoincident(reporter, line1, line2); | 214 testOneCoincident(reporter, line1, line2); |
170 } | 215 } |
171 | 216 |
172 #include "TestClassDef.h" | 217 #include "TestClassDef.h" |
173 DEFINE_TESTCLASS_SHORT(PathOpsLineIntersectionTest) | 218 DEFINE_TESTCLASS_SHORT(PathOpsLineIntersectionTest) |
174 | 219 |
175 DEFINE_TESTCLASS_SHORT(PathOpsLineIntersectionOneOffTest) | 220 DEFINE_TESTCLASS_SHORT(PathOpsLineIntersectionOneOffTest) |
176 | 221 |
177 DEFINE_TESTCLASS_SHORT(PathOpsLineIntersectionOneCoincidentTest) | 222 DEFINE_TESTCLASS_SHORT(PathOpsLineIntersectionOneCoincidentTest) |
OLD | NEW |