blob: 3cc1b5d982e746f258ba75981f24937a7741db7f [file] [log] [blame]
caryclark@google.comcd4421d2012-03-01 19:16:31 +00001#include "EdgeWalker_Test.h"
2#include "Intersection_Tests.h"
3
4static void testSimplifyTriangle() {
5 SkPath path, out;
6 path.setFillType(SkPath::kWinding_FillType);
7 path.moveTo(10,10); // triangle |\ .
8 path.lineTo(10,30); // |_\ .
9 path.lineTo(20,30);
10 path.close();
11 path.moveTo(20,10); // triangle /|
12 path.lineTo(10,30); // /_|
13 path.lineTo(20,30);
14 path.close();
caryclark@google.com2e7f4c82012-03-20 21:11:59 +000015 testSimplify(path, true, out); // expect |\/|
16 // |__|
caryclark@google.comcd4421d2012-03-01 19:16:31 +000017}
18
19static void testSimplifyTriangle3() {
20 SkPath path, out;
21 path.moveTo(0, 0);
22 path.lineTo(1, 0);
23 path.lineTo(0, 1);
24 path.close();
25 path.moveTo(0, 0);
26 path.lineTo(1, 0);
27 path.lineTo(3, 1);
28 path.close();
caryclark@google.com2e7f4c82012-03-20 21:11:59 +000029 testSimplify(path, true, out);
caryclark@google.comcd4421d2012-03-01 19:16:31 +000030}
31
32static void testSimplifyTriangle4() {
33 SkPath path, out;
34 path.moveTo(0, 0);
35 path.lineTo(1, 0);
36 path.lineTo(0, 1);
37 path.close();
38 path.moveTo(0, 0);
39 path.lineTo(1, 0);
40 path.lineTo(2, 1);
41 path.close();
caryclark@google.com2e7f4c82012-03-20 21:11:59 +000042 testSimplify(path, true, out);
caryclark@google.comcd4421d2012-03-01 19:16:31 +000043}
44
45static void testSimplifyTriangle5() {
46 SkPath path, out;
47 path.moveTo(0, 0);
48 path.lineTo(1, 0);
49 path.lineTo(0, 1);
50 path.close();
51 path.moveTo(0, 0);
52 path.lineTo(1, 1);
53 path.lineTo(2, 1);
54 path.close();
caryclark@google.com2e7f4c82012-03-20 21:11:59 +000055 testSimplify(path, true, out);
caryclark@google.comcd4421d2012-03-01 19:16:31 +000056}
57
58static void testSimplifyTriangle6() {
59 SkPath path, out;
60 path.moveTo(0, 0);
61 path.lineTo(1, 0);
62 path.lineTo(0, 1);
63 path.lineTo(0, 0);
64 path.close();
65 path.moveTo(0, 0);
66 path.lineTo(0, 1);
67 path.lineTo(3, 1);
68 path.lineTo(0, 0);
69 path.close();
caryclark@google.com2e7f4c82012-03-20 21:11:59 +000070 testSimplify(path, true, out);
caryclark@google.comcd4421d2012-03-01 19:16:31 +000071}
72
73static void testSimplifyTriangle7() {
74 SkPath path, out;
75 path.moveTo(0, 0);
76 path.lineTo(1, 0);
77 path.lineTo(0, 1);
78 path.lineTo(0, 0);
79 path.close();
80 path.moveTo(0, 0);
81 path.lineTo(1, 1);
82 path.lineTo(0, 2);
83 path.lineTo(0, 0);
84 path.close();
caryclark@google.com2e7f4c82012-03-20 21:11:59 +000085 testSimplify(path, true, out);
caryclark@google.comcd4421d2012-03-01 19:16:31 +000086}
87
88static void testSimplifyTriangle8() {
89 SkPath path, out;
90 path.moveTo(0, 0);
91 path.lineTo(1, 0);
92 path.lineTo(0, 1);
93 path.lineTo(0, 0);
94 path.close();
95 path.moveTo(0, 1);
96 path.lineTo(1, 2);
97 path.lineTo(1, 3);
98 path.lineTo(0, 1);
99 path.close();
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000100 testSimplify(path, true, out);
caryclark@google.comcd4421d2012-03-01 19:16:31 +0000101}
102
103static void testSimplifyTriangle9() {
104 SkPath path, out;
105 path.moveTo(0, 0);
106 path.lineTo(1, 0);
107 path.lineTo(1, 1);
108 path.lineTo(0, 0);
109 path.close();
110 path.moveTo(0, 0);
111 path.lineTo(1, 1);
112 path.lineTo(2, 1);
113 path.lineTo(0, 0);
114 path.close();
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000115 testSimplify(path, true, out);
caryclark@google.comcd4421d2012-03-01 19:16:31 +0000116}
117
118static void testSimplifyTriangle10() {
119 SkPath path, out;
120 path.moveTo(0, 0);
121 path.lineTo(1, 0);
122 path.lineTo(1, 1);
123 path.lineTo(0, 0);
124 path.close();
125 path.moveTo(0, 0);
126 path.lineTo(2, 0);
127 path.lineTo(0, 1);
128 path.lineTo(0, 0);
129 path.close();
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000130 testSimplify(path, true, out);
caryclark@google.comcd4421d2012-03-01 19:16:31 +0000131}
132
133static void testSimplifyTriangle11() {
134 SkPath path, out;
135 path.moveTo(0, 0);
136 path.lineTo(1, 0);
137 path.lineTo(0, 2);
138 path.lineTo(0, 0);
139 path.close();
140 path.moveTo(0, 0);
141 path.lineTo(2, 1);
142 path.lineTo(2, 2);
143 path.lineTo(0, 0);
144 path.close();
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000145 testSimplify(path, true, out);
caryclark@google.comcd4421d2012-03-01 19:16:31 +0000146}
147
148static void testSimplifyTriangle12() {
149 SkPath path, out;
150 path.moveTo(0, 0);
151 path.lineTo(1, 0);
152 path.lineTo(1, 2);
153 path.lineTo(0, 0);
154 path.close();
155 path.moveTo(2, 0);
156 path.lineTo(0, 3);
157 path.lineTo(1, 1);
158 path.lineTo(2, 0);
159 path.close();
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000160 testSimplify(path, true, out);
caryclark@google.comcd4421d2012-03-01 19:16:31 +0000161}
162
163static void testSimplifyTriangle13() {
164 SkPath path, out;
165 path.moveTo(0, 0);
166 path.lineTo(1, 0);
167 path.lineTo(0, 3);
168 path.lineTo(0, 0);
169 path.close();
170 path.moveTo(3, 0);
171 path.lineTo(0, 3);
172 path.lineTo(1, 1);
173 path.lineTo(3, 0);
174 path.close();
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000175 testSimplify(path, true, out);
caryclark@google.comcd4421d2012-03-01 19:16:31 +0000176}
177
178static void testSimplifyTriangle14() {
179 SkPath path, out;
180 path.moveTo(0, 0);
181 path.lineTo(1, 0);
182 path.lineTo(0, 1);
183 path.lineTo(0, 0);
184 path.close();
185 path.moveTo(0, 0);
186 path.lineTo(1, 0);
187 path.lineTo(0, 1);
188 path.lineTo(0, 0);
189 path.close();
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000190 testSimplify(path, true, out);
caryclark@google.comcd4421d2012-03-01 19:16:31 +0000191}
192
193static void testSimplifyTriangle15() {
194 SkPath path, out;
195 path.setFillType(SkPath::kEvenOdd_FillType);
196 path.moveTo(0, 0);
197 path.lineTo(0, 1);
198 path.lineTo(1, 2);
199 path.close();
200 path.moveTo(0, 0);
201 path.lineTo(0, 1);
202 path.lineTo(2, 2);
203 path.close();
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000204 testSimplify(path, true, out);
caryclark@google.comcd4421d2012-03-01 19:16:31 +0000205}
206
207static void testSimplifyTriangle16() {
208 SkPath path, out;
209 path.moveTo(0, 0);
210 path.lineTo(0, 1);
211 path.lineTo(1, 2);
212 path.close();
213 path.moveTo(0, 0);
214 path.lineTo(0, 1);
215 path.lineTo(1, 3);
216 path.close();
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000217 testSimplify(path, true, out);
caryclark@google.comcd4421d2012-03-01 19:16:31 +0000218}
219
220static void testSimplifyTriangle17() {
221 SkPath path, out;
222 path.moveTo(0, 0);
223 path.lineTo(0, 1);
224 path.lineTo(1, 2);
225 path.close();
226 path.moveTo(0, 0);
227 path.lineTo(1, 3);
228 path.lineTo(0, 1);
229 path.close();
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000230 testSimplify(path, true, out);
caryclark@google.comcd4421d2012-03-01 19:16:31 +0000231}
232
caryclark@google.com4917f172012-03-05 22:01:21 +0000233static void testSimplifyTriangle18() {
234 SkPath path, out;
235 path.moveTo(0, 0);
236 path.lineTo(0, 1);
237 path.lineTo(1, 2);
238 path.close();
239 path.moveTo(1, 0);
240 path.lineTo(0, 1);
241 path.lineTo(0, 3);
242 path.close();
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000243 testSimplify(path, true, out);
caryclark@google.com4917f172012-03-05 22:01:21 +0000244}
245
246static void testSimplifyTriangle19() {
247 SkPath path, out;
248 path.setFillType(SkPath::kEvenOdd_FillType);
249 path.moveTo(0, 0);
250 path.lineTo(0, 1);
251 path.lineTo(3, 2);
252 path.close();
253 path.moveTo(0, 0);
254 path.lineTo(1, 1);
255 path.lineTo(2, 1);
256 path.close();
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000257 testSimplify(path, true, out);
caryclark@google.com4917f172012-03-05 22:01:21 +0000258}
259
260static void testSimplifyTriangle20() {
261 SkPath path, out;
262 path.moveTo(0, 0);
263 path.lineTo(2, 1);
264 path.lineTo(1, 3);
265 path.close();
266 path.moveTo(2, 0);
267 path.lineTo(3, 2);
268 path.lineTo(0, 3);
269 path.close();
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000270 testSimplify(path, true, out);
caryclark@google.com4917f172012-03-05 22:01:21 +0000271}
272
273static void testSimplifyTriangle21() {
274 SkPath path, out;
275 path.moveTo(0, 0);
276 path.lineTo(1, 0);
277 path.lineTo(1, 2);
278 path.close();
279 path.moveTo(2, 0);
280 path.lineTo(2, 1);
281 path.lineTo(0, 3);
282 path.close();
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000283 testSimplify(path, true, out);
caryclark@google.com4917f172012-03-05 22:01:21 +0000284}
285
286static void testSimplifyDegenerateTriangle1() {
287 SkPath path, out;
288 path.moveTo(0, 0);
289 path.lineTo(0, 0);
290 path.lineTo(0, 0);
291 path.close();
292 path.moveTo(0, 0);
293 path.lineTo(0, 0);
294 path.lineTo(0, 0);
295 path.close();
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000296 testSimplify(path, true, out);
caryclark@google.com4917f172012-03-05 22:01:21 +0000297}
298
299static void testSimplifyDegenerateTriangle2() {
300 SkPath path, out;
301 path.moveTo(0, 0);
302 path.lineTo(1, 1);
303 path.lineTo(2, 2);
304 path.close();
305 path.moveTo(1, 0);
306 path.lineTo(2, 2);
307 path.lineTo(3, 3);
308 path.close();
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000309 testSimplify(path, true, out);
caryclark@google.com4917f172012-03-05 22:01:21 +0000310}
311
caryclark@google.comcd4421d2012-03-01 19:16:31 +0000312static void testSimplifyWindingParallelogram() {
313 SkPath path, out;
314 path.setFillType(SkPath::kWinding_FillType);
315 path.moveTo(20,10); // parallelogram _
316 path.lineTo(30,30); // \ \ .
317 path.lineTo(40,30); // \_\ .
318 path.lineTo(30,10);
319 path.close();
320 path.moveTo(20,10); // parallelogram _
321 path.lineTo(10,30); // / /
322 path.lineTo(20,30); // /_/
323 path.lineTo(30,10);
324 path.close();
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000325 testSimplify(path, true, out); // expect _
326 // / \ .
327} // /___\ .
caryclark@google.comcd4421d2012-03-01 19:16:31 +0000328
329static void testSimplifyXorParallelogram() {
330 SkPath path, out;
331 path.setFillType(SkPath::kEvenOdd_FillType);
332 path.moveTo(20,10); // parallelogram _
333 path.lineTo(30,30); // \ \ .
334 path.lineTo(40,30); // \_\ .
335 path.lineTo(30,10);
336 path.close();
337 path.moveTo(20,10); // parallelogram _
338 path.lineTo(10,30); // / /
339 path.lineTo(20,30); // /_/
340 path.lineTo(30,10);
341 path.close();
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000342 testSimplify(path, true, out); // expect _
343} // \ /
caryclark@google.comcd4421d2012-03-01 19:16:31 +0000344
345static void testSimplifyTriangle2() {
346 SkPath path, out;
347 path.setFillType(SkPath::kWinding_FillType);
348 path.moveTo(10,10); // triangle |\ .
349 path.lineTo(10,30); // |_\ .
350 path.lineTo(20,30);
351 path.close();
352 path.moveTo(10,10); // triangle _
353 path.lineTo(20,10); // \ |
354 path.lineTo(20,30); // \|
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000355 path.close(); // _
356 testSimplify(path, true, out); // expect | |
357} // |_|
caryclark@google.comcd4421d2012-03-01 19:16:31 +0000358
359static void testSimplifyNondegenerate4x4Triangles() {
360 char pathStr[1024];
361 bzero(pathStr, sizeof(pathStr));
362 for (int a = 0; a < 15; ++a) {
363 int ax = a & 0x03;
364 int ay = a >> 2;
365 for (int b = a + 1; b < 16; ++b) {
366 int bx = b & 0x03;
367 int by = b >> 2;
368 for (int c = a + 1; c < 16; ++c) {
369 if (b == c) {
370 continue;
371 }
372 int cx = c & 0x03;
373 int cy = c >> 2;
374 if ((bx - ax) * (cy - ay) == (by - ay) * (cx - ax)) {
375 continue;
376 }
377 for (int d = 0; d < 15; ++d) {
378 int dx = d & 0x03;
379 int dy = d >> 2;
380 for (int e = d + 1; e < 16; ++e) {
381 int ex = e & 0x03;
382 int ey = e >> 2;
383 for (int f = d + 1; f < 16; ++f) {
384 if (e == f) {
385 continue;
386 }
387 int fx = f & 0x03;
388 int fy = f >> 2;
389 if ((ex - dx) * (fy - dy) == (ey - dy) * (fx - dx)) {
390 continue;
391 }
392 SkPath path, out;
393 path.setFillType(SkPath::kWinding_FillType);
394 path.moveTo(ax, ay);
395 path.lineTo(bx, by);
396 path.lineTo(cx, cy);
397 path.close();
398 path.moveTo(dx, dy);
399 path.lineTo(ex, ey);
400 path.lineTo(fx, fy);
401 path.close();
402 if (1) {
403 char* str = pathStr;
404 str += sprintf(str, " path.moveTo(%d, %d);\n", ax, ay);
405 str += sprintf(str, " path.lineTo(%d, %d);\n", bx, by);
406 str += sprintf(str, " path.lineTo(%d, %d);\n", cx, cy);
407 str += sprintf(str, " path.close();\n");
408 str += sprintf(str, " path.moveTo(%d, %d);\n", dx, dy);
409 str += sprintf(str, " path.lineTo(%d, %d);\n", ex, ey);
410 str += sprintf(str, " path.lineTo(%d, %d);\n", fx, fy);
411 str += sprintf(str, " path.close();");
412 }
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000413 testSimplify(path, true, out);
caryclark@google.comcd4421d2012-03-01 19:16:31 +0000414 path.setFillType(SkPath::kEvenOdd_FillType);
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000415 testSimplify(path, true, out);
caryclark@google.comcd4421d2012-03-01 19:16:31 +0000416 }
417 }
418 }
419 }
420 }
421 }
422}
423
caryclark@google.com4917f172012-03-05 22:01:21 +0000424static void testSimplifyDegenerate4x4Triangles() {
425 char pathStr[1024];
426 bzero(pathStr, sizeof(pathStr));
427 for (int a = 0; a < 16; ++a) {
428 int ax = a & 0x03;
429 int ay = a >> 2;
430 for (int b = a ; b < 16; ++b) {
431 int bx = b & 0x03;
432 int by = b >> 2;
433 for (int c = a ; c < 16; ++c) {
434 int cx = c & 0x03;
435 int cy = c >> 2;
436 bool abcIsATriangle = (bx - ax) * (cy - ay)
437 != (by - ay) * (cx - ax);
438 for (int d = 0; d < 16; ++d) {
439 int dx = d & 0x03;
440 int dy = d >> 2;
441 for (int e = d ; e < 16; ++e) {
442 int ex = e & 0x03;
443 int ey = e >> 2;
444 for (int f = d ; f < 16; ++f) {
445 int fx = f & 0x03;
446 int fy = f >> 2;
447 if (abcIsATriangle && (ex - dx) * (fy - dy)
448 != (ey - dy) * (fx - dx)) {
449 continue;
450 }
451 SkPath path, out;
452 path.setFillType(SkPath::kWinding_FillType);
453 path.moveTo(ax, ay);
454 path.lineTo(bx, by);
455 path.lineTo(cx, cy);
456 path.close();
457 path.moveTo(dx, dy);
458 path.lineTo(ex, ey);
459 path.lineTo(fx, fy);
460 path.close();
461 if (1) {
462 char* str = pathStr;
463 str += sprintf(str, " path.moveTo(%d, %d);\n", ax, ay);
464 str += sprintf(str, " path.lineTo(%d, %d);\n", bx, by);
465 str += sprintf(str, " path.lineTo(%d, %d);\n", cx, cy);
466 str += sprintf(str, " path.close();\n");
467 str += sprintf(str, " path.moveTo(%d, %d);\n", dx, dy);
468 str += sprintf(str, " path.lineTo(%d, %d);\n", ex, ey);
469 str += sprintf(str, " path.lineTo(%d, %d);\n", fx, fy);
470 str += sprintf(str, " path.close();");
471 }
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000472 testSimplify(path, true, out);
caryclark@google.com4917f172012-03-05 22:01:21 +0000473 path.setFillType(SkPath::kEvenOdd_FillType);
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000474 testSimplify(path, true, out);
caryclark@google.com4917f172012-03-05 22:01:21 +0000475 }
476 }
477 }
478 }
479 }
480 }
481}
482
caryclark@google.comcd4421d2012-03-01 19:16:31 +0000483static void testPathTriangleRendering() {
484 SkPath one, two;
485 one.moveTo(0, 0);
486 one.lineTo(3, 3);
487 one.lineTo(0, 3);
488 one.lineTo(1, 2);
489 one.close();
490 for (float x = .1f; x <= 2.9f; x += .1f) {
491 SkDebugf("%s x=%g\n", __FUNCTION__, x);
492 two.moveTo(0, 0);
493 two.lineTo(x, x);
494 two.lineTo(3, 3);
495 two.lineTo(0, 3);
496 two.lineTo(1, 2);
497 two.close();
498 comparePaths(one, two);
499 two.reset();
500 }
501}
502
caryclark@google.com752b60e2012-03-22 21:11:17 +0000503static void simplify(const char* functionName, const SkPath& path,
504 bool fill, SkPath& out) {
505 SkDebugf("%s\n", functionName);
506 simplify(path, fill, out);
507}
508
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000509static void testSimplifySkinnyTriangle1() {
510 for (int x = 1; x < 255; ++x) {
511 SkPath path, out;
512 path.moveTo((x * 101) % 10, 0);
513 path.lineTo((x * 91) % 10, 1000);
514 path.lineTo((x * 71) % 10, 2000);
515 path.lineTo((x * 51) % 10, 3000);
516 path.close();
517 path.moveTo((x * 101) % 20, 0);
518 path.lineTo((x * 91) % 20, 1000);
519 path.lineTo((x * 71) % 20, 2000);
520 path.lineTo((x * 51) % 20, 3000);
521 path.close();
522 path.moveTo((x * 101) % 30, 0);
523 path.lineTo((x * 91) % 30, 1000);
524 path.lineTo((x * 71) % 30, 2000);
525 path.lineTo((x * 51) % 30, 3000);
526 path.close();
caryclark@google.com752b60e2012-03-22 21:11:17 +0000527 simplify(path, true, out);
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000528 }
529}
530
531static void testSimplifySkinnyTriangle2() {
532 SkPath path, out;
533#if 01
534path.moveTo(591.091064, 627.534851);
535path.lineTo(541.088135, 560.707642);
536path.lineTo(491.085175, 493.880310);
537path.lineTo(441.082214, 427.053101);
538//path.lineTo(591.091064, 627.534851);
539path.close();
540#endif
541path.moveTo(317.093445, 592.013306);
542path.lineTo(366.316162, 542.986572);
543path.lineTo(416.051514, 486.978577);
544path.lineTo(465.786865, 430.970581);
545//path.lineTo(317.093445, 592.013306);
546path.close();
547#if 0
548path.moveTo(289.392517, 517.138489);
549path.lineTo(249.886078, 508.598022);
550path.lineTo(217.110916, 450.916443);
551path.lineTo(196.621033, 394.917633);
552//path.lineTo(289.392517, 517.138489);
553path.close();
554#endif
caryclark@google.com752b60e2012-03-22 21:11:17 +0000555 simplify(__FUNCTION__, path, true, out);
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000556}
557
558static void testSimplifySkinnyTriangle3() {
559 SkPath path, out;
560 path.moveTo(591, 627.534851);
561 path.lineTo(541, 560.707642);
562 path.lineTo(491, 493.880310);
563 path.lineTo(441, 427.053101);
564 path.close();
565 path.moveTo(317, 592.013306);
566 path.lineTo(366, 542.986572);
567 path.lineTo(416, 486.978577);
568 path.lineTo(465, 430.970581);
569 path.close();
caryclark@google.com752b60e2012-03-22 21:11:17 +0000570 simplify(__FUNCTION__, path, true, out);
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000571}
572
573static void testSimplifySkinnyTriangle4() {
574 SkPath path, out;
575path.moveTo(572.655212, 614.959961);
576path.lineTo(524.618896, 549.339600);
577path.lineTo(476.582581, 483.719269);
578path.lineTo(428.546265, 418.098938);
579path.lineTo(572.655212, 614.959961);
580path.close();
581path.moveTo(312.166382, 583.723083);
582path.lineTo(361.047791, 529.824219);
583path.lineTo(409.929230, 475.925354);
584path.lineTo(458.810669, 422.026520);
585path.lineTo(312.166382, 583.723083);
586path.close();
587path.moveTo(278.742737, 508.065643);
588path.lineTo(241.475800, 493.465118);
589path.lineTo(210.344177, 437.315125);
590path.lineTo(197.019455, 383.794556);
591path.lineTo(278.742737, 508.065643);
592path.close();
caryclark@google.com752b60e2012-03-22 21:11:17 +0000593 simplify(__FUNCTION__, path, true, out);
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000594}
595
596static void testSimplifySkinnyTriangle5() {
597 SkPath path, out;
598path.moveTo(554.690613, 602.286072);
599path.lineTo(508.590057, 537.906250);
600path.lineTo(462.489441, 473.526520);
601path.lineTo(416.388855, 409.146729);
602path.lineTo(554.690613, 602.286072);
603path.close();
604path.moveTo(307.216949, 575.189270);
605path.lineTo(355.826965, 516.804688);
606path.lineTo(403.815918, 464.990753);
607path.lineTo(451.804871, 413.176819);
608path.lineTo(307.216949, 575.189270);
609path.close();
610path.moveTo(271.998901, 521.301025);
611path.lineTo(234.619705, 499.687683);
612path.lineTo(203.059692, 441.332336);
613path.lineTo(195.994370, 386.856506);
614path.lineTo(271.998901, 521.301025);
615path.close();
caryclark@google.com752b60e2012-03-22 21:11:17 +0000616 simplify(__FUNCTION__, path, true, out);
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000617}
618
caryclark@google.com752b60e2012-03-22 21:11:17 +0000619static void testSimplifySkinnyTriangle6() {
620 SkPath path, out;
621path.moveTo(591.091064, 627.534851);
622path.lineTo(541.088135, 560.707642);
623path.lineTo(491.085175, 493.880310);
624path.lineTo(441.082214, 427.053101);
625path.lineTo(591.091064, 627.534851);
626path.close();
627path.moveTo(317.093445, 592.013306);
628path.lineTo(366.316162, 542.986572);
629path.lineTo(416.051514, 486.978577);
630path.lineTo(465.786865, 430.970581);
631path.lineTo(317.093445, 592.013306);
632path.close();
633path.moveTo(289.392517, 517.138489);
634path.lineTo(249.886078, 508.598022);
635path.lineTo(217.110916, 450.916443);
636path.lineTo(196.621033, 394.917633);
637path.lineTo(289.392517, 517.138489);
638path.close();
639 simplify(__FUNCTION__, path, true, out);
640}
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000641
642static void testSimplifyTriangle22() {
643 SkPath path, out;
644 path.moveTo(0, 0);
645 path.lineTo(1, 0);
646 path.lineTo(0, 2);
647 path.close();
648 path.moveTo(1, 0);
649 path.lineTo(0, 2);
650 path.lineTo(0, 1);
651 path.close();
652 testSimplify(path, true, out);
653}
654
655static void testSimplifyTriangle23() {
656 SkPath path, out;
657 path.moveTo(0, 0);
658 path.lineTo(0, 0);
659 path.lineTo(0, 0);
660 path.close();
661 path.moveTo(0, 0);
662 path.lineTo(0, 1);
663 path.lineTo(1, 2);
664 path.close();
665 testSimplify(path, true, out);
666}
667
668static void testSimplifyTriangle24() {
669 SkPath path, out;
670 path.moveTo(0, 0);
671 path.lineTo(0, 0);
672 path.lineTo(0, 1);
673 path.close();
674 path.moveTo(0, 0);
675 path.lineTo(1, 0);
676 path.lineTo(0, 1);
677 path.close();
678 testSimplify(path, true, out);
679}
680
caryclark@google.com752b60e2012-03-22 21:11:17 +0000681static void testSimplifySkinnyTriangle7() {
682 SkPath path, out;
683path.moveTo(487.502319, 550.811279);
684path.lineTo(448.826050, 491.720123);
685path.lineTo(410.149780, 432.628967);
686path.lineTo(371.473572, 373.537781);
687path.lineTo(487.502319, 550.811279);
688path.close();
689path.moveTo(295.817108, 532.655579);
690path.lineTo(342.896271, 485.912292);
691path.lineTo(389.975433, 439.169006);
692path.lineTo(437.054596, 392.425781);
693path.lineTo(295.817108, 532.655579);
694path.close();
695path.moveTo(239.726822, 575.025269);
696path.lineTo(204.117569, 521.429688);
697path.lineTo(171.275452, 454.110382);
698path.lineTo(193.328583, 397.859497);
699path.lineTo(239.726822, 575.025269);
700path.close();
701 simplify(__FUNCTION__, path, true, out);
702}
703
704static void testSimplifySkinnyTriangle8() {
705 SkPath path, out;
706path.moveTo(441.943115, 511.678040);
707path.lineTo(408.487549, 456.880920);
708path.lineTo(375.031952, 402.083801);
709path.lineTo(341.576385, 347.286682);
710path.lineTo(441.943115, 511.678040);
711path.close();
712path.moveTo(297.548492, 557.246704);
713path.lineTo(350.768494, 507.627014);
714path.lineTo(403.988525, 458.007385);
715path.lineTo(457.208527, 408.387695);
716path.lineTo(297.548492, 557.246704);
717path.close();
718path.moveTo(209.857895, 615.802979);
719path.lineTo(178.249481, 534.230347);
720path.lineTo(144.905640, 460.056824);
721path.lineTo(192.953125, 404.972900);
722path.lineTo(209.857895, 615.802979);
723path.close();
724 simplify(__FUNCTION__, path, true, out);
725}
726
727static void testSimplifySkinnyTriangle9() {
728 SkPath path, out;
729path.moveTo(439.867065, 528.291931);
730path.lineTo(405.413025, 469.107178);
731path.lineTo(370.958954, 409.922363);
732path.lineTo(336.504883, 350.737610);
733path.lineTo(439.867065, 528.291931);
734path.close();
735path.moveTo(298.922455, 573.251953);
736path.lineTo(356.360962, 521.905090);
737path.lineTo(413.799438, 470.558228);
738path.lineTo(471.237915, 419.211365);
739path.lineTo(298.922455, 573.251953);
740path.close();
741path.moveTo(187.200775, 643.035156);
742path.lineTo(159.713165, 540.993774);
743path.lineTo(126.257164, 462.198517);
744path.lineTo(193.534012, 409.266235);
745path.lineTo(187.200775, 643.035156);
746path.close();
747path.close();
748 simplify(__FUNCTION__, path, true, out);
749}
750
751static void testSimplifySkinnyTriangle10() {
752 SkPath path, out;
753#if 0
754path.moveTo(99.270325, 239.365234);
755path.lineTo(105.967056, 173.361206);
756path.lineTo(148.821381, 141.309891);
757path.lineTo(159.101013, 189.235138);
758path.lineTo(99.270325, 239.365234);
759path.close();
760#endif
761path.moveTo(213.673737, 413.292938);
762path.lineTo(225.200134, 343.616821);
763path.lineTo(236.726532, 273.940704);
764path.lineTo(219.386414, 231.373322);
765path.lineTo(213.673737, 413.292938);
766path.close();
767path.moveTo(43.485352, 308.984497);
768path.lineTo(122.610657, 305.950134);
769path.lineTo(201.735962, 302.915802);
770path.lineTo(280.861267, 299.881470);
771path.lineTo(43.485352, 308.984497);
772path.close();
773 simplify(__FUNCTION__, path, true, out);
774}
775
caryclark@google.comcd4421d2012-03-01 19:16:31 +0000776static void (*simplifyTests[])() = {
caryclark@google.com752b60e2012-03-22 21:11:17 +0000777 testSimplifySkinnyTriangle10,
778 testSimplifySkinnyTriangle9,
779 testSimplifySkinnyTriangle8,
780 testSimplifySkinnyTriangle7,
781 testSimplifySkinnyTriangle6,
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000782 testSimplifySkinnyTriangle5,
783 testSimplifySkinnyTriangle4,
784 testSimplifySkinnyTriangle3,
785 testSimplifySkinnyTriangle2,
786 testSimplifySkinnyTriangle1,
787 testSimplifyTriangle24,
788 testSimplifyTriangle23,
789 testSimplifyTriangle22,
caryclark@google.com4917f172012-03-05 22:01:21 +0000790 testSimplifyDegenerateTriangle2,
791 testSimplifyDegenerateTriangle1,
792 testSimplifyTriangle21,
793 testSimplifyTriangle20,
794 testSimplifyTriangle19,
795 testSimplifyTriangle18,
caryclark@google.comcd4421d2012-03-01 19:16:31 +0000796 testSimplifyTriangle17,
797 testSimplifyTriangle16,
798 testSimplifyTriangle15,
799 testSimplifyTriangle14,
800 testSimplifyTriangle13,
801 testSimplifyTriangle12,
802 testSimplifyTriangle11,
803 testSimplifyTriangle10,
804 testSimplifyTriangle7,
805 testSimplifyTriangle9,
806 testSimplifyTriangle8,
807 testSimplifyTriangle6,
808 testSimplifyTriangle5,
809 testSimplifyTriangle4,
810 testSimplifyTriangle3,
811 testSimplifyTriangle,
812 testSimplifyTriangle2,
813 testSimplifyWindingParallelogram,
814 testSimplifyXorParallelogram,
caryclark@google.com4917f172012-03-05 22:01:21 +0000815 testSimplifyDegenerate4x4Triangles,
caryclark@google.comcd4421d2012-03-01 19:16:31 +0000816 testSimplifyNondegenerate4x4Triangles,
817 testPathTriangleRendering,
818};
819
820static size_t simplifyTestsCount = sizeof(simplifyTests) / sizeof(simplifyTests[0]);
821
caryclark@google.com752b60e2012-03-22 21:11:17 +0000822static void (*firstTest)() = 0;
caryclark@google.comcd4421d2012-03-01 19:16:31 +0000823
824void SimplifyPolygonPaths_Test() {
825 size_t index = 0;
826 if (firstTest) {
827 while (index < simplifyTestsCount && simplifyTests[index] != firstTest) {
828 ++index;
829 }
830 }
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000831 bool firstTestComplete = false;
caryclark@google.comcd4421d2012-03-01 19:16:31 +0000832 for ( ; index < simplifyTestsCount; ++index) {
833 (*simplifyTests[index])();
caryclark@google.com752b60e2012-03-22 21:11:17 +0000834 if (simplifyTests[index] == testSimplifySkinnyTriangle2) {
835 SkDebugf("%s last fast skinny test\n", __FUNCTION__);
836 }
caryclark@google.com2e7f4c82012-03-20 21:11:59 +0000837 firstTestComplete = true;
caryclark@google.comcd4421d2012-03-01 19:16:31 +0000838 }
839}
840