op.htm revision 0c803d048c826fadfeed51207488867e17e0cc10
1<html>
2<head>
3<div style="height:0">
4
5<div id="testSimplifyQuadratic1">
6    SkPath path, out;
7    path.moveTo(0, 0);
8    path.quadTo(1, 0, 1, 1);
9    path.close();
10    path.moveTo(1, 0);
11    path.quadTo(0, 0, 0, 1);
12    path.close();
13    testSimplify(path, true, out, bitmap);
14}
15</div>
16
17<div id="testSimplifyQuadratic2">
18    SkPath path, out;
19    path.moveTo(0, 0);
20    path.quadTo(20, 0, 20, 20);
21    path.close();
22    path.moveTo(20, 0);
23    path.quadTo(0, 0, 0, 20);
24    path.close();
25    testSimplify(path, true, out, bitmap);
26}
27</div>
28
29<div id="testSimplifyQuadratic3">
30    SkPath path, out;
31    path.moveTo(0, 0);
32    path.quadTo(20, 0, 20, 20);
33    path.close();
34    path.moveTo(0, 20);
35    path.quadTo(0, 0, 20, 0);
36    path.close();
37    testSimplify(path, true, out, bitmap);
38}
39</div>
40
41<div id="testSimplifyQuadratic4">
42    SkPath path, out;
43    path.moveTo(0, 20);
44    path.quadTo(20, 0, 40, 20);
45    path.close();
46    path.moveTo(40, 10);
47    path.quadTo(20, 30, 0, 10);
48    path.close();
49    testSimplify(path, true, out, bitmap);
50    drawAsciiPaths(path, out, true);
51}
52</div>
53
54<div id="testSimplifyQuadratic5">
55    SkPath path, out;
56    path.moveTo(0, 0);
57    path.quadTo(0, 0, 0, 0);
58    path.lineTo(0, 0);
59    path.close();
60    path.moveTo(0, 0);
61    path.lineTo(0, 0);
62    path.quadTo(0, 0, 0, 1);
63    path.close();
64    testSimplify(path, true, out, bitmap);
65    drawAsciiPaths(path, out, true);
66}
67</div>
68
69<div id="testSimplifyQuadratic6">
70    SkPath path, out;
71    path.moveTo(0, 0);
72    path.quadTo(0, 0, 0, 0);
73    path.lineTo(1, 0);
74    path.close();
75    path.moveTo(0, 0);
76    path.lineTo(0, 0);
77    path.quadTo(1, 0, 0, 1);
78    path.close();
79    testSimplify(path, true, out, bitmap);
80    drawAsciiPaths(path, out, true);
81}
82</div>
83
84<div id="testSimplifyQuadratic7">
85    SkPath path, out;
86    path.moveTo(0, 0);
87    path.quadTo(0, 0, 0, 0);
88    path.lineTo(0, 1);
89    path.close();
90    path.moveTo(0, 0);
91    path.lineTo(0, 0);
92    path.quadTo(1, 0, 0, 2);
93    path.close();
94    testSimplify(path, true, out, bitmap);
95    drawAsciiPaths(path, out, true);
96}
97</div>
98
99<div id="testSimplifyQuadratic8">
100    SkPath path, out;
101    path.moveTo(0, 0);
102    path.quadTo(0, 0, 0, 0);
103    path.lineTo(0, 0);
104    path.close();
105    path.moveTo(0, 0);
106    path.lineTo(0, 0);
107    path.quadTo(1, 0, 0, 2);
108    path.close();
109    testSimplify(path, true, out, bitmap);
110    drawAsciiPaths(path, out, true);
111}
112</div>
113
114<div id="testSimplifyQuadratic9">
115    SkPath path, out;
116    path.moveTo(0, 0);
117    path.quadTo(0, 0, 0, 0);
118    path.lineTo(1, 1);
119    path.close();
120    path.moveTo(0, 0);
121    path.lineTo(0, 0);
122    path.quadTo(1, 0, 2, 2);
123    path.close();
124    testSimplify(path, true, out, bitmap);
125    drawAsciiPaths(path, out, true);
126}
127</div>
128
129<div id="testSimplifyQuadratic10">
130    SkPath path, out;
131    path.moveTo(0, 0);
132    path.quadTo(0, 0, 0, 0);
133    path.lineTo(0, 0);
134    path.close();
135    path.moveTo(0, 0);
136    path.lineTo(0, 1);
137    path.quadTo(1, 1, 1, 2);
138    path.close();
139    testSimplify(path, true, out, bitmap);
140    drawAsciiPaths(path, out, true);
141}
142</div>
143
144<div id="testSimplifyQuadratic11">
145    SkPath path, out;
146    path.moveTo(0, 0);
147    path.quadTo(0, 0, 0, 0);
148    path.lineTo(0, 2);
149    path.close();
150    path.moveTo(0, 0);
151    path.lineTo(2, 1);
152    path.quadTo(2, 2, 3, 3);
153    path.close();
154    testSimplify(path, true, out, bitmap);
155    drawAsciiPaths(path, out, true);
156}
157</div>
158
159<div id="testSimplifyQuadratic12">
160    SkPath path, out;
161    path.moveTo(0, 0);
162    path.lineTo(0, 2);
163    path.lineTo(0, 0);
164    path.close();
165    path.moveTo(3, 0);
166    path.quadTo(1, 1, 0, 2);
167    path.lineTo(3, 0);
168    path.close();
169    testSimplify(path, true, out, bitmap);
170    drawAsciiPaths(path, out, true);
171}
172</div>
173
174<div id="testSimplifyQuadratic13">
175    SkPath path, out;
176path.moveTo(0, 0);
177path.quadTo(0, 0, 1, 0);
178path.lineTo(1, 1);
179path.lineTo(0, 0);
180path.close();
181path.moveTo(0, 0);
182path.quadTo(3, 0, 1, 1);
183path.lineTo(0, 0);
184path.close();
185    testSimplify(path, true, out, bitmap);
186    drawAsciiPaths(path, out, true);
187}
188</div>
189
190<div id="testSimplifyQuadratic14">
191    SkPath path, out;
192    path.moveTo(0, 0);
193    path.quadTo(0, 0, 0, 0);
194    path.lineTo(1, 1);
195    path.close();
196    path.moveTo(0, 0);
197    path.lineTo(0, 0);
198    path.quadTo(0, 1, 2, 1);
199    path.close();
200    testSimplify(path, true, out, bitmap);
201    drawAsciiPaths(path, out, true);
202}
203</div>
204
205<div id="testSimplifyQuadratic15">
206    SkPath path, out;
207    path.moveTo(0, 0);
208    path.quadTo(0, 0, 1, 3);
209    path.lineTo(3, 3);
210    path.close();
211    path.moveTo(0, 1);
212    path.lineTo(1, 1);
213    path.quadTo(0, 3, 3, 3);
214    path.close();
215    testSimplify(path, true, out, bitmap);
216    drawAsciiPaths(path, out, true);
217}
218</div>
219
220<div id="testSimplifyQuadratic16">
221    SkPath path, out;
222    path.moveTo(0, 0);
223    path.quadTo(0, 0, 0, 0);
224    path.lineTo(0, 1);
225    path.close();
226    path.moveTo(0, 0);
227    path.lineTo(0, 0);
228    path.quadTo(1, 0, 0, 1);
229    path.close();
230    testSimplify(path, true, out, bitmap);
231    drawAsciiPaths(path, out, true);
232}
233</div>
234
235<div id="testSimplifyQuadratic17">
236    SkPath path, out;
237    path.moveTo(8, 8);
238    path.quadTo(10, 10, 8, -10);
239    path.close();
240    path.moveTo(8, 8);
241    path.quadTo(12, 12, 14, 4);
242    path.close();
243    path.moveTo(8, 8);
244    path.quadTo(9, 9, 10, 8);
245    path.close();
246    testSimplify(path, true, out, bitmap);
247    drawAsciiPaths(path, out, true);
248}
249</div>
250
251<div id="testSimplifyQuadratic18">
252    SkPath path, out;
253    path.moveTo(8.0000000000000071, 8.0000000000000071);
254    path.quadTo(8.7289570079366854, 8.7289570079366889, 9.3914917259458743, 9.0593802763083691);
255    path.close();
256    path.moveTo(8.0000000000000142, 8.0000000000000142);
257    path.quadTo(8.1250000000000107, 8.1250000000000071, 8.2500000000000071, 8.2187500000000053);
258    path.close();
259    testSimplify(path, true, out, bitmap);
260    drawAsciiPaths(path, out, true);
261</div>
262
263<div id="testSimplifyQuadratic19">
264    SkPath path, simple;
265    path.moveTo(0,4);
266    path.lineTo(6,4);
267    path.lineTo(3,1);
268    path.close();
269    path.moveTo(2,3);
270    path.lineTo(3,2);
271    path.lineTo(4,3);
272    path.close();
273    testSimplifyx(path);
274</div>
275
276<div id="testSimplifyQuadratic20">
277    SkPath path, simple;
278    path.moveTo(0,4);
279    path.lineTo(6,4);
280    path.lineTo(3,1);
281    path.close();
282    path.moveTo(2,3);
283    path.lineTo(4,3);
284    path.lineTo(3,2);
285    path.close();
286    testSimplifyx(path);
287</div>
288
289<div id="testSimplifyQuadratic21">
290    SkPath path, simple;
291    path.moveTo(0,4);
292    path.lineTo(8,4);
293    path.lineTo(4,0);
294    path.close();
295    path.moveTo(2,2);
296    path.lineTo(3,3);
297    path.lineTo(4,2);
298    path.close();
299    testSimplifyx(path);
300</div>
301
302<div id="testLine6">
303    SkPath path, simple;
304    path.moveTo(0,0);
305    path.lineTo(4,0);
306    path.lineTo(2,2);
307    path.close();
308    path.moveTo(2,0);
309    path.lineTo(6,0);
310    path.lineTo(4,2);
311    path.close();
312    testSimplifyx(path);
313</div>
314
315<div id="testLine7">
316    SkPath path, simple;
317    path.moveTo(0,0);
318    path.lineTo(4,0);
319    path.lineTo(2,2);
320    path.close();
321    path.moveTo(6,0);
322    path.lineTo(2,0);
323    path.lineTo(4,2);
324    path.close();
325    testSimplifyx(path);
326</div>
327
328<div id="testLine7b">
329    path.moveTo(0,0);
330    path.lineTo(4,0);
331    path.close();
332    path.moveTo(6,0);
333    path.lineTo(2,0);
334    path.lineTo(4,2);
335    path.close();
336</div>
337
338<div id="testLine9">
339    SkPath path, simple;
340    path.moveTo(0,4);
341    path.lineTo(4,4);
342    path.lineTo(2,2);
343    path.close();
344    path.moveTo(6,4);
345    path.lineTo(2,4);
346    path.lineTo(4,2);
347    path.close();
348    testSimplifyx(path);
349</div>
350
351<div id="testLine12">
352    path.moveTo(0,4);
353    path.lineTo(6,4);
354    path.lineTo(3,1);
355    path.close();
356    path.moveTo(2,3);
357    path.lineTo(3,2);
358    path.lineTo(4,3);
359    path.close();
360</div>
361
362<div id="testLine13">
363    path.moveTo(6,4);
364    path.lineTo(0,4);
365    path.lineTo(3,1);
366    path.close();
367    path.moveTo(3,2);
368    path.lineTo(2,3);
369    path.lineTo(4,3);
370    path.close();
371</div>
372
373<div id="testLine17">
374    SkPath path, simple;
375    path.addRect(0, 0, 12, 12, (SkPath::Direction) 0);
376    path.addRect(4, 12, 13, 13, (SkPath::Direction) 0);
377    testSimplifyx(path);
378</div>
379
380<div id="testLine19">
381    SkPath path, simple;
382    path.addRect(0, 0, 12, 12, (SkPath::Direction) 0);
383    path.addRect(12, 16, 21, 21, (SkPath::Direction) 0);    
384    testSimplifyx(path);
385</div>
386
387<div id="testLine22">
388    path.addRect(0, 12, 12, 12, (SkPath::Direction) 0);
389    path.addRect(4, 12, 13, 13, (SkPath::Direction) 0);
390</div>
391
392<div id="testLine24">
393    path.addRect(0, 18, 12, 12, (SkPath::Direction) 0);
394    path.addRect(4, 12, 13, 13, (SkPath::Direction) 0);
395</div>
396
397<div id="testLine28">
398    SkPath path, simple;
399    path.addRect(0, 6, 12, 12, (SkPath::Direction) 0);
400    path.addRect(0, 0, 9, 9, (SkPath::Direction) 0);
401    testSimplifyx(path);
402</div>
403
404<div id="testLine29">
405    SkPath path, simple;
406    path.addRect(0, 18, 12, 12, (SkPath::Direction) 0);
407    path.addRect(12, 12, 21, 21, (SkPath::Direction) 0);
408    testSimplifyx(path);
409</div>
410
411<div id="testLine30">
412    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
413    path.addRect(0, 0, 12, 12, (SkPath::Direction) 0);
414    path.addRect(4, 4, 13, 13, (SkPath::Direction) 0);
415</div>
416
417<div id="testLine31">
418    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
419    path.addRect(0, 0, 12, 12, (SkPath::Direction) 0);
420    path.addRect(0, 4, 9, 9, (SkPath::Direction) 0);
421</div>
422
423<div id="testLine32">
424    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
425    path.addRect(0, 0, 12, 12, (SkPath::Direction) 0);
426    path.addRect(4, 12, 13, 13, (SkPath::Direction) 0);
427</div>
428
429<div id="testLine33">
430    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
431    path.addRect(0, 0, 12, 12, (SkPath::Direction) 0);
432    path.addRect(4, 16, 13, 13, (SkPath::Direction) 0);
433</div>
434
435<div id="testLine34">
436    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
437    path.addRect(0, 6, 12, 12, (SkPath::Direction) 0);
438    path.addRect(4, 12, 13, 13, (SkPath::Direction) 0);
439</div>
440
441<div id="testLine35">
442    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
443    path.addRect(6, 0, 18, 18, (SkPath::Direction) 0);
444    path.addRect(4, 16, 13, 13, (SkPath::Direction) 0);
445</div>
446
447<div id="testLine36">
448    path.addRect(0, 10, 20, 20, (SkPath::Direction) 0);
449    path.addRect(6, 12, 18, 18, (SkPath::Direction) 0);
450    path.addRect(4, 16, 13, 13, (SkPath::Direction) 0);
451</div>
452
453<div id="testLine37">
454    path.addRect(0, 20, 20, 20, (SkPath::Direction) 0);
455    path.addRect(18, 24, 30, 30, (SkPath::Direction) 0);
456    path.addRect(0, 0, 9, 9, (SkPath::Direction) 0);
457</div>
458
459<div id="testLine38">
460    path.addRect(10, 0, 30, 30, (SkPath::Direction) 0);
461    path.addRect(6, 12, 18, 18, (SkPath::Direction) 0);
462    path.addRect(12, 12, 21, 21, (SkPath::Direction) 0);
463</div>
464
465<div id="testLine39">
466    path.addRect(10, 0, 30, 30, (SkPath::Direction) 0);
467    path.addRect(12, 6, 24, 24, (SkPath::Direction) 0);
468    path.addRect(12, 4, 21, 21, (SkPath::Direction) 0);
469</div>
470
471<div id="testLine40">
472    path.addRect(10, 0, 30, 30, (SkPath::Direction) 0);
473    path.addRect(12, 18, 24, 24, (SkPath::Direction) 0);
474    path.addRect(4, 16, 13, 13, (SkPath::Direction) 0);
475</div>
476
477<div id="testLine41">
478    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
479    path.addRect(18, 24, 30, 30, (SkPath::Direction) 0);
480    path.addRect(12, 0, 21, 21, (SkPath::Direction) 0);
481</div>
482
483<div id="testLine42">
484    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
485    path.addRect(0, 0, 12, 12, (SkPath::Direction) 0);
486    path.addRect(8, 16, 17, 17, (SkPath::Direction) 0);
487</div>
488
489<div id="testLine43">
490    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
491    path.addRect(6, 24, 18, 18, (SkPath::Direction) 0);
492    path.addRect(0, 32, 9, 36, (SkPath::Direction) 1);
493</div>
494
495<div id="testLine44">
496    path.addRect(10, 40, 30, 30, (SkPath::Direction) 0);
497    path.addRect(18, 0, 30, 30, (SkPath::Direction) 0);
498    path.addRect(18, 32, 27, 36, (SkPath::Direction) 1);
499</div>
500
501<div id="testLine45">
502    path.addRect(10, 0, 30, 30, (SkPath::Direction) 0);
503    path.addRect(18, 0, 30, 30, (SkPath::Direction) 0);
504    path.addRect(24, 32, 33, 36, (SkPath::Direction) 0);
505</div>
506
507<div id="testLine46">
508    path.addRect(10, 40, 30, 30, (SkPath::Direction) 0);
509    path.addRect(24, 0, 36, 36, (SkPath::Direction) 0);
510    path.addRect(24, 32, 33, 36, (SkPath::Direction) 0);
511</div>
512
513<div id="testLine47">
514    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
515    path.addRect(0, 0, 12, 12, (SkPath::Direction) 0);
516    path.addRect(0, 0, 9, 9, (SkPath::Direction) 1);
517</div>
518
519<div id="testLine48">
520    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
521    path.addRect(0, 6, 12, 12, (SkPath::Direction) 0);
522    path.addRect(0, 0, 9, 9, (SkPath::Direction) 1);
523</div>
524
525<div id="testLine49">
526    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
527    path.addRect(0, 0, 12, 12, (SkPath::Direction) 0);
528    path.addRect(0, 0, 9, 9, (SkPath::Direction) 0);
529</div>
530
531<div id="testLine50">
532    path.addRect(10, 30, 30, 30, (SkPath::Direction) 0);
533    path.addRect(24, 20, 36, 30, (SkPath::Direction) 0);
534</div>
535
536<div id="testLine51">
537    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
538    path.addRect(0, 12, 12, 12, (SkPath::Direction) 0);
539    path.addRect(4, 12, 13, 13, (SkPath::Direction) 1);
540</div>
541
542<div id="testLine52">
543    path.addRect(0, 30, 20, 20, (SkPath::Direction) 0);
544    path.addRect(6, 20, 18, 30, (SkPath::Direction) 0);
545    path.addRect(32, 0, 36, 41, (SkPath::Direction) 0);
546</div>
547
548<div id="testLine53">
549    path.addRect(10, 30, 30, 30, (SkPath::Direction) 0);
550    path.addRect(12, 20, 24, 30, (SkPath::Direction) 0);
551    path.addRect(12, 32, 21, 36, (SkPath::Direction) 1);
552</div>
553
554<div id="testLine54">
555    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
556    path.addRect(6, 0, 18, 18, (SkPath::Direction) 0);
557    path.addRect(8, 4, 17, 17, (SkPath::Direction) 1);
558</div>
559
560<div id="testLine55">
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</div>
565
566<div id="testLine56">
567    path.addRect(0, 20, 20, 20, (SkPath::Direction) 0);
568    path.addRect(18, 20, 30, 30, (SkPath::Direction) 0);
569    path.addRect(12, 0, 21, 21, (SkPath::Direction) 1);
570</div>
571
572<div id="testLine57">
573    path.addRect(20, 0, 40, 40, (SkPath::Direction) 0);
574    path.addRect(20, 0, 30, 40, (SkPath::Direction) 0);
575    path.addRect(12, 0, 21, 21, (SkPath::Direction) 1);
576</div>
577
578<div id="testLine58">
579    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
580    path.addRect(0, 0, 12, 12, (SkPath::Direction) 1);
581    path.addRect(0, 12, 9, 9, (SkPath::Direction) 1);
582</div>
583
584<div id="testLine59">
585    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
586    path.addRect(6, 6, 18, 18, (SkPath::Direction) 1);
587    path.addRect(4, 4, 13, 13, (SkPath::Direction) 1);
588</div>
589
590<div id="testLine60">
591    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
592    path.addRect(6, 12, 18, 18, (SkPath::Direction) 1);
593    path.addRect(4, 12, 13, 13, (SkPath::Direction) 1);
594</div>
595
596<div id="testLine61">
597    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
598    path.addRect(12, 0, 24, 24, (SkPath::Direction) 1);
599    path.addRect(12, 0, 21, 21, (SkPath::Direction) 1);
600</div>
601
602<div id="testLine62">
603    path.addRect(0, 0, 60, 60, (SkPath::Direction) 0);
604    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
605    path.addRect(0, 12, 12, 12, (SkPath::Direction) 0);
606    path.addRect(4, 12, 13, 13, (SkPath::Direction) 1);
607</div>
608
609<div id="testLine63">
610    path.addRect(0, 0, 60, 60, (SkPath::Direction) 0);
611    path.addRect(0, 10, 20, 20, (SkPath::Direction) 0);
612    path.addRect(0, 6, 12, 12, (SkPath::Direction) 1);
613    path.addRect(0, 32, 9, 36, (SkPath::Direction) 1);
614</div>
615
616<div id="testLine64">
617    path.addRect(0, 0, 60, 60, (SkPath::Direction) 0);
618    path.addRect(10, 40, 30, 30, (SkPath::Direction) 0);
619    path.addRect(18, 6, 30, 30, (SkPath::Direction) 0);
620</div>
621
622<div id="testLine65">
623    path.addRect(0, 0, 60, 60, (SkPath::Direction) 0);
624    path.addRect(10, 0, 30, 30, (SkPath::Direction) 0);
625    path.addRect(24, 0, 36, 36, (SkPath::Direction) 0);
626    path.addRect(32, 6, 36, 41, (SkPath::Direction) 1);
627</div>
628
629<div id="testLine66">
630    path.addRect(0, 0, 60, 60, (SkPath::Direction) 0);
631    path.addRect(0, 30, 20, 20, (SkPath::Direction) 0);
632    path.addRect(12, 20, 24, 30, (SkPath::Direction) 0);
633</div>
634
635<div id="testLine67">
636    path.addRect(0, 0, 60, 60, (SkPath::Direction) 0);
637    path.addRect(10, 40, 30, 30, (SkPath::Direction) 0);
638    path.addRect(24, 20, 36, 30, (SkPath::Direction) 0);
639    path.addRect(32, 0, 36, 41, (SkPath::Direction) 0);
640</div>
641
642<div id="testLine68a">
643    path.addRect(0, 0, 8, 8, (SkPath::Direction) 0);
644    path.addRect(2, 2, 6, 6, (SkPath::Direction) 0);
645    path.addRect(1, 2, 4, 2, (SkPath::Direction) 0);
646</div>
647
648<div id="testLine68b">
649    path.addRect(0, 0, 8, 8, (SkPath::Direction) 0);
650    path.addRect(2, 2, 6, 6, (SkPath::Direction) 1);
651    path.addRect(1, 2, 4, 2, (SkPath::Direction) 0);
652</div>
653
654<div id="testLine68c">
655    path.addRect(0, 0, 8, 8, (SkPath::Direction) 1);
656    path.addRect(2, 2, 6, 6, (SkPath::Direction) 0);
657    path.addRect(1, 2, 4, 2, (SkPath::Direction) 0);
658</div>
659
660<div id="testLine68d">
661    path.addRect(0, 0, 8, 8, (SkPath::Direction) 1);
662    path.addRect(2, 2, 6, 6, (SkPath::Direction) 1);
663    path.addRect(1, 2, 4, 2, (SkPath::Direction) 0);
664</div>
665
666<div id="testLine68e">
667    path.addRect(0, 0, 8, 8, (SkPath::Direction) 0);
668    path.addRect(0, 0, 8, 8, (SkPath::Direction) 0);
669    path.addRect(2, 2, 6, 6, (SkPath::Direction) 1);
670    path.addRect(1, 2, 2, 2, (SkPath::Direction) 0);
671</div>
672
673<div id="testLine68f">
674    path.addRect(0, 0, 8, 8, (SkPath::Direction) 0);
675    path.addRect(2, 2, 6, 6, (SkPath::Direction) 1);
676    path.addRect(2, 2, 6, 6, (SkPath::Direction) 1);
677    path.addRect(1, 2, 2, 2, (SkPath::Direction) 0);
678</div>
679
680<div id="testLine69">
681    path.addRect(0, 20, 20, 20, (SkPath::Direction) 0);
682    path.addRect(0, 20, 12, 30, (SkPath::Direction) 0);
683    path.addRect(12, 32, 21, 36, (SkPath::Direction) 0);
684</div>
685
686<div id="testLine70">
687    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
688    path.addRect(0, 24, 12, 12, (SkPath::Direction) 0);
689    path.addRect(12, 32, 21, 36, (SkPath::Direction) 1);
690</div>
691
692<div id="testLine71">
693    path.addRect(0, 0, 20, 20, (SkPath::Direction) 0);
694    path.addRect(12, 0, 24, 24, (SkPath::Direction) 0);
695    path.addRect(12, 32, 21, 36, (SkPath::Direction) 0);
696</div>
697
698<div id="testLine72">
699    path.addRect(0, 0, 60, 60, (SkPath::Direction) 0);
700    path.addRect(10, 40, 30, 30, (SkPath::Direction) 0);
701    path.addRect(6, 20, 18, 30, (SkPath::Direction) 0);
702</div>
703
704<div id="testLine73">
705    path.addRect(0, 0, 60, 60, (SkPath::Direction) 0);
706    path.addRect(0, 40, 20, 20, (SkPath::Direction) 0);
707    path.addRect(0, 20, 12, 30, (SkPath::Direction) 0);
708    path.addRect(0, 0, 9, 9, (SkPath::Direction) 1);
709</div>
710
711<div id="testLine74">
712    path.addRect(20, 30, 40, 40, (SkPath::Direction) 0);
713    path.addRect(24, 20, 36, 30, (SkPath::Direction) 1);
714    path.addRect(32, 24, 36, 41, (SkPath::Direction) 1);
715</div>
716
717</div>
718
719<script type="text/javascript">
720
721var testDivs = [
722    testLine74,
723    testLine73,
724    testLine72,
725    testLine71,
726    testLine70,
727    testLine69,
728    testLine68f,
729    testLine68e,
730    testLine68d,
731    testLine68c,
732    testLine68b,
733    testLine68a,
734    testLine67,
735    testLine66,
736    testLine65,
737    testLine64,
738    testLine63,
739    testLine62,
740    testLine61,
741    testLine60,
742    testLine59,
743    testLine58,
744    testLine57,
745    testLine56,
746    testLine55,
747    testLine54,
748    testLine53,
749    testLine52,
750    testLine51,
751    testLine50,
752    testLine49,
753    testLine48,
754    testLine47,
755    testLine46,
756    testLine45,
757    testLine44,
758    testLine43,
759    testLine42,
760    testLine41,
761    testLine40,
762    testLine39,
763    testLine38,
764    testLine37,
765    testLine36,
766    testLine35,
767    testLine34,
768    testLine33,
769    testLine32,
770    testLine31,
771    testLine30,
772    testLine29,
773    testLine28,
774    testLine24,
775    testLine22,
776    testLine19,
777    testLine17,
778    testLine13,
779    testLine12,
780    testLine9,
781    testLine7b,
782    testLine7,
783    testSimplifyQuadratic21,
784    testSimplifyQuadratic20,
785    testSimplifyQuadratic19,
786    testSimplifyQuadratic18,
787    testSimplifyQuadratic17,
788    testSimplifyQuadratic16,
789    testSimplifyQuadratic15,
790    testSimplifyQuadratic14,
791    testSimplifyQuadratic13,
792    testSimplifyQuadratic12,
793    testSimplifyQuadratic11,
794    testSimplifyQuadratic10,
795    testSimplifyQuadratic9,
796    testSimplifyQuadratic8,
797    testSimplifyQuadratic7,
798    testSimplifyQuadratic6,
799    testSimplifyQuadratic5,
800    testSimplifyQuadratic4,
801    testSimplifyQuadratic3,
802    testSimplifyQuadratic2,
803    testSimplifyQuadratic1,
804];
805
806var scale, columns, rows, xStart, yStart;
807
808var ticks = 0.1;
809var at_x = 13 + 0.5;
810var at_y = 13 + 0.5;
811
812var tests = [];
813var testTitles = [];
814var testIndex = 0;
815
816var ctx;
817
818function parse(test, title) {
819    var contours = [];
820    var contourStrs = test.split("path.close();");
821    var pattern = /-?\d+\.*\d*/g;
822    for (var c in contourStrs) {
823        var contour = contourStrs[c];
824        var verbStrs = contour.split("path");
825        var verbs = [];
826        for (var v in verbStrs) {
827            var verbStr = verbStrs[v];
828            var points = verbStr.match(pattern);
829            var pts = [];
830            for (var wd in points) {
831                var num = parseFloat(points[wd]);
832                if (isNaN(num)) continue;
833                pts.push(num);
834            }
835            if (pts.length > 0)
836                verbs.push(pts);
837        }
838        if (verbs.length > 0) {
839            var lastIndex = verbs.length - 1;
840            var lastVerb = verbs[lastIndex];
841            var lastLen = lastVerb.length;
842            if (verbs[0][0] != lastVerb[lastLen - 2] && verbs[0][1] != lastVerb[lastLen - 1]) {
843                var lastPts = [];
844                lastPts.push(verbs[0][0]);
845                lastPts.push(verbs[0][1]);
846                verbs.push(lastPts);
847            }
848            contours.push(verbs);
849        }
850    }
851    if (contours.length > 0) {
852        tests.push(contours);
853        testTitles.push(title);
854    }
855}
856
857function parseRect(test, title) {
858    var contours = [];
859    var rectStrs = test.split("path.addRect");
860    var pattern = /-?\d+\.*\d*/g;
861    for (var r in rectStrs) {
862        var rect = rectStrs[r];
863        var sideStrs = rect.match(pattern);
864        var sides = [];
865        for (var wd in sideStrs) {
866            var num = parseFloat(sideStrs[wd]);
867            if (isNaN(num)) continue;
868            sides.push(num);
869        }
870        if (sides.length == 0)
871            continue;
872        var verbs = [];
873        var topLeft = [];
874        topLeft.push(sides[0]); topLeft.push(sides[1]);
875        var topRight = [];
876        topRight.push(sides[2]); topRight.push(sides[1]);
877        var botLeft = [];
878        botLeft.push(sides[0]); botLeft.push(sides[3]);
879        var botRight = [];
880        botRight.push(sides[2]); botRight.push(sides[3]);
881        verbs.push(topLeft);
882        if (sides[4] == 0) {
883            verbs.push(topRight);
884            verbs.push(botRight);
885            verbs.push(botLeft);
886        } else {
887            verbs.push(botLeft);
888            verbs.push(botRight);
889            verbs.push(topRight);
890        }
891        verbs.push(topLeft);
892        contours.push(verbs);
893    }
894    if (contours.length > 0) {
895        tests.push(contours);
896        testTitles.push(title);
897    }
898}
899
900function init(test) {
901    var canvas = document.getElementById('canvas');
902    if (!canvas.getContext) return;
903    canvas.width = window.innerWidth - at_x;
904    canvas.height = window.innerHeight - at_y;
905    ctx = canvas.getContext('2d');
906    var xmin = Infinity;
907    var xmax = -Infinity;
908    var ymin = Infinity;
909    var ymax = -Infinity;
910    for (var contours in test) {
911        var contour = test[contours];
912        for (var verbs in contour) {
913            var verb = contour[verbs];
914            var last = verb.length;
915            for (var idx = 0; idx < last; idx += 2) {
916                xmin = Math.min(xmin, verb[idx]);
917                xmax = Math.max(xmax, verb[idx]);
918                ymin = Math.min(ymin, verb[idx + 1]);
919                ymax = Math.max(ymax, verb[idx + 1]);
920            }
921        }
922    }
923    var subscale = 1;
924    while ((xmax - xmin) * subscale < 0.1 && (ymax - ymin) * subscale < 0.1) {
925        subscale *= 10;
926    }
927    columns = Math.ceil(xmax) - Math.floor(xmin) + 1;
928    rows = Math.ceil(ymax) - Math.floor(ymin) + 1;
929    xStart = Math.floor(xmin);
930    yStart = Math.floor(ymin);
931    var hscale = ctx.canvas.width / columns / ticks;
932    var vscale = ctx.canvas.height / rows / ticks;
933    scale = Math.floor(Math.min(hscale, vscale)) * subscale;
934}
935
936function drawPoint(px, py, xoffset, yoffset, unit) {
937    var label = px.toFixed(3) + ", " + py.toFixed(3);
938    var _px = px * unit + xoffset;
939    var _py = py * unit + yoffset;
940    ctx.beginPath();
941    ctx.arc(_px, _py, 3, 0, Math.PI*2, true);
942    ctx.closePath();
943    ctx.fill();
944    ctx.fillText(label, _px + 5, _py);
945}
946
947function draw(test, title, _at_x, _at_y, scale) {
948    ctx.fillStyle = "rgba(0,0,0, 0.1)";
949    ctx.font = "normal 50px Arial";
950    ctx.fillText(title, 50, 50);
951    ctx.font = "normal 10px Arial";
952    
953    var unit = scale * ticks;
954    ctx.lineWidth = 1;
955    var i;
956    for (i = 0; i <= rows * ticks; ++i) {
957        ctx.strokeStyle = (i % ticks) != 0 ? "rgb(160,160,160)" : "black";
958        ctx.beginPath();
959        ctx.moveTo(_at_x + 0, _at_y + i * scale);
960        ctx.lineTo(_at_x + unit * columns, _at_y + i * scale);
961        ctx.stroke();
962    }
963    for (i = 0; i <= columns * ticks; ++i) {
964        ctx.strokeStyle = (i % ticks) != 0 ? "rgb(160,160,160)" : "black";
965        ctx.beginPath();
966        ctx.moveTo(_at_x + i * scale, _at_y + 0);
967        ctx.lineTo(_at_x + i * scale, _at_y + unit * rows);
968        ctx.stroke();
969    }
970 
971    var xoffset = xStart * -unit + _at_x;
972    var yoffset = yStart * -unit + _at_y;
973
974    ctx.fillStyle = "rgb(40,80,60)"
975    for (i = 0; i <= columns; i += (1 / ticks))
976    {
977        num = (xoffset - _at_x) / -unit + i; 
978        ctx.fillText(num.toFixed(0), i * unit + _at_y - 5, 10);
979    }
980    for (i = 0; i <= rows; i += (1 / ticks))
981    {
982        num = (yoffset - _at_x) / -unit + i; 
983        ctx.fillText(num.toFixed(0), 0, i * unit + _at_y + 0);
984    }
985    ctx.strokeStyle = "red";
986    var contours, verbs, pts;
987    ctx.beginPath();
988    for (contours in test) {
989        var contour = test[contours];
990        if (contours == 2) ctx.strokeStyle = "blue";
991        var first = true;
992        for (verbs in contour) {
993            var verb = contour[verbs];
994            switch (verb.length) {
995                case 2:
996                    if (first) {
997                        ctx.moveTo(xoffset + verb[0] * unit, yoffset + verb[1] * unit);
998                        first = false;
999                    } else
1000                        ctx.lineTo(xoffset + verb[0] * unit, yoffset + verb[1] * unit);
1001                    break;
1002                case 4:
1003                    ctx.quadraticCurveTo(xoffset + verb[0] * unit, yoffset + verb[1] * unit,
1004                        xoffset + verb[2] * unit, yoffset + verb[3] * unit);
1005                    break;
1006                case 6:
1007                    ctx.bezierCurveTo(xoffset + verb[0] * unit, yoffset + verb[1] * unit,
1008                        xoffset + verb[2] * unit, yoffset + verb[3] * unit,
1009                        xoffset + verb[4] * unit, yoffset + verb[5] * unit);
1010                    break;
1011            }
1012        }
1013        ctx.closePath();
1014    }
1015    ctx.stroke();
1016    ctx.fillStyle="rgba(192,192,255, 0.3)";
1017    ctx.fill();
1018    
1019    ctx.fillStyle="blue";
1020    for (contours in test) {
1021        var contour = test[contours];
1022        for (verbs in contour) {
1023            var verb = contour[verbs];
1024            for (i = 0; i < verb.length; i += 2) {
1025                x = verb[i];
1026                y = verb[i + 1];
1027                drawPoint(x, y, xoffset, yoffset, unit);
1028            }
1029        }
1030    }
1031}
1032
1033var mouseX = Infinity, mouseY;
1034
1035function calcXY() {
1036    var e = window.event;
1037	var tgt = e.target || e.srcElement;
1038    var left = tgt.offsetLeft;
1039    var top = tgt.offsetTop;
1040    var unit = scale * ticks;
1041    mouseX = (e.clientX - left - Math.ceil(at_x) + 1) / unit + xStart;
1042    mouseY = (e.clientY - top - Math.ceil(at_y)) / unit + yStart;
1043}
1044
1045function handleMouseOver() {
1046    calcXY();
1047    var num = mouseX.toFixed(3) + ", " + mouseY.toFixed(3);
1048    ctx.beginPath();
1049    ctx.rect(300,100,200,10);
1050    ctx.fillStyle="white";
1051    ctx.fill();
1052    ctx.fillStyle="black";
1053    ctx.fillText(num, 300, 108);
1054}
1055
1056function handleMouseClick() {
1057    calcXY();
1058//    drawInset();
1059}
1060
1061function drawTop() {
1062    init(tests[testIndex]);
1063    redraw();
1064}
1065
1066function redraw() {
1067    ctx.beginPath();
1068    ctx.rect(0, 0, ctx.canvas.width, ctx.canvas.height);
1069    ctx.fillStyle="white";
1070    ctx.fill();
1071    draw(tests[testIndex], testTitles[testIndex], at_x, at_y, scale);
1072//    if (insetScale != scale && mouseX != Infinity)
1073//        drawInset();
1074}
1075
1076function doKeyPress(evt) {
1077    var char = String.fromCharCode(evt.charCode);
1078    switch (char) {
1079    case 'N':
1080        testIndex += 9;
1081    case 'n':
1082        if (++testIndex >= tests.length)
1083            testIndex = 0;
1084        mouseX = Infinity;
1085        drawTop();
1086        break;
1087    case 'P':
1088        testIndex -= 9;
1089    case 'p':
1090        if (--testIndex < 0)
1091            testIndex = tests.length - 1;
1092        mouseX = Infinity;
1093        drawTop();
1094        break;
1095    case 'T':
1096    case 't':
1097        break;
1098    case '-':
1099        drawTop();
1100        break;
1101    case '=':
1102    case '+':
1103        drawTop();
1104        break;
1105    }
1106}
1107
1108function doResize(evt) {
1109    drawTop();
1110}
1111
1112function start() {
1113    for (i = 0; i < testDivs.length; ++i) {
1114        var title = testDivs[i].id.toString();
1115        var str = testDivs[i].firstChild.data;
1116        if (str.split("addRect").length > 1) {
1117            parseRect(str, title);
1118        } else {
1119            parse(str, title);
1120        }
1121    }
1122    drawTop();
1123    window.addEventListener('keypress', doKeyPress, true);
1124    window.onresize = function() {
1125        drawTop();
1126    }
1127}
1128
1129</script>
1130</head>
1131
1132<body onLoad="start();">
1133<canvas id="canvas" width="750" height="500"
1134    onmousemove="handleMouseOver()"
1135    onclick="handleMouseClick()"
1136    ></canvas >
1137</body>
1138</html>
1139