SimplifyNew_Test.cpp revision 03f970652e07c6832cae41fa374cb68ca80d472c
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
8#include "EdgeWalker_Test.h"
9#include "Intersection_Tests.h"
10#include "ShapeOps.h"
11
12#define TEST(name) { name, #name }
13
14static void testLine1() {
15    SkPath path;
16    path.moveTo(2,0);
17    path.lineTo(1,1);
18    path.lineTo(0,0);
19    path.close();
20    testSimplifyx(path);
21}
22
23static void addInnerCWTriangle(SkPath& path) {
24    path.moveTo(3,0);
25    path.lineTo(4,1);
26    path.lineTo(2,1);
27    path.close();
28}
29
30static void addInnerCCWTriangle(SkPath& path) {
31    path.moveTo(3,0);
32    path.lineTo(2,1);
33    path.lineTo(4,1);
34    path.close();
35}
36
37static void addOuterCWTriangle(SkPath& path) {
38    path.moveTo(3,0);
39    path.lineTo(6,2);
40    path.lineTo(0,2);
41    path.close();
42}
43
44static void addOuterCCWTriangle(SkPath& path) {
45    path.moveTo(3,0);
46    path.lineTo(0,2);
47    path.lineTo(6,2);
48    path.close();
49}
50
51static void testLine2() {
52    SkPath path;
53    addInnerCWTriangle(path);
54    addOuterCWTriangle(path);
55    testSimplifyx(path);
56}
57
58static void testLine3() {
59    SkPath path;
60    addInnerCCWTriangle(path);
61    addOuterCWTriangle(path);
62    testSimplifyx(path);
63}
64
65static void testLine3a() {
66    SkPath path;
67    addInnerCWTriangle(path);
68    addOuterCCWTriangle(path);
69    testSimplifyx(path);
70}
71
72static void testLine3b() {
73    SkPath path;
74    addInnerCCWTriangle(path);
75    addOuterCCWTriangle(path);
76    testSimplifyx(path);
77}
78
79static void testLine4() {
80    SkPath path;
81    addOuterCCWTriangle(path);
82    addOuterCWTriangle(path);
83    testSimplifyx(path);
84}
85
86static void testLine5() {
87    SkPath path;
88    addOuterCWTriangle(path);
89    addOuterCWTriangle(path);
90    testSimplifyx(path);
91}
92
93static void testLine6() {
94    SkPath path;
95    path.moveTo(0,0);
96    path.lineTo(4,0);
97    path.lineTo(2,2);
98    path.close();
99    path.moveTo(2,0);
100    path.lineTo(6,0);
101    path.lineTo(4,2);
102    path.close();
103    testSimplifyx(path);
104}
105
106static void testLine7() {
107    SkPath path;
108    path.moveTo(0,0);
109    path.lineTo(4,0);
110    path.lineTo(2,2);
111    path.close();
112    path.moveTo(6,0);
113    path.lineTo(2,0);
114    path.lineTo(4,2);
115    path.close();
116    testSimplifyx(path);
117}
118
119static void testLine7a() {
120    SkPath path;
121    path.moveTo(0,0);
122    path.lineTo(4,0);
123    path.lineTo(2,2);
124    path.close();
125    testSimplifyx(path);
126}
127
128static void testLine7b() {
129    SkPath path;
130    path.moveTo(0,0);
131    path.lineTo(4,0);
132    path.close();
133    path.moveTo(6,0);
134    path.lineTo(2,0);
135    path.lineTo(4,2);
136    path.close();
137    testSimplifyx(path);
138}
139
140static void testLine8() {
141    SkPath path;
142    path.moveTo(0,4);
143    path.lineTo(4,4);
144    path.lineTo(2,2);
145    path.close();
146    path.moveTo(2,4);
147    path.lineTo(6,4);
148    path.lineTo(4,2);
149    path.close();
150    testSimplifyx(path);
151}
152
153static void testLine9() {
154    SkPath path;
155    path.moveTo(0,4);
156    path.lineTo(4,4);
157    path.lineTo(2,2);
158    path.close();
159    path.moveTo(6,4);
160    path.lineTo(2,4);
161    path.lineTo(4,2);
162    path.close();
163    testSimplifyx(path);
164}
165
166static void testLine10() {
167    SkPath path;
168    path.moveTo(0,4);
169    path.lineTo(4,4);
170    path.lineTo(2,2);
171    path.close();
172    path.moveTo(2,1);
173    path.lineTo(3,4);
174    path.lineTo(6,1);
175    path.close();
176    testSimplifyx(path);
177}
178
179static void testLine10a() {
180    SkPath path;
181    path.moveTo(0,4);
182    path.lineTo(8,4);
183    path.lineTo(4,0);
184    path.close();
185    path.moveTo(2,2);
186    path.lineTo(3,3);
187    path.lineTo(4,2);
188    path.close();
189    testSimplifyx(path);
190}
191
192static void addCWContainer(SkPath& path) {
193    path.moveTo(6,4);
194    path.lineTo(0,4);
195    path.lineTo(3,1);
196    path.close();
197}
198
199static void addCCWContainer(SkPath& path) {
200    path.moveTo(0,4);
201    path.lineTo(6,4);
202    path.lineTo(3,1);
203    path.close();
204}
205
206static void addCWContents(SkPath& path) {
207    path.moveTo(2,3);
208    path.lineTo(3,2);
209    path.lineTo(4,3);
210    path.close();
211}
212
213static void addCCWContents(SkPath& path) {
214    path.moveTo(3,2);
215    path.lineTo(2,3);
216    path.lineTo(4,3);
217    path.close();
218}
219
220static void testLine11() {
221    SkPath path;
222    addCWContainer(path);
223    addCWContents(path);
224    testSimplifyx(path);
225}
226
227static void testLine12() {
228    SkPath path;
229    addCCWContainer(path);
230    addCWContents(path);
231    testSimplifyx(path);
232}
233
234static void testLine13() {
235    SkPath path;
236    addCWContainer(path);
237    addCCWContents(path);
238    testSimplifyx(path);
239}
240
241static void testLine14() {
242    SkPath path;
243    addCCWContainer(path);
244    addCCWContents(path);
245    testSimplifyx(path);
246}
247
248static void testLine15() {
249    SkPath path;
250    path.addRect(0, 0, 9, 9, (SkPath::Direction) 0);
251    testSimplifyx(path);
252}
253
254static void testLine16() {
255    SkPath path;
256    path.addRect(0, 0, 12, 12, (SkPath::Direction) 0);
257    path.addRect(0, 4, 9, 9, (SkPath::Direction) 0);
258    testSimplifyx(path);
259}
260
261static void testLine17() {
262    SkPath path;
263    path.addRect(0, 0, 12, 12, (SkPath::Direction) 0);
264    path.addRect(4, 12, 13, 13, (SkPath::Direction) 0);
265    testSimplifyx(path);
266}
267
268static void testLine18() {
269    SkPath path;
270    path.addRect(0, 0, 12, 12, (SkPath::Direction) 0);
271    path.addRect(12, 4, 21, 21, (SkPath::Direction) 0);
272    testSimplifyx(path);
273}
274
275static void testLine19() {
276    SkPath path;
277    path.addRect(0, 0, 12, 12, (SkPath::Direction) 0);
278    path.addRect(12, 16, 21, 21, (SkPath::Direction) 0);
279    testSimplifyx(path);
280}
281
282static void testLine20() {
283    SkPath path;
284    path.addRect(0, 12, 12, 12, (SkPath::Direction) 0);
285    path.addRect(0, 12, 9, 9, (SkPath::Direction) 0);
286    testSimplifyx(path);
287}
288
289static void testLine21() {
290    SkPath path;
291    path.addRect(0, 12, 12, 12, (SkPath::Direction) 0);
292    path.addRect(0, 16, 9, 9, (SkPath::Direction) 0);
293    testSimplifyx(path);
294}
295
296static void testLine22() {
297    SkPath path;
298    path.addRect(0, 12, 12, 12, (SkPath::Direction) 0);
299    path.addRect(4, 12, 13, 13, (SkPath::Direction) 0);
300    testSimplifyx(path);
301}
302
303static void testLine23() {
304    SkPath path;
305    path.addRect(0, 12, 12, 12, (SkPath::Direction) 0);
306    path.addRect(12, 0, 21, 21, (SkPath::Direction) 0);
307    testSimplifyx(path);
308}
309
310
311
312static void testLine24a() {
313    SkPath path;
314    path.moveTo(2,0);
315    path.lineTo(4,4);
316    path.lineTo(0,4);
317    path.close();
318    path.moveTo(2,0);
319    path.lineTo(1,2);
320    path.lineTo(2,2);
321    path.close();
322    testSimplifyx(path);
323}
324
325static void testLine24() {
326    SkPath path;
327    path.addRect(0, 18, 12, 12, (SkPath::Direction) 0);
328    path.addRect(4, 12, 13, 13, (SkPath::Direction) 0);
329    testSimplifyx(path);
330}
331
332static void testLine25() {
333    SkPath path;
334    path.addRect(0, 6, 12, 12, (SkPath::Direction) 0);
335    path.addRect(12, 0, 21, 21, (SkPath::Direction) 0);
336    testSimplifyx(path);
337}
338
339static void testLine26() {
340    SkPath path;
341    path.addRect(0, 18, 12, 12, (SkPath::Direction) 0);
342    path.addRect(0, 12, 9, 9, (SkPath::Direction) 0);
343    testSimplifyx(path);
344}
345
346static void testLine27() {
347    SkPath path;
348    path.addRect(0, 18, 12, 12, (SkPath::Direction) 0);
349    path.addRect(12, 8, 21, 21, (SkPath::Direction) 0);
350    testSimplifyx(path);
351}
352
353static void testLine28() {
354    SkPath path;
355    path.addRect(0, 6, 12, 12, (SkPath::Direction) 0);
356    path.addRect(0, 0, 9, 9, (SkPath::Direction) 0);
357    testSimplifyx(path);
358}
359
360static void testLine29() {
361    SkPath path;
362    path.addRect(0, 18, 12, 12, (SkPath::Direction) 0);
363    path.addRect(12, 12, 21, 21, (SkPath::Direction) 0);
364    testSimplifyx(path);
365}
366
367static void testLine30() {
368    SkPath path;
369    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
370    path.addRect(0, 0, 12, 12, (SkPath::Direction) 0);
371    path.addRect(4, 4, 13, 13, (SkPath::Direction) 0);
372    testSimplifyx(path);
373}
374
375static void testLine31() {
376    SkPath path;
377    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
378    path.addRect(0, 0, 12, 12, (SkPath::Direction) 0);
379    path.addRect(0, 4, 9, 9, (SkPath::Direction) 0);
380    testSimplifyx(path);
381}
382
383static void testLine32() {
384    SkPath path;
385    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
386    path.addRect(0, 0, 12, 12, (SkPath::Direction) 0);
387    path.addRect(4, 12, 13, 13, (SkPath::Direction) 0);
388    testSimplifyx(path);
389}
390
391static void testLine33() {
392    SkPath path;
393    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
394    path.addRect(0, 0, 12, 12, (SkPath::Direction) 0);
395    path.addRect(4, 16, 13, 13, (SkPath::Direction) 0);
396    testSimplifyx(path);
397}
398
399static void testLine34() {
400    SkPath path;
401    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
402    path.addRect(0, 6, 12, 12, (SkPath::Direction) 0);
403    path.addRect(4, 12, 13, 13, (SkPath::Direction) 0);
404    testSimplifyx(path);
405}
406
407static void testLine35() {
408    SkPath path;
409    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
410    path.addRect(6, 0, 18, 18, (SkPath::Direction) 0);
411    path.addRect(4, 16, 13, 13, (SkPath::Direction) 0);
412    testSimplifyx(path);
413}
414
415static void testLine36() {
416    SkPath path;
417    path.addRect(0, 10, 20, 20, (SkPath::Direction) 0);
418    path.addRect(6, 12, 18, 18, (SkPath::Direction) 0);
419    path.addRect(4, 16, 13, 13, (SkPath::Direction) 0);
420    testSimplifyx(path);
421}
422
423static void testLine37() {
424    SkPath path;
425    path.addRect(0, 20, 20, 20, (SkPath::Direction) 0);
426    path.addRect(18, 24, 30, 30, (SkPath::Direction) 0);
427    path.addRect(0, 0, 9, 9, (SkPath::Direction) 0);
428    testSimplifyx(path);
429}
430
431static void testLine38() {
432    SkPath path;
433    path.addRect(10, 0, 30, 30, (SkPath::Direction) 0);
434    path.addRect(6, 12, 18, 18, (SkPath::Direction) 0);
435    path.addRect(12, 12, 21, 21, (SkPath::Direction) 0);
436    testSimplifyx(path);
437}
438
439static void testLine40() {
440    SkPath path;
441    path.addRect(10, 0, 30, 30, (SkPath::Direction) 0);
442    path.addRect(12, 18, 24, 24, (SkPath::Direction) 0);
443    path.addRect(4, 16, 13, 13, (SkPath::Direction) 0);
444    testSimplifyx(path);
445}
446
447static void testLine41() {
448    SkPath path;
449    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
450    path.addRect(18, 24, 30, 30, (SkPath::Direction) 0);
451    path.addRect(12, 0, 21, 21, (SkPath::Direction) 0);
452    testSimplifyx(path);
453}
454
455static void testLine42() {
456    SkPath path;
457    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
458    path.addRect(0, 0, 12, 12, (SkPath::Direction) 0);
459    path.addRect(8, 16, 17, 17, (SkPath::Direction) 0);
460    testSimplifyx(path);
461}
462
463static void testLine43() {
464    SkPath path;
465    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
466    path.addRect(6, 24, 18, 18, (SkPath::Direction) 0);
467    path.addRect(0, 32, 9, 36, (SkPath::Direction) 1);
468    testSimplifyx(path);
469}
470
471static void testLine44() {
472    SkPath path;
473    path.addRect(10, 40, 30, 30, (SkPath::Direction) 0);
474    path.addRect(18, 0, 30, 30, (SkPath::Direction) 0);
475    path.addRect(18, 32, 27, 36, (SkPath::Direction) 1);
476    testSimplifyx(path);
477}
478
479static void testLine45() {
480    SkPath path;
481    path.addRect(10, 0, 30, 30, (SkPath::Direction) 0);
482    path.addRect(18, 0, 30, 30, (SkPath::Direction) 0);
483    path.addRect(24, 32, 33, 36, (SkPath::Direction) 0);
484    testSimplifyx(path);
485}
486
487static void testLine46() {
488    SkPath path;
489    path.addRect(10, 40, 30, 30, (SkPath::Direction) 0);
490    path.addRect(24, 0, 36, 36, (SkPath::Direction) 0);
491    path.addRect(24, 32, 33, 36, (SkPath::Direction) 0);
492    testSimplifyx(path);
493}
494
495static void testLine47() {
496    SkPath path;
497    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
498    path.addRect(0, 0, 12, 12, (SkPath::Direction) 0);
499    path.addRect(0, 0, 9, 9, (SkPath::Direction) 1);
500    testSimplifyx(path);
501}
502
503static void testLine48() {
504    SkPath path;
505    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
506    path.addRect(0, 6, 12, 12, (SkPath::Direction) 0);
507    path.addRect(0, 0, 9, 9, (SkPath::Direction) 1);
508    testSimplifyx(path);
509}
510
511static void testLine49() {
512    SkPath path;
513    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
514    path.addRect(0, 0, 12, 12, (SkPath::Direction) 0);
515    path.addRect(0, 0, 9, 9, (SkPath::Direction) 0);
516    testSimplifyx(path);
517}
518
519static void testLine50() {
520    SkPath path;
521    path.addRect(10, 30, 30, 30, (SkPath::Direction) 0);
522    path.addRect(24, 20, 36, 30, (SkPath::Direction) 0);
523    testSimplifyx(path);
524}
525
526
527static void testLine51() {
528    SkPath path;
529    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
530    path.addRect(0, 12, 12, 12, (SkPath::Direction) 0);
531    path.addRect(4, 12, 13, 13, (SkPath::Direction) 1);
532    testSimplifyx(path);
533}
534
535static void testLine52() {
536    SkPath path;
537    path.addRect(0, 30, 20, 20, (SkPath::Direction) 0);
538    path.addRect(6, 20, 18, 30, (SkPath::Direction) 0);
539    path.addRect(32, 0, 36, 41, (SkPath::Direction) 0);
540    testSimplifyx(path);
541}
542
543static void testLine53() {
544    SkPath path;
545    path.addRect(10, 30, 30, 30, (SkPath::Direction) 0);
546    path.addRect(12, 20, 24, 30, (SkPath::Direction) 0);
547    path.addRect(12, 32, 21, 36, (SkPath::Direction) 1);
548    testSimplifyx(path);
549}
550
551static void testLine54() {
552    SkPath path;
553    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
554    path.addRect(6, 0, 18, 18, (SkPath::Direction) 0);
555    path.addRect(8, 4, 17, 17, (SkPath::Direction) 1);
556    testSimplifyx(path);
557}
558
559static void testLine55() {
560    SkPath path;
561    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
562    path.addRect(6, 6, 18, 18, (SkPath::Direction) 0);
563    path.addRect(4, 4, 13, 13, (SkPath::Direction) 1);
564    testSimplifyx(path);
565}
566
567static void testLine56() {
568    SkPath path;
569    path.addRect(0, 20, 20, 20, (SkPath::Direction) 0);
570    path.addRect(18, 20, 30, 30, (SkPath::Direction) 0);
571    path.addRect(12, 0, 21, 21, (SkPath::Direction) 1);
572    testSimplifyx(path);
573}
574
575static void testLine57() {
576    SkPath path;
577    path.addRect(20, 0, 40, 40, (SkPath::Direction) 0);
578    path.addRect(20, 0, 30, 40, (SkPath::Direction) 0);
579    path.addRect(12, 0, 21, 21, (SkPath::Direction) 1);
580    testSimplifyx(path);
581}
582
583static void testLine58() {
584    SkPath path;
585    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
586    path.addRect(0, 0, 12, 12, (SkPath::Direction) 1);
587    path.addRect(0, 12, 9, 9, (SkPath::Direction) 1);
588    testSimplifyx(path);
589}
590
591static void testLine59() {
592    SkPath path;
593    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
594    path.addRect(6, 6, 18, 18, (SkPath::Direction) 1);
595    path.addRect(4, 4, 13, 13, (SkPath::Direction) 1);
596    testSimplifyx(path);
597}
598
599static void testLine60() {
600    SkPath path;
601    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
602    path.addRect(6, 12, 18, 18, (SkPath::Direction) 1);
603    path.addRect(4, 12, 13, 13, (SkPath::Direction) 1);
604    testSimplifyx(path);
605}
606
607static void testLine61() {
608    SkPath path;
609    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
610    path.addRect(12, 0, 24, 24, (SkPath::Direction) 1);
611    path.addRect(12, 0, 21, 21, (SkPath::Direction) 1);
612    testSimplifyx(path);
613}
614
615static void testLine62() {
616    SkPath path;
617    path.addRect(0, 0, 60, 60, (SkPath::Direction) 0);
618    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
619    path.addRect(0, 12, 12, 12, (SkPath::Direction) 0);
620    path.addRect(4, 12, 13, 13, (SkPath::Direction) 1);
621    testSimplifyx(path);
622}
623
624static void testLine63() {
625    SkPath path;
626    path.addRect(0, 0, 60, 60, (SkPath::Direction) 0);
627    path.addRect(0, 10, 20, 20, (SkPath::Direction) 0);
628    path.addRect(0, 6, 12, 12, (SkPath::Direction) 1);
629    path.addRect(0, 32, 9, 36, (SkPath::Direction) 1);
630    testSimplifyx(path);
631}
632
633static void testLine64() {
634    SkPath path;
635    path.addRect(0, 0, 60, 60, (SkPath::Direction) 0);
636    path.addRect(10, 40, 30, 30, (SkPath::Direction) 0);
637    path.addRect(18, 6, 30, 30, (SkPath::Direction) 0);
638    testSimplifyx(path);
639}
640
641static void testLine65() {
642    SkPath path;
643    path.addRect(0, 0, 60, 60, (SkPath::Direction) 0);
644    path.addRect(10, 0, 30, 30, (SkPath::Direction) 0);
645    path.addRect(24, 0, 36, 36, (SkPath::Direction) 0);
646    path.addRect(32, 6, 36, 41, (SkPath::Direction) 1);
647    testSimplifyx(path);
648}
649
650static void testLine66() {
651    SkPath path;
652    path.addRect(0, 0, 60, 60, (SkPath::Direction) 0);
653    path.addRect(0, 30, 20, 20, (SkPath::Direction) 0);
654    path.addRect(12, 20, 24, 30, (SkPath::Direction) 0);
655    testSimplifyx(path);
656}
657
658static void testLine67() {
659    SkPath path;
660    path.addRect(0, 0, 60, 60, (SkPath::Direction) 0);
661    path.addRect(10, 40, 30, 30, (SkPath::Direction) 0);
662    path.addRect(24, 20, 36, 30, (SkPath::Direction) 0);
663    path.addRect(32, 0, 36, 41, (SkPath::Direction) 0);
664    testSimplifyx(path);
665}
666
667static void testLine68a() {
668    SkPath path;
669    path.addRect(0, 0, 8, 8, (SkPath::Direction) 0);
670    path.addRect(2, 2, 6, 6, (SkPath::Direction) 0);
671    path.addRect(1, 2, 4, 2, (SkPath::Direction) 0);
672    testSimplifyx(path);
673}
674
675static void testLine68b() {
676    SkPath path;
677    path.addRect(0, 0, 8, 8, (SkPath::Direction) 0);
678    path.addRect(2, 2, 6, 6, (SkPath::Direction) 1);
679    path.addRect(1, 2, 2, 2, (SkPath::Direction) 0);
680    testSimplifyx(path);
681}
682
683static void testLine68c() {
684    SkPath path;
685    path.addRect(0, 0, 8, 8, (SkPath::Direction) 1);
686    path.addRect(2, 2, 6, 6, (SkPath::Direction) 0);
687    path.addRect(1, 2, 4, 2, (SkPath::Direction) 0);
688    testSimplifyx(path);
689}
690
691static void testLine68d() {
692    SkPath path;
693    path.addRect(0, 0, 8, 8, (SkPath::Direction) 1);
694    path.addRect(2, 2, 6, 6, (SkPath::Direction) 1);
695    path.addRect(1, 2, 4, 2, (SkPath::Direction) 0);
696    testSimplifyx(path);
697}
698
699static void testLine68e() {
700    SkPath path;
701    path.addRect(0, 0, 8, 8, (SkPath::Direction) 0);
702    path.addRect(0, 0, 8, 8, (SkPath::Direction) 0);
703    path.addRect(2, 2, 6, 6, (SkPath::Direction) 1);
704    path.addRect(1, 2, 2, 2, (SkPath::Direction) 0);
705    testSimplifyx(path);
706}
707
708static void testLine68f() {
709    SkPath path;
710    path.addRect(0, 0, 8, 8, (SkPath::Direction) 0);
711    path.addRect(2, 2, 6, 6, (SkPath::Direction) 1);
712    path.addRect(2, 2, 6, 6, (SkPath::Direction) 1);
713    path.addRect(1, 2, 2, 2, (SkPath::Direction) 0);
714    testSimplifyx(path);
715}
716
717static void testLine68g() {
718    SkPath path;
719    path.addRect(0, 0, 8, 8, (SkPath::Direction) 0);
720    path.addRect(0, 0, 8, 8, (SkPath::Direction) 0);
721    path.addRect(2, 2, 6, 6, (SkPath::Direction) 1);
722    path.addRect(2, 2, 6, 6, (SkPath::Direction) 1);
723    path.addRect(1, 2, 2, 2, (SkPath::Direction) 0);
724    testSimplifyx(path);
725}
726
727static void testLine68h() {
728    SkPath path;
729    path.addRect(0, 0, 8, 8, (SkPath::Direction) 0);
730    path.addRect(2, 2, 6, 6, (SkPath::Direction) 1);
731    path.addRect(2, 2, 6, 6, (SkPath::Direction) 1);
732    path.addRect(2, 2, 6, 6, (SkPath::Direction) 1);
733    path.addRect(1, 2, 2, 2, (SkPath::Direction) 0);
734    testSimplifyx(path);
735}
736
737static void testLine69() {
738    SkPath path;
739    path.addRect(0, 20, 20, 20, (SkPath::Direction) 0);
740    path.addRect(0, 20, 12, 30, (SkPath::Direction) 0);
741    path.addRect(12, 32, 21, 36, (SkPath::Direction) 0);
742    testSimplifyx(path);
743}
744
745static void testLine70() {
746    SkPath path;
747    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
748    path.addRect(0, 24, 12, 12, (SkPath::Direction) 0);
749    path.addRect(12, 32, 21, 36, (SkPath::Direction) 1);
750    testSimplifyx(path);
751}
752
753static void testLine71() {
754    SkPath path;
755    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
756    path.addRect(12, 0, 24, 24, (SkPath::Direction) 0);
757    path.addRect(12, 32, 21, 36, (SkPath::Direction) 0);
758    testSimplifyx(path);
759}
760
761static void testLine72() {
762    SkPath path;
763    path.addRect(0, 0, 60, 60, (SkPath::Direction) 0);
764    path.addRect(10, 40, 30, 30, (SkPath::Direction) 0);
765    path.addRect(6, 20, 18, 30, (SkPath::Direction) 0);
766    testSimplifyx(path);
767}
768
769static void testLine73() {
770    SkPath path;
771    path.addRect(0, 0, 60, 60, (SkPath::Direction) 0);
772    path.addRect(0, 40, 20, 20, (SkPath::Direction) 0);
773    path.addRect(0, 20, 12, 30, (SkPath::Direction) 0);
774    path.addRect(0, 0, 9, 9, (SkPath::Direction) 1);
775    testSimplifyx(path);
776}
777
778static void testLine74() {
779    SkPath path;
780    path.addRect(20, 30, 40, 40, (SkPath::Direction) 0);
781    path.addRect(24, 20, 36, 30, (SkPath::Direction) 1);
782    path.addRect(32, 24, 36, 41, (SkPath::Direction) 1);
783    testSimplifyx(path);
784}
785
786static void testLine75() {
787    SkPath path;
788    path.addRect(0, 0, 60, 60, (SkPath::Direction) 0);
789    path.addRect(10, 0, 30, 30, (SkPath::Direction) 1);
790    path.addRect(18, 0, 30, 30, (SkPath::Direction) 1);
791    path.addRect(12, 0, 21, 21, (SkPath::Direction) 1);
792    testSimplifyx(path);
793}
794
795static void testLine76() {
796    SkPath path;
797    path.addRect(36, 0, 66, 60, (SkPath::Direction) 0);
798    path.addRect(10, 20, 40, 30, (SkPath::Direction) 0);
799    path.addRect(24, 20, 36, 30, (SkPath::Direction) 1);
800    path.addRect(32, 6, 36, 41, (SkPath::Direction) 1);
801    testSimplifyx(path);
802}
803
804static void testLine77() {
805    SkPath path;
806    path.addRect(20, 0, 40, 40, (SkPath::Direction) 0);
807    path.addRect(24, 6, 36, 36, (SkPath::Direction) 1);
808    path.addRect(24, 32, 33, 36, (SkPath::Direction) 1);
809    testSimplifyx(path);
810}
811
812static void testLine78() {
813    SkPath path;
814    path.addRect(0, 0, 30, 60, (SkPath::Direction) 0);
815    path.addRect(10, 20, 30, 30, (SkPath::Direction) 1);
816    path.addRect(18, 20, 30, 30, (SkPath::Direction) 1);
817    path.addRect(32, 0, 36, 41, (SkPath::Direction) 1);
818    testSimplifyx(path);
819}
820
821static void testLine79() {
822    SkPath path;
823    path.addRect(0, 36, 60, 30, (SkPath::Direction) 0);
824    path.addRect(10, 30, 40, 30, (SkPath::Direction) 0);
825    path.addRect(0, 20, 12, 30, (SkPath::Direction) 1);
826    path.addRect(0, 32, 9, 36, (SkPath::Direction) 1);
827    testSimplifyx(path);
828}
829
830static void testDegenerate1() {
831    SkPath path;
832    path.moveTo(0, 0);
833    path.lineTo(0, 0);
834    path.lineTo(2, 0);
835    path.close();
836    path.moveTo(0, 0);
837    path.lineTo(1, 0);
838    path.lineTo(2, 0);
839    path.close();
840    testSimplifyx(path);
841}
842
843static void testDegenerate2() {
844    SkPath path;
845    path.moveTo(0, 0);
846    path.lineTo(0, 0);
847    path.lineTo(0, 0);
848    path.close();
849    path.moveTo(0, 0);
850    path.lineTo(1, 0);
851    path.lineTo(0, 1);
852    path.close();
853    testSimplifyx(path);
854}
855
856static void testDegenerate3() {
857    SkPath path;
858    path.moveTo(0, 0);
859    path.lineTo(2, 0);
860    path.lineTo(1, 0);
861    path.close();
862    path.moveTo(0, 0);
863    path.lineTo(0, 0);
864    path.lineTo(3, 0);
865    path.close();
866    testSimplifyx(path);
867}
868
869static void testDegenerate4() {
870    SkPath path;
871    path.moveTo(0, 0);
872    path.lineTo(1, 0);
873    path.lineTo(1, 3);
874    path.close();
875    path.moveTo(1, 0);
876    path.lineTo(1, 1);
877    path.lineTo(1, 2);
878    path.close();
879    testSimplifyx(path);
880}
881
882static void testNondegenerate1() {
883    SkPath path;
884    path.moveTo(0, 0);
885    path.lineTo(3, 0);
886    path.lineTo(1, 3);
887    path.close();
888    path.moveTo(1, 1);
889    path.lineTo(2, 1);
890    path.lineTo(1, 2);
891    path.close();
892    testSimplifyx(path);
893}
894
895static void testNondegenerate2() {
896    SkPath path;
897    path.moveTo(1, 0);
898    path.lineTo(0, 1);
899    path.lineTo(1, 1);
900    path.close();
901    path.moveTo(0, 2);
902    path.lineTo(0, 3);
903    path.lineTo(1, 2);
904    path.close();
905    testSimplifyx(path);
906}
907
908static void testNondegenerate3() {
909    SkPath path;
910    path.moveTo(0, 0);
911    path.lineTo(1, 0);
912    path.lineTo(2, 1);
913    path.close();
914    path.moveTo(0, 1);
915    path.lineTo(1, 1);
916    path.lineTo(0, 2);
917    path.close();
918    testSimplifyx(path);
919}
920
921static void testNondegenerate4() {
922    SkPath path;
923    path.moveTo(1, 0);
924    path.lineTo(0, 1);
925    path.lineTo(1, 2);
926    path.close();
927    path.moveTo(0, 2);
928    path.lineTo(0, 3);
929    path.lineTo(1, 3);
930    path.close();
931    testSimplifyx(path);
932}
933
934static void testQuadralateral5() {
935    SkPath path;
936    path.moveTo(0, 0);
937    path.lineTo(0, 0);
938    path.lineTo(1, 0);
939    path.lineTo(1, 1);
940    path.close();
941    path.moveTo(0, 0);
942    path.lineTo(2, 2);
943    path.lineTo(3, 2);
944    path.lineTo(3, 3);
945    path.close();
946    testSimplifyx(path);
947}
948
949static void testQuadralateral6() {
950    SkPath path;
951    path.moveTo(0, 0);
952    path.lineTo(0, 0);
953    path.lineTo(1, 0);
954    path.lineTo(1, 1);
955    path.close();
956    path.moveTo(1, 0);
957    path.lineTo(2, 0);
958    path.lineTo(0, 2);
959    path.lineTo(2, 2);
960    path.close();
961    testSimplifyx(path);
962}
963
964static void testFauxQuadralateral6() {
965    SkPath path;
966    path.moveTo(0, 0);
967    path.lineTo(1, 0);
968    path.lineTo(1, 1);
969    path.close();
970    path.moveTo(1, 0);
971    path.lineTo(2, 0);
972    path.lineTo(1 + 1.0f/3, 2.0f/3);
973    path.close();
974    path.moveTo(1 + 1.0f/3, 2.0f/3);
975    path.lineTo(0, 2);
976    path.lineTo(2, 2);
977    path.close();
978    testSimplifyx(path);
979}
980
981static void testFauxQuadralateral6a() {
982    SkPath path;
983    path.moveTo(0, 0);
984    path.lineTo(3, 0);
985    path.lineTo(3, 3);
986    path.close();
987    path.moveTo(3, 0);
988    path.lineTo(6, 0);
989    path.lineTo(4, 2);
990    path.close();
991    path.moveTo(4, 2);
992    path.lineTo(0, 6);
993    path.lineTo(6, 6);
994    path.close();
995    testSimplifyx(path);
996}
997
998static void testFauxQuadralateral6b() {
999    SkPath path;
1000    path.moveTo(0, 0);
1001    path.lineTo(3, 0);
1002    path.lineTo(3, 3);
1003    path.close();
1004    path.moveTo(3, 0);
1005    path.lineTo(6, 0);
1006    path.lineTo(4, 2);
1007    path.close();
1008    path.moveTo(4, 2);
1009    path.lineTo(6, 6);
1010    path.lineTo(0, 6);
1011    path.close();
1012    testSimplifyx(path);
1013}
1014
1015static void testFauxQuadralateral6c() {
1016    SkPath path;
1017    path.moveTo(0, 0);
1018    path.lineTo(3, 3);
1019    path.lineTo(3, 0);
1020    path.close();
1021    path.moveTo(3, 0);
1022    path.lineTo(6, 0);
1023    path.lineTo(4, 2);
1024    path.close();
1025    path.moveTo(4, 2);
1026    path.lineTo(0, 6);
1027    path.lineTo(6, 6);
1028    path.close();
1029    testSimplifyx(path);
1030}
1031
1032static void testFauxQuadralateral6d() {
1033    SkPath path;
1034    path.moveTo(0, 0);
1035    path.lineTo(3, 3);
1036    path.lineTo(3, 0);
1037    path.close();
1038    path.moveTo(3, 0);
1039    path.lineTo(6, 0);
1040    path.lineTo(4, 2);
1041    path.close();
1042    path.moveTo(4, 2);
1043    path.lineTo(6, 6);
1044    path.lineTo(0, 6);
1045    path.close();
1046    testSimplifyx(path);
1047}
1048
1049static void testQuadralateral6a() {
1050    SkPath path;
1051    path.moveTo(0, 0);
1052    path.lineTo(0, 0);
1053    path.lineTo(3, 0);
1054    path.lineTo(3, 3);
1055    path.close();
1056    path.moveTo(3, 0);
1057    path.lineTo(6, 0);
1058    path.lineTo(0, 6);
1059    path.lineTo(6, 6);
1060    path.close();
1061    testSimplifyx(path);
1062}
1063
1064static void testQuadralateral7() {
1065    SkPath path;
1066    path.moveTo(0, 0);
1067    path.lineTo(0, 0);
1068    path.lineTo(1, 0);
1069    path.lineTo(2, 1);
1070    path.close();
1071    path.moveTo(1, 0);
1072    path.lineTo(1, 1);
1073    path.lineTo(2, 2);
1074    path.lineTo(1, 3);
1075    path.close();
1076    testSimplifyx(path);
1077}
1078
1079static void testQuadralateral8() {
1080    SkPath path;
1081    path.moveTo(0, 0);
1082    path.lineTo(3, 1);
1083    path.lineTo(1, 3);
1084    path.lineTo(3, 3);
1085    path.close();
1086    path.moveTo(2, 1);
1087    path.lineTo(0, 2);
1088    path.lineTo(3, 2);
1089    path.lineTo(2, 3);
1090    path.close();
1091    testSimplifyx(path);
1092}
1093
1094static void testQuadralateral9() {
1095    SkPath path;
1096    path.moveTo(0, 0);
1097    path.lineTo(1, 0);
1098    path.lineTo(1, 2);
1099    path.lineTo(2, 2);
1100    path.close();
1101    path.moveTo(1, 1);
1102    path.lineTo(2, 1);
1103    path.lineTo(1, 3);
1104    path.lineTo(2, 3);
1105    path.close();
1106    testSimplifyx(path);
1107}
1108
1109static void testLine1x() {
1110    SkPath path;
1111    path.setFillType(SkPath::kEvenOdd_FillType);
1112    path.addRect(0, 0, 12, 12, (SkPath::Direction) 0);
1113    path.addRect(4, 0, 13, 13, (SkPath::Direction) 0);
1114    testSimplifyx(path);
1115}
1116
1117static void testLine2x() {
1118    SkPath path;
1119    path.setFillType(SkPath::kEvenOdd_FillType);
1120    path.addRect(0, 20, 20, 20, (SkPath::Direction) 0);
1121    path.addRect(0, 20, 12, 30, (SkPath::Direction) 0);
1122    path.addRect(12, 0, 21, 21, (SkPath::Direction) 1);
1123    testSimplifyx(path);
1124}
1125
1126static void testLine3x() {
1127    SkPath path;
1128    path.setFillType(SkPath::kEvenOdd_FillType);
1129    path.addRect(10, 30, 30, 30, (SkPath::Direction) 0);
1130    path.addRect(18, 20, 30, 30, (SkPath::Direction) 1);
1131    path.addRect(0, 32, 9, 36, (SkPath::Direction) 1);
1132    testSimplifyx(path);
1133}
1134
1135static void testLine4x() {
1136    SkPath path;
1137    path.setFillType(SkPath::kEvenOdd_FillType);
1138    path.addRect(10, 30, 30, 30, (SkPath::Direction) 0);
1139    path.addRect(24, 20, 36, 30, (SkPath::Direction) 1);
1140    path.addRect(0, 32, 9, 36, (SkPath::Direction) 1);
1141    testSimplifyx(path);
1142}
1143
1144static void testQuadratic1() {
1145    SkPath path;
1146    path.moveTo(0, 0);
1147    path.quadTo(0, 0, 0, 0);
1148    path.lineTo(1, 0);
1149    path.close();
1150    path.moveTo(0, 0);
1151    path.lineTo(0, 0);
1152    path.quadTo(0, 0, 0, 0);
1153    path.close();
1154    testSimplifyx(path);
1155}
1156
1157static void testQuadratic2() {
1158    SkPath path;
1159    path.moveTo(0, 0);
1160    path.quadTo(0, 0, 0, 0);
1161    path.lineTo(3, 0);
1162    path.close();
1163    path.moveTo(0, 0);
1164    path.lineTo(0, 0);
1165    path.quadTo(1, 0, 0, 1);
1166    path.close();
1167    testSimplifyx(path);
1168}
1169
1170static void testQuadratic3() {
1171    SkPath path;
1172    path.moveTo(0, 0);
1173    path.quadTo(0, 0, 1, 0);
1174    path.lineTo(0, 2);
1175    path.close();
1176    path.moveTo(0, 0);
1177    path.lineTo(0, 0);
1178    path.quadTo(1, 0, 0, 1);
1179    path.close();
1180    testSimplifyx(path);
1181}
1182
1183static void (*firstTest)() = testQuadratic3;
1184
1185static struct {
1186    void (*fun)();
1187    const char* str;
1188} tests[] = {
1189    TEST(testQuadratic3),
1190    TEST(testQuadratic2),
1191    TEST(testQuadratic1),
1192    TEST(testLine4x),
1193    TEST(testLine3x),
1194    TEST(testLine2x),
1195    TEST(testLine1x),
1196    TEST(testQuadralateral9),
1197    TEST(testQuadralateral8),
1198    TEST(testQuadralateral7),
1199    TEST(testQuadralateral6),
1200    TEST(testQuadralateral6a),
1201    TEST(testFauxQuadralateral6d),
1202    TEST(testFauxQuadralateral6c),
1203    TEST(testFauxQuadralateral6b),
1204    TEST(testFauxQuadralateral6a),
1205    TEST(testFauxQuadralateral6),
1206    TEST(testQuadralateral5),
1207    TEST(testNondegenerate4),
1208    TEST(testNondegenerate3),
1209    TEST(testNondegenerate2),
1210    TEST(testNondegenerate1),
1211    TEST(testDegenerate4),
1212    TEST(testDegenerate3),
1213    TEST(testDegenerate2),
1214    TEST(testDegenerate1),
1215    TEST(testLine79),
1216    TEST(testLine78),
1217    TEST(testLine77),
1218    TEST(testLine76),
1219    TEST(testLine75),
1220    TEST(testLine74),
1221    TEST(testLine73),
1222    TEST(testLine72),
1223    TEST(testLine71),
1224    TEST(testLine70),
1225    TEST(testLine69),
1226    TEST(testLine68h),
1227    TEST(testLine68g),
1228    TEST(testLine68f),
1229    TEST(testLine68e),
1230    TEST(testLine68d),
1231    TEST(testLine68c),
1232    TEST(testLine68b),
1233    TEST(testLine68a),
1234    TEST(testLine67),
1235    TEST(testLine66),
1236    TEST(testLine65),
1237    TEST(testLine64),
1238    TEST(testLine63),
1239    TEST(testLine62),
1240    TEST(testLine61),
1241    TEST(testLine60),
1242    TEST(testLine59),
1243    TEST(testLine58),
1244    TEST(testLine57),
1245    TEST(testLine56),
1246    TEST(testLine55),
1247    TEST(testLine54),
1248    TEST(testLine53),
1249    TEST(testLine52),
1250    TEST(testLine51),
1251    TEST(testLine50),
1252    TEST(testLine49),
1253    TEST(testLine48),
1254    TEST(testLine47),
1255    TEST(testLine46),
1256    TEST(testLine45),
1257    TEST(testLine44),
1258    TEST(testLine43),
1259    TEST(testLine42),
1260    TEST(testLine41),
1261    TEST(testLine40),
1262    TEST(testLine38),
1263    TEST(testLine37),
1264    TEST(testLine36),
1265    TEST(testLine35),
1266    TEST(testLine34),
1267    TEST(testLine33),
1268    TEST(testLine32),
1269    TEST(testLine31),
1270    TEST(testLine30),
1271    TEST(testLine29),
1272    TEST(testLine28),
1273    TEST(testLine27),
1274    TEST(testLine26),
1275    TEST(testLine25),
1276    TEST(testLine24a),
1277    TEST(testLine24),
1278    TEST(testLine23),
1279    TEST(testLine22),
1280    TEST(testLine21),
1281    TEST(testLine20),
1282    TEST(testLine19),
1283    TEST(testLine18),
1284    TEST(testLine17),
1285    TEST(testLine16),
1286    TEST(testLine15),
1287    TEST(testLine14),
1288    TEST(testLine13),
1289    TEST(testLine12),
1290    TEST(testLine11),
1291    TEST(testLine10a),
1292    TEST(testLine10),
1293    TEST(testLine9),
1294    TEST(testLine8),
1295    TEST(testLine7b),
1296    TEST(testLine7a),
1297    TEST(testLine7),
1298    TEST(testLine6),
1299    TEST(testLine5),
1300    TEST(testLine4),
1301    TEST(testLine3b),
1302    TEST(testLine3a),
1303    TEST(testLine3),
1304    TEST(testLine2),
1305    TEST(testLine1),
1306};
1307
1308static const size_t testCount = sizeof(tests) / sizeof(tests[0]);
1309
1310static struct {
1311    void (*fun)();
1312    const char* str;
1313} subTests[] = {
1314    TEST(testQuadralateral6),
1315    TEST(testQuadralateral6a),
1316    TEST(testFauxQuadralateral6d),
1317    TEST(testFauxQuadralateral6c),
1318    TEST(testFauxQuadralateral6b),
1319    TEST(testFauxQuadralateral6a),
1320    TEST(testFauxQuadralateral6),
1321};
1322
1323static const size_t subTestCount = sizeof(subTests) / sizeof(subTests[0]);
1324
1325static bool skipAll = false;
1326static bool runSubTests = false;
1327
1328void SimplifyNew_Test() {
1329    if (skipAll) {
1330        return;
1331    }
1332#ifdef SK_DEBUG
1333    gDebugMaxWindSum = 4;
1334    gDebugMaxWindValue = 4;
1335    size_t index;
1336#endif
1337    if (runSubTests) {
1338        index = subTestCount - 1;
1339        do {
1340            SkDebugf("  %s [%s]\n", __FUNCTION__, subTests[index].str);
1341            (*subTests[index].fun)();
1342        } while (index--);
1343    }
1344    index = testCount - 1;
1345    if (firstTest) {
1346        while (index > 0 && tests[index].fun != firstTest) {
1347            --index;
1348        }
1349        SkDebugf("  %s [%s]\n", __FUNCTION__, tests[index].str);
1350        (*tests[index].fun)();
1351    }
1352    index = testCount - 1;
1353    bool firstTestComplete = false;
1354    do {
1355        SkDebugf("  %s [%s]\n", __FUNCTION__, tests[index].str);
1356        (*tests[index].fun)();
1357        firstTestComplete = true;
1358    } while (index--);
1359#ifdef SK_DEBUG
1360    gDebugMaxWindSum = SK_MaxS32;
1361    gDebugMaxWindValue = SK_MaxS32;
1362#endif
1363}
1364