1 /*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7 #include "PathOpsExtendedTest.h"
8
9 #define TEST(name) { name, #name }
10
cubicOp1d(skiatest::Reporter * reporter)11 static void cubicOp1d(skiatest::Reporter* reporter) {
12 SkPath path, pathB;
13 path.setFillType(SkPath::kWinding_FillType);
14 path.moveTo(0,1);
15 path.cubicTo(0,2, 1,0, 1,0);
16 path.close();
17 pathB.setFillType(SkPath::kWinding_FillType);
18 pathB.moveTo(0,1);
19 pathB.cubicTo(0,1, 1,0, 2,0);
20 pathB.close();
21 testPathOp(reporter, path, pathB, kDifference_PathOp);
22 }
23
cubicOp2d(skiatest::Reporter * reporter)24 static void cubicOp2d(skiatest::Reporter* reporter) {
25 SkPath path, pathB;
26 path.setFillType(SkPath::kWinding_FillType);
27 path.moveTo(0,2);
28 path.cubicTo(0,1, 1,0, 1,0);
29 path.close();
30 pathB.setFillType(SkPath::kWinding_FillType);
31 pathB.moveTo(0,1);
32 pathB.cubicTo(0,1, 2,0, 1,0);
33 pathB.close();
34 testPathOp(reporter, path, pathB, kDifference_PathOp);
35 }
36
cubicOp3d(skiatest::Reporter * reporter)37 static void cubicOp3d(skiatest::Reporter* reporter) {
38 SkPath path, pathB;
39 path.setFillType(SkPath::kWinding_FillType);
40 path.moveTo(0,1);
41 path.cubicTo(2,3, 1,0, 1,0);
42 path.close();
43 pathB.setFillType(SkPath::kWinding_FillType);
44 pathB.moveTo(0,1);
45 pathB.cubicTo(0,1, 1,0, 3,2);
46 pathB.close();
47 testPathOp(reporter, path, pathB, kDifference_PathOp);
48 }
49
cubicOp5d(skiatest::Reporter * reporter)50 static void cubicOp5d(skiatest::Reporter* reporter) {
51 SkPath path, pathB;
52 path.setFillType(SkPath::kWinding_FillType);
53 path.moveTo(0,1);
54 path.cubicTo(0,2, 1,0, 2,0);
55 path.close();
56 pathB.setFillType(SkPath::kWinding_FillType);
57 pathB.moveTo(0,1);
58 pathB.cubicTo(0,2, 1,0, 2,0);
59 pathB.close();
60 testPathOp(reporter, path, pathB, kDifference_PathOp);
61 }
62
cubicOp6d(skiatest::Reporter * reporter)63 static void cubicOp6d(skiatest::Reporter* reporter) {
64 SkPath path, pathB;
65 path.setFillType(SkPath::kWinding_FillType);
66 path.moveTo(0,1);
67 path.cubicTo(0,6, 1,0, 3,0);
68 path.close();
69 pathB.setFillType(SkPath::kWinding_FillType);
70 pathB.moveTo(0,1);
71 pathB.cubicTo(0,3, 1,0, 6,0);
72 pathB.close();
73 testPathOp(reporter, path, pathB, kDifference_PathOp);
74 }
75
cubicOp7d(skiatest::Reporter * reporter)76 static void cubicOp7d(skiatest::Reporter* reporter) {
77 SkPath path, pathB;
78 path.setFillType(SkPath::kWinding_FillType);
79 path.moveTo(0,1);
80 path.cubicTo(3,4, 1,0, 3,0);
81 path.close();
82 pathB.setFillType(SkPath::kWinding_FillType);
83 pathB.moveTo(0,1);
84 pathB.cubicTo(0,3, 1,0, 4,3);
85 pathB.close();
86 testPathOp(reporter, path, pathB, kDifference_PathOp);
87 }
88
cubicOp8d(skiatest::Reporter * reporter)89 static void cubicOp8d(skiatest::Reporter* reporter) {
90 SkPath path, pathB;
91 path.setFillType(SkPath::kWinding_FillType);
92 path.moveTo(0,1);
93 path.cubicTo(0,5, 1,0, 4,0);
94 path.close();
95 pathB.setFillType(SkPath::kWinding_FillType);
96 pathB.moveTo(0,1);
97 pathB.cubicTo(0,4, 1,0, 5,0);
98 pathB.close();
99 testPathOp(reporter, path, pathB, kDifference_PathOp);
100 }
101
cubicOp9d(skiatest::Reporter * reporter)102 static void cubicOp9d(skiatest::Reporter* reporter) {
103 SkPath path, pathB;
104 path.setFillType(SkPath::kWinding_FillType);
105 path.moveTo(0,1);
106 path.cubicTo(1,6, 1,0, 2,1);
107 path.close();
108 pathB.setFillType(SkPath::kWinding_FillType);
109 pathB.moveTo(0,1);
110 pathB.cubicTo(1,2, 1,0, 6,1);
111 pathB.close();
112 testPathOp(reporter, path, pathB, kDifference_PathOp);
113 }
114
quadOp9d(skiatest::Reporter * reporter)115 static void quadOp9d(skiatest::Reporter* reporter) {
116 SkPath path, pathB;
117 path.setFillType(SkPath::kWinding_FillType);
118 path.moveTo(0,1);
119 path.quadTo(1,6, 1.5f,1);
120 path.quadTo(1.5f,0.5f, 2,1);
121 path.close();
122 pathB.setFillType(SkPath::kWinding_FillType);
123 pathB.moveTo(0,1);
124 pathB.quadTo(1,2, 1.4f,1);
125 pathB.quadTo(3,0.4f, 6,1);
126 pathB.close();
127 testPathOp(reporter, path, pathB, kDifference_PathOp);
128 }
129
lineOp9d(skiatest::Reporter * reporter)130 static void lineOp9d(skiatest::Reporter* reporter) {
131 SkPath path, pathB;
132 path.setFillType(SkPath::kWinding_FillType);
133 path.moveTo(0,1);
134 path.lineTo(1,6);
135 path.lineTo(1.5f,1);
136 path.lineTo(1.8f,0.8f);
137 path.lineTo(2,1);
138 path.close();
139 pathB.setFillType(SkPath::kWinding_FillType);
140 pathB.moveTo(0,1);
141 pathB.lineTo(1,2);
142 pathB.lineTo(1.4f,1);
143 pathB.lineTo(3,0.4f);
144 pathB.lineTo(6,1);
145 pathB.close();
146 testPathOp(reporter, path, pathB, kDifference_PathOp);
147 }
148
cubicOp1i(skiatest::Reporter * reporter)149 static void cubicOp1i(skiatest::Reporter* reporter) {
150 SkPath path, pathB;
151 path.setFillType(SkPath::kWinding_FillType);
152 path.moveTo(0,1);
153 path.cubicTo(1,2, 1,0, 2,1);
154 path.close();
155 pathB.setFillType(SkPath::kWinding_FillType);
156 pathB.moveTo(0,1);
157 pathB.cubicTo(1,2, 1,0, 2,1);
158 pathB.close();
159 testPathOp(reporter, path, pathB, kIntersect_PathOp);
160 }
161
cubicOp10d(skiatest::Reporter * reporter)162 static void cubicOp10d(skiatest::Reporter* reporter) {
163 SkPath path, pathB;
164 path.setFillType(SkPath::kWinding_FillType);
165 path.moveTo(0,1);
166 path.cubicTo(1,3, 1,0, 4,1);
167 path.close();
168 pathB.setFillType(SkPath::kWinding_FillType);
169 pathB.moveTo(0,1);
170 pathB.cubicTo(1,4, 1,0, 3,1);
171 pathB.close();
172 testPathOp(reporter, path, pathB, kDifference_PathOp);
173 }
174
cubicOp11d(skiatest::Reporter * reporter)175 static void cubicOp11d(skiatest::Reporter* reporter) {
176 SkPath path, pathB;
177 path.setFillType(SkPath::kWinding_FillType);
178 path.moveTo(0,1);
179 path.cubicTo(3,4, 1,0, 5,1);
180 path.close();
181 pathB.setFillType(SkPath::kWinding_FillType);
182 pathB.moveTo(0,1);
183 pathB.cubicTo(1,5, 1,0, 4,3);
184 pathB.close();
185 testPathOp(reporter, path, pathB, kDifference_PathOp);
186 }
187
cubicOp12d(skiatest::Reporter * reporter)188 static void cubicOp12d(skiatest::Reporter* reporter) {
189 SkPath path, pathB;
190 path.setFillType(SkPath::kWinding_FillType);
191 path.moveTo(0,1);
192 path.cubicTo(1,6, 1,0, 1,0);
193 path.close();
194 pathB.setFillType(SkPath::kWinding_FillType);
195 pathB.moveTo(0,1);
196 pathB.cubicTo(0,1, 1,0, 6,1);
197 pathB.close();
198 testPathOp(reporter, path, pathB, kDifference_PathOp);
199 }
200
cubicOp13d(skiatest::Reporter * reporter)201 static void cubicOp13d(skiatest::Reporter* reporter) {
202 SkPath path, pathB;
203 path.setFillType(SkPath::kWinding_FillType);
204 path.moveTo(0,1);
205 path.cubicTo(4,5, 1,0, 5,3);
206 path.close();
207 pathB.setFillType(SkPath::kWinding_FillType);
208 pathB.moveTo(0,1);
209 pathB.cubicTo(3,5, 1,0, 5,4);
210 pathB.close();
211 testPathOp(reporter, path, pathB, kDifference_PathOp);
212 }
213
cubicOp14d(skiatest::Reporter * reporter)214 static void cubicOp14d(skiatest::Reporter* reporter) {
215 SkPath path, pathB;
216 path.setFillType(SkPath::kWinding_FillType);
217 path.moveTo(0,1);
218 path.cubicTo(0,2, 2,0, 2,1);
219 path.close();
220 pathB.setFillType(SkPath::kWinding_FillType);
221 pathB.moveTo(0,2);
222 pathB.cubicTo(1,2, 1,0, 2,0);
223 pathB.close();
224 testPathOp(reporter, path, pathB, kDifference_PathOp);
225 }
226
cubicOp15d(skiatest::Reporter * reporter)227 static void cubicOp15d(skiatest::Reporter* reporter) {
228 SkPath path, pathB;
229 path.setFillType(SkPath::kWinding_FillType);
230 path.moveTo(0,1);
231 path.cubicTo(3,6, 2,0, 2,1);
232 path.close();
233 pathB.setFillType(SkPath::kWinding_FillType);
234 pathB.moveTo(0,2);
235 pathB.cubicTo(1,2, 1,0, 6,3);
236 pathB.close();
237 testPathOp(reporter, path, pathB, kDifference_PathOp);
238 }
239
cubicOp16d(skiatest::Reporter * reporter)240 static void cubicOp16d(skiatest::Reporter* reporter) {
241 SkPath path, pathB;
242 path.setFillType(SkPath::kWinding_FillType);
243 path.moveTo(0,2);
244 path.cubicTo(0,1, 3,0, 1,0);
245 path.close();
246 pathB.setFillType(SkPath::kWinding_FillType);
247 pathB.moveTo(0,3);
248 pathB.cubicTo(0,1, 2,0, 1,0);
249 pathB.close();
250 testPathOp(reporter, path, pathB, kDifference_PathOp);
251 }
252
cubicOp17d(skiatest::Reporter * reporter)253 static void cubicOp17d(skiatest::Reporter* reporter) {
254 SkPath path, pathB;
255 path.setFillType(SkPath::kWinding_FillType);
256 path.moveTo(0,2);
257 path.cubicTo(0,2, 4,0, 2,1);
258 path.close();
259 pathB.setFillType(SkPath::kWinding_FillType);
260 pathB.moveTo(0,4);
261 pathB.cubicTo(1,2, 2,0, 2,0);
262 pathB.close();
263 testPathOp(reporter, path, pathB, kDifference_PathOp);
264 }
265
cubicOp18d(skiatest::Reporter * reporter)266 static void cubicOp18d(skiatest::Reporter* reporter) {
267 SkPath path, pathB;
268 path.setFillType(SkPath::kWinding_FillType);
269 path.moveTo(0,1);
270 path.cubicTo(3,5, 2,0, 2,1);
271 path.close();
272 pathB.setFillType(SkPath::kWinding_FillType);
273 pathB.moveTo(0,2);
274 pathB.cubicTo(1,2, 1,0, 5,3);
275 pathB.close();
276 testPathOp(reporter, path, pathB, kDifference_PathOp);
277 }
278
cubicOp19i(skiatest::Reporter * reporter)279 static void cubicOp19i(skiatest::Reporter* reporter) {
280 SkPath path, pathB;
281 path.setFillType(SkPath::kWinding_FillType);
282 path.moveTo(0,2);
283 path.cubicTo(0,1, 2,1, 6,2);
284 path.close();
285 pathB.setFillType(SkPath::kWinding_FillType);
286 pathB.moveTo(1,2);
287 pathB.cubicTo(2,6, 2,0, 1,0);
288 pathB.close();
289 testPathOp(reporter, path, pathB, kIntersect_PathOp);
290 }
291
cubicOp20d(skiatest::Reporter * reporter)292 static void cubicOp20d(skiatest::Reporter* reporter) {
293 SkPath path, pathB;
294 path.setFillType(SkPath::kWinding_FillType);
295 path.moveTo(0,1);
296 path.cubicTo(0,1, 6,0, 2,1);
297 path.close();
298 pathB.setFillType(SkPath::kWinding_FillType);
299 pathB.moveTo(0,6);
300 pathB.cubicTo(1,2, 1,0, 1,0);
301 pathB.close();
302 testPathOp(reporter, path, pathB, kDifference_PathOp);
303 }
304
cubicOp21d(skiatest::Reporter * reporter)305 static void cubicOp21d(skiatest::Reporter* reporter) {
306 SkPath path, pathB;
307 path.setFillType(SkPath::kWinding_FillType);
308 path.moveTo(0,1);
309 path.cubicTo(0,1, 2,1, 6,5);
310 path.close();
311 pathB.setFillType(SkPath::kWinding_FillType);
312 pathB.moveTo(1,2);
313 pathB.cubicTo(5,6, 1,0, 1,0);
314 pathB.close();
315 testPathOp(reporter, path, pathB, kDifference_PathOp);
316 }
317
cubicOp22d(skiatest::Reporter * reporter)318 static void cubicOp22d(skiatest::Reporter* reporter) {
319 SkPath path, pathB;
320 path.setFillType(SkPath::kWinding_FillType);
321 path.moveTo(0,1);
322 path.cubicTo(2,3, 3,0, 2,1);
323 path.close();
324 pathB.setFillType(SkPath::kWinding_FillType);
325 pathB.moveTo(0,3);
326 pathB.cubicTo(1,2, 1,0, 3,2);
327 pathB.close();
328 testPathOp(reporter, path, pathB, kDifference_PathOp);
329 }
330
cubicOp23d(skiatest::Reporter * reporter)331 static void cubicOp23d(skiatest::Reporter* reporter) {
332 SkPath path, pathB;
333 path.setFillType(SkPath::kWinding_FillType);
334 path.moveTo(0,1);
335 path.cubicTo(1,2, 4,0, 2,1);
336 path.close();
337 pathB.setFillType(SkPath::kWinding_FillType);
338 pathB.moveTo(0,4);
339 pathB.cubicTo(1,2, 1,0, 2,1);
340 pathB.close();
341 testPathOp(reporter, path, pathB, kDifference_PathOp);
342 }
343
cubicOp24d(skiatest::Reporter * reporter)344 static void cubicOp24d(skiatest::Reporter* reporter) {
345 SkPath path, pathB;
346 path.setFillType(SkPath::kWinding_FillType);
347 path.moveTo(0,1);
348 path.cubicTo(1,2, 2,0, 3,2);
349 path.close();
350 pathB.setFillType(SkPath::kWinding_FillType);
351 pathB.moveTo(0,2);
352 pathB.cubicTo(2,3, 1,0, 2,1);
353 pathB.close();
354 testPathOp(reporter, path, pathB, kDifference_PathOp);
355 }
356
testIntersect1(skiatest::Reporter * reporter)357 static void testIntersect1(skiatest::Reporter* reporter) {
358 SkPath one, two;
359 one.addRect(0, 0, 6, 6, SkPath::kCW_Direction);
360 two.addRect(3, 3, 9, 9, SkPath::kCW_Direction);
361 testPathOp(reporter, one, two, kIntersect_PathOp);
362 }
363
testUnion1(skiatest::Reporter * reporter)364 static void testUnion1(skiatest::Reporter* reporter) {
365 SkPath one, two;
366 one.addRect(0, 0, 6, 6, SkPath::kCW_Direction);
367 two.addRect(3, 3, 9, 9, SkPath::kCW_Direction);
368 testPathOp(reporter, one, two, kUnion_PathOp);
369 }
370
testDiff1(skiatest::Reporter * reporter)371 static void testDiff1(skiatest::Reporter* reporter) {
372 SkPath one, two;
373 one.addRect(0, 0, 6, 6, SkPath::kCW_Direction);
374 two.addRect(3, 3, 9, 9, SkPath::kCW_Direction);
375 testPathOp(reporter, one, two, kDifference_PathOp);
376 }
377
testXor1(skiatest::Reporter * reporter)378 static void testXor1(skiatest::Reporter* reporter) {
379 SkPath one, two;
380 one.addRect(0, 0, 6, 6, SkPath::kCW_Direction);
381 two.addRect(3, 3, 9, 9, SkPath::kCW_Direction);
382 testPathOp(reporter, one, two, kXOR_PathOp);
383 }
384
testIntersect2(skiatest::Reporter * reporter)385 static void testIntersect2(skiatest::Reporter* reporter) {
386 SkPath one, two;
387 one.addRect(0, 0, 6, 6, SkPath::kCW_Direction);
388 two.addRect(0, 3, 9, 9, SkPath::kCW_Direction);
389 testPathOp(reporter, one, two, kIntersect_PathOp);
390 }
391
testUnion2(skiatest::Reporter * reporter)392 static void testUnion2(skiatest::Reporter* reporter) {
393 SkPath one, two;
394 one.addRect(0, 0, 6, 6, SkPath::kCW_Direction);
395 two.addRect(0, 3, 9, 9, SkPath::kCW_Direction);
396 testPathOp(reporter, one, two, kUnion_PathOp);
397 }
398
testDiff2(skiatest::Reporter * reporter)399 static void testDiff2(skiatest::Reporter* reporter) {
400 SkPath one, two;
401 one.addRect(0, 0, 6, 6, SkPath::kCW_Direction);
402 two.addRect(0, 3, 9, 9, SkPath::kCW_Direction);
403 testPathOp(reporter, one, two, kDifference_PathOp);
404 }
405
testXor2(skiatest::Reporter * reporter)406 static void testXor2(skiatest::Reporter* reporter) {
407 SkPath one, two;
408 one.addRect(0, 0, 6, 6, SkPath::kCW_Direction);
409 two.addRect(0, 3, 9, 9, SkPath::kCW_Direction);
410 testPathOp(reporter, one, two, kXOR_PathOp);
411 }
412
testOp1d(skiatest::Reporter * reporter)413 static void testOp1d(skiatest::Reporter* reporter) {
414 SkPath path, pathB;
415 path.setFillType(SkPath::kWinding_FillType);
416 path.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
417 path.addRect(0, 0, 2, 2, SkPath::kCW_Direction);
418 pathB.setFillType(SkPath::kWinding_FillType);
419 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
420 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
421 testPathOp(reporter, path, pathB, kDifference_PathOp);
422 }
423
testOp2d(skiatest::Reporter * reporter)424 static void testOp2d(skiatest::Reporter* reporter) {
425 SkPath path, pathB;
426 path.setFillType(SkPath::kWinding_FillType);
427 path.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
428 path.addRect(0, 0, 2, 2, SkPath::kCW_Direction);
429 pathB.setFillType(SkPath::kEvenOdd_FillType);
430 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
431 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
432 testPathOp(reporter, path, pathB, kDifference_PathOp);
433 }
434
testOp3d(skiatest::Reporter * reporter)435 static void testOp3d(skiatest::Reporter* reporter) {
436 SkPath path, pathB;
437 path.setFillType(SkPath::kWinding_FillType);
438 path.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
439 path.addRect(1, 1, 2, 2, SkPath::kCW_Direction);
440 pathB.setFillType(SkPath::kWinding_FillType);
441 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
442 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
443 testPathOp(reporter, path, pathB, kDifference_PathOp);
444 }
445
testOp1u(skiatest::Reporter * reporter)446 static void testOp1u(skiatest::Reporter* reporter) {
447 SkPath path, pathB;
448 path.setFillType(SkPath::kWinding_FillType);
449 path.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
450 path.addRect(0, 0, 3, 3, SkPath::kCW_Direction);
451 pathB.setFillType(SkPath::kWinding_FillType);
452 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
453 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
454 testPathOp(reporter, path, pathB, kUnion_PathOp);
455 }
456
testOp4d(skiatest::Reporter * reporter)457 static void testOp4d(skiatest::Reporter* reporter) {
458 SkPath path, pathB;
459 path.setFillType(SkPath::kWinding_FillType);
460 path.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
461 path.addRect(2, 2, 4, 4, SkPath::kCW_Direction);
462 pathB.setFillType(SkPath::kWinding_FillType);
463 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
464 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
465 testPathOp(reporter, path, pathB, kDifference_PathOp);
466 }
467
testOp5d(skiatest::Reporter * reporter)468 static void testOp5d(skiatest::Reporter* reporter) {
469 SkPath path, pathB;
470 path.setFillType(SkPath::kEvenOdd_FillType);
471 path.addRect(0, 0, 2, 2, SkPath::kCW_Direction);
472 path.addRect(0, 0, 3, 3, SkPath::kCW_Direction);
473 pathB.setFillType(SkPath::kEvenOdd_FillType);
474 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
475 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
476 testPathOp(reporter, path, pathB, kDifference_PathOp);
477 }
478
testOp6d(skiatest::Reporter * reporter)479 static void testOp6d(skiatest::Reporter* reporter) {
480 SkPath path, pathB;
481 path.setFillType(SkPath::kEvenOdd_FillType);
482 path.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
483 path.addRect(0, 0, 3, 3, SkPath::kCW_Direction);
484 pathB.setFillType(SkPath::kWinding_FillType);
485 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
486 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
487 testPathOp(reporter, path, pathB, kDifference_PathOp);
488 }
489
testOp7d(skiatest::Reporter * reporter)490 static void testOp7d(skiatest::Reporter* reporter) {
491 SkPath path, pathB;
492 path.setFillType(SkPath::kEvenOdd_FillType);
493 path.addRect(0, 0, 2, 2, SkPath::kCW_Direction);
494 path.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
495 pathB.setFillType(SkPath::kEvenOdd_FillType);
496 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
497 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
498 testPathOp(reporter, path, pathB, kDifference_PathOp);
499 }
500
testOp2u(skiatest::Reporter * reporter)501 static void testOp2u(skiatest::Reporter* reporter) {
502 SkPath path, pathB;
503 path.setFillType(SkPath::kEvenOdd_FillType);
504 path.addRect(0, 0, 2, 2, SkPath::kCW_Direction);
505 path.addRect(0, 0, 2, 2, SkPath::kCW_Direction);
506 pathB.setFillType(SkPath::kWinding_FillType);
507 pathB.addRect(0, 0, 3, 3, SkPath::kCW_Direction);
508 pathB.addRect(1, 1, 2, 2, SkPath::kCW_Direction);
509 testPathOp(reporter, path, pathB, kUnion_PathOp);
510 }
511
testOp8d(skiatest::Reporter * reporter)512 static void testOp8d(skiatest::Reporter* reporter) {
513 SkPath path, pathB;
514 path.addRect(0, 0, 640, 480);
515 pathB.moveTo(577330, 1971.72f);
516 pathB.cubicTo(10.7082f, -116.596f, 262.057f, 45.6468f, 294.694f, 1.96237f);
517 pathB.close();
518 testPathOp(reporter, path, pathB, kDifference_PathOp);
519 }
cubicOp25i(skiatest::Reporter * reporter)520 static void cubicOp25i(skiatest::Reporter* reporter) {
521 SkPath path, pathB;
522 path.setFillType(SkPath::kWinding_FillType);
523 path.moveTo(0,1);
524 path.cubicTo(2,4, 5,0, 3,2);
525 path.close();
526 pathB.setFillType(SkPath::kWinding_FillType);
527 pathB.moveTo(0,5);
528 pathB.cubicTo(2,3, 1,0, 4,2);
529 pathB.close();
530 testPathOp(reporter, path, pathB, kIntersect_PathOp);
531 }
532
cubicOp26d(skiatest::Reporter * reporter)533 static void cubicOp26d(skiatest::Reporter* reporter) {
534 SkPath path, pathB;
535 path.setFillType(SkPath::kWinding_FillType);
536 path.moveTo(0,1);
537 path.cubicTo(3,4, 4,0, 3,2);
538 path.close();
539 pathB.setFillType(SkPath::kWinding_FillType);
540 pathB.moveTo(0,4);
541 pathB.cubicTo(2,3, 1,0, 4,3);
542 pathB.close();
543 testPathOp(reporter, path, pathB, kDifference_PathOp);
544 }
545
cubicOp27d(skiatest::Reporter * reporter)546 static void cubicOp27d(skiatest::Reporter* reporter) {
547 SkPath path, pathB;
548 path.setFillType(SkPath::kWinding_FillType);
549 path.moveTo(0,1);
550 path.cubicTo(3,6, 1,0, 5,2);
551 path.close();
552 pathB.setFillType(SkPath::kWinding_FillType);
553 pathB.moveTo(0,1);
554 pathB.cubicTo(2,5, 1,0, 6,3);
555 pathB.close();
556 testPathOp(reporter, path, pathB, kDifference_PathOp);
557 }
558
cubicOp28u(skiatest::Reporter * reporter)559 static void cubicOp28u(skiatest::Reporter* reporter) {
560 SkPath path, pathB;
561 path.setFillType(SkPath::kWinding_FillType);
562 path.moveTo(0,1);
563 path.cubicTo(1,4, 6,0, 3,2);
564 path.close();
565 pathB.setFillType(SkPath::kWinding_FillType);
566 pathB.moveTo(0,6);
567 pathB.cubicTo(2,3, 1,0, 4,1);
568 pathB.close();
569 testPathOp(reporter, path, pathB, kUnion_PathOp);
570 }
571
cubicOp29d(skiatest::Reporter * reporter)572 static void cubicOp29d(skiatest::Reporter* reporter) {
573 SkPath path, pathB;
574 path.setFillType(SkPath::kWinding_FillType);
575 path.moveTo(0,1);
576 path.cubicTo(2,5, 6,0, 4,2);
577 path.close();
578 pathB.setFillType(SkPath::kWinding_FillType);
579 pathB.moveTo(0,6);
580 pathB.cubicTo(2,4, 1,0, 5,2);
581 pathB.close();
582 testPathOp(reporter, path, pathB, kDifference_PathOp);
583 }
584
cubicOp30d(skiatest::Reporter * reporter)585 static void cubicOp30d(skiatest::Reporter* reporter) {
586 SkPath path, pathB;
587 path.setFillType(SkPath::kWinding_FillType);
588 path.moveTo(0,1);
589 path.cubicTo(2,5, 6,0, 5,3);
590 path.close();
591 pathB.setFillType(SkPath::kWinding_FillType);
592 pathB.moveTo(0,6);
593 pathB.cubicTo(3,5, 1,0, 5,2);
594 pathB.close();
595 testPathOp(reporter, path, pathB, kDifference_PathOp);
596 }
597
cubicOp31d(skiatest::Reporter * reporter)598 static void cubicOp31d(skiatest::Reporter* reporter) {
599 SkPath path, pathB;
600 path.setFillType(SkPath::kWinding_FillType);
601 path.moveTo(0,2);
602 path.cubicTo(0,3, 2,1, 4,0);
603 path.close();
604 pathB.setFillType(SkPath::kWinding_FillType);
605 pathB.moveTo(1,2);
606 pathB.cubicTo(0,4, 2,0, 3,0);
607 pathB.close();
608 testPathOp(reporter, path, pathB, kDifference_PathOp);
609 }
610
cubicOp31u(skiatest::Reporter * reporter)611 static void cubicOp31u(skiatest::Reporter* reporter) {
612 SkPath path, pathB;
613 path.setFillType(SkPath::kWinding_FillType);
614 path.moveTo(0,2);
615 path.cubicTo(0,3, 2,1, 4,0);
616 path.close();
617 pathB.setFillType(SkPath::kWinding_FillType);
618 pathB.moveTo(1,2);
619 pathB.cubicTo(0,4, 2,0, 3,0);
620 pathB.close();
621 testPathOp(reporter, path, pathB, kUnion_PathOp);
622 }
623
cubicOp31x(skiatest::Reporter * reporter)624 static void cubicOp31x(skiatest::Reporter* reporter) {
625 SkPath path, pathB;
626 path.setFillType(SkPath::kWinding_FillType);
627 path.moveTo(0,2);
628 path.cubicTo(0,3, 2,1, 4,0);
629 path.close();
630 pathB.setFillType(SkPath::kWinding_FillType);
631 pathB.moveTo(1,2);
632 pathB.cubicTo(0,4, 2,0, 3,0);
633 pathB.close();
634 testPathOp(reporter, path, pathB, kXOR_PathOp);
635 }
636
cubicOp32d(skiatest::Reporter * reporter)637 static void cubicOp32d(skiatest::Reporter* reporter) {
638 SkPath path, pathB;
639 path.setFillType(SkPath::kWinding_FillType);
640 path.moveTo(0,1);
641 path.cubicTo(1,2, 6,0, 3,1);
642 path.close();
643 pathB.setFillType(SkPath::kWinding_FillType);
644 pathB.moveTo(0,6);
645 pathB.cubicTo(1,3, 1,0, 2,1);
646 pathB.close();
647 testPathOp(reporter, path, pathB, kDifference_PathOp);
648 }
649
cubicOp33i(skiatest::Reporter * reporter)650 static void cubicOp33i(skiatest::Reporter* reporter) {
651 SkPath path, pathB;
652 path.setFillType(SkPath::kWinding_FillType);
653 path.moveTo(0,1);
654 path.cubicTo(1,2, 6,0, 3,1);
655 path.close();
656 pathB.setFillType(SkPath::kWinding_FillType);
657 pathB.moveTo(0,6);
658 pathB.cubicTo(1,3, 1,0, 2,1);
659 pathB.close();
660 testPathOp(reporter, path, pathB, kIntersect_PathOp);
661 }
662
cubicOp34d(skiatest::Reporter * reporter)663 static void cubicOp34d(skiatest::Reporter* reporter) {
664 SkPath path, pathB;
665 path.setFillType(SkPath::kWinding_FillType);
666 path.moveTo(0,1);
667 path.cubicTo(3,5, 2,1, 3,1);
668 path.close();
669 pathB.setFillType(SkPath::kWinding_FillType);
670 pathB.moveTo(1,2);
671 pathB.cubicTo(1,3, 1,0, 5,3);
672 pathB.close();
673 testPathOp(reporter, path, pathB, kDifference_PathOp);
674 }
675
cubicOp35d(skiatest::Reporter * reporter)676 static void cubicOp35d(skiatest::Reporter* reporter) {
677 SkPath path, pathB;
678 path.setFillType(SkPath::kWinding_FillType);
679 path.moveTo(0,1);
680 path.cubicTo(1,5, 2,1, 4,0);
681 path.close();
682 pathB.setFillType(SkPath::kWinding_FillType);
683 pathB.moveTo(1,2);
684 pathB.cubicTo(0,4, 1,0, 5,1);
685 pathB.close();
686 testPathOp(reporter, path, pathB, kDifference_PathOp);
687 }
688
cubicOp36u(skiatest::Reporter * reporter)689 static void cubicOp36u(skiatest::Reporter* reporter) {
690 SkPath path, pathB;
691 path.setFillType(SkPath::kWinding_FillType);
692 path.moveTo(0,1);
693 path.cubicTo(1,6, 2,0, 5,1);
694 path.close();
695 pathB.setFillType(SkPath::kWinding_FillType);
696 pathB.moveTo(0,2);
697 pathB.cubicTo(1,5, 1,0, 6,1);
698 pathB.close();
699 testPathOp(reporter, path, pathB, kUnion_PathOp);
700 }
701
cubicOp37d(skiatest::Reporter * reporter)702 static void cubicOp37d(skiatest::Reporter* reporter) {
703 SkPath path, pathB;
704 path.setFillType(SkPath::kWinding_FillType);
705 path.moveTo(0,1);
706 path.cubicTo(2,6, 6,1, 4,3);
707 path.close();
708 pathB.setFillType(SkPath::kWinding_FillType);
709 pathB.moveTo(1,6);
710 pathB.cubicTo(3,4, 1,0, 6,2);
711 pathB.close();
712 testPathOp(reporter, path, pathB, kDifference_PathOp);
713 }
714
715 // this fails to detect a cubic/cubic intersection
716 // the slight overlap is missed when the cubics are approximated by quadratics
717 // and the subsequent line/cubic intersection also (correctly) misses the intersection
718 // if the line/cubic was a matching line/approx.quadratic then the missing intersection
719 // could have been detected
cubicOp38d(skiatest::Reporter * reporter)720 static void cubicOp38d(skiatest::Reporter* reporter) {
721 SkPath path, pathB;
722 path.setFillType(SkPath::kWinding_FillType);
723 path.moveTo(0,1);
724 path.cubicTo(0,6, 3,2, 4,1);
725 path.close();
726 pathB.setFillType(SkPath::kWinding_FillType);
727 pathB.moveTo(2,3);
728 pathB.cubicTo(1,4, 1,0, 6,0);
729 pathB.close();
730 testPathOp(reporter, path, pathB, kDifference_PathOp);
731 }
732
cubicOp39d(skiatest::Reporter * reporter)733 static void cubicOp39d(skiatest::Reporter* reporter) {
734 SkPath path, pathB;
735 path.setFillType(SkPath::kWinding_FillType);
736 path.moveTo(0,1);
737 path.cubicTo(2,3, 5,1, 4,3);
738 path.close();
739 pathB.setFillType(SkPath::kWinding_FillType);
740 pathB.moveTo(1,5);
741 pathB.cubicTo(3,4, 1,0, 3,2);
742 pathB.close();
743 testPathOp(reporter, path, pathB, kDifference_PathOp);
744 }
745
cubicOp40d(skiatest::Reporter * reporter)746 static void cubicOp40d(skiatest::Reporter* reporter) {
747 SkPath path, pathB;
748 path.setFillType(SkPath::kWinding_FillType);
749 path.moveTo(0,1);
750 path.cubicTo(1,5, 3,2, 4,2);
751 path.close();
752 pathB.setFillType(SkPath::kWinding_FillType);
753 pathB.moveTo(2,3);
754 pathB.cubicTo(2,4, 1,0, 5,1);
755 pathB.close();
756 testPathOp(reporter, path, pathB, kDifference_PathOp);
757 }
758
cubicOp41i(skiatest::Reporter * reporter)759 static void cubicOp41i(skiatest::Reporter* reporter) {
760 SkPath path, pathB;
761 path.setFillType(SkPath::kWinding_FillType);
762 path.moveTo(0,1);
763 path.cubicTo(2,6, 4,3, 6,4);
764 path.close();
765 pathB.setFillType(SkPath::kWinding_FillType);
766 pathB.moveTo(3,4);
767 pathB.cubicTo(4,6, 1,0, 6,2);
768 pathB.close();
769 testPathOp(reporter, path, pathB, kIntersect_PathOp);
770 }
771
cubicOp42d(skiatest::Reporter * reporter)772 static void cubicOp42d(skiatest::Reporter* reporter) {
773 SkPath path, pathB;
774 path.setFillType(SkPath::kWinding_FillType);
775 path.moveTo(0,1);
776 path.cubicTo(1,2, 6,5, 5,4);
777 path.close();
778 pathB.setFillType(SkPath::kWinding_FillType);
779 pathB.moveTo(5,6);
780 pathB.cubicTo(4,5, 1,0, 2,1);
781 pathB.close();
782 testPathOp(reporter, path, pathB, kDifference_PathOp);
783 }
784
cubicOp43d(skiatest::Reporter * reporter)785 static void cubicOp43d(skiatest::Reporter* reporter) {
786 SkPath path, pathB;
787 path.setFillType(SkPath::kWinding_FillType);
788 path.moveTo(0,2);
789 path.cubicTo(1,2, 4,0, 3,1);
790 path.close();
791 pathB.setFillType(SkPath::kWinding_FillType);
792 pathB.moveTo(0,4);
793 pathB.cubicTo(1,3, 2,0, 2,1);
794 pathB.close();
795 testPathOp(reporter, path, pathB, kDifference_PathOp);
796 }
797
cubicOp44d(skiatest::Reporter * reporter)798 static void cubicOp44d(skiatest::Reporter* reporter) {
799 SkPath path, pathB;
800 path.setFillType(SkPath::kWinding_FillType);
801 path.moveTo(0,2);
802 path.cubicTo(3,6, 4,0, 3,2);
803 path.close();
804 pathB.setFillType(SkPath::kWinding_FillType);
805 pathB.moveTo(0,4);
806 pathB.cubicTo(2,3, 2,0, 6,3);
807 pathB.close();
808 testPathOp(reporter, path, pathB, kDifference_PathOp);
809 }
810
cubicOp45d(skiatest::Reporter * reporter)811 static void cubicOp45d(skiatest::Reporter* reporter) {
812 SkPath path, pathB;
813 path.setFillType(SkPath::kWinding_FillType);
814 path.moveTo(0,2);
815 path.cubicTo(2,4, 4,0, 3,2);
816 path.close();
817 pathB.setFillType(SkPath::kWinding_FillType);
818 pathB.moveTo(0,4);
819 pathB.cubicTo(2,3, 2,0, 4,2);
820 pathB.close();
821 testPathOp(reporter, path, pathB, kDifference_PathOp);
822 }
823
cubicOp46d(skiatest::Reporter * reporter)824 static void cubicOp46d(skiatest::Reporter* reporter) {
825 SkPath path, pathB;
826 path.setFillType(SkPath::kWinding_FillType);
827 path.moveTo(0,2);
828 path.cubicTo(3,5, 5,0, 4,2);
829 path.close();
830 pathB.setFillType(SkPath::kWinding_FillType);
831 pathB.moveTo(0,5);
832 pathB.cubicTo(2,4, 2,0, 5,3);
833 pathB.close();
834 testPathOp(reporter, path, pathB, kDifference_PathOp);
835 }
836
cubicOp47d(skiatest::Reporter * reporter)837 static void cubicOp47d(skiatest::Reporter* reporter) {
838 SkPath path, pathB;
839 path.setFillType(SkPath::kWinding_FillType);
840 path.moveTo(0,1);
841 path.cubicTo(1,6, 6,2, 5,4);
842 path.close();
843 pathB.setFillType(SkPath::kWinding_FillType);
844 pathB.moveTo(2,6);
845 pathB.cubicTo(4,5, 1,0, 6,1);
846 pathB.close();
847 testPathOp(reporter, path, pathB, kDifference_PathOp);
848 }
849
cubicOp48d(skiatest::Reporter * reporter)850 static void cubicOp48d(skiatest::Reporter* reporter) {
851 SkPath path, pathB;
852 path.setFillType(SkPath::kWinding_FillType);
853 path.moveTo(0,2);
854 path.cubicTo(2,3, 5,1, 3,2);
855 path.close();
856 pathB.setFillType(SkPath::kWinding_FillType);
857 pathB.moveTo(1,5);
858 pathB.cubicTo(2,3, 2,0, 3,2);
859 pathB.close();
860 testPathOp(reporter, path, pathB, kDifference_PathOp);
861 }
862
cubicOp49d(skiatest::Reporter * reporter)863 static void cubicOp49d(skiatest::Reporter* reporter) {
864 SkPath path, pathB;
865 path.setFillType(SkPath::kWinding_FillType);
866 path.moveTo(0,2);
867 path.cubicTo(1,5, 3,2, 4,1);
868 path.close();
869 pathB.setFillType(SkPath::kWinding_FillType);
870 pathB.moveTo(2,3);
871 pathB.cubicTo(1,4, 2,0, 5,1);
872 pathB.close();
873 testPathOp(reporter, path, pathB, kDifference_PathOp);
874 }
875
cubicOp50d(skiatest::Reporter * reporter)876 static void cubicOp50d(skiatest::Reporter* reporter) {
877 SkPath path, pathB;
878 path.setFillType(SkPath::kWinding_FillType);
879 path.moveTo(0,3);
880 path.cubicTo(1,6, 5,0, 5,1);
881 path.close();
882 pathB.setFillType(SkPath::kWinding_FillType);
883 pathB.moveTo(0,5);
884 pathB.cubicTo(1,5, 3,0, 6,1);
885 pathB.close();
886 testPathOp(reporter, path, pathB, kDifference_PathOp);
887 }
888
cubicOp51d(skiatest::Reporter * reporter)889 static void cubicOp51d(skiatest::Reporter* reporter) {
890 SkPath path, pathB;
891 path.setFillType(SkPath::kWinding_FillType);
892 path.moveTo(0,3);
893 path.cubicTo(1,2, 4,1, 6,0);
894 path.close();
895 pathB.setFillType(SkPath::kWinding_FillType);
896 pathB.moveTo(1,4);
897 pathB.cubicTo(0,6, 3,0, 2,1);
898 pathB.close();
899 testPathOp(reporter, path, pathB, kDifference_PathOp);
900 }
901
cubicOp52d(skiatest::Reporter * reporter)902 static void cubicOp52d(skiatest::Reporter* reporter) {
903 SkPath path, pathB;
904 path.setFillType(SkPath::kWinding_FillType);
905 path.moveTo(0,2);
906 path.cubicTo(1,2, 5,4, 4,3);
907 path.close();
908 pathB.setFillType(SkPath::kWinding_FillType);
909 pathB.moveTo(4,5);
910 pathB.cubicTo(3,4, 2,0, 2,1);
911 pathB.close();
912 testPathOp(reporter, path, pathB, kDifference_PathOp);
913 }
914
cubicOp53d(skiatest::Reporter * reporter)915 static void cubicOp53d(skiatest::Reporter* reporter) {
916 SkPath path, pathB;
917 path.setFillType(SkPath::kWinding_FillType);
918 path.moveTo(0,3);
919 path.cubicTo(1,2, 5,3, 2,1);
920 path.close();
921 pathB.setFillType(SkPath::kWinding_FillType);
922 pathB.moveTo(3,5);
923 pathB.cubicTo(1,2, 3,0, 2,1);
924 pathB.close();
925 testPathOp(reporter, path, pathB, kDifference_PathOp);
926 }
927
cubicOp54d(skiatest::Reporter * reporter)928 static void cubicOp54d(skiatest::Reporter* reporter) {
929 SkPath path, pathB;
930 path.setFillType(SkPath::kWinding_FillType);
931 path.moveTo(0,4);
932 path.cubicTo(1,3, 5,4, 4,2);
933 path.close();
934 pathB.setFillType(SkPath::kWinding_FillType);
935 pathB.moveTo(4,5);
936 pathB.cubicTo(2,4, 4,0, 3,1);
937 pathB.close();
938 testPathOp(reporter, path, pathB, kDifference_PathOp);
939 }
940
cubicOp55d(skiatest::Reporter * reporter)941 static void cubicOp55d(skiatest::Reporter* reporter) {
942 SkPath path, pathB;
943 path.setFillType(SkPath::kWinding_FillType);
944 path.moveTo(0,5);
945 path.cubicTo(1,3, 3,2, 5,0);
946 path.close();
947 pathB.setFillType(SkPath::kWinding_FillType);
948 pathB.moveTo(2,3);
949 pathB.cubicTo(0,5, 5,0, 3,1);
950 pathB.close();
951 testPathOp(reporter, path, pathB, kDifference_PathOp);
952 }
953
cubicOp56d(skiatest::Reporter * reporter)954 static void cubicOp56d(skiatest::Reporter* reporter) {
955 SkPath path, pathB;
956 path.setFillType(SkPath::kWinding_FillType);
957 path.moveTo(0,1);
958 path.cubicTo(2,6, 5,0, 2,1);
959 path.close();
960 pathB.setFillType(SkPath::kWinding_FillType);
961 pathB.moveTo(0,5);
962 pathB.cubicTo(1,2, 1,0, 6,2);
963 pathB.close();
964 testPathOp(reporter, path, pathB, kDifference_PathOp);
965 }
966
cubicOp57d(skiatest::Reporter * reporter)967 static void cubicOp57d(skiatest::Reporter* reporter) {
968 SkPath path, pathB;
969 path.setFillType(SkPath::kWinding_FillType);
970 path.moveTo(0,5);
971 path.cubicTo(0,5, 5,4, 6,4);
972 path.close();
973 pathB.setFillType(SkPath::kWinding_FillType);
974 pathB.moveTo(4,5);
975 pathB.cubicTo(4,6, 5,0, 5,0);
976 pathB.close();
977 testPathOp(reporter, path, pathB, kDifference_PathOp);
978 }
979
cubicOp58d(skiatest::Reporter * reporter)980 static void cubicOp58d(skiatest::Reporter* reporter) {
981 SkPath path, pathB;
982 path.setFillType(SkPath::kWinding_FillType);
983 path.moveTo(0,5);
984 path.cubicTo(3,4, 6,5, 5,3);
985 path.close();
986 pathB.setFillType(SkPath::kWinding_FillType);
987 pathB.moveTo(5,6);
988 pathB.cubicTo(3,5, 5,0, 4,3);
989 pathB.close();
990 testPathOp(reporter, path, pathB, kDifference_PathOp);
991 }
992
cubicOp59d(skiatest::Reporter * reporter)993 static void cubicOp59d(skiatest::Reporter* reporter) {
994 SkPath path, pathB;
995 path.setFillType(SkPath::kWinding_FillType);
996 path.moveTo(0,1);
997 path.cubicTo(5,6, 4,0, 4,1);
998 path.close();
999 pathB.setFillType(SkPath::kWinding_FillType);
1000 pathB.moveTo(0,4);
1001 pathB.cubicTo(1,4, 1,0, 6,5);
1002 pathB.close();
1003 testPathOp(reporter, path, pathB, kDifference_PathOp);
1004 }
1005
cubicOp60d(skiatest::Reporter * reporter)1006 static void cubicOp60d(skiatest::Reporter* reporter) {
1007 SkPath path, pathB;
1008 path.setFillType(SkPath::kWinding_FillType);
1009 path.moveTo(0,2);
1010 path.cubicTo(4,6, 6,0, 5,2);
1011 path.close();
1012 pathB.setFillType(SkPath::kWinding_FillType);
1013 pathB.moveTo(0,6);
1014 pathB.cubicTo(2,5, 2,0, 6,4);
1015 pathB.close();
1016 testPathOp(reporter, path, pathB, kDifference_PathOp);
1017 }
1018
cubicOp61d(skiatest::Reporter * reporter)1019 static void cubicOp61d(skiatest::Reporter* reporter) {
1020 SkPath path, pathB;
1021 path.setFillType(SkPath::kWinding_FillType);
1022 path.moveTo(1,2);
1023 path.cubicTo(0,5, 3,2, 6,1);
1024 path.close();
1025 pathB.setFillType(SkPath::kWinding_FillType);
1026 pathB.moveTo(2,3);
1027 pathB.cubicTo(1,6, 2,1, 5,0);
1028 pathB.close();
1029 testPathOp(reporter, path, pathB, kDifference_PathOp);
1030 }
1031
cubicOp62d(skiatest::Reporter * reporter)1032 static void cubicOp62d(skiatest::Reporter* reporter) {
1033 SkPath path, pathB;
1034 path.setFillType(SkPath::kWinding_FillType);
1035 path.moveTo(1,3);
1036 path.cubicTo(5,6, 5,3, 5,4);
1037 path.close();
1038 pathB.setFillType(SkPath::kWinding_FillType);
1039 pathB.moveTo(3,5);
1040 pathB.cubicTo(4,5, 3,1, 6,5);
1041 pathB.close();
1042 testPathOp(reporter, path, pathB, kDifference_PathOp);
1043 }
1044
cubicOp63d(skiatest::Reporter * reporter)1045 static void cubicOp63d(skiatest::Reporter* reporter) {
1046 SkPath path, pathB;
1047 path.setFillType(SkPath::kWinding_FillType);
1048 path.moveTo(2,3);
1049 path.cubicTo(0,4, 3,2, 5,3);
1050 path.close();
1051 pathB.setFillType(SkPath::kWinding_FillType);
1052 pathB.moveTo(2,3);
1053 pathB.cubicTo(3,5, 3,2, 4,0);
1054 pathB.close();
1055 testPathOp(reporter, path, pathB, kDifference_PathOp);
1056 }
1057
cubicOp64d(skiatest::Reporter * reporter)1058 static void cubicOp64d(skiatest::Reporter* reporter) {
1059 SkPath path, pathB;
1060 path.moveTo(0,1);
1061 path.cubicTo(0,1, 1,0, 3,0);
1062 path.lineTo(0,1);
1063 path.close();
1064 pathB.moveTo(0,1);
1065 pathB.cubicTo(0,3, 1,0, 1,0);
1066 pathB.lineTo(0,1);
1067 pathB.close();
1068 testPathOp(reporter, path, pathB, kDifference_PathOp);
1069 }
1070
cubicOp65d(skiatest::Reporter * reporter)1071 static void cubicOp65d(skiatest::Reporter* reporter) {
1072 SkPath path, pathB;
1073 path.moveTo(0,1);
1074 path.cubicTo(1,5, 1,0, 1,0);
1075 path.lineTo(0,1);
1076 path.close();
1077 pathB.moveTo(0,1);
1078 pathB.cubicTo(0,1, 1,0, 5,1);
1079 pathB.lineTo(0,1);
1080 pathB.close();
1081 testPathOp(reporter, path, pathB, kDifference_PathOp);
1082 }
1083
rectOp1d(skiatest::Reporter * reporter)1084 static void rectOp1d(skiatest::Reporter* reporter) {
1085 SkPath path, pathB;
1086 path.moveTo(0,1);
1087 path.cubicTo(0,1, 1,0, 3,0);
1088 path.lineTo(0,1);
1089 path.close();
1090 pathB.moveTo(0,1);
1091 pathB.cubicTo(0,3, 1,0, 1,0);
1092 pathB.lineTo(0,1);
1093 pathB.close();
1094 testPathOp(reporter, path, pathB, kDifference_PathOp);
1095 }
1096
cubicOp66u(skiatest::Reporter * reporter)1097 static void cubicOp66u(skiatest::Reporter* reporter) {
1098 SkPath path, pathB;
1099 path.setFillType(SkPath::kWinding_FillType);
1100 path.moveTo(0,1);
1101 path.cubicTo(2,6, 4,2, 5,3);
1102 path.close();
1103 pathB.setFillType(SkPath::kWinding_FillType);
1104 pathB.moveTo(2,4);
1105 pathB.cubicTo(3,5, 1,0, 6,2);
1106 pathB.close();
1107 testPathOp(reporter, path, pathB, kUnion_PathOp);
1108 }
1109
cubicOp67u(skiatest::Reporter * reporter)1110 static void cubicOp67u(skiatest::Reporter* reporter) {
1111 SkPath path, pathB;
1112 path.moveTo(3,5);
1113 path.cubicTo(1,6, 5,0, 3,1);
1114 path.lineTo(3,5);
1115 path.close();
1116 pathB.moveTo(0,5);
1117 pathB.cubicTo(1,3, 5,3, 6,1);
1118 pathB.lineTo(0,5);
1119 pathB.close();
1120 testPathOp(reporter, path, pathB, kUnion_PathOp);
1121 }
1122
cubicOp68u(skiatest::Reporter * reporter)1123 static void cubicOp68u(skiatest::Reporter* reporter) {
1124 SkPath path, pathB;
1125 path.moveTo(0,5);
1126 path.cubicTo(4,5, 4,1, 5,0);
1127 path.close();
1128 pathB.moveTo(1,4);
1129 pathB.cubicTo(0,5, 5,0, 5,4);
1130 pathB.close();
1131 testPathOp(reporter, path, pathB, kUnion_PathOp);
1132 }
1133
cubicOp69d(skiatest::Reporter * reporter)1134 static void cubicOp69d(skiatest::Reporter* reporter) {
1135 SkPath path, pathB;
1136 path.moveTo(1,3);
1137 path.cubicTo(0,1, 3,1, 2,0);
1138 path.close();
1139 pathB.moveTo(1,3);
1140 pathB.cubicTo(0,2, 3,1, 1,0);
1141 pathB.close();
1142 testPathOp(reporter, path, pathB, kDifference_PathOp);
1143 }
1144
1145 SkPathOp ops[] = {
1146 kUnion_PathOp,
1147 kXOR_PathOp,
1148 kReverseDifference_PathOp,
1149 kXOR_PathOp,
1150 kReverseDifference_PathOp,
1151 };
1152
rRect1(skiatest::Reporter * reporter)1153 static void rRect1(skiatest::Reporter* reporter) {
1154 SkScalar xA = 0.65f;
1155 SkScalar xB = 10.65f;
1156 SkScalar xC = 20.65f;
1157 SkScalar xD = 30.65f;
1158 SkScalar xE = 40.65f;
1159 SkScalar xF = 50.65f;
1160
1161 SkScalar yA = 0.65f;
1162 SkScalar yB = 10.65f;
1163 SkScalar yC = 20.65f;
1164 SkScalar yD = 30.65f;
1165 SkScalar yE = 40.65f;
1166 SkScalar yF = 50.65f;
1167 SkPath paths[5];
1168 SkRect rects[5];
1169 rects[0].set(xB, yB, xE, yE);
1170 paths[0].addRoundRect(rects[0], SkIntToScalar(5), SkIntToScalar(5)); // red
1171 rects[1].set(xA, yA, xD, yD);
1172 paths[1].addRoundRect(rects[1], SkIntToScalar(5), SkIntToScalar(5)); // green
1173 rects[2].set(xC, yA, xF, yD);
1174 paths[2].addRoundRect(rects[2], SkIntToScalar(5), SkIntToScalar(5)); // blue
1175 rects[3].set(xA, yC, xD, yF);
1176 paths[3].addRoundRect(rects[3], SkIntToScalar(5), SkIntToScalar(5)); // yellow
1177 rects[4].set(xC, yC, xF, yF);
1178 paths[4].addRoundRect(rects[4], SkIntToScalar(5), SkIntToScalar(5)); // cyan
1179 SkPath path;
1180 path.setFillType(SkPath::kInverseEvenOdd_FillType);
1181 for (int index = 0; index < 5; ++index) {
1182 testPathOp(reporter, path, paths[index], ops[index]);
1183 Op(path, paths[index], ops[index], &path);
1184 }
1185 }
1186
skp1(skiatest::Reporter * reporter)1187 static void skp1(skiatest::Reporter* reporter) {
1188 SkPath path;
1189 path.setFillType(SkPath::kEvenOdd_FillType);
1190 path.moveTo(189,7);
1191 path.cubicTo(189,5.34314585f, 190.34314f,4, 192,4);
1192 path.lineTo(243,4);
1193 path.cubicTo(244.65686f,4, 246,5.34314585f, 246,7);
1194 path.lineTo(246,21);
1195 path.cubicTo(246,22.6568546f, 244.65686f,24, 243,24);
1196 path.lineTo(192,24);
1197 path.cubicTo(190.34314f,24, 189,22.6568546f, 189,21);
1198 path.lineTo(189,7);
1199 path.close();
1200 path.moveTo(191,8);
1201 path.cubicTo(191,6.89543009f, 191.895432f,6, 193,6);
1202 path.lineTo(242,6);
1203 path.cubicTo(243.104568f,6, 244,6.89543009f, 244,8);
1204 path.lineTo(244,20);
1205 path.cubicTo(244,21.1045704f, 243.104568f,22, 242,22);
1206 path.lineTo(193,22);
1207 path.cubicTo(191.895432f,22, 191,21.1045704f, 191,20);
1208 path.lineTo(191,8);
1209 path.close();
1210 SkPath pathB;
1211 pathB.setFillType(SkPath::kWinding_FillType);
1212 pathB.moveTo(189,4);
1213 pathB.lineTo(199,14);
1214 pathB.lineTo(236,14);
1215 pathB.lineTo(246,4);
1216 pathB.lineTo(189,4);
1217 pathB.close();
1218 testPathOp(reporter, path, pathB, kIntersect_PathOp);
1219 }
1220
skp2(skiatest::Reporter * reporter)1221 static void skp2(skiatest::Reporter* reporter) {
1222 SkPath path;
1223 path.setFillType(SkPath::kEvenOdd_FillType);
1224 path.moveTo(253.000000f, 11757.0000f);
1225 path.lineTo(253.000000f, 222.000000f);
1226 path.lineTo(823.000000f, 222.000000f);
1227 path.lineTo(823.000000f, 11757.0000f);
1228 path.lineTo(253.000000f, 11757.0000f);
1229 path.close();
1230 SkPath pathB;
1231 pathB.setFillType(SkPath::kWinding_FillType);
1232 pathB.moveTo(258.000000f, 1028.00000f);
1233 pathB.lineTo(258.000000f, 1027.00000f);
1234 pathB.lineTo(823.000000f, 1027.00000f);
1235 pathB.lineTo(823.000000f, 1028.00000f);
1236 pathB.lineTo(258.000000f, 1028.00000f);
1237 pathB.close();
1238 testPathOp(reporter, path, pathB, kIntersect_PathOp);
1239 }
1240
skp3(skiatest::Reporter * reporter)1241 static void skp3(skiatest::Reporter* reporter) {
1242 SkPath path;
1243 path.setFillType(SkPath::kEvenOdd_FillType);
1244 path.moveTo(717.000000f, 507.000000f);
1245 path.lineTo(717.000000f, 425.000000f);
1246 path.lineTo(973.000000f, 425.000000f);
1247 path.lineTo(973.000000f, 507.000000f);
1248 path.quadTo(973.000000f, 508.242645f, 972.121582f, 509.121613f);
1249 path.quadTo(971.242615f, 510.000000f, 970.000000f, 510.000000f);
1250 path.lineTo(720.000000f, 510.000000f);
1251 path.quadTo(718.757385f, 510.000000f, 717.878418f, 509.121613f);
1252 path.quadTo(717.000000f, 508.242645f, 717.000000f, 507.000000f);
1253 path.close();
1254 path.moveTo(719.000000f, 426.000000f);
1255 path.lineTo(971.000000f, 426.000000f);
1256 path.lineTo(971.000000f, 506.000000f);
1257 path.cubicTo(971.000000f, 507.104584f, 970.104553f, 508.000000f, 969.000000f, 508.000000f);
1258 path.lineTo(721.000000f, 508.000000f);
1259 path.cubicTo(719.895447f, 508.000000f, 719.000000f, 507.104584f, 719.000000f, 506.000000f);
1260 path.lineTo(719.000000f, 426.000000f);
1261 path.close();
1262 SkPath pathB;
1263 pathB.setFillType(SkPath::kWinding_FillType);
1264 pathB.moveTo(717.000000f, 510.000000f);
1265 pathB.lineTo(760.000000f, 467.000000f);
1266 pathB.lineTo(930.000000f, 467.000000f);
1267 pathB.lineTo(973.000000f, 510.000000f);
1268 pathB.lineTo(717.000000f, 510.000000f);
1269 pathB.close();
1270 testPathOp(reporter, path, pathB, kIntersect_PathOp);
1271 }
1272
skp4(skiatest::Reporter * reporter)1273 static void skp4(skiatest::Reporter* reporter) {
1274 SkPath path;
1275 path.setFillType(SkPath::kEvenOdd_FillType);
1276 path.moveTo(230.756805f, 591.756775f);
1277 path.quadTo(232.514725f, 590.000000f, 235.000000f, 590.000000f);
1278 path.lineTo(300.000000f, 590.000000f);
1279 path.quadTo(302.485291f, 590.000000f, 304.243195f, 591.756775f);
1280 path.quadTo(306.000000f, 593.514709f, 306.000000f, 596.000000f);
1281 path.lineTo(306.000000f, 617.000000f);
1282 path.lineTo(229.000000f, 617.000000f);
1283 path.lineTo(229.000000f, 596.000000f);
1284 path.quadTo(229.000000f, 593.514709f, 230.756805f, 591.756775f);
1285 path.close();
1286 path.moveTo(231.000000f, 597.000000f);
1287 path.cubicTo(231.000000f, 594.238586f, 233.238571f, 592.000000f, 236.000000f, 592.000000f);
1288 path.lineTo(299.000000f, 592.000000f);
1289 path.cubicTo(301.761414f, 592.000000f, 304.000000f, 594.238586f, 304.000000f, 597.000000f);
1290 path.lineTo(304.000000f, 616.000000f);
1291 path.lineTo(231.000000f, 616.000000f);
1292 path.lineTo(231.000000f, 597.000000f);
1293 path.close();
1294 SkPath pathB;
1295 pathB.setFillType(SkPath::kWinding_FillType);
1296 pathB.moveTo(306.000000f, 590.000000f);
1297 pathB.lineTo(292.000000f, 604.000000f);
1298 pathB.lineTo(305.000000f, 617.000000f);
1299 pathB.lineTo(306.000000f, 617.000000f);
1300 pathB.lineTo(306.000000f, 590.000000f);
1301 pathB.close();
1302 testPathOp(reporter, path, pathB, kIntersect_PathOp);
1303 }
1304
skp5(skiatest::Reporter * reporter)1305 static void skp5(skiatest::Reporter* reporter) {
1306 SkPath path;
1307 path.setFillType(SkPath::kEvenOdd_FillType);
1308 path.moveTo(18.0000000f, 226.000000f);
1309 path.quadTo(14.6862917f, 226.000000f, 12.3423996f, 228.342407f);
1310 path.quadTo(10.0000000f, 230.686295f, 10.0000000f, 234.000000f);
1311 path.lineTo(10.0000000f, 253.000000f);
1312 path.lineTo(1247.00000f, 253.000000f);
1313 path.lineTo(1247.00000f, 234.000000f);
1314 path.quadTo(1247.00000f, 230.686295f, 1244.65759f, 228.342407f);
1315 path.quadTo(1242.31372f, 226.000000f, 1239.00000f, 226.000000f);
1316 path.lineTo(18.0000000f, 226.000000f);
1317 path.close();
1318 SkPath pathB;
1319 pathB.setFillType(SkPath::kInverseWinding_FillType);
1320 pathB.moveTo(18.0000000f, 226.000000f);
1321 pathB.lineTo(1239.00000f, 226.000000f);
1322 pathB.cubicTo(1243.41833f, 226.000000f, 1247.00000f, 229.581726f, 1247.00000f, 234.000000f);
1323 pathB.lineTo(1247.00000f, 252.000000f);
1324 pathB.lineTo(10.0000000f, 252.000000f);
1325 pathB.lineTo(10.0000000f, 234.000000f);
1326 pathB.cubicTo(10.0000000f, 229.581726f, 13.5817204f, 226.000000f, 18.0000000f, 226.000000f);
1327 pathB.close();
1328 testPathOp(reporter, path, pathB, kIntersect_PathOp);
1329 }
1330
cubicOp70d(skiatest::Reporter * reporter)1331 static void cubicOp70d(skiatest::Reporter* reporter) {
1332 SkPath path, pathB;
1333 path.setFillType(SkPath::kWinding_FillType);
1334 path.moveTo(0,1);
1335 path.cubicTo(0,5, 4,0, 5,0);
1336 path.close();
1337 pathB.setFillType(SkPath::kWinding_FillType);
1338 pathB.moveTo(0,4);
1339 pathB.cubicTo(0,5, 1,0, 5,0);
1340 pathB.close();
1341 testPathOp(reporter, path, pathB, kDifference_PathOp);
1342 }
1343
cubicOp71d(skiatest::Reporter * reporter)1344 static void cubicOp71d(skiatest::Reporter* reporter) {
1345 SkPath path, pathB;
1346 path.setFillType(SkPath::kWinding_FillType);
1347 path.moveTo(0,1);
1348 path.cubicTo(0,5, 4,1, 6,4);
1349 path.close();
1350 pathB.setFillType(SkPath::kWinding_FillType);
1351 pathB.moveTo(1,4);
1352 pathB.cubicTo(4,6, 1,0, 5,0);
1353 pathB.close();
1354 testPathOp(reporter, path, pathB, kDifference_PathOp);
1355 }
1356
cubicOp72i(skiatest::Reporter * reporter)1357 static void cubicOp72i(skiatest::Reporter* reporter) {
1358 SkPath path, pathB;
1359 path.setFillType(SkPath::kWinding_FillType);
1360 path.moveTo(0,1);
1361 path.cubicTo(0,5, 5,2, 5,4);
1362 path.close();
1363 pathB.setFillType(SkPath::kWinding_FillType);
1364 pathB.moveTo(2,5);
1365 pathB.cubicTo(4,5, 1,0, 5,0);
1366 pathB.close();
1367 testPathOp(reporter, path, pathB, kIntersect_PathOp);
1368 }
1369
cubicOp73d(skiatest::Reporter * reporter)1370 static void cubicOp73d(skiatest::Reporter* reporter) {
1371 SkPath path, pathB;
1372 path.setFillType(SkPath::kWinding_FillType);
1373 path.moveTo(0,1);
1374 path.cubicTo(3,4, 4,0, 6,4);
1375 path.lineTo(0,1);
1376 path.close();
1377 pathB.setFillType(SkPath::kWinding_FillType);
1378 pathB.moveTo(0,4);
1379 pathB.cubicTo(4,6, 1,0, 4,3);
1380 pathB.lineTo(0,4);
1381 pathB.close();
1382 testPathOp(reporter, path, pathB, kDifference_PathOp);
1383 }
1384
cubicOp74d(skiatest::Reporter * reporter)1385 static void cubicOp74d(skiatest::Reporter* reporter) {
1386 SkPath path, pathB;
1387 path.setFillType(SkPath::kWinding_FillType);
1388 path.moveTo(0,1);
1389 path.cubicTo(1,5, 5,1, 5,1);
1390 path.lineTo(0,1);
1391 path.close();
1392 pathB.setFillType(SkPath::kWinding_FillType);
1393 pathB.moveTo(1,5);
1394 pathB.cubicTo(1,5, 1,0, 5,1);
1395 pathB.lineTo(1,5);
1396 pathB.close();
1397 testPathOp(reporter, path, pathB, kDifference_PathOp);
1398 }
1399
cubicOp75d(skiatest::Reporter * reporter)1400 static void cubicOp75d(skiatest::Reporter* reporter) {
1401 SkPath path, pathB;
1402 path.setFillType(SkPath::kWinding_FillType);
1403 path.moveTo(0,1);
1404 path.cubicTo(0,4, 5,1, 6,4);
1405 path.lineTo(0,1);
1406 path.close();
1407 pathB.setFillType(SkPath::kWinding_FillType);
1408 pathB.moveTo(1,5);
1409 pathB.cubicTo(4,6, 1,0, 4,0);
1410 pathB.lineTo(1,5);
1411 pathB.close();
1412 testPathOp(reporter, path, pathB, kDifference_PathOp);
1413 }
1414
cubicOp76u(skiatest::Reporter * reporter)1415 static void cubicOp76u(skiatest::Reporter* reporter) {
1416 SkPath path, pathB;
1417 path.setFillType(SkPath::kWinding_FillType);
1418 path.moveTo(0,1);
1419 path.cubicTo(0,2, 2,0, 5,3);
1420 path.close();
1421 pathB.setFillType(SkPath::kWinding_FillType);
1422 pathB.moveTo(0,2);
1423 pathB.cubicTo(3,5, 1,0, 2,0);
1424 pathB.close();
1425 testPathOp(reporter, path, pathB, kUnion_PathOp);
1426 }
1427
cubicOp77i(skiatest::Reporter * reporter)1428 static void cubicOp77i(skiatest::Reporter* reporter) {
1429 SkPath path, pathB;
1430 path.setFillType(SkPath::kEvenOdd_FillType);
1431 path.moveTo(0,1);
1432 path.cubicTo(1,3, 2,0, 3,2);
1433 path.lineTo(0,1);
1434 path.close();
1435 pathB.setFillType(SkPath::kEvenOdd_FillType);
1436 pathB.moveTo(0,2);
1437 pathB.cubicTo(2,3, 1,0, 3,1);
1438 pathB.lineTo(0,2);
1439 pathB.close();
1440 testPathOp(reporter, path, pathB, kIntersect_PathOp);
1441 }
1442
cubicOp78u(skiatest::Reporter * reporter)1443 static void cubicOp78u(skiatest::Reporter* reporter) {
1444 SkPath path, pathB;
1445 path.setFillType(SkPath::kEvenOdd_FillType);
1446 path.moveTo(1,6);
1447 path.cubicTo(1,6, 5,0, 6,1);
1448 path.lineTo(1,6);
1449 path.close();
1450 pathB.setFillType(SkPath::kEvenOdd_FillType);
1451 pathB.moveTo(0,5);
1452 pathB.cubicTo(1,6, 6,1, 6,1);
1453 pathB.lineTo(0,5);
1454 pathB.close();
1455 testPathOp(reporter, path, pathB, kUnion_PathOp);
1456 }
1457
cubicOp79u(skiatest::Reporter * reporter)1458 static void cubicOp79u(skiatest::Reporter* reporter) {
1459 SkPath path, pathB;
1460 path.setFillType(SkPath::kWinding_FillType);
1461 path.moveTo(0,1);
1462 path.cubicTo(1,3, 1,0, 6,4);
1463 path.close();
1464 pathB.setFillType(SkPath::kWinding_FillType);
1465 pathB.moveTo(0,1);
1466 pathB.cubicTo(4,6, 1,0, 3,1);
1467 pathB.close();
1468 testPathOp(reporter, path, pathB, kIntersect_PathOp);
1469 }
1470
cubicOp80i(skiatest::Reporter * reporter)1471 static void cubicOp80i(skiatest::Reporter* reporter) {
1472 SkPath path, pathB;
1473 path.setFillType(SkPath::kWinding_FillType);
1474 path.moveTo(0,1);
1475 path.cubicTo(2,3, 2,1, 4,3);
1476 path.lineTo(0,1);
1477 path.close();
1478 pathB.setFillType(SkPath::kWinding_FillType);
1479 pathB.moveTo(1,2);
1480 pathB.cubicTo(3,4, 1,0, 3,2);
1481 pathB.lineTo(1,2);
1482 pathB.close();
1483 testPathOp(reporter, path, pathB, kIntersect_PathOp);
1484 }
1485
cubicOp81d(skiatest::Reporter * reporter)1486 static void cubicOp81d(skiatest::Reporter* reporter) {
1487 SkPath path, pathB;
1488 path.setFillType(SkPath::kWinding_FillType);
1489 path.moveTo(0,1);
1490 path.cubicTo(4,6, 4,3, 5,4);
1491 path.close();
1492 pathB.setFillType(SkPath::kWinding_FillType);
1493 pathB.moveTo(3,4);
1494 pathB.cubicTo(4,5, 1,0, 6,4);
1495 pathB.close();
1496 testPathOp(reporter, path, pathB, kDifference_PathOp);
1497 }
1498
cubicOp82i(skiatest::Reporter * reporter)1499 static void cubicOp82i(skiatest::Reporter* reporter) {
1500 SkPath path, pathB;
1501 path.setFillType(SkPath::kEvenOdd_FillType);
1502 path.moveTo(0,1);
1503 path.cubicTo(2,3, 5,2, 3,0);
1504 path.lineTo(0,1);
1505 path.close();
1506 pathB.setFillType(SkPath::kWinding_FillType);
1507 pathB.moveTo(2,5);
1508 pathB.cubicTo(0,3, 1,0, 3,2);
1509 pathB.lineTo(2,5);
1510 pathB.close();
1511 testPathOp(reporter, path, pathB, kIntersect_PathOp);
1512 }
1513
cubicOp83i(skiatest::Reporter * reporter)1514 static void cubicOp83i(skiatest::Reporter* reporter) {
1515 SkPath path, pathB;
1516 path.setFillType(SkPath::kWinding_FillType);
1517 path.moveTo(0,1);
1518 path.cubicTo(0,3, 2,1, 4,1);
1519 path.lineTo(0,1);
1520 path.close();
1521 pathB.setFillType(SkPath::kWinding_FillType);
1522 pathB.moveTo(1,2);
1523 pathB.cubicTo(1,4, 1,0, 3,0);
1524 pathB.lineTo(1,2);
1525 pathB.close();
1526 testPathOp(reporter, path, pathB, kIntersect_PathOp);
1527 }
1528
cubicOp84d(skiatest::Reporter * reporter)1529 static void cubicOp84d(skiatest::Reporter* reporter) {
1530 SkPath path, pathB;
1531 path.setFillType(SkPath::kWinding_FillType);
1532 path.moveTo(0,4);
1533 path.cubicTo(2,3, 6,3, 3,2);
1534 path.close();
1535 pathB.setFillType(SkPath::kWinding_FillType);
1536 pathB.moveTo(3,6);
1537 pathB.cubicTo(2,3, 4,0, 3,2);
1538 pathB.close();
1539 testPathOp(reporter, path, pathB, kDifference_PathOp);
1540 }
1541
skpClip1(skiatest::Reporter * reporter)1542 static void skpClip1(skiatest::Reporter* reporter) {
1543 SkPath path;
1544 path.setFillType(SkPath::kEvenOdd_FillType);
1545 path.moveTo(1126.17114f, 877.171204f);
1546 path.quadTo(1127.34314f, 876.000000f, 1129.00000f, 876.000000f);
1547 path.lineTo(1243.00000f, 876.000000f);
1548 path.quadTo(1244.65686f, 876.000000f, 1245.82886f, 877.171204f);
1549 path.quadTo(1247.00000f, 878.343140f, 1247.00000f, 880.000000f);
1550 path.lineTo(1247.00000f, 907.000000f);
1551 path.lineTo(1246.00000f, 907.000000f);
1552 path.lineTo(1246.00000f, 880.000000f);
1553 path.cubicTo(1246.00000f, 878.343140f, 1244.65686f, 877.000000f, 1243.00000f, 877.000000f);
1554 path.lineTo(1129.00000f, 877.000000f);
1555 path.cubicTo(1127.34314f, 877.000000f, 1126.00000f, 878.343140f, 1126.00000f, 880.000000f);
1556 path.lineTo(1126.00000f, 907.000000f);
1557 path.lineTo(1125.00000f, 907.000000f);
1558 path.lineTo(1125.00000f, 880.000000f);
1559 path.quadTo(1125.00000f, 878.343140f, 1126.17114f, 877.171204f);
1560 path.close();
1561 SkPath pathB;
1562 pathB.setFillType(SkPath::kWinding_FillType);
1563 pathB.moveTo(1247.00000f, 876.000000f);
1564 pathB.lineTo(1231.00000f, 892.000000f);
1565 pathB.lineTo(1246.00000f, 907.000000f);
1566 pathB.lineTo(1247.00000f, 907.000000f);
1567 pathB.lineTo(1247.00000f, 876.000000f);
1568 pathB.close();
1569 testPathOp(reporter, path, pathB, kIntersect_PathOp);
1570 }
1571
skpClip2(skiatest::Reporter * reporter)1572 static void skpClip2(skiatest::Reporter* reporter) {
1573 SkPath path;
1574 path.setFillType(SkPath::kEvenOdd_FillType);
1575 path.moveTo(134.000000f, 11414.0000f);
1576 path.cubicTo(131.990234f, 11414.0000f, 130.326660f, 11415.4824f, 130.042755f, 11417.4131f);
1577 path.cubicTo(130.233124f, 11418.3193f, 131.037079f, 11419.0000f, 132.000000f, 11419.0000f);
1578 path.lineTo(806.000000f, 11419.0000f);
1579 path.cubicTo(806.962891f, 11419.0000f, 807.766907f, 11418.3193f, 807.957275f, 11417.4131f);
1580 path.cubicTo(807.673401f, 11415.4824f, 806.009766f, 11414.0000f, 804.000000f, 11414.0000f);
1581 path.lineTo(134.000000f, 11414.0000f);
1582 path.close();
1583 SkPath pathB;
1584 pathB.setFillType(SkPath::kInverseWinding_FillType);
1585 pathB.moveTo(132.000000f, 11415.0000f);
1586 pathB.lineTo(806.000000f, 11415.0000f);
1587 pathB.cubicTo(807.104553f, 11415.0000f, 808.000000f, 11415.4473f, 808.000000f, 11416.0000f);
1588 pathB.lineTo(808.000000f, 11417.0000f);
1589 pathB.cubicTo(808.000000f, 11418.1045f, 807.104553f, 11419.0000f, 806.000000f, 11419.0000f);
1590 pathB.lineTo(132.000000f, 11419.0000f);
1591 pathB.cubicTo(130.895432f, 11419.0000f, 130.000000f, 11418.1045f, 130.000000f, 11417.0000f);
1592 pathB.lineTo(130.000000f, 11416.0000f);
1593 pathB.cubicTo(130.000000f, 11415.4473f, 130.895432f, 11415.0000f, 132.000000f, 11415.0000f);
1594 pathB.close();
1595 testPathOp(reporter, path, pathB, kIntersect_PathOp);
1596 }
1597
skp96prezzi1(skiatest::Reporter * reporter)1598 static void skp96prezzi1(skiatest::Reporter* reporter) {
1599 SkPath path;
1600 path.setFillType(SkPath::kEvenOdd_FillType);
1601 path.moveTo(157.464005f, 670.463989f);
1602 path.quadTo(158.928925f, 669.000000f, 161.000000f, 669.000000f);
1603 path.lineTo(248.000000f, 669.000000f);
1604 path.quadTo(250.071075f, 669.000000f, 251.535995f, 670.463989f);
1605 path.quadTo(253.000000f, 671.928955f, 253.000000f, 674.000000f);
1606 path.lineTo(253.000000f, 706.000000f);
1607 path.lineTo(251.000000f, 706.000000f);
1608 path.lineTo(251.000000f, 675.000000f);
1609 path.cubicTo(251.000000f, 672.790833f, 249.209137f, 671.000000f, 247.000000f, 671.000000f);
1610 path.lineTo(162.000000f, 671.000000f);
1611 path.cubicTo(159.790863f, 671.000000f, 158.000000f, 672.790833f, 158.000000f, 675.000000f);
1612 path.lineTo(158.000000f, 706.000000f);
1613 path.lineTo(156.000000f, 706.000000f);
1614 path.lineTo(156.000000f, 674.000000f);
1615 path.quadTo(156.000000f, 671.928955f, 157.464005f, 670.463989f);
1616 path.close();
1617 SkPath pathB;
1618 pathB.setFillType(SkPath::kWinding_FillType);
1619 pathB.moveTo(156.000000f, 669.000000f);
1620 pathB.lineTo(178.500000f, 691.500000f);
1621 pathB.lineTo(230.500000f, 691.500000f);
1622 pathB.lineTo(253.000000f, 669.000000f);
1623 pathB.lineTo(156.000000f, 669.000000f);
1624 pathB.close();
1625 testPathOp(reporter, path, pathB, kIntersect_PathOp);
1626 }
1627
skpancestry_com1(skiatest::Reporter * reporter)1628 static void skpancestry_com1(skiatest::Reporter* reporter) {
1629 SkPath path;
1630 path.setFillType(SkPath::kEvenOdd_FillType);
1631 path.moveTo(161.000000f, 925.000000f);
1632 path.cubicTo(159.874390f, 925.000000f, 158.835663f, 925.371948f, 158.000000f, 925.999634f);
1633 path.lineTo(158.000000f, 926.000000f);
1634 path.lineTo(1108.00000f, 926.000000f);
1635 path.lineTo(1108.00000f, 925.999634f);
1636 path.cubicTo(1107.16443f, 925.371948f, 1106.12561f, 925.000000f, 1105.00000f, 925.000000f);
1637 path.lineTo(161.000000f, 925.000000f);
1638 path.close();
1639 SkPath pathB;
1640 pathB.setFillType(SkPath::kEvenOdd_FillType);
1641 pathB.moveTo(161.000000f, 926.000000f);
1642 pathB.lineTo(1105.00000f, 926.000000f);
1643 pathB.cubicTo(1107.20911f, 926.000000f, 1109.00000f, 927.790833f, 1109.00000f, 930.000000f);
1644 pathB.lineTo(1109.00000f, 956.000000f);
1645 pathB.cubicTo(1109.00000f, 958.209167f, 1107.20911f, 960.000000f, 1105.00000f, 960.000000f);
1646 pathB.lineTo(161.000000f, 960.000000f);
1647 pathB.cubicTo(158.790863f, 960.000000f, 157.000000f, 958.209167f, 157.000000f, 956.000000f);
1648 pathB.lineTo(157.000000f, 930.000000f);
1649 pathB.cubicTo(157.000000f, 927.790833f, 158.790863f, 926.000000f, 161.000000f, 926.000000f);
1650 pathB.close();
1651 testPathOp(reporter, path, pathB, kIntersect_PathOp);
1652 }
1653
skpeldorado_com_ua1(skiatest::Reporter * reporter)1654 static void skpeldorado_com_ua1(skiatest::Reporter* reporter) {
1655 SkPath path;
1656 path.setFillType(SkPath::kEvenOdd_FillType);
1657 path.moveTo(286.695129f, 291.000000f);
1658 path.lineTo(229.304855f, 561.000000f);
1659 path.lineTo(979.304871f, 561.000000f);
1660 path.lineTo(1036.69507f, 291.000000f);
1661 path.lineTo(286.695129f, 291.000000f);
1662 path.close();
1663 SkPath pathB;
1664 pathB.setFillType(SkPath::kWinding_FillType);
1665 pathB.moveTo(1006.69513f, 291.000000f);
1666 pathB.cubicTo(1023.26367f, 291.000000f, 1033.84021f, 304.431458f, 1030.31836f, 321.000000f);
1667 pathB.lineTo(985.681519f, 531.000000f);
1668 pathB.cubicTo(982.159790f, 547.568542f, 965.873413f, 561.000000f, 949.304871f, 561.000000f);
1669 pathB.lineTo(259.304871f, 561.000000f);
1670 pathB.cubicTo(242.736313f, 561.000000f, 232.159805f, 547.568542f, 235.681549f, 531.000000f);
1671 pathB.lineTo(280.318420f, 321.000000f);
1672 pathB.cubicTo(283.840179f, 304.431458f, 300.126587f, 291.000000f, 316.695129f, 291.000000f);
1673 pathB.lineTo(1006.69513f, 291.000000f);
1674 pathB.close();
1675 testPathOp(reporter, path, pathB, kIntersect_PathOp);
1676 }
1677
skpbyte_com1(skiatest::Reporter * reporter)1678 static void skpbyte_com1(skiatest::Reporter* reporter) {
1679 SkPath path;
1680 path.setFillType(SkPath::kEvenOdd_FillType);
1681 path.moveTo(968.000000f, 14.0000000f);
1682 path.cubicTo(965.238586f, 14.0000000f, 963.000000f, 16.2385769f, 963.000000f, 19.0000000f);
1683 path.lineTo(963.000000f, 32.0000000f);
1684 path.cubicTo(963.000000f, 34.7614250f, 965.238586f, 37.0000000f, 968.000000f, 37.0000000f);
1685 path.lineTo(1034.00000f, 37.0000000f);
1686 path.cubicTo(1036.76147f, 37.0000000f, 1039.00000f, 34.7614250f, 1039.00000f, 32.0000000f);
1687 path.lineTo(1039.00000f, 19.0000000f);
1688 path.cubicTo(1039.00000f, 16.2385769f, 1036.76147f, 14.0000000f, 1034.00000f, 14.0000000f);
1689 path.lineTo(968.000000f, 14.0000000f);
1690 path.close();
1691 SkPath pathB;
1692 pathB.setFillType(SkPath::kInverseWinding_FillType);
1693 pathB.moveTo(968.000000f, 14.0000000f);
1694 pathB.lineTo(1034.00000f, 14.0000000f);
1695 pathB.cubicTo(1036.76147f, 14.0000000f, 1039.00000f, 16.2385750f, 1039.00000f, 19.0000000f);
1696 pathB.lineTo(1039.00000f, 32.0000000f);
1697 pathB.cubicTo(1039.00000f, 34.2091408f, 1036.76147f, 36.0000000f, 1034.00000f, 36.0000000f);
1698 pathB.lineTo(968.000000f, 36.0000000f);
1699 pathB.cubicTo(965.238586f, 36.0000000f, 963.000000f, 34.2091408f, 963.000000f, 32.0000000f);
1700 pathB.lineTo(963.000000f, 19.0000000f);
1701 pathB.cubicTo(963.000000f, 16.2385750f, 965.238586f, 14.0000000f, 968.000000f, 14.0000000f);
1702 pathB.close();
1703 testPathOp(reporter, path, pathB, kIntersect_PathOp);
1704 }
1705
skphealth_com76(skiatest::Reporter * reporter)1706 static void skphealth_com76(skiatest::Reporter* reporter) {
1707 SkPath path;
1708 path.setFillType(SkPath::kEvenOdd_FillType);
1709 path.moveTo(708.099182f, 7.09919119f);
1710 path.lineTo(708.099182f, 7.09920025f);
1711 path.quadTo(704.000000f, 11.2010098f, 704.000000f, 17.0000000f);
1712 path.lineTo(704.000000f, 33.0000000f);
1713 path.lineTo(705.000000f, 33.0000000f);
1714 path.lineTo(705.000000f, 17.0000000f);
1715 path.cubicTo(705.000000f, 13.4101496f, 706.455078f, 10.1601505f, 708.807617f, 7.80761385f);
1716 path.lineTo(708.099182f, 7.09919119f);
1717 path.close();
1718 SkPath pathB;
1719 pathB.setFillType(SkPath::kWinding_FillType);
1720 pathB.moveTo(704.000000f, 3.00000000f);
1721 #if 0
1722 pathB.lineTo(719.500000f, 3.00000000f);
1723 pathB.lineTo(705.000000f, 33.0000000f);
1724 pathB.lineTo(704.000000f, 33.0000000f);
1725 testPathOp(reporter, path, pathB, kIntersect_PathOp);
1726 #else
1727 pathB.lineTo(704.000000f, 33.0000000f);
1728 pathB.lineTo(705.000000f, 33.0000000f);
1729 pathB.lineTo(719.500000f, 3.00000000f);
1730 testPathOp(reporter, path, pathB, kIntersect_PathOp);
1731 #endif
1732 }
1733
skpahrefs_com88(skiatest::Reporter * reporter)1734 static void skpahrefs_com88(skiatest::Reporter* reporter) {
1735 SkPath path;
1736 path.setFillType(SkPath::kEvenOdd_FillType);
1737 path.moveTo(1099.82886f, 7.17117119f);
1738 path.lineTo(1099.12134f, 7.87867832f);
1739 path.cubicTo(1099.66418f, 8.42157173f, 1100.00000f, 9.17157173f, 1100.00000f, 10.0000000f);
1740 path.lineTo(1100.00000f, 28.0000000f);
1741 path.cubicTo(1100.00000f, 29.6568546f, 1098.65686f, 31.0000000f, 1097.00000f, 31.0000000f);
1742 path.lineTo(1088.00000f, 31.0000000f);
1743 path.lineTo(1088.00000f, 32.0000000f);
1744 path.lineTo(1097.00000f, 32.0000000f);
1745 path.quadTo(1098.65686f, 32.0000000f, 1099.82886f, 30.8288002f);
1746 path.quadTo(1101.00000f, 29.6568546f, 1101.00000f, 28.0000000f);
1747 path.lineTo(1101.00000f, 10.0000000f);
1748 path.quadTo(1101.00000f, 8.34314537f, 1099.82886f, 7.17119980f);
1749 path.lineTo(1099.82886f, 7.17117119f);
1750 path.close();
1751 SkPath pathB;
1752 pathB.setFillType(SkPath::kWinding_FillType);
1753 pathB.moveTo(1101.00000f, 6.00000000f);
1754 pathB.lineTo(1088.00000f, 6.00000000f);
1755 pathB.lineTo(1088.00000f, 19.0000000f);
1756 pathB.lineTo(1101.00000f, 32.0000000f);
1757 testPathOp(reporter, path, pathB, kIntersect_PathOp);
1758 }
1759
skpahrefs_com29(skiatest::Reporter * reporter)1760 static void skpahrefs_com29(skiatest::Reporter* reporter) {
1761 SkPath path;
1762 path.setFillType(SkPath::kEvenOdd_FillType);
1763 path.moveTo(1037.17114f, 7.17119980f);
1764 path.quadTo(1038.34314f, 6.00000000f, 1040.00000f, 6.00000000f);
1765 path.lineTo(1074.00000f, 6.00000000f);
1766 path.lineTo(1074.00000f, 32.0000000f);
1767 path.lineTo(1040.00000f, 32.0000000f);
1768 path.quadTo(1038.34314f, 32.0000000f, 1037.17114f, 30.8288002f);
1769 path.quadTo(1036.00000f, 29.6568546f, 1036.00000f, 28.0000000f);
1770 path.lineTo(1036.00000f, 10.0000000f);
1771 path.quadTo(1036.00000f, 8.34314537f, 1037.17114f, 7.17119980f);
1772 path.close();
1773 path.moveTo(1037.00000f, 10.0000000f);
1774 path.cubicTo(1037.00000f, 8.34314537f, 1038.34314f, 7.00000000f, 1040.00000f, 7.00000000f);
1775 path.lineTo(1073.00000f, 7.00000000f);
1776 path.lineTo(1073.00000f, 31.0000000f);
1777 path.lineTo(1040.00000f, 31.0000000f);
1778 path.cubicTo(1038.34314f, 31.0000000f, 1037.00000f, 29.6568546f, 1037.00000f, 28.0000000f);
1779 path.lineTo(1037.00000f, 10.0000000f);
1780 path.close();
1781 SkPath pathB;
1782 pathB.setFillType(SkPath::kWinding_FillType);
1783 pathB.moveTo(1036.00000f, 32.0000000f);
1784 pathB.lineTo(1049.00000f, 19.0000000f);
1785 pathB.lineTo(1073.00000f, 31.0000000f);
1786 pathB.lineTo(1074.00000f, 32.0000000f);
1787 testPathOp(reporter, path, pathB, kIntersect_PathOp);
1788 }
1789
cubicOp85d(skiatest::Reporter * reporter)1790 static void cubicOp85d(skiatest::Reporter* reporter) {
1791 SkPath path;
1792 path.setFillType(SkPath::kWinding_FillType);
1793 path.moveTo(0,1);
1794 path.cubicTo(1,6, 1,0, 6,2);
1795 path.close();
1796 SkPath pathB;
1797 pathB.setFillType(SkPath::kWinding_FillType);
1798 pathB.moveTo(0,1);
1799 pathB.cubicTo(2,6, 1,0, 6,1);
1800 pathB.close();
1801 testPathOp(reporter, path, pathB, kDifference_PathOp);
1802 }
1803
1804 // this fails because the pair of nearly coincident cubics intersect at the ends
1805 // but the line connected to one of the cubics at the same point does not intersect
1806 // the other
skpkkiste_to98(skiatest::Reporter * reporter)1807 static void skpkkiste_to98(skiatest::Reporter* reporter) {
1808 SkPath path;
1809 path.setFillType(SkPath::kEvenOdd_FillType);
1810 path.moveTo(96, 122);
1811 path.cubicTo(94.6192932f, 122, 93.3692932f, 122.559647f, 92.4644699f, 123.46447f);
1812 path.lineTo(94.1715698f, 125.17157f);
1813 path.cubicTo(94.8954315f, 124.447708f, 95.8954315f, 124, 97, 124);
1814 path.lineTo(257, 124);
1815 path.cubicTo(258.104553f, 124, 259.104584f, 124.447708f, 259.82843f, 125.17157f);
1816 path.lineTo(261.535522f, 123.46447f);
1817 path.cubicTo(260.630707f, 122.559647f, 259.380707f, 122, 258, 122);
1818 path.lineTo(96, 122);
1819 path.close();
1820 SkPath pathB;
1821 pathB.setFillType(SkPath::kWinding_FillType);
1822 pathB.moveTo(258, 122);
1823 pathB.cubicTo(260.761414f, 122, 263, 124.238579f, 263, 127);
1824 pathB.lineTo(263, 284);
1825 pathB.cubicTo(263, 286.761414f, 260.761414f, 289, 258, 289);
1826 pathB.lineTo(96, 289);
1827 pathB.cubicTo(93.2385788f, 289, 91, 286.761414f, 91, 284);
1828 pathB.lineTo(91, 127);
1829 pathB.cubicTo(91, 124.238579f, 93.2385788f, 122, 96, 122);
1830 pathB.lineTo(258, 122);
1831 pathB.close();
1832 testPathOp(reporter, path, pathB, kIntersect_PathOp);
1833 }
1834
1835 #define ISSUE_1417_WORKING_ON_LINUX_32 0
1836 #if ISSUE_1417_WORKING_ON_LINUX_32
issue1417(skiatest::Reporter * reporter)1837 static void issue1417(skiatest::Reporter* reporter) {
1838 SkPath path1;
1839 path1.moveTo(122.58908843994140625f, 82.2836456298828125f);
1840 path1.quadTo(129.8215789794921875f, 80, 138, 80);
1841 path1.quadTo(147.15692138671875f, 80, 155.1280364990234375f, 82.86279296875f);
1842 path1.lineTo(161.1764678955078125f, 100);
1843 path1.lineTo(161.1764678955078125f, 100);
1844 path1.lineTo(115.29412078857421875f, 100);
1845 path1.lineTo(115.29412078857421875f, 100);
1846 path1.lineTo(122.58908843994140625f, 82.2836456298828125f);
1847 path1.lineTo(122.58908843994140625f, 82.2836456298828125f);
1848 path1.close();
1849 path1.moveTo(98.68194580078125f, 140.343841552734375f);
1850 path1.lineTo(115.29412078857421875f, 100);
1851 path1.lineTo(115.29412078857421875f, 100);
1852 path1.lineTo(97.9337615966796875f, 100);
1853 path1.lineTo(97.9337615966796875f, 100);
1854 path1.quadTo(88, 112.94264984130859375f, 88, 130);
1855 path1.quadTo(88, 131.544830322265625f, 88.08148956298828125f, 133.0560302734375f);
1856 path1.lineTo(98.68194580078125f, 140.343841552734375f);
1857 path1.lineTo(98.68194580078125f, 140.343841552734375f);
1858 path1.close();
1859 path1.moveTo(136.969696044921875f, 166.6666717529296875f);
1860 path1.lineTo(98.68194580078125f, 140.343841552734375f);
1861 path1.lineTo(98.68194580078125f, 140.343841552734375f);
1862 path1.lineTo(93.45894622802734375f, 153.02825927734375f);
1863 path1.lineTo(93.45894622802734375f, 153.02825927734375f);
1864 path1.quadTo(96.94116973876953125f, 159.65185546875f, 102.64466094970703125f, 165.3553466796875f);
1865 path1.quadTo(110.7924652099609375f, 173.503143310546875f, 120.8179779052734375f, 177.1177825927734375f);
1866 path1.lineTo(136.969696044921875f, 166.6666717529296875f);
1867 path1.lineTo(136.969696044921875f, 166.6666717529296875f);
1868 path1.close();
1869 path1.moveTo(175.8309783935546875f, 141.5211334228515625f);
1870 path1.lineTo(136.969696044921875f, 166.6666717529296875f);
1871 path1.lineTo(136.969696044921875f, 166.6666717529296875f);
1872 path1.lineTo(153.15728759765625f, 177.7956390380859375f);
1873 path1.lineTo(153.15728759765625f, 177.7956390380859375f);
1874 path1.quadTo(164.392425537109375f, 174.318267822265625f, 173.3553466796875f, 165.3553466796875f);
1875 path1.quadTo(177.805816650390625f, 160.9048614501953125f, 180.90380859375f, 155.8941650390625f);
1876 path1.lineTo(175.8309783935546875f, 141.5211334228515625f);
1877 path1.lineTo(175.8309783935546875f, 141.5211334228515625f);
1878 path1.close();
1879 path1.moveTo(175.8309783935546875f, 141.5211334228515625f);
1880 path1.lineTo(187.8782806396484375f, 133.7258148193359375f);
1881 path1.lineTo(187.8782806396484375f, 133.7258148193359375f);
1882 path1.quadTo(188, 131.8880615234375f, 188, 130);
1883 path1.quadTo(188, 112.942657470703125f, 178.0662384033203125f, 100);
1884 path1.lineTo(161.1764678955078125f, 100);
1885 path1.lineTo(161.1764678955078125f, 100);
1886 path1.lineTo(175.8309783935546875f, 141.5211334228515625f);
1887 path1.lineTo(175.8309783935546875f, 141.5211334228515625f);
1888 path1.close();
1889
1890 SkPath path2;
1891 path2.moveTo(174.117645263671875f, 100);
1892 path2.lineTo(161.1764678955078125f, 100);
1893 path2.lineTo(161.1764678955078125f, 100);
1894 path2.lineTo(155.1280364990234375f, 82.86279296875f);
1895 path2.lineTo(155.1280364990234375f, 82.86279296875f);
1896 path2.quadTo(153.14971923828125f, 82.15229034423828125f, 151.098419189453125f, 81.618133544921875f);
1897 path2.lineTo(143.5294189453125f, 100);
1898 path2.lineTo(143.5294189453125f, 100);
1899 path2.lineTo(161.1764678955078125f, 100);
1900 path2.lineTo(161.1764678955078125f, 100);
1901 path2.lineTo(168.23529052734375f, 120);
1902 path2.lineTo(168.23529052734375f, 120);
1903 path2.lineTo(181.1764678955078125f, 120);
1904 path2.lineTo(181.1764678955078125f, 120);
1905 path2.lineTo(186.3661956787109375f, 134.7042236328125f);
1906 path2.lineTo(186.3661956787109375f, 134.7042236328125f);
1907 path2.lineTo(187.8782806396484375f, 133.7258148193359375f);
1908 path2.lineTo(187.8782806396484375f, 133.7258148193359375f);
1909 path2.quadTo(188, 131.8880615234375f, 188, 130);
1910 path2.quadTo(188, 124.80947113037109375f, 187.080169677734375f, 120);
1911 path2.lineTo(181.1764678955078125f, 120);
1912 path2.lineTo(181.1764678955078125f, 120);
1913 path2.lineTo(174.117645263671875f, 100);
1914 path2.lineTo(174.117645263671875f, 100);
1915 path2.close();
1916 path2.moveTo(88.91983795166015625f, 120);
1917 path2.lineTo(107.0588226318359375f, 120);
1918 path2.lineTo(107.0588226318359375f, 120);
1919 path2.lineTo(98.68194580078125f, 140.343841552734375f);
1920 path2.lineTo(98.68194580078125f, 140.343841552734375f);
1921 path2.lineTo(88.08148956298828125f, 133.0560302734375f);
1922 path2.lineTo(88.08148956298828125f, 133.0560302734375f);
1923 path2.quadTo(88, 131.544830322265625f, 88, 130);
1924 path2.quadTo(88, 124.80951690673828125f, 88.91983795166015625f, 120);
1925 path2.close();
1926 path2.moveTo(96.67621612548828125f, 145.21490478515625f);
1927 path2.lineTo(98.68194580078125f, 140.343841552734375f);
1928 path2.lineTo(98.68194580078125f, 140.343841552734375f);
1929 path2.lineTo(120.68767547607421875f, 155.4727783203125f);
1930 path2.lineTo(120.68767547607421875f, 155.4727783203125f);
1931 path2.lineTo(118.68194580078125f, 160.343841552734375f);
1932 path2.lineTo(118.68194580078125f, 160.343841552734375f);
1933 path2.lineTo(96.67621612548828125f, 145.21490478515625f);
1934 path2.lineTo(96.67621612548828125f, 145.21490478515625f);
1935 path2.close();
1936 path2.moveTo(113.232177734375f, 173.5789947509765625f);
1937 path2.quadTo(116.8802642822265625f, 175.69805908203125f, 120.8179779052734375f, 177.1177825927734375f);
1938 path2.lineTo(132.2864990234375f, 169.6969757080078125f);
1939 path2.lineTo(132.2864990234375f, 169.6969757080078125f);
1940 path2.lineTo(118.68194580078125f, 160.343841552734375f);
1941 path2.lineTo(118.68194580078125f, 160.343841552734375f);
1942 path2.lineTo(113.232177734375f, 173.5789947509765625f);
1943 path2.lineTo(113.232177734375f, 173.5789947509765625f);
1944 path2.close();
1945
1946 testPathOp(reporter, path1, path2, kUnion_PathOp);
1947 }
1948 #endif
1949
issue1418(skiatest::Reporter * reporter)1950 static void issue1418(skiatest::Reporter* reporter) {
1951 SkPath path1;
1952 path1.moveTo(0, 0);
1953 path1.lineTo(1, 0);
1954 path1.lineTo(1, 0);
1955 path1.lineTo(1, 1);
1956 path1.lineTo(1, 1);
1957 path1.lineTo(0, 1);
1958 path1.lineTo(0, 1);
1959 path1.lineTo(0, 0);
1960 path1.lineTo(0, 0);
1961 path1.close();
1962
1963 SkPath path2;
1964 path2.moveTo(0.64644664525985717773f, -0.35355341434478759766f);
1965 path2.quadTo(0.79289329051971435547f, -0.50000005960464477539f, 1.0000001192092895508f, -0.50000005960464477539f);
1966 path2.quadTo(1.2071068286895751953f, -0.50000005960464477539f, 1.3535535335540771484f, -0.35355341434478759766f);
1967 path2.quadTo(1.5000001192092895508f, -0.20710679888725280762f, 1.5000001192092895508f, 0);
1968 path2.quadTo(1.5000001192092895508f, 0.20710679888725280762f, 1.3535535335540771484f, 0.35355341434478759766f);
1969 path2.quadTo(1.2071068286895751953f, 0.50000005960464477539f, 1.0000001192092895508f, 0.50000005960464477539f);
1970 path2.quadTo(0.79289329051971435547f, 0.50000005960464477539f, 0.64644664525985717773f, 0.35355341434478759766f);
1971 path2.quadTo(0.50000005960464477539f, 0.20710679888725280762f, 0.50000005960464477539f, 0);
1972 path2.quadTo(0.50000005960464477539f, -0.20710679888725280762f, 0.64644664525985717773f, -0.35355341434478759766f);
1973 testPathOp(reporter, path1, path2, kIntersect_PathOp);
1974 }
1975
cubicOp85i(skiatest::Reporter * reporter)1976 static void cubicOp85i(skiatest::Reporter* reporter) {
1977 SkPath path, pathB;
1978 path.setFillType(SkPath::kWinding_FillType);
1979 path.moveTo(3, 4);
1980 path.cubicTo(1, 5, 4, 3, 6, 4);
1981 path.close();
1982 pathB.setFillType(SkPath::kWinding_FillType);
1983 pathB.moveTo(3, 4);
1984 pathB.cubicTo(4, 6, 4, 3, 5, 1);
1985 pathB.close();
1986 testPathOp(reporter, path, pathB, kIntersect_PathOp);
1987 }
1988
issue1418b(skiatest::Reporter * reporter)1989 static void issue1418b(skiatest::Reporter* reporter) {
1990 SkPath path1;
1991 path1.moveTo(0, 0);
1992 path1.lineTo(1, 0);
1993 path1.lineTo(1, 1);
1994 path1.lineTo(0, 1);
1995 path1.lineTo(0, 0);
1996 path1.close();
1997 path1.setFillType(SkPath::kWinding_FillType);
1998 SkPath path2;
1999 path2.moveTo(0.646446645f, -0.353553414f);
2000 path2.quadTo(0.792893291f, -0.50000006f, 1.00000012f, -0.50000006f);
2001 path2.quadTo(1.20710683f, -0.50000006f, 1.35355353f, -0.353553414f);
2002 path2.quadTo(1.50000012f, -0.207106799f, 1.50000012f, 0);
2003 path2.quadTo(1.50000012f, 0.207106799f, 1.35355353f, 0.353553414f);
2004 path2.quadTo(1.20710683f, 0.50000006f, 1.00000012f, 0.50000006f);
2005 path2.quadTo(0.792893291f, 0.50000006f, 0.646446645f, 0.353553414f);
2006 path2.quadTo(0.50000006f, 0.207106799f, 0.50000006f, 0);
2007 path2.quadTo(0.50000006f, -0.207106799f, 0.646446645f, -0.353553414f);
2008 path2.close();
2009 path2.moveTo(1.00000012f, 0.50000006f);
2010 path2.lineTo(1.00000012f, 1.00000012f);
2011 path2.lineTo(0.50000006f, 1.00000012f);
2012 path2.quadTo(0.50000006f, 0.792893291f, 0.646446645f, 0.646446645f);
2013 path2.quadTo(0.792893291f, 0.50000006f, 1.00000012f, 0.50000006f);
2014 path2.close();
2015 path2.setFillType(SkPath::kEvenOdd_FillType);
2016 testPathOp(reporter, path1, path2, kIntersect_PathOp);
2017 }
2018
rectOp1i(skiatest::Reporter * reporter)2019 static void rectOp1i(skiatest::Reporter* reporter) {
2020 SkPath path, pathB;
2021 path.setFillType(SkPath::kWinding_FillType);
2022 path.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
2023 path.addRect(2, 2, 4, 4, SkPath::kCW_Direction);
2024 pathB.setFillType(SkPath::kWinding_FillType);
2025 pathB.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
2026 pathB.addRect(0, 0, 2, 2, SkPath::kCW_Direction);
2027 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2028 }
2029
rectOp2i(skiatest::Reporter * reporter)2030 static void rectOp2i(skiatest::Reporter* reporter) {
2031 SkPath path, pathB;
2032 path.setFillType(SkPath::kEvenOdd_FillType);
2033 path.addRect(0, 0, 1, 1, SkPath::kCW_Direction);
2034 path.addRect(0, 0, 3, 3, SkPath::kCW_Direction);
2035 pathB.setFillType(SkPath::kWinding_FillType);
2036 pathB.addRect(0, 0, 2, 2, SkPath::kCW_Direction);
2037 pathB.addRect(0, 0, 2, 2, SkPath::kCW_Direction);
2038 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2039 }
2040
rectOp3x(skiatest::Reporter * reporter)2041 static void rectOp3x(skiatest::Reporter* reporter) {
2042 SkPath path, pathB;
2043 path.setFillType(SkPath::kEvenOdd_FillType);
2044 path.moveTo(0, 0);
2045 path.lineTo(3, 0);
2046 path.lineTo(3, 3);
2047 path.lineTo(0, 3);
2048 path.close();
2049 path.moveTo(2, 2);
2050 path.lineTo(3, 2);
2051 path.lineTo(3, 3);
2052 path.lineTo(2, 3);
2053 path.close();
2054 pathB.setFillType(SkPath::kWinding_FillType);
2055 pathB.moveTo(1, 1);
2056 pathB.lineTo(3, 1);
2057 pathB.lineTo(3, 3);
2058 pathB.lineTo(1, 3);
2059 pathB.close();
2060 pathB.moveTo(2, 2);
2061 pathB.lineTo(3, 2);
2062 pathB.lineTo(3, 3);
2063 pathB.lineTo(2, 3);
2064 pathB.close();
2065 testPathOp(reporter, path, pathB, kXOR_PathOp);
2066 }
2067
2068 #define ISSUE_1435_WORKING 0
2069 #if ISSUE_1435_WORKING
issue1435(skiatest::Reporter * reporter)2070 static void issue1435(skiatest::Reporter* reporter) {
2071 SkPath path1;
2072 path1.moveTo(160, 60);
2073 path1.lineTo(220, 230);
2074 path1.lineTo(60, 120);
2075 path1.lineTo(260, 120);
2076 path1.lineTo(90, 230);
2077 path1.lineTo(160, 60);
2078 path1.close();
2079 path1.setFillType(SkPath::kEvenOdd_FillType);
2080
2081
2082 SkPath path2;
2083 path2.moveTo(142.589081f, 102.283646f);
2084 path2.quadTo(149.821579f, 100, 158, 100);
2085 path2.quadTo(167.156921f, 100, 175.128036f, 102.862793f);
2086 path2.lineTo(181.176468f, 120);
2087 path2.lineTo(135.294128f, 120);
2088 path2.lineTo(142.589081f, 102.283646f);
2089 path2.close();
2090 path2.moveTo(118.681946f, 160.343842f);
2091 path2.lineTo(135.294128f, 120);
2092 path2.lineTo(117.933762f, 120);
2093 path2.quadTo(108, 132.942657f, 108, 150);
2094 path2.quadTo(108, 151.54483f, 108.08149f, 153.05603f);
2095 path2.lineTo(118.681946f, 160.343842f);
2096 path2.close();
2097 path2.moveTo(156.969696f, 186.666672f);
2098 path2.lineTo(118.681946f, 160.343842f);
2099 path2.lineTo(113.458946f, 173.028259f);
2100 path2.quadTo(116.94117f, 179.651855f, 122.644661f, 185.355347f);
2101 path2.quadTo(130.792465f, 193.503143f, 140.817978f, 197.117783f);
2102 path2.lineTo(156.969696f, 186.666672f);
2103 path2.close();
2104 path2.moveTo(195.830978f, 161.521133f);
2105 path2.lineTo(156.969696f, 186.666672f);
2106 path2.lineTo(173.157288f, 197.795639f);
2107 path2.quadTo(184.392426f, 194.318268f, 193.355347f, 185.355347f);
2108 path2.quadTo(197.805817f, 180.904861f, 200.903809f, 175.894165f);
2109 path2.lineTo(195.830978f, 161.521133f);
2110 path2.close();
2111 path2.moveTo(195.830978f, 161.521133f);
2112 path2.lineTo(207.878281f, 153.725815f);
2113 path2.quadTo(208, 151.888062f, 208, 150);
2114 path2.quadTo(208, 132.942657f, 198.066238f, 120);
2115 path2.lineTo(181.176468f, 120);
2116 path2.lineTo(195.830978f, 161.521133f);
2117 path2.close();
2118 path2.setFillType(SkPath::kEvenOdd_FillType);
2119 testPathOp(reporter, path1, path2, kIntersect_PathOp);
2120 }
2121 #endif
2122
bufferOverflow(skiatest::Reporter * reporter)2123 static void bufferOverflow(skiatest::Reporter* reporter) {
2124 SkPath path;
2125 path.addRect(0,0, 300,170141183460469231731687303715884105728.f);
2126 SkPath pathB;
2127 pathB.addRect(0,0, 300,16);
2128 testPathOp(reporter, path, pathB, kUnion_PathOp);
2129 }
2130
skpkkiste_to716(skiatest::Reporter * reporter)2131 static void skpkkiste_to716(skiatest::Reporter* reporter) {
2132 SkPath path;
2133 path.setFillType(SkPath::kEvenOdd_FillType);
2134 path.moveTo(1173, 284);
2135 path.cubicTo(1173, 285.125824f, 1173.37207f, 286.164734f, 1174, 287.000488f);
2136 path.lineTo(1174, 123.999496f);
2137 path.cubicTo(1173.37207f, 124.835243f, 1173, 125.874168f, 1173, 127);
2138 path.lineTo(1173, 284);
2139 path.close();
2140 SkPath pathB;
2141 pathB.setFillType(SkPath::kWinding_FillType);
2142 pathB.moveTo(1340, 122);
2143 pathB.cubicTo(1342.76147f, 122, 1345, 124.238579f, 1345, 127);
2144 pathB.lineTo(1345, 284);
2145 pathB.cubicTo(1345, 286.761414f, 1342.76147f, 289, 1340, 289);
2146 pathB.lineTo(1178, 289);
2147 pathB.cubicTo(1175.23853f, 289, 1173, 286.761414f, 1173, 284);
2148 pathB.lineTo(1173, 127);
2149 pathB.cubicTo(1173, 124.238579f, 1175.23853f, 122, 1178, 122);
2150 pathB.lineTo(1340, 122);
2151 pathB.close();
2152 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2153 }
2154
loopEdge1(skiatest::Reporter * reporter)2155 static void loopEdge1(skiatest::Reporter* reporter) {
2156 SkPath path;
2157 path.setFillType(SkPath::kEvenOdd_FillType);
2158 path.moveTo(0,0);
2159 path.lineTo(3,0);
2160 path.lineTo(3,2);
2161 path.lineTo(1,2);
2162 path.lineTo(1,1);
2163 path.lineTo(2,1);
2164 path.lineTo(2,3);
2165 path.lineTo(0,3);
2166 path.close();
2167 SkPath pathB;
2168 pathB.setFillType(SkPath::kEvenOdd_FillType);
2169 pathB.moveTo(1,2);
2170 pathB.lineTo(2,2);
2171 pathB.lineTo(2,4);
2172 pathB.lineTo(1,4);
2173 pathB.close();
2174 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2175 }
2176
loopEdge2(skiatest::Reporter * reporter)2177 static void loopEdge2(skiatest::Reporter* reporter) {
2178 SkPath path;
2179 path.setFillType(SkPath::kEvenOdd_FillType);
2180 path.moveTo(0,0);
2181 path.lineTo(3,0);
2182 path.lineTo(3,2);
2183 path.lineTo(1,2);
2184 path.lineTo(1,1);
2185 path.lineTo(2,1);
2186 path.lineTo(2,3);
2187 path.lineTo(0,3);
2188 path.close();
2189 SkPath pathB;
2190 pathB.setFillType(SkPath::kEvenOdd_FillType);
2191 pathB.moveTo(1 - 1e-6f,2);
2192 pathB.lineTo(2 - 1e-6f,2);
2193 pathB.lineTo(2 - 1e-6f,4);
2194 pathB.lineTo(1 - 1e-6f,4);
2195 pathB.close();
2196 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2197 }
2198
cubicOp86i(skiatest::Reporter * reporter)2199 static void cubicOp86i(skiatest::Reporter* reporter) {
2200 SkPath path, pathB;
2201 path.setFillType(SkPath::kWinding_FillType);
2202 path.moveTo(0, 4);
2203 path.cubicTo(3, 4, 6, 2, 5, 2);
2204 path.close();
2205 pathB.setFillType(SkPath::kEvenOdd_FillType);
2206 pathB.moveTo(2, 6);
2207 pathB.cubicTo(2, 5, 4, 0, 4, 3);
2208 pathB.close();
2209 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2210 }
2211
cubicOp87u(skiatest::Reporter * reporter)2212 static void cubicOp87u(skiatest::Reporter* reporter) {
2213 SkPath path, pathB;
2214 path.setFillType(SkPath::kWinding_FillType);
2215 path.moveTo(0,1);
2216 path.cubicTo(0,2, 2,0, 6,4);
2217 path.close();
2218 pathB.setFillType(SkPath::kWinding_FillType);
2219 pathB.moveTo(0,2);
2220 pathB.cubicTo(4,6, 1,0, 2,0);
2221 pathB.close();
2222 testPathOp(reporter, path, pathB, kUnion_PathOp);
2223 }
2224
cubicOp88u(skiatest::Reporter * reporter)2225 static void cubicOp88u(skiatest::Reporter* reporter) {
2226 SkPath path, pathB;
2227 path.setFillType(SkPath::kWinding_FillType);
2228 path.moveTo(0,1);
2229 path.cubicTo(2,5, 5,0, 6,4);
2230 path.close();
2231 pathB.setFillType(SkPath::kWinding_FillType);
2232 pathB.moveTo(0,5);
2233 pathB.cubicTo(4,6, 1,0, 5,2);
2234 pathB.close();
2235 testPathOp(reporter, path, pathB, kUnion_PathOp);
2236 }
2237
cubicOp89u(skiatest::Reporter * reporter)2238 static void cubicOp89u(skiatest::Reporter* reporter) {
2239 SkPath path, pathB;
2240 path.setFillType(SkPath::kWinding_FillType);
2241 path.moveTo(0, 3);
2242 path.cubicTo(1, 6, 5, 0, 6, 3);
2243 path.close();
2244 pathB.setFillType(SkPath::kWinding_FillType);
2245 pathB.moveTo(0, 5);
2246 pathB.cubicTo(3, 6, 3, 0, 6, 1);
2247 pathB.close();
2248 testPathOp(reporter, path, pathB, kUnion_PathOp);
2249 }
2250
cubicOp90u(skiatest::Reporter * reporter)2251 static void cubicOp90u(skiatest::Reporter* reporter) {
2252 SkPath path, pathB;
2253 path.setFillType(SkPath::kEvenOdd_FillType);
2254 path.moveTo(0, 5);
2255 path.cubicTo(1, 2, 5, 2, 4, 1);
2256 path.close();
2257 pathB.setFillType(SkPath::kEvenOdd_FillType);
2258 pathB.moveTo(2, 5);
2259 pathB.cubicTo(1, 4, 5, 0, 2, 1);
2260 pathB.close();
2261 testPathOp(reporter, path, pathB, kUnion_PathOp);
2262 }
2263
cubicOp91u(skiatest::Reporter * reporter)2264 static void cubicOp91u(skiatest::Reporter* reporter) {
2265 SkPath path, pathB;
2266 path.setFillType(SkPath::kWinding_FillType);
2267 path.moveTo(1, 6);
2268 path.cubicTo(0, 3, 6, 3, 5, 0);
2269 path.close();
2270 pathB.setFillType(SkPath::kWinding_FillType);
2271 pathB.moveTo(3, 6);
2272 pathB.cubicTo(0, 5, 6, 1, 3, 0);
2273 pathB.close();
2274 testPathOp(reporter, path, pathB, kUnion_PathOp);
2275 }
2276
skpaaalgarve_org53(skiatest::Reporter * reporter)2277 static void skpaaalgarve_org53(skiatest::Reporter* reporter) { // add t cancel
2278 SkPath path;
2279 path.setFillType(SkPath::kEvenOdd_FillType);
2280 path.moveTo(-1.24344979e-014f, 348);
2281 path.lineTo(258, 348);
2282 path.lineTo(258, 322);
2283 path.quadTo(258, 317.857849f, 255.072006f, 314.928009f);
2284 path.quadTo(252.142136f, 312, 248, 312);
2285 path.lineTo(1.77635684e-015f, 312);
2286 path.lineTo(-1.24344979e-014f, 348);
2287 path.close();
2288 SkPath pathB;
2289 pathB.setFillType(SkPath::kWinding_FillType);
2290 pathB.moveTo(0, 312);
2291 pathB.lineTo(258, 312);
2292 pathB.lineTo(258, 348);
2293 pathB.lineTo(0, 348);
2294 pathB.close();
2295 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2296 }
2297
skpabcspark_ca103(skiatest::Reporter * reporter)2298 static void skpabcspark_ca103(skiatest::Reporter* reporter) { // add t cancel
2299 SkPath path;
2300 path.setFillType(SkPath::kEvenOdd_FillType);
2301 path.moveTo(1.99840144e-015f, 494);
2302 path.lineTo(97, 494);
2303 path.quadTo(100.313705f, 494, 102.6576f, 491.657593f);
2304 path.quadTo(105, 489.313721f, 105, 486);
2305 path.lineTo(105, 425);
2306 path.quadTo(105, 421.686279f, 102.6576f, 419.342407f);
2307 path.quadTo(100.313705f, 417, 97, 417);
2308 path.lineTo(2.22044605e-016f, 417);
2309 path.lineTo(1.99840144e-015f, 494);
2310 path.close();
2311 SkPath pathB;
2312 pathB.setFillType(SkPath::kWinding_FillType);
2313 pathB.moveTo(0, 417);
2314 pathB.lineTo(105, 417);
2315 pathB.lineTo(105, 494);
2316 pathB.lineTo(0, 494);
2317 pathB.close();
2318 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2319 }
2320
skpacesoftech_com47(skiatest::Reporter * reporter)2321 static void skpacesoftech_com47(skiatest::Reporter* reporter) { // partial coincidence
2322 SkPath path;
2323 path.setFillType(SkPath::kEvenOdd_FillType);
2324 path.moveTo(670.537415f, 285);
2325 path.lineTo(670.387451f, 285);
2326 path.lineTo(596.315186f, 314.850708f);
2327 path.lineTo(626.19696f, 389);
2328 path.lineTo(626.346863f, 389);
2329 path.lineTo(700.419189f, 359.149261f);
2330 path.lineTo(670.537415f, 285);
2331 path.close();
2332 SkPath pathB;
2333 pathB.setFillType(SkPath::kWinding_FillType);
2334 pathB.moveTo(663.318542f, 374.100616f);
2335 pathB.quadTo(647.950989f, 380.293671f, 632.705322f, 373.806305f);
2336 pathB.quadTo(617.459595f, 367.318909f, 611.266541f, 351.951355f);
2337 pathB.quadTo(605.073486f, 336.58374f, 611.560913f, 321.338074f);
2338 pathB.quadTo(618.048279f, 306.092407f, 633.415833f, 299.899353f);
2339 pathB.quadTo(648.783447f, 293.706299f, 664.029114f, 300.193665f);
2340 pathB.quadTo(679.27478f, 306.68103f, 685.467834f, 322.048645f);
2341 pathB.quadTo(691.660889f, 337.416199f, 685.173523f, 352.661896f);
2342 pathB.quadTo(678.686157f, 367.907562f, 663.318542f, 374.100616f);
2343 pathB.close();
2344 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2345 }
2346
skpact_com43(skiatest::Reporter * reporter)2347 static void skpact_com43(skiatest::Reporter* reporter) { // bridge op
2348 SkPath path;
2349 path.setFillType(SkPath::kEvenOdd_FillType);
2350 path.moveTo(1.45716772e-016f, 924.336121f);
2351 path.lineTo(-1.11022302e-016f, 920);
2352 path.lineTo(6, 920);
2353 path.lineTo(6, 926);
2354 path.lineTo(1.66389287f, 926);
2355 path.quadTo(1.18842196f, 925.674561f, 0.756800175f, 925.243225f);
2356 path.quadTo(0.325406998f, 924.811523f, 1.45716772e-016f, 924.336121f);
2357 path.close();
2358 path.moveTo(1, 921);
2359 path.lineTo(5, 921);
2360 path.lineTo(5, 925);
2361 path.cubicTo(2.79086018f, 925, 1, 923.209167f, 1, 921);
2362 path.close();
2363 SkPath pathB;
2364 pathB.setFillType(SkPath::kWinding_FillType);
2365 pathB.moveTo(-1, 920);
2366 pathB.lineTo(0, 920);
2367 pathB.lineTo(3, 927);
2368 pathB.lineTo(-1, 927);
2369 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2370 }
2371
skpadbox_lt8(skiatest::Reporter * reporter)2372 static void skpadbox_lt8(skiatest::Reporter* reporter) { // zero span
2373 SkPath path;
2374 path.setFillType(SkPath::kEvenOdd_FillType);
2375 path.moveTo(320.097229f, 628.573669f);
2376 path.lineTo(610.227173f, 85.7786865f);
2377 path.lineTo(946.652588f, 265.601807f);
2378 path.lineTo(656.522644f, 808.39679f);
2379 path.lineTo(320.097229f, 628.573669f);
2380 path.close();
2381 SkPath pathB;
2382 pathB.setFillType(SkPath::kInverseWinding_FillType);
2383 pathB.moveTo(333.866608f, 623.496155f);
2384 pathB.lineTo(613.368042f, 100.585754f);
2385 pathB.cubicTo(613.685303f, 99.9921265f, 614.423767f, 99.7681885f, 615.017395f, 100.085449f);
2386 pathB.lineTo(932.633057f, 269.854553f);
2387 pathB.cubicTo(933.226685f, 270.171875f, 933.450623f, 270.910278f, 933.133301f, 271.503906f);
2388 pathB.lineTo(653.631897f, 794.414307f);
2389 pathB.cubicTo(653.314636f, 795.007935f, 652.576172f, 795.231934f, 651.982544f, 794.914612f);
2390 pathB.lineTo(334.366943f, 625.145508f);
2391 pathB.cubicTo(333.773315f, 624.828247f, 333.549286f, 624.089783f, 333.866608f, 623.496155f);
2392 pathB.close();
2393 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2394 }
2395
skpadindex_de4(skiatest::Reporter * reporter)2396 static void skpadindex_de4(skiatest::Reporter* reporter) { // find chase op
2397 SkPath path;
2398 path.setFillType(SkPath::kEvenOdd_FillType);
2399 path.moveTo(0, 926);
2400 path.lineTo(0, 0);
2401 path.lineTo(1280, 0);
2402 path.lineTo(1280, 926);
2403 path.lineTo(0, 926);
2404 path.close();
2405 SkPath pathB;
2406 pathB.setFillType(SkPath::kWinding_FillType);
2407 pathB.moveTo(0, 312);
2408 pathB.lineTo(8.20486257e-015f, 178);
2409 pathB.lineTo(49, 178);
2410 pathB.lineTo(49, 312);
2411 pathB.close();
2412 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2413 }
2414
skpadithya_putr4_blogspot_com551(skiatest::Reporter * reporter)2415 static void skpadithya_putr4_blogspot_com551(skiatest::Reporter* reporter) { // calc common
2416 SkPath path;
2417 path.setFillType(SkPath::kEvenOdd_FillType);
2418 path.moveTo(205.605804f, 142.334625f);
2419 path.lineTo(254.665359f, 85.6058044f);
2420 path.lineTo(311.394196f, 134.665359f);
2421 path.lineTo(262.334625f, 191.39418f);
2422 path.lineTo(205.605804f, 142.334625f);
2423 path.close();
2424 SkPath pathB;
2425 pathB.setFillType(SkPath::kWinding_FillType);
2426 pathB.moveTo(283.407959f, 110.462646f);
2427 pathB.cubicTo(298.864319f, 123.829437f, 300.558258f, 147.195221f, 287.191467f, 162.651581f);
2428 pathB.lineTo(286.537354f, 163.407959f);
2429 pathB.cubicTo(273.170563f, 178.864334f, 249.804779f, 180.558258f, 234.348419f, 167.191467f);
2430 pathB.lineTo(233.592026f, 166.537338f);
2431 pathB.cubicTo(218.135666f, 153.170547f, 216.441727f, 129.804779f, 229.808517f, 114.348412f);
2432 pathB.lineTo(230.462646f, 113.592026f);
2433 pathB.cubicTo(243.829437f, 98.1356659f, 267.195221f, 96.4417267f, 282.651581f, 109.808517f);
2434 pathB.lineTo(283.407959f, 110.462646f);
2435 pathB.close();
2436 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2437 }
2438
skpadspert_de11(skiatest::Reporter * reporter)2439 static void skpadspert_de11(skiatest::Reporter* reporter) { // mark and chase winding
2440 SkPath path;
2441 path.setFillType(SkPath::kEvenOdd_FillType);
2442 path.moveTo(-4.4408921e-016f, 682.5f);
2443 path.lineTo(30.5f, 682.5f);
2444 path.cubicTo(32.709137f, 682.5f, 34.5f, 680.709167f, 34.5f, 678.5f);
2445 path.lineTo(34.5f, 486.5f);
2446 path.cubicTo(34.5f, 484.290863f, 32.709137f, 482.5f, 30.5f, 482.5f);
2447 path.lineTo(0, 482.5f);
2448 path.lineTo(-4.4408921e-016f, 682.5f);
2449 path.close();
2450 SkPath pathB;
2451 pathB.setFillType(SkPath::kWinding_FillType);
2452 pathB.moveTo(0, 482);
2453 pathB.lineTo(35, 482);
2454 pathB.lineTo(35, 683);
2455 pathB.lineTo(0, 683);
2456 pathB.close();
2457 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2458 }
2459
skpaiaigames_com870(skiatest::Reporter * reporter)2460 static void skpaiaigames_com870(skiatest::Reporter* reporter) { // cubic/cubic intersect
2461 SkPath path;
2462 path.setFillType(SkPath::kEvenOdd_FillType);
2463 path.moveTo(324.071075f, 845.071045f);
2464 path.cubicTo(324.405151f, 844.737f, 324.715668f, 844.379395f, 325, 844.000977f);
2465 path.lineTo(325, 842.127197f);
2466 path.cubicTo(324.571411f, 842.956238f, 324.017761f, 843.710144f, 323.363953f, 844.363953f);
2467 path.lineTo(324.071075f, 845.071045f);
2468 path.close();
2469 path.moveTo(323.363953f, 714.636047f);
2470 path.lineTo(324.071075f, 713.928955f);
2471 path.cubicTo(324.405151f, 714.263f, 324.715668f, 714.620605f, 325, 714.999023f);
2472 path.lineTo(325, 716.872803f);
2473 path.cubicTo(324.571411f, 716.043762f, 324.017761f, 715.289856f, 323.363953f, 714.636047f);
2474 path.close();
2475 SkPath pathB;
2476 pathB.setFillType(SkPath::kWinding_FillType);
2477 pathB.moveTo(317, 711);
2478 pathB.cubicTo(322.522858f, 711, 327, 715.477173f, 327, 721);
2479 pathB.lineTo(327, 838);
2480 pathB.cubicTo(327, 843.522827f, 322.522858f, 848, 317, 848);
2481 pathB.lineTo(155, 848);
2482 pathB.cubicTo(149.477158f, 848, 145, 843.522827f, 145, 838);
2483 pathB.lineTo(145, 721);
2484 pathB.cubicTo(145, 715.477173f, 149.477158f, 711, 155, 711);
2485 pathB.lineTo(317, 711);
2486 pathB.close();
2487 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2488 }
2489
cubicOp92i(skiatest::Reporter * reporter)2490 static void cubicOp92i(skiatest::Reporter* reporter) {
2491 SkPath path, pathB;
2492 path.setFillType(SkPath::kWinding_FillType);
2493 path.moveTo(0, 1);
2494 path.cubicTo(2, 6, 4, 1, 5, 4);
2495 path.close();
2496 pathB.setFillType(SkPath::kWinding_FillType);
2497 pathB.moveTo(1, 4);
2498 pathB.cubicTo(4, 5, 1, 0, 6, 2);
2499 pathB.close();
2500 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2501 }
2502
cubicOp93d(skiatest::Reporter * reporter)2503 static void cubicOp93d(skiatest::Reporter* reporter) {
2504 SkPath path, pathB;
2505 path.setFillType(SkPath::kWinding_FillType);
2506 path.moveTo(0, 1);
2507 path.cubicTo(1, 6, 4, 1, 4, 3);
2508 path.close();
2509 pathB.setFillType(SkPath::kWinding_FillType);
2510 pathB.moveTo(1, 4);
2511 pathB.cubicTo(3, 4, 1, 0, 6, 1);
2512 pathB.close();
2513 testPathOp(reporter, path, pathB, kDifference_PathOp);
2514 }
2515
cubicOp94u(skiatest::Reporter * reporter)2516 static void cubicOp94u(skiatest::Reporter* reporter) {
2517 SkPath path, pathB;
2518 path.setFillType(SkPath::kEvenOdd_FillType);
2519 path.moveTo(0, 3);
2520 path.cubicTo(2, 3, 5, 0, 5, 3);
2521 path.close();
2522 pathB.setFillType(SkPath::kEvenOdd_FillType);
2523 pathB.moveTo(0, 5);
2524 pathB.cubicTo(3, 5, 3, 0, 3, 2);
2525 pathB.close();
2526 testPathOp(reporter, path, pathB, kUnion_PathOp);
2527 }
2528
skpadbox_lt15(skiatest::Reporter * reporter)2529 static void skpadbox_lt15(skiatest::Reporter* reporter) {
2530 SkPath path;
2531 path.setFillType(SkPath::kEvenOdd_FillType);
2532 path.moveTo(333.292084f, 624.570984f);
2533 path.lineTo(614.229797f, 98.9735107f);
2534 path.lineTo(933.457764f, 269.604431f);
2535 path.lineTo(652.52002f, 795.201904f);
2536 path.lineTo(333.292084f, 624.570984f);
2537 path.close();
2538 SkPath pathB;
2539 pathB.setFillType(SkPath::kWinding_FillType);
2540 pathB.moveTo(613.368042f, 100.585754f);
2541 pathB.cubicTo(613.685303f, 99.9921265f, 614.423767f, 99.7681885f, 615.017395f, 100.085449f);
2542 pathB.lineTo(932.633057f, 269.854553f);
2543 pathB.cubicTo(933.226685f, 270.171875f, 933.450623f, 270.910278f, 933.133301f, 271.503906f);
2544 pathB.lineTo(653.631897f, 794.414307f);
2545 pathB.cubicTo(653.314636f, 795.007935f, 652.576172f, 795.231934f, 651.982544f, 794.914612f);
2546 pathB.lineTo(334.366943f, 625.145508f);
2547 pathB.cubicTo(333.773315f, 624.828247f, 333.549286f, 624.089783f, 333.866608f, 623.496155f);
2548 pathB.lineTo(613.368042f, 100.585754f);
2549 pathB.close();
2550 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2551 }
2552
skpadoption_org196(skiatest::Reporter * reporter)2553 static void skpadoption_org196(skiatest::Reporter* reporter) {
2554 SkPath path;
2555 path.setFillType(SkPath::kEvenOdd_FillType);
2556 path.moveTo(802, 367);
2557 path.lineTo(802, 324);
2558 path.lineTo(956, 324);
2559 path.lineTo(956, 371);
2560 path.quadTo(956, 373.071075f, 954.536011f, 374.536011f);
2561 path.quadTo(953.071045f, 376, 951, 376);
2562 path.lineTo(811, 376);
2563 path.cubicTo(806.029419f, 376, 802, 371.970551f, 802, 367);
2564 path.close();
2565 SkPath pathB;
2566 pathB.setFillType(SkPath::kInverseWinding_FillType);
2567 pathB.moveTo(803, 326);
2568 pathB.lineTo(955, 326);
2569 pathB.lineTo(955, 370);
2570 pathB.cubicTo(955, 372.761414f, 952.761414f, 375, 950, 375);
2571 pathB.lineTo(808, 375);
2572 pathB.cubicTo(805.238586f, 375, 803, 372.761414f, 803, 370);
2573 pathB.lineTo(803, 326);
2574 pathB.close();
2575 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2576 }
2577
skpadspert_net23(skiatest::Reporter * reporter)2578 static void skpadspert_net23(skiatest::Reporter* reporter) {
2579 SkPath path;
2580 path.setFillType(SkPath::kEvenOdd_FillType);
2581 path.moveTo(-2.220446e-018f, 483.5f);
2582 path.lineTo(0, 482.5f);
2583 path.lineTo(30.5f, 482.5f);
2584 path.cubicTo(32.709137f, 482.5f, 34.5f, 484.290863f, 34.5f, 486.5f);
2585 path.lineTo(34.5f, 678.5f);
2586 path.cubicTo(34.5f, 680.709167f, 32.709137f, 682.5f, 30.5f, 682.5f);
2587 path.lineTo(-4.4408921e-016f, 682.5f);
2588 path.lineTo(-4.41868766e-016f, 681.5f);
2589 path.lineTo(30.5f, 681.5f);
2590 path.cubicTo(32.1568565f, 681.5f, 33.5f, 680.15686f, 33.5f, 678.5f);
2591 path.lineTo(33.5f, 486.5f);
2592 path.cubicTo(33.5f, 484.84314f, 32.1568565f, 483.5f, 30.5f, 483.5f);
2593 path.lineTo(-2.220446e-018f, 483.5f);
2594 path.close();
2595 SkPath pathB;
2596 pathB.setFillType(SkPath::kWinding_FillType);
2597 pathB.moveTo(0, 482);
2598 pathB.lineTo(35, 482);
2599 pathB.lineTo(35, 683);
2600 pathB.lineTo(0, 683);
2601 pathB.close();
2602 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2603 }
2604
skpadventistmission_org572(skiatest::Reporter * reporter)2605 static void skpadventistmission_org572(skiatest::Reporter* reporter) {
2606 SkPath path;
2607 path.setFillType(SkPath::kEvenOdd_FillType);
2608 path.moveTo(1182.00037f, 926);
2609 path.cubicTo(1181.08813f, 924.785583f, 1179.63586f, 924, 1178, 924);
2610 path.lineTo(938, 924);
2611 path.cubicTo(936.364197f, 924, 934.911865f, 924.785583f, 933.999634f, 926);
2612 path.lineTo(1182.00037f, 926);
2613 path.close();
2614 SkPath pathB;
2615 pathB.setFillType(SkPath::kWinding_FillType);
2616 pathB.moveTo(934, 924);
2617 pathB.lineTo(1182, 924);
2618 pathB.lineTo(1182, 926);
2619 pathB.lineTo(934, 926);
2620 pathB.close();
2621 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2622 }
2623
skpagentxsites_com55(skiatest::Reporter * reporter)2624 static void skpagentxsites_com55(skiatest::Reporter* reporter) {
2625 SkPath path;
2626 path.setFillType(SkPath::kEvenOdd_FillType);
2627 path.moveTo(925, 27);
2628 path.cubicTo(924.447693f, 27, 924, 27.4477158f, 924, 28);
2629 path.lineTo(924, 55);
2630 path.cubicTo(924, 55.5522842f, 924.447693f, 56, 925, 56);
2631 path.lineTo(1103, 56);
2632 path.cubicTo(1103.55225f, 56, 1104, 55.5522842f, 1104, 55);
2633 path.lineTo(1104, 28);
2634 path.cubicTo(1104, 27.4477158f, 1103.55225f, 27, 1103, 27);
2635 path.lineTo(925, 27);
2636 path.close();
2637 SkPath pathB;
2638 pathB.setFillType(SkPath::kWinding_FillType);
2639 pathB.moveTo(1103, 27);
2640 pathB.cubicTo(1104.10461f, 27, 1105, 27.8954315f, 1105, 29);
2641 pathB.lineTo(1105, 54);
2642 pathB.cubicTo(1105, 55.1045685f, 1104.10461f, 56, 1103, 56);
2643 pathB.lineTo(926, 56);
2644 pathB.cubicTo(924.895447f, 56, 924, 55.1045685f, 924, 54);
2645 pathB.lineTo(924, 29);
2646 pathB.cubicTo(924, 27.8954315f, 924.895447f, 27, 926, 27);
2647 pathB.lineTo(1103, 27);
2648 pathB.close();
2649 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2650 }
2651
skpbakosoft_com10(skiatest::Reporter * reporter)2652 static void skpbakosoft_com10(skiatest::Reporter* reporter) {
2653 SkPath path;
2654 path.setFillType(SkPath::kEvenOdd_FillType);
2655 path.moveTo(190, 170);
2656 path.cubicTo(178.9543f, 170, 170, 178.9543f, 170, 190);
2657 path.cubicTo(170, 201.0457f, 178.9543f, 210, 190, 210);
2658 path.lineTo(370, 210);
2659 path.cubicTo(381.045685f, 210, 390, 201.0457f, 390, 190);
2660 path.cubicTo(390, 178.9543f, 381.045685f, 170, 370, 170);
2661 path.lineTo(190, 170);
2662 path.close();
2663 SkPath pathB;
2664 pathB.setFillType(SkPath::kWinding_FillType);
2665 pathB.moveTo(210, 190);
2666 pathB.quadTo(210, 198.284271f, 204.142136f, 204.142136f);
2667 pathB.quadTo(198.284271f, 210, 190, 210);
2668 pathB.quadTo(181.715729f, 210, 175.857864f, 204.142136f);
2669 pathB.quadTo(170, 198.284271f, 170, 190);
2670 pathB.quadTo(170, 181.715729f, 175.857864f, 175.857864f);
2671 pathB.quadTo(181.715729f, 170, 190, 170);
2672 pathB.quadTo(198.284271f, 170, 204.142136f, 175.857864f);
2673 pathB.quadTo(210, 181.715729f, 210, 190);
2674 pathB.close();
2675 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2676 }
2677
skpbambootheme_com12(skiatest::Reporter * reporter)2678 static void skpbambootheme_com12(skiatest::Reporter* reporter) {
2679 SkPath path;
2680 path.setFillType(SkPath::kEvenOdd_FillType);
2681 path.moveTo(47.8780937f, 58);
2682 path.lineTo(0, 58);
2683 path.lineTo(-8.65973959e-015f, 96.9914017f);
2684 path.quadTo(20.0654926f, 96.6451874f, 34.3553391f, 82.3553391f);
2685 path.quadTo(44.9466133f, 71.764061f, 47.8780937f, 58);
2686 path.close();
2687 SkPath pathB;
2688 pathB.setFillType(SkPath::kEvenOdd_FillType);
2689 pathB.moveTo(-1, -3);
2690 pathB.lineTo(-1, -3);
2691 pathB.cubicTo(26.6142502f, -3, 49, 19.3857498f, 49, 47);
2692 pathB.lineTo(49, 47);
2693 pathB.cubicTo(49, 74.6142502f, 26.6142502f, 97, -1, 97);
2694 pathB.lineTo(-1, 97);
2695 pathB.cubicTo(-28.6142502f, 97, -51, 74.6142502f, -51, 47);
2696 pathB.lineTo(-51, 47);
2697 pathB.cubicTo(-51, 19.3857498f, -28.6142502f, -3, -1, -3);
2698 pathB.close();
2699 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2700 }
2701
skpakmmos_ru100(skiatest::Reporter * reporter)2702 static void skpakmmos_ru100(skiatest::Reporter* reporter) {
2703 SkPath path;
2704 path.setFillType(SkPath::kEvenOdd_FillType);
2705 path.moveTo(693.000488f, 926);
2706 path.cubicTo(692.164734f, 925.37207f, 691.125793f, 925, 690, 925);
2707 path.lineTo(578, 925);
2708 path.cubicTo(576.874207f, 925, 575.835266f, 925.37207f, 574.999512f, 926);
2709 path.lineTo(693.000488f, 926);
2710 path.close();
2711 SkPath pathB;
2712 pathB.setFillType(SkPath::kWinding_FillType);
2713 pathB.moveTo(575, 925);
2714 pathB.lineTo(693, 925);
2715 pathB.lineTo(693, 926);
2716 pathB.lineTo(575, 926);
2717 pathB.close();
2718 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2719 }
2720
skpcarpetplanet_ru22(skiatest::Reporter * reporter)2721 static void skpcarpetplanet_ru22(skiatest::Reporter* reporter) {
2722 SkPath path;
2723 path.setFillType(SkPath::kEvenOdd_FillType);
2724 path.moveTo(195, 785);
2725 path.cubicTo(124.307556f, 785, 67, 841.859863f, 67, 912);
2726 path.lineTo(67, 913);
2727 path.cubicTo(67, 917.388916f, 67.2243805f, 921.725769f, 67.662384f, 926);
2728 path.lineTo(322, 926);
2729 path.lineTo(322, 896.048035f);
2730 path.cubicTo(314.09201f, 833.437622f, 260.247131f, 785, 195, 785);
2731 path.close();
2732 SkPath pathB;
2733 pathB.setFillType(SkPath::kWinding_FillType);
2734 pathB.moveTo(195, 785);
2735 pathB.cubicTo(265.140167f, 785, 322, 842.307556f, 322, 913);
2736 pathB.cubicTo(322, 983.692444f, 265.140167f, 1041, 195, 1041);
2737 pathB.lineTo(194, 1041);
2738 pathB.cubicTo(123.85984f, 1041, 67, 983.692444f, 67, 913);
2739 pathB.cubicTo(67, 842.307556f, 123.85984f, 785, 194, 785);
2740 pathB.lineTo(195, 785);
2741 pathB.close();
2742 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2743 }
2744
2745 #define SKPS_WORKING 0
2746 #if SKPS_WORKING
skpcarrot_is24(skiatest::Reporter * reporter)2747 static void skpcarrot_is24(skiatest::Reporter* reporter) {
2748 SkPath path;
2749 path.setFillType(SkPath::kEvenOdd_FillType);
2750 path.moveTo(945, 597);
2751 path.quadTo(913.93396f, 597, 891.96698f, 618.96698f);
2752 path.quadTo(870, 640.93396f, 870, 672);
2753 path.quadTo(870, 703.06604f, 891.96698f, 725.03302f);
2754 path.quadTo(913.93396f, 747, 945, 747);
2755 path.quadTo(976.06604f, 747, 998.03302f, 725.03302f);
2756 path.quadTo(1020, 703.06604f, 1020, 672);
2757 path.quadTo(1020, 640.93396f, 998.03302f, 618.96698f);
2758 path.quadTo(976.06604f, 597, 945, 597);
2759 path.close();
2760 SkPath pathB;
2761 pathB.setFillType(SkPath::kWinding_FillType);
2762 pathB.moveTo(945.080994f, 597.161987f);
2763 pathB.cubicTo(903.659973f, 597.161987f, 870.080994f, 630.73999f, 870.080994f, 672.161987f);
2764 pathB.cubicTo(870.080994f, 676.096008f, 870.387024f, 679.957031f, 870.971008f, 683.726013f);
2765 pathB.cubicTo(876.53302f, 719.656006f, 907.593994f, 747.161987f, 945.080994f, 747.161987f);
2766 pathB.cubicTo(982.567993f, 747.161987f, 1013.62903f, 719.656006f, 1019.19104f, 683.726013f);
2767 pathB.cubicTo(1019.77502f, 679.955017f, 1020.08099f, 676.094971f, 1020.08099f, 672.161987f);
2768 pathB.cubicTo(1020.08002f, 630.73999f, 986.502014f, 597.161987f, 945.080994f, 597.161987f);
2769 pathB.close();
2770 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2771 }
2772
2773 #endif
2774
skpbangalorenest_com4(skiatest::Reporter * reporter)2775 static void skpbangalorenest_com4(skiatest::Reporter* reporter) {
2776 SkPath path;
2777 path.setFillType(SkPath::kEvenOdd_FillType);
2778 path.moveTo(0, 926);
2779 path.lineTo(0, 0);
2780 path.lineTo(1265, 0);
2781 path.lineTo(1265, 926);
2782 path.lineTo(0, 926);
2783 path.close();
2784 SkPath pathB;
2785 pathB.setFillType(SkPath::kWinding_FillType);
2786 pathB.moveTo(0, 290);
2787 pathB.lineTo(-2.64514972e-014f, 146);
2788 pathB.lineTo(30, 146);
2789 pathB.lineTo(30, 290);
2790 pathB.close();
2791 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2792 }
2793
skpbenzoteh_ru152(skiatest::Reporter * reporter)2794 static void skpbenzoteh_ru152(skiatest::Reporter* reporter) {
2795 SkPath path;
2796 path.setFillType(SkPath::kEvenOdd_FillType);
2797 path.moveTo(883, 23);
2798 path.lineTo(883, 0);
2799 path.lineTo(1122.5f, 0);
2800 path.lineTo(1122.5f, 25.2136822f);
2801 path.quadTo(1122.14441f, 25.9271851f, 1121.53601f, 26.5359993f);
2802 path.quadTo(1120.07104f, 28, 1118, 28);
2803 path.lineTo(888, 28);
2804 path.quadTo(885.928955f, 28, 884.463989f, 26.5359993f);
2805 path.quadTo(883, 25.0710678f, 883, 23);
2806 path.close();
2807 SkPath pathB;
2808 pathB.setFillType(SkPath::kWinding_FillType);
2809 pathB.moveTo(883, 0);
2810 pathB.lineTo(1123, 0);
2811 pathB.lineTo(1123, 23);
2812 pathB.quadTo(1123, 25.0710678f, 1121.53601f, 26.5359993f);
2813 pathB.quadTo(1120.07104f, 28, 1118, 28);
2814 pathB.lineTo(888, 28);
2815 pathB.quadTo(885.928955f, 28, 884.463989f, 26.5359993f);
2816 pathB.quadTo(883, 25.0710678f, 883, 23);
2817 pathB.close();
2818 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2819 }
2820
skpbestred_ru37(skiatest::Reporter * reporter)2821 static void skpbestred_ru37(skiatest::Reporter* reporter) {
2822 SkPath path;
2823 path.setFillType(SkPath::kEvenOdd_FillType);
2824 path.moveTo(883, 23);
2825 path.lineTo(883, 0);
2826 path.lineTo(1122.5f, 0);
2827 path.lineTo(1122.5f, 25.2136822f);
2828 path.quadTo(1122.14441f, 25.9271851f, 1121.53601f, 26.5359993f);
2829 path.quadTo(1120.07104f, 28, 1118, 28);
2830 path.lineTo(888, 28);
2831 path.quadTo(885.928955f, 28, 884.463989f, 26.5359993f);
2832 path.quadTo(883, 25.0710678f, 883, 23);
2833 path.close();
2834 SkPath pathB;
2835 pathB.setFillType(SkPath::kWinding_FillType);
2836 pathB.moveTo(883, 0);
2837 pathB.lineTo(1123, 0);
2838 pathB.lineTo(1123, 23);
2839 pathB.quadTo(1123, 25.0710678f, 1121.53601f, 26.5359993f);
2840 pathB.quadTo(1120.07104f, 28, 1118, 28);
2841 pathB.lineTo(888, 28);
2842 pathB.quadTo(885.928955f, 28, 884.463989f, 26.5359993f);
2843 pathB.quadTo(883, 25.0710678f, 883, 23);
2844 pathB.close();
2845 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2846 }
2847
skpbingoentertainment_net189(skiatest::Reporter * reporter)2848 static void skpbingoentertainment_net189(skiatest::Reporter* reporter) {
2849 SkPath path;
2850 path.setFillType(SkPath::kEvenOdd_FillType);
2851 path.moveTo(896, 745.38678f);
2852 path.lineTo(896, 873.38678f);
2853 path.lineTo(922.567993f, 876.683716f);
2854 path.lineTo(922.567993f, 748.683716f);
2855 path.lineTo(896, 745.38678f);
2856 path.close();
2857 SkPath pathB;
2858 pathB.setFillType(SkPath::kWinding_FillType);
2859 pathB.moveTo(899.200928f, 745.783997f);
2860 pathB.cubicTo(897.119385f, 745.525696f, 895.432007f, 752.031982f, 895.432007f, 760.316284f);
2861 pathB.lineTo(895.432007f, 858.316284f);
2862 pathB.cubicTo(895.432007f, 866.600586f, 897.119385f, 873.525696f, 899.200928f, 873.783997f);
2863 pathB.lineTo(918.799133f, 876.216003f);
2864 pathB.cubicTo(920.880615f, 876.474304f, 922.567993f, 869.968018f, 922.567993f, 861.683716f);
2865 pathB.lineTo(922.567993f, 763.683716f);
2866 pathB.cubicTo(922.567993f, 755.399414f, 920.880615f, 748.474304f, 918.799133f, 748.216003f);
2867 pathB.lineTo(899.200928f, 745.783997f);
2868 pathB.close();
2869 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2870 }
2871
skpcarrefour_ro62(skiatest::Reporter * reporter)2872 static void skpcarrefour_ro62(skiatest::Reporter* reporter) {
2873 SkPath path;
2874 path.setFillType(SkPath::kEvenOdd_FillType);
2875 path.moveTo(1104, 453);
2876 path.lineTo(399, 453);
2877 path.lineTo(399, 657);
2878 path.cubicTo(399, 661.970581f, 403.029449f, 666, 408, 666);
2879 path.lineTo(1095, 666);
2880 path.cubicTo(1099.97058f, 666, 1104, 661.970581f, 1104, 657);
2881 path.lineTo(1104, 453);
2882 path.close();
2883 SkPath pathB;
2884 pathB.setFillType(SkPath::kInverseWinding_FillType);
2885 pathB.moveTo(400, 453);
2886 pathB.lineTo(1103, 453);
2887 pathB.lineTo(1103, 666);
2888 pathB.lineTo(406, 666);
2889 pathB.cubicTo(402.686279f, 666, 400, 663.313721f, 400, 660);
2890 pathB.lineTo(400, 453);
2891 pathB.close();
2892 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2893 }
2894
skpcaffelavazzait_com_ua21(skiatest::Reporter * reporter)2895 static void skpcaffelavazzait_com_ua21(skiatest::Reporter* reporter) {
2896 SkPath path;
2897 path.setFillType(SkPath::kEvenOdd_FillType);
2898 path.moveTo(883, 23);
2899 path.lineTo(883, 0);
2900 path.lineTo(1122.5f, 0);
2901 path.lineTo(1122.5f, 25.2136822f);
2902 path.quadTo(1122.14441f, 25.9271851f, 1121.53601f, 26.5359993f);
2903 path.quadTo(1120.07104f, 28, 1118, 28);
2904 path.lineTo(888, 28);
2905 path.quadTo(885.928955f, 28, 884.463989f, 26.5359993f);
2906 path.quadTo(883, 25.0710678f, 883, 23);
2907 path.close();
2908 SkPath pathB;
2909 pathB.setFillType(SkPath::kWinding_FillType);
2910 pathB.moveTo(883, 0);
2911 pathB.lineTo(1123, 0);
2912 pathB.lineTo(1123, 23);
2913 pathB.quadTo(1123, 25.0710678f, 1121.53601f, 26.5359993f);
2914 pathB.quadTo(1120.07104f, 28, 1118, 28);
2915 pathB.lineTo(888, 28);
2916 pathB.quadTo(885.928955f, 28, 884.463989f, 26.5359993f);
2917 pathB.quadTo(883, 25.0710678f, 883, 23);
2918 pathB.close();
2919 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2920 }
2921
skpcamcorder_kz21(skiatest::Reporter * reporter)2922 static void skpcamcorder_kz21(skiatest::Reporter* reporter) {
2923 SkPath path;
2924 path.setFillType(SkPath::kEvenOdd_FillType);
2925 path.moveTo(883, 23);
2926 path.lineTo(883, 0);
2927 path.lineTo(1122.5f, 0);
2928 path.lineTo(1122.5f, 25.2136822f);
2929 path.quadTo(1122.14441f, 25.9271851f, 1121.53601f, 26.5359993f);
2930 path.quadTo(1120.07104f, 28, 1118, 28);
2931 path.lineTo(888, 28);
2932 path.quadTo(885.928955f, 28, 884.463989f, 26.5359993f);
2933 path.quadTo(883, 25.0710678f, 883, 23);
2934 path.close();
2935 SkPath pathB;
2936 pathB.setFillType(SkPath::kWinding_FillType);
2937 pathB.moveTo(883, 0);
2938 pathB.lineTo(1123, 0);
2939 pathB.lineTo(1123, 23);
2940 pathB.quadTo(1123, 25.0710678f, 1121.53601f, 26.5359993f);
2941 pathB.quadTo(1120.07104f, 28, 1118, 28);
2942 pathB.lineTo(888, 28);
2943 pathB.quadTo(885.928955f, 28, 884.463989f, 26.5359993f);
2944 pathB.quadTo(883, 25.0710678f, 883, 23);
2945 pathB.close();
2946 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2947 }
2948
skpcavablar_net563(skiatest::Reporter * reporter)2949 static void skpcavablar_net563(skiatest::Reporter* reporter) {
2950 SkPath path;
2951 path.setFillType(SkPath::kEvenOdd_FillType);
2952 path.moveTo(160.000488f, 918);
2953 path.cubicTo(159.164749f, 917.37207f, 158.125824f, 917, 157, 917);
2954 path.lineTo(94, 917);
2955 path.cubicTo(92.874176f, 917, 91.8352661f, 917.37207f, 90.9995193f, 918);
2956 path.lineTo(160.000488f, 918);
2957 path.close();
2958 SkPath pathB;
2959 pathB.setFillType(SkPath::kWinding_FillType);
2960 pathB.moveTo(91, 917);
2961 pathB.lineTo(160, 917);
2962 pathB.lineTo(160, 918);
2963 pathB.lineTo(91, 918);
2964 pathB.close();
2965 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2966 }
2967
skpinsomnia_gr72(skiatest::Reporter * reporter)2968 static void skpinsomnia_gr72(skiatest::Reporter* reporter) {
2969 SkPath path;
2970 path.setFillType(SkPath::kEvenOdd_FillType);
2971 path.moveTo(1138, 231);
2972 path.lineTo(1137, 243.625748f);
2973 path.lineTo(1137, 926);
2974 path.lineTo(1139, 926);
2975 path.lineTo(1139, 231);
2976 path.lineTo(1138, 231);
2977 path.close();
2978 SkPath pathB;
2979 pathB.setFillType(SkPath::kWinding_FillType);
2980 pathB.moveTo(1139, 231);
2981 pathB.lineTo(1138, 231);
2982 pathB.lineTo(633, 6101);
2983 pathB.lineTo(1139, 6607);
2984 testPathOp(reporter, path, pathB, kIntersect_PathOp);
2985 }
2986
cubicOp95u(skiatest::Reporter * reporter)2987 static void cubicOp95u(skiatest::Reporter* reporter) {
2988 SkPath path, pathB;
2989 path.setFillType(SkPath::kEvenOdd_FillType);
2990 path.moveTo(0, 2);
2991 path.cubicTo(2, 3, 5, 1, 3, 2);
2992 path.close();
2993 pathB.setFillType(SkPath::kEvenOdd_FillType);
2994 pathB.moveTo(1, 5);
2995 pathB.cubicTo(2, 3, 2, 0, 3, 2);
2996 pathB.close();
2997 testPathOp(reporter, path, pathB, kUnion_PathOp);
2998 }
2999
cubicOp96d(skiatest::Reporter * reporter)3000 static void cubicOp96d(skiatest::Reporter* reporter) {
3001 SkPath path, pathB;
3002 path.setFillType(SkPath::kEvenOdd_FillType);
3003 path.moveTo(1, 6);
3004 path.cubicTo(0, 3, 6, 3, 5, 0);
3005 path.close();
3006 pathB.setFillType(SkPath::kEvenOdd_FillType);
3007 pathB.moveTo(3, 6);
3008 pathB.cubicTo(0, 5, 6, 1, 3, 0);
3009 pathB.close();
3010 testPathOp(reporter, path, pathB, kDifference_PathOp);
3011 }
3012
cubicOp97x(skiatest::Reporter * reporter)3013 static void cubicOp97x(skiatest::Reporter* reporter) {
3014 SkPath path, pathB;
3015 path.setFillType(SkPath::kEvenOdd_FillType);
3016 path.moveTo(0, 2);
3017 path.cubicTo(0, 6, 2, 1, 2, 1);
3018 path.close();
3019 pathB.setFillType(SkPath::kEvenOdd_FillType);
3020 pathB.moveTo(1, 2);
3021 pathB.cubicTo(1, 2, 2, 0, 6, 0);
3022 pathB.close();
3023 testPathOp(reporter, path, pathB, kXOR_PathOp);
3024 }
3025
cubicOp98x(skiatest::Reporter * reporter)3026 static void cubicOp98x(skiatest::Reporter* reporter) {
3027 SkPath path, pathB;
3028 path.setFillType(SkPath::kEvenOdd_FillType);
3029 path.moveTo(0, 3);
3030 path.cubicTo(3, 6, 4, 1, 6, 3);
3031 path.close();
3032 pathB.setFillType(SkPath::kEvenOdd_FillType);
3033 pathB.moveTo(1, 4);
3034 pathB.cubicTo(3, 6, 3, 0, 6, 3);
3035 pathB.close();
3036 testPathOp(reporter, path, pathB, kXOR_PathOp);
3037 }
3038
cubicOp99(skiatest::Reporter * reporter)3039 static void cubicOp99(skiatest::Reporter* reporter) {
3040 SkPath path, pathB;
3041 path.setFillType(SkPath::kWinding_FillType);
3042 path.moveTo(3,6);
3043 path.cubicTo(0,3, 6,5, 5,4);
3044 path.close();
3045 pathB.setFillType(SkPath::kWinding_FillType);
3046 pathB.moveTo(5,6);
3047 pathB.cubicTo(4,5, 6,3, 3,0);
3048 pathB.close();
3049 testPathOp(reporter, path, pathB, kIntersect_PathOp);
3050 }
3051
cubicOp100(skiatest::Reporter * reporter)3052 static void cubicOp100(skiatest::Reporter* reporter) {
3053 SkPath path, pathB;
3054 path.setFillType(SkPath::kWinding_FillType);
3055 path.moveTo(0,1);
3056 path.cubicTo(0,2, 2,1, 4,2);
3057 path.close();
3058 pathB.setFillType(SkPath::kWinding_FillType);
3059 pathB.moveTo(1,2);
3060 pathB.cubicTo(2,4, 1,0, 2,0);
3061 pathB.close();
3062 testPathOp(reporter, path, pathB, kDifference_PathOp);
3063 }
3064
cubicOp101(skiatest::Reporter * reporter)3065 static void cubicOp101(skiatest::Reporter* reporter) {
3066 SkPath path, pathB;
3067 path.setFillType(SkPath::kWinding_FillType);
3068 path.moveTo(0, 1);
3069 path.cubicTo(2, 3, 2, 1, 5, 3);
3070 path.close();
3071 pathB.setFillType(SkPath::kWinding_FillType);
3072 pathB.moveTo(1, 2);
3073 pathB.cubicTo(3, 5, 1, 0, 3, 2);
3074 pathB.close();
3075 testPathOp(reporter, path, pathB, kIntersect_PathOp);
3076 }
3077
3078 static void (*firstTest)(skiatest::Reporter* ) = 0;
3079
3080 static struct TestDesc tests[] = {
3081 TEST(cubicOp101),
3082 TEST(cubicOp100),
3083 TEST(cubicOp99),
3084 #if ISSUE_1435_WORKING
3085 TEST(issue1435),
3086 #endif
3087 #if SKPS_WORKING
3088 TEST(skpcarrot_is24),
3089 #endif
3090 #if ISSUE_1417_WORKING_ON_LINUX_32
3091 TEST(issue1417),
3092 #endif
3093 TEST(cubicOp98x),
3094 TEST(cubicOp97x),
3095 TEST(skpcarpetplanet_ru22), // cubic/cubic intersect detects unwanted coincidence
3096 TEST(cubicOp96d),
3097 TEST(cubicOp95u),
3098 TEST(skpadbox_lt15),
3099 TEST(skpagentxsites_com55),
3100 TEST(skpadventistmission_org572),
3101 TEST(skpadspert_net23),
3102 TEST(skpadoption_org196),
3103 TEST(skpbambootheme_com12),
3104 TEST(skpbakosoft_com10),
3105 TEST(skpakmmos_ru100),
3106 TEST(skpbangalorenest_com4),
3107 TEST(skpbingoentertainment_net189),
3108 TEST(skpbestred_ru37),
3109 TEST(skpbenzoteh_ru152),
3110 TEST(skpcamcorder_kz21),
3111 TEST(skpcaffelavazzait_com_ua21),
3112 TEST(skpcarrefour_ro62),
3113 TEST(skpcavablar_net563),
3114 TEST(skpinsomnia_gr72),
3115 TEST(skpadbox_lt8),
3116 TEST(skpact_com43),
3117 TEST(skpacesoftech_com47),
3118 TEST(skpabcspark_ca103),
3119 TEST(cubicOp94u),
3120 TEST(cubicOp93d),
3121 TEST(cubicOp92i),
3122 TEST(skpadithya_putr4_blogspot_com551),
3123 TEST(skpadindex_de4),
3124 TEST(skpadspert_de11),
3125 TEST(skpaiaigames_com870),
3126 TEST(skpaaalgarve_org53),
3127 TEST(skpkkiste_to716),
3128 TEST(bufferOverflow),
3129 TEST(cubicOp91u),
3130 TEST(cubicOp90u),
3131 TEST(cubicOp89u),
3132 TEST(cubicOp88u),
3133 TEST(cubicOp87u),
3134 TEST(cubicOp86i),
3135 TEST(loopEdge2),
3136 TEST(loopEdge1),
3137 TEST(rectOp3x),
3138 TEST(rectOp2i),
3139 TEST(rectOp1i),
3140 TEST(issue1418b),
3141 TEST(cubicOp85i),
3142 TEST(issue1418),
3143 TEST(skpkkiste_to98),
3144 TEST(skpahrefs_com29),
3145 TEST(cubicOp85d),
3146 TEST(skpahrefs_com88),
3147 TEST(skphealth_com76),
3148 TEST(skpancestry_com1),
3149 TEST(skpbyte_com1),
3150 TEST(skpeldorado_com_ua1),
3151 TEST(skp96prezzi1),
3152 TEST(skpClip2),
3153 TEST(skpClip1),
3154 TEST(cubicOp84d),
3155 TEST(cubicOp83i),
3156 TEST(cubicOp82i),
3157 TEST(cubicOp81d),
3158 TEST(cubicOp80i),
3159 TEST(cubicOp79u),
3160 TEST(cubicOp78u),
3161 TEST(cubicOp77i),
3162 TEST(cubicOp76u),
3163 TEST(cubicOp75d),
3164 TEST(cubicOp74d),
3165 TEST(cubicOp73d),
3166 TEST(cubicOp72i),
3167 TEST(cubicOp71d),
3168 TEST(skp5),
3169 TEST(skp4),
3170 TEST(skp3),
3171 TEST(skp2),
3172 TEST(skp1),
3173 TEST(rRect1),
3174 TEST(cubicOp70d),
3175 TEST(cubicOp69d),
3176 TEST(cubicOp68u),
3177 TEST(cubicOp67u),
3178 TEST(cubicOp66u),
3179 TEST(rectOp1d),
3180 TEST(cubicOp65d),
3181 TEST(cubicOp64d),
3182 TEST(cubicOp63d),
3183 TEST(cubicOp62d),
3184 TEST(cubicOp61d),
3185 TEST(cubicOp60d),
3186 TEST(cubicOp59d),
3187 TEST(cubicOp58d),
3188 TEST(cubicOp57d),
3189 TEST(cubicOp56d),
3190 TEST(cubicOp55d),
3191 TEST(cubicOp54d),
3192 TEST(cubicOp53d),
3193 TEST(cubicOp52d),
3194 TEST(cubicOp51d),
3195 TEST(cubicOp50d),
3196 TEST(cubicOp49d),
3197 TEST(cubicOp48d),
3198 TEST(cubicOp47d),
3199 TEST(cubicOp46d),
3200 TEST(cubicOp45d),
3201 TEST(cubicOp44d),
3202 TEST(cubicOp43d),
3203 TEST(cubicOp42d),
3204 TEST(cubicOp41i),
3205 TEST(cubicOp40d),
3206 TEST(cubicOp39d),
3207 TEST(cubicOp38d),
3208 TEST(cubicOp37d),
3209 TEST(cubicOp36u),
3210 TEST(cubicOp35d),
3211 TEST(cubicOp34d),
3212 TEST(cubicOp33i),
3213 TEST(cubicOp32d),
3214 TEST(cubicOp31d),
3215 TEST(cubicOp31x),
3216 TEST(cubicOp31u),
3217 TEST(cubicOp30d),
3218 TEST(cubicOp29d),
3219 TEST(cubicOp28u),
3220 TEST(cubicOp27d),
3221 TEST(cubicOp26d),
3222 TEST(cubicOp25i),
3223 TEST(testOp8d),
3224 TEST(testDiff1),
3225 TEST(testIntersect1),
3226 TEST(testUnion1),
3227 TEST(testXor1),
3228 TEST(testDiff2),
3229 TEST(testIntersect2),
3230 TEST(testUnion2),
3231 TEST(testXor2),
3232 TEST(testOp1d),
3233 TEST(testOp2d),
3234 TEST(testOp3d),
3235 TEST(testOp1u),
3236 TEST(testOp4d),
3237 TEST(testOp5d),
3238 TEST(testOp6d),
3239 TEST(testOp7d),
3240 TEST(testOp2u),
3241
3242 TEST(cubicOp24d),
3243 TEST(cubicOp23d),
3244 TEST(cubicOp22d),
3245 TEST(cubicOp21d),
3246 TEST(cubicOp20d),
3247 TEST(cubicOp19i),
3248 TEST(cubicOp18d),
3249 TEST(cubicOp17d),
3250 TEST(cubicOp16d),
3251 TEST(cubicOp15d),
3252 TEST(cubicOp14d),
3253 TEST(cubicOp13d),
3254 TEST(cubicOp12d),
3255 TEST(cubicOp11d),
3256 TEST(cubicOp10d),
3257 TEST(cubicOp1i),
3258 TEST(cubicOp9d),
3259 TEST(quadOp9d),
3260 TEST(lineOp9d),
3261 TEST(cubicOp8d),
3262 TEST(cubicOp7d),
3263 TEST(cubicOp6d),
3264 TEST(cubicOp5d),
3265 TEST(cubicOp3d),
3266 TEST(cubicOp2d),
3267 TEST(cubicOp1d),
3268 };
3269
3270 static const size_t testCount = SK_ARRAY_COUNT(tests);
3271
3272 static struct TestDesc subTests[] = {
3273 TEST(cubicOp6d),
3274 TEST(cubicOp8d),
3275 TEST(cubicOp70d),
3276 TEST(cubicOp16d),
3277 TEST(skp5),
3278 };
3279
3280 static const size_t subTestCount = SK_ARRAY_COUNT(subTests);
3281
3282 static void (*firstSubTest)(skiatest::Reporter* ) = 0;
3283
3284 static bool runSubTestsFirst = false;
3285 static bool runReverse = false;
3286 static void (*stopTest)(skiatest::Reporter* ) = 0;
3287
PathOpsOpTest(skiatest::Reporter * reporter)3288 static void PathOpsOpTest(skiatest::Reporter* reporter) {
3289 #ifdef SK_DEBUG
3290 SkPathOpsDebug::gMaxWindSum = 4;
3291 SkPathOpsDebug::gMaxWindValue = 4;
3292 #endif
3293 #if DEBUG_SHOW_TEST_NAME
3294 strncpy(DEBUG_FILENAME_STRING, "", DEBUG_FILENAME_STRING_LENGTH);
3295 #endif
3296 if (runSubTestsFirst) {
3297 RunTestSet(reporter, subTests, subTestCount, firstSubTest, stopTest, runReverse);
3298 }
3299 RunTestSet(reporter, tests, testCount, firstTest, stopTest, runReverse);
3300 if (!runSubTestsFirst) {
3301 RunTestSet(reporter, subTests, subTestCount, firstSubTest, stopTest, runReverse);
3302 }
3303 #ifdef SK_DEBUG
3304 SkPathOpsDebug::gMaxWindSum = SK_MaxS32;
3305 SkPathOpsDebug::gMaxWindValue = SK_MaxS32;
3306 #endif
3307 }
3308
3309 #include "TestClassDef.h"
3310 DEFINE_TESTCLASS_SHORT(PathOpsOpTest)
3311