xref: /aosp_15_r20/external/skia/tools/pathops_visualizer.htm (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker<html>
2*c8dee2aaSAndroid Build Coastguard Worker<head>
3*c8dee2aaSAndroid Build Coastguard Worker<div height="0" hidden="true">
4*c8dee2aaSAndroid Build Coastguard Worker<div id="bug8380">
5*c8dee2aaSAndroid Build Coastguard WorkerSkDCubic::ComplexBreak
6*c8dee2aaSAndroid Build Coastguard Worker{{{126, 9.396100044250488281}, {125.6320571899414063, 9.295844078063964844}, {125.1227340698242188, 9.337338447570800781}, {124.6031646728515625, 9.379667282104492188}}},
7*c8dee2aaSAndroid Build Coastguard WorkerinflectionsTs[0]=0.999997776 {{{126.1618761931709827, 9.252680507258252973}, {123.04446008475567, 9.506653492188940291}}},
8*c8dee2aaSAndroid Build Coastguard WorkerSkDCubic::ComplexBreak
9*c8dee2aaSAndroid Build Coastguard Worker{{{124.6031646728515625, 9.379667282104492188}, {124.1427383422851563, 9.417178153991699219}, {123.6742630004882813, 9.45534515380859375}, {123.28900146484375, 9.396100044250488281}}},
10*c8dee2aaSAndroid Build Coastguard WorkerinflectionsTs[0]=4.14921088e-06 {{{125.984438133710114, 9.267135117035042668}, {123.2218797495565639, 9.492200381017113386}}},
11*c8dee2aaSAndroid Build Coastguard WorkermaxCurvature[0]=0.0817322831 {{{125.8735553329735666, 9.277935394706121386}, {123.1067608854740314, 9.499713475347833835}}},
12*c8dee2aaSAndroid Build Coastguard WorkerSkDCubic::ComplexBreak
13*c8dee2aaSAndroid Build Coastguard Worker{{{126, 9.396200180053710938}, {125.305999755859375, 9.206999778747558594}, {124.1090011596679688, 9.522199630737304688}, {123.28900146484375, 9.396200180053710938}}},
14*c8dee2aaSAndroid Build Coastguard WorkerinflectionsTs[0]=0.530286644 {{{127.5428560571536707, 9.140180090182106198}, {121.6628069847287179, 9.619260454379688241}}},
15*c8dee2aaSAndroid Build Coastguard WorkermaxCurvature[0]=0.568563182 {{{127.4346914043237859, 9.15278490094694952}, {121.5456828946143446, 9.624913158409162506}}},
16*c8dee2aaSAndroid Build Coastguard Workerseg=1 {{{0, 353.891998f}, {126, 9.39610004f}}}
17*c8dee2aaSAndroid Build Coastguard Workerseg=2 {{{126, 9.39610004f}, {125.632057f, 9.29584408f}, {125.122734f, 9.33733845f}, {124.603165f, 9.37966728f}}}
18*c8dee2aaSAndroid Build Coastguard Workerseg=3 {{{124.603165f, 9.37966728f}, {124.142731f, 9.41717815f}, {123.674263f, 9.45534515f}, {123.289001f, 9.39610004f}}}
19*c8dee2aaSAndroid Build Coastguard Workerseg=4 {{{123.289001f, 9.39610004f}, {118.119003f, 8.07219982f}}}
20*c8dee2aaSAndroid Build Coastguard Workerseg=5 {{{118.119003f, 8.07219982f}, {8.17210007f, 104.212997f}}}
21*c8dee2aaSAndroid Build Coastguard Workerseg=6 {{{8.17210007f, 104.212997f}, {0, 259.298737f}}}
22*c8dee2aaSAndroid Build Coastguard Workerseg=7 {{{0, 259.298737f}, {0, 353.891998f}}}
23*c8dee2aaSAndroid Build Coastguard Workerop sect
24*c8dee2aaSAndroid Build Coastguard Workerseg=8 {{{8.17210007f, 104.212997f}, {-5.82350016f, 369.813995f}}}
25*c8dee2aaSAndroid Build Coastguard Workerseg=9 {{{-5.82350016f, 369.813995f}, {126, 9.39620018f}}}
26*c8dee2aaSAndroid Build Coastguard Workerseg=10 {{{126, 9.39620018f}, {125.631981f, 9.29586983f}, {125.12252f, 9.3373785f}, {124.602829f, 9.37972069f}}}
27*c8dee2aaSAndroid Build Coastguard Workerseg=11 {{{124.602829f, 9.37972069f}, {124.142509f, 9.41722488f}, {123.674164f, 9.45538425f}, {123.289001f, 9.39620018f}}}
28*c8dee2aaSAndroid Build Coastguard Workerseg=12 {{{123.289001f, 9.39620018f}, {118.119003f, 8.07219982f}}}
29*c8dee2aaSAndroid Build Coastguard Workerseg=13 {{{118.119003f, 8.07219982f}, {8.17210007f, 104.212997f}}}
30*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection wtTs[0]=1 {{{8.17210007,104.212997}, {-5.82350016,369.813995}}} {{-5.82350016,369.813995}} wnTs[0]=0 {{{-5.82350016,369.813995}, {126,9.39620018}}}
31*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection wtTs[0]=0 {{{8.17210007,104.212997}, {-5.82350016,369.813995}}} {{8.17210007,104.212997}} wnTs[0]=1 {{{118.119003,8.07219982}, {8.17210007,104.212997}}}
32*c8dee2aaSAndroid Build Coastguard WorkerdebugShowCubicLineIntersection wtTs[0]=0 {{{126,9.39620018}, {125.631981,9.29586983}, {125.12252,9.3373785}, {124.602829,9.37972069}}} {{126,9.39620018}} wnTs[0]=1 {{{-5.82350016,369.813995}, {126,9.39620018}}}
33*c8dee2aaSAndroid Build Coastguard WorkerdebugShowCubicLineIntersection no intersect {{{124.602829,9.37972069}, {124.142509,9.41722488}, {123.674164,9.45538425}, {123.289001,9.39620018}}} {{{-5.82350016,369.813995}, {126,9.39620018}}}
34*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection no intersect {{{-5.82350016,369.813995}, {126,9.39620018}}} {{{123.289001,9.39620018}, {118.119003,8.07219982}}}
35*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection no intersect {{{-5.82350016,369.813995}, {126,9.39620018}}} {{{118.119003,8.07219982}, {8.17210007,104.212997}}}
36*c8dee2aaSAndroid Build Coastguard WorkerdebugShowCubicIntersection wtTs[0]=1 {{{126,9.39620018}, {125.631981,9.29586983}, {125.12252,9.3373785}, {124.602829,9.37972069}}} {{124.602829,9.37972069}} wnTs[0]=0 {{{124.602829,9.37972069}, {124.142509,9.41722488}, {123.674164,9.45538425}, {123.289001,9.39620018}}}
37*c8dee2aaSAndroid Build Coastguard WorkerdebugShowCubicLineIntersection wtTs[0]=1 {{{124.602829,9.37972069}, {124.142509,9.41722488}, {123.674164,9.45538425}, {123.289001,9.39620018}}} {{123.289001,9.39620018}} wnTs[0]=0 {{{123.289001,9.39620018}, {118.119003,8.07219982}}}
38*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection wtTs[0]=1 {{{123.289001,9.39620018}, {118.119003,8.07219982}}} {{118.119003,8.07219982}} wnTs[0]=0 {{{118.119003,8.07219982}, {8.17210007,104.212997}}}
39*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection no intersect {{{8.17210007,104.212997}, {-5.82350016,369.813995}}} {{{0,353.891998}, {126,9.39610004}}}
40*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection wtTs[0]=0 {{{8.17210007,104.212997}, {-5.82350016,369.813995}}} {{8.17210007,104.212997}} wnTs[0]=1 {{{118.119003,8.07219982}, {8.17210007,104.212997}}}
41*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection wtTs[0]=0 {{{8.17210007,104.212997}, {-5.82350016,369.813995}}} {{8.17210007,104.212997}} wtTs[1]=0.583904956 {{0,259.298737}} wnTs[0]=0 {{{8.17210007,104.212997}, {0,259.298737}}} wnTs[1]=1
42*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::addT insert t=0.583904956 segID=8 spanID=27
43*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection wtTs[0]=0.583904956 {{{8.17210007,104.212997}, {-5.82350016,369.813995}}} {{0,259.298737}} wnTs[0]=0 {{{0,259.298737}, {0,353.891998}}}
44*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection wtTs[0]=0.0441765002 {{{-5.82350016,369.813995}, {126,9.39620018}}} {{0,353.891998}} wtTs[1]=1 {{126,9.39620018}} wnTs[0]=0 {{{0,353.891998}, {126,9.39610004}}} wnTs[1]=0.999999744
45*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::addT insert t=0.0441765002 segID=9 spanID=28
46*c8dee2aaSAndroid Build Coastguard WorkerdebugShowCubicLineIntersection no intersect {{{124.603165,9.37966728}, {124.142731,9.41717815}, {123.674263,9.45534515}, {123.289001,9.39610004}}} {{{-5.82350016,369.813995}, {126,9.39620018}}}
47*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection no intersect {{{-5.82350016,369.813995}, {126,9.39620018}}} {{{118.119003,8.07219982}, {8.17210007,104.212997}}}
48*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection no intersect {{{-5.82350016,369.813995}, {126,9.39620018}}} {{{8.17210007,104.212997}, {0,259.298737}}}
49*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection wtTs[0]=0.0441765002 {{{-5.82350016,369.813995}, {126,9.39620018}}} {{0,353.891998}} wnTs[0]=1 {{{0,259.298737}, {0,353.891998}}}
50*c8dee2aaSAndroid Build Coastguard WorkerdebugShowCubicLineIntersection wtTs[0]=0 {{{126,9.39620018}, {125.631981,9.29586983}, {125.12252,9.3373785}, {124.602829,9.37972069}}} {{126,9.39620018}} wnTs[0]=1 {{{0,353.891998}, {126,9.39610004}}}
51*c8dee2aaSAndroid Build Coastguard Worker-1=(0.375,0.5) [-1]
52*c8dee2aaSAndroid Build Coastguard WorkerSkTSect::addForPerp addBounded span=-1 opp=-1
53*c8dee2aaSAndroid Build Coastguard Worker-1=(0.5,0.625) [-1]
54*c8dee2aaSAndroid Build Coastguard WorkerSkTSect::addForPerp addBounded span=-1 opp=-1
55*c8dee2aaSAndroid Build Coastguard Worker-1=(0.625,0.75) [-1]
56*c8dee2aaSAndroid Build Coastguard WorkerSkTSect::addForPerp addBounded span=-1 opp=-1
57*c8dee2aaSAndroid Build Coastguard Worker-1=(0.75,0.8125) [-1]
58*c8dee2aaSAndroid Build Coastguard WorkerSkTSect::addForPerp addBounded span=-1 opp=-1
59*c8dee2aaSAndroid Build Coastguard Worker-1=(0.8125,0.875) [-1]
60*c8dee2aaSAndroid Build Coastguard WorkerSkTSect::addForPerp addBounded span=-1 opp=-1
61*c8dee2aaSAndroid Build Coastguard Worker-1=(0.875,0.9375) [-1]
62*c8dee2aaSAndroid Build Coastguard WorkerSkTSect::addForPerp addBounded span=-1 opp=-1
63*c8dee2aaSAndroid Build Coastguard WorkerSkTSect::addForPerp priorSpan=-1 t=0.937702598 opp=-1
64*c8dee2aaSAndroid Build Coastguard Worker-1=(0.9375,1) []
65*c8dee2aaSAndroid Build Coastguard WorkerSkTSect::addForPerp addBounded span=-1 opp=-1
66*c8dee2aaSAndroid Build Coastguard WorkerdebugShowCubicIntersection wtTs[0]=0.307128906 {{{126,9.39620018}, {125.631981,9.29586983}, {125.12252,9.3373785}, {124.602829,9.37972069}}} {{125.624687,9.33981037}} wtTs[1]=0.9375 {{124.700119,9.37182617}} wnTs[0]=0.307191 {{{126,9.39610004}, {125.632057,9.29584408}, {125.122734,9.33733845}, {124.603165,9.37966728}}} wnTs[1]=0.937702598
67*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::addT insert t=0.307128906 segID=10 spanID=29
68*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::addT insert t=0.307190555 segID=2 spanID=30
69*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::addT insert t=0.9375 segID=10 spanID=31
70*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::addT insert t=0.937702598 segID=2 spanID=32
71*c8dee2aaSAndroid Build Coastguard WorkerdebugShowCubicIntersection no intersect {{{126,9.39620018}, {125.631981,9.29586983}, {125.12252,9.3373785}, {124.602829,9.37972069}}} {{{124.603165,9.37966728}, {124.142731,9.41717815}, {123.674263,9.45534515}, {123.289001,9.39610004}}}
72*c8dee2aaSAndroid Build Coastguard WorkerdebugShowCubicLineIntersection no intersect {{{124.602829,9.37972069}, {124.142509,9.41722488}, {123.674164,9.45538425}, {123.289001,9.39620018}}} {{{0,353.891998}, {126,9.39610004}}}
73*c8dee2aaSAndroid Build Coastguard Worker-1=(0.125,0.1875) [-1]
74*c8dee2aaSAndroid Build Coastguard WorkerSkTSect::addForPerp addBounded span=-1 opp=-1
75*c8dee2aaSAndroid Build Coastguard Worker-1=(0.1875,0.25) [-1]
76*c8dee2aaSAndroid Build Coastguard WorkerSkTSect::addForPerp addBounded span=-1 opp=-1
77*c8dee2aaSAndroid Build Coastguard Worker-1=(0.25,0.375) [-1]
78*c8dee2aaSAndroid Build Coastguard WorkerSkTSect::addForPerp addBounded span=-1 opp=-1
79*c8dee2aaSAndroid Build Coastguard Worker-1=(0.375,0.5) [-1]
80*c8dee2aaSAndroid Build Coastguard WorkerSkTSect::addForPerp addBounded span=-1 opp=-1
81*c8dee2aaSAndroid Build Coastguard Worker-1=(0.5,0.625) [-1]
82*c8dee2aaSAndroid Build Coastguard WorkerSkTSect::addForPerp addBounded span=-1 opp=-1
83*c8dee2aaSAndroid Build Coastguard Worker-1=(0.625,0.75) [-1]
84*c8dee2aaSAndroid Build Coastguard WorkerSkTSect::addForPerp addBounded span=-1 opp=-1
85*c8dee2aaSAndroid Build Coastguard WorkerdebugShowCubicIntersection wtTs[0]=0.0625 {{{124.602829,9.37972069}, {124.142509,9.41722488}, {123.674164,9.45538425}, {123.289001,9.39620018}}} {{124.516449,9.38673687}} wtTs[1]=0.625 {{123.752594,9.4268837}} wnTs[0]=0.0627287 {{{124.603165,9.37966728}, {124.142731,9.41717815}, {123.674263,9.45534515}, {123.289001,9.39610004}}} wnTs[1]=0.625091708
86*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::addT insert t=0.0625 segID=11 spanID=33
87*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::addT insert t=0.0627286673 segID=3 spanID=34
88*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::addT insert t=0.625 segID=11 spanID=35
89*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::addT insert t=0.625091708 segID=3 spanID=36
90*c8dee2aaSAndroid Build Coastguard WorkerdebugShowCubicLineIntersection no intersect {{{124.602829,9.37972069}, {124.142509,9.41722488}, {123.674164,9.45538425}, {123.289001,9.39620018}}} {{{123.289001,9.39610004}, {118.119003,8.07219982}}}
91*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection no intersect {{{123.289001,9.39620018}, {118.119003,8.07219982}}} {{{0,353.891998}, {126,9.39610004}}}
92*c8dee2aaSAndroid Build Coastguard WorkerdebugShowCubicLineIntersection wtTs[0]=0.999978653 {{{124.603165,9.37966728}, {124.142731,9.41717815}, {123.674263,9.45534515}, {123.289001,9.39610004}}} {{123.289001,9.39620018}} wnTs[0]=0 {{{123.289001,9.39620018}, {118.119003,8.07219982}}}
93*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection wtTs[0]=4.65488731e-06 {{{123.289001,9.39620018}, {118.119003,8.07219982}}} {{123.289001,9.39610004}} wtTs[1]=1 {{118.119003,8.07219982}} wnTs[0]=0 {{{123.289001,9.39610004}, {118.119003,8.07219982}}} wnTs[1]=1
94*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection wtTs[0]=1 {{{123.289001,9.39620018}, {118.119003,8.07219982}}} {{118.119003,8.07219982}} wnTs[0]=0 {{{118.119003,8.07219982}, {8.17210007,104.212997}}}
95*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection no intersect {{{118.119003,8.07219982}, {8.17210007,104.212997}}} {{{0,353.891998}, {126,9.39610004}}}
96*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection wtTs[0]=0 {{{118.119003,8.07219982}, {8.17210007,104.212997}}} {{118.119003,8.07219982}} wnTs[0]=1 {{{123.289001,9.39610004}, {118.119003,8.07219982}}}
97*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection wtTs[0]=0 {{{118.119003,8.07219982}, {8.17210007,104.212997}}} {{118.119003,8.07219982}} wtTs[1]=1 {{8.17210007,104.212997}} wnTs[0]=0 {{{118.119003,8.07219982}, {8.17210007,104.212997}}} wnTs[1]=1
98*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection wtTs[0]=1 {{{118.119003,8.07219982}, {8.17210007,104.212997}}} {{8.17210007,104.212997}} wnTs[0]=0 {{{8.17210007,104.212997}, {0,259.298737}}}
99*c8dee2aaSAndroid Build Coastguard WorkerdebugShowCubicLineIntersection wtTs[0]=0 {{{126,9.39610004}, {125.632057,9.29584408}, {125.122734,9.33733845}, {124.603165,9.37966728}}} {{126,9.39610004}} wnTs[0]=1 {{{0,353.891998}, {126,9.39610004}}}
100*c8dee2aaSAndroid Build Coastguard WorkerdebugShowCubicLineIntersection no intersect {{{124.603165,9.37966728}, {124.142731,9.41717815}, {123.674263,9.45534515}, {123.289001,9.39610004}}} {{{0,353.891998}, {126,9.39610004}}}
101*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection no intersect {{{0,353.891998}, {126,9.39610004}}} {{{123.289001,9.39610004}, {118.119003,8.07219982}}}
102*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection no intersect {{{0,353.891998}, {126,9.39610004}}} {{{118.119003,8.07219982}, {8.17210007,104.212997}}}
103*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection no intersect {{{0,353.891998}, {126,9.39610004}}} {{{8.17210007,104.212997}, {0,259.298737}}}
104*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection wtTs[0]=0 {{{0,353.891998}, {126,9.39610004}}} {{0,353.891998}} wnTs[0]=1 {{{0,259.298737}, {0,353.891998}}}
105*c8dee2aaSAndroid Build Coastguard WorkerdebugShowCubicIntersection wtTs[0]=1 {{{126,9.39610004}, {125.632057,9.29584408}, {125.122734,9.33733845}, {124.603165,9.37966728}}} {{124.603165,9.37966728}} wnTs[0]=0 {{{124.603165,9.37966728}, {124.142731,9.41717815}, {123.674263,9.45534515}, {123.289001,9.39610004}}}
106*c8dee2aaSAndroid Build Coastguard WorkerdebugShowCubicLineIntersection wtTs[0]=1 {{{124.603165,9.37966728}, {124.142731,9.41717815}, {123.674263,9.45534515}, {123.289001,9.39610004}}} {{123.289001,9.39610004}} wnTs[0]=0 {{{123.289001,9.39610004}, {118.119003,8.07219982}}}
107*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection wtTs[0]=1 {{{123.289001,9.39610004}, {118.119003,8.07219982}}} {{118.119003,8.07219982}} wnTs[0]=0 {{{118.119003,8.07219982}, {8.17210007,104.212997}}}
108*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection wtTs[0]=1 {{{118.119003,8.07219982}, {8.17210007,104.212997}}} {{8.17210007,104.212997}} wnTs[0]=0 {{{8.17210007,104.212997}, {0,259.298737}}}
109*c8dee2aaSAndroid Build Coastguard WorkerdebugShowLineIntersection wtTs[0]=1 {{{8.17210007,104.212997}, {0,259.298737}}} {{0,259.298737}} wnTs[0]=0 {{{0,259.298737}, {0,353.891998}}}
110*c8dee2aaSAndroid Build Coastguard Worker----------------x-x--x-x-------------- addExpanded
111*c8dee2aaSAndroid Build Coastguard Worker00:  coinSeg/Span/PtT=2/3/3 endSpan=30 oppSeg/Span/PtT=10/19/19 oppEndSpan=29 MissingCoin
112*c8dee2aaSAndroid Build Coastguard Worker01:  coinSeg/Span/PtT=3/36/36 endSpan=6 oppSeg/Span/PtT=11/35/35 oppEndSpan=22 MissingCoin
113*c8dee2aaSAndroid Build Coastguard Worker02:  coinSeg/Span/PtT=5/9/9 endSpan=10 oppSeg/Span/PtT=13/25/25 oppEndSpan=26 MissingCoin
114*c8dee2aaSAndroid Build Coastguard Worker03:  coinSeg/Span/PtT=2/3/3 endSpan=30 oppSeg/Span/PtT=10/19/19 oppEndSpan=29 MissingCoin
115*c8dee2aaSAndroid Build Coastguard Worker04:  coinSeg/Span/PtT=3/36/36 endSpan=6 oppSeg/Span/PtT=11/35/35 oppEndSpan=22 MissingCoin
116*c8dee2aaSAndroid Build Coastguard Worker05:  coinSeg/Span/PtT=5/9/9 endSpan=10 oppSeg/Span/PtT=13/25/25 oppEndSpan=26 MissingCoin
117*c8dee2aaSAndroid Build Coastguard Worker06:  coinSeg/Span/PtT=10/19/19 endSpan=29 oppSeg/Span/PtT=2/3/3 oppEndSpan=30 MissingCoin
118*c8dee2aaSAndroid Build Coastguard Worker07:  coinSeg/Span/PtT=11/35/35 endSpan=22 oppSeg/Span/PtT=3/36/36 oppEndSpan=6 MissingCoin
119*c8dee2aaSAndroid Build Coastguard Worker08:  coinSeg/Span/PtT=10/19/19 endSpan=29 oppSeg/Span/PtT=2/3/3 oppEndSpan=30 MissingCoin
120*c8dee2aaSAndroid Build Coastguard Worker09:  coinSeg/Span/PtT=11/35/35 endSpan=22 oppSeg/Span/PtT=3/36/36 oppEndSpan=6 MissingCoin
121*c8dee2aaSAndroid Build Coastguard Worker10:  coinSeg/Span/PtT=11/33/33 endSpan=6 oppSeg/Span/PtT=11/22/22 oppEndSpan=6 ExpandCoin
122*c8dee2aaSAndroid Build Coastguard Worker11:  coinSeg/Span/PtT=2/30/30 endSpan=19 oppSeg/Span/PtT=2/3/3 oppEndSpan=19 ExpandCoin
123*c8dee2aaSAndroid Build Coastguard Worker12:  seg/base=13/25 seg/base=5/9 MarkCoinStart
124*c8dee2aaSAndroid Build Coastguard Worker13:  seg/base=13/26 seg/base=5/10 MarkCoinEnd
125*c8dee2aaSAndroid Build Coastguard Worker14:  seg/base=4/7 seg/base=12/23 MarkCoinStart
126*c8dee2aaSAndroid Build Coastguard Worker15:  seg/base=4/8 seg/base=12/24 MarkCoinEnd
127*c8dee2aaSAndroid Build Coastguard Worker16:  seg/base=11/33 seg/base=3/34 MarkCoinStart
128*c8dee2aaSAndroid Build Coastguard Worker17:  seg/base=11/35 seg/base=3/36 MarkCoinEnd
129*c8dee2aaSAndroid Build Coastguard Worker18:  seg/base=2/30 seg/base=10/29 MarkCoinStart
130*c8dee2aaSAndroid Build Coastguard Worker19:  seg/base=2/32 seg/base=10/31 MarkCoinEnd
131*c8dee2aaSAndroid Build Coastguard Worker20:  seg/base=9/28 seg/base=1/1 MarkCoinStart
132*c8dee2aaSAndroid Build Coastguard Worker21:  seg/base=9/18 seg/base=1/2 MarkCoinEnd
133*c8dee2aaSAndroid Build Coastguard Worker22:  seg/base=8/15 seg/base=6/11 MarkCoinStart
134*c8dee2aaSAndroid Build Coastguard Worker23:  seg/base=8/27 seg/base=6/12 MarkCoinEnd
135*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=8 (8.17210007,104.212997 -2.71619996e-07,259.298737) t=0 tEnd=0.583904956 windSum=? windValue=1
136*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=8 (-2.71619996e-07,259.298737 -5.82350016,369.813995) t=0.583904956 tEnd=1 windSum=? windValue=1
137*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=9 (-5.82350016,369.813995 7.26031715e-07,353.891998) t=0 tEnd=0.0441765002 windSum=? windValue=1
138*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=9 (7.26031715e-07,353.891998 126,9.39620018) t=0.0441765002 tEnd=1 windSum=? windValue=1
139*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=10 (126,9.39620018 125.886971,9.36538583 125.760599,9.34795095 125.624687,9.33981037) t=0 tEnd=0.307128906 windSum=? windValue=1
140*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=10 (125.624687,9.33981037 125.345733,9.32310212 125.026588,9.34554777 124.700119,9.37182617) t=0.307128906 tEnd=0.9375 windSum=? windValue=1
141*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=10 (124.700119,9.37182617 124.66775,9.37443162 124.63531,9.3770743 124.602829,9.37972069) t=0.9375 tEnd=1 windSum=? windValue=1
142*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=11 (124.602829,9.37972069 124.574059,9.3820647 124.545259,9.38441166 124.516449,9.38673687) t=0 tEnd=0.0625 windSum=? windValue=1
143*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=11 (124.516449,9.38673687 124.257155,9.40766372 123.997126,9.42685982 123.752594,9.4268837) t=0.0625 tEnd=0.625 windSum=? windValue=1
144*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=11 (123.752594,9.4268837 123.589573,9.42689962 123.433437,9.41839421 123.289001,9.39620018) t=0.625 tEnd=1 windSum=? windValue=1
145*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=12 (123.289001,9.39620018 118.119003,8.07219982) t=0 tEnd=1 windSum=? windValue=1
146*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=13 (118.119003,8.07219982 8.17210007,104.212997) t=0 tEnd=1 windSum=? windValue=1
147*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=1 (0,353.891998 126,9.39610004) t=0 tEnd=1 windSum=? windValue=1
148*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=2 (126,9.39610004 125.886971,9.36530236 125.760605,9.34788101 125.624695,9.33975124) t=0 tEnd=0.307190555 windSum=? windValue=1
149*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=2 (125.624695,9.33975124 125.345738,9.3230648 125.026588,9.34552196 124.700119,9.37180042) t=0.307190555 tEnd=0.937702598 windSum=? windValue=1
150*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=2 (124.700119,9.37180042 124.667862,9.37439685 124.635532,9.37703031 124.603165,9.37966728) t=0.937702598 tEnd=1 windSum=? windValue=1
151*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=3 (124.603165,9.37966728 124.574282,9.38202029 124.545364,9.3843762 124.516441,9.38671017) t=0 tEnd=0.0627286673 windSum=? windValue=1
152*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=3 (124.516441,9.38671017 124.257145,9.40763418 123.997124,9.42681973 123.752594,9.42682648) t=0.0627286673 tEnd=0.625091708 windSum=? windValue=1
153*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=3 (123.752594,9.42682648 123.589574,9.42683098 123.433439,9.41831153 123.289001,9.39610004) t=0.625091708 tEnd=1 windSum=? windValue=1
154*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=4 (123.289001,9.39610004 118.119003,8.07219982) t=0 tEnd=1 windSum=? windValue=1
155*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=5 (118.119003,8.07219982 8.17210007,104.212997) t=0 tEnd=1 windSum=? windValue=1
156*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=6 (8.17210007,104.212997 0,259.298737) t=0 tEnd=1 windSum=? windValue=1
157*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=7 (0,259.298737 0,353.891998) t=0 tEnd=1 windSum=? windValue=1
158*c8dee2aaSAndroid Build Coastguard Worker----------------x-x--x-x-------------- move_multiples
159*c8dee2aaSAndroid Build Coastguard Worker00:  coinSeg/Span/PtT=2/3/3 endSpan=30 oppSeg/Span/PtT=10/19/19 oppEndSpan=29 MissingCoin
160*c8dee2aaSAndroid Build Coastguard Worker01:  coinSeg/Span/PtT=3/36/36 endSpan=6 oppSeg/Span/PtT=11/35/35 oppEndSpan=22 MissingCoin
161*c8dee2aaSAndroid Build Coastguard Worker02:  coinSeg/Span/PtT=5/9/9 endSpan=10 oppSeg/Span/PtT=13/25/25 oppEndSpan=26 MissingCoin
162*c8dee2aaSAndroid Build Coastguard Worker03:  coinSeg/Span/PtT=2/3/3 endSpan=30 oppSeg/Span/PtT=10/19/19 oppEndSpan=29 MissingCoin
163*c8dee2aaSAndroid Build Coastguard Worker04:  coinSeg/Span/PtT=3/36/36 endSpan=6 oppSeg/Span/PtT=11/35/35 oppEndSpan=22 MissingCoin
164*c8dee2aaSAndroid Build Coastguard Worker05:  coinSeg/Span/PtT=5/9/9 endSpan=10 oppSeg/Span/PtT=13/25/25 oppEndSpan=26 MissingCoin
165*c8dee2aaSAndroid Build Coastguard Worker06:  coinSeg/Span/PtT=10/19/19 endSpan=29 oppSeg/Span/PtT=2/3/3 oppEndSpan=30 MissingCoin
166*c8dee2aaSAndroid Build Coastguard Worker07:  coinSeg/Span/PtT=11/35/35 endSpan=22 oppSeg/Span/PtT=3/36/36 oppEndSpan=6 MissingCoin
167*c8dee2aaSAndroid Build Coastguard Worker08:  coinSeg/Span/PtT=10/19/19 endSpan=29 oppSeg/Span/PtT=2/3/3 oppEndSpan=30 MissingCoin
168*c8dee2aaSAndroid Build Coastguard Worker09:  coinSeg/Span/PtT=11/35/35 endSpan=22 oppSeg/Span/PtT=3/36/36 oppEndSpan=6 MissingCoin
169*c8dee2aaSAndroid Build Coastguard Worker10:  coinSeg/Span/PtT=11/33/33 endSpan=6 oppSeg/Span/PtT=11/22/22 oppEndSpan=6 ExpandCoin
170*c8dee2aaSAndroid Build Coastguard Worker11:  coinSeg/Span/PtT=2/30/30 endSpan=19 oppSeg/Span/PtT=2/3/3 oppEndSpan=19 ExpandCoin
171*c8dee2aaSAndroid Build Coastguard Worker12:  seg/base=13/25 seg/base=5/9 MarkCoinStart
172*c8dee2aaSAndroid Build Coastguard Worker13:  seg/base=13/26 seg/base=5/10 MarkCoinEnd
173*c8dee2aaSAndroid Build Coastguard Worker14:  seg/base=4/7 seg/base=12/23 MarkCoinStart
174*c8dee2aaSAndroid Build Coastguard Worker15:  seg/base=4/8 seg/base=12/24 MarkCoinEnd
175*c8dee2aaSAndroid Build Coastguard Worker16:  seg/base=11/33 seg/base=3/34 MarkCoinStart
176*c8dee2aaSAndroid Build Coastguard Worker17:  seg/base=11/35 seg/base=3/36 MarkCoinEnd
177*c8dee2aaSAndroid Build Coastguard Worker18:  seg/base=2/30 seg/base=10/29 MarkCoinStart
178*c8dee2aaSAndroid Build Coastguard Worker19:  seg/base=2/32 seg/base=10/31 MarkCoinEnd
179*c8dee2aaSAndroid Build Coastguard Worker20:  seg/base=9/28 seg/base=1/1 MarkCoinStart
180*c8dee2aaSAndroid Build Coastguard Worker21:  seg/base=9/18 seg/base=1/2 MarkCoinEnd
181*c8dee2aaSAndroid Build Coastguard Worker22:  seg/base=8/15 seg/base=6/11 MarkCoinStart
182*c8dee2aaSAndroid Build Coastguard Worker23:  seg/base=8/27 seg/base=6/12 MarkCoinEnd
183*c8dee2aaSAndroid Build Coastguard Worker----------------x-x--x-x-------------- move_nearby
184*c8dee2aaSAndroid Build Coastguard Worker00:  coinSeg/Span/PtT=2/3/3 endSpan=30 oppSeg/Span/PtT=10/19/19 oppEndSpan=29 MissingCoin
185*c8dee2aaSAndroid Build Coastguard Worker01:  coinSeg/Span/PtT=3/36/36 endSpan=6 oppSeg/Span/PtT=11/35/35 oppEndSpan=22 MissingCoin
186*c8dee2aaSAndroid Build Coastguard Worker02:  coinSeg/Span/PtT=5/9/9 endSpan=10 oppSeg/Span/PtT=13/25/25 oppEndSpan=26 MissingCoin
187*c8dee2aaSAndroid Build Coastguard Worker03:  coinSeg/Span/PtT=2/3/3 endSpan=30 oppSeg/Span/PtT=10/19/19 oppEndSpan=29 MissingCoin
188*c8dee2aaSAndroid Build Coastguard Worker04:  coinSeg/Span/PtT=3/36/36 endSpan=6 oppSeg/Span/PtT=11/35/35 oppEndSpan=22 MissingCoin
189*c8dee2aaSAndroid Build Coastguard Worker05:  coinSeg/Span/PtT=5/9/9 endSpan=10 oppSeg/Span/PtT=13/25/25 oppEndSpan=26 MissingCoin
190*c8dee2aaSAndroid Build Coastguard Worker06:  coinSeg/Span/PtT=10/19/19 endSpan=29 oppSeg/Span/PtT=2/3/3 oppEndSpan=30 MissingCoin
191*c8dee2aaSAndroid Build Coastguard Worker07:  coinSeg/Span/PtT=11/35/35 endSpan=22 oppSeg/Span/PtT=3/36/36 oppEndSpan=6 MissingCoin
192*c8dee2aaSAndroid Build Coastguard Worker08:  coinSeg/Span/PtT=10/19/19 endSpan=29 oppSeg/Span/PtT=2/3/3 oppEndSpan=30 MissingCoin
193*c8dee2aaSAndroid Build Coastguard Worker09:  coinSeg/Span/PtT=11/35/35 endSpan=22 oppSeg/Span/PtT=3/36/36 oppEndSpan=6 MissingCoin
194*c8dee2aaSAndroid Build Coastguard Worker10:  coinSeg/Span/PtT=11/33/33 endSpan=6 oppSeg/Span/PtT=11/22/22 oppEndSpan=6 ExpandCoin
195*c8dee2aaSAndroid Build Coastguard Worker11:  coinSeg/Span/PtT=2/30/30 endSpan=19 oppSeg/Span/PtT=2/3/3 oppEndSpan=19 ExpandCoin
196*c8dee2aaSAndroid Build Coastguard Worker12:  seg/base=13/25 seg/base=5/9 MarkCoinStart
197*c8dee2aaSAndroid Build Coastguard Worker13:  seg/base=13/26 seg/base=5/10 MarkCoinEnd
198*c8dee2aaSAndroid Build Coastguard Worker14:  seg/base=4/7 seg/base=12/23 MarkCoinStart
199*c8dee2aaSAndroid Build Coastguard Worker15:  seg/base=4/8 seg/base=12/24 MarkCoinEnd
200*c8dee2aaSAndroid Build Coastguard Worker16:  seg/base=11/33 seg/base=3/34 MarkCoinStart
201*c8dee2aaSAndroid Build Coastguard Worker17:  seg/base=11/35 seg/base=3/36 MarkCoinEnd
202*c8dee2aaSAndroid Build Coastguard Worker18:  seg/base=2/30 seg/base=10/29 MarkCoinStart
203*c8dee2aaSAndroid Build Coastguard Worker19:  seg/base=2/32 seg/base=10/31 MarkCoinEnd
204*c8dee2aaSAndroid Build Coastguard Worker20:  seg/base=9/28 seg/base=1/1 MarkCoinStart
205*c8dee2aaSAndroid Build Coastguard Worker21:  seg/base=9/18 seg/base=1/2 MarkCoinEnd
206*c8dee2aaSAndroid Build Coastguard Worker22:  seg/base=8/15 seg/base=6/11 MarkCoinStart
207*c8dee2aaSAndroid Build Coastguard Worker23:  seg/base=8/27 seg/base=6/12 MarkCoinEnd
208*c8dee2aaSAndroid Build Coastguard Worker----------------x-x--x-x-------------- correctEnds
209*c8dee2aaSAndroid Build Coastguard Worker00:  coinSeg/Span/PtT=2/3/3 endSpan=30 oppSeg/Span/PtT=10/19/19 oppEndSpan=29 MissingCoin
210*c8dee2aaSAndroid Build Coastguard Worker01:  coinSeg/Span/PtT=3/36/36 endSpan=6 oppSeg/Span/PtT=11/35/35 oppEndSpan=22 MissingCoin
211*c8dee2aaSAndroid Build Coastguard Worker02:  coinSeg/Span/PtT=5/9/9 endSpan=10 oppSeg/Span/PtT=13/25/25 oppEndSpan=26 MissingCoin
212*c8dee2aaSAndroid Build Coastguard Worker03:  coinSeg/Span/PtT=2/3/3 endSpan=30 oppSeg/Span/PtT=10/19/19 oppEndSpan=29 MissingCoin
213*c8dee2aaSAndroid Build Coastguard Worker04:  coinSeg/Span/PtT=3/36/36 endSpan=6 oppSeg/Span/PtT=11/35/35 oppEndSpan=22 MissingCoin
214*c8dee2aaSAndroid Build Coastguard Worker05:  coinSeg/Span/PtT=5/9/9 endSpan=10 oppSeg/Span/PtT=13/25/25 oppEndSpan=26 MissingCoin
215*c8dee2aaSAndroid Build Coastguard Worker06:  coinSeg/Span/PtT=10/19/19 endSpan=29 oppSeg/Span/PtT=2/3/3 oppEndSpan=30 MissingCoin
216*c8dee2aaSAndroid Build Coastguard Worker07:  coinSeg/Span/PtT=11/35/35 endSpan=22 oppSeg/Span/PtT=3/36/36 oppEndSpan=6 MissingCoin
217*c8dee2aaSAndroid Build Coastguard Worker08:  coinSeg/Span/PtT=10/19/19 endSpan=29 oppSeg/Span/PtT=2/3/3 oppEndSpan=30 MissingCoin
218*c8dee2aaSAndroid Build Coastguard Worker09:  coinSeg/Span/PtT=11/35/35 endSpan=22 oppSeg/Span/PtT=3/36/36 oppEndSpan=6 MissingCoin
219*c8dee2aaSAndroid Build Coastguard Worker10:  coinSeg/Span/PtT=11/33/33 endSpan=6 oppSeg/Span/PtT=11/22/22 oppEndSpan=6 ExpandCoin
220*c8dee2aaSAndroid Build Coastguard Worker11:  coinSeg/Span/PtT=2/30/30 endSpan=19 oppSeg/Span/PtT=2/3/3 oppEndSpan=19 ExpandCoin
221*c8dee2aaSAndroid Build Coastguard Worker12:  seg/base=13/25 seg/base=5/9 MarkCoinStart
222*c8dee2aaSAndroid Build Coastguard Worker13:  seg/base=13/26 seg/base=5/10 MarkCoinEnd
223*c8dee2aaSAndroid Build Coastguard Worker14:  seg/base=4/7 seg/base=12/23 MarkCoinStart
224*c8dee2aaSAndroid Build Coastguard Worker15:  seg/base=4/8 seg/base=12/24 MarkCoinEnd
225*c8dee2aaSAndroid Build Coastguard Worker16:  seg/base=11/33 seg/base=3/34 MarkCoinStart
226*c8dee2aaSAndroid Build Coastguard Worker17:  seg/base=11/35 seg/base=3/36 MarkCoinEnd
227*c8dee2aaSAndroid Build Coastguard Worker18:  seg/base=2/30 seg/base=10/29 MarkCoinStart
228*c8dee2aaSAndroid Build Coastguard Worker19:  seg/base=2/32 seg/base=10/31 MarkCoinEnd
229*c8dee2aaSAndroid Build Coastguard Worker20:  seg/base=9/28 seg/base=1/1 MarkCoinStart
230*c8dee2aaSAndroid Build Coastguard Worker21:  seg/base=9/18 seg/base=1/2 MarkCoinEnd
231*c8dee2aaSAndroid Build Coastguard Worker22:  seg/base=8/15 seg/base=6/11 MarkCoinStart
232*c8dee2aaSAndroid Build Coastguard Worker23:  seg/base=8/27 seg/base=6/12 MarkCoinEnd
233*c8dee2aaSAndroid Build Coastguard Worker----------------x-x--x-x-------------- addEndMovedSpans
234*c8dee2aaSAndroid Build Coastguard Worker00:  coinSeg/Span/PtT=2/3/3 endSpan=30 oppSeg/Span/PtT=10/19/19 oppEndSpan=29 MissingCoin
235*c8dee2aaSAndroid Build Coastguard Worker01:  coinSeg/Span/PtT=3/36/36 endSpan=6 oppSeg/Span/PtT=11/35/35 oppEndSpan=22 MissingCoin
236*c8dee2aaSAndroid Build Coastguard Worker02:  coinSeg/Span/PtT=5/9/9 endSpan=10 oppSeg/Span/PtT=13/25/25 oppEndSpan=26 MissingCoin
237*c8dee2aaSAndroid Build Coastguard Worker03:  coinSeg/Span/PtT=2/3/3 endSpan=30 oppSeg/Span/PtT=10/19/19 oppEndSpan=29 MissingCoin
238*c8dee2aaSAndroid Build Coastguard Worker04:  coinSeg/Span/PtT=3/36/36 endSpan=6 oppSeg/Span/PtT=11/35/35 oppEndSpan=22 MissingCoin
239*c8dee2aaSAndroid Build Coastguard Worker05:  coinSeg/Span/PtT=5/9/9 endSpan=10 oppSeg/Span/PtT=13/25/25 oppEndSpan=26 MissingCoin
240*c8dee2aaSAndroid Build Coastguard Worker06:  coinSeg/Span/PtT=10/19/19 endSpan=29 oppSeg/Span/PtT=2/3/3 oppEndSpan=30 MissingCoin
241*c8dee2aaSAndroid Build Coastguard Worker07:  coinSeg/Span/PtT=11/35/35 endSpan=22 oppSeg/Span/PtT=3/36/36 oppEndSpan=6 MissingCoin
242*c8dee2aaSAndroid Build Coastguard Worker08:  coinSeg/Span/PtT=10/19/19 endSpan=29 oppSeg/Span/PtT=2/3/3 oppEndSpan=30 MissingCoin
243*c8dee2aaSAndroid Build Coastguard Worker09:  coinSeg/Span/PtT=11/35/35 endSpan=22 oppSeg/Span/PtT=3/36/36 oppEndSpan=6 MissingCoin
244*c8dee2aaSAndroid Build Coastguard Worker10:  coinSeg/Span/PtT=11/33/33 endSpan=6 oppSeg/Span/PtT=11/22/22 oppEndSpan=6 ExpandCoin
245*c8dee2aaSAndroid Build Coastguard Worker11:  coinSeg/Span/PtT=2/30/30 endSpan=19 oppSeg/Span/PtT=2/3/3 oppEndSpan=19 ExpandCoin
246*c8dee2aaSAndroid Build Coastguard Worker12:  seg/base=13/25 seg/base=5/9 MarkCoinStart
247*c8dee2aaSAndroid Build Coastguard Worker13:  seg/base=13/26 seg/base=5/10 MarkCoinEnd
248*c8dee2aaSAndroid Build Coastguard Worker14:  seg/base=4/7 seg/base=12/23 MarkCoinStart
249*c8dee2aaSAndroid Build Coastguard Worker15:  seg/base=4/8 seg/base=12/24 MarkCoinEnd
250*c8dee2aaSAndroid Build Coastguard Worker16:  seg/base=11/33 seg/base=3/34 MarkCoinStart
251*c8dee2aaSAndroid Build Coastguard Worker17:  seg/base=11/35 seg/base=3/36 MarkCoinEnd
252*c8dee2aaSAndroid Build Coastguard Worker18:  seg/base=2/30 seg/base=10/29 MarkCoinStart
253*c8dee2aaSAndroid Build Coastguard Worker19:  seg/base=2/32 seg/base=10/31 MarkCoinEnd
254*c8dee2aaSAndroid Build Coastguard Worker20:  seg/base=9/28 seg/base=1/1 MarkCoinStart
255*c8dee2aaSAndroid Build Coastguard Worker21:  seg/base=9/18 seg/base=1/2 MarkCoinEnd
256*c8dee2aaSAndroid Build Coastguard Worker22:  seg/base=8/15 seg/base=6/11 MarkCoinStart
257*c8dee2aaSAndroid Build Coastguard Worker23:  seg/base=8/27 seg/base=6/12 MarkCoinEnd
258*c8dee2aaSAndroid Build Coastguard Worker----------------x-x--x-x-------------- expand
259*c8dee2aaSAndroid Build Coastguard Worker00:  coinSeg/Span/PtT=2/3/3 endSpan=30 oppSeg/Span/PtT=10/19/19 oppEndSpan=29 MissingCoin
260*c8dee2aaSAndroid Build Coastguard Worker01:  coinSeg/Span/PtT=3/36/36 endSpan=6 oppSeg/Span/PtT=11/35/35 oppEndSpan=22 MissingCoin
261*c8dee2aaSAndroid Build Coastguard Worker02:  coinSeg/Span/PtT=5/9/9 endSpan=10 oppSeg/Span/PtT=13/25/25 oppEndSpan=26 MissingCoin
262*c8dee2aaSAndroid Build Coastguard Worker03:  coinSeg/Span/PtT=2/3/3 endSpan=30 oppSeg/Span/PtT=10/19/19 oppEndSpan=29 MissingCoin
263*c8dee2aaSAndroid Build Coastguard Worker04:  coinSeg/Span/PtT=3/36/36 endSpan=6 oppSeg/Span/PtT=11/35/35 oppEndSpan=22 MissingCoin
264*c8dee2aaSAndroid Build Coastguard Worker05:  coinSeg/Span/PtT=5/9/9 endSpan=10 oppSeg/Span/PtT=13/25/25 oppEndSpan=26 MissingCoin
265*c8dee2aaSAndroid Build Coastguard Worker06:  coinSeg/Span/PtT=10/19/19 endSpan=29 oppSeg/Span/PtT=2/3/3 oppEndSpan=30 MissingCoin
266*c8dee2aaSAndroid Build Coastguard Worker07:  coinSeg/Span/PtT=11/35/35 endSpan=22 oppSeg/Span/PtT=3/36/36 oppEndSpan=6 MissingCoin
267*c8dee2aaSAndroid Build Coastguard Worker08:  coinSeg/Span/PtT=10/19/19 endSpan=29 oppSeg/Span/PtT=2/3/3 oppEndSpan=30 MissingCoin
268*c8dee2aaSAndroid Build Coastguard Worker09:  coinSeg/Span/PtT=11/35/35 endSpan=22 oppSeg/Span/PtT=3/36/36 oppEndSpan=6 MissingCoin
269*c8dee2aaSAndroid Build Coastguard Worker10:  coinSeg/Span/PtT=11/33/33 endSpan=6 oppSeg/Span/PtT=11/22/22 oppEndSpan=6 ExpandCoin
270*c8dee2aaSAndroid Build Coastguard Worker11:  coinSeg/Span/PtT=2/30/30 endSpan=19 oppSeg/Span/PtT=2/3/3 oppEndSpan=19 ExpandCoin
271*c8dee2aaSAndroid Build Coastguard Worker12:  seg/base=13/25 seg/base=5/9 MarkCoinStart
272*c8dee2aaSAndroid Build Coastguard Worker13:  seg/base=13/26 seg/base=5/10 MarkCoinEnd
273*c8dee2aaSAndroid Build Coastguard Worker14:  seg/base=4/7 seg/base=12/23 MarkCoinStart
274*c8dee2aaSAndroid Build Coastguard Worker15:  seg/base=4/8 seg/base=12/24 MarkCoinEnd
275*c8dee2aaSAndroid Build Coastguard Worker16:  seg/base=11/33 seg/base=3/34 MarkCoinStart
276*c8dee2aaSAndroid Build Coastguard Worker17:  seg/base=11/35 seg/base=3/36 MarkCoinEnd
277*c8dee2aaSAndroid Build Coastguard Worker18:  seg/base=2/30 seg/base=10/29 MarkCoinStart
278*c8dee2aaSAndroid Build Coastguard Worker19:  seg/base=2/32 seg/base=10/31 MarkCoinEnd
279*c8dee2aaSAndroid Build Coastguard Worker20:  seg/base=9/28 seg/base=1/1 MarkCoinStart
280*c8dee2aaSAndroid Build Coastguard Worker21:  seg/base=9/18 seg/base=1/2 MarkCoinEnd
281*c8dee2aaSAndroid Build Coastguard Worker22:  seg/base=8/15 seg/base=6/11 MarkCoinStart
282*c8dee2aaSAndroid Build Coastguard Worker23:  seg/base=8/27 seg/base=6/12 MarkCoinEnd
283*c8dee2aaSAndroid Build Coastguard Worker------------------xx-x-x-------------- addExpanded
284*c8dee2aaSAndroid Build Coastguard Worker00:  coinSeg/Span/PtT=5/9/9 endSpan=10 oppSeg/Span/PtT=13/25/25 oppEndSpan=26 MissingCoin
285*c8dee2aaSAndroid Build Coastguard Worker01:  coinSeg/Span/PtT=5/9/9 endSpan=10 oppSeg/Span/PtT=13/25/25 oppEndSpan=26 MissingCoin
286*c8dee2aaSAndroid Build Coastguard Worker02:  seg/base=13/25 seg/base=5/9 MarkCoinStart
287*c8dee2aaSAndroid Build Coastguard Worker03:  seg/base=13/26 seg/base=5/10 MarkCoinEnd
288*c8dee2aaSAndroid Build Coastguard Worker04:  seg/base=4/7 seg/base=12/23 MarkCoinStart
289*c8dee2aaSAndroid Build Coastguard Worker05:  seg/base=4/8 seg/base=12/24 MarkCoinEnd
290*c8dee2aaSAndroid Build Coastguard Worker06:  seg/base=11/33 seg/base=3/34 MarkCoinStart
291*c8dee2aaSAndroid Build Coastguard Worker07:  seg/base=11/22 seg/base=3/6 MarkCoinEnd
292*c8dee2aaSAndroid Build Coastguard Worker08:  seg/base=3/36 MarkCoinInsert
293*c8dee2aaSAndroid Build Coastguard Worker09:  seg/base=11/35 MarkCoinInsert
294*c8dee2aaSAndroid Build Coastguard Worker10:  seg/base=2/3 seg/base=10/19 MarkCoinStart
295*c8dee2aaSAndroid Build Coastguard Worker11:  seg/base=2/32 seg/base=10/31 MarkCoinEnd
296*c8dee2aaSAndroid Build Coastguard Worker12:  seg/base=10/29 MarkCoinInsert
297*c8dee2aaSAndroid Build Coastguard Worker13:  seg/base=2/30 MarkCoinInsert
298*c8dee2aaSAndroid Build Coastguard Worker14:  seg/base=9/28 seg/base=1/1 MarkCoinStart
299*c8dee2aaSAndroid Build Coastguard Worker15:  seg/base=9/18 seg/base=1/2 MarkCoinEnd
300*c8dee2aaSAndroid Build Coastguard Worker16:  seg/base=8/15 seg/base=6/11 MarkCoinStart
301*c8dee2aaSAndroid Build Coastguard Worker17:  seg/base=8/27 seg/base=6/12 MarkCoinEnd
302*c8dee2aaSAndroid Build Coastguard Worker------------------xx-x-x-------------- move_multiples
303*c8dee2aaSAndroid Build Coastguard Worker00:  coinSeg/Span/PtT=5/9/9 endSpan=10 oppSeg/Span/PtT=13/25/25 oppEndSpan=26 MissingCoin
304*c8dee2aaSAndroid Build Coastguard Worker01:  coinSeg/Span/PtT=5/9/9 endSpan=10 oppSeg/Span/PtT=13/25/25 oppEndSpan=26 MissingCoin
305*c8dee2aaSAndroid Build Coastguard Worker02:  seg/base=13/25 seg/base=5/9 MarkCoinStart
306*c8dee2aaSAndroid Build Coastguard Worker03:  seg/base=13/26 seg/base=5/10 MarkCoinEnd
307*c8dee2aaSAndroid Build Coastguard Worker04:  seg/base=4/7 seg/base=12/23 MarkCoinStart
308*c8dee2aaSAndroid Build Coastguard Worker05:  seg/base=4/8 seg/base=12/24 MarkCoinEnd
309*c8dee2aaSAndroid Build Coastguard Worker06:  seg/base=11/33 seg/base=3/34 MarkCoinStart
310*c8dee2aaSAndroid Build Coastguard Worker07:  seg/base=11/22 seg/base=3/6 MarkCoinEnd
311*c8dee2aaSAndroid Build Coastguard Worker08:  seg/base=3/36 MarkCoinInsert
312*c8dee2aaSAndroid Build Coastguard Worker09:  seg/base=11/35 MarkCoinInsert
313*c8dee2aaSAndroid Build Coastguard Worker10:  seg/base=2/3 seg/base=10/19 MarkCoinStart
314*c8dee2aaSAndroid Build Coastguard Worker11:  seg/base=2/32 seg/base=10/31 MarkCoinEnd
315*c8dee2aaSAndroid Build Coastguard Worker12:  seg/base=10/29 MarkCoinInsert
316*c8dee2aaSAndroid Build Coastguard Worker13:  seg/base=2/30 MarkCoinInsert
317*c8dee2aaSAndroid Build Coastguard Worker14:  seg/base=9/28 seg/base=1/1 MarkCoinStart
318*c8dee2aaSAndroid Build Coastguard Worker15:  seg/base=9/18 seg/base=1/2 MarkCoinEnd
319*c8dee2aaSAndroid Build Coastguard Worker16:  seg/base=8/15 seg/base=6/11 MarkCoinStart
320*c8dee2aaSAndroid Build Coastguard Worker17:  seg/base=8/27 seg/base=6/12 MarkCoinEnd
321*c8dee2aaSAndroid Build Coastguard Worker------------------xx-x-x-------------- move_nearby
322*c8dee2aaSAndroid Build Coastguard Worker00:  coinSeg/Span/PtT=5/9/9 endSpan=10 oppSeg/Span/PtT=13/25/25 oppEndSpan=26 MissingCoin
323*c8dee2aaSAndroid Build Coastguard Worker01:  coinSeg/Span/PtT=5/9/9 endSpan=10 oppSeg/Span/PtT=13/25/25 oppEndSpan=26 MissingCoin
324*c8dee2aaSAndroid Build Coastguard Worker02:  seg/base=13/25 seg/base=5/9 MarkCoinStart
325*c8dee2aaSAndroid Build Coastguard Worker03:  seg/base=13/26 seg/base=5/10 MarkCoinEnd
326*c8dee2aaSAndroid Build Coastguard Worker04:  seg/base=4/7 seg/base=12/23 MarkCoinStart
327*c8dee2aaSAndroid Build Coastguard Worker05:  seg/base=4/8 seg/base=12/24 MarkCoinEnd
328*c8dee2aaSAndroid Build Coastguard Worker06:  seg/base=11/33 seg/base=3/34 MarkCoinStart
329*c8dee2aaSAndroid Build Coastguard Worker07:  seg/base=11/22 seg/base=3/6 MarkCoinEnd
330*c8dee2aaSAndroid Build Coastguard Worker08:  seg/base=3/36 MarkCoinInsert
331*c8dee2aaSAndroid Build Coastguard Worker09:  seg/base=11/35 MarkCoinInsert
332*c8dee2aaSAndroid Build Coastguard Worker10:  seg/base=2/3 seg/base=10/19 MarkCoinStart
333*c8dee2aaSAndroid Build Coastguard Worker11:  seg/base=2/32 seg/base=10/31 MarkCoinEnd
334*c8dee2aaSAndroid Build Coastguard Worker12:  seg/base=10/29 MarkCoinInsert
335*c8dee2aaSAndroid Build Coastguard Worker13:  seg/base=2/30 MarkCoinInsert
336*c8dee2aaSAndroid Build Coastguard Worker14:  seg/base=9/28 seg/base=1/1 MarkCoinStart
337*c8dee2aaSAndroid Build Coastguard Worker15:  seg/base=9/18 seg/base=1/2 MarkCoinEnd
338*c8dee2aaSAndroid Build Coastguard Worker16:  seg/base=8/15 seg/base=6/11 MarkCoinStart
339*c8dee2aaSAndroid Build Coastguard Worker17:  seg/base=8/27 seg/base=6/12 MarkCoinEnd
340*c8dee2aaSAndroid Build Coastguard Worker------------------xx-x-x-------------- addExpanded
341*c8dee2aaSAndroid Build Coastguard Worker00:  coinSeg/Span/PtT=5/9/9 endSpan=10 oppSeg/Span/PtT=13/25/25 oppEndSpan=26 MissingCoin
342*c8dee2aaSAndroid Build Coastguard Worker01:  coinSeg/Span/PtT=5/9/9 endSpan=10 oppSeg/Span/PtT=13/25/25 oppEndSpan=26 MissingCoin
343*c8dee2aaSAndroid Build Coastguard Worker02:  seg/base=13/25 seg/base=5/9 MarkCoinStart
344*c8dee2aaSAndroid Build Coastguard Worker03:  seg/base=13/26 seg/base=5/10 MarkCoinEnd
345*c8dee2aaSAndroid Build Coastguard Worker04:  seg/base=4/7 seg/base=12/23 MarkCoinStart
346*c8dee2aaSAndroid Build Coastguard Worker05:  seg/base=4/8 seg/base=12/24 MarkCoinEnd
347*c8dee2aaSAndroid Build Coastguard Worker06:  seg/base=11/33 seg/base=3/34 MarkCoinStart
348*c8dee2aaSAndroid Build Coastguard Worker07:  seg/base=11/22 seg/base=3/6 MarkCoinEnd
349*c8dee2aaSAndroid Build Coastguard Worker08:  seg/base=3/36 MarkCoinInsert
350*c8dee2aaSAndroid Build Coastguard Worker09:  seg/base=11/35 MarkCoinInsert
351*c8dee2aaSAndroid Build Coastguard Worker10:  seg/base=2/3 seg/base=10/19 MarkCoinStart
352*c8dee2aaSAndroid Build Coastguard Worker11:  seg/base=2/32 seg/base=10/31 MarkCoinEnd
353*c8dee2aaSAndroid Build Coastguard Worker12:  seg/base=10/29 MarkCoinInsert
354*c8dee2aaSAndroid Build Coastguard Worker13:  seg/base=2/30 MarkCoinInsert
355*c8dee2aaSAndroid Build Coastguard Worker14:  seg/base=9/28 seg/base=1/1 MarkCoinStart
356*c8dee2aaSAndroid Build Coastguard Worker15:  seg/base=9/18 seg/base=1/2 MarkCoinEnd
357*c8dee2aaSAndroid Build Coastguard Worker16:  seg/base=8/15 seg/base=6/11 MarkCoinStart
358*c8dee2aaSAndroid Build Coastguard Worker17:  seg/base=8/27 seg/base=6/12 MarkCoinEnd
359*c8dee2aaSAndroid Build Coastguard Worker------------------xx-x-x-------------- mark
360*c8dee2aaSAndroid Build Coastguard Worker00:  coinSeg/Span/PtT=5/9/9 endSpan=10 oppSeg/Span/PtT=13/25/25 oppEndSpan=26 MissingCoin
361*c8dee2aaSAndroid Build Coastguard Worker01:  coinSeg/Span/PtT=5/9/9 endSpan=10 oppSeg/Span/PtT=13/25/25 oppEndSpan=26 MissingCoin
362*c8dee2aaSAndroid Build Coastguard Worker02:  seg/base=13/25 seg/base=5/9 MarkCoinStart
363*c8dee2aaSAndroid Build Coastguard Worker03:  seg/base=13/26 seg/base=5/10 MarkCoinEnd
364*c8dee2aaSAndroid Build Coastguard Worker04:  seg/base=4/7 seg/base=12/23 MarkCoinStart
365*c8dee2aaSAndroid Build Coastguard Worker05:  seg/base=4/8 seg/base=12/24 MarkCoinEnd
366*c8dee2aaSAndroid Build Coastguard Worker06:  seg/base=11/33 seg/base=3/34 MarkCoinStart
367*c8dee2aaSAndroid Build Coastguard Worker07:  seg/base=11/22 seg/base=3/6 MarkCoinEnd
368*c8dee2aaSAndroid Build Coastguard Worker08:  seg/base=3/36 MarkCoinInsert
369*c8dee2aaSAndroid Build Coastguard Worker09:  seg/base=11/35 MarkCoinInsert
370*c8dee2aaSAndroid Build Coastguard Worker10:  seg/base=2/3 seg/base=10/19 MarkCoinStart
371*c8dee2aaSAndroid Build Coastguard Worker11:  seg/base=2/32 seg/base=10/31 MarkCoinEnd
372*c8dee2aaSAndroid Build Coastguard Worker12:  seg/base=10/29 MarkCoinInsert
373*c8dee2aaSAndroid Build Coastguard Worker13:  seg/base=2/30 MarkCoinInsert
374*c8dee2aaSAndroid Build Coastguard Worker14:  seg/base=9/28 seg/base=1/1 MarkCoinStart
375*c8dee2aaSAndroid Build Coastguard Worker15:  seg/base=9/18 seg/base=1/2 MarkCoinEnd
376*c8dee2aaSAndroid Build Coastguard Worker16:  seg/base=8/15 seg/base=6/11 MarkCoinStart
377*c8dee2aaSAndroid Build Coastguard Worker17:  seg/base=8/27 seg/base=6/12 MarkCoinEnd
378*c8dee2aaSAndroid Build Coastguard Worker-------------------------------------- missing_coincidence
379*c8dee2aaSAndroid Build Coastguard Worker-------------------------------------- expand
380*c8dee2aaSAndroid Build Coastguard Worker-------------------------------------- expand
381*c8dee2aaSAndroid Build Coastguard Worker-------------------------------------- apply
382*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markDone id=5 (118.119003,8.07219982 8.17210007,104.212997) t=0 [9] (118.119003,8.07219982) tEnd=1 newWindSum=? newOppSum=? oppSum=? windSum=? windValue=0 oppValue=0
383*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markDone id=12 (123.289001,9.39620018 118.119003,8.07219982) t=0 [23] (123.289001,9.39620018) tEnd=1 newWindSum=? newOppSum=? oppSum=? windSum=? windValue=0 oppValue=0
384*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markDone id=3 (124.603165,9.37966728 124.142731,9.41717815 123.674263,9.45534515 123.289001,9.39610004) t=0.0627286673 [34] (124.516441,9.38671017) tEnd=0.625091708 newWindSum=? newOppSum=? oppSum=? windSum=? windValue=0 oppValue=0
385*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markDone id=3 (124.603165,9.37966728 124.142731,9.41717815 123.674263,9.45534515 123.289001,9.39610004) t=0.625091708 [36] (123.752594,9.42682648) tEnd=1 newWindSum=? newOppSum=? oppSum=? windSum=? windValue=0 oppValue=0
386*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markDone id=10 (126,9.39620018 125.631981,9.29586983 125.12252,9.3373785 124.602829,9.37972069) t=0 [19] (126,9.39620018) tEnd=0.307128906 newWindSum=? newOppSum=? oppSum=? windSum=? windValue=0 oppValue=0
387*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markDone id=10 (126,9.39620018 125.631981,9.29586983 125.12252,9.3373785 124.602829,9.37972069) t=0.307128906 [29] (125.624687,9.33981037) tEnd=0.9375 newWindSum=? newOppSum=? oppSum=? windSum=? windValue=0 oppValue=0
388*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markDone id=1 (0,353.891998 126,9.39610004) t=0 [1] (0,353.891998) tEnd=1 newWindSum=? newOppSum=? oppSum=? windSum=? windValue=0 oppValue=0
389*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markDone id=6 (8.17210007,104.212997 0,259.298737) t=0 [11] (8.17210007,104.212997) tEnd=1 newWindSum=? newOppSum=? oppSum=? windSum=? windValue=0 oppValue=0
390*c8dee2aaSAndroid Build Coastguard Worker-------------------------------------- findOverlaps
391*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=8 (8.17210007,104.212997 -2.71619996e-07,259.298737) t=0 tEnd=0.583904956 windSum=? oppSum=? windValue=1 oppValue=1
392*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=8 (-2.71619996e-07,259.298737 -5.82350016,369.813995) t=0.583904956 tEnd=1 windSum=? windValue=1
393*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=9 (-5.82350016,369.813995 7.26031715e-07,353.891998) t=0 tEnd=0.0441765002 windSum=? windValue=1
394*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=9 (7.26031715e-07,353.891998 126,9.39620018) t=0.0441765002 tEnd=1 windSum=? oppSum=? windValue=1 oppValue=1
395*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=10 (124.700119,9.37182617 124.66775,9.37443162 124.63531,9.3770743 124.602829,9.37972069) t=0.9375 tEnd=1 windSum=? windValue=1
396*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=11 (124.602829,9.37972069 124.574059,9.3820647 124.545259,9.38441166 124.516449,9.38673687) t=0 tEnd=0.0625 windSum=? windValue=1
397*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=11 (124.516449,9.38673687 124.257155,9.40766372 123.997126,9.42685982 123.752594,9.4268837) t=0.0625 tEnd=0.625 windSum=? oppSum=? windValue=1 oppValue=1
398*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=11 (123.752594,9.4268837 123.589573,9.42689962 123.433437,9.41839421 123.289001,9.39620018) t=0.625 tEnd=1 windSum=? oppSum=? windValue=1 oppValue=1
399*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=13 (118.119003,8.07219982 8.17210007,104.212997) t=0 tEnd=1 windSum=? oppSum=? windValue=1 oppValue=1
400*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=2 (126,9.39610004 125.886971,9.36530236 125.760605,9.34788101 125.624695,9.33975124) t=0 tEnd=0.307190555 windSum=? oppSum=? windValue=1 oppValue=1
401*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=2 (125.624695,9.33975124 125.345738,9.3230648 125.026588,9.34552196 124.700119,9.37180042) t=0.307190555 tEnd=0.937702598 windSum=? oppSum=? windValue=1 oppValue=1
402*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=2 (124.700119,9.37180042 124.667862,9.37439685 124.635532,9.37703031 124.603165,9.37966728) t=0.937702598 tEnd=1 windSum=? windValue=1
403*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=3 (124.603165,9.37966728 124.574282,9.38202029 124.545364,9.3843762 124.516441,9.38671017) t=0 tEnd=0.0627286673 windSum=? windValue=1
404*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=4 (123.289001,9.39610004 118.119003,8.07219982) t=0 tEnd=1 windSum=? oppSum=? windValue=1 oppValue=1
405*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=7 (0,259.298737 0,353.891998) t=0 tEnd=1 windSum=? windValue=1
406*c8dee2aaSAndroid Build Coastguard Worker-------------------------------------- calc_angles
407*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::sortAngles [8] tStart=0 [15]
408*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::sortAngles [8] tStart=0.583904956 [27]
409*c8dee2aaSAndroid Build Coastguard WorkerSkOpAngle::after [8/2] 5/5 tStart=0.583904956 tEnd=0 < [7/23] 23/23 tStart=0 tEnd=1 < [8/3] 21/21 tStart=0.583904956 tEnd=1  F 4
410*c8dee2aaSAndroid Build Coastguard WorkerSkOpAngle::afterPart {{{0,259.298737}, {8.17210034,104.212997}}} id=8
411*c8dee2aaSAndroid Build Coastguard WorkerSkOpAngle::afterPart {{{0,259.298737}, {0,353.891998}}} id=7
412*c8dee2aaSAndroid Build Coastguard WorkerSkOpAngle::afterPart {{{0,259.298737}, {-5.82349988,369.813995}}} id=8
413*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::sortAngles [9] tStart=0.0441765002 [28]
414*c8dee2aaSAndroid Build Coastguard WorkerSkOpAngle::after [9/4] 21/21 tStart=0.0441765002 tEnd=0 < [7/24] 7/7 tStart=1 tEnd=0 < [9/5] 5/5 tStart=0.0441765002 tEnd=1  F 4
415*c8dee2aaSAndroid Build Coastguard WorkerSkOpAngle::afterPart {{{0,353.891998}, {-5.82350088,369.813995}}} id=9
416*c8dee2aaSAndroid Build Coastguard WorkerSkOpAngle::afterPart {{{0,353.891998}, {0,259.298737}}} id=7
417*c8dee2aaSAndroid Build Coastguard WorkerSkOpAngle::afterPart {{{0,353.891998}, {125.999999,9.39620018}}} id=9
418*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::sortAngles [9] tStart=1 [18]
419*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::sortAngles [10] tStart=0.9375 [31]
420*c8dee2aaSAndroid Build Coastguard WorkerSkOpAngle::after [10/7] 17/17 tStart=0.9375 tEnd=1 < [2/19] 17/17 tStart=0.937702598 tEnd=1 < [2/18] 1/1 tStart=0.937702598 tEnd=0.307190555  T 12
421*c8dee2aaSAndroid Build Coastguard WorkerSkOpAngle::afterPart {{{124.700119,9.37180042}, {124.66775,9.37440587}, {124.63531,9.37704855}, {124.602829,9.37969494}}} id=10
422*c8dee2aaSAndroid Build Coastguard WorkerSkOpAngle::afterPart {{{124.700119,9.37180042}, {124.667862,9.37439685}, {124.635532,9.37703031}, {124.603165,9.37966728}}} id=2
423*c8dee2aaSAndroid Build Coastguard WorkerSkOpAngle::afterPart {{{124.700119,9.37180042}, {125.026588,9.34552196}, {125.345738,9.3230648}, {125.624695,9.33975124}}} id=2
424*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::sortAngles [11] tStart=0.0625 [33]
425*c8dee2aaSAndroid Build Coastguard WorkerSkOpAngle::after [11/8] 1/1 tStart=0.0625 tEnd=0 < [3/20] 1/1 tStart=0.0627286673 tEnd=0 < [11/9] 17/17 tStart=0.0625 tEnd=0.625  T 12
426*c8dee2aaSAndroid Build Coastguard WorkerSkOpAngle::afterPart {{{124.516441,9.38671017}, {124.545252,9.38438496}, {124.574051,9.382038}, {124.602821,9.37969398}}} id=11
427*c8dee2aaSAndroid Build Coastguard WorkerSkOpAngle::afterPart {{{124.516441,9.38671017}, {124.545364,9.3843762}, {124.574282,9.38202029}, {124.603165,9.37966728}}} id=3
428*c8dee2aaSAndroid Build Coastguard WorkerSkOpAngle::afterPart {{{124.516441,9.38671017}, {124.257148,9.40763702}, {123.997118,9.42683311}, {123.752586,9.42685699}}} id=11
429*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::sortAngles [11] tStart=0.625 [35]
430*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::sortAngles [11] tStart=1 [22]
431*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::sortAngles [13] tStart=0 [25]
432*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::sortAngles [13] tStart=1 [26]
433*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::sortAngles [2] tStart=0 [3]
434*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::sortAngles [2] tStart=0.307190555 [30]
435*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::sortAngles [2] tStart=0.937702598 [32]
436*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::sortAngles [3] tStart=0.0627286673 [34]
437*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::sortAngles [4] tStart=0 [7]
438*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::sortAngles [4] tStart=1 [8]
439*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::sortAngles [7] tStart=0 [13]
440*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::sortAngles [7] tStart=1 [14]
441*c8dee2aaSAndroid Build Coastguard WorkercoinSpan - id=13 t=0 tEnd=1
442*c8dee2aaSAndroid Build Coastguard WorkercoinSpan + id=5 t=0 tEnd=1
443*c8dee2aaSAndroid Build Coastguard WorkercoinSpan - id=4 t=0 tEnd=1
444*c8dee2aaSAndroid Build Coastguard WorkercoinSpan + id=12 t=0 tEnd=1
445*c8dee2aaSAndroid Build Coastguard WorkercoinSpan - id=11 t=0.0625 tEnd=1
446*c8dee2aaSAndroid Build Coastguard WorkercoinSpan + id=3 t=0.0627286673 tEnd=1
447*c8dee2aaSAndroid Build Coastguard WorkercoinSpan - id=2 t=0 tEnd=0.937702598
448*c8dee2aaSAndroid Build Coastguard WorkercoinSpan + id=10 t=0 tEnd=0.9375
449*c8dee2aaSAndroid Build Coastguard WorkercoinSpan - id=9 t=0.0441765002 tEnd=1
450*c8dee2aaSAndroid Build Coastguard WorkercoinSpan + id=1 t=0 tEnd=1
451*c8dee2aaSAndroid Build Coastguard WorkercoinSpan - id=8 t=0 tEnd=0.583904956
452*c8dee2aaSAndroid Build Coastguard WorkercoinSpan + id=6 t=0 tEnd=1
453*c8dee2aaSAndroid Build Coastguard WorkerSkOpSpan::sortableTop dir=kLeft seg=8 t=0.291952478 pt=(4.08605003,181.755859)
454*c8dee2aaSAndroid Build Coastguard WorkerSkOpSpan::sortableTop [0] valid=1 operand=1 span=15 ccw=0 seg=8 {{{8.17210007f, 104.212997f}, {-5.82350016f, 369.813995f}}} t=0.291952478 pt=(4.08605003,181.755859) slope=(-13.9956002,265.600998)
455*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markWinding id=8 (8.17210007,104.212997 -5.82350016,369.813995) t=0 [15] (8.17210007,104.212997) tEnd=0.583904956 newWindSum=1 newOppSum=1 oppSum=1 windSum=1 windValue=1 oppValue=1
456*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markWinding id=8 (8.17210007,104.212997 -5.82350016,369.813995) t=0 [15] (8.17210007,104.212997) tEnd=0.583904956 newWindSum=1 newOppSum=1 oppSum=1 windSum=1 windValue=1 oppValue=1
457*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markWinding id=13 (118.119003,8.07219982 8.17210007,104.212997) t=0 [25] (118.119003,8.07219982) tEnd=1 newWindSum=1 newOppSum=1 oppSum=? windSum=? windValue=1 oppValue=1
458*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markWinding id=4 (123.289001,9.39610004 118.119003,8.07219982) t=0 [7] (123.289001,9.39610004) tEnd=1 newWindSum=1 newOppSum=1 oppSum=? windSum=? windValue=1 oppValue=1
459*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markWinding id=11 (124.602829,9.37972069 124.142509,9.41722488 123.674164,9.45538425 123.289001,9.39620018) t=0.625 [35] (123.752594,9.4268837) tEnd=1 newWindSum=1 newOppSum=1 oppSum=? windSum=? windValue=1 oppValue=1
460*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markWinding id=11 (124.602829,9.37972069 124.142509,9.41722488 123.674164,9.45538425 123.289001,9.39620018) t=0.0625 [33] (124.516449,9.38673687) tEnd=0.625 newWindSum=1 newOppSum=1 oppSum=? windSum=? windValue=1 oppValue=1
461*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::activeOp id=8 t=0.583904956 tEnd=0 op=sect miFrom=1 miTo=0 suFrom=1 suTo=0 result=1
462*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::findNextOp simple
463*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markDone id=8 (8.17210007,104.212997 -5.82350016,369.813995) t=0 [15] (8.17210007,104.212997) tEnd=0.583904956 newWindSum=1 newOppSum=1 oppSum=1 windSum=1 windValue=1 oppValue=1
464*c8dee2aaSAndroid Build Coastguard WorkerbridgeOp current id=8 from=(-2.71619996e-07,259.298737) to=(8.17210007,104.212997)
465*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::findNextOp simple
466*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markDone id=13 (118.119003,8.07219982 8.17210007,104.212997) t=0 [25] (118.119003,8.07219982) tEnd=1 newWindSum=1 newOppSum=1 oppSum=1 windSum=1 windValue=1 oppValue=1
467*c8dee2aaSAndroid Build Coastguard WorkerbridgeOp current id=13 from=(8.17210007,104.212997) to=(118.119003,8.07219982)
468*c8dee2aaSAndroid Build Coastguard Workerpath.moveTo(-2.71619996e-07,259.298737);
469*c8dee2aaSAndroid Build Coastguard Workerpath.lineTo(8.17210007,104.212997);
470*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::findNextOp simple
471*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markDone id=4 (123.289001,9.39610004 118.119003,8.07219982) t=0 [7] (123.289001,9.39610004) tEnd=1 newWindSum=1 newOppSum=1 oppSum=1 windSum=1 windValue=1 oppValue=1
472*c8dee2aaSAndroid Build Coastguard WorkerbridgeOp current id=4 from=(118.119003,8.07219982) to=(123.289001,9.39610004)
473*c8dee2aaSAndroid Build Coastguard Workerpath.lineTo(118.119003,8.07219982);
474*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::findNextOp simple
475*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markDone id=11 (124.602829,9.37972069 124.142509,9.41722488 123.674164,9.45538425 123.289001,9.39620018) t=0.625 [35] (123.752594,9.4268837) tEnd=1 newWindSum=1 newOppSum=1 oppSum=1 windSum=1 windValue=1 oppValue=1
476*c8dee2aaSAndroid Build Coastguard WorkerbridgeOp current id=11 from=(123.289001,9.39620018) to=(123.752594,9.4268837)
477*c8dee2aaSAndroid Build Coastguard Workerpath.lineTo(123.289001,9.39610004);
478*c8dee2aaSAndroid Build Coastguard Workerpath.cubicTo(123.433441,9.41839409, 123.589569,9.42689991, 123.752594,9.4268837);
479*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markWinding id=11 (124.602829,9.37972069 124.142509,9.41722488 123.674164,9.45538425 123.289001,9.39620018) t=0 [21] (124.602829,9.37972069) tEnd=0.0625 newWindSum=1 newOppSum=1 oppSum=? windSum=? windValue=1 oppValue=0
480*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markWinding id=10 (126,9.39620018 125.631981,9.29586983 125.12252,9.3373785 124.602829,9.37972069) t=0.9375 [31] (124.700119,9.37182617) tEnd=1 newWindSum=1 newOppSum=1 oppSum=? windSum=? windValue=1 oppValue=0
481*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markAngle last segment=10 span=31 windSum=1
482*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markWinding id=3 (124.603165,9.37966728 124.142731,9.41717815 123.674263,9.45534515 123.289001,9.39610004) t=0 [5] (124.603165,9.37966728) tEnd=0.0627286673 newWindSum=1 newOppSum=0 oppSum=? windSum=? windValue=1 oppValue=0
483*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markWinding id=2 (126,9.39610004 125.632057,9.29584408 125.122734,9.33733845 124.603165,9.37966728) t=0.937702598 [32] (124.700119,9.37180042) tEnd=1 newWindSum=1 newOppSum=0 oppSum=? windSum=? windValue=1 oppValue=0
484*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markAngle last segment=2 span=32 windSum=1
485*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::findNextOp
486*c8dee2aaSAndroid Build Coastguard WorkerSkOpAngle::dumpOne [11/9] next=11/8 sect=17/17  s=0.0625 [33] e=0.625 [35] sgn=-1 windVal=1 windSum=1 oppVal=1 oppSum=1 operand
487*c8dee2aaSAndroid Build Coastguard WorkerSkOpAngle::dumpOne [11/8] next=3/20 sect=1/1  s=0.0625 [33] e=0 [21] sgn=1 windVal=1 windSum=1 oppVal=0 oppSum=1 operand
488*c8dee2aaSAndroid Build Coastguard WorkerSkOpAngle::dumpOne [3/20] next=11/9 sect=1/1  s=0.0627286673 [34] e=0 [5] sgn=1 windVal=1 windSum=1 oppVal=0 oppSum=0
489*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::activeOp id=11 t=0.0625 tEnd=0 op=sect miFrom=1 miTo=1 suFrom=1 suTo=0 result=1
490*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::findNextOp chase.append segment=10 span=31 windSum=1
491*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::activeOp id=3 t=0.0627286673 tEnd=0 op=sect miFrom=1 miTo=0 suFrom=0 suTo=0 result=0
492*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markDone id=3 (124.603165,9.37966728 124.142731,9.41717815 123.674263,9.45534515 123.289001,9.39610004) t=0 [5] (124.603165,9.37966728) tEnd=0.0627286673 newWindSum=1 newOppSum=0 oppSum=0 windSum=1 windValue=1 oppValue=0
493*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markDone id=2 (126,9.39610004 125.632057,9.29584408 125.122734,9.33733845 124.603165,9.37966728) t=0.937702598 [32] (124.700119,9.37180042) tEnd=1 newWindSum=1 newOppSum=0 oppSum=0 windSum=1 windValue=1 oppValue=0
494*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::findNextOp chase.append segment=2 span=32 windSum=1
495*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markDone id=11 (124.602829,9.37972069 124.142509,9.41722488 123.674164,9.45538425 123.289001,9.39620018) t=0.0625 [33] (124.516449,9.38673687) tEnd=0.625 newWindSum=1 newOppSum=1 oppSum=1 windSum=1 windValue=1 oppValue=1
496*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::findNextOp from:[11] to:[11] start=-1132576784 end=-1353716568
497*c8dee2aaSAndroid Build Coastguard WorkerbridgeOp current id=11 from=(123.752594,9.4268837) to=(124.516449,9.38673687)
498*c8dee2aaSAndroid Build Coastguard Workerpath.cubicTo(123.997124,9.42685986, 124.257156,9.40766335, 124.516449,9.38673687);
499*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::findNextOp simple
500*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markDone id=11 (124.602829,9.37972069 124.142509,9.41722488 123.674164,9.45538425 123.289001,9.39620018) t=0 [21] (124.602829,9.37972069) tEnd=0.0625 newWindSum=1 newOppSum=1 oppSum=1 windSum=1 windValue=1 oppValue=0
501*c8dee2aaSAndroid Build Coastguard WorkerbridgeOp current id=11 from=(124.516449,9.38673687) to=(124.602829,9.37972069)
502*c8dee2aaSAndroid Build Coastguard Workerpath.cubicTo(124.545258,9.38441181, 124.574059,9.38206482, 124.602829,9.37972069);
503*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markWinding id=2 (126,9.39610004 125.632057,9.29584408 125.122734,9.33733845 124.603165,9.37966728) t=0.307190555 [30] (125.624695,9.33975124) tEnd=0.937702598 newWindSum=1 newOppSum=-1 oppSum=? windSum=? windValue=1 oppValue=1
504*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markWinding id=2 (126,9.39610004 125.632057,9.29584408 125.122734,9.33733845 124.603165,9.37966728) t=0 [3] (126,9.39610004) tEnd=0.307190555 newWindSum=1 newOppSum=-1 oppSum=? windSum=? windValue=1 oppValue=1
505*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markWinding id=9 (-5.82350016,369.813995 126,9.39620018) t=0.0441765002 [28] (7.26031715e-07,353.891998) tEnd=1 newWindSum=-1 newOppSum=1 oppSum=? windSum=? windValue=1 oppValue=1
506*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markAngle last segment=9 span=28 windSum=-1
507*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::findNextOp
508*c8dee2aaSAndroid Build Coastguard WorkerSkOpAngle::dumpOne [10/7] next=2/19 sect=17/17  s=0.9375 [31] e=1 [20] sgn=-1 windVal=1 windSum=1 oppVal=0 oppSum=1 operand
509*c8dee2aaSAndroid Build Coastguard WorkerSkOpAngle::dumpOne [2/19] next=2/18 sect=17/17  s=0.937702598 [32] e=1 [4] sgn=-1 windVal=1 windSum=1 oppVal=0 oppSum=0 done
510*c8dee2aaSAndroid Build Coastguard WorkerSkOpAngle::dumpOne [2/18] next=10/7 sect=1/1  s=0.937702598 [32] e=0.307190555 [30] sgn=1 windVal=1 windSum=1 oppVal=1 oppSum=-1
511*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::activeOp id=2 t=0.937702598 tEnd=1 op=sect = result=1
512*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::activeOp id=2 t=0.937702598 tEnd=0.307190555 op=sect miFrom=0 miTo=1 suFrom=1 suTo=0 result=0
513*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markDone id=2 (126,9.39610004 125.632057,9.29584408 125.122734,9.33733845 124.603165,9.37966728) t=0.307190555 [30] (125.624695,9.33975124) tEnd=0.937702598 newWindSum=1 newOppSum=-1 oppSum=-1 windSum=1 windValue=1 oppValue=1
514*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markDone id=2 (126,9.39610004 125.632057,9.29584408 125.122734,9.33733845 124.603165,9.37966728) t=0 [3] (126,9.39610004) tEnd=0.307190555 newWindSum=1 newOppSum=-1 oppSum=-1 windSum=1 windValue=1 oppValue=1
515*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markDone id=9 (-5.82350016,369.813995 126,9.39620018) t=0.0441765002 [28] (7.26031715e-07,353.891998) tEnd=1 newWindSum=-1 newOppSum=1 oppSum=1 windSum=-1 windValue=1 oppValue=1
516*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::findNextOp chase.append segment=9 span=28 windSum=-1
517*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markDone id=10 (126,9.39620018 125.631981,9.29586983 125.12252,9.3373785 124.602829,9.37972069) t=0.9375 [31] (124.700119,9.37182617) tEnd=1 newWindSum=1 newOppSum=1 oppSum=1 windSum=1 windValue=1 oppValue=0
518*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::findNextOp from:[10] to:[2] start=-1132576976 end=-1353719496
519*c8dee2aaSAndroid Build Coastguard WorkerbridgeOp current id=10 from=(124.602829,9.37972069) to=(124.700119,9.37182617)
520*c8dee2aaSAndroid Build Coastguard Workerpath.cubicTo(124.635307,9.37707424, 124.667747,9.37443161, 124.700119,9.37182617);
521*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markWinding id=7 (0,259.298737 0,353.891998) t=0 [13] (0,259.298737) tEnd=1 newWindSum=1 newOppSum=0 oppSum=? windSum=? windValue=1 oppValue=0
522*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markWinding id=9 (-5.82350016,369.813995 126,9.39620018) t=0 [17] (-5.82350016,369.813995) tEnd=0.0441765002 newWindSum=-1 newOppSum=0 oppSum=? windSum=? windValue=1 oppValue=0
523*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markWinding id=8 (8.17210007,104.212997 -5.82350016,369.813995) t=0.583904956 [27] (-2.71619996e-07,259.298737) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=? windSum=? windValue=1 oppValue=0
524*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=8 (-2.71619996e-07,259.298737 -5.82350016,369.813995) t=0.583904956 tEnd=1 windSum=-1 oppSum=0 windValue=1 oppValue=0
525*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=9 (-5.82350016,369.813995 7.26031715e-07,353.891998) t=0 tEnd=0.0441765002 windSum=-1 oppSum=0 windValue=1 oppValue=0
526*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=7 (0,259.298737 0,353.891998) t=0 tEnd=1 windSum=1 oppSum=0 windValue=1 oppValue=0
527*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::activeOp id=7 t=1 tEnd=0 op=sect miFrom=1 miTo=0 suFrom=0 suTo=0 result=0
528*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markDone id=7 (0,259.298737 0,353.891998) t=0 [13] (0,259.298737) tEnd=1 newWindSum=1 newOppSum=0 oppSum=0 windSum=1 windValue=1 oppValue=0
529*c8dee2aaSAndroid Build Coastguard WorkerbridgeOp chase.append id=7 windSum=1
530*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=8 (-2.71619996e-07,259.298737 -5.82350016,369.813995) t=0.583904956 tEnd=1 windSum=-1 oppSum=0 windValue=1 oppValue=0
531*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::debugShowActiveSpans id=9 (-5.82350016,369.813995 7.26031715e-07,353.891998) t=0 tEnd=0.0441765002 windSum=-1 oppSum=0 windValue=1 oppValue=0
532*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::activeOp id=8 t=0.583904956 tEnd=1 op=sect miFrom=0 miTo=0 suFrom=1 suTo=0 result=0
533*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markDone id=8 (8.17210007,104.212997 -5.82350016,369.813995) t=0.583904956 [27] (-2.71619996e-07,259.298737) tEnd=1 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
534*c8dee2aaSAndroid Build Coastguard WorkerSkOpSegment::markDone id=9 (-5.82350016,369.813995 126,9.39620018) t=0 [17] (-5.82350016,369.813995) tEnd=0.0441765002 newWindSum=-1 newOppSum=0 oppSum=0 windSum=-1 windValue=1 oppValue=0
535*c8dee2aaSAndroid Build Coastguard Worker</div>
536*c8dee2aaSAndroid Build Coastguard Worker
537*c8dee2aaSAndroid Build Coastguard Worker
538*c8dee2aaSAndroid Build Coastguard Worker
539*c8dee2aaSAndroid Build Coastguard Worker    </div>
540*c8dee2aaSAndroid Build Coastguard Worker
541*c8dee2aaSAndroid Build Coastguard Worker<script type="text/javascript">
542*c8dee2aaSAndroid Build Coastguard Worker
543*c8dee2aaSAndroid Build Coastguard Worker    var testDivs = [
544*c8dee2aaSAndroid Build Coastguard Worker        bug8380,
545*c8dee2aaSAndroid Build Coastguard Worker    ];
546*c8dee2aaSAndroid Build Coastguard Worker
547*c8dee2aaSAndroid Build Coastguard Workervar decimal_places = 3; // make this 3 to show more precision
548*c8dee2aaSAndroid Build Coastguard Worker
549*c8dee2aaSAndroid Build Coastguard Workervar tests = [];
550*c8dee2aaSAndroid Build Coastguard Workervar testLines = [];
551*c8dee2aaSAndroid Build Coastguard Workervar testTitles = [];
552*c8dee2aaSAndroid Build Coastguard Workervar testIndex = 0;
553*c8dee2aaSAndroid Build Coastguard Workervar ctx;
554*c8dee2aaSAndroid Build Coastguard Worker
555*c8dee2aaSAndroid Build Coastguard Workervar xmin, xmax, focusXmin, focusXmax;
556*c8dee2aaSAndroid Build Coastguard Workervar ymin, ymax, focusYmin, focusYmax;
557*c8dee2aaSAndroid Build Coastguard Workervar scale;
558*c8dee2aaSAndroid Build Coastguard Workervar mouseX, mouseY;
559*c8dee2aaSAndroid Build Coastguard Workervar srcLeft, srcTop;
560*c8dee2aaSAndroid Build Coastguard Workervar screenWidth, screenHeight;
561*c8dee2aaSAndroid Build Coastguard Workervar drawnPts, drawnLines, drawnQuads, drawnConics, drawnCubics;
562*c8dee2aaSAndroid Build Coastguard Workervar curveT = 0;
563*c8dee2aaSAndroid Build Coastguard Worker
564*c8dee2aaSAndroid Build Coastguard Workervar pt_labels = 2;
565*c8dee2aaSAndroid Build Coastguard Workervar collect_bounds = false;
566*c8dee2aaSAndroid Build Coastguard Workervar control_lines = 0;
567*c8dee2aaSAndroid Build Coastguard Workervar curve_t = false;
568*c8dee2aaSAndroid Build Coastguard Workervar debug_xy = 1;
569*c8dee2aaSAndroid Build Coastguard Workervar focus_enabled = false;
570*c8dee2aaSAndroid Build Coastguard Workervar focus_on_selection = false;
571*c8dee2aaSAndroid Build Coastguard Workervar step_limit = 0;
572*c8dee2aaSAndroid Build Coastguard Workervar draw_active = false;
573*c8dee2aaSAndroid Build Coastguard Workervar draw_add = false;
574*c8dee2aaSAndroid Build Coastguard Workervar draw_angle = 0;
575*c8dee2aaSAndroid Build Coastguard Workervar draw_coincidence = false;
576*c8dee2aaSAndroid Build Coastguard Workervar draw_deriviatives = 0;
577*c8dee2aaSAndroid Build Coastguard Workervar draw_direction = false;
578*c8dee2aaSAndroid Build Coastguard Workervar draw_hints = false;
579*c8dee2aaSAndroid Build Coastguard Workervar draw_id = false;
580*c8dee2aaSAndroid Build Coastguard Workervar draw_intersection = 0;
581*c8dee2aaSAndroid Build Coastguard Workervar draw_intersectT = false;
582*c8dee2aaSAndroid Build Coastguard Workervar draw_legend = true;
583*c8dee2aaSAndroid Build Coastguard Workervar draw_log = false;
584*c8dee2aaSAndroid Build Coastguard Workervar draw_mark = false;
585*c8dee2aaSAndroid Build Coastguard Workervar draw_midpoint = false;
586*c8dee2aaSAndroid Build Coastguard Workervar draw_op = 0;
587*c8dee2aaSAndroid Build Coastguard Workervar draw_sequence = false;
588*c8dee2aaSAndroid Build Coastguard Workervar draw_sort = 0;
589*c8dee2aaSAndroid Build Coastguard Workervar draw_top = false;
590*c8dee2aaSAndroid Build Coastguard Workervar draw_path = 3;
591*c8dee2aaSAndroid Build Coastguard Workervar draw_computed = 0;
592*c8dee2aaSAndroid Build Coastguard Workervar retina_scale = !!window.devicePixelRatio;
593*c8dee2aaSAndroid Build Coastguard Worker
594*c8dee2aaSAndroid Build Coastguard Workervar activeCount = 0;
595*c8dee2aaSAndroid Build Coastguard Workervar addCount = 0;
596*c8dee2aaSAndroid Build Coastguard Workervar angleCount = 0;
597*c8dee2aaSAndroid Build Coastguard Workervar coinCount = 0;
598*c8dee2aaSAndroid Build Coastguard Workervar opCount = 0;
599*c8dee2aaSAndroid Build Coastguard Workervar sectCount = 0;
600*c8dee2aaSAndroid Build Coastguard Workervar sortCount = 0;
601*c8dee2aaSAndroid Build Coastguard Workervar topCount = 0;
602*c8dee2aaSAndroid Build Coastguard Workervar markCount = 0;
603*c8dee2aaSAndroid Build Coastguard Workervar activeMax = 0;
604*c8dee2aaSAndroid Build Coastguard Workervar addMax = 0;
605*c8dee2aaSAndroid Build Coastguard Workervar angleMax = 0;
606*c8dee2aaSAndroid Build Coastguard Workervar coinMax = 0;
607*c8dee2aaSAndroid Build Coastguard Workervar sectMax = 0;
608*c8dee2aaSAndroid Build Coastguard Workervar sectMax2 = 0;
609*c8dee2aaSAndroid Build Coastguard Workervar sortMax = 0;
610*c8dee2aaSAndroid Build Coastguard Workervar topMax = 0;
611*c8dee2aaSAndroid Build Coastguard Workervar markMax = 0;
612*c8dee2aaSAndroid Build Coastguard Workervar opMax = 0;
613*c8dee2aaSAndroid Build Coastguard Workervar stepMax = 0;
614*c8dee2aaSAndroid Build Coastguard Workervar lastIndex = 0;
615*c8dee2aaSAndroid Build Coastguard Workervar hasPath = false;
616*c8dee2aaSAndroid Build Coastguard Workervar hasAlignedPath = false;
617*c8dee2aaSAndroid Build Coastguard Workervar hasComputedPath = false;
618*c8dee2aaSAndroid Build Coastguard Workervar angleBetween = false;
619*c8dee2aaSAndroid Build Coastguard Workervar afterIndex = 0;
620*c8dee2aaSAndroid Build Coastguard Worker
621*c8dee2aaSAndroid Build Coastguard Workervar firstActiveSpan = -1;
622*c8dee2aaSAndroid Build Coastguard Workervar logStart = -1;
623*c8dee2aaSAndroid Build Coastguard Workervar logRange = 0;
624*c8dee2aaSAndroid Build Coastguard Worker
625*c8dee2aaSAndroid Build Coastguard Workervar SPAN_ID = 0;
626*c8dee2aaSAndroid Build Coastguard Workervar SPAN_X1 = SPAN_ID + 1;
627*c8dee2aaSAndroid Build Coastguard Workervar SPAN_Y1 = SPAN_X1 + 1;
628*c8dee2aaSAndroid Build Coastguard Workervar SPAN_X2 = SPAN_Y1 + 1;
629*c8dee2aaSAndroid Build Coastguard Workervar SPAN_Y2 = SPAN_X2 + 1;
630*c8dee2aaSAndroid Build Coastguard Worker
631*c8dee2aaSAndroid Build Coastguard Workervar SPAN_L_TX = SPAN_Y2 + 1;
632*c8dee2aaSAndroid Build Coastguard Workervar SPAN_L_TY = SPAN_L_TX + 1;
633*c8dee2aaSAndroid Build Coastguard Workervar SPAN_L_OTHER = SPAN_L_TY + 1;
634*c8dee2aaSAndroid Build Coastguard Workervar SPAN_L_OTHERT = SPAN_L_OTHER + 1;
635*c8dee2aaSAndroid Build Coastguard Workervar SPAN_L_OTHERI = SPAN_L_OTHERT + 1;
636*c8dee2aaSAndroid Build Coastguard Workervar SPAN_L_SUM = SPAN_L_OTHERI + 1;
637*c8dee2aaSAndroid Build Coastguard Workervar SPAN_L_VAL = SPAN_L_SUM + 1;
638*c8dee2aaSAndroid Build Coastguard Workervar SPAN_L_OPP = SPAN_L_VAL + 1;
639*c8dee2aaSAndroid Build Coastguard Worker
640*c8dee2aaSAndroid Build Coastguard Workervar SPAN_X3 = SPAN_Y2 + 1;
641*c8dee2aaSAndroid Build Coastguard Workervar SPAN_Y3 = SPAN_X3 + 1;
642*c8dee2aaSAndroid Build Coastguard Worker
643*c8dee2aaSAndroid Build Coastguard Workervar SPAN_Q_TX = SPAN_Y3 + 1;
644*c8dee2aaSAndroid Build Coastguard Workervar SPAN_Q_TY = SPAN_Q_TX + 1;
645*c8dee2aaSAndroid Build Coastguard Workervar SPAN_Q_OTHER = SPAN_Q_TY + 1;
646*c8dee2aaSAndroid Build Coastguard Workervar SPAN_Q_OTHERT = SPAN_Q_OTHER + 1;
647*c8dee2aaSAndroid Build Coastguard Workervar SPAN_Q_OTHERI = SPAN_Q_OTHERT + 1;
648*c8dee2aaSAndroid Build Coastguard Workervar SPAN_Q_SUM = SPAN_Q_OTHERI + 1;
649*c8dee2aaSAndroid Build Coastguard Workervar SPAN_Q_VAL = SPAN_Q_SUM + 1;
650*c8dee2aaSAndroid Build Coastguard Workervar SPAN_Q_OPP = SPAN_Q_VAL + 1;
651*c8dee2aaSAndroid Build Coastguard Worker
652*c8dee2aaSAndroid Build Coastguard Workervar SPAN_K_W = SPAN_Y3 + 1;
653*c8dee2aaSAndroid Build Coastguard Workervar SPAN_K_TX = SPAN_K_W + 1;
654*c8dee2aaSAndroid Build Coastguard Workervar SPAN_K_TY = SPAN_K_TX + 1;
655*c8dee2aaSAndroid Build Coastguard Workervar SPAN_K_OTHER = SPAN_K_TY + 1;
656*c8dee2aaSAndroid Build Coastguard Workervar SPAN_K_OTHERT = SPAN_K_OTHER + 1;
657*c8dee2aaSAndroid Build Coastguard Workervar SPAN_K_OTHERI = SPAN_K_OTHERT + 1;
658*c8dee2aaSAndroid Build Coastguard Workervar SPAN_K_SUM = SPAN_K_OTHERI + 1;
659*c8dee2aaSAndroid Build Coastguard Workervar SPAN_K_VAL = SPAN_K_SUM + 1;
660*c8dee2aaSAndroid Build Coastguard Workervar SPAN_K_OPP = SPAN_K_VAL + 1;
661*c8dee2aaSAndroid Build Coastguard Worker
662*c8dee2aaSAndroid Build Coastguard Workervar SPAN_X4 = SPAN_Y3 + 1;
663*c8dee2aaSAndroid Build Coastguard Workervar SPAN_Y4 = SPAN_X4 + 1;
664*c8dee2aaSAndroid Build Coastguard Worker
665*c8dee2aaSAndroid Build Coastguard Workervar SPAN_C_TX = SPAN_Y4 + 1;
666*c8dee2aaSAndroid Build Coastguard Workervar SPAN_C_TY = SPAN_C_TX + 1;
667*c8dee2aaSAndroid Build Coastguard Workervar SPAN_C_OTHER = SPAN_C_TY + 1;
668*c8dee2aaSAndroid Build Coastguard Workervar SPAN_C_OTHERT = SPAN_C_OTHER + 1;
669*c8dee2aaSAndroid Build Coastguard Workervar SPAN_C_OTHERI = SPAN_C_OTHERT + 1;
670*c8dee2aaSAndroid Build Coastguard Workervar SPAN_C_SUM = SPAN_C_OTHERI + 1;
671*c8dee2aaSAndroid Build Coastguard Workervar SPAN_C_VAL = SPAN_C_SUM + 1;
672*c8dee2aaSAndroid Build Coastguard Workervar SPAN_C_OPP = SPAN_C_VAL + 1;
673*c8dee2aaSAndroid Build Coastguard Worker
674*c8dee2aaSAndroid Build Coastguard Workervar ACTIVE_LINE_SPAN =        1;
675*c8dee2aaSAndroid Build Coastguard Workervar ACTIVE_QUAD_SPAN =        ACTIVE_LINE_SPAN + 1;
676*c8dee2aaSAndroid Build Coastguard Workervar ACTIVE_CONIC_SPAN =       ACTIVE_QUAD_SPAN + 1;
677*c8dee2aaSAndroid Build Coastguard Workervar ACTIVE_CUBIC_SPAN =       ACTIVE_CONIC_SPAN + 1;
678*c8dee2aaSAndroid Build Coastguard Worker
679*c8dee2aaSAndroid Build Coastguard Workervar ADD_MOVETO =              ACTIVE_CUBIC_SPAN + 1;
680*c8dee2aaSAndroid Build Coastguard Workervar ADD_LINETO =              ADD_MOVETO + 1;
681*c8dee2aaSAndroid Build Coastguard Workervar ADD_QUADTO =              ADD_LINETO + 1;
682*c8dee2aaSAndroid Build Coastguard Workervar ADD_CONICTO =             ADD_QUADTO + 1;
683*c8dee2aaSAndroid Build Coastguard Workervar ADD_CUBICTO =             ADD_CONICTO + 1;
684*c8dee2aaSAndroid Build Coastguard Workervar ADD_CLOSE =               ADD_CUBICTO + 1;
685*c8dee2aaSAndroid Build Coastguard Workervar ADD_FILL =                ADD_CLOSE + 1;
686*c8dee2aaSAndroid Build Coastguard Worker
687*c8dee2aaSAndroid Build Coastguard Workervar PATH_LINE =               ADD_FILL + 1;
688*c8dee2aaSAndroid Build Coastguard Workervar PATH_QUAD =               PATH_LINE + 1;
689*c8dee2aaSAndroid Build Coastguard Workervar PATH_CONIC =              PATH_QUAD + 1;
690*c8dee2aaSAndroid Build Coastguard Workervar PATH_CUBIC =              PATH_CONIC + 1;
691*c8dee2aaSAndroid Build Coastguard Worker
692*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_LINE =          PATH_CUBIC + 1;
693*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_LINE_2 =        INTERSECT_LINE + 1;
694*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_LINE_NO =       INTERSECT_LINE_2 + 1;
695*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_QUAD_LINE =     INTERSECT_LINE_NO + 1;
696*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_QUAD_LINE_2 =   INTERSECT_QUAD_LINE + 1;
697*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_QUAD_LINE_NO =  INTERSECT_QUAD_LINE_2 + 1;
698*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_QUAD =          INTERSECT_QUAD_LINE_NO + 1;
699*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_QUAD_2 =        INTERSECT_QUAD + 1;
700*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_QUAD_NO =       INTERSECT_QUAD_2 + 1;
701*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_CONIC_LINE =    INTERSECT_QUAD_NO + 1;
702*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_CONIC_LINE_2 =  INTERSECT_CONIC_LINE + 1;
703*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_CONIC_LINE_NO = INTERSECT_CONIC_LINE_2 + 1;
704*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_CONIC_QUAD =    INTERSECT_CONIC_LINE_NO + 1;
705*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_CONIC_QUAD_2 =  INTERSECT_CONIC_QUAD + 1;
706*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_CONIC_QUAD_3 =  INTERSECT_CONIC_QUAD_2 + 1;
707*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_CONIC_QUAD_4 =  INTERSECT_CONIC_QUAD_3 + 1;
708*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_CONIC_QUAD_NO = INTERSECT_CONIC_QUAD_4 + 1;
709*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_CONIC =         INTERSECT_CONIC_QUAD_NO + 1;
710*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_CONIC_2 =       INTERSECT_CONIC + 1;
711*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_CONIC_NO =      INTERSECT_CONIC_2 + 1;
712*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_SELF_CUBIC =    INTERSECT_CONIC_NO + 1;
713*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_SELF_CUBIC_NO = INTERSECT_SELF_CUBIC + 1;
714*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_CUBIC_LINE =    INTERSECT_SELF_CUBIC_NO + 1;
715*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_CUBIC_LINE_2 =  INTERSECT_CUBIC_LINE + 1;
716*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_CUBIC_LINE_3 =  INTERSECT_CUBIC_LINE_2 + 1;
717*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_CUBIC_LINE_NO = INTERSECT_CUBIC_LINE_3 + 1;
718*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_CUBIC_QUAD =    INTERSECT_CUBIC_LINE_NO + 1;
719*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_CUBIC_QUAD_2 =  INTERSECT_CUBIC_QUAD + 1;
720*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_CUBIC_QUAD_3 =  INTERSECT_CUBIC_QUAD_2 + 1;
721*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_CUBIC_QUAD_4 =  INTERSECT_CUBIC_QUAD_3 + 1;
722*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_CUBIC_QUAD_NO = INTERSECT_CUBIC_QUAD_4 + 1;
723*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_CUBIC =         INTERSECT_CUBIC_QUAD_NO + 1;
724*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_CUBIC_2 =       INTERSECT_CUBIC + 1;
725*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_CUBIC_3 =       INTERSECT_CUBIC_2 + 1;
726*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_CUBIC_4 =       INTERSECT_CUBIC_3 + 1;
727*c8dee2aaSAndroid Build Coastguard Worker// FIXME: add cubic 5- 9
728*c8dee2aaSAndroid Build Coastguard Workervar INTERSECT_CUBIC_NO =      INTERSECT_CUBIC_4 + 1;
729*c8dee2aaSAndroid Build Coastguard Worker
730*c8dee2aaSAndroid Build Coastguard Workervar SORT_UNARY =              INTERSECT_CUBIC_NO + 1;
731*c8dee2aaSAndroid Build Coastguard Workervar SORT_BINARY =             SORT_UNARY + 1;
732*c8dee2aaSAndroid Build Coastguard Worker
733*c8dee2aaSAndroid Build Coastguard Workervar OP_DIFFERENCE =           SORT_BINARY + 1;
734*c8dee2aaSAndroid Build Coastguard Workervar OP_INTERSECT =            OP_DIFFERENCE + 1;
735*c8dee2aaSAndroid Build Coastguard Workervar OP_UNION =                OP_INTERSECT + 1;
736*c8dee2aaSAndroid Build Coastguard Workervar OP_XOR =                  OP_UNION + 1;
737*c8dee2aaSAndroid Build Coastguard Worker
738*c8dee2aaSAndroid Build Coastguard Workervar MARK_LINE =               OP_XOR + 1;
739*c8dee2aaSAndroid Build Coastguard Workervar MARK_QUAD =               MARK_LINE + 1;
740*c8dee2aaSAndroid Build Coastguard Workervar MARK_CONIC =              MARK_QUAD + 1;
741*c8dee2aaSAndroid Build Coastguard Workervar MARK_CUBIC =              MARK_CONIC + 1;
742*c8dee2aaSAndroid Build Coastguard Workervar MARK_DONE_LINE =          MARK_CUBIC + 1;
743*c8dee2aaSAndroid Build Coastguard Workervar MARK_DONE_QUAD =          MARK_DONE_LINE + 1;
744*c8dee2aaSAndroid Build Coastguard Workervar MARK_DONE_CONIC =         MARK_DONE_QUAD + 1;
745*c8dee2aaSAndroid Build Coastguard Workervar MARK_DONE_CUBIC =         MARK_DONE_CONIC + 1;
746*c8dee2aaSAndroid Build Coastguard Workervar MARK_UNSORTABLE_LINE =    MARK_DONE_CUBIC + 1;
747*c8dee2aaSAndroid Build Coastguard Workervar MARK_UNSORTABLE_QUAD =    MARK_UNSORTABLE_LINE + 1;
748*c8dee2aaSAndroid Build Coastguard Workervar MARK_UNSORTABLE_CONIC =   MARK_UNSORTABLE_QUAD + 1;
749*c8dee2aaSAndroid Build Coastguard Workervar MARK_UNSORTABLE_CUBIC =   MARK_UNSORTABLE_CONIC + 1;
750*c8dee2aaSAndroid Build Coastguard Workervar MARK_SIMPLE_LINE =        MARK_UNSORTABLE_CUBIC + 1;
751*c8dee2aaSAndroid Build Coastguard Workervar MARK_SIMPLE_QUAD =        MARK_SIMPLE_LINE + 1;
752*c8dee2aaSAndroid Build Coastguard Workervar MARK_SIMPLE_CONIC =       MARK_SIMPLE_QUAD + 1;
753*c8dee2aaSAndroid Build Coastguard Workervar MARK_SIMPLE_CUBIC =       MARK_SIMPLE_CONIC + 1;
754*c8dee2aaSAndroid Build Coastguard Workervar MARK_SIMPLE_DONE_LINE =   MARK_SIMPLE_CUBIC + 1;
755*c8dee2aaSAndroid Build Coastguard Workervar MARK_SIMPLE_DONE_QUAD =   MARK_SIMPLE_DONE_LINE + 1;
756*c8dee2aaSAndroid Build Coastguard Workervar MARK_SIMPLE_DONE_CONIC =  MARK_SIMPLE_DONE_QUAD + 1;
757*c8dee2aaSAndroid Build Coastguard Workervar MARK_SIMPLE_DONE_CUBIC =  MARK_SIMPLE_DONE_CONIC + 1;
758*c8dee2aaSAndroid Build Coastguard Workervar MARK_DONE_UNARY_LINE =    MARK_SIMPLE_DONE_CUBIC + 1;
759*c8dee2aaSAndroid Build Coastguard Workervar MARK_DONE_UNARY_QUAD =    MARK_DONE_UNARY_LINE + 1;
760*c8dee2aaSAndroid Build Coastguard Workervar MARK_DONE_UNARY_CONIC =   MARK_DONE_UNARY_QUAD + 1;
761*c8dee2aaSAndroid Build Coastguard Workervar MARK_DONE_UNARY_CUBIC =   MARK_DONE_UNARY_CONIC + 1;
762*c8dee2aaSAndroid Build Coastguard Workervar MARK_ANGLE_LAST =         MARK_DONE_UNARY_CUBIC + 1;
763*c8dee2aaSAndroid Build Coastguard Worker
764*c8dee2aaSAndroid Build Coastguard Workervar COMPUTED_SET_1 =          MARK_ANGLE_LAST + 1;
765*c8dee2aaSAndroid Build Coastguard Workervar COMPUTED_SET_2 =          COMPUTED_SET_1 + 1;
766*c8dee2aaSAndroid Build Coastguard Worker
767*c8dee2aaSAndroid Build Coastguard Workervar ANGLE_AFTER =             COMPUTED_SET_2 + 1;
768*c8dee2aaSAndroid Build Coastguard Workervar ANGLE_AFTERPART =         ANGLE_AFTER + 1;
769*c8dee2aaSAndroid Build Coastguard Worker
770*c8dee2aaSAndroid Build Coastguard Workervar ACTIVE_OP =               ANGLE_AFTERPART + 1;
771*c8dee2aaSAndroid Build Coastguard Worker
772*c8dee2aaSAndroid Build Coastguard Workervar COIN_MAIN_SPAN =          ACTIVE_OP + 1;
773*c8dee2aaSAndroid Build Coastguard Workervar COIN_OPP_SPAN =           COIN_MAIN_SPAN + 1;
774*c8dee2aaSAndroid Build Coastguard Worker
775*c8dee2aaSAndroid Build Coastguard Workervar FRAG_TYPE_LAST =          COIN_OPP_SPAN;
776*c8dee2aaSAndroid Build Coastguard Worker
777*c8dee2aaSAndroid Build Coastguard Workervar REC_TYPE_UNKNOWN = -1;
778*c8dee2aaSAndroid Build Coastguard Workervar REC_TYPE_PATH = 0;
779*c8dee2aaSAndroid Build Coastguard Workervar REC_TYPE_PATH2 = 1;
780*c8dee2aaSAndroid Build Coastguard Workervar REC_TYPE_SECT = 2;
781*c8dee2aaSAndroid Build Coastguard Workervar REC_TYPE_ACTIVE = 3;
782*c8dee2aaSAndroid Build Coastguard Workervar REC_TYPE_ADD = 4;
783*c8dee2aaSAndroid Build Coastguard Workervar REC_TYPE_SORT = 5;
784*c8dee2aaSAndroid Build Coastguard Workervar REC_TYPE_OP = 6;
785*c8dee2aaSAndroid Build Coastguard Workervar REC_TYPE_MARK = 7;
786*c8dee2aaSAndroid Build Coastguard Workervar REC_TYPE_COMPUTED = 8;
787*c8dee2aaSAndroid Build Coastguard Workervar REC_TYPE_COIN = 9;
788*c8dee2aaSAndroid Build Coastguard Workervar REC_TYPE_ANGLE = 10;
789*c8dee2aaSAndroid Build Coastguard Workervar REC_TYPE_ACTIVE_OP = 11;
790*c8dee2aaSAndroid Build Coastguard Workervar REC_TYPE_AFTERPART = 12;
791*c8dee2aaSAndroid Build Coastguard Workervar REC_TYPE_TOP = 13;
792*c8dee2aaSAndroid Build Coastguard Workervar REC_TYPE_COINCIDENCE = 14;
793*c8dee2aaSAndroid Build Coastguard Workervar REC_TYPE_ALIGNED = 15;
794*c8dee2aaSAndroid Build Coastguard Workervar REC_TYPE_LAST = REC_TYPE_ALIGNED;
795*c8dee2aaSAndroid Build Coastguard Worker
796*c8dee2aaSAndroid Build Coastguard Workerfunction strs_to_nums(strs) {
797*c8dee2aaSAndroid Build Coastguard Worker    var result = [];
798*c8dee2aaSAndroid Build Coastguard Worker    for (var idx = 1; idx < strs.length; ++idx) {
799*c8dee2aaSAndroid Build Coastguard Worker        var str = strs[idx];
800*c8dee2aaSAndroid Build Coastguard Worker        var num = parseFloat(str);
801*c8dee2aaSAndroid Build Coastguard Worker        if (isNaN(num)) {
802*c8dee2aaSAndroid Build Coastguard Worker            result.push(str);
803*c8dee2aaSAndroid Build Coastguard Worker        } else {
804*c8dee2aaSAndroid Build Coastguard Worker            result.push(num);
805*c8dee2aaSAndroid Build Coastguard Worker        }
806*c8dee2aaSAndroid Build Coastguard Worker    }
807*c8dee2aaSAndroid Build Coastguard Worker    return result;
808*c8dee2aaSAndroid Build Coastguard Worker}
809*c8dee2aaSAndroid Build Coastguard Worker
810*c8dee2aaSAndroid Build Coastguard Workerfunction filter_str_by(id, str, regex, array) {
811*c8dee2aaSAndroid Build Coastguard Worker    if (regex.test(str)) {
812*c8dee2aaSAndroid Build Coastguard Worker        var strs = regex.exec(str);
813*c8dee2aaSAndroid Build Coastguard Worker        var result = strs_to_nums(strs);
814*c8dee2aaSAndroid Build Coastguard Worker        array.push(id);
815*c8dee2aaSAndroid Build Coastguard Worker        array.push(result);
816*c8dee2aaSAndroid Build Coastguard Worker        return true;
817*c8dee2aaSAndroid Build Coastguard Worker    }
818*c8dee2aaSAndroid Build Coastguard Worker    return false;
819*c8dee2aaSAndroid Build Coastguard Worker}
820*c8dee2aaSAndroid Build Coastguard Worker
821*c8dee2aaSAndroid Build Coastguard Workerfunction construct_regexp2(pattern) {
822*c8dee2aaSAndroid Build Coastguard Worker    var escape = pattern.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
823*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/UNSORTABLE/g, "\\*\\*\\* UNSORTABLE \\*\\*\\*");
824*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/CUBIC_VAL/g, "\\(P_VAL P_VAL P_VAL P_VAL\\)");
825*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/CONIC_VAL/g, "\\(P_VAL P_VAL P_VAL W_VAL\\)");
826*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/QUAD_VAL/g, "\\(P_VAL P_VAL P_VAL\\)");
827*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/LINE_VAL/g, "\\(P_VAL P_VAL\\)");
828*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/FILL_TYPE/g, "SkPath::k[a-zA-Z]+_FillType");
829*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/PTR_VAL/g, "0x[0-9A-F]+");
830*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/PT_VAL/g, "\\(P_VAL\\)");
831*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/P_VAL/g, "(-?\\d+\\.?\\d*(?:e[+-]?\\d+)?)[Ff]?, ?(-?\\d+\\.?\\d*(?:e[+-]?\\d+)?)[Ff]?");
832*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/T_VAL/g, "(-?\\d+\\.?\\d*(?:e[+-]?\\d+)?)");
833*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/W_VAL/g, "(-?\\d+\\.?\\d*(?:e[+-]?\\d+)?)[Ff]?");
834*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/PATH/g, "pathB?");
835*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/IDX/g, "(-?\\d+)");
836*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/NUM/g, "(-?\\d+)");
837*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/OPT/g, "(\\?|-?\\d+)");
838*c8dee2aaSAndroid Build Coastguard Worker    return new RegExp(escape, 'i');
839*c8dee2aaSAndroid Build Coastguard Worker}
840*c8dee2aaSAndroid Build Coastguard Worker
841*c8dee2aaSAndroid Build Coastguard Workerfunction construct_regexp2c(pattern) {
842*c8dee2aaSAndroid Build Coastguard Worker    var escape = pattern.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
843*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/UNSORTABLE/g, "\\*\\*\\* UNSORTABLE \\*\\*\\*");
844*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/CUBIC_VAL/g, "(?:\\$\\d = )?\\{\\{\\{P_VAL\\}, \\{P_VAL\\}, \\{P_VAL\\}, \\{P_VAL\\}\\}\\}");
845*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/CONIC_VAL/g, "(?:\\$\\d = )?\\{\\{\\{\\{P_VAL\\}, \\{P_VAL\\}, \\{P_VAL\\}\\}\\}, W_VAL\\}");
846*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/QUAD_VAL/g, "(?:\\$\\d = )?\\{\\{\\{P_VAL\\}, \\{P_VAL\\}, \\{P_VAL\\}\\}\\}");
847*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/LINE_VAL/g, "(?:\\$\\d = )?\\{\\{\\{P_VAL\\}, \\{P_VAL\\}\\}\\}");
848*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/FILL_TYPE/g, "SkPath::k[a-zA-Z]+_FillType");
849*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/PTR_VAL/g, "0x[0-9A-F]+");
850*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/PT_VAL/g, "\\{\\{P_VAL\\}\\}");
851*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/P_VAL/g, "(?:f?[xX] = )?(-?\\d+\\.?\\d*(?:e[+-]?\\d+)?)[Ff]?, *(?: f?[yY] = )?(-?\\d+\\.?\\d*(?:e[+-]?\\d+)?)[Ff]?");
852*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/T_VAL/g, "(-?\\d+\\.?\\d*(?:e[+-]?\\d+)?)");
853*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/W_VAL/g, "(-?\\d+\\.?\\d*(?:e[+-]?\\d+)?)[Ff]?");
854*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/OPER/g, "[a-z]+");
855*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/PATH/g, "pathB?");
856*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/T_F/g, "([TF])");
857*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/IDX/g, "(-?\\d+)");
858*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/NUM/g, "(-?\\d+)");
859*c8dee2aaSAndroid Build Coastguard Worker    escape = escape.replace(/OPT/g, "(\\?|-?\\d+)");
860*c8dee2aaSAndroid Build Coastguard Worker    return new RegExp(escape, 'i');
861*c8dee2aaSAndroid Build Coastguard Worker}
862*c8dee2aaSAndroid Build Coastguard Worker
863*c8dee2aaSAndroid Build Coastguard Workerfunction match_regexp(str, lineNo, array, id, pattern) {
864*c8dee2aaSAndroid Build Coastguard Worker    var regex = construct_regexp2(pattern);
865*c8dee2aaSAndroid Build Coastguard Worker    if (filter_str_by(id, str, regex, array)) {
866*c8dee2aaSAndroid Build Coastguard Worker        return true;
867*c8dee2aaSAndroid Build Coastguard Worker    }
868*c8dee2aaSAndroid Build Coastguard Worker    regex = construct_regexp2c(pattern);
869*c8dee2aaSAndroid Build Coastguard Worker    return filter_str_by(id, str, regex, array);
870*c8dee2aaSAndroid Build Coastguard Worker}
871*c8dee2aaSAndroid Build Coastguard Worker
872*c8dee2aaSAndroid Build Coastguard Workerfunction endsWith(str, suffix) {
873*c8dee2aaSAndroid Build Coastguard Worker    return str.indexOf(suffix, str.length - suffix.length) !== -1;
874*c8dee2aaSAndroid Build Coastguard Worker}
875*c8dee2aaSAndroid Build Coastguard Worker
876*c8dee2aaSAndroid Build Coastguard Workerfunction parse_all(test) {
877*c8dee2aaSAndroid Build Coastguard Worker    var lines = test.match(/[^\r\n]+/g);
878*c8dee2aaSAndroid Build Coastguard Worker    var records = []; // a rec can be the original paths, a set of intersections, a set of active spans, a sort, or a path add
879*c8dee2aaSAndroid Build Coastguard Worker    var record = [];
880*c8dee2aaSAndroid Build Coastguard Worker    var recType = REC_TYPE_UNKNOWN;
881*c8dee2aaSAndroid Build Coastguard Worker    var lastLineNo;
882*c8dee2aaSAndroid Build Coastguard Worker    var moveX, moveY;
883*c8dee2aaSAndroid Build Coastguard Worker    for (var lineNo = 0; lineNo < lines.length; ++lineNo) {
884*c8dee2aaSAndroid Build Coastguard Worker        var line = lines[lineNo];
885*c8dee2aaSAndroid Build Coastguard Worker        if (line.length == 0) {
886*c8dee2aaSAndroid Build Coastguard Worker            continue;
887*c8dee2aaSAndroid Build Coastguard Worker        }
888*c8dee2aaSAndroid Build Coastguard Worker        var opStart = "SkOpSegment::";
889*c8dee2aaSAndroid Build Coastguard Worker        if (line.lastIndexOf(opStart, 0) === 0) {
890*c8dee2aaSAndroid Build Coastguard Worker            line = line.substr(opStart.length);
891*c8dee2aaSAndroid Build Coastguard Worker        }
892*c8dee2aaSAndroid Build Coastguard Worker        var angleStart = "SkOpAngle::";
893*c8dee2aaSAndroid Build Coastguard Worker        if (line.lastIndexOf(angleStart, 0) === 0) {
894*c8dee2aaSAndroid Build Coastguard Worker            line = line.substr(angleStart.length);
895*c8dee2aaSAndroid Build Coastguard Worker        }
896*c8dee2aaSAndroid Build Coastguard Worker        var coinStart = "SkOpCoincidence::";
897*c8dee2aaSAndroid Build Coastguard Worker        if (line.lastIndexOf(coinStart, 0) === 0) {
898*c8dee2aaSAndroid Build Coastguard Worker            line = line.substr(coinStart.length);
899*c8dee2aaSAndroid Build Coastguard Worker        }
900*c8dee2aaSAndroid Build Coastguard Worker        var type = line.lastIndexOf("debugShowActiveSpans", 0) === 0 ? REC_TYPE_ACTIVE
901*c8dee2aaSAndroid Build Coastguard Worker                : line.lastIndexOf("debugShowCoincidence", 0) === 0 ? REC_TYPE_COINCIDENCE
902*c8dee2aaSAndroid Build Coastguard Worker                : line.lastIndexOf("((SkOpSegment*)", 0) === 0 ? REC_TYPE_PATH2
903*c8dee2aaSAndroid Build Coastguard Worker                : line.lastIndexOf("debugShowTs", 0) === 0 ? REC_TYPE_COIN
904*c8dee2aaSAndroid Build Coastguard Worker                : line.lastIndexOf("afterPart", 0) === 0 ? REC_TYPE_AFTERPART
905*c8dee2aaSAndroid Build Coastguard Worker                : line.lastIndexOf("debugShow", 0) === 0 ? REC_TYPE_SECT
906*c8dee2aaSAndroid Build Coastguard Worker                : line.lastIndexOf("activeOp", 0) === 0 ? REC_TYPE_ACTIVE_OP
907*c8dee2aaSAndroid Build Coastguard Worker                : line.lastIndexOf("computed", 0) === 0 ? REC_TYPE_COMPUTED
908*c8dee2aaSAndroid Build Coastguard Worker                : line.lastIndexOf("debugOne", 0) === 0 ? REC_TYPE_SORT
909*c8dee2aaSAndroid Build Coastguard Worker                : line.lastIndexOf("aligned=", 0) === 0 ? REC_TYPE_ALIGNED
910*c8dee2aaSAndroid Build Coastguard Worker                : line.lastIndexOf("dumpOne", 0) === 0 ? REC_TYPE_SORT
911*c8dee2aaSAndroid Build Coastguard Worker                : line.lastIndexOf("findTop", 0) === 0 ? REC_TYPE_TOP
912*c8dee2aaSAndroid Build Coastguard Worker                : line.lastIndexOf("pathB.", 0) === 0 ? REC_TYPE_ADD
913*c8dee2aaSAndroid Build Coastguard Worker                : line.lastIndexOf("path.", 0) === 0 ? REC_TYPE_ADD
914*c8dee2aaSAndroid Build Coastguard Worker                : line.lastIndexOf("after", 0) === 0 ? REC_TYPE_ANGLE
915*c8dee2aaSAndroid Build Coastguard Worker                : line.lastIndexOf("mark", 0) === 0 ? REC_TYPE_MARK
916*c8dee2aaSAndroid Build Coastguard Worker                : line.lastIndexOf("  {{", 0) === 0 ? REC_TYPE_COMPUTED
917*c8dee2aaSAndroid Build Coastguard Worker                : line.lastIndexOf("seg=", 0) === 0 ? REC_TYPE_PATH
918*c8dee2aaSAndroid Build Coastguard Worker                : line.lastIndexOf("op", 0) === 0 ? REC_TYPE_OP
919*c8dee2aaSAndroid Build Coastguard Worker                : line.lastIndexOf("$", 0) === 0 ? REC_TYPE_PATH
920*c8dee2aaSAndroid Build Coastguard Worker                : REC_TYPE_UNKNOWN;
921*c8dee2aaSAndroid Build Coastguard Worker        if (recType != type || recType == REC_TYPE_ADD || recType == REC_TYPE_SECT
922*c8dee2aaSAndroid Build Coastguard Worker                || recType == REC_TYPE_ACTIVE_OP || recType == REC_TYPE_ANGLE) {
923*c8dee2aaSAndroid Build Coastguard Worker            if (recType != REC_TYPE_UNKNOWN) {
924*c8dee2aaSAndroid Build Coastguard Worker                records.push(recType);
925*c8dee2aaSAndroid Build Coastguard Worker                records.push(lastLineNo);
926*c8dee2aaSAndroid Build Coastguard Worker                records.push(record);
927*c8dee2aaSAndroid Build Coastguard Worker            }
928*c8dee2aaSAndroid Build Coastguard Worker            record = [];
929*c8dee2aaSAndroid Build Coastguard Worker            recType = type;
930*c8dee2aaSAndroid Build Coastguard Worker            lastLineNo = lineNo;
931*c8dee2aaSAndroid Build Coastguard Worker        }
932*c8dee2aaSAndroid Build Coastguard Worker        var found = false;
933*c8dee2aaSAndroid Build Coastguard Worker        switch (recType) {
934*c8dee2aaSAndroid Build Coastguard Worker            case REC_TYPE_ACTIVE:
935*c8dee2aaSAndroid Build Coastguard Worker                found = match_regexp(line, lineNo, record, ACTIVE_LINE_SPAN, "debugShowActiveSpans" +
936*c8dee2aaSAndroid Build Coastguard Worker" id=IDX LINE_VAL t=T_VAL tEnd=T_VAL windSum=OPT windValue=IDX"
937*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, ACTIVE_QUAD_SPAN, "debugShowActiveSpans" +
938*c8dee2aaSAndroid Build Coastguard Worker" id=IDX QUAD_VAL t=T_VAL tEnd=T_VAL windSum=OPT windValue=IDX"
939*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, ACTIVE_CONIC_SPAN, "debugShowActiveSpans" +
940*c8dee2aaSAndroid Build Coastguard Worker" id=IDX CONIC_VAL t=T_VAL tEnd=T_VAL windSum=OPT windValue=IDX"
941*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, ACTIVE_CUBIC_SPAN, "debugShowActiveSpans" +
942*c8dee2aaSAndroid Build Coastguard Worker" id=IDX CUBIC_VAL t=T_VAL tEnd=T_VAL windSum=OPT windValue=IDX"
943*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, ACTIVE_LINE_SPAN, "debugShowActiveSpans" +
944*c8dee2aaSAndroid Build Coastguard Worker" id=IDX LINE_VAL t=T_VAL tEnd=T_VAL windSum=OPT oppSum=OPT windValue=IDX oppValue=NUM"
945*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, ACTIVE_QUAD_SPAN, "debugShowActiveSpans" +
946*c8dee2aaSAndroid Build Coastguard Worker" id=IDX QUAD_VAL t=T_VAL tEnd=T_VAL windSum=OPT oppSum=OPT windValue=IDX oppValue=NUM"
947*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, ACTIVE_CONIC_SPAN, "debugShowActiveSpans" +
948*c8dee2aaSAndroid Build Coastguard Worker" id=IDX CONIC_VAL t=T_VAL tEnd=T_VAL windSum=OPT oppSum=OPT windValue=IDX oppValue=NUM"
949*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, ACTIVE_CUBIC_SPAN, "debugShowActiveSpans" +
950*c8dee2aaSAndroid Build Coastguard Worker" id=IDX CUBIC_VAL t=T_VAL tEnd=T_VAL windSum=OPT oppSum=OPT windValue=IDX oppValue=NUM"
951*c8dee2aaSAndroid Build Coastguard Worker                );
952*c8dee2aaSAndroid Build Coastguard Worker                break;
953*c8dee2aaSAndroid Build Coastguard Worker            case REC_TYPE_ACTIVE_OP:
954*c8dee2aaSAndroid Build Coastguard Worker                found = match_regexp(line, lineNo, record, ACTIVE_OP, "activeOp" +
955*c8dee2aaSAndroid Build Coastguard Worker" id=IDX t=T_VAL tEnd=T_VAL op=OPER miFrom=NUM miTo=NUM suFrom=NUM suTo=NUM result=IDX"
956*c8dee2aaSAndroid Build Coastguard Worker                );
957*c8dee2aaSAndroid Build Coastguard Worker                break;
958*c8dee2aaSAndroid Build Coastguard Worker            case REC_TYPE_ADD:
959*c8dee2aaSAndroid Build Coastguard Worker                if (match_regexp(line, lineNo, record, ADD_MOVETO, "PATH.moveTo(P_VAL);")) {
960*c8dee2aaSAndroid Build Coastguard Worker                    moveX = record[1][0];
961*c8dee2aaSAndroid Build Coastguard Worker                    moveY = record[1][1];
962*c8dee2aaSAndroid Build Coastguard Worker                    found = true;
963*c8dee2aaSAndroid Build Coastguard Worker                } else if (match_regexp(line, lineNo, record, ADD_LINETO, "PATH.lineTo(P_VAL);")) {
964*c8dee2aaSAndroid Build Coastguard Worker                    record[1].unshift(moveY);
965*c8dee2aaSAndroid Build Coastguard Worker                    record[1].unshift(moveX);
966*c8dee2aaSAndroid Build Coastguard Worker                    moveX = record[1][2];
967*c8dee2aaSAndroid Build Coastguard Worker                    moveY = record[1][3];
968*c8dee2aaSAndroid Build Coastguard Worker                    found = true;
969*c8dee2aaSAndroid Build Coastguard Worker                } else if (match_regexp(line, lineNo, record, ADD_QUADTO, "PATH.quadTo(P_VAL, P_VAL);")) {
970*c8dee2aaSAndroid Build Coastguard Worker                    record[1].unshift(moveY);
971*c8dee2aaSAndroid Build Coastguard Worker                    record[1].unshift(moveX);
972*c8dee2aaSAndroid Build Coastguard Worker                    moveX = record[1][4];
973*c8dee2aaSAndroid Build Coastguard Worker                    moveY = record[1][5];
974*c8dee2aaSAndroid Build Coastguard Worker                    found = true;
975*c8dee2aaSAndroid Build Coastguard Worker                } else if (match_regexp(line, lineNo, record, ADD_CONICTO, "PATH.conicTo(P_VAL, P_VAL, T_VAL);")) {
976*c8dee2aaSAndroid Build Coastguard Worker                    record[1].unshift(moveY);
977*c8dee2aaSAndroid Build Coastguard Worker                    record[1].unshift(moveX);
978*c8dee2aaSAndroid Build Coastguard Worker                    moveX = record[1][4];
979*c8dee2aaSAndroid Build Coastguard Worker                    moveY = record[1][5];
980*c8dee2aaSAndroid Build Coastguard Worker                    found = true;
981*c8dee2aaSAndroid Build Coastguard Worker                } else if (match_regexp(line, lineNo, record, ADD_CUBICTO, "PATH.cubicTo(P_VAL, P_VAL, P_VAL);")) {
982*c8dee2aaSAndroid Build Coastguard Worker                    record[1].unshift(moveY);
983*c8dee2aaSAndroid Build Coastguard Worker                    record[1].unshift(moveX);
984*c8dee2aaSAndroid Build Coastguard Worker                    moveX = record[1][6];
985*c8dee2aaSAndroid Build Coastguard Worker                    moveY = record[1][7];
986*c8dee2aaSAndroid Build Coastguard Worker                    found = true;
987*c8dee2aaSAndroid Build Coastguard Worker                } else if (match_regexp(line, lineNo, record, ADD_FILL, "PATH.setFillType(FILL_TYPE);")) {
988*c8dee2aaSAndroid Build Coastguard Worker                    found = true;
989*c8dee2aaSAndroid Build Coastguard Worker                } else {
990*c8dee2aaSAndroid Build Coastguard Worker                    found = match_regexp(line, lineNo, record, ADD_CLOSE, "PATH.close();");
991*c8dee2aaSAndroid Build Coastguard Worker                }
992*c8dee2aaSAndroid Build Coastguard Worker                break;
993*c8dee2aaSAndroid Build Coastguard Worker            case REC_TYPE_AFTERPART:
994*c8dee2aaSAndroid Build Coastguard Worker                found = match_regexp(line, lineNo, record, PATH_LINE, "afterPart LINE_VAL id=IDX")
995*c8dee2aaSAndroid Build Coastguard Worker                    || match_regexp(line, lineNo, record, PATH_QUAD, "afterPart QUAD_VAL id=IDX")
996*c8dee2aaSAndroid Build Coastguard Worker                    || match_regexp(line, lineNo, record, PATH_CONIC, "afterPart CONIC_VAL id=IDX")
997*c8dee2aaSAndroid Build Coastguard Worker                    || match_regexp(line, lineNo, record, PATH_CUBIC, "afterPart CUBIC_VAL id=IDX")
998*c8dee2aaSAndroid Build Coastguard Worker                break;
999*c8dee2aaSAndroid Build Coastguard Worker            case REC_TYPE_ALIGNED:
1000*c8dee2aaSAndroid Build Coastguard Worker                found = match_regexp(line, lineNo, record, PATH_LINE, "aligned=IDX LINE_VAL"
1001*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, PATH_QUAD, "aligned=IDX QUAD_VAL"
1002*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, PATH_CONIC, "aligned=IDX CONIC_VAL"
1003*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, PATH_CUBIC, "aligned=IDX CUBIC_VAL"
1004*c8dee2aaSAndroid Build Coastguard Worker                );
1005*c8dee2aaSAndroid Build Coastguard Worker                break;
1006*c8dee2aaSAndroid Build Coastguard Worker            case REC_TYPE_ANGLE:
1007*c8dee2aaSAndroid Build Coastguard Worker                found = match_regexp(line, lineNo, record, ANGLE_AFTER, "after " +
1008*c8dee2aaSAndroid Build Coastguard Worker"[IDX/IDX] NUM/NUM tStart=T_VAL tEnd=T_VAL < [IDX/IDX] NUM/NUM tStart=T_VAL tEnd=T_VAL < [IDX/IDX] NUM/NUM tStart=T_VAL tEnd=T_VAL  T_F IDX");
1009*c8dee2aaSAndroid Build Coastguard Worker                break;
1010*c8dee2aaSAndroid Build Coastguard Worker            case REC_TYPE_COIN:
1011*c8dee2aaSAndroid Build Coastguard Worker                found = true;
1012*c8dee2aaSAndroid Build Coastguard Worker                break;
1013*c8dee2aaSAndroid Build Coastguard Worker            case REC_TYPE_COINCIDENCE:
1014*c8dee2aaSAndroid Build Coastguard Worker                found = match_regexp(line, lineNo, record, COIN_MAIN_SPAN, "debugShowCoincidence" +
1015*c8dee2aaSAndroid Build Coastguard Worker" + id=IDX t=T_VAL tEnd=T_VAL"
1016*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, COIN_OPP_SPAN, "debugShowCoincidence" +
1017*c8dee2aaSAndroid Build Coastguard Worker" - id=IDX t=T_VAL tEnd=T_VAL"
1018*c8dee2aaSAndroid Build Coastguard Worker                );
1019*c8dee2aaSAndroid Build Coastguard Worker                break;
1020*c8dee2aaSAndroid Build Coastguard Worker            case REC_TYPE_COMPUTED:
1021*c8dee2aaSAndroid Build Coastguard Worker                found = line ==  "computed quadratics given"
1022*c8dee2aaSAndroid Build Coastguard Worker                  || match_regexp(line, lineNo, record, COMPUTED_SET_1, "computed quadratics set 1"
1023*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, COMPUTED_SET_2, "computed quadratics set 2"
1024*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, PATH_QUAD, "  QUAD_VAL,"
1025*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, PATH_CONIC, "  CONIC_VAL,"
1026*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, PATH_CUBIC, "  CUBIC_VAL,"
1027*c8dee2aaSAndroid Build Coastguard Worker                );
1028*c8dee2aaSAndroid Build Coastguard Worker                break;
1029*c8dee2aaSAndroid Build Coastguard Worker            case REC_TYPE_PATH:
1030*c8dee2aaSAndroid Build Coastguard Worker                found = match_regexp(line, lineNo, record, PATH_LINE, "seg=IDX LINE_VAL"
1031*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, PATH_QUAD, "seg=IDX QUAD_VAL"
1032*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, PATH_CONIC, "seg=IDX CONIC_VAL"
1033*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, PATH_CUBIC, "seg=IDX CUBIC_VAL"
1034*c8dee2aaSAndroid Build Coastguard Worker                );
1035*c8dee2aaSAndroid Build Coastguard Worker                break;
1036*c8dee2aaSAndroid Build Coastguard Worker            case REC_TYPE_PATH2:
1037*c8dee2aaSAndroid Build Coastguard Worker                found = match_regexp(line, lineNo, record, PATH_LINE, "((SkOpSegment*) PTR_VAL) [IDX] {LINE_VAL}"
1038*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, PATH_QUAD, "((SkOpSegment*) PTR_VAL) [IDX] {QUAD_VAL}"
1039*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, PATH_CONIC, "((SkOpSegment*) PTR_VAL) [IDX] {CONIC_VAL}"
1040*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, PATH_CUBIC, "((SkOpSegment*) PTR_VAL) [IDX] {CUBIC_VAL}"
1041*c8dee2aaSAndroid Build Coastguard Worker                );
1042*c8dee2aaSAndroid Build Coastguard Worker                break;
1043*c8dee2aaSAndroid Build Coastguard Worker            case REC_TYPE_SECT:
1044*c8dee2aaSAndroid Build Coastguard Worker                found = match_regexp(line, lineNo, record, INTERSECT_LINE, "debugShowLineIntersection" +
1045*c8dee2aaSAndroid Build Coastguard Worker" wtTs[0]=T_VAL LINE_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL"
1046*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_LINE_2, "debugShowLineIntersection" +
1047*c8dee2aaSAndroid Build Coastguard Worker" wtTs[0]=T_VAL LINE_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL wnTs[1]=T_VAL"
1048*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_LINE_NO, "debugShowLineIntersection" +
1049*c8dee2aaSAndroid Build Coastguard Worker" no intersect LINE_VAL LINE_VAL"
1050*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_QUAD_LINE, "debugShowQuadLineIntersection" +
1051*c8dee2aaSAndroid Build Coastguard Worker" wtTs[0]=T_VAL QUAD_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL"
1052*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_QUAD_LINE_2, "debugShowQuadLineIntersection" +
1053*c8dee2aaSAndroid Build Coastguard Worker" wtTs[0]=T_VAL QUAD_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL wnTs[1]=T_VAL"
1054*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_QUAD_LINE_NO, "debugShowQuadLineIntersection" +
1055*c8dee2aaSAndroid Build Coastguard Worker" no intersect QUAD_VAL LINE_VAL"
1056*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_QUAD, "debugShowQuadIntersection" +
1057*c8dee2aaSAndroid Build Coastguard Worker" wtTs[0]=T_VAL QUAD_VAL PT_VAL wnTs[0]=T_VAL QUAD_VAL"
1058*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_QUAD_2, "debugShowQuadIntersection" +
1059*c8dee2aaSAndroid Build Coastguard Worker" wtTs[0]=T_VAL QUAD_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL QUAD_VAL wnTs[1]=T_VAL"
1060*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_QUAD_NO, "debugShowQuadIntersection" +
1061*c8dee2aaSAndroid Build Coastguard Worker" no intersect QUAD_VAL QUAD_VAL"
1062*c8dee2aaSAndroid Build Coastguard Worker
1063*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_CONIC_LINE, "debugShowConicLineIntersection" +
1064*c8dee2aaSAndroid Build Coastguard Worker" wtTs[0]=T_VAL CONIC_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL"
1065*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_CONIC_LINE_2, "debugShowConicLineIntersection" +
1066*c8dee2aaSAndroid Build Coastguard Worker" wtTs[0]=T_VAL CONIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL wnTs[1]=T_VAL"
1067*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_CONIC_LINE_NO, "debugShowConicLineIntersection" +
1068*c8dee2aaSAndroid Build Coastguard Worker" no intersect CONIC_VAL LINE_VAL"
1069*c8dee2aaSAndroid Build Coastguard Worker
1070*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_CONIC_QUAD, "debugShowConicQuadIntersection" +
1071*c8dee2aaSAndroid Build Coastguard Worker" wtTs[0]=T_VAL CONIC_VAL PT_VAL wnTs[0]=T_VAL QUAD_VAL"
1072*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_CONIC_QUAD_2, "debugShowConicQuadIntersection" +
1073*c8dee2aaSAndroid Build Coastguard Worker" wtTs[0]=T_VAL CONIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL QUAD_VAL wnTs[1]=T_VAL"
1074*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_CONIC_QUAD_3, "debugShowConicQuadIntersection" +
1075*c8dee2aaSAndroid Build Coastguard Worker" wtTs[0]=T_VAL CONIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wtTs[2]=T_VAL PT_VAL wnTs[0]=T_VAL QUAD_VAL wnTs[1]=T_VAL wnTs[2]=T_VAL"
1076*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_CONIC_QUAD_4, "debugShowConicQuadIntersection" +
1077*c8dee2aaSAndroid Build Coastguard Worker" wtTs[0]=T_VAL CONIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wtTs[2]=T_VAL PT_VAL wtTs[3]=T_VAL PT_VAL wnTs[0]=T_VAL QUAD_VAL wnTs[1]=T_VAL wnTs[2]=T_VAL wnTs[3]=T_VAL"
1078*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_CONIC_QUAD_NO, "debugShowConicQuadIntersection" +
1079*c8dee2aaSAndroid Build Coastguard Worker" no intersect CONIC_VAL QUAD_VAL"
1080*c8dee2aaSAndroid Build Coastguard Worker
1081*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_CONIC, "debugShowConicIntersection" +
1082*c8dee2aaSAndroid Build Coastguard Worker" wtTs[0]=T_VAL CONIC_VAL PT_VAL wnTs[0]=T_VAL CONIC_VAL"
1083*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_CONIC_2, "debugShowConicIntersection" +
1084*c8dee2aaSAndroid Build Coastguard Worker" wtTs[0]=T_VAL CONIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL CONIC_VAL wnTs[1]=T_VAL"
1085*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_CONIC_NO, "debugShowConicIntersection" +
1086*c8dee2aaSAndroid Build Coastguard Worker" no intersect CONIC_VAL CONIC_VAL"
1087*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_LINE, "debugShowCubicLineIntersection" +
1088*c8dee2aaSAndroid Build Coastguard Worker" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL"
1089*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_LINE_2, "debugShowCubicLineIntersection" +
1090*c8dee2aaSAndroid Build Coastguard Worker" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL wnTs[1]=T_VAL"
1091*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_LINE_3, "debugShowCubicLineIntersection" +
1092*c8dee2aaSAndroid Build Coastguard Worker" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wtTs[2]=T_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL wnTs[1]=T_VAL wnTs[2]=T_VAL"
1093*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_LINE_NO, "debugShowCubicLineIntersection" +
1094*c8dee2aaSAndroid Build Coastguard Worker" no intersect CUBIC_VAL LINE_VAL"
1095*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_QUAD, "debugShowCubicQuadIntersection" +
1096*c8dee2aaSAndroid Build Coastguard Worker" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wnTs[0]=T_VAL QUAD_VAL"
1097*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_QUAD_2, "debugShowCubicQuadIntersection" +
1098*c8dee2aaSAndroid Build Coastguard Worker" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL QUAD_VAL wnTs[1]=T_VAL"
1099*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_QUAD_3, "debugShowCubicQuadIntersection" +
1100*c8dee2aaSAndroid Build Coastguard Worker" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wtTs[2]=T_VAL PT_VAL wnTs[0]=T_VAL QUAD_VAL wnTs[1]=T_VAL wnTs[2]=T_VAL"
1101*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_QUAD_4, "debugShowCubicQuadIntersection" +
1102*c8dee2aaSAndroid Build Coastguard Worker" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wtTs[2]=T_VAL wtTs[3]=T_VAL PT_VAL wnTs[0]=T_VAL QUAD_VAL wnTs[1]=T_VAL wnTs[2]=T_VAL wnTs[3]=T_VAL"
1103*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_QUAD_NO, "debugShowCubicQuadIntersection" +
1104*c8dee2aaSAndroid Build Coastguard Worker" no intersect CUBIC_VAL QUAD_VAL"
1105*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC, "debugShowCubicIntersection" +
1106*c8dee2aaSAndroid Build Coastguard Worker" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wnTs[0]=T_VAL CUBIC_VAL"
1107*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_2, "debugShowCubicIntersection" +
1108*c8dee2aaSAndroid Build Coastguard Worker" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL CUBIC_VAL wnTs[1]=T_VAL"
1109*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_3, "debugShowCubicIntersection" +
1110*c8dee2aaSAndroid Build Coastguard Worker" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wtTs[2]=T_VAL PT_VAL wnTs[0]=T_VAL CUBIC_VAL wnTs[1]=T_VAL wnTs[2]=T_VAL"
1111*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_4, "debugShowCubicIntersection" +
1112*c8dee2aaSAndroid Build Coastguard Worker" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wtTs[2]=T_VAL PT_VAL wtTs[3]=T_VAL PT_VAL wnTs[0]=T_VAL CUBIC_VAL wnTs[1]=T_VAL wnTs[2]=T_VAL wnTs[3]=T_VAL"
1113*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_NO, "debugShowCubicIntersection" +
1114*c8dee2aaSAndroid Build Coastguard Worker" no intersect CUBIC_VAL CUBIC_VAL"
1115*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_SELF_CUBIC, "debugShowCubicIntersection" +
1116*c8dee2aaSAndroid Build Coastguard Worker" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL"
1117*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, INTERSECT_SELF_CUBIC_NO, "debugShowCubicIntersection" +
1118*c8dee2aaSAndroid Build Coastguard Worker" no self intersect CUBIC_VAL"
1119*c8dee2aaSAndroid Build Coastguard Worker                );
1120*c8dee2aaSAndroid Build Coastguard Worker                break;
1121*c8dee2aaSAndroid Build Coastguard Worker            case REC_TYPE_SORT:
1122*c8dee2aaSAndroid Build Coastguard Worker                var hasDone = / done/.test(line);
1123*c8dee2aaSAndroid Build Coastguard Worker                var hasUnorderable = / unorderable/.test(line);
1124*c8dee2aaSAndroid Build Coastguard Worker                var hasSmall = / small/.test(line);
1125*c8dee2aaSAndroid Build Coastguard Worker                var hasTiny = / tiny/.test(line);
1126*c8dee2aaSAndroid Build Coastguard Worker                var hasOperand = / operand/.test(line);
1127*c8dee2aaSAndroid Build Coastguard Worker                var hasStop = / stop/.test(line);
1128*c8dee2aaSAndroid Build Coastguard Worker                line.replace(/[ a-z]+$/, "");
1129*c8dee2aaSAndroid Build Coastguard Worker                found = match_regexp(line, lineNo, record, SORT_UNARY, "debugOne" +
1130*c8dee2aaSAndroid Build Coastguard Worker" [IDX/IDX] next=IDX/IDX sect=IDX/IDX  s=T_VAL [IDX] e=T_VAL [IDX] sgn=NUM windVal=IDX windSum=OPT"
1131*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, SORT_BINARY, "debugOne" +
1132*c8dee2aaSAndroid Build Coastguard Worker" [IDX/IDX] next=IDX/IDX sect=IDX/IDX  s=T_VAL [IDX] e=T_VAL [IDX] sgn=NUM windVal=IDX windSum=OPT oppVal=IDX oppSum=OPT"
1133*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, SORT_UNARY, "dumpOne" +
1134*c8dee2aaSAndroid Build Coastguard Worker" [IDX/IDX] next=IDX/IDX sect=NUM/NUM  s=T_VAL [IDX] e=T_VAL [IDX] sgn=NUM windVal=IDX windSum=OPT"
1135*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, SORT_BINARY, "dumpOne" +
1136*c8dee2aaSAndroid Build Coastguard Worker" [IDX/IDX] next=IDX/IDX sect=NUM/NUM  s=T_VAL [IDX] e=T_VAL [IDX] sgn=NUM windVal=IDX windSum=OPT oppVal=IDX oppSum=OPT"
1137*c8dee2aaSAndroid Build Coastguard Worker                );
1138*c8dee2aaSAndroid Build Coastguard Worker                if (found) {
1139*c8dee2aaSAndroid Build Coastguard Worker                    record[1].push(hasDone);
1140*c8dee2aaSAndroid Build Coastguard Worker                    record[1].push(hasUnorderable);
1141*c8dee2aaSAndroid Build Coastguard Worker                    record[1].push(hasSmall);
1142*c8dee2aaSAndroid Build Coastguard Worker                    record[1].push(hasTiny);
1143*c8dee2aaSAndroid Build Coastguard Worker                    record[1].push(hasOperand);
1144*c8dee2aaSAndroid Build Coastguard Worker                    record[1].push(hasStop);
1145*c8dee2aaSAndroid Build Coastguard Worker                }
1146*c8dee2aaSAndroid Build Coastguard Worker                break;
1147*c8dee2aaSAndroid Build Coastguard Worker            case REC_TYPE_TOP:
1148*c8dee2aaSAndroid Build Coastguard Worker                found = match_regexp(line, lineNo, record, ACTIVE_OP, "findTop" +
1149*c8dee2aaSAndroid Build Coastguard Worker" id=IDX s=T_VAL e=T_VAL cw=NUM swap=NUM inflections=NUM monotonic=NUM"
1150*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, ACTIVE_OP, "findTop" +
1151*c8dee2aaSAndroid Build Coastguard Worker" id=IDX s=T_VAL e=T_VAL (-) cw=NUM swap=NUM inflections=NUM monotonic=NUM"
1152*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, ACTIVE_OP, "findTop" +
1153*c8dee2aaSAndroid Build Coastguard Worker" id=IDX s=T_VAL e=T_VAL (+) cw=NUM swap=NUM inflections=NUM monotonic=NUM"
1154*c8dee2aaSAndroid Build Coastguard Worker                );
1155*c8dee2aaSAndroid Build Coastguard Worker                break;
1156*c8dee2aaSAndroid Build Coastguard Worker            case REC_TYPE_MARK:
1157*c8dee2aaSAndroid Build Coastguard Worker                found = match_regexp(line, lineNo, record, MARK_LINE, "markWinding" +
1158*c8dee2aaSAndroid Build Coastguard Worker" id=IDX LINE_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX"
1159*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, MARK_QUAD, "markWinding" +
1160*c8dee2aaSAndroid Build Coastguard Worker" id=IDX QUAD_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX"
1161*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, MARK_CONIC, "markWinding" +
1162*c8dee2aaSAndroid Build Coastguard Worker" id=IDX CONIC_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX"
1163*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, MARK_CUBIC, "markWinding" +
1164*c8dee2aaSAndroid Build Coastguard Worker" id=IDX CUBIC_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX"
1165*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, MARK_DONE_LINE, "markDone" +
1166*c8dee2aaSAndroid Build Coastguard Worker" id=IDX LINE_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=OPT newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX oppValue=OPT"
1167*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, MARK_DONE_QUAD, "markDone" +
1168*c8dee2aaSAndroid Build Coastguard Worker" id=IDX QUAD_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=OPT newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX oppValue=OPT"
1169*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, MARK_DONE_CONIC, "markDone" +
1170*c8dee2aaSAndroid Build Coastguard Worker" id=IDX CONIC_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=OPT newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX oppValue=OPT"
1171*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, MARK_DONE_CUBIC, "markDone" +
1172*c8dee2aaSAndroid Build Coastguard Worker" id=IDX CUBIC_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=OPT newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX oppValue=OPT"
1173*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, MARK_SIMPLE_LINE, "markWinding" +
1174*c8dee2aaSAndroid Build Coastguard Worker" id=IDX LINE_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM windSum=OPT windValue=IDX"
1175*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, MARK_SIMPLE_QUAD, "markWinding" +
1176*c8dee2aaSAndroid Build Coastguard Worker" id=IDX QUAD_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM windSum=OPT windValue=IDX"
1177*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, MARK_SIMPLE_CONIC, "markWinding" +
1178*c8dee2aaSAndroid Build Coastguard Worker" id=IDX CONIC_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM windSum=OPT windValue=IDX"
1179*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, MARK_SIMPLE_CUBIC, "markWinding" +
1180*c8dee2aaSAndroid Build Coastguard Worker" id=IDX CUBIC_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM windSum=OPT windValue=IDX"
1181*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, MARK_ANGLE_LAST, "markAngle" +
1182*c8dee2aaSAndroid Build Coastguard Worker" last segment=IDX span=IDX"
1183*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, MARK_ANGLE_LAST, "markAngle" +
1184*c8dee2aaSAndroid Build Coastguard Worker" last seg=IDX span=IDX"
1185*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, MARK_ANGLE_LAST, "markAngle" +
1186*c8dee2aaSAndroid Build Coastguard Worker" last segment=IDX span=IDX windSum=OPT"
1187*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, MARK_ANGLE_LAST, "markAngle" +
1188*c8dee2aaSAndroid Build Coastguard Worker" last seg=IDX span=IDX windSum=OPT"
1189*c8dee2aaSAndroid Build Coastguard Worker                );
1190*c8dee2aaSAndroid Build Coastguard Worker                break;
1191*c8dee2aaSAndroid Build Coastguard Worker            case REC_TYPE_OP:
1192*c8dee2aaSAndroid Build Coastguard Worker                if (line.lastIndexOf("oppSign oppSign=", 0) === 0
1193*c8dee2aaSAndroid Build Coastguard Worker                        || line.lastIndexOf("operator<", 0) === 0) {
1194*c8dee2aaSAndroid Build Coastguard Worker                    found = true;
1195*c8dee2aaSAndroid Build Coastguard Worker                    break;
1196*c8dee2aaSAndroid Build Coastguard Worker                }
1197*c8dee2aaSAndroid Build Coastguard Worker                found = match_regexp(line, lineNo, record, OP_DIFFERENCE, "op diff"
1198*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, OP_INTERSECT, "op intersect"
1199*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, OP_INTERSECT, "op sect"
1200*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, OP_UNION, "op union"
1201*c8dee2aaSAndroid Build Coastguard Worker                ) || match_regexp(line, lineNo, record, OP_XOR, "op xor"
1202*c8dee2aaSAndroid Build Coastguard Worker                );
1203*c8dee2aaSAndroid Build Coastguard Worker                break;
1204*c8dee2aaSAndroid Build Coastguard Worker            case REC_TYPE_UNKNOWN:
1205*c8dee2aaSAndroid Build Coastguard Worker                found = true;
1206*c8dee2aaSAndroid Build Coastguard Worker                break;
1207*c8dee2aaSAndroid Build Coastguard Worker        }
1208*c8dee2aaSAndroid Build Coastguard Worker        if (!found) {
1209*c8dee2aaSAndroid Build Coastguard Worker            console.log(line + " [" + lineNo + "] of type " + type + " not found");
1210*c8dee2aaSAndroid Build Coastguard Worker        }
1211*c8dee2aaSAndroid Build Coastguard Worker    }
1212*c8dee2aaSAndroid Build Coastguard Worker    if (recType != REC_TYPE_UNKNOWN) {
1213*c8dee2aaSAndroid Build Coastguard Worker        records.push(recType);
1214*c8dee2aaSAndroid Build Coastguard Worker        records.push(lastLineNo);
1215*c8dee2aaSAndroid Build Coastguard Worker        records.push(record);
1216*c8dee2aaSAndroid Build Coastguard Worker    }
1217*c8dee2aaSAndroid Build Coastguard Worker    if (records.length >= 1) {
1218*c8dee2aaSAndroid Build Coastguard Worker        tests[testIndex] = records;
1219*c8dee2aaSAndroid Build Coastguard Worker        testLines[testIndex] = lines;
1220*c8dee2aaSAndroid Build Coastguard Worker    }
1221*c8dee2aaSAndroid Build Coastguard Worker}
1222*c8dee2aaSAndroid Build Coastguard Worker
1223*c8dee2aaSAndroid Build Coastguard Workerfunction init(test) {
1224*c8dee2aaSAndroid Build Coastguard Worker    var canvas = document.getElementById('canvas');
1225*c8dee2aaSAndroid Build Coastguard Worker    if (!canvas.getContext) return;
1226*c8dee2aaSAndroid Build Coastguard Worker    ctx = canvas.getContext('2d');
1227*c8dee2aaSAndroid Build Coastguard Worker    var resScale = retina_scale && window.devicePixelRatio ? window.devicePixelRatio : 1;
1228*c8dee2aaSAndroid Build Coastguard Worker    var unscaledWidth = window.innerWidth - 20;
1229*c8dee2aaSAndroid Build Coastguard Worker    var unscaledHeight = window.innerHeight - 20;
1230*c8dee2aaSAndroid Build Coastguard Worker    screenWidth = unscaledWidth;
1231*c8dee2aaSAndroid Build Coastguard Worker    screenHeight = unscaledHeight;
1232*c8dee2aaSAndroid Build Coastguard Worker    canvas.width = unscaledWidth * resScale;
1233*c8dee2aaSAndroid Build Coastguard Worker    canvas.height = unscaledHeight * resScale;
1234*c8dee2aaSAndroid Build Coastguard Worker    canvas.style.width = unscaledWidth + 'px';
1235*c8dee2aaSAndroid Build Coastguard Worker    canvas.style.height = unscaledHeight + 'px';
1236*c8dee2aaSAndroid Build Coastguard Worker    if (resScale != 1) {
1237*c8dee2aaSAndroid Build Coastguard Worker        ctx.scale(resScale, resScale);
1238*c8dee2aaSAndroid Build Coastguard Worker    }
1239*c8dee2aaSAndroid Build Coastguard Worker    xmin = Infinity;
1240*c8dee2aaSAndroid Build Coastguard Worker    xmax = -Infinity;
1241*c8dee2aaSAndroid Build Coastguard Worker    ymin = Infinity;
1242*c8dee2aaSAndroid Build Coastguard Worker    ymax = -Infinity;
1243*c8dee2aaSAndroid Build Coastguard Worker    hasPath = hasAlignedPath = hasComputedPath = false;
1244*c8dee2aaSAndroid Build Coastguard Worker    firstActiveSpan = -1;
1245*c8dee2aaSAndroid Build Coastguard Worker    for (var tIndex = 0; tIndex < test.length; tIndex += 3) {
1246*c8dee2aaSAndroid Build Coastguard Worker        var recType = test[tIndex];
1247*c8dee2aaSAndroid Build Coastguard Worker        if (!typeof recType == 'number' || recType < REC_TYPE_UNKNOWN || recType > REC_TYPE_LAST) {
1248*c8dee2aaSAndroid Build Coastguard Worker            console.log("unknown rec type: " + recType);
1249*c8dee2aaSAndroid Build Coastguard Worker            throw "stop execution";
1250*c8dee2aaSAndroid Build Coastguard Worker        }
1251*c8dee2aaSAndroid Build Coastguard Worker        var records = test[tIndex + 2];
1252*c8dee2aaSAndroid Build Coastguard Worker        for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
1253*c8dee2aaSAndroid Build Coastguard Worker            var fragType = records[recordIndex];
1254*c8dee2aaSAndroid Build Coastguard Worker            if (!typeof fragType == 'number' || fragType < 1 || fragType > FRAG_TYPE_LAST) {
1255*c8dee2aaSAndroid Build Coastguard Worker                console.log("unknown in range frag type: " + fragType);
1256*c8dee2aaSAndroid Build Coastguard Worker                throw "stop execution";
1257*c8dee2aaSAndroid Build Coastguard Worker            }
1258*c8dee2aaSAndroid Build Coastguard Worker            var frags = records[recordIndex + 1];
1259*c8dee2aaSAndroid Build Coastguard Worker            var first = 0;
1260*c8dee2aaSAndroid Build Coastguard Worker            var last = -1;
1261*c8dee2aaSAndroid Build Coastguard Worker            var first2 = 0;
1262*c8dee2aaSAndroid Build Coastguard Worker            var last2 = 0;
1263*c8dee2aaSAndroid Build Coastguard Worker            switch (recType) {
1264*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_ALIGNED:
1265*c8dee2aaSAndroid Build Coastguard Worker                    hasAlignedPath = true;
1266*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_COMPUTED:
1267*c8dee2aaSAndroid Build Coastguard Worker                    if (fragType == COMPUTED_SET_1 || fragType == COMPUTED_SET_2) {
1268*c8dee2aaSAndroid Build Coastguard Worker                        break;
1269*c8dee2aaSAndroid Build Coastguard Worker                    }
1270*c8dee2aaSAndroid Build Coastguard Worker                    if (REC_TYPE_COMPUTED == recType) {
1271*c8dee2aaSAndroid Build Coastguard Worker                        hasComputedPath = true;
1272*c8dee2aaSAndroid Build Coastguard Worker                    }
1273*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_PATH:
1274*c8dee2aaSAndroid Build Coastguard Worker                    first = 1;
1275*c8dee2aaSAndroid Build Coastguard Worker                    switch (fragType) {
1276*c8dee2aaSAndroid Build Coastguard Worker                        case PATH_LINE:
1277*c8dee2aaSAndroid Build Coastguard Worker                            last = 5;
1278*c8dee2aaSAndroid Build Coastguard Worker                            break;
1279*c8dee2aaSAndroid Build Coastguard Worker                        case PATH_CONIC:
1280*c8dee2aaSAndroid Build Coastguard Worker                        case PATH_QUAD:
1281*c8dee2aaSAndroid Build Coastguard Worker                            last = 7;
1282*c8dee2aaSAndroid Build Coastguard Worker                            break;
1283*c8dee2aaSAndroid Build Coastguard Worker                        case PATH_CUBIC:
1284*c8dee2aaSAndroid Build Coastguard Worker                            last = 9;
1285*c8dee2aaSAndroid Build Coastguard Worker                            break;
1286*c8dee2aaSAndroid Build Coastguard Worker                        default:
1287*c8dee2aaSAndroid Build Coastguard Worker                            console.log("unknown " + (recType == REC_TYPE_PATH ? "REC_TYPE_PATH"
1288*c8dee2aaSAndroid Build Coastguard Worker                                    : "REC_TYPE_COMPUTED") + " frag type:" + fragType);
1289*c8dee2aaSAndroid Build Coastguard Worker                            throw "stop execution";
1290*c8dee2aaSAndroid Build Coastguard Worker                    }
1291*c8dee2aaSAndroid Build Coastguard Worker                    if (recType == REC_TYPE_PATH) {
1292*c8dee2aaSAndroid Build Coastguard Worker                        hasPath = true;
1293*c8dee2aaSAndroid Build Coastguard Worker                    }
1294*c8dee2aaSAndroid Build Coastguard Worker                    break;
1295*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_PATH2:
1296*c8dee2aaSAndroid Build Coastguard Worker                    first = 1;
1297*c8dee2aaSAndroid Build Coastguard Worker                    switch (fragType) {
1298*c8dee2aaSAndroid Build Coastguard Worker                        case PATH_LINE:
1299*c8dee2aaSAndroid Build Coastguard Worker                            last = 5;
1300*c8dee2aaSAndroid Build Coastguard Worker                            break;
1301*c8dee2aaSAndroid Build Coastguard Worker                        case PATH_CONIC:
1302*c8dee2aaSAndroid Build Coastguard Worker                        case PATH_QUAD:
1303*c8dee2aaSAndroid Build Coastguard Worker                            last = 7;
1304*c8dee2aaSAndroid Build Coastguard Worker                            break;
1305*c8dee2aaSAndroid Build Coastguard Worker                        case PATH_CUBIC:
1306*c8dee2aaSAndroid Build Coastguard Worker                            last = 9;
1307*c8dee2aaSAndroid Build Coastguard Worker                            break;
1308*c8dee2aaSAndroid Build Coastguard Worker                        default:
1309*c8dee2aaSAndroid Build Coastguard Worker                            console.log("unknown " + (recType == REC_TYPE_PATH2 ? "REC_TYPE_PATH2"
1310*c8dee2aaSAndroid Build Coastguard Worker                                    : "REC_TYPE_COMPUTED") + " frag type:" + fragType);
1311*c8dee2aaSAndroid Build Coastguard Worker                            throw "stop execution";
1312*c8dee2aaSAndroid Build Coastguard Worker                    }
1313*c8dee2aaSAndroid Build Coastguard Worker                    if (recType == REC_TYPE_PATH2) {
1314*c8dee2aaSAndroid Build Coastguard Worker                        hasPath = true;
1315*c8dee2aaSAndroid Build Coastguard Worker                    }
1316*c8dee2aaSAndroid Build Coastguard Worker                    break;
1317*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_ACTIVE:
1318*c8dee2aaSAndroid Build Coastguard Worker                    if (firstActiveSpan < 0) {
1319*c8dee2aaSAndroid Build Coastguard Worker                        firstActiveSpan = tIndex;
1320*c8dee2aaSAndroid Build Coastguard Worker                    }
1321*c8dee2aaSAndroid Build Coastguard Worker                    first = 1;
1322*c8dee2aaSAndroid Build Coastguard Worker                    switch (fragType) {
1323*c8dee2aaSAndroid Build Coastguard Worker                        case ACTIVE_LINE_SPAN:
1324*c8dee2aaSAndroid Build Coastguard Worker                            last = 5;
1325*c8dee2aaSAndroid Build Coastguard Worker                            break;
1326*c8dee2aaSAndroid Build Coastguard Worker                        case ACTIVE_CONIC_SPAN:
1327*c8dee2aaSAndroid Build Coastguard Worker                        case ACTIVE_QUAD_SPAN:
1328*c8dee2aaSAndroid Build Coastguard Worker                            last = 7;
1329*c8dee2aaSAndroid Build Coastguard Worker                            break;
1330*c8dee2aaSAndroid Build Coastguard Worker                        case ACTIVE_CUBIC_SPAN:
1331*c8dee2aaSAndroid Build Coastguard Worker                            last = 9;
1332*c8dee2aaSAndroid Build Coastguard Worker                            break;
1333*c8dee2aaSAndroid Build Coastguard Worker                        default:
1334*c8dee2aaSAndroid Build Coastguard Worker                            console.log("unknown REC_TYPE_ACTIVE frag type: " + fragType);
1335*c8dee2aaSAndroid Build Coastguard Worker                            throw "stop execution";
1336*c8dee2aaSAndroid Build Coastguard Worker                    }
1337*c8dee2aaSAndroid Build Coastguard Worker                    break;
1338*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_ADD:
1339*c8dee2aaSAndroid Build Coastguard Worker                    switch (fragType) {
1340*c8dee2aaSAndroid Build Coastguard Worker                        case ADD_MOVETO:
1341*c8dee2aaSAndroid Build Coastguard Worker                            break;
1342*c8dee2aaSAndroid Build Coastguard Worker                        case ADD_LINETO:
1343*c8dee2aaSAndroid Build Coastguard Worker                            last = 4;
1344*c8dee2aaSAndroid Build Coastguard Worker                            break;
1345*c8dee2aaSAndroid Build Coastguard Worker                        case ADD_CONICTO:
1346*c8dee2aaSAndroid Build Coastguard Worker                        case ADD_QUADTO:
1347*c8dee2aaSAndroid Build Coastguard Worker                            last = 6;
1348*c8dee2aaSAndroid Build Coastguard Worker                            break;
1349*c8dee2aaSAndroid Build Coastguard Worker                        case ADD_CUBICTO:
1350*c8dee2aaSAndroid Build Coastguard Worker                            last = 8;
1351*c8dee2aaSAndroid Build Coastguard Worker                            break;
1352*c8dee2aaSAndroid Build Coastguard Worker                        case ADD_CLOSE:
1353*c8dee2aaSAndroid Build Coastguard Worker                        case ADD_FILL:
1354*c8dee2aaSAndroid Build Coastguard Worker                            break;
1355*c8dee2aaSAndroid Build Coastguard Worker                        default:
1356*c8dee2aaSAndroid Build Coastguard Worker                            console.log("unknown REC_TYPE_ADD frag type: " + fragType);
1357*c8dee2aaSAndroid Build Coastguard Worker                            throw "stop execution";
1358*c8dee2aaSAndroid Build Coastguard Worker                    }
1359*c8dee2aaSAndroid Build Coastguard Worker                    break;
1360*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_AFTERPART:
1361*c8dee2aaSAndroid Build Coastguard Worker                    switch (fragType) {
1362*c8dee2aaSAndroid Build Coastguard Worker                        case PATH_LINE:
1363*c8dee2aaSAndroid Build Coastguard Worker                            last = 4;
1364*c8dee2aaSAndroid Build Coastguard Worker                            break;
1365*c8dee2aaSAndroid Build Coastguard Worker                        case PATH_CONIC:
1366*c8dee2aaSAndroid Build Coastguard Worker                        case PATH_QUAD:
1367*c8dee2aaSAndroid Build Coastguard Worker                            last = 6;
1368*c8dee2aaSAndroid Build Coastguard Worker                            break;
1369*c8dee2aaSAndroid Build Coastguard Worker                        case PATH_CUBIC:
1370*c8dee2aaSAndroid Build Coastguard Worker                            last = 8;
1371*c8dee2aaSAndroid Build Coastguard Worker                            break;
1372*c8dee2aaSAndroid Build Coastguard Worker                        default:
1373*c8dee2aaSAndroid Build Coastguard Worker                            console.log("unknown REC_TYPE_ACTIVEPART frag type: " + fragType);
1374*c8dee2aaSAndroid Build Coastguard Worker                            throw "stop execution";
1375*c8dee2aaSAndroid Build Coastguard Worker                    }
1376*c8dee2aaSAndroid Build Coastguard Worker                    break;
1377*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_SECT:
1378*c8dee2aaSAndroid Build Coastguard Worker                    switch (fragType) {
1379*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_LINE:
1380*c8dee2aaSAndroid Build Coastguard Worker                            first = 1; last = 5; first2 = 8; last2 = 12;
1381*c8dee2aaSAndroid Build Coastguard Worker                            break;
1382*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_LINE_2:
1383*c8dee2aaSAndroid Build Coastguard Worker                            first = 1; last = 5; first2 = 11; last2 = 15;
1384*c8dee2aaSAndroid Build Coastguard Worker                            break;
1385*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_LINE_NO:
1386*c8dee2aaSAndroid Build Coastguard Worker                            first = 0; last = 4; first2 = 4; last2 = 8;
1387*c8dee2aaSAndroid Build Coastguard Worker                            break;
1388*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CONIC_LINE:
1389*c8dee2aaSAndroid Build Coastguard Worker                            first = 1; last = 7; first2 = 11; last2 = 15;
1390*c8dee2aaSAndroid Build Coastguard Worker                            break;
1391*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_QUAD_LINE:
1392*c8dee2aaSAndroid Build Coastguard Worker                            first = 1; last = 7; first2 = 10; last2 = 14;
1393*c8dee2aaSAndroid Build Coastguard Worker                            break;
1394*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CONIC_LINE_2:
1395*c8dee2aaSAndroid Build Coastguard Worker                            first = 1; last = 7; first2 = 14; last2 = 18;
1396*c8dee2aaSAndroid Build Coastguard Worker                            break;
1397*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_QUAD_LINE_2:
1398*c8dee2aaSAndroid Build Coastguard Worker                            first = 1; last = 7; first2 = 13; last2 = 17;
1399*c8dee2aaSAndroid Build Coastguard Worker                            break;
1400*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CONIC_LINE_NO:
1401*c8dee2aaSAndroid Build Coastguard Worker                            first = 0; last = 6; first2 = 7; last2 = 11;
1402*c8dee2aaSAndroid Build Coastguard Worker                            break;
1403*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_QUAD_LINE_NO:
1404*c8dee2aaSAndroid Build Coastguard Worker                            first = 0; last = 6; first2 = 6; last2 = 10;
1405*c8dee2aaSAndroid Build Coastguard Worker                            break;
1406*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CONIC:
1407*c8dee2aaSAndroid Build Coastguard Worker                            first = 1; last = 7; first2 = 11; last2 = 17;
1408*c8dee2aaSAndroid Build Coastguard Worker                            break;
1409*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_QUAD:
1410*c8dee2aaSAndroid Build Coastguard Worker                            first = 1; last = 7; first2 = 10; last2 = 16;
1411*c8dee2aaSAndroid Build Coastguard Worker                            break;
1412*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CONIC_2:
1413*c8dee2aaSAndroid Build Coastguard Worker                            first = 1; last = 7; first2 = 14; last2 = 20;
1414*c8dee2aaSAndroid Build Coastguard Worker                            break;
1415*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_QUAD_2:
1416*c8dee2aaSAndroid Build Coastguard Worker                            first = 1; last = 7; first2 = 13; last2 = 19;
1417*c8dee2aaSAndroid Build Coastguard Worker                            break;
1418*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CONIC_NO:
1419*c8dee2aaSAndroid Build Coastguard Worker                            first = 0; last = 6; first2 = 7; last2 = 13;
1420*c8dee2aaSAndroid Build Coastguard Worker                            break;
1421*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_QUAD_NO:
1422*c8dee2aaSAndroid Build Coastguard Worker                            first = 0; last = 6; first2 = 6; last2 = 12;
1423*c8dee2aaSAndroid Build Coastguard Worker                            break;
1424*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_SELF_CUBIC:
1425*c8dee2aaSAndroid Build Coastguard Worker                            first = 1; last = 9;
1426*c8dee2aaSAndroid Build Coastguard Worker                            break;
1427*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_SELF_CUBIC_NO:
1428*c8dee2aaSAndroid Build Coastguard Worker                            first = 0; last = 8;
1429*c8dee2aaSAndroid Build Coastguard Worker                            break;
1430*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC_LINE:
1431*c8dee2aaSAndroid Build Coastguard Worker                            first = 1; last = 9; first2 = 12; last2 = 16;
1432*c8dee2aaSAndroid Build Coastguard Worker                            break;
1433*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC_LINE_2:
1434*c8dee2aaSAndroid Build Coastguard Worker                            first = 1; last = 9; first2 = 15; last2 = 19;
1435*c8dee2aaSAndroid Build Coastguard Worker                            break;
1436*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC_LINE_3:
1437*c8dee2aaSAndroid Build Coastguard Worker                            first = 1; last = 9; first2 = 18; last2 = 22;
1438*c8dee2aaSAndroid Build Coastguard Worker                            break;
1439*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC_LINE_NO:
1440*c8dee2aaSAndroid Build Coastguard Worker                            first = 0; last = 8; first2 = 8; last2 = 12;
1441*c8dee2aaSAndroid Build Coastguard Worker                            break;
1442*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CONIC_QUAD:
1443*c8dee2aaSAndroid Build Coastguard Worker                            first = 1; last = 7; first2 = 11; last2 = 17;
1444*c8dee2aaSAndroid Build Coastguard Worker                            break;
1445*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CONIC_QUAD_2:
1446*c8dee2aaSAndroid Build Coastguard Worker                            first = 1; last = 7; first2 = 14; last2 = 20;
1447*c8dee2aaSAndroid Build Coastguard Worker                            break;
1448*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CONIC_QUAD_3:
1449*c8dee2aaSAndroid Build Coastguard Worker                            first = 1; last = 7; first2 = 17; last2 = 23;
1450*c8dee2aaSAndroid Build Coastguard Worker                            break;
1451*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CONIC_QUAD_4:
1452*c8dee2aaSAndroid Build Coastguard Worker                            first = 1; last = 7; first2 = 20; last2 = 26;
1453*c8dee2aaSAndroid Build Coastguard Worker                            break;
1454*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CONIC_QUAD_NO:
1455*c8dee2aaSAndroid Build Coastguard Worker                            first = 0; last = 6; first2 = 7; last2 = 13;
1456*c8dee2aaSAndroid Build Coastguard Worker                            break;
1457*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC_QUAD:
1458*c8dee2aaSAndroid Build Coastguard Worker                            first = 1; last = 9; first2 = 12; last2 = 18;
1459*c8dee2aaSAndroid Build Coastguard Worker                            break;
1460*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC_QUAD_2:
1461*c8dee2aaSAndroid Build Coastguard Worker                            first = 1; last = 9; first2 = 15; last2 = 21;
1462*c8dee2aaSAndroid Build Coastguard Worker                            break;
1463*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC_QUAD_3:
1464*c8dee2aaSAndroid Build Coastguard Worker                            first = 1; last = 9; first2 = 18; last2 = 24;
1465*c8dee2aaSAndroid Build Coastguard Worker                            break;
1466*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC_QUAD_4:
1467*c8dee2aaSAndroid Build Coastguard Worker                            first = 1; last = 9; first2 = 21; last2 = 27;
1468*c8dee2aaSAndroid Build Coastguard Worker                            break;
1469*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC_QUAD_NO:
1470*c8dee2aaSAndroid Build Coastguard Worker                            first = 0; last = 8; first2 = 8; last2 = 14;
1471*c8dee2aaSAndroid Build Coastguard Worker                            break;
1472*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC:
1473*c8dee2aaSAndroid Build Coastguard Worker                            first = 1; last = 9; first2 = 12; last2 = 20;
1474*c8dee2aaSAndroid Build Coastguard Worker                            break;
1475*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC_2:
1476*c8dee2aaSAndroid Build Coastguard Worker                            first = 1; last = 9; first2 = 15; last2 = 23;
1477*c8dee2aaSAndroid Build Coastguard Worker                            break;
1478*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC_3:
1479*c8dee2aaSAndroid Build Coastguard Worker                            first = 1; last = 9; first2 = 18; last2 = 26;
1480*c8dee2aaSAndroid Build Coastguard Worker                            break;
1481*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC_4:
1482*c8dee2aaSAndroid Build Coastguard Worker                            first = 1; last = 9; first2 = 21; last2 = 29;
1483*c8dee2aaSAndroid Build Coastguard Worker                            break;
1484*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC_NO:
1485*c8dee2aaSAndroid Build Coastguard Worker                            first = 0; last = 8; first2 = 8; last2 = 16;
1486*c8dee2aaSAndroid Build Coastguard Worker                            break;
1487*c8dee2aaSAndroid Build Coastguard Worker                        default:
1488*c8dee2aaSAndroid Build Coastguard Worker                            console.log("unknown REC_TYPE_SECT frag type: " + fragType);
1489*c8dee2aaSAndroid Build Coastguard Worker                            throw "stop execution";
1490*c8dee2aaSAndroid Build Coastguard Worker                    }
1491*c8dee2aaSAndroid Build Coastguard Worker                    break;
1492*c8dee2aaSAndroid Build Coastguard Worker                default:
1493*c8dee2aaSAndroid Build Coastguard Worker                    continue;
1494*c8dee2aaSAndroid Build Coastguard Worker            }
1495*c8dee2aaSAndroid Build Coastguard Worker            for (var idx = first; idx < last; idx += 2) {
1496*c8dee2aaSAndroid Build Coastguard Worker                xmin = Math.min(xmin, frags[idx]);
1497*c8dee2aaSAndroid Build Coastguard Worker                xmax = Math.max(xmax, frags[idx]);
1498*c8dee2aaSAndroid Build Coastguard Worker                ymin = Math.min(ymin, frags[idx + 1]);
1499*c8dee2aaSAndroid Build Coastguard Worker                ymax = Math.max(ymax, frags[idx + 1]);
1500*c8dee2aaSAndroid Build Coastguard Worker            }
1501*c8dee2aaSAndroid Build Coastguard Worker            for (var idx = first2; idx < last2; idx += 2) {
1502*c8dee2aaSAndroid Build Coastguard Worker                xmin = Math.min(xmin, frags[idx]);
1503*c8dee2aaSAndroid Build Coastguard Worker                xmax = Math.max(xmax, frags[idx]);
1504*c8dee2aaSAndroid Build Coastguard Worker                ymin = Math.min(ymin, frags[idx + 1]);
1505*c8dee2aaSAndroid Build Coastguard Worker                ymax = Math.max(ymax, frags[idx + 1]);
1506*c8dee2aaSAndroid Build Coastguard Worker            }
1507*c8dee2aaSAndroid Build Coastguard Worker        }
1508*c8dee2aaSAndroid Build Coastguard Worker    }
1509*c8dee2aaSAndroid Build Coastguard Worker    var angleBounds = [Infinity, Infinity, -Infinity, -Infinity];
1510*c8dee2aaSAndroid Build Coastguard Worker    for (var tIndex = 0; tIndex < test.length; tIndex += 3) {
1511*c8dee2aaSAndroid Build Coastguard Worker        var recType = test[tIndex];
1512*c8dee2aaSAndroid Build Coastguard Worker        var records = test[tIndex + 2];
1513*c8dee2aaSAndroid Build Coastguard Worker        for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
1514*c8dee2aaSAndroid Build Coastguard Worker            var fragType = records[recordIndex];
1515*c8dee2aaSAndroid Build Coastguard Worker            var frags = records[recordIndex + 1];
1516*c8dee2aaSAndroid Build Coastguard Worker            switch (recType) {
1517*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_ACTIVE_OP:
1518*c8dee2aaSAndroid Build Coastguard Worker                    if (!draw_op) {
1519*c8dee2aaSAndroid Build Coastguard Worker                        break;
1520*c8dee2aaSAndroid Build Coastguard Worker                    }
1521*c8dee2aaSAndroid Build Coastguard Worker                    {
1522*c8dee2aaSAndroid Build Coastguard Worker                        var curve = curvePartialByID(test, frags[0], frags[1], frags[2]);
1523*c8dee2aaSAndroid Build Coastguard Worker                        curve_extremes(curve, angleBounds);
1524*c8dee2aaSAndroid Build Coastguard Worker                    }
1525*c8dee2aaSAndroid Build Coastguard Worker                    break;
1526*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_ANGLE:
1527*c8dee2aaSAndroid Build Coastguard Worker                    if (!draw_angle) {
1528*c8dee2aaSAndroid Build Coastguard Worker                        break;
1529*c8dee2aaSAndroid Build Coastguard Worker                    }
1530*c8dee2aaSAndroid Build Coastguard Worker                    {
1531*c8dee2aaSAndroid Build Coastguard Worker                        var curve = curvePartialByID(test, frags[0], frags[4], frags[5]);
1532*c8dee2aaSAndroid Build Coastguard Worker                        curve_extremes(curve, angleBounds);
1533*c8dee2aaSAndroid Build Coastguard Worker                        curve = curvePartialByID(test, frags[6], frags[10], frags[11]);
1534*c8dee2aaSAndroid Build Coastguard Worker                        curve_extremes(curve, angleBounds);
1535*c8dee2aaSAndroid Build Coastguard Worker                        curve = curvePartialByID(test, frags[12], frags[16], frags[17]);
1536*c8dee2aaSAndroid Build Coastguard Worker                    }
1537*c8dee2aaSAndroid Build Coastguard Worker                    break;
1538*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_COINCIDENCE:
1539*c8dee2aaSAndroid Build Coastguard Worker                    if (!draw_coincidence) {
1540*c8dee2aaSAndroid Build Coastguard Worker                        break;
1541*c8dee2aaSAndroid Build Coastguard Worker                    }
1542*c8dee2aaSAndroid Build Coastguard Worker                    {
1543*c8dee2aaSAndroid Build Coastguard Worker                        var curve = curvePartialByID(test, frags[0], frags[1], frags[2]);
1544*c8dee2aaSAndroid Build Coastguard Worker                        curve_extremes(curve, angleBounds);
1545*c8dee2aaSAndroid Build Coastguard Worker                    }
1546*c8dee2aaSAndroid Build Coastguard Worker                    break;
1547*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_SORT:
1548*c8dee2aaSAndroid Build Coastguard Worker                    if (!draw_sort) {
1549*c8dee2aaSAndroid Build Coastguard Worker                        break;
1550*c8dee2aaSAndroid Build Coastguard Worker                    }
1551*c8dee2aaSAndroid Build Coastguard Worker                    if (fragType == SORT_UNARY || fragType == SORT_BINARY) {
1552*c8dee2aaSAndroid Build Coastguard Worker                        var curve = curvePartialByID(test, frags[0], frags[6], frags[8]);
1553*c8dee2aaSAndroid Build Coastguard Worker                        curve_extremes(curve, angleBounds);
1554*c8dee2aaSAndroid Build Coastguard Worker                    }
1555*c8dee2aaSAndroid Build Coastguard Worker                    break;
1556*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_TOP:
1557*c8dee2aaSAndroid Build Coastguard Worker                    if (!draw_top) {
1558*c8dee2aaSAndroid Build Coastguard Worker                        break;
1559*c8dee2aaSAndroid Build Coastguard Worker                    }
1560*c8dee2aaSAndroid Build Coastguard Worker                    {
1561*c8dee2aaSAndroid Build Coastguard Worker                        var curve = curvePartialByID(test, frags[0], frags[1], frags[2]);
1562*c8dee2aaSAndroid Build Coastguard Worker                        curve_extremes(curve, angleBounds);
1563*c8dee2aaSAndroid Build Coastguard Worker                    }
1564*c8dee2aaSAndroid Build Coastguard Worker                    break;
1565*c8dee2aaSAndroid Build Coastguard Worker            }
1566*c8dee2aaSAndroid Build Coastguard Worker        }
1567*c8dee2aaSAndroid Build Coastguard Worker    }
1568*c8dee2aaSAndroid Build Coastguard Worker    xmin = Math.min(xmin, angleBounds[0]);
1569*c8dee2aaSAndroid Build Coastguard Worker    ymin = Math.min(ymin, angleBounds[1]);
1570*c8dee2aaSAndroid Build Coastguard Worker    xmax = Math.max(xmax, angleBounds[2]);
1571*c8dee2aaSAndroid Build Coastguard Worker    ymax = Math.max(ymax, angleBounds[3]);
1572*c8dee2aaSAndroid Build Coastguard Worker    setScale(xmin, xmax, ymin, ymax);
1573*c8dee2aaSAndroid Build Coastguard Worker    if (hasPath == false && hasComputedPath == true && !draw_computed) {
1574*c8dee2aaSAndroid Build Coastguard Worker        draw_computed = 7; // show quadratics, conics, and cubics
1575*c8dee2aaSAndroid Build Coastguard Worker    }
1576*c8dee2aaSAndroid Build Coastguard Worker    if (hasPath == true && hasComputedPath == false && draw_computed) {
1577*c8dee2aaSAndroid Build Coastguard Worker        draw_computed = 0;
1578*c8dee2aaSAndroid Build Coastguard Worker    }
1579*c8dee2aaSAndroid Build Coastguard Worker}
1580*c8dee2aaSAndroid Build Coastguard Worker
1581*c8dee2aaSAndroid Build Coastguard Workerfunction curveByIDMatch(test, id, recMatch) {
1582*c8dee2aaSAndroid Build Coastguard Worker    var tIndex = -3;
1583*c8dee2aaSAndroid Build Coastguard Worker    while ((tIndex += 3) < test.length) {
1584*c8dee2aaSAndroid Build Coastguard Worker        var recType = test[tIndex];
1585*c8dee2aaSAndroid Build Coastguard Worker        if (recType == REC_TYPE_OP) {
1586*c8dee2aaSAndroid Build Coastguard Worker            continue;
1587*c8dee2aaSAndroid Build Coastguard Worker        }
1588*c8dee2aaSAndroid Build Coastguard Worker        if (recType != recMatch) {
1589*c8dee2aaSAndroid Build Coastguard Worker            return [];
1590*c8dee2aaSAndroid Build Coastguard Worker        }
1591*c8dee2aaSAndroid Build Coastguard Worker        var records = test[tIndex + 2];
1592*c8dee2aaSAndroid Build Coastguard Worker        for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
1593*c8dee2aaSAndroid Build Coastguard Worker            var fragType = records[recordIndex];
1594*c8dee2aaSAndroid Build Coastguard Worker            var frags = records[recordIndex + 1];
1595*c8dee2aaSAndroid Build Coastguard Worker            if (frags[0] == id) {
1596*c8dee2aaSAndroid Build Coastguard Worker                switch (fragType) {
1597*c8dee2aaSAndroid Build Coastguard Worker                    case PATH_LINE:
1598*c8dee2aaSAndroid Build Coastguard Worker                        return [frags[1], frags[2], frags[3], frags[4]];
1599*c8dee2aaSAndroid Build Coastguard Worker                    case PATH_QUAD:
1600*c8dee2aaSAndroid Build Coastguard Worker                        return [frags[1], frags[2], frags[3], frags[4],
1601*c8dee2aaSAndroid Build Coastguard Worker                                frags[5], frags[6]];
1602*c8dee2aaSAndroid Build Coastguard Worker                    case PATH_CONIC:
1603*c8dee2aaSAndroid Build Coastguard Worker                        return [frags[1], frags[2], frags[3], frags[4],
1604*c8dee2aaSAndroid Build Coastguard Worker                                frags[5], frags[6], frags[7]];
1605*c8dee2aaSAndroid Build Coastguard Worker                    case PATH_CUBIC:
1606*c8dee2aaSAndroid Build Coastguard Worker                        return [frags[1], frags[2], frags[3], frags[4],
1607*c8dee2aaSAndroid Build Coastguard Worker                                frags[5], frags[6], frags[7], frags[8]];
1608*c8dee2aaSAndroid Build Coastguard Worker                }
1609*c8dee2aaSAndroid Build Coastguard Worker            }
1610*c8dee2aaSAndroid Build Coastguard Worker        }
1611*c8dee2aaSAndroid Build Coastguard Worker    }
1612*c8dee2aaSAndroid Build Coastguard Worker    return [];
1613*c8dee2aaSAndroid Build Coastguard Worker}
1614*c8dee2aaSAndroid Build Coastguard Worker
1615*c8dee2aaSAndroid Build Coastguard Workerfunction curveByID(test, id) {
1616*c8dee2aaSAndroid Build Coastguard Worker    var result = draw_path >= 4 ? curveByIDMatch(test, id, REC_TYPE_ALIGNED) : [];
1617*c8dee2aaSAndroid Build Coastguard Worker    if (!result.length) {
1618*c8dee2aaSAndroid Build Coastguard Worker        result = curveByIDMatch(test, id, REC_TYPE_PATH);
1619*c8dee2aaSAndroid Build Coastguard Worker    }
1620*c8dee2aaSAndroid Build Coastguard Worker    return result;
1621*c8dee2aaSAndroid Build Coastguard Worker}
1622*c8dee2aaSAndroid Build Coastguard Worker
1623*c8dee2aaSAndroid Build Coastguard Workerfunction curvePartialByIDMatch(test, id, t0, t1, recMatch) {
1624*c8dee2aaSAndroid Build Coastguard Worker    var tIndex = -3;
1625*c8dee2aaSAndroid Build Coastguard Worker    while ((tIndex += 3) < test.length) {
1626*c8dee2aaSAndroid Build Coastguard Worker        var recType = test[tIndex];
1627*c8dee2aaSAndroid Build Coastguard Worker        if (recType == REC_TYPE_OP) {
1628*c8dee2aaSAndroid Build Coastguard Worker            continue;
1629*c8dee2aaSAndroid Build Coastguard Worker        }
1630*c8dee2aaSAndroid Build Coastguard Worker        if (recType != recMatch) {
1631*c8dee2aaSAndroid Build Coastguard Worker            return [];
1632*c8dee2aaSAndroid Build Coastguard Worker        }
1633*c8dee2aaSAndroid Build Coastguard Worker        var records = test[tIndex + 2];
1634*c8dee2aaSAndroid Build Coastguard Worker        for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
1635*c8dee2aaSAndroid Build Coastguard Worker            var fragType = records[recordIndex];
1636*c8dee2aaSAndroid Build Coastguard Worker            var frags = records[recordIndex + 1];
1637*c8dee2aaSAndroid Build Coastguard Worker            if (frags[0] == id) {
1638*c8dee2aaSAndroid Build Coastguard Worker                switch (fragType) {
1639*c8dee2aaSAndroid Build Coastguard Worker                    case PATH_LINE:
1640*c8dee2aaSAndroid Build Coastguard Worker                        return linePartial(frags[1], frags[2], frags[3], frags[4], t0, t1);
1641*c8dee2aaSAndroid Build Coastguard Worker                    case PATH_QUAD:
1642*c8dee2aaSAndroid Build Coastguard Worker                        return quadPartial(frags[1], frags[2], frags[3], frags[4],
1643*c8dee2aaSAndroid Build Coastguard Worker                                frags[5], frags[6], t0, t1);
1644*c8dee2aaSAndroid Build Coastguard Worker                    case PATH_CONIC:
1645*c8dee2aaSAndroid Build Coastguard Worker                        return conicPartial(frags[1], frags[2], frags[3], frags[4],
1646*c8dee2aaSAndroid Build Coastguard Worker                                frags[5], frags[6], frags[7], t0, t1);
1647*c8dee2aaSAndroid Build Coastguard Worker                    case PATH_CUBIC:
1648*c8dee2aaSAndroid Build Coastguard Worker                        return cubicPartial(frags[1], frags[2], frags[3], frags[4],
1649*c8dee2aaSAndroid Build Coastguard Worker                                frags[5], frags[6], frags[7], frags[8], t0, t1);
1650*c8dee2aaSAndroid Build Coastguard Worker                }
1651*c8dee2aaSAndroid Build Coastguard Worker            }
1652*c8dee2aaSAndroid Build Coastguard Worker        }
1653*c8dee2aaSAndroid Build Coastguard Worker    }
1654*c8dee2aaSAndroid Build Coastguard Worker    return [];
1655*c8dee2aaSAndroid Build Coastguard Worker}
1656*c8dee2aaSAndroid Build Coastguard Worker
1657*c8dee2aaSAndroid Build Coastguard Workerfunction curvePartialByID(test, id, t0, t1) {
1658*c8dee2aaSAndroid Build Coastguard Worker    var result = draw_path >= 4 ? curvePartialByIDMatch(test, id, t0, t1, REC_TYPE_ALIGNED) : [];
1659*c8dee2aaSAndroid Build Coastguard Worker    if (!result.length) {
1660*c8dee2aaSAndroid Build Coastguard Worker        result = curvePartialByIDMatch(test, id, t0, t1, REC_TYPE_PATH);
1661*c8dee2aaSAndroid Build Coastguard Worker    }
1662*c8dee2aaSAndroid Build Coastguard Worker    return result;
1663*c8dee2aaSAndroid Build Coastguard Worker}
1664*c8dee2aaSAndroid Build Coastguard Worker
1665*c8dee2aaSAndroid Build Coastguard Workerfunction idByCurveIDMatch(test, frag, type, recMatch) {
1666*c8dee2aaSAndroid Build Coastguard Worker    var tIndex = 0;
1667*c8dee2aaSAndroid Build Coastguard Worker    while (tIndex < test.length) {
1668*c8dee2aaSAndroid Build Coastguard Worker        var recType = test[tIndex];
1669*c8dee2aaSAndroid Build Coastguard Worker        if (recType != recMatch) {
1670*c8dee2aaSAndroid Build Coastguard Worker            ++tIndex;
1671*c8dee2aaSAndroid Build Coastguard Worker            continue;
1672*c8dee2aaSAndroid Build Coastguard Worker        }
1673*c8dee2aaSAndroid Build Coastguard Worker        var records = test[tIndex + 2];
1674*c8dee2aaSAndroid Build Coastguard Worker        for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
1675*c8dee2aaSAndroid Build Coastguard Worker            var fragType = records[recordIndex];
1676*c8dee2aaSAndroid Build Coastguard Worker            var frags = records[recordIndex + 1];
1677*c8dee2aaSAndroid Build Coastguard Worker            if (frag.length != frags.length - 1) {
1678*c8dee2aaSAndroid Build Coastguard Worker                continue;
1679*c8dee2aaSAndroid Build Coastguard Worker            }
1680*c8dee2aaSAndroid Build Coastguard Worker            switch (fragType) {
1681*c8dee2aaSAndroid Build Coastguard Worker                case PATH_LINE:
1682*c8dee2aaSAndroid Build Coastguard Worker                    if (frag[0] != frags[1] || frag[1] != frags[2]
1683*c8dee2aaSAndroid Build Coastguard Worker                            || frag[2] != frags[3] || frag[3] != frags[4]) {
1684*c8dee2aaSAndroid Build Coastguard Worker                        continue;
1685*c8dee2aaSAndroid Build Coastguard Worker                    }
1686*c8dee2aaSAndroid Build Coastguard Worker                    return frags[0];
1687*c8dee2aaSAndroid Build Coastguard Worker                case PATH_QUAD:
1688*c8dee2aaSAndroid Build Coastguard Worker                    if (frag[0] != frags[1] || frag[1] != frags[2]
1689*c8dee2aaSAndroid Build Coastguard Worker                            || frag[2] != frags[3] || frag[3] != frags[4]
1690*c8dee2aaSAndroid Build Coastguard Worker                            || frag[4] != frags[5] || frag[5] != frags[6]) {
1691*c8dee2aaSAndroid Build Coastguard Worker                        continue;
1692*c8dee2aaSAndroid Build Coastguard Worker                    }
1693*c8dee2aaSAndroid Build Coastguard Worker                    return frags[0];
1694*c8dee2aaSAndroid Build Coastguard Worker                case PATH_CONIC:
1695*c8dee2aaSAndroid Build Coastguard Worker                    if (frag[0] != frags[1] || frag[1] != frags[2]
1696*c8dee2aaSAndroid Build Coastguard Worker                            || frag[2] != frags[3] || frag[3] != frags[4]
1697*c8dee2aaSAndroid Build Coastguard Worker                            || frag[4] != frags[5] || frag[5] != frags[6]
1698*c8dee2aaSAndroid Build Coastguard Worker                            || frag[6] != frags[7]) {
1699*c8dee2aaSAndroid Build Coastguard Worker                        continue;
1700*c8dee2aaSAndroid Build Coastguard Worker                    }
1701*c8dee2aaSAndroid Build Coastguard Worker                    return frags[0];
1702*c8dee2aaSAndroid Build Coastguard Worker                case PATH_CUBIC:
1703*c8dee2aaSAndroid Build Coastguard Worker                    if (frag[0] != frags[1] || frag[1] != frags[2]
1704*c8dee2aaSAndroid Build Coastguard Worker                            || frag[2] != frags[3] || frag[3] != frags[4]
1705*c8dee2aaSAndroid Build Coastguard Worker                            || frag[4] != frags[5] || frag[5] != frags[6]
1706*c8dee2aaSAndroid Build Coastguard Worker                            || frag[6] != frags[7] || frag[7] != frags[8]) {
1707*c8dee2aaSAndroid Build Coastguard Worker                        continue;
1708*c8dee2aaSAndroid Build Coastguard Worker                    }
1709*c8dee2aaSAndroid Build Coastguard Worker                    return frags[0];
1710*c8dee2aaSAndroid Build Coastguard Worker            }
1711*c8dee2aaSAndroid Build Coastguard Worker        }
1712*c8dee2aaSAndroid Build Coastguard Worker        ++tIndex;
1713*c8dee2aaSAndroid Build Coastguard Worker    }
1714*c8dee2aaSAndroid Build Coastguard Worker    return -1;
1715*c8dee2aaSAndroid Build Coastguard Worker}
1716*c8dee2aaSAndroid Build Coastguard Worker
1717*c8dee2aaSAndroid Build Coastguard Workerfunction idByCurve(test, frag, type) {
1718*c8dee2aaSAndroid Build Coastguard Worker    var result = draw_path >= 4 ? idByCurveIDMatch(test, frag, type, REC_TYPE_ALIGNED) : [];
1719*c8dee2aaSAndroid Build Coastguard Worker    if (!result.length) {
1720*c8dee2aaSAndroid Build Coastguard Worker        result = idByCurveIDMatch(test, frag, type, REC_TYPE_PATH);
1721*c8dee2aaSAndroid Build Coastguard Worker    }
1722*c8dee2aaSAndroid Build Coastguard Worker    return result;
1723*c8dee2aaSAndroid Build Coastguard Worker}
1724*c8dee2aaSAndroid Build Coastguard Worker
1725*c8dee2aaSAndroid Build Coastguard Workerfunction curve_extremes(curve, bounds) {
1726*c8dee2aaSAndroid Build Coastguard Worker    var length = curve.length == 7 ? 6 : curve.length;
1727*c8dee2aaSAndroid Build Coastguard Worker    for (var index = 0; index < length; index += 2) {
1728*c8dee2aaSAndroid Build Coastguard Worker        var x = curve[index];
1729*c8dee2aaSAndroid Build Coastguard Worker        var y = curve[index + 1];
1730*c8dee2aaSAndroid Build Coastguard Worker        bounds[0] = Math.min(bounds[0], x);
1731*c8dee2aaSAndroid Build Coastguard Worker        bounds[1] = Math.min(bounds[1], y);
1732*c8dee2aaSAndroid Build Coastguard Worker        bounds[2] = Math.max(bounds[2], x);
1733*c8dee2aaSAndroid Build Coastguard Worker        bounds[3] = Math.max(bounds[3], y);
1734*c8dee2aaSAndroid Build Coastguard Worker    }
1735*c8dee2aaSAndroid Build Coastguard Worker}
1736*c8dee2aaSAndroid Build Coastguard Worker
1737*c8dee2aaSAndroid Build Coastguard Workerfunction setScale(x0, x1, y0, y1) {
1738*c8dee2aaSAndroid Build Coastguard Worker    var srcWidth = x1 - x0;
1739*c8dee2aaSAndroid Build Coastguard Worker    var srcHeight = y1 - y0;
1740*c8dee2aaSAndroid Build Coastguard Worker    var usableWidth = screenWidth;
1741*c8dee2aaSAndroid Build Coastguard Worker    var xDigits = Math.ceil(Math.log(Math.abs(xmax)) / Math.log(10));
1742*c8dee2aaSAndroid Build Coastguard Worker    var yDigits = Math.ceil(Math.log(Math.abs(ymax)) / Math.log(10));
1743*c8dee2aaSAndroid Build Coastguard Worker    usableWidth -= (xDigits + yDigits) * 10;
1744*c8dee2aaSAndroid Build Coastguard Worker    usableWidth -= decimal_places * 10;
1745*c8dee2aaSAndroid Build Coastguard Worker    if (draw_legend) {
1746*c8dee2aaSAndroid Build Coastguard Worker        usableWidth -= 40;
1747*c8dee2aaSAndroid Build Coastguard Worker    }
1748*c8dee2aaSAndroid Build Coastguard Worker    var hscale = usableWidth / srcWidth;
1749*c8dee2aaSAndroid Build Coastguard Worker    var vscale = screenHeight / srcHeight;
1750*c8dee2aaSAndroid Build Coastguard Worker    scale = Math.min(hscale, vscale);
1751*c8dee2aaSAndroid Build Coastguard Worker    var invScale = 1 / scale;
1752*c8dee2aaSAndroid Build Coastguard Worker    var sxmin = x0 - invScale * 5;
1753*c8dee2aaSAndroid Build Coastguard Worker    var symin = y0 - invScale * 10;
1754*c8dee2aaSAndroid Build Coastguard Worker    var sxmax = x1 + invScale * (6 * decimal_places + 10);
1755*c8dee2aaSAndroid Build Coastguard Worker    var symax = y1 + invScale * 10;
1756*c8dee2aaSAndroid Build Coastguard Worker    srcWidth = sxmax - sxmin;
1757*c8dee2aaSAndroid Build Coastguard Worker    srcHeight = symax - symin;
1758*c8dee2aaSAndroid Build Coastguard Worker    hscale = usableWidth / srcWidth;
1759*c8dee2aaSAndroid Build Coastguard Worker    vscale = screenHeight / srcHeight;
1760*c8dee2aaSAndroid Build Coastguard Worker    scale = Math.min(hscale, vscale);
1761*c8dee2aaSAndroid Build Coastguard Worker    srcLeft = sxmin;
1762*c8dee2aaSAndroid Build Coastguard Worker    srcTop = symin;
1763*c8dee2aaSAndroid Build Coastguard Worker}
1764*c8dee2aaSAndroid Build Coastguard Worker
1765*c8dee2aaSAndroid Build Coastguard Workerfunction drawArc(curve, op, from, to) {
1766*c8dee2aaSAndroid Build Coastguard Worker    var type = PATH_LINE + (curve.length / 2 - 2);
1767*c8dee2aaSAndroid Build Coastguard Worker    var pt = pointAtT(curve, type, op ? 0.4 : 0.6);
1768*c8dee2aaSAndroid Build Coastguard Worker    var dy = pt.y - curve[1];
1769*c8dee2aaSAndroid Build Coastguard Worker    var dx = pt.x - curve[0];
1770*c8dee2aaSAndroid Build Coastguard Worker    var dist = Math.sqrt(dy * dy + dx * dx);
1771*c8dee2aaSAndroid Build Coastguard Worker    var _dist = dist * scale;
1772*c8dee2aaSAndroid Build Coastguard Worker    var angle = Math.atan2(dy, dx);
1773*c8dee2aaSAndroid Build Coastguard Worker    var _px = (curve[0] - srcLeft) * scale;
1774*c8dee2aaSAndroid Build Coastguard Worker    var _py = (curve[1] - srcTop) * scale;
1775*c8dee2aaSAndroid Build Coastguard Worker    var divisor = 4;
1776*c8dee2aaSAndroid Build Coastguard Worker    var endDist;
1777*c8dee2aaSAndroid Build Coastguard Worker    do {
1778*c8dee2aaSAndroid Build Coastguard Worker        var ends = [];
1779*c8dee2aaSAndroid Build Coastguard Worker        for (var index = -1; index <= 1; index += 2) {
1780*c8dee2aaSAndroid Build Coastguard Worker            var px = Math.cos(index * Math.PI / divisor);
1781*c8dee2aaSAndroid Build Coastguard Worker            var py = Math.sin(index * Math.PI / divisor);
1782*c8dee2aaSAndroid Build Coastguard Worker            ends.push(px);
1783*c8dee2aaSAndroid Build Coastguard Worker            ends.push(py);
1784*c8dee2aaSAndroid Build Coastguard Worker        }
1785*c8dee2aaSAndroid Build Coastguard Worker        var endDx = (ends[2] - ends[0]) * scale * dist;
1786*c8dee2aaSAndroid Build Coastguard Worker        var endDy = (ends[3] - ends[1]) * scale * dist;
1787*c8dee2aaSAndroid Build Coastguard Worker        endDist = Math.sqrt(endDx * endDx + endDy * endDy);
1788*c8dee2aaSAndroid Build Coastguard Worker        if (endDist < 100) {
1789*c8dee2aaSAndroid Build Coastguard Worker            break;
1790*c8dee2aaSAndroid Build Coastguard Worker        }
1791*c8dee2aaSAndroid Build Coastguard Worker        divisor *= 2;
1792*c8dee2aaSAndroid Build Coastguard Worker    } while (true);
1793*c8dee2aaSAndroid Build Coastguard Worker    if (endDist < 30) {
1794*c8dee2aaSAndroid Build Coastguard Worker        return;
1795*c8dee2aaSAndroid Build Coastguard Worker    }
1796*c8dee2aaSAndroid Build Coastguard Worker    if (op) {
1797*c8dee2aaSAndroid Build Coastguard Worker        divisor *= 2;
1798*c8dee2aaSAndroid Build Coastguard Worker    }
1799*c8dee2aaSAndroid Build Coastguard Worker    ctx.strokeStyle = op ? "rgba(210,0,45, 0.4)" : "rgba(90,90,90, 0.5)";
1800*c8dee2aaSAndroid Build Coastguard Worker    ctx.beginPath();
1801*c8dee2aaSAndroid Build Coastguard Worker    ctx.arc(_px, _py, _dist, angle - Math.PI / divisor, angle + Math.PI / divisor, false);
1802*c8dee2aaSAndroid Build Coastguard Worker    ctx.stroke();
1803*c8dee2aaSAndroid Build Coastguard Worker    var saveAlign = ctx.textAlign;
1804*c8dee2aaSAndroid Build Coastguard Worker    var saveStyle = ctx.fillStyle;
1805*c8dee2aaSAndroid Build Coastguard Worker    var saveFont = ctx.font;
1806*c8dee2aaSAndroid Build Coastguard Worker    ctx.textAlign = "center";
1807*c8dee2aaSAndroid Build Coastguard Worker    ctx.fillStyle = "black";
1808*c8dee2aaSAndroid Build Coastguard Worker    ctx.font = "normal 24px Arial";
1809*c8dee2aaSAndroid Build Coastguard Worker    divisor *= 0.8;
1810*c8dee2aaSAndroid Build Coastguard Worker    for (var index = -1; index <= 1; index += 2) {
1811*c8dee2aaSAndroid Build Coastguard Worker        var px = curve[0] + Math.cos(angle + index * Math.PI / divisor) * dist;
1812*c8dee2aaSAndroid Build Coastguard Worker        var py = curve[1] + Math.sin(angle + index * Math.PI / divisor) * dist;
1813*c8dee2aaSAndroid Build Coastguard Worker        var _px = (px - srcLeft) * scale;
1814*c8dee2aaSAndroid Build Coastguard Worker        var _py = (py - srcTop) * scale;
1815*c8dee2aaSAndroid Build Coastguard Worker        ctx.fillText(index < 0 ? to.toString() : from.toString(), _px, _py + 8);
1816*c8dee2aaSAndroid Build Coastguard Worker    }
1817*c8dee2aaSAndroid Build Coastguard Worker    ctx.textAlign = saveAlign;
1818*c8dee2aaSAndroid Build Coastguard Worker    ctx.fillStyle = saveStyle;
1819*c8dee2aaSAndroid Build Coastguard Worker    ctx.font = saveFont;
1820*c8dee2aaSAndroid Build Coastguard Worker}
1821*c8dee2aaSAndroid Build Coastguard Worker
1822*c8dee2aaSAndroid Build Coastguard Workerfunction drawPoint(px, py, end) {
1823*c8dee2aaSAndroid Build Coastguard Worker    var length = drawnPts.length == 7 ? 6 : drawnPts.length;
1824*c8dee2aaSAndroid Build Coastguard Worker    for (var pts = 0; pts < length; pts += 2) {
1825*c8dee2aaSAndroid Build Coastguard Worker        var x = drawnPts[pts];
1826*c8dee2aaSAndroid Build Coastguard Worker        var y = drawnPts[pts + 1];
1827*c8dee2aaSAndroid Build Coastguard Worker        if (px == x && py == y) {
1828*c8dee2aaSAndroid Build Coastguard Worker            return;
1829*c8dee2aaSAndroid Build Coastguard Worker        }
1830*c8dee2aaSAndroid Build Coastguard Worker    }
1831*c8dee2aaSAndroid Build Coastguard Worker    drawnPts.push(px);
1832*c8dee2aaSAndroid Build Coastguard Worker    drawnPts.push(py);
1833*c8dee2aaSAndroid Build Coastguard Worker    var label = px.toFixed(decimal_places) + ", " + py.toFixed(decimal_places);
1834*c8dee2aaSAndroid Build Coastguard Worker    var _px = (px - srcLeft) * scale;
1835*c8dee2aaSAndroid Build Coastguard Worker    var _py = (py - srcTop) * scale;
1836*c8dee2aaSAndroid Build Coastguard Worker    ctx.beginPath();
1837*c8dee2aaSAndroid Build Coastguard Worker    ctx.arc(_px, _py, 3, 0, Math.PI*2, true);
1838*c8dee2aaSAndroid Build Coastguard Worker    ctx.closePath();
1839*c8dee2aaSAndroid Build Coastguard Worker    if (end) {
1840*c8dee2aaSAndroid Build Coastguard Worker        ctx.fill();
1841*c8dee2aaSAndroid Build Coastguard Worker    } else {
1842*c8dee2aaSAndroid Build Coastguard Worker        ctx.stroke();
1843*c8dee2aaSAndroid Build Coastguard Worker    }
1844*c8dee2aaSAndroid Build Coastguard Worker    if (debug_xy) {
1845*c8dee2aaSAndroid Build Coastguard Worker        ctx.textAlign = "left";
1846*c8dee2aaSAndroid Build Coastguard Worker        ctx.fillText(label, _px + 5, _py);
1847*c8dee2aaSAndroid Build Coastguard Worker    }
1848*c8dee2aaSAndroid Build Coastguard Worker}
1849*c8dee2aaSAndroid Build Coastguard Worker
1850*c8dee2aaSAndroid Build Coastguard Workerfunction coordCount(curveType) {
1851*c8dee2aaSAndroid Build Coastguard Worker    switch (curveType) {
1852*c8dee2aaSAndroid Build Coastguard Worker        case PATH_LINE:
1853*c8dee2aaSAndroid Build Coastguard Worker            return 4;
1854*c8dee2aaSAndroid Build Coastguard Worker        case PATH_QUAD:
1855*c8dee2aaSAndroid Build Coastguard Worker            return 6;
1856*c8dee2aaSAndroid Build Coastguard Worker        case PATH_CONIC:
1857*c8dee2aaSAndroid Build Coastguard Worker            return 6;
1858*c8dee2aaSAndroid Build Coastguard Worker        case PATH_CUBIC:
1859*c8dee2aaSAndroid Build Coastguard Worker            return 8;
1860*c8dee2aaSAndroid Build Coastguard Worker    }
1861*c8dee2aaSAndroid Build Coastguard Worker    return -1;
1862*c8dee2aaSAndroid Build Coastguard Worker}
1863*c8dee2aaSAndroid Build Coastguard Worker
1864*c8dee2aaSAndroid Build Coastguard Workerfunction drawPoints(ptArray, curveType, drawControls) {
1865*c8dee2aaSAndroid Build Coastguard Worker    var count = coordCount(curveType);
1866*c8dee2aaSAndroid Build Coastguard Worker    for (var idx = 0; idx < count; idx += 2) {
1867*c8dee2aaSAndroid Build Coastguard Worker        if (!drawControls && idx != 0 && idx != count - 2) {
1868*c8dee2aaSAndroid Build Coastguard Worker            continue;
1869*c8dee2aaSAndroid Build Coastguard Worker        }
1870*c8dee2aaSAndroid Build Coastguard Worker        drawPoint(ptArray[idx], ptArray[idx + 1], idx == 0 || idx == count - 2);
1871*c8dee2aaSAndroid Build Coastguard Worker    }
1872*c8dee2aaSAndroid Build Coastguard Worker}
1873*c8dee2aaSAndroid Build Coastguard Worker
1874*c8dee2aaSAndroid Build Coastguard Workerfunction drawControlLines(curve, curveType, drawEnd) {
1875*c8dee2aaSAndroid Build Coastguard Worker    if (curveType == PATH_LINE) {
1876*c8dee2aaSAndroid Build Coastguard Worker        return;
1877*c8dee2aaSAndroid Build Coastguard Worker    }
1878*c8dee2aaSAndroid Build Coastguard Worker    ctx.strokeStyle = "rgba(0,0,0, 0.3)";
1879*c8dee2aaSAndroid Build Coastguard Worker    drawLine(curve[0], curve[1], curve[2], curve[3]);
1880*c8dee2aaSAndroid Build Coastguard Worker    drawLine(curve[2], curve[3], curve[4], curve[5]);
1881*c8dee2aaSAndroid Build Coastguard Worker    if (curveType == PATH_CUBIC) {
1882*c8dee2aaSAndroid Build Coastguard Worker        drawLine(curve[4], curve[5], curve[6], curve[7]);
1883*c8dee2aaSAndroid Build Coastguard Worker        if (drawEnd > 1) {
1884*c8dee2aaSAndroid Build Coastguard Worker            drawLine(curve[6], curve[7], curve[0], curve[1]);
1885*c8dee2aaSAndroid Build Coastguard Worker            if (drawEnd > 2) {
1886*c8dee2aaSAndroid Build Coastguard Worker                drawLine(curve[0], curve[1], curve[4], curve[5]);
1887*c8dee2aaSAndroid Build Coastguard Worker                drawLine(curve[6], curve[7], curve[2], curve[3]);
1888*c8dee2aaSAndroid Build Coastguard Worker            }
1889*c8dee2aaSAndroid Build Coastguard Worker        }
1890*c8dee2aaSAndroid Build Coastguard Worker    } else if (drawEnd > 1) {
1891*c8dee2aaSAndroid Build Coastguard Worker        drawLine(curve[4], curve[5], curve[0], curve[1]);
1892*c8dee2aaSAndroid Build Coastguard Worker    }
1893*c8dee2aaSAndroid Build Coastguard Worker}
1894*c8dee2aaSAndroid Build Coastguard Worker
1895*c8dee2aaSAndroid Build Coastguard Workerfunction pointAtT(curve, curveType, t) {
1896*c8dee2aaSAndroid Build Coastguard Worker    var xy = {};
1897*c8dee2aaSAndroid Build Coastguard Worker    switch (curveType) {
1898*c8dee2aaSAndroid Build Coastguard Worker        case PATH_LINE:
1899*c8dee2aaSAndroid Build Coastguard Worker            var a = 1 - t;
1900*c8dee2aaSAndroid Build Coastguard Worker            var b = t;
1901*c8dee2aaSAndroid Build Coastguard Worker            xy.x = a * curve[0] + b * curve[2];
1902*c8dee2aaSAndroid Build Coastguard Worker            xy.y = a * curve[1] + b * curve[3];
1903*c8dee2aaSAndroid Build Coastguard Worker            break;
1904*c8dee2aaSAndroid Build Coastguard Worker        case PATH_QUAD:
1905*c8dee2aaSAndroid Build Coastguard Worker            var one_t = 1 - t;
1906*c8dee2aaSAndroid Build Coastguard Worker            var a = one_t * one_t;
1907*c8dee2aaSAndroid Build Coastguard Worker            var b = 2 * one_t * t;
1908*c8dee2aaSAndroid Build Coastguard Worker            var c = t * t;
1909*c8dee2aaSAndroid Build Coastguard Worker            xy.x = a * curve[0] + b * curve[2] + c * curve[4];
1910*c8dee2aaSAndroid Build Coastguard Worker            xy.y = a * curve[1] + b * curve[3] + c * curve[5];
1911*c8dee2aaSAndroid Build Coastguard Worker            break;
1912*c8dee2aaSAndroid Build Coastguard Worker        case PATH_CONIC:
1913*c8dee2aaSAndroid Build Coastguard Worker            var one_t = 1 - t;
1914*c8dee2aaSAndroid Build Coastguard Worker            var a = one_t * one_t;
1915*c8dee2aaSAndroid Build Coastguard Worker            var b = 2 * one_t * t;
1916*c8dee2aaSAndroid Build Coastguard Worker            var c = t * t;
1917*c8dee2aaSAndroid Build Coastguard Worker            xy.x = a * curve[0] + b * curve[2] * curve[6] + c * curve[4];
1918*c8dee2aaSAndroid Build Coastguard Worker            xy.y = a * curve[1] + b * curve[3] * curve[6] + c * curve[5];
1919*c8dee2aaSAndroid Build Coastguard Worker            var d = a + b * curve[6] + c;
1920*c8dee2aaSAndroid Build Coastguard Worker            xy.x /= d;
1921*c8dee2aaSAndroid Build Coastguard Worker            xy.y /= d;
1922*c8dee2aaSAndroid Build Coastguard Worker            break;
1923*c8dee2aaSAndroid Build Coastguard Worker        case PATH_CUBIC:
1924*c8dee2aaSAndroid Build Coastguard Worker            var one_t = 1 - t;
1925*c8dee2aaSAndroid Build Coastguard Worker            var one_t2 = one_t * one_t;
1926*c8dee2aaSAndroid Build Coastguard Worker            var a = one_t2 * one_t;
1927*c8dee2aaSAndroid Build Coastguard Worker            var b = 3 * one_t2 * t;
1928*c8dee2aaSAndroid Build Coastguard Worker            var t2 = t * t;
1929*c8dee2aaSAndroid Build Coastguard Worker            var c = 3 * one_t * t2;
1930*c8dee2aaSAndroid Build Coastguard Worker            var d = t2 * t;
1931*c8dee2aaSAndroid Build Coastguard Worker            xy.x = a * curve[0] + b * curve[2] + c * curve[4] + d * curve[6];
1932*c8dee2aaSAndroid Build Coastguard Worker            xy.y = a * curve[1] + b * curve[3] + c * curve[5] + d * curve[7];
1933*c8dee2aaSAndroid Build Coastguard Worker            break;
1934*c8dee2aaSAndroid Build Coastguard Worker    }
1935*c8dee2aaSAndroid Build Coastguard Worker    return xy;
1936*c8dee2aaSAndroid Build Coastguard Worker}
1937*c8dee2aaSAndroid Build Coastguard Worker
1938*c8dee2aaSAndroid Build Coastguard Workerfunction drawPointAtT(curve, curveType) {
1939*c8dee2aaSAndroid Build Coastguard Worker    var x, y;
1940*c8dee2aaSAndroid Build Coastguard Worker    var xy = pointAtT(curve, curveType, curveT);
1941*c8dee2aaSAndroid Build Coastguard Worker    drawPoint(xy.x, xy.y, true);
1942*c8dee2aaSAndroid Build Coastguard Worker    if (!draw_intersectT) {
1943*c8dee2aaSAndroid Build Coastguard Worker        return;
1944*c8dee2aaSAndroid Build Coastguard Worker    }
1945*c8dee2aaSAndroid Build Coastguard Worker    ctx.fillStyle = "red";
1946*c8dee2aaSAndroid Build Coastguard Worker    drawTAtPointUp(xy.x, xy.y, curveT);
1947*c8dee2aaSAndroid Build Coastguard Worker}
1948*c8dee2aaSAndroid Build Coastguard Worker
1949*c8dee2aaSAndroid Build Coastguard Workerfunction drawTAtPointUp(px, py, t) {
1950*c8dee2aaSAndroid Build Coastguard Worker    var label = t.toFixed(decimal_places);
1951*c8dee2aaSAndroid Build Coastguard Worker    var _px = (px - srcLeft)* scale;
1952*c8dee2aaSAndroid Build Coastguard Worker    var _py = (py - srcTop) * scale;
1953*c8dee2aaSAndroid Build Coastguard Worker    ctx.fillText(label, _px + 5, _py - 10);
1954*c8dee2aaSAndroid Build Coastguard Worker}
1955*c8dee2aaSAndroid Build Coastguard Worker
1956*c8dee2aaSAndroid Build Coastguard Workerfunction drawTAtPointDown(px, py, t) {
1957*c8dee2aaSAndroid Build Coastguard Worker    var label = t.toFixed(decimal_places);
1958*c8dee2aaSAndroid Build Coastguard Worker    var _px = (px - srcLeft)* scale;
1959*c8dee2aaSAndroid Build Coastguard Worker    var _py = (py - srcTop) * scale;
1960*c8dee2aaSAndroid Build Coastguard Worker    ctx.fillText(label, _px + 5, _py + 10);
1961*c8dee2aaSAndroid Build Coastguard Worker}
1962*c8dee2aaSAndroid Build Coastguard Worker
1963*c8dee2aaSAndroid Build Coastguard Workerfunction alreadyDrawnLine(x1, y1, x2, y2) {
1964*c8dee2aaSAndroid Build Coastguard Worker    if (collect_bounds) {
1965*c8dee2aaSAndroid Build Coastguard Worker        if (focus_enabled) {
1966*c8dee2aaSAndroid Build Coastguard Worker            focusXmin = Math.min(focusXmin, x1, x2);
1967*c8dee2aaSAndroid Build Coastguard Worker            focusYmin = Math.min(focusYmin, y1, y2);
1968*c8dee2aaSAndroid Build Coastguard Worker            focusXmax = Math.max(focusXmax, x1, x2);
1969*c8dee2aaSAndroid Build Coastguard Worker            focusYmax = Math.max(focusYmax, y1, y2);
1970*c8dee2aaSAndroid Build Coastguard Worker        }
1971*c8dee2aaSAndroid Build Coastguard Worker        return true;
1972*c8dee2aaSAndroid Build Coastguard Worker    }
1973*c8dee2aaSAndroid Build Coastguard Worker    for (var pts = 0; pts < drawnLines.length; pts += 4) {
1974*c8dee2aaSAndroid Build Coastguard Worker        if (x1 == drawnLines[pts] && y1 == drawnLines[pts + 1]
1975*c8dee2aaSAndroid Build Coastguard Worker                && x2 == drawnLines[pts + 2] && y2 == drawnLines[pts + 3]) {
1976*c8dee2aaSAndroid Build Coastguard Worker            return true;
1977*c8dee2aaSAndroid Build Coastguard Worker        }
1978*c8dee2aaSAndroid Build Coastguard Worker    }
1979*c8dee2aaSAndroid Build Coastguard Worker    drawnLines.push(x1);
1980*c8dee2aaSAndroid Build Coastguard Worker    drawnLines.push(y1);
1981*c8dee2aaSAndroid Build Coastguard Worker    drawnLines.push(x2);
1982*c8dee2aaSAndroid Build Coastguard Worker    drawnLines.push(y2);
1983*c8dee2aaSAndroid Build Coastguard Worker    return false;
1984*c8dee2aaSAndroid Build Coastguard Worker}
1985*c8dee2aaSAndroid Build Coastguard Worker
1986*c8dee2aaSAndroid Build Coastguard Workerfunction drawLine(x1, y1, x2, y2) {
1987*c8dee2aaSAndroid Build Coastguard Worker    if (alreadyDrawnLine(x1, y1, x2, y2)) {
1988*c8dee2aaSAndroid Build Coastguard Worker        return;
1989*c8dee2aaSAndroid Build Coastguard Worker    }
1990*c8dee2aaSAndroid Build Coastguard Worker    ctx.beginPath();
1991*c8dee2aaSAndroid Build Coastguard Worker    ctx.moveTo((x1 - srcLeft) * scale,
1992*c8dee2aaSAndroid Build Coastguard Worker            (y1 - srcTop) * scale);
1993*c8dee2aaSAndroid Build Coastguard Worker    ctx.lineTo((x2 - srcLeft) * scale,
1994*c8dee2aaSAndroid Build Coastguard Worker            (y2 - srcTop) * scale);
1995*c8dee2aaSAndroid Build Coastguard Worker    ctx.stroke();
1996*c8dee2aaSAndroid Build Coastguard Worker}
1997*c8dee2aaSAndroid Build Coastguard Worker
1998*c8dee2aaSAndroid Build Coastguard Workerfunction linePartial(x1, y1, x2, y2, t1, t2) {
1999*c8dee2aaSAndroid Build Coastguard Worker    var dx = x1 - x2;
2000*c8dee2aaSAndroid Build Coastguard Worker    var dy = y1 - y2;
2001*c8dee2aaSAndroid Build Coastguard Worker    var array = [
2002*c8dee2aaSAndroid Build Coastguard Worker        x1 - t1 * dx,
2003*c8dee2aaSAndroid Build Coastguard Worker        y1 - t1 * dy,
2004*c8dee2aaSAndroid Build Coastguard Worker        x1 - t2 * dx,
2005*c8dee2aaSAndroid Build Coastguard Worker        y1 - t2 * dy
2006*c8dee2aaSAndroid Build Coastguard Worker    ];
2007*c8dee2aaSAndroid Build Coastguard Worker    return array;
2008*c8dee2aaSAndroid Build Coastguard Worker}
2009*c8dee2aaSAndroid Build Coastguard Worker
2010*c8dee2aaSAndroid Build Coastguard Workerfunction drawLinePartial(x1, y1, x2, y2, t1, t2) {
2011*c8dee2aaSAndroid Build Coastguard Worker    var a = linePartial(x1, y1, x2, y2, t1, t2);
2012*c8dee2aaSAndroid Build Coastguard Worker    var ax = a[0];
2013*c8dee2aaSAndroid Build Coastguard Worker    var ay = a[1];
2014*c8dee2aaSAndroid Build Coastguard Worker    var bx = a[2];
2015*c8dee2aaSAndroid Build Coastguard Worker    var by = a[3];
2016*c8dee2aaSAndroid Build Coastguard Worker    if (alreadyDrawnLine(ax, ay, bx, by)) {
2017*c8dee2aaSAndroid Build Coastguard Worker        return;
2018*c8dee2aaSAndroid Build Coastguard Worker    }
2019*c8dee2aaSAndroid Build Coastguard Worker    ctx.beginPath();
2020*c8dee2aaSAndroid Build Coastguard Worker    ctx.moveTo((ax - srcLeft) * scale,
2021*c8dee2aaSAndroid Build Coastguard Worker            (ay - srcTop) * scale);
2022*c8dee2aaSAndroid Build Coastguard Worker    ctx.lineTo((bx - srcLeft) * scale,
2023*c8dee2aaSAndroid Build Coastguard Worker            (by - srcTop) * scale);
2024*c8dee2aaSAndroid Build Coastguard Worker    ctx.stroke();
2025*c8dee2aaSAndroid Build Coastguard Worker}
2026*c8dee2aaSAndroid Build Coastguard Worker
2027*c8dee2aaSAndroid Build Coastguard Workerfunction alreadyDrawnQuad(x1, y1, x2, y2, x3, y3) {
2028*c8dee2aaSAndroid Build Coastguard Worker    if (collect_bounds) {
2029*c8dee2aaSAndroid Build Coastguard Worker        if (focus_enabled) {
2030*c8dee2aaSAndroid Build Coastguard Worker            focusXmin = Math.min(focusXmin, x1, x2, x3);
2031*c8dee2aaSAndroid Build Coastguard Worker            focusYmin = Math.min(focusYmin, y1, y2, y3);
2032*c8dee2aaSAndroid Build Coastguard Worker            focusXmax = Math.max(focusXmax, x1, x2, x3);
2033*c8dee2aaSAndroid Build Coastguard Worker            focusYmax = Math.max(focusYmax, y1, y2, y3);
2034*c8dee2aaSAndroid Build Coastguard Worker        }
2035*c8dee2aaSAndroid Build Coastguard Worker        return true;
2036*c8dee2aaSAndroid Build Coastguard Worker    }
2037*c8dee2aaSAndroid Build Coastguard Worker    for (var pts = 0; pts < drawnQuads.length; pts += 6) {
2038*c8dee2aaSAndroid Build Coastguard Worker        if (x1 == drawnQuads[pts] && y1 == drawnQuads[pts + 1]
2039*c8dee2aaSAndroid Build Coastguard Worker                && x2 == drawnQuads[pts + 2] && y2 == drawnQuads[pts + 3]
2040*c8dee2aaSAndroid Build Coastguard Worker                && x3 == drawnQuads[pts + 4] && y3 == drawnQuads[pts + 5]) {
2041*c8dee2aaSAndroid Build Coastguard Worker            return true;
2042*c8dee2aaSAndroid Build Coastguard Worker        }
2043*c8dee2aaSAndroid Build Coastguard Worker    }
2044*c8dee2aaSAndroid Build Coastguard Worker    drawnQuads.push(x1);
2045*c8dee2aaSAndroid Build Coastguard Worker    drawnQuads.push(y1);
2046*c8dee2aaSAndroid Build Coastguard Worker    drawnQuads.push(x2);
2047*c8dee2aaSAndroid Build Coastguard Worker    drawnQuads.push(y2);
2048*c8dee2aaSAndroid Build Coastguard Worker    drawnQuads.push(x3);
2049*c8dee2aaSAndroid Build Coastguard Worker    drawnQuads.push(y3);
2050*c8dee2aaSAndroid Build Coastguard Worker    return false;
2051*c8dee2aaSAndroid Build Coastguard Worker}
2052*c8dee2aaSAndroid Build Coastguard Worker
2053*c8dee2aaSAndroid Build Coastguard Workerfunction drawQuad(x1, y1, x2, y2, x3, y3) {
2054*c8dee2aaSAndroid Build Coastguard Worker    if (alreadyDrawnQuad(x1, y1, x2, y2, x3, y3)) {
2055*c8dee2aaSAndroid Build Coastguard Worker        return;
2056*c8dee2aaSAndroid Build Coastguard Worker    }
2057*c8dee2aaSAndroid Build Coastguard Worker    ctx.beginPath();
2058*c8dee2aaSAndroid Build Coastguard Worker    ctx.moveTo((x1 - srcLeft) * scale,
2059*c8dee2aaSAndroid Build Coastguard Worker            (y1 - srcTop) * scale);
2060*c8dee2aaSAndroid Build Coastguard Worker    ctx.quadraticCurveTo((x2 - srcLeft) * scale,
2061*c8dee2aaSAndroid Build Coastguard Worker            (y2 - srcTop) * scale,
2062*c8dee2aaSAndroid Build Coastguard Worker            (x3 - srcLeft) * scale,
2063*c8dee2aaSAndroid Build Coastguard Worker            (y3 - srcTop) * scale);
2064*c8dee2aaSAndroid Build Coastguard Worker    ctx.stroke();
2065*c8dee2aaSAndroid Build Coastguard Worker}
2066*c8dee2aaSAndroid Build Coastguard Worker
2067*c8dee2aaSAndroid Build Coastguard Workerfunction interp(A, B, t) {
2068*c8dee2aaSAndroid Build Coastguard Worker    return A + (B - A) * t;
2069*c8dee2aaSAndroid Build Coastguard Worker}
2070*c8dee2aaSAndroid Build Coastguard Worker
2071*c8dee2aaSAndroid Build Coastguard Workerfunction interp_quad_coords(x1, x2, x3, t)
2072*c8dee2aaSAndroid Build Coastguard Worker{
2073*c8dee2aaSAndroid Build Coastguard Worker    var ab = interp(x1, x2, t);
2074*c8dee2aaSAndroid Build Coastguard Worker    var bc = interp(x2, x3, t);
2075*c8dee2aaSAndroid Build Coastguard Worker    var abc = interp(ab, bc, t);
2076*c8dee2aaSAndroid Build Coastguard Worker    return abc;
2077*c8dee2aaSAndroid Build Coastguard Worker}
2078*c8dee2aaSAndroid Build Coastguard Worker
2079*c8dee2aaSAndroid Build Coastguard Workerfunction quadPartial(x1, y1, x2, y2, x3, y3, t1, t2) {
2080*c8dee2aaSAndroid Build Coastguard Worker    var ax = interp_quad_coords(x1, x2, x3, t1);
2081*c8dee2aaSAndroid Build Coastguard Worker    var ay = interp_quad_coords(y1, y2, y3, t1);
2082*c8dee2aaSAndroid Build Coastguard Worker    var dx = interp_quad_coords(x1, x2, x3, (t1 + t2) / 2);
2083*c8dee2aaSAndroid Build Coastguard Worker    var dy = interp_quad_coords(y1, y2, y3, (t1 + t2) / 2);
2084*c8dee2aaSAndroid Build Coastguard Worker    var cx = interp_quad_coords(x1, x2, x3, t2);
2085*c8dee2aaSAndroid Build Coastguard Worker    var cy = interp_quad_coords(y1, y2, y3, t2);
2086*c8dee2aaSAndroid Build Coastguard Worker    var bx = 2*dx - (ax + cx)/2;
2087*c8dee2aaSAndroid Build Coastguard Worker    var by = 2*dy - (ay + cy)/2;
2088*c8dee2aaSAndroid Build Coastguard Worker    var array = [
2089*c8dee2aaSAndroid Build Coastguard Worker        ax, ay, bx, by, cx, cy
2090*c8dee2aaSAndroid Build Coastguard Worker    ];
2091*c8dee2aaSAndroid Build Coastguard Worker    return array;
2092*c8dee2aaSAndroid Build Coastguard Worker}
2093*c8dee2aaSAndroid Build Coastguard Worker
2094*c8dee2aaSAndroid Build Coastguard Workerfunction drawQuadPartial(x1, y1, x2, y2, x3, y3, t1, t2) {
2095*c8dee2aaSAndroid Build Coastguard Worker    var a = quadPartial(x1, y1, x2, y2, x3, y3, t1, t2);
2096*c8dee2aaSAndroid Build Coastguard Worker    var ax = a[0];
2097*c8dee2aaSAndroid Build Coastguard Worker    var ay = a[1];
2098*c8dee2aaSAndroid Build Coastguard Worker    var bx = a[2];
2099*c8dee2aaSAndroid Build Coastguard Worker    var by = a[3];
2100*c8dee2aaSAndroid Build Coastguard Worker    var cx = a[4];
2101*c8dee2aaSAndroid Build Coastguard Worker    var cy = a[5];
2102*c8dee2aaSAndroid Build Coastguard Worker    if (alreadyDrawnQuad(ax, ay, bx, by, cx, cy)) {
2103*c8dee2aaSAndroid Build Coastguard Worker        return;
2104*c8dee2aaSAndroid Build Coastguard Worker    }
2105*c8dee2aaSAndroid Build Coastguard Worker    ctx.beginPath();
2106*c8dee2aaSAndroid Build Coastguard Worker    ctx.moveTo((ax - srcLeft) * scale,
2107*c8dee2aaSAndroid Build Coastguard Worker            (ay - srcTop) * scale);
2108*c8dee2aaSAndroid Build Coastguard Worker    ctx.quadraticCurveTo((bx - srcLeft) * scale,
2109*c8dee2aaSAndroid Build Coastguard Worker            (by - srcTop) * scale,
2110*c8dee2aaSAndroid Build Coastguard Worker            (cx - srcLeft) * scale,
2111*c8dee2aaSAndroid Build Coastguard Worker            (cy - srcTop) * scale);
2112*c8dee2aaSAndroid Build Coastguard Worker    ctx.stroke();
2113*c8dee2aaSAndroid Build Coastguard Worker}
2114*c8dee2aaSAndroid Build Coastguard Worker
2115*c8dee2aaSAndroid Build Coastguard Workerfunction alreadyDrawnConic(x1, y1, x2, y2, x3, y3, w) {
2116*c8dee2aaSAndroid Build Coastguard Worker    if (collect_bounds) {
2117*c8dee2aaSAndroid Build Coastguard Worker        if (focus_enabled) {
2118*c8dee2aaSAndroid Build Coastguard Worker            focusXmin = Math.min(focusXmin, x1, x2, x3);
2119*c8dee2aaSAndroid Build Coastguard Worker            focusYmin = Math.min(focusYmin, y1, y2, y3);
2120*c8dee2aaSAndroid Build Coastguard Worker            focusXmax = Math.max(focusXmax, x1, x2, x3);
2121*c8dee2aaSAndroid Build Coastguard Worker            focusYmax = Math.max(focusYmax, y1, y2, y3);
2122*c8dee2aaSAndroid Build Coastguard Worker        }
2123*c8dee2aaSAndroid Build Coastguard Worker        return true;
2124*c8dee2aaSAndroid Build Coastguard Worker    }
2125*c8dee2aaSAndroid Build Coastguard Worker    for (var pts = 0; pts < drawnConics.length; pts += 8) {
2126*c8dee2aaSAndroid Build Coastguard Worker        if (x1 == drawnConics[pts] && y1 == drawnCubics[pts + 1]
2127*c8dee2aaSAndroid Build Coastguard Worker                && x2 == drawnCubics[pts + 2] && y2 == drawnCubics[pts + 3]
2128*c8dee2aaSAndroid Build Coastguard Worker                && x3 == drawnCubics[pts + 4] && y3 == drawnCubics[pts + 5]
2129*c8dee2aaSAndroid Build Coastguard Worker                && w == drawnCubics[pts + 6]) {
2130*c8dee2aaSAndroid Build Coastguard Worker            return true;
2131*c8dee2aaSAndroid Build Coastguard Worker        }
2132*c8dee2aaSAndroid Build Coastguard Worker    }
2133*c8dee2aaSAndroid Build Coastguard Worker    drawnConics.push(x1);
2134*c8dee2aaSAndroid Build Coastguard Worker    drawnConics.push(y1);
2135*c8dee2aaSAndroid Build Coastguard Worker    drawnConics.push(x2);
2136*c8dee2aaSAndroid Build Coastguard Worker    drawnConics.push(y2);
2137*c8dee2aaSAndroid Build Coastguard Worker    drawnConics.push(x3);
2138*c8dee2aaSAndroid Build Coastguard Worker    drawnConics.push(y3);
2139*c8dee2aaSAndroid Build Coastguard Worker    drawnCubics.push(w);
2140*c8dee2aaSAndroid Build Coastguard Worker    return false;
2141*c8dee2aaSAndroid Build Coastguard Worker}
2142*c8dee2aaSAndroid Build Coastguard Worker
2143*c8dee2aaSAndroid Build Coastguard Workervar kMaxConicToQuadPOW2 = 5;
2144*c8dee2aaSAndroid Build Coastguard Worker
2145*c8dee2aaSAndroid Build Coastguard Workerfunction computeQuadPOW2(curve, tol) {
2146*c8dee2aaSAndroid Build Coastguard Worker    var a = curve[6] - 1;
2147*c8dee2aaSAndroid Build Coastguard Worker    var k = a / (4 * (2 + a));
2148*c8dee2aaSAndroid Build Coastguard Worker    var x = k * (curve[0] - 2 * curve[2] + curve[4]);
2149*c8dee2aaSAndroid Build Coastguard Worker    var y = k * (curve[1] - 2 * curve[3] + curve[5]);
2150*c8dee2aaSAndroid Build Coastguard Worker
2151*c8dee2aaSAndroid Build Coastguard Worker    var error = Math.sqrt(x * x + y * y);
2152*c8dee2aaSAndroid Build Coastguard Worker    var pow2;
2153*c8dee2aaSAndroid Build Coastguard Worker    for (pow2 = 0; pow2 < kMaxConicToQuadPOW2; ++pow2) {
2154*c8dee2aaSAndroid Build Coastguard Worker        if (error <= tol) {
2155*c8dee2aaSAndroid Build Coastguard Worker            break;
2156*c8dee2aaSAndroid Build Coastguard Worker        }
2157*c8dee2aaSAndroid Build Coastguard Worker        error *= 0.25;
2158*c8dee2aaSAndroid Build Coastguard Worker    }
2159*c8dee2aaSAndroid Build Coastguard Worker    return pow2;
2160*c8dee2aaSAndroid Build Coastguard Worker}
2161*c8dee2aaSAndroid Build Coastguard Worker
2162*c8dee2aaSAndroid Build Coastguard Workerfunction subdivide_w_value(w) {
2163*c8dee2aaSAndroid Build Coastguard Worker    return Math.sqrt(0.5 + w * 0.5);
2164*c8dee2aaSAndroid Build Coastguard Worker}
2165*c8dee2aaSAndroid Build Coastguard Worker
2166*c8dee2aaSAndroid Build Coastguard Workerfunction chop(curve, part1, part2) {
2167*c8dee2aaSAndroid Build Coastguard Worker    var w = curve[6];
2168*c8dee2aaSAndroid Build Coastguard Worker    var scale = 1 / (1 + w);
2169*c8dee2aaSAndroid Build Coastguard Worker    part1[0] = curve[0];
2170*c8dee2aaSAndroid Build Coastguard Worker    part1[1] = curve[1];
2171*c8dee2aaSAndroid Build Coastguard Worker    part1[2] = (curve[0] + curve[2] * w) * scale;
2172*c8dee2aaSAndroid Build Coastguard Worker    part1[3] = (curve[1] + curve[3] * w) * scale;
2173*c8dee2aaSAndroid Build Coastguard Worker    part1[4] = part2[0] = (curve[0] + (curve[2] * w) * 2 + curve[4]) * scale * 0.5;
2174*c8dee2aaSAndroid Build Coastguard Worker    part1[5] = part2[1] = (curve[1] + (curve[3] * w) * 2 + curve[5]) * scale * 0.5;
2175*c8dee2aaSAndroid Build Coastguard Worker    part2[2] = (curve[2] * w + curve[4]) * scale;
2176*c8dee2aaSAndroid Build Coastguard Worker    part2[3] = (curve[3] * w + curve[5]) * scale;
2177*c8dee2aaSAndroid Build Coastguard Worker    part2[4] = curve[4];
2178*c8dee2aaSAndroid Build Coastguard Worker    part2[5] = curve[5];
2179*c8dee2aaSAndroid Build Coastguard Worker    part1[6] = part2[6] = subdivide_w_value(w);
2180*c8dee2aaSAndroid Build Coastguard Worker}
2181*c8dee2aaSAndroid Build Coastguard Worker
2182*c8dee2aaSAndroid Build Coastguard Workerfunction subdivide(curve, level, pts) {
2183*c8dee2aaSAndroid Build Coastguard Worker    if (0 == level) {
2184*c8dee2aaSAndroid Build Coastguard Worker        pts.push(curve[2]);
2185*c8dee2aaSAndroid Build Coastguard Worker        pts.push(curve[3]);
2186*c8dee2aaSAndroid Build Coastguard Worker        pts.push(curve[4]);
2187*c8dee2aaSAndroid Build Coastguard Worker        pts.push(curve[5]);
2188*c8dee2aaSAndroid Build Coastguard Worker    } else {
2189*c8dee2aaSAndroid Build Coastguard Worker        var part1 = [], part2 = [];
2190*c8dee2aaSAndroid Build Coastguard Worker        chop(curve, part1, part2);
2191*c8dee2aaSAndroid Build Coastguard Worker        --level;
2192*c8dee2aaSAndroid Build Coastguard Worker        subdivide(part1, level, pts);
2193*c8dee2aaSAndroid Build Coastguard Worker        subdivide(part2, level, pts);
2194*c8dee2aaSAndroid Build Coastguard Worker    }
2195*c8dee2aaSAndroid Build Coastguard Worker}
2196*c8dee2aaSAndroid Build Coastguard Worker
2197*c8dee2aaSAndroid Build Coastguard Workerfunction chopIntoQuadsPOW2(curve, pow2, pts) {
2198*c8dee2aaSAndroid Build Coastguard Worker    subdivide(curve, pow2, pts);
2199*c8dee2aaSAndroid Build Coastguard Worker    return 1 << pow2;
2200*c8dee2aaSAndroid Build Coastguard Worker}
2201*c8dee2aaSAndroid Build Coastguard Worker
2202*c8dee2aaSAndroid Build Coastguard Workerfunction drawConicWithQuads(x1, y1, x2, y2, x3, y3, w) {
2203*c8dee2aaSAndroid Build Coastguard Worker    if (alreadyDrawnConic(x1, y1, x2, y2, x3, y3, w)) {
2204*c8dee2aaSAndroid Build Coastguard Worker        return;
2205*c8dee2aaSAndroid Build Coastguard Worker    }
2206*c8dee2aaSAndroid Build Coastguard Worker    ctx.beginPath();
2207*c8dee2aaSAndroid Build Coastguard Worker    ctx.moveTo((x1 - srcLeft) * scale,
2208*c8dee2aaSAndroid Build Coastguard Worker            (y1 - srcTop) * scale);
2209*c8dee2aaSAndroid Build Coastguard Worker    var tol = 1 / scale;
2210*c8dee2aaSAndroid Build Coastguard Worker    var curve = [x1, y1, x2, y2, x3, y3, w];
2211*c8dee2aaSAndroid Build Coastguard Worker    var pow2 = computeQuadPOW2(curve, tol);
2212*c8dee2aaSAndroid Build Coastguard Worker    var pts = [];
2213*c8dee2aaSAndroid Build Coastguard Worker    chopIntoQuadsPOW2(curve, pow2, pts);
2214*c8dee2aaSAndroid Build Coastguard Worker    for (var i = 0; i < pts.length; i += 4) {
2215*c8dee2aaSAndroid Build Coastguard Worker        ctx.quadraticCurveTo(
2216*c8dee2aaSAndroid Build Coastguard Worker            (pts[i + 0] - srcLeft) * scale, (pts[i + 1] - srcTop) * scale,
2217*c8dee2aaSAndroid Build Coastguard Worker            (pts[i + 2] - srcLeft) * scale, (pts[i + 3] - srcTop) * scale);
2218*c8dee2aaSAndroid Build Coastguard Worker    }
2219*c8dee2aaSAndroid Build Coastguard Worker    ctx.stroke();
2220*c8dee2aaSAndroid Build Coastguard Worker}
2221*c8dee2aaSAndroid Build Coastguard Worker
2222*c8dee2aaSAndroid Build Coastguard Workerfunction conic_eval_numerator(x1, x2, x3, w, t) {
2223*c8dee2aaSAndroid Build Coastguard Worker    var src2w = x2 * w;
2224*c8dee2aaSAndroid Build Coastguard Worker    var C = x1;
2225*c8dee2aaSAndroid Build Coastguard Worker    var A = x3 - 2 * src2w + C;
2226*c8dee2aaSAndroid Build Coastguard Worker    var B = 2 * (src2w - C);
2227*c8dee2aaSAndroid Build Coastguard Worker    return (A * t + B) * t + C;
2228*c8dee2aaSAndroid Build Coastguard Worker}
2229*c8dee2aaSAndroid Build Coastguard Worker
2230*c8dee2aaSAndroid Build Coastguard Worker
2231*c8dee2aaSAndroid Build Coastguard Workerfunction conic_eval_denominator(w, t) {
2232*c8dee2aaSAndroid Build Coastguard Worker    var B = 2 * (w - 1);
2233*c8dee2aaSAndroid Build Coastguard Worker    var C = 1;
2234*c8dee2aaSAndroid Build Coastguard Worker    var A = -B;
2235*c8dee2aaSAndroid Build Coastguard Worker    return (A * t + B) * t + C;
2236*c8dee2aaSAndroid Build Coastguard Worker}
2237*c8dee2aaSAndroid Build Coastguard Worker
2238*c8dee2aaSAndroid Build Coastguard Workerfunction conicPartial(x1, y1, x2, y2, x3, y3, w, t1, t2) {
2239*c8dee2aaSAndroid Build Coastguard Worker    var ax = conic_eval_numerator(x1, x2, x3, w, t1);
2240*c8dee2aaSAndroid Build Coastguard Worker    var ay = conic_eval_numerator(y1, y2, y3, w, t1);
2241*c8dee2aaSAndroid Build Coastguard Worker    var az = conic_eval_denominator(w, t1);
2242*c8dee2aaSAndroid Build Coastguard Worker    var midT = (t1 + t2) / 2;
2243*c8dee2aaSAndroid Build Coastguard Worker    var dx = conic_eval_numerator(x1, x2, x3, w, midT);
2244*c8dee2aaSAndroid Build Coastguard Worker    var dy = conic_eval_numerator(y1, y2, y3, w, midT);
2245*c8dee2aaSAndroid Build Coastguard Worker    var dz = conic_eval_denominator(w, midT);
2246*c8dee2aaSAndroid Build Coastguard Worker    var cx = conic_eval_numerator(x1, x2, x3, w, t2);
2247*c8dee2aaSAndroid Build Coastguard Worker    var cy = conic_eval_numerator(y1, y2, y3, w, t2);
2248*c8dee2aaSAndroid Build Coastguard Worker    var cz = conic_eval_denominator(w, t2);
2249*c8dee2aaSAndroid Build Coastguard Worker    var bx = 2 * dx - (ax + cx) / 2;
2250*c8dee2aaSAndroid Build Coastguard Worker    var by = 2 * dy - (ay + cy) / 2;
2251*c8dee2aaSAndroid Build Coastguard Worker    var bz = 2 * dz - (az + cz) / 2;
2252*c8dee2aaSAndroid Build Coastguard Worker    var dt = t2 - t1;
2253*c8dee2aaSAndroid Build Coastguard Worker    var dt_1 = 1 - dt;
2254*c8dee2aaSAndroid Build Coastguard Worker    var array = [
2255*c8dee2aaSAndroid Build Coastguard Worker        ax / az, ay / az, bx / bz, by / bz, cx / cz, cy / cz, 0
2256*c8dee2aaSAndroid Build Coastguard Worker    ];
2257*c8dee2aaSAndroid Build Coastguard Worker    var dMidAC = { x:(array[0] + array[4]) / 2, y:(array[1] + array[5]) / 2 };
2258*c8dee2aaSAndroid Build Coastguard Worker    var dMid = { x:dx / dz, y:dy / dz };
2259*c8dee2aaSAndroid Build Coastguard Worker    var dWNumer = { x:dMidAC.x - dMid.x, y:dMidAC.y - dMid.y };
2260*c8dee2aaSAndroid Build Coastguard Worker    var dWDenom = { x:dMid.x - array[2], y:dMid.y - array[3] };
2261*c8dee2aaSAndroid Build Coastguard Worker    var partW = Math.sqrt(dWNumer.x * dWNumer.x + dWNumer.y * dWNumer.y)
2262*c8dee2aaSAndroid Build Coastguard Worker                / Math.sqrt(dWDenom.x * dWDenom.x + dWDenom.y * dWDenom.y);
2263*c8dee2aaSAndroid Build Coastguard Worker    array[6] = partW;
2264*c8dee2aaSAndroid Build Coastguard Worker    return array;
2265*c8dee2aaSAndroid Build Coastguard Worker}
2266*c8dee2aaSAndroid Build Coastguard Worker
2267*c8dee2aaSAndroid Build Coastguard Workerfunction drawConicPartial(x1, y1, x2, y2, x3, y3, w, t1, t2) {
2268*c8dee2aaSAndroid Build Coastguard Worker    var a = conicPartial(x1, y1, x2, y2, x3, y3, w, t1, t2);
2269*c8dee2aaSAndroid Build Coastguard Worker    var ax = a[0];
2270*c8dee2aaSAndroid Build Coastguard Worker    var ay = a[1];
2271*c8dee2aaSAndroid Build Coastguard Worker    var bx = a[2];
2272*c8dee2aaSAndroid Build Coastguard Worker    var by = a[3];
2273*c8dee2aaSAndroid Build Coastguard Worker    var cx = a[4];
2274*c8dee2aaSAndroid Build Coastguard Worker    var cy = a[5];
2275*c8dee2aaSAndroid Build Coastguard Worker    var w_ = a[6];
2276*c8dee2aaSAndroid Build Coastguard Worker    drawConicWithQuads(ax, ay, bx, by, cx, cy, w_);
2277*c8dee2aaSAndroid Build Coastguard Worker}
2278*c8dee2aaSAndroid Build Coastguard Worker
2279*c8dee2aaSAndroid Build Coastguard Workerfunction alreadyDrawnCubic(x1, y1, x2, y2, x3, y3, x4, y4) {
2280*c8dee2aaSAndroid Build Coastguard Worker    if (collect_bounds) {
2281*c8dee2aaSAndroid Build Coastguard Worker        if (focus_enabled) {
2282*c8dee2aaSAndroid Build Coastguard Worker            focusXmin = Math.min(focusXmin, x1, x2, x3, x4);
2283*c8dee2aaSAndroid Build Coastguard Worker            focusYmin = Math.min(focusYmin, y1, y2, y3, y4);
2284*c8dee2aaSAndroid Build Coastguard Worker            focusXmax = Math.max(focusXmax, x1, x2, x3, x4);
2285*c8dee2aaSAndroid Build Coastguard Worker            focusYmax = Math.max(focusYmax, y1, y2, y3, y4);
2286*c8dee2aaSAndroid Build Coastguard Worker        }
2287*c8dee2aaSAndroid Build Coastguard Worker        return true;
2288*c8dee2aaSAndroid Build Coastguard Worker    }
2289*c8dee2aaSAndroid Build Coastguard Worker    for (var pts = 0; pts < drawnCubics.length; pts += 8) {
2290*c8dee2aaSAndroid Build Coastguard Worker        if (x1 == drawnCubics[pts] && y1 == drawnCubics[pts + 1]
2291*c8dee2aaSAndroid Build Coastguard Worker                && x2 == drawnCubics[pts + 2] && y2 == drawnCubics[pts + 3]
2292*c8dee2aaSAndroid Build Coastguard Worker                && x3 == drawnCubics[pts + 4] && y3 == drawnCubics[pts + 5]
2293*c8dee2aaSAndroid Build Coastguard Worker                && x4 == drawnCubics[pts + 6] && y4 == drawnCubics[pts + 7]) {
2294*c8dee2aaSAndroid Build Coastguard Worker            return true;
2295*c8dee2aaSAndroid Build Coastguard Worker        }
2296*c8dee2aaSAndroid Build Coastguard Worker    }
2297*c8dee2aaSAndroid Build Coastguard Worker    drawnCubics.push(x1);
2298*c8dee2aaSAndroid Build Coastguard Worker    drawnCubics.push(y1);
2299*c8dee2aaSAndroid Build Coastguard Worker    drawnCubics.push(x2);
2300*c8dee2aaSAndroid Build Coastguard Worker    drawnCubics.push(y2);
2301*c8dee2aaSAndroid Build Coastguard Worker    drawnCubics.push(x3);
2302*c8dee2aaSAndroid Build Coastguard Worker    drawnCubics.push(y3);
2303*c8dee2aaSAndroid Build Coastguard Worker    drawnCubics.push(x4);
2304*c8dee2aaSAndroid Build Coastguard Worker    drawnCubics.push(y4);
2305*c8dee2aaSAndroid Build Coastguard Worker    return false;
2306*c8dee2aaSAndroid Build Coastguard Worker}
2307*c8dee2aaSAndroid Build Coastguard Worker
2308*c8dee2aaSAndroid Build Coastguard Workerfunction drawCubic(x1, y1, x2, y2, x3, y3, x4, y4) {
2309*c8dee2aaSAndroid Build Coastguard Worker    if (alreadyDrawnCubic(x1, y1, x2, y2, x3, y3, x4, y4)) {
2310*c8dee2aaSAndroid Build Coastguard Worker        return;
2311*c8dee2aaSAndroid Build Coastguard Worker    }
2312*c8dee2aaSAndroid Build Coastguard Worker    ctx.beginPath();
2313*c8dee2aaSAndroid Build Coastguard Worker    ctx.moveTo((x1 - srcLeft) * scale,
2314*c8dee2aaSAndroid Build Coastguard Worker            (y1 - srcTop) * scale);
2315*c8dee2aaSAndroid Build Coastguard Worker    ctx.bezierCurveTo((x2 - srcLeft) * scale,
2316*c8dee2aaSAndroid Build Coastguard Worker            (y2 - srcTop) * scale,
2317*c8dee2aaSAndroid Build Coastguard Worker            (x3 - srcLeft) * scale,
2318*c8dee2aaSAndroid Build Coastguard Worker            (y3 - srcTop) * scale,
2319*c8dee2aaSAndroid Build Coastguard Worker            (x4 - srcLeft) * scale,
2320*c8dee2aaSAndroid Build Coastguard Worker            (y4 - srcTop) * scale);
2321*c8dee2aaSAndroid Build Coastguard Worker    ctx.stroke();
2322*c8dee2aaSAndroid Build Coastguard Worker}
2323*c8dee2aaSAndroid Build Coastguard Worker
2324*c8dee2aaSAndroid Build Coastguard Workerfunction interp_cubic_coords(x1, x2, x3, x4, t)
2325*c8dee2aaSAndroid Build Coastguard Worker{
2326*c8dee2aaSAndroid Build Coastguard Worker    var ab = interp(x1, x2, t);
2327*c8dee2aaSAndroid Build Coastguard Worker    var bc = interp(x2, x3, t);
2328*c8dee2aaSAndroid Build Coastguard Worker    var cd = interp(x3, x4, t);
2329*c8dee2aaSAndroid Build Coastguard Worker    var abc = interp(ab, bc, t);
2330*c8dee2aaSAndroid Build Coastguard Worker    var bcd = interp(bc, cd, t);
2331*c8dee2aaSAndroid Build Coastguard Worker    var abcd = interp(abc, bcd, t);
2332*c8dee2aaSAndroid Build Coastguard Worker    return abcd;
2333*c8dee2aaSAndroid Build Coastguard Worker}
2334*c8dee2aaSAndroid Build Coastguard Worker
2335*c8dee2aaSAndroid Build Coastguard Workerfunction cubicPartial(x1, y1, x2, y2, x3, y3, x4, y4, t1, t2) {
2336*c8dee2aaSAndroid Build Coastguard Worker    var ax = interp_cubic_coords(x1, x2, x3, x4, t1);
2337*c8dee2aaSAndroid Build Coastguard Worker    var ay = interp_cubic_coords(y1, y2, y3, y4, t1);
2338*c8dee2aaSAndroid Build Coastguard Worker    var ex = interp_cubic_coords(x1, x2, x3, x4, (t1*2+t2)/3);
2339*c8dee2aaSAndroid Build Coastguard Worker    var ey = interp_cubic_coords(y1, y2, y3, y4, (t1*2+t2)/3);
2340*c8dee2aaSAndroid Build Coastguard Worker    var fx = interp_cubic_coords(x1, x2, x3, x4, (t1+t2*2)/3);
2341*c8dee2aaSAndroid Build Coastguard Worker    var fy = interp_cubic_coords(y1, y2, y3, y4, (t1+t2*2)/3);
2342*c8dee2aaSAndroid Build Coastguard Worker    var dx = interp_cubic_coords(x1, x2, x3, x4, t2);
2343*c8dee2aaSAndroid Build Coastguard Worker    var dy = interp_cubic_coords(y1, y2, y3, y4, t2);
2344*c8dee2aaSAndroid Build Coastguard Worker    var mx = ex * 27 - ax * 8 - dx;
2345*c8dee2aaSAndroid Build Coastguard Worker    var my = ey * 27 - ay * 8 - dy;
2346*c8dee2aaSAndroid Build Coastguard Worker    var nx = fx * 27 - ax - dx * 8;
2347*c8dee2aaSAndroid Build Coastguard Worker    var ny = fy * 27 - ay - dy * 8;
2348*c8dee2aaSAndroid Build Coastguard Worker    var bx = (mx * 2 - nx) / 18;
2349*c8dee2aaSAndroid Build Coastguard Worker    var by = (my * 2 - ny) / 18;
2350*c8dee2aaSAndroid Build Coastguard Worker    var cx = (nx * 2 - mx) / 18;
2351*c8dee2aaSAndroid Build Coastguard Worker    var cy = (ny * 2 - my) / 18;
2352*c8dee2aaSAndroid Build Coastguard Worker    var array = [
2353*c8dee2aaSAndroid Build Coastguard Worker        ax, ay, bx, by, cx, cy, dx, dy
2354*c8dee2aaSAndroid Build Coastguard Worker    ];
2355*c8dee2aaSAndroid Build Coastguard Worker    return array;
2356*c8dee2aaSAndroid Build Coastguard Worker}
2357*c8dee2aaSAndroid Build Coastguard Worker
2358*c8dee2aaSAndroid Build Coastguard Workerfunction drawCubicPartial(x1, y1, x2, y2, x3, y3, x4, y4, t1, t2) {
2359*c8dee2aaSAndroid Build Coastguard Worker    var a = cubicPartial(x1, y1, x2, y2, x3, y3, x4, y4, t1, t2);
2360*c8dee2aaSAndroid Build Coastguard Worker    var ax = a[0];
2361*c8dee2aaSAndroid Build Coastguard Worker    var ay = a[1];
2362*c8dee2aaSAndroid Build Coastguard Worker    var bx = a[2];
2363*c8dee2aaSAndroid Build Coastguard Worker    var by = a[3];
2364*c8dee2aaSAndroid Build Coastguard Worker    var cx = a[4];
2365*c8dee2aaSAndroid Build Coastguard Worker    var cy = a[5];
2366*c8dee2aaSAndroid Build Coastguard Worker    var dx = a[6];
2367*c8dee2aaSAndroid Build Coastguard Worker    var dy = a[7];
2368*c8dee2aaSAndroid Build Coastguard Worker    if (alreadyDrawnCubic(ax, ay, bx, by, cx, cy, dx, dy)) {
2369*c8dee2aaSAndroid Build Coastguard Worker        return;
2370*c8dee2aaSAndroid Build Coastguard Worker    }
2371*c8dee2aaSAndroid Build Coastguard Worker    ctx.beginPath();
2372*c8dee2aaSAndroid Build Coastguard Worker    ctx.moveTo((ax - srcLeft) * scale,
2373*c8dee2aaSAndroid Build Coastguard Worker            (ay - srcTop) * scale);
2374*c8dee2aaSAndroid Build Coastguard Worker    ctx.bezierCurveTo((bx - srcLeft) * scale,
2375*c8dee2aaSAndroid Build Coastguard Worker            (by - srcTop) * scale,
2376*c8dee2aaSAndroid Build Coastguard Worker            (cx - srcLeft) * scale,
2377*c8dee2aaSAndroid Build Coastguard Worker            (cy - srcTop) * scale,
2378*c8dee2aaSAndroid Build Coastguard Worker            (dx - srcLeft) * scale,
2379*c8dee2aaSAndroid Build Coastguard Worker            (dy - srcTop) * scale);
2380*c8dee2aaSAndroid Build Coastguard Worker    ctx.stroke();
2381*c8dee2aaSAndroid Build Coastguard Worker}
2382*c8dee2aaSAndroid Build Coastguard Worker
2383*c8dee2aaSAndroid Build Coastguard Workerfunction drawCurve(c) {
2384*c8dee2aaSAndroid Build Coastguard Worker    switch (c.length) {
2385*c8dee2aaSAndroid Build Coastguard Worker        case 4:
2386*c8dee2aaSAndroid Build Coastguard Worker            drawLine(c[0], c[1], c[2], c[3]);
2387*c8dee2aaSAndroid Build Coastguard Worker            break;
2388*c8dee2aaSAndroid Build Coastguard Worker        case 6:
2389*c8dee2aaSAndroid Build Coastguard Worker            drawQuad(c[0], c[1], c[2], c[3], c[4], c[5]);
2390*c8dee2aaSAndroid Build Coastguard Worker            break;
2391*c8dee2aaSAndroid Build Coastguard Worker        case 7:
2392*c8dee2aaSAndroid Build Coastguard Worker            drawConicWithQuads(c[0], c[1], c[2], c[3], c[4], c[5], c[6]);
2393*c8dee2aaSAndroid Build Coastguard Worker            break;
2394*c8dee2aaSAndroid Build Coastguard Worker        case 8:
2395*c8dee2aaSAndroid Build Coastguard Worker            drawCubic(c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7]);
2396*c8dee2aaSAndroid Build Coastguard Worker            break;
2397*c8dee2aaSAndroid Build Coastguard Worker    }
2398*c8dee2aaSAndroid Build Coastguard Worker}
2399*c8dee2aaSAndroid Build Coastguard Worker
2400*c8dee2aaSAndroid Build Coastguard Workerfunction boundsWidth(pts) {
2401*c8dee2aaSAndroid Build Coastguard Worker    var min = pts[0];
2402*c8dee2aaSAndroid Build Coastguard Worker    var max = pts[0];
2403*c8dee2aaSAndroid Build Coastguard Worker    var length = pts.length == 7 ? 6 : pts.length;
2404*c8dee2aaSAndroid Build Coastguard Worker    for (var idx = 2; idx < length; idx += 2) {
2405*c8dee2aaSAndroid Build Coastguard Worker        min = Math.min(min, pts[idx]);
2406*c8dee2aaSAndroid Build Coastguard Worker        max = Math.max(max, pts[idx]);
2407*c8dee2aaSAndroid Build Coastguard Worker    }
2408*c8dee2aaSAndroid Build Coastguard Worker    return max - min;
2409*c8dee2aaSAndroid Build Coastguard Worker}
2410*c8dee2aaSAndroid Build Coastguard Worker
2411*c8dee2aaSAndroid Build Coastguard Workerfunction boundsHeight(pts) {
2412*c8dee2aaSAndroid Build Coastguard Worker    var min = pts[1];
2413*c8dee2aaSAndroid Build Coastguard Worker    var max = pts[1];
2414*c8dee2aaSAndroid Build Coastguard Worker    var length = pts.length == 7 ? 6 : pts.length;
2415*c8dee2aaSAndroid Build Coastguard Worker    for (var idx = 3; idx < length; idx += 2) {
2416*c8dee2aaSAndroid Build Coastguard Worker        min = Math.min(min, pts[idx]);
2417*c8dee2aaSAndroid Build Coastguard Worker        max = Math.max(max, pts[idx]);
2418*c8dee2aaSAndroid Build Coastguard Worker    }
2419*c8dee2aaSAndroid Build Coastguard Worker    return max - min;
2420*c8dee2aaSAndroid Build Coastguard Worker}
2421*c8dee2aaSAndroid Build Coastguard Worker
2422*c8dee2aaSAndroid Build Coastguard Workerfunction tangent(pts) {
2423*c8dee2aaSAndroid Build Coastguard Worker    var dx = pts[2] - pts[0];
2424*c8dee2aaSAndroid Build Coastguard Worker    var dy = pts[3] - pts[1];
2425*c8dee2aaSAndroid Build Coastguard Worker    if (dx == 0 && dy == 0 && pts.length > 4) {
2426*c8dee2aaSAndroid Build Coastguard Worker        dx = pts[4] - pts[0];
2427*c8dee2aaSAndroid Build Coastguard Worker        dy = pts[5] - pts[1];
2428*c8dee2aaSAndroid Build Coastguard Worker        if (dx == 0 && dy == 0 && pts.length == 8) {
2429*c8dee2aaSAndroid Build Coastguard Worker            dx = pts[6] - pts[0];
2430*c8dee2aaSAndroid Build Coastguard Worker            dy = pts[7] - pts[1];
2431*c8dee2aaSAndroid Build Coastguard Worker        }
2432*c8dee2aaSAndroid Build Coastguard Worker    }
2433*c8dee2aaSAndroid Build Coastguard Worker    return Math.atan2(-dy, dx);
2434*c8dee2aaSAndroid Build Coastguard Worker}
2435*c8dee2aaSAndroid Build Coastguard Worker
2436*c8dee2aaSAndroid Build Coastguard Workerfunction hodograph(cubic) {
2437*c8dee2aaSAndroid Build Coastguard Worker    var hodo = [];
2438*c8dee2aaSAndroid Build Coastguard Worker    hodo[0] = 3 * (cubic[2] - cubic[0]);
2439*c8dee2aaSAndroid Build Coastguard Worker    hodo[1] = 3 * (cubic[3] - cubic[1]);
2440*c8dee2aaSAndroid Build Coastguard Worker    hodo[2] = 3 * (cubic[4] - cubic[2]);
2441*c8dee2aaSAndroid Build Coastguard Worker    hodo[3] = 3 * (cubic[5] - cubic[3]);
2442*c8dee2aaSAndroid Build Coastguard Worker    hodo[4] = 3 * (cubic[6] - cubic[4]);
2443*c8dee2aaSAndroid Build Coastguard Worker    hodo[5] = 3 * (cubic[7] - cubic[5]);
2444*c8dee2aaSAndroid Build Coastguard Worker    return hodo;
2445*c8dee2aaSAndroid Build Coastguard Worker}
2446*c8dee2aaSAndroid Build Coastguard Worker
2447*c8dee2aaSAndroid Build Coastguard Workerfunction hodograph2(cubic) {
2448*c8dee2aaSAndroid Build Coastguard Worker    var quad = hodograph(cubic);
2449*c8dee2aaSAndroid Build Coastguard Worker    var hodo = [];
2450*c8dee2aaSAndroid Build Coastguard Worker    hodo[0] = 2 * (quad[2] - quad[0]);
2451*c8dee2aaSAndroid Build Coastguard Worker    hodo[1] = 2 * (quad[3] - quad[1]);
2452*c8dee2aaSAndroid Build Coastguard Worker    hodo[2] = 2 * (quad[4] - quad[2]);
2453*c8dee2aaSAndroid Build Coastguard Worker    hodo[3] = 2 * (quad[5] - quad[3]);
2454*c8dee2aaSAndroid Build Coastguard Worker    return hodo;
2455*c8dee2aaSAndroid Build Coastguard Worker}
2456*c8dee2aaSAndroid Build Coastguard Worker
2457*c8dee2aaSAndroid Build Coastguard Workerfunction quadraticRootsReal(A, B, C, s) {
2458*c8dee2aaSAndroid Build Coastguard Worker    if (A == 0) {
2459*c8dee2aaSAndroid Build Coastguard Worker        if (B == 0) {
2460*c8dee2aaSAndroid Build Coastguard Worker            s[0] = 0;
2461*c8dee2aaSAndroid Build Coastguard Worker            return C == 0;
2462*c8dee2aaSAndroid Build Coastguard Worker        }
2463*c8dee2aaSAndroid Build Coastguard Worker        s[0] = -C / B;
2464*c8dee2aaSAndroid Build Coastguard Worker        return 1;
2465*c8dee2aaSAndroid Build Coastguard Worker    }
2466*c8dee2aaSAndroid Build Coastguard Worker    /* normal form: x^2 + px + q = 0 */
2467*c8dee2aaSAndroid Build Coastguard Worker    var p = B / (2 * A);
2468*c8dee2aaSAndroid Build Coastguard Worker    var q = C / A;
2469*c8dee2aaSAndroid Build Coastguard Worker    var p2 = p * p;
2470*c8dee2aaSAndroid Build Coastguard Worker    if (p2 < q) {
2471*c8dee2aaSAndroid Build Coastguard Worker        return 0;
2472*c8dee2aaSAndroid Build Coastguard Worker    }
2473*c8dee2aaSAndroid Build Coastguard Worker    var sqrt_D = 0;
2474*c8dee2aaSAndroid Build Coastguard Worker    if (p2 > q) {
2475*c8dee2aaSAndroid Build Coastguard Worker        sqrt_D = sqrt(p2 - q);
2476*c8dee2aaSAndroid Build Coastguard Worker    }
2477*c8dee2aaSAndroid Build Coastguard Worker    s[0] = sqrt_D - p;
2478*c8dee2aaSAndroid Build Coastguard Worker    s[1] = -sqrt_D - p;
2479*c8dee2aaSAndroid Build Coastguard Worker    return 1 + s[0] != s[1];
2480*c8dee2aaSAndroid Build Coastguard Worker}
2481*c8dee2aaSAndroid Build Coastguard Worker
2482*c8dee2aaSAndroid Build Coastguard Workerfunction add_valid_ts(s, realRoots, t) {
2483*c8dee2aaSAndroid Build Coastguard Worker    var foundRoots = 0;
2484*c8dee2aaSAndroid Build Coastguard Worker    for (var index = 0; index < realRoots; ++index) {
2485*c8dee2aaSAndroid Build Coastguard Worker        var tValue = s[index];
2486*c8dee2aaSAndroid Build Coastguard Worker        if (tValue >= 0 && tValue <= 1) {
2487*c8dee2aaSAndroid Build Coastguard Worker            for (var idx2 = 0; idx2 < foundRoots; ++idx2) {
2488*c8dee2aaSAndroid Build Coastguard Worker                if (t[idx2] != tValue) {
2489*c8dee2aaSAndroid Build Coastguard Worker                    t[foundRoots++] = tValue;
2490*c8dee2aaSAndroid Build Coastguard Worker                }
2491*c8dee2aaSAndroid Build Coastguard Worker            }
2492*c8dee2aaSAndroid Build Coastguard Worker        }
2493*c8dee2aaSAndroid Build Coastguard Worker    }
2494*c8dee2aaSAndroid Build Coastguard Worker    return foundRoots;
2495*c8dee2aaSAndroid Build Coastguard Worker}
2496*c8dee2aaSAndroid Build Coastguard Worker
2497*c8dee2aaSAndroid Build Coastguard Workerfunction quadraticRootsValidT(a, b, c, t) {
2498*c8dee2aaSAndroid Build Coastguard Worker    var s = [];
2499*c8dee2aaSAndroid Build Coastguard Worker    var realRoots = quadraticRootsReal(A, B, C, s);
2500*c8dee2aaSAndroid Build Coastguard Worker    var foundRoots = add_valid_ts(s, realRoots, t);
2501*c8dee2aaSAndroid Build Coastguard Worker    return foundRoots != 0;
2502*c8dee2aaSAndroid Build Coastguard Worker}
2503*c8dee2aaSAndroid Build Coastguard Worker
2504*c8dee2aaSAndroid Build Coastguard Workerfunction find_cubic_inflections(cubic, tValues) {
2505*c8dee2aaSAndroid Build Coastguard Worker    var Ax = src[2] - src[0];
2506*c8dee2aaSAndroid Build Coastguard Worker    var Ay = src[3] - src[1];
2507*c8dee2aaSAndroid Build Coastguard Worker    var Bx = src[4] - 2 * src[2] + src[0];
2508*c8dee2aaSAndroid Build Coastguard Worker    var By = src[5] - 2 * src[3] + src[1];
2509*c8dee2aaSAndroid Build Coastguard Worker    var Cx = src[6] + 3 * (src[2] - src[4]) - src[0];
2510*c8dee2aaSAndroid Build Coastguard Worker    var Cy = src[7] + 3 * (src[3] - src[5]) - src[1];
2511*c8dee2aaSAndroid Build Coastguard Worker    return quadraticRootsValidT(Bx * Cy - By * Cx, (Ax * Cy - Ay * Cx),
2512*c8dee2aaSAndroid Build Coastguard Worker            Ax * By - Ay * Bx, tValues);
2513*c8dee2aaSAndroid Build Coastguard Worker}
2514*c8dee2aaSAndroid Build Coastguard Worker
2515*c8dee2aaSAndroid Build Coastguard Workerfunction dxy_at_t(curve, type, t) {
2516*c8dee2aaSAndroid Build Coastguard Worker    var dxy = {};
2517*c8dee2aaSAndroid Build Coastguard Worker    if (type == PATH_LINE) {
2518*c8dee2aaSAndroid Build Coastguard Worker        dxy.x = curve[2] - curve[0];
2519*c8dee2aaSAndroid Build Coastguard Worker        dxy.y = curve[3] - curve[1];
2520*c8dee2aaSAndroid Build Coastguard Worker    } else if (type == PATH_QUAD) {
2521*c8dee2aaSAndroid Build Coastguard Worker        var a = t - 1;
2522*c8dee2aaSAndroid Build Coastguard Worker        var b = 1 - 2 * t;
2523*c8dee2aaSAndroid Build Coastguard Worker        var c = t;
2524*c8dee2aaSAndroid Build Coastguard Worker        dxy.x = a * curve[0] + b * curve[2] + c * curve[4];
2525*c8dee2aaSAndroid Build Coastguard Worker        dxy.y = a * curve[1] + b * curve[3] + c * curve[5];
2526*c8dee2aaSAndroid Build Coastguard Worker    } else if (type == PATH_CONIC) {
2527*c8dee2aaSAndroid Build Coastguard Worker        var p20x = curve[4] - curve[0];
2528*c8dee2aaSAndroid Build Coastguard Worker        var p20y = curve[5] - curve[1];
2529*c8dee2aaSAndroid Build Coastguard Worker        var p10xw = (curve[2] - curve[0]) * curve[6];
2530*c8dee2aaSAndroid Build Coastguard Worker        var p10yw = (curve[3] - curve[1]) * curve[6];
2531*c8dee2aaSAndroid Build Coastguard Worker        var coeff0x = curve[6] * p20x - p20x;
2532*c8dee2aaSAndroid Build Coastguard Worker        var coeff0y = curve[6] * p20y - p20y;
2533*c8dee2aaSAndroid Build Coastguard Worker        var coeff1x = p20x - 2 * p10xw;
2534*c8dee2aaSAndroid Build Coastguard Worker        var coeff1y = p20y - 2 * p10yw;
2535*c8dee2aaSAndroid Build Coastguard Worker        dxy.x = t * (t * coeff0x + coeff1x) + p10xw;
2536*c8dee2aaSAndroid Build Coastguard Worker        dxy.y = t * (t * coeff0y + coeff1y) + p10yw;
2537*c8dee2aaSAndroid Build Coastguard Worker    } else if (type == PATH_CUBIC) {
2538*c8dee2aaSAndroid Build Coastguard Worker        var one_t = 1 - t;
2539*c8dee2aaSAndroid Build Coastguard Worker        var a = curve[0];
2540*c8dee2aaSAndroid Build Coastguard Worker        var b = curve[2];
2541*c8dee2aaSAndroid Build Coastguard Worker        var c = curve[4];
2542*c8dee2aaSAndroid Build Coastguard Worker        var d = curve[6];
2543*c8dee2aaSAndroid Build Coastguard Worker        dxy.x = 3 * ((b - a) * one_t * one_t + 2 * (c - b) * t * one_t + (d - c) * t * t);
2544*c8dee2aaSAndroid Build Coastguard Worker        a = curve[1];
2545*c8dee2aaSAndroid Build Coastguard Worker        b = curve[3];
2546*c8dee2aaSAndroid Build Coastguard Worker        c = curve[5];
2547*c8dee2aaSAndroid Build Coastguard Worker        d = curve[7];
2548*c8dee2aaSAndroid Build Coastguard Worker        dxy.y = 3 * ((b - a) * one_t * one_t + 2 * (c - b) * t * one_t + (d - c) * t * t);
2549*c8dee2aaSAndroid Build Coastguard Worker    }
2550*c8dee2aaSAndroid Build Coastguard Worker    return dxy;
2551*c8dee2aaSAndroid Build Coastguard Worker}
2552*c8dee2aaSAndroid Build Coastguard Worker
2553*c8dee2aaSAndroid Build Coastguard Workerfunction dpt_at_t(curve, t) {
2554*c8dee2aaSAndroid Build Coastguard Worker    var type = PATH_LINE + (curve.length / 2 - 2);
2555*c8dee2aaSAndroid Build Coastguard Worker    return dxy_at_t(curve, type, t);
2556*c8dee2aaSAndroid Build Coastguard Worker}
2557*c8dee2aaSAndroid Build Coastguard Worker
2558*c8dee2aaSAndroid Build Coastguard Workerfunction drawLabel(num, px, py) {
2559*c8dee2aaSAndroid Build Coastguard Worker    ctx.beginPath();
2560*c8dee2aaSAndroid Build Coastguard Worker    ctx.arc(px, py, 8, 0, Math.PI*2, true);
2561*c8dee2aaSAndroid Build Coastguard Worker    ctx.closePath();
2562*c8dee2aaSAndroid Build Coastguard Worker    ctx.strokeStyle = "rgba(0,0,0, 0.4)";
2563*c8dee2aaSAndroid Build Coastguard Worker    ctx.lineWidth = num == 0 || num == 3 ? 2 : 1;
2564*c8dee2aaSAndroid Build Coastguard Worker    ctx.stroke();
2565*c8dee2aaSAndroid Build Coastguard Worker    ctx.fillStyle = "black";
2566*c8dee2aaSAndroid Build Coastguard Worker    ctx.font = "normal 10px Arial";
2567*c8dee2aaSAndroid Build Coastguard Worker  //  ctx.rotate(0.001);
2568*c8dee2aaSAndroid Build Coastguard Worker    ctx.fillText(num, px - 2, py + 3);
2569*c8dee2aaSAndroid Build Coastguard Worker  //  ctx.rotate(-0.001);
2570*c8dee2aaSAndroid Build Coastguard Worker}
2571*c8dee2aaSAndroid Build Coastguard Worker
2572*c8dee2aaSAndroid Build Coastguard Workerfunction drawLabelX(ymin, num, loc) {
2573*c8dee2aaSAndroid Build Coastguard Worker    var px = (loc - srcLeft) * scale;
2574*c8dee2aaSAndroid Build Coastguard Worker    var py = (ymin - srcTop) * scale - 20;
2575*c8dee2aaSAndroid Build Coastguard Worker    drawLabel(num, px, py);
2576*c8dee2aaSAndroid Build Coastguard Worker}
2577*c8dee2aaSAndroid Build Coastguard Worker
2578*c8dee2aaSAndroid Build Coastguard Workerfunction drawLabelY(xmin, num, loc) {
2579*c8dee2aaSAndroid Build Coastguard Worker    var px = (xmin - srcLeft) * scale - 20;
2580*c8dee2aaSAndroid Build Coastguard Worker    var py = (loc - srcTop) * scale;
2581*c8dee2aaSAndroid Build Coastguard Worker    drawLabel(num, px, py);
2582*c8dee2aaSAndroid Build Coastguard Worker}
2583*c8dee2aaSAndroid Build Coastguard Worker
2584*c8dee2aaSAndroid Build Coastguard Workerfunction drawHodoOrigin(hx, hy, hMinX, hMinY, hMaxX, hMaxY) {
2585*c8dee2aaSAndroid Build Coastguard Worker    ctx.beginPath();
2586*c8dee2aaSAndroid Build Coastguard Worker    ctx.moveTo(hx, hy - 100);
2587*c8dee2aaSAndroid Build Coastguard Worker    ctx.lineTo(hx, hy);
2588*c8dee2aaSAndroid Build Coastguard Worker    ctx.strokeStyle = hMinY < 0 ? "green" : "blue";
2589*c8dee2aaSAndroid Build Coastguard Worker    ctx.stroke();
2590*c8dee2aaSAndroid Build Coastguard Worker    ctx.beginPath();
2591*c8dee2aaSAndroid Build Coastguard Worker    ctx.moveTo(hx, hy);
2592*c8dee2aaSAndroid Build Coastguard Worker    ctx.lineTo(hx, hy + 100);
2593*c8dee2aaSAndroid Build Coastguard Worker    ctx.strokeStyle = hMaxY > 0 ? "green" : "blue";
2594*c8dee2aaSAndroid Build Coastguard Worker    ctx.stroke();
2595*c8dee2aaSAndroid Build Coastguard Worker    ctx.beginPath();
2596*c8dee2aaSAndroid Build Coastguard Worker    ctx.moveTo(hx - 100, hy);
2597*c8dee2aaSAndroid Build Coastguard Worker    ctx.lineTo(hx, hy);
2598*c8dee2aaSAndroid Build Coastguard Worker    ctx.strokeStyle = hMinX < 0 ? "green" : "blue";
2599*c8dee2aaSAndroid Build Coastguard Worker    ctx.stroke();
2600*c8dee2aaSAndroid Build Coastguard Worker    ctx.beginPath();
2601*c8dee2aaSAndroid Build Coastguard Worker    ctx.moveTo(hx, hy);
2602*c8dee2aaSAndroid Build Coastguard Worker    ctx.lineTo(hx + 100, hy);
2603*c8dee2aaSAndroid Build Coastguard Worker    ctx.strokeStyle = hMaxX > 0 ? "green" : "blue";
2604*c8dee2aaSAndroid Build Coastguard Worker    ctx.stroke();
2605*c8dee2aaSAndroid Build Coastguard Worker}
2606*c8dee2aaSAndroid Build Coastguard Worker
2607*c8dee2aaSAndroid Build Coastguard Workerfunction scalexy(x, y, mag) {
2608*c8dee2aaSAndroid Build Coastguard Worker    var length = Math.sqrt(x * x + y * y);
2609*c8dee2aaSAndroid Build Coastguard Worker    return mag / length;
2610*c8dee2aaSAndroid Build Coastguard Worker}
2611*c8dee2aaSAndroid Build Coastguard Worker
2612*c8dee2aaSAndroid Build Coastguard Workerfunction drawArrow(x, y, dx, dy, s) {
2613*c8dee2aaSAndroid Build Coastguard Worker    var dscale = scalexy(dx, dy, 1 / scale * 100 * s);
2614*c8dee2aaSAndroid Build Coastguard Worker    dx *= dscale;
2615*c8dee2aaSAndroid Build Coastguard Worker    dy *= dscale;
2616*c8dee2aaSAndroid Build Coastguard Worker    ctx.beginPath();
2617*c8dee2aaSAndroid Build Coastguard Worker    ctx.moveTo((x - srcLeft) * scale, (y - srcTop) * scale);
2618*c8dee2aaSAndroid Build Coastguard Worker    x += dx;
2619*c8dee2aaSAndroid Build Coastguard Worker    y += dy;
2620*c8dee2aaSAndroid Build Coastguard Worker    ctx.lineTo((x - srcLeft) * scale, (y - srcTop) * scale);
2621*c8dee2aaSAndroid Build Coastguard Worker    dx /= 10;
2622*c8dee2aaSAndroid Build Coastguard Worker    dy /= 10;
2623*c8dee2aaSAndroid Build Coastguard Worker    ctx.lineTo((x - dy - srcLeft) * scale, (y + dx - srcTop) * scale);
2624*c8dee2aaSAndroid Build Coastguard Worker    ctx.lineTo((x + dx * 2 - srcLeft) * scale, (y + dy * 2 - srcTop) * scale);
2625*c8dee2aaSAndroid Build Coastguard Worker    ctx.lineTo((x + dy - srcLeft) * scale, (y - dx - srcTop) * scale);
2626*c8dee2aaSAndroid Build Coastguard Worker    ctx.lineTo((x - srcLeft) * scale, (y - srcTop) * scale);
2627*c8dee2aaSAndroid Build Coastguard Worker    ctx.strokeStyle = "rgba(0,75,0, 0.4)";
2628*c8dee2aaSAndroid Build Coastguard Worker    ctx.stroke();
2629*c8dee2aaSAndroid Build Coastguard Worker}
2630*c8dee2aaSAndroid Build Coastguard Worker
2631*c8dee2aaSAndroid Build Coastguard Workerfunction x_at_t(curve, t) {
2632*c8dee2aaSAndroid Build Coastguard Worker    var one_t = 1 - t;
2633*c8dee2aaSAndroid Build Coastguard Worker    if (curve.length == 4) {
2634*c8dee2aaSAndroid Build Coastguard Worker        return one_t * curve[0] + t * curve[2];
2635*c8dee2aaSAndroid Build Coastguard Worker    }
2636*c8dee2aaSAndroid Build Coastguard Worker    var one_t2 = one_t * one_t;
2637*c8dee2aaSAndroid Build Coastguard Worker    var t2 = t * t;
2638*c8dee2aaSAndroid Build Coastguard Worker    if (curve.length == 6) {
2639*c8dee2aaSAndroid Build Coastguard Worker        return one_t2 * curve[0] + 2 * one_t * t * curve[2] + t2 * curve[4];
2640*c8dee2aaSAndroid Build Coastguard Worker    }
2641*c8dee2aaSAndroid Build Coastguard Worker    if (curve.length == 7) {
2642*c8dee2aaSAndroid Build Coastguard Worker        return (one_t2 * curve[0] + 2 * one_t * t * curve[2] * curve[6] + t2 * curve[4])
2643*c8dee2aaSAndroid Build Coastguard Worker                / (one_t2 +2 * one_t * t * curve[6] + t2);
2644*c8dee2aaSAndroid Build Coastguard Worker    }
2645*c8dee2aaSAndroid Build Coastguard Worker    var a = one_t2 * one_t;
2646*c8dee2aaSAndroid Build Coastguard Worker    var b = 3 * one_t2 * t;
2647*c8dee2aaSAndroid Build Coastguard Worker    var c = 3 * one_t * t2;
2648*c8dee2aaSAndroid Build Coastguard Worker    var d = t2 * t;
2649*c8dee2aaSAndroid Build Coastguard Worker    return a * curve[0] + b * curve[2] + c * curve[4] + d * curve[6];
2650*c8dee2aaSAndroid Build Coastguard Worker}
2651*c8dee2aaSAndroid Build Coastguard Worker
2652*c8dee2aaSAndroid Build Coastguard Workerfunction y_at_t(curve, t) {
2653*c8dee2aaSAndroid Build Coastguard Worker    var one_t = 1 - t;
2654*c8dee2aaSAndroid Build Coastguard Worker    if (curve.length == 4) {
2655*c8dee2aaSAndroid Build Coastguard Worker        return one_t * curve[1] + t * curve[3];
2656*c8dee2aaSAndroid Build Coastguard Worker    }
2657*c8dee2aaSAndroid Build Coastguard Worker    var one_t2 = one_t * one_t;
2658*c8dee2aaSAndroid Build Coastguard Worker    var t2 = t * t;
2659*c8dee2aaSAndroid Build Coastguard Worker    if (curve.length == 6) {
2660*c8dee2aaSAndroid Build Coastguard Worker        return one_t2 * curve[1] + 2 * one_t * t * curve[3] + t2 * curve[5];
2661*c8dee2aaSAndroid Build Coastguard Worker    }
2662*c8dee2aaSAndroid Build Coastguard Worker    if (curve.length == 7) {
2663*c8dee2aaSAndroid Build Coastguard Worker        return (one_t2 * curve[1] + 2 * one_t * t * curve[3] * curve[6] + t2 * curve[5])
2664*c8dee2aaSAndroid Build Coastguard Worker                / (one_t2 +2 * one_t * t * curve[6] + t2);
2665*c8dee2aaSAndroid Build Coastguard Worker    }
2666*c8dee2aaSAndroid Build Coastguard Worker    var a = one_t2 * one_t;
2667*c8dee2aaSAndroid Build Coastguard Worker    var b = 3 * one_t2 * t;
2668*c8dee2aaSAndroid Build Coastguard Worker    var c = 3 * one_t * t2;
2669*c8dee2aaSAndroid Build Coastguard Worker    var d = t2 * t;
2670*c8dee2aaSAndroid Build Coastguard Worker    return a * curve[1] + b * curve[3] + c * curve[5] + d * curve[7];
2671*c8dee2aaSAndroid Build Coastguard Worker}
2672*c8dee2aaSAndroid Build Coastguard Worker
2673*c8dee2aaSAndroid Build Coastguard Workerfunction pt_at_t(curve, t) {
2674*c8dee2aaSAndroid Build Coastguard Worker    var pt = {};
2675*c8dee2aaSAndroid Build Coastguard Worker    pt.x = x_at_t(curve, t);
2676*c8dee2aaSAndroid Build Coastguard Worker    pt.y = y_at_t(curve, t);
2677*c8dee2aaSAndroid Build Coastguard Worker    return pt;
2678*c8dee2aaSAndroid Build Coastguard Worker}
2679*c8dee2aaSAndroid Build Coastguard Worker
2680*c8dee2aaSAndroid Build Coastguard Workerfunction drawOrder(curve, t, label) {
2681*c8dee2aaSAndroid Build Coastguard Worker    var px = x_at_t(curve, t);
2682*c8dee2aaSAndroid Build Coastguard Worker    var py = y_at_t(curve, t);
2683*c8dee2aaSAndroid Build Coastguard Worker    var _px = (px - srcLeft) * scale;
2684*c8dee2aaSAndroid Build Coastguard Worker    var _py = (py - srcTop) * scale;
2685*c8dee2aaSAndroid Build Coastguard Worker    ctx.beginPath();
2686*c8dee2aaSAndroid Build Coastguard Worker    ctx.arc(_px, _py, 15, 0, Math.PI * 2, true);
2687*c8dee2aaSAndroid Build Coastguard Worker    ctx.closePath();
2688*c8dee2aaSAndroid Build Coastguard Worker    ctx.fillStyle = "white";
2689*c8dee2aaSAndroid Build Coastguard Worker    ctx.fill();
2690*c8dee2aaSAndroid Build Coastguard Worker    if (label == 'L') {
2691*c8dee2aaSAndroid Build Coastguard Worker        ctx.strokeStyle = "rgba(255,0,0, 1)";
2692*c8dee2aaSAndroid Build Coastguard Worker        ctx.fillStyle = "rgba(255,0,0, 1)";
2693*c8dee2aaSAndroid Build Coastguard Worker    } else {
2694*c8dee2aaSAndroid Build Coastguard Worker        ctx.strokeStyle = "rgba(0,0,255, 1)";
2695*c8dee2aaSAndroid Build Coastguard Worker        ctx.fillStyle = "rgba(0,0,255, 1)";
2696*c8dee2aaSAndroid Build Coastguard Worker    }
2697*c8dee2aaSAndroid Build Coastguard Worker    ctx.stroke();
2698*c8dee2aaSAndroid Build Coastguard Worker    ctx.font = "normal 16px Arial";
2699*c8dee2aaSAndroid Build Coastguard Worker    ctx.textAlign = "center";
2700*c8dee2aaSAndroid Build Coastguard Worker    ctx.fillText(label, _px, _py + 5);
2701*c8dee2aaSAndroid Build Coastguard Worker    ctx.font = "normal 10px Arial";
2702*c8dee2aaSAndroid Build Coastguard Worker}
2703*c8dee2aaSAndroid Build Coastguard Worker
2704*c8dee2aaSAndroid Build Coastguard Workerfunction drawVisibleOrder(curve, label) {
2705*c8dee2aaSAndroid Build Coastguard Worker    var s = pt_at_t(curve, 0);
2706*c8dee2aaSAndroid Build Coastguard Worker    var e = pt_at_t(curve, 1);
2707*c8dee2aaSAndroid Build Coastguard Worker    var sOn = ptOnScreen(s);
2708*c8dee2aaSAndroid Build Coastguard Worker    var eOn = ptOnScreen(e);
2709*c8dee2aaSAndroid Build Coastguard Worker    var defaultT = 0.85;
2710*c8dee2aaSAndroid Build Coastguard Worker    if (sOn && eOn)
2711*c8dee2aaSAndroid Build Coastguard Worker        return drawOrder(curve, defaultT, label);
2712*c8dee2aaSAndroid Build Coastguard Worker    if (sOn || eOn) {
2713*c8dee2aaSAndroid Build Coastguard Worker        if (eOn) {
2714*c8dee2aaSAndroid Build Coastguard Worker            defaultT = 1 - defaultT;
2715*c8dee2aaSAndroid Build Coastguard Worker        }
2716*c8dee2aaSAndroid Build Coastguard Worker        var step = sOn ? -defaultT / 2 : (1 - defaultT) / 2;
2717*c8dee2aaSAndroid Build Coastguard Worker        var t = defaultT;
2718*c8dee2aaSAndroid Build Coastguard Worker        var tries = 16;
2719*c8dee2aaSAndroid Build Coastguard Worker        do {
2720*c8dee2aaSAndroid Build Coastguard Worker            var mid = pt_at_t(curve, t);
2721*c8dee2aaSAndroid Build Coastguard Worker            if (ptOnScreen(mid))
2722*c8dee2aaSAndroid Build Coastguard Worker                return drawOrder(curve, t, label);
2723*c8dee2aaSAndroid Build Coastguard Worker            t += step;
2724*c8dee2aaSAndroid Build Coastguard Worker            step /= 2;
2725*c8dee2aaSAndroid Build Coastguard Worker        } while (--tries > 0);
2726*c8dee2aaSAndroid Build Coastguard Worker        drawOrder(curve, defaultT, label);
2727*c8dee2aaSAndroid Build Coastguard Worker    }
2728*c8dee2aaSAndroid Build Coastguard Worker    // scattershot until we find a visible point
2729*c8dee2aaSAndroid Build Coastguard Worker    var denom = 2;  // visit odd number num / denom to hit unique pts
2730*c8dee2aaSAndroid Build Coastguard Worker    var tries = 6; // tries 1/2, 1/4, 3/4, 1/8, 3/8, 5/8, 7/8, 1/16 ...
2731*c8dee2aaSAndroid Build Coastguard Worker    do {
2732*c8dee2aaSAndroid Build Coastguard Worker        for (var numer = 1; numer < denom; numer += 2) {
2733*c8dee2aaSAndroid Build Coastguard Worker            var t = numer / denom + 0.1;
2734*c8dee2aaSAndroid Build Coastguard Worker            if (t >= 1) {
2735*c8dee2aaSAndroid Build Coastguard Worker                break;
2736*c8dee2aaSAndroid Build Coastguard Worker            }
2737*c8dee2aaSAndroid Build Coastguard Worker            var mid = pt_at_t(curve, t);
2738*c8dee2aaSAndroid Build Coastguard Worker            if (ptOnScreen(mid))
2739*c8dee2aaSAndroid Build Coastguard Worker                return drawOrder(curve, t, label);
2740*c8dee2aaSAndroid Build Coastguard Worker        }
2741*c8dee2aaSAndroid Build Coastguard Worker        denom *= 2;
2742*c8dee2aaSAndroid Build Coastguard Worker    } while (--tries > 0);
2743*c8dee2aaSAndroid Build Coastguard Worker    drawOrder(curve, defaultT, label);
2744*c8dee2aaSAndroid Build Coastguard Worker}
2745*c8dee2aaSAndroid Build Coastguard Worker
2746*c8dee2aaSAndroid Build Coastguard Workerfunction set_length(pt, newLen) {
2747*c8dee2aaSAndroid Build Coastguard Worker    var len = Math.sqrt(pt.x * pt.x + pt.y * pt.y);
2748*c8dee2aaSAndroid Build Coastguard Worker    var scale = newLen / len;
2749*c8dee2aaSAndroid Build Coastguard Worker    var newPt = { x: pt.x * scale, y: pt.y * scale };
2750*c8dee2aaSAndroid Build Coastguard Worker    return newPt;
2751*c8dee2aaSAndroid Build Coastguard Worker}
2752*c8dee2aaSAndroid Build Coastguard Worker
2753*c8dee2aaSAndroid Build Coastguard Workerfunction drawDirection(curve, t) {
2754*c8dee2aaSAndroid Build Coastguard Worker    var d = dpt_at_t(curve, t);
2755*c8dee2aaSAndroid Build Coastguard Worker    d = set_length(d, 16);
2756*c8dee2aaSAndroid Build Coastguard Worker    var pt = localToGlobal(pt_at_t(curve, t));
2757*c8dee2aaSAndroid Build Coastguard Worker    ctx.beginPath();
2758*c8dee2aaSAndroid Build Coastguard Worker    ctx.moveTo(pt.x - d.y, pt.y + d.x);
2759*c8dee2aaSAndroid Build Coastguard Worker    ctx.lineTo(pt.x + d.x, pt.y + d.y);
2760*c8dee2aaSAndroid Build Coastguard Worker    ctx.lineTo(pt.x + d.y, pt.y - d.x);
2761*c8dee2aaSAndroid Build Coastguard Worker    ctx.strokeStyle = "rgba(0,75,0, 0.4)";
2762*c8dee2aaSAndroid Build Coastguard Worker    ctx.stroke();
2763*c8dee2aaSAndroid Build Coastguard Worker}
2764*c8dee2aaSAndroid Build Coastguard Worker
2765*c8dee2aaSAndroid Build Coastguard Workerfunction drawVisibleDirection(curve) {
2766*c8dee2aaSAndroid Build Coastguard Worker    var s = pt_at_t(curve, 0);
2767*c8dee2aaSAndroid Build Coastguard Worker    var e = pt_at_t(curve, 1);
2768*c8dee2aaSAndroid Build Coastguard Worker    var sOn = ptOnScreen(s);
2769*c8dee2aaSAndroid Build Coastguard Worker    var eOn = ptOnScreen(e);
2770*c8dee2aaSAndroid Build Coastguard Worker    var defaultT = 0.65;
2771*c8dee2aaSAndroid Build Coastguard Worker    if (sOn && eOn) {
2772*c8dee2aaSAndroid Build Coastguard Worker        return drawDirection(curve, defaultT);
2773*c8dee2aaSAndroid Build Coastguard Worker    }
2774*c8dee2aaSAndroid Build Coastguard Worker    if (sOn || eOn) {
2775*c8dee2aaSAndroid Build Coastguard Worker        if (eOn) {
2776*c8dee2aaSAndroid Build Coastguard Worker            defaultT = 1 - defaultT;
2777*c8dee2aaSAndroid Build Coastguard Worker        }
2778*c8dee2aaSAndroid Build Coastguard Worker        var step = sOn ? -defaultT / 2 : (1 - defaultT) / 2;
2779*c8dee2aaSAndroid Build Coastguard Worker        var t = defaultT;
2780*c8dee2aaSAndroid Build Coastguard Worker        var tries = 16;
2781*c8dee2aaSAndroid Build Coastguard Worker        do {
2782*c8dee2aaSAndroid Build Coastguard Worker            var mid = pt_at_t(curve, t);
2783*c8dee2aaSAndroid Build Coastguard Worker            if (ptOnScreen(mid))
2784*c8dee2aaSAndroid Build Coastguard Worker                return drawDirection(curve, t);
2785*c8dee2aaSAndroid Build Coastguard Worker            t += step;
2786*c8dee2aaSAndroid Build Coastguard Worker            step /= 2;
2787*c8dee2aaSAndroid Build Coastguard Worker        } while (--tries > 0);
2788*c8dee2aaSAndroid Build Coastguard Worker        drawDirection(curve, defaultT);
2789*c8dee2aaSAndroid Build Coastguard Worker    }
2790*c8dee2aaSAndroid Build Coastguard Worker    // scattershot until we find a visible point
2791*c8dee2aaSAndroid Build Coastguard Worker    var denom = 2;  // visit odd number num / denom to hit unique pts
2792*c8dee2aaSAndroid Build Coastguard Worker    var tries = 6; // tries 1/2, 1/4, 3/4, 1/8, 3/8, 5/8, 7/8, 1/16 ...
2793*c8dee2aaSAndroid Build Coastguard Worker    do {
2794*c8dee2aaSAndroid Build Coastguard Worker        for (var numer = 1; numer < denom; numer += 2) {
2795*c8dee2aaSAndroid Build Coastguard Worker            var t = numer / denom + 0.1;
2796*c8dee2aaSAndroid Build Coastguard Worker            if (t >= 1) {
2797*c8dee2aaSAndroid Build Coastguard Worker                break;
2798*c8dee2aaSAndroid Build Coastguard Worker            }
2799*c8dee2aaSAndroid Build Coastguard Worker            var mid = pt_at_t(curve, t);
2800*c8dee2aaSAndroid Build Coastguard Worker            if (ptOnScreen(mid))
2801*c8dee2aaSAndroid Build Coastguard Worker                return drawDirection(curve, t);
2802*c8dee2aaSAndroid Build Coastguard Worker        }
2803*c8dee2aaSAndroid Build Coastguard Worker        denom *= 2;
2804*c8dee2aaSAndroid Build Coastguard Worker    } while (--tries > 0);
2805*c8dee2aaSAndroid Build Coastguard Worker    drawDirection(curve, defaultT);
2806*c8dee2aaSAndroid Build Coastguard Worker}
2807*c8dee2aaSAndroid Build Coastguard Worker
2808*c8dee2aaSAndroid Build Coastguard Workerfunction drawID(curve, t, id) {
2809*c8dee2aaSAndroid Build Coastguard Worker    var px = x_at_t(curve, t);
2810*c8dee2aaSAndroid Build Coastguard Worker    var py = y_at_t(curve, t);
2811*c8dee2aaSAndroid Build Coastguard Worker    var _px = (px - srcLeft) * scale;
2812*c8dee2aaSAndroid Build Coastguard Worker    var _py = (py - srcTop) * scale;
2813*c8dee2aaSAndroid Build Coastguard Worker    draw_id_at(id, _px, _py);
2814*c8dee2aaSAndroid Build Coastguard Worker}
2815*c8dee2aaSAndroid Build Coastguard Worker
2816*c8dee2aaSAndroid Build Coastguard Workerfunction localToGlobal(local) {
2817*c8dee2aaSAndroid Build Coastguard Worker    var global = {};
2818*c8dee2aaSAndroid Build Coastguard Worker    global.x = (local.x - srcLeft) * scale;
2819*c8dee2aaSAndroid Build Coastguard Worker    global.y = (local.y - srcTop) * scale;
2820*c8dee2aaSAndroid Build Coastguard Worker    return global;
2821*c8dee2aaSAndroid Build Coastguard Worker}
2822*c8dee2aaSAndroid Build Coastguard Worker
2823*c8dee2aaSAndroid Build Coastguard Workerfunction ptOnScreen(local) {
2824*c8dee2aaSAndroid Build Coastguard Worker    var pt = localToGlobal(local);
2825*c8dee2aaSAndroid Build Coastguard Worker    return 10 <= pt.x && pt.x <= screenWidth - 10
2826*c8dee2aaSAndroid Build Coastguard Worker        && 10 <= pt.y && pt.y <= screenHeight - 10;
2827*c8dee2aaSAndroid Build Coastguard Worker}
2828*c8dee2aaSAndroid Build Coastguard Worker
2829*c8dee2aaSAndroid Build Coastguard Workerfunction drawVisibleID(curve, defaultT, id) {
2830*c8dee2aaSAndroid Build Coastguard Worker    // determine if either or both ends are visible
2831*c8dee2aaSAndroid Build Coastguard Worker    var s = pt_at_t(curve, 0);
2832*c8dee2aaSAndroid Build Coastguard Worker    var e = pt_at_t(curve, 1);
2833*c8dee2aaSAndroid Build Coastguard Worker    var sOn = ptOnScreen(s);
2834*c8dee2aaSAndroid Build Coastguard Worker    var eOn = ptOnScreen(e);
2835*c8dee2aaSAndroid Build Coastguard Worker    if (sOn && eOn)
2836*c8dee2aaSAndroid Build Coastguard Worker        return drawID(curve, defaultT, id);
2837*c8dee2aaSAndroid Build Coastguard Worker    if (sOn || eOn) {
2838*c8dee2aaSAndroid Build Coastguard Worker        var step = sOn ? -defaultT / 2 : (1 - defaultT) / 2;
2839*c8dee2aaSAndroid Build Coastguard Worker        var t = defaultT;
2840*c8dee2aaSAndroid Build Coastguard Worker        var tries = 16;
2841*c8dee2aaSAndroid Build Coastguard Worker        do {
2842*c8dee2aaSAndroid Build Coastguard Worker            var mid = pt_at_t(curve, t);
2843*c8dee2aaSAndroid Build Coastguard Worker            if (ptOnScreen(mid))
2844*c8dee2aaSAndroid Build Coastguard Worker                return drawID(curve, t, id);
2845*c8dee2aaSAndroid Build Coastguard Worker            t += step;
2846*c8dee2aaSAndroid Build Coastguard Worker            step /= 2;
2847*c8dee2aaSAndroid Build Coastguard Worker        } while (--tries > 0);
2848*c8dee2aaSAndroid Build Coastguard Worker        drawID(curve, defaultT, id);
2849*c8dee2aaSAndroid Build Coastguard Worker    }
2850*c8dee2aaSAndroid Build Coastguard Worker    // scattershot until we find a visible point
2851*c8dee2aaSAndroid Build Coastguard Worker    var denom = 2;  // visit odd number num / denom to hit unique pts
2852*c8dee2aaSAndroid Build Coastguard Worker    var tries = 6; // tries 1/2, 1/4, 3/4, 1/8, 3/8, 5/8, 7/8, 1/16 ...
2853*c8dee2aaSAndroid Build Coastguard Worker    do {
2854*c8dee2aaSAndroid Build Coastguard Worker        for (var numer = 1; numer < denom; numer += 2) {
2855*c8dee2aaSAndroid Build Coastguard Worker            var t = numer / denom;
2856*c8dee2aaSAndroid Build Coastguard Worker            var mid = pt_at_t(curve, t);
2857*c8dee2aaSAndroid Build Coastguard Worker            if (ptOnScreen(mid))
2858*c8dee2aaSAndroid Build Coastguard Worker                return drawID(curve, t, id);
2859*c8dee2aaSAndroid Build Coastguard Worker        }
2860*c8dee2aaSAndroid Build Coastguard Worker        denom *= 2;
2861*c8dee2aaSAndroid Build Coastguard Worker    } while (--tries > 0);
2862*c8dee2aaSAndroid Build Coastguard Worker    drawID(curve, defaultT, id);
2863*c8dee2aaSAndroid Build Coastguard Worker}
2864*c8dee2aaSAndroid Build Coastguard Worker
2865*c8dee2aaSAndroid Build Coastguard Workerfunction draw_id_at(id, _px, _py) {
2866*c8dee2aaSAndroid Build Coastguard Worker    ctx.beginPath();
2867*c8dee2aaSAndroid Build Coastguard Worker    ctx.arc(_px, _py, 15, 0, Math.PI * 2, true);
2868*c8dee2aaSAndroid Build Coastguard Worker    ctx.closePath();
2869*c8dee2aaSAndroid Build Coastguard Worker    ctx.fillStyle = "white";
2870*c8dee2aaSAndroid Build Coastguard Worker    ctx.fill();
2871*c8dee2aaSAndroid Build Coastguard Worker    ctx.strokeStyle = "rgba(127,127,0, 1)";
2872*c8dee2aaSAndroid Build Coastguard Worker    ctx.fillStyle = "rgba(127,127,0, 1)";
2873*c8dee2aaSAndroid Build Coastguard Worker    ctx.stroke();
2874*c8dee2aaSAndroid Build Coastguard Worker    ctx.font = "normal 16px Arial";
2875*c8dee2aaSAndroid Build Coastguard Worker    ctx.textAlign = "center";
2876*c8dee2aaSAndroid Build Coastguard Worker    ctx.fillText(id, _px, _py + 5);
2877*c8dee2aaSAndroid Build Coastguard Worker    ctx.font = "normal 10px Arial";
2878*c8dee2aaSAndroid Build Coastguard Worker}
2879*c8dee2aaSAndroid Build Coastguard Worker
2880*c8dee2aaSAndroid Build Coastguard Workerfunction drawLinePartialID(id, x1, y1, x2, y2, t1, t2) {
2881*c8dee2aaSAndroid Build Coastguard Worker    var curve = [x1, y1, x2, y2];
2882*c8dee2aaSAndroid Build Coastguard Worker    drawCurvePartialID(id, curve, t1, t2);
2883*c8dee2aaSAndroid Build Coastguard Worker}
2884*c8dee2aaSAndroid Build Coastguard Worker
2885*c8dee2aaSAndroid Build Coastguard Workerfunction drawLineID(id, x1, y1, x2, y2) {
2886*c8dee2aaSAndroid Build Coastguard Worker    drawLinePartialID(id, x1, y1, x2, y2, 0, 1);
2887*c8dee2aaSAndroid Build Coastguard Worker}
2888*c8dee2aaSAndroid Build Coastguard Worker
2889*c8dee2aaSAndroid Build Coastguard Workerfunction drawQuadPartialID(id, x1, y1, x2, y2, x3, y3, t1, t2) {
2890*c8dee2aaSAndroid Build Coastguard Worker    var curve = [x1, y1, x2, y2, x3, y3];
2891*c8dee2aaSAndroid Build Coastguard Worker    drawCurvePartialID(id, curve, t1, t2);
2892*c8dee2aaSAndroid Build Coastguard Worker}
2893*c8dee2aaSAndroid Build Coastguard Worker
2894*c8dee2aaSAndroid Build Coastguard Workerfunction drawQuadID(id, x1, y1, x2, y2, x3, y3) {
2895*c8dee2aaSAndroid Build Coastguard Worker    drawQuadPartialID(id, x1, y1, x2, y2, x3, y3, 0, 1);
2896*c8dee2aaSAndroid Build Coastguard Worker}
2897*c8dee2aaSAndroid Build Coastguard Worker
2898*c8dee2aaSAndroid Build Coastguard Workerfunction drawConicPartialID(id, x1, y1, x2, y2, x3, y3, w, t1, t2) {
2899*c8dee2aaSAndroid Build Coastguard Worker    var curve = [x1, y1, x2, y2, x3, y3, w];
2900*c8dee2aaSAndroid Build Coastguard Worker    drawCurvePartialID(id, curve, t1, t2);
2901*c8dee2aaSAndroid Build Coastguard Worker}
2902*c8dee2aaSAndroid Build Coastguard Worker
2903*c8dee2aaSAndroid Build Coastguard Workerfunction drawConicID(id, x1, y1, x2, y2, x3, y3, w) {
2904*c8dee2aaSAndroid Build Coastguard Worker    drawConicPartialID(id, x1, y1, x2, y2, x3, y3, w, 0, 1);
2905*c8dee2aaSAndroid Build Coastguard Worker}
2906*c8dee2aaSAndroid Build Coastguard Worker
2907*c8dee2aaSAndroid Build Coastguard Workerfunction drawCubicPartialID(id, x1, y1, x2, y2, x3, y3, x4, y4, t1, t2) {
2908*c8dee2aaSAndroid Build Coastguard Worker    var curve = [x1, y1, x2, y2, x3, y3, x4, y4];
2909*c8dee2aaSAndroid Build Coastguard Worker    drawCurvePartialID(id, curve, t1, t2);
2910*c8dee2aaSAndroid Build Coastguard Worker}
2911*c8dee2aaSAndroid Build Coastguard Worker
2912*c8dee2aaSAndroid Build Coastguard Workerfunction drawCubicID(id, x1, y1, x2, y2, x3, y3, x4, y4) {
2913*c8dee2aaSAndroid Build Coastguard Worker    drawCubicPartialID(id, x1, y1, x2, y2, x3, y3, x4, y4, 0, 1);
2914*c8dee2aaSAndroid Build Coastguard Worker}
2915*c8dee2aaSAndroid Build Coastguard Worker
2916*c8dee2aaSAndroid Build Coastguard Workerfunction  drawCurvePartialID(id, curve, t1, t2) {
2917*c8dee2aaSAndroid Build Coastguard Worker    drawVisibleID(curve, (t1 + t2) / 2, id);
2918*c8dee2aaSAndroid Build Coastguard Worker}
2919*c8dee2aaSAndroid Build Coastguard Worker
2920*c8dee2aaSAndroid Build Coastguard Workerfunction drawCurveSpecials(test, curve, type) {
2921*c8dee2aaSAndroid Build Coastguard Worker    if (pt_labels) {
2922*c8dee2aaSAndroid Build Coastguard Worker        drawPoints(curve, type, pt_labels == 2);
2923*c8dee2aaSAndroid Build Coastguard Worker    }
2924*c8dee2aaSAndroid Build Coastguard Worker    if (control_lines != 0) {
2925*c8dee2aaSAndroid Build Coastguard Worker        drawControlLines(curve, type, control_lines);
2926*c8dee2aaSAndroid Build Coastguard Worker    }
2927*c8dee2aaSAndroid Build Coastguard Worker    if (curve_t) {
2928*c8dee2aaSAndroid Build Coastguard Worker        drawPointAtT(curve, type);
2929*c8dee2aaSAndroid Build Coastguard Worker    }
2930*c8dee2aaSAndroid Build Coastguard Worker    if (draw_midpoint) {
2931*c8dee2aaSAndroid Build Coastguard Worker        var mid = pointAtT(curve, type, 0.5);
2932*c8dee2aaSAndroid Build Coastguard Worker        drawPoint(mid.x, mid.y, true);
2933*c8dee2aaSAndroid Build Coastguard Worker    }
2934*c8dee2aaSAndroid Build Coastguard Worker    if (draw_id) {
2935*c8dee2aaSAndroid Build Coastguard Worker        var id = idByCurve(test, curve, type);
2936*c8dee2aaSAndroid Build Coastguard Worker        if (id >= 0) {
2937*c8dee2aaSAndroid Build Coastguard Worker            drawVisibleID(curve, 0.5, id);
2938*c8dee2aaSAndroid Build Coastguard Worker        }
2939*c8dee2aaSAndroid Build Coastguard Worker    }
2940*c8dee2aaSAndroid Build Coastguard Worker    if (draw_direction) {
2941*c8dee2aaSAndroid Build Coastguard Worker        drawVisibleDirection(curve);
2942*c8dee2aaSAndroid Build Coastguard Worker    }
2943*c8dee2aaSAndroid Build Coastguard Worker    if (type == PATH_LINE) {
2944*c8dee2aaSAndroid Build Coastguard Worker        return;
2945*c8dee2aaSAndroid Build Coastguard Worker    }
2946*c8dee2aaSAndroid Build Coastguard Worker    if (draw_deriviatives > 0) {
2947*c8dee2aaSAndroid Build Coastguard Worker        var d = dxy_at_t(curve, type, 0);
2948*c8dee2aaSAndroid Build Coastguard Worker        drawArrow(curve[0], curve[1], d.x, d.y, 1);
2949*c8dee2aaSAndroid Build Coastguard Worker        if (draw_deriviatives == 2) {
2950*c8dee2aaSAndroid Build Coastguard Worker            d = dxy_at_t(curve, type, 1);
2951*c8dee2aaSAndroid Build Coastguard Worker            if (type == PATH_CUBIC) {
2952*c8dee2aaSAndroid Build Coastguard Worker                drawArrow(curve[6], curve[7], d.x, d.y, 1);
2953*c8dee2aaSAndroid Build Coastguard Worker            } else {
2954*c8dee2aaSAndroid Build Coastguard Worker                drawArrow(curve[4], curve[5], d.x, d.y, 1);
2955*c8dee2aaSAndroid Build Coastguard Worker            }
2956*c8dee2aaSAndroid Build Coastguard Worker        }
2957*c8dee2aaSAndroid Build Coastguard Worker        if (draw_midpoint) {
2958*c8dee2aaSAndroid Build Coastguard Worker            var mid = pointAtT(curve, type, 0.5);
2959*c8dee2aaSAndroid Build Coastguard Worker            d = dxy_at_t(curve, type, 0.5);
2960*c8dee2aaSAndroid Build Coastguard Worker            drawArrow(mid.x, mid.y, d.x, d.y, 1);
2961*c8dee2aaSAndroid Build Coastguard Worker        }
2962*c8dee2aaSAndroid Build Coastguard Worker    }
2963*c8dee2aaSAndroid Build Coastguard Worker    if (type != PATH_CUBIC) {
2964*c8dee2aaSAndroid Build Coastguard Worker        return;
2965*c8dee2aaSAndroid Build Coastguard Worker    }
2966*c8dee2aaSAndroid Build Coastguard Worker    if (draw_sequence) {
2967*c8dee2aaSAndroid Build Coastguard Worker        var ymin = Math.min(curve[1], curve[3], curve[5], curve[7]);
2968*c8dee2aaSAndroid Build Coastguard Worker        for (var i = 0; i < 8; i+= 2) {
2969*c8dee2aaSAndroid Build Coastguard Worker            drawLabelX(ymin, i >> 1, curve[i]);
2970*c8dee2aaSAndroid Build Coastguard Worker        }
2971*c8dee2aaSAndroid Build Coastguard Worker        var xmin = Math.min(curve[0], curve[2], curve[4], curve[6]);
2972*c8dee2aaSAndroid Build Coastguard Worker        for (var i = 1; i < 8; i+= 2) {
2973*c8dee2aaSAndroid Build Coastguard Worker            drawLabelY(xmin, i >> 1, curve[i]);
2974*c8dee2aaSAndroid Build Coastguard Worker        }
2975*c8dee2aaSAndroid Build Coastguard Worker    }
2976*c8dee2aaSAndroid Build Coastguard Worker}
2977*c8dee2aaSAndroid Build Coastguard Worker
2978*c8dee2aaSAndroid Build Coastguard Workerfunction logCurves(test) {
2979*c8dee2aaSAndroid Build Coastguard Worker    for (curves in test) {
2980*c8dee2aaSAndroid Build Coastguard Worker        var curve = test[curves];
2981*c8dee2aaSAndroid Build Coastguard Worker        dumpCurve(curve);
2982*c8dee2aaSAndroid Build Coastguard Worker    }
2983*c8dee2aaSAndroid Build Coastguard Worker}
2984*c8dee2aaSAndroid Build Coastguard Worker
2985*c8dee2aaSAndroid Build Coastguard Workerfunction curveToString(curve) {
2986*c8dee2aaSAndroid Build Coastguard Worker    var str = "{{";
2987*c8dee2aaSAndroid Build Coastguard Worker    var length = curve.length == 7 ? 6 : curve.length;
2988*c8dee2aaSAndroid Build Coastguard Worker    if (curve.length == 7) {
2989*c8dee2aaSAndroid Build Coastguard Worker        str += "{";
2990*c8dee2aaSAndroid Build Coastguard Worker    }
2991*c8dee2aaSAndroid Build Coastguard Worker    for (i = 0; i < length; i += 2) {
2992*c8dee2aaSAndroid Build Coastguard Worker        str += curve[i].toFixed(decimal_places) + "," + curve[i + 1].toFixed(decimal_places);
2993*c8dee2aaSAndroid Build Coastguard Worker        if (i < curve.length - 2) {
2994*c8dee2aaSAndroid Build Coastguard Worker            str += "}, {";
2995*c8dee2aaSAndroid Build Coastguard Worker        }
2996*c8dee2aaSAndroid Build Coastguard Worker    }
2997*c8dee2aaSAndroid Build Coastguard Worker    str += "}";
2998*c8dee2aaSAndroid Build Coastguard Worker    if (curve.length == 7) {
2999*c8dee2aaSAndroid Build Coastguard Worker        str += "}, " + curve[6].toFixed(decimal_places);
3000*c8dee2aaSAndroid Build Coastguard Worker    }
3001*c8dee2aaSAndroid Build Coastguard Worker    str += "}";
3002*c8dee2aaSAndroid Build Coastguard Worker    return str;
3003*c8dee2aaSAndroid Build Coastguard Worker}
3004*c8dee2aaSAndroid Build Coastguard Worker
3005*c8dee2aaSAndroid Build Coastguard Workerfunction dumpCurve(curve) {
3006*c8dee2aaSAndroid Build Coastguard Worker    console.log(curveToString(curve));
3007*c8dee2aaSAndroid Build Coastguard Worker}
3008*c8dee2aaSAndroid Build Coastguard Worker
3009*c8dee2aaSAndroid Build Coastguard Workerfunction draw(test, lines, title) {
3010*c8dee2aaSAndroid Build Coastguard Worker    ctx.fillStyle = "rgba(0,0,0, 0.1)";
3011*c8dee2aaSAndroid Build Coastguard Worker    ctx.font = "normal 50px Arial";
3012*c8dee2aaSAndroid Build Coastguard Worker    ctx.textAlign = "left";
3013*c8dee2aaSAndroid Build Coastguard Worker    ctx.fillText(title, 50, 50);
3014*c8dee2aaSAndroid Build Coastguard Worker    ctx.font = "normal 10px Arial";
3015*c8dee2aaSAndroid Build Coastguard Worker    ctx.lineWidth = "1.001"; "0.999";
3016*c8dee2aaSAndroid Build Coastguard Worker    var secondPath = test.length;
3017*c8dee2aaSAndroid Build Coastguard Worker    var closeCount = 0;
3018*c8dee2aaSAndroid Build Coastguard Worker    logStart = -1;
3019*c8dee2aaSAndroid Build Coastguard Worker    logRange = 0;
3020*c8dee2aaSAndroid Build Coastguard Worker    // find last active rec type at this step
3021*c8dee2aaSAndroid Build Coastguard Worker    var curType = test[0];
3022*c8dee2aaSAndroid Build Coastguard Worker    var curStep = 0;
3023*c8dee2aaSAndroid Build Coastguard Worker    var hasOp = false;
3024*c8dee2aaSAndroid Build Coastguard Worker    var lastActive = 0;
3025*c8dee2aaSAndroid Build Coastguard Worker    var lastAdd = 0;
3026*c8dee2aaSAndroid Build Coastguard Worker    var lastCoin = 0;
3027*c8dee2aaSAndroid Build Coastguard Worker    var lastSect = 0;
3028*c8dee2aaSAndroid Build Coastguard Worker    var lastSort = 0;
3029*c8dee2aaSAndroid Build Coastguard Worker    var lastMark = 0;
3030*c8dee2aaSAndroid Build Coastguard Worker    var lastTop = 0;
3031*c8dee2aaSAndroid Build Coastguard Worker    activeCount = 0;
3032*c8dee2aaSAndroid Build Coastguard Worker    addCount = 0;
3033*c8dee2aaSAndroid Build Coastguard Worker    angleCount = 0;
3034*c8dee2aaSAndroid Build Coastguard Worker    opCount = 0;
3035*c8dee2aaSAndroid Build Coastguard Worker    sectCount = 0;
3036*c8dee2aaSAndroid Build Coastguard Worker    sortCount = 0;
3037*c8dee2aaSAndroid Build Coastguard Worker    topCount = 0;
3038*c8dee2aaSAndroid Build Coastguard Worker    markCount = 0;
3039*c8dee2aaSAndroid Build Coastguard Worker    activeMax = 0;
3040*c8dee2aaSAndroid Build Coastguard Worker    addMax = 0;
3041*c8dee2aaSAndroid Build Coastguard Worker    angleMax = 0;
3042*c8dee2aaSAndroid Build Coastguard Worker    coinMax = 0;
3043*c8dee2aaSAndroid Build Coastguard Worker    opMax = 0;
3044*c8dee2aaSAndroid Build Coastguard Worker    sectMax = 0;
3045*c8dee2aaSAndroid Build Coastguard Worker    sectMax2 = 0;
3046*c8dee2aaSAndroid Build Coastguard Worker    sortMax = 0;
3047*c8dee2aaSAndroid Build Coastguard Worker    topMax = 0;
3048*c8dee2aaSAndroid Build Coastguard Worker    markMax = 0;
3049*c8dee2aaSAndroid Build Coastguard Worker    lastIndex = test.length - 3;
3050*c8dee2aaSAndroid Build Coastguard Worker    for (var tIndex = 0; tIndex < test.length; tIndex += 3) {
3051*c8dee2aaSAndroid Build Coastguard Worker        var recType = test[tIndex];
3052*c8dee2aaSAndroid Build Coastguard Worker        if (!typeof recType == 'number' || recType < REC_TYPE_UNKNOWN || recType > REC_TYPE_LAST) {
3053*c8dee2aaSAndroid Build Coastguard Worker            console.log("unknown rec type: " + recType);
3054*c8dee2aaSAndroid Build Coastguard Worker            throw "stop execution";
3055*c8dee2aaSAndroid Build Coastguard Worker        }
3056*c8dee2aaSAndroid Build Coastguard Worker   //     if (curType == recType && curType != REC_TYPE_ADD) {
3057*c8dee2aaSAndroid Build Coastguard Worker   //         continue;
3058*c8dee2aaSAndroid Build Coastguard Worker   //     }
3059*c8dee2aaSAndroid Build Coastguard Worker        var inStepRange = step_limit == 0 || curStep < step_limit;
3060*c8dee2aaSAndroid Build Coastguard Worker        curType = recType;
3061*c8dee2aaSAndroid Build Coastguard Worker        if (recType == REC_TYPE_OP) {
3062*c8dee2aaSAndroid Build Coastguard Worker            hasOp = true;
3063*c8dee2aaSAndroid Build Coastguard Worker            continue;
3064*c8dee2aaSAndroid Build Coastguard Worker        }
3065*c8dee2aaSAndroid Build Coastguard Worker        if (recType == REC_TYPE_UNKNOWN) {
3066*c8dee2aaSAndroid Build Coastguard Worker            // these types do not advance step
3067*c8dee2aaSAndroid Build Coastguard Worker            continue;
3068*c8dee2aaSAndroid Build Coastguard Worker        }
3069*c8dee2aaSAndroid Build Coastguard Worker        var bumpStep = false;
3070*c8dee2aaSAndroid Build Coastguard Worker        var records = test[tIndex + 2];
3071*c8dee2aaSAndroid Build Coastguard Worker        var fragType = records[0];
3072*c8dee2aaSAndroid Build Coastguard Worker        if (recType == REC_TYPE_ADD) {
3073*c8dee2aaSAndroid Build Coastguard Worker            if (records.length != 2) {
3074*c8dee2aaSAndroid Build Coastguard Worker                console.log("expect only two elements: " + records.length);
3075*c8dee2aaSAndroid Build Coastguard Worker                throw "stop execution";
3076*c8dee2aaSAndroid Build Coastguard Worker            }
3077*c8dee2aaSAndroid Build Coastguard Worker            if (fragType == ADD_MOVETO || fragType == ADD_CLOSE) {
3078*c8dee2aaSAndroid Build Coastguard Worker                continue;
3079*c8dee2aaSAndroid Build Coastguard Worker            }
3080*c8dee2aaSAndroid Build Coastguard Worker            ++addMax;
3081*c8dee2aaSAndroid Build Coastguard Worker            if (!draw_add || !inStepRange) {
3082*c8dee2aaSAndroid Build Coastguard Worker                continue;
3083*c8dee2aaSAndroid Build Coastguard Worker            }
3084*c8dee2aaSAndroid Build Coastguard Worker            lastAdd = tIndex;
3085*c8dee2aaSAndroid Build Coastguard Worker            ++addCount;
3086*c8dee2aaSAndroid Build Coastguard Worker            bumpStep = true;
3087*c8dee2aaSAndroid Build Coastguard Worker        }
3088*c8dee2aaSAndroid Build Coastguard Worker        if (recType == REC_TYPE_PATH && hasOp) {
3089*c8dee2aaSAndroid Build Coastguard Worker            secondPath = tIndex;
3090*c8dee2aaSAndroid Build Coastguard Worker        }
3091*c8dee2aaSAndroid Build Coastguard Worker        if (recType == REC_TYPE_PATH2 && hasOp) {
3092*c8dee2aaSAndroid Build Coastguard Worker            secondPath = tIndex;
3093*c8dee2aaSAndroid Build Coastguard Worker        }
3094*c8dee2aaSAndroid Build Coastguard Worker        if (recType == REC_TYPE_ACTIVE) {
3095*c8dee2aaSAndroid Build Coastguard Worker            ++activeMax;
3096*c8dee2aaSAndroid Build Coastguard Worker            if (!draw_active || !inStepRange) {
3097*c8dee2aaSAndroid Build Coastguard Worker                continue;
3098*c8dee2aaSAndroid Build Coastguard Worker            }
3099*c8dee2aaSAndroid Build Coastguard Worker            lastActive = tIndex;
3100*c8dee2aaSAndroid Build Coastguard Worker            ++activeCount;
3101*c8dee2aaSAndroid Build Coastguard Worker            bumpStep = true;
3102*c8dee2aaSAndroid Build Coastguard Worker        }
3103*c8dee2aaSAndroid Build Coastguard Worker        if (recType == REC_TYPE_ACTIVE_OP) {
3104*c8dee2aaSAndroid Build Coastguard Worker            ++opMax;
3105*c8dee2aaSAndroid Build Coastguard Worker            if (!draw_op || !inStepRange) {
3106*c8dee2aaSAndroid Build Coastguard Worker                continue;
3107*c8dee2aaSAndroid Build Coastguard Worker            }
3108*c8dee2aaSAndroid Build Coastguard Worker            lastOp = tIndex;
3109*c8dee2aaSAndroid Build Coastguard Worker            ++opCount;
3110*c8dee2aaSAndroid Build Coastguard Worker            bumpStep = true;
3111*c8dee2aaSAndroid Build Coastguard Worker        }
3112*c8dee2aaSAndroid Build Coastguard Worker        if (recType == REC_TYPE_AFTERPART) {
3113*c8dee2aaSAndroid Build Coastguard Worker            if (draw_angle != 3 || !inStepRange) {
3114*c8dee2aaSAndroid Build Coastguard Worker                continue;
3115*c8dee2aaSAndroid Build Coastguard Worker            }
3116*c8dee2aaSAndroid Build Coastguard Worker            lastAngle = tIndex;
3117*c8dee2aaSAndroid Build Coastguard Worker            ++angleCount;
3118*c8dee2aaSAndroid Build Coastguard Worker            bumpStep = true;
3119*c8dee2aaSAndroid Build Coastguard Worker        }
3120*c8dee2aaSAndroid Build Coastguard Worker        if (recType == REC_TYPE_ANGLE) {
3121*c8dee2aaSAndroid Build Coastguard Worker            ++angleMax;
3122*c8dee2aaSAndroid Build Coastguard Worker            if (draw_angle == 0 || draw_angle == 3 || !inStepRange) {
3123*c8dee2aaSAndroid Build Coastguard Worker                continue;
3124*c8dee2aaSAndroid Build Coastguard Worker            }
3125*c8dee2aaSAndroid Build Coastguard Worker            lastAngle = tIndex;
3126*c8dee2aaSAndroid Build Coastguard Worker            ++angleCount;
3127*c8dee2aaSAndroid Build Coastguard Worker            bumpStep = true;
3128*c8dee2aaSAndroid Build Coastguard Worker        }
3129*c8dee2aaSAndroid Build Coastguard Worker        if (recType == REC_TYPE_COINCIDENCE) {
3130*c8dee2aaSAndroid Build Coastguard Worker            ++coinMax;
3131*c8dee2aaSAndroid Build Coastguard Worker            if (!draw_coincidence || !inStepRange) {
3132*c8dee2aaSAndroid Build Coastguard Worker                continue;
3133*c8dee2aaSAndroid Build Coastguard Worker            }
3134*c8dee2aaSAndroid Build Coastguard Worker            lastCoin = tIndex;
3135*c8dee2aaSAndroid Build Coastguard Worker            ++coinCount;
3136*c8dee2aaSAndroid Build Coastguard Worker            bumpStep = true;
3137*c8dee2aaSAndroid Build Coastguard Worker        }
3138*c8dee2aaSAndroid Build Coastguard Worker        if (recType == REC_TYPE_SECT) {
3139*c8dee2aaSAndroid Build Coastguard Worker            if (records.length != 2) {
3140*c8dee2aaSAndroid Build Coastguard Worker                console.log("expect only two elements: " + records.length);
3141*c8dee2aaSAndroid Build Coastguard Worker                throw "stop execution";
3142*c8dee2aaSAndroid Build Coastguard Worker            }
3143*c8dee2aaSAndroid Build Coastguard Worker            ++sectMax;
3144*c8dee2aaSAndroid Build Coastguard Worker            var sectBump = 1;
3145*c8dee2aaSAndroid Build Coastguard Worker            switch (fragType) {
3146*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_LINE:
3147*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_QUAD_LINE:
3148*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_QUAD:
3149*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_CONIC_LINE:
3150*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_CONIC_QUAD:
3151*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_CONIC:
3152*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_SELF_CUBIC:
3153*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_CUBIC_LINE:
3154*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_CUBIC_QUAD:
3155*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_CUBIC:
3156*c8dee2aaSAndroid Build Coastguard Worker                    sectBump = 1;
3157*c8dee2aaSAndroid Build Coastguard Worker                    break;
3158*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_LINE_2:
3159*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_QUAD_LINE_2:
3160*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_QUAD_2:
3161*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_CONIC_LINE_2:
3162*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_CONIC_QUAD_2:
3163*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_CONIC_2:
3164*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_CUBIC_LINE_2:
3165*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_CUBIC_QUAD_2:
3166*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_CUBIC_2:
3167*c8dee2aaSAndroid Build Coastguard Worker                    sectBump = 2;
3168*c8dee2aaSAndroid Build Coastguard Worker                    break;
3169*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_LINE_NO:
3170*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_QUAD_LINE_NO:
3171*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_QUAD_NO:
3172*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_CONIC_LINE_NO:
3173*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_CONIC_QUAD_NO:
3174*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_CONIC_NO:
3175*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_SELF_CUBIC_NO:
3176*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_CUBIC_LINE_NO:
3177*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_CUBIC_QUAD_NO:
3178*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_CUBIC_NO:
3179*c8dee2aaSAndroid Build Coastguard Worker                    sectBump = 0;
3180*c8dee2aaSAndroid Build Coastguard Worker                    break;
3181*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_CONIC_QUAD_3:
3182*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_CUBIC_LINE_3:
3183*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_CUBIC_QUAD_3:
3184*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_CUBIC_3:
3185*c8dee2aaSAndroid Build Coastguard Worker                    sectBump = 3;
3186*c8dee2aaSAndroid Build Coastguard Worker                    break;
3187*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_CONIC_QUAD_4:
3188*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_CUBIC_QUAD_4:
3189*c8dee2aaSAndroid Build Coastguard Worker                case INTERSECT_CUBIC_4:
3190*c8dee2aaSAndroid Build Coastguard Worker                    sectBump = 4;
3191*c8dee2aaSAndroid Build Coastguard Worker                    break;
3192*c8dee2aaSAndroid Build Coastguard Worker                default:
3193*c8dee2aaSAndroid Build Coastguard Worker                    console.log("missing case " + records.length);
3194*c8dee2aaSAndroid Build Coastguard Worker                    throw "stop execution";
3195*c8dee2aaSAndroid Build Coastguard Worker            }
3196*c8dee2aaSAndroid Build Coastguard Worker            sectMax2 += sectBump;
3197*c8dee2aaSAndroid Build Coastguard Worker            if (draw_intersection <= 1 || !inStepRange) {
3198*c8dee2aaSAndroid Build Coastguard Worker                continue;
3199*c8dee2aaSAndroid Build Coastguard Worker            }
3200*c8dee2aaSAndroid Build Coastguard Worker            lastSect = tIndex;
3201*c8dee2aaSAndroid Build Coastguard Worker            sectCount += sectBump;
3202*c8dee2aaSAndroid Build Coastguard Worker            bumpStep = true;
3203*c8dee2aaSAndroid Build Coastguard Worker        }
3204*c8dee2aaSAndroid Build Coastguard Worker        if (recType == REC_TYPE_SORT) {
3205*c8dee2aaSAndroid Build Coastguard Worker            ++sortMax;
3206*c8dee2aaSAndroid Build Coastguard Worker            if (!draw_sort || !inStepRange) {
3207*c8dee2aaSAndroid Build Coastguard Worker                continue;
3208*c8dee2aaSAndroid Build Coastguard Worker            }
3209*c8dee2aaSAndroid Build Coastguard Worker            lastSort = tIndex;
3210*c8dee2aaSAndroid Build Coastguard Worker            ++sortCount;
3211*c8dee2aaSAndroid Build Coastguard Worker            bumpStep = true;
3212*c8dee2aaSAndroid Build Coastguard Worker        }
3213*c8dee2aaSAndroid Build Coastguard Worker        if (recType == REC_TYPE_TOP) {
3214*c8dee2aaSAndroid Build Coastguard Worker            ++topMax;
3215*c8dee2aaSAndroid Build Coastguard Worker            if (!draw_top || !inStepRange) {
3216*c8dee2aaSAndroid Build Coastguard Worker                continue;
3217*c8dee2aaSAndroid Build Coastguard Worker            }
3218*c8dee2aaSAndroid Build Coastguard Worker            lastTop = tIndex;
3219*c8dee2aaSAndroid Build Coastguard Worker            ++topCount;
3220*c8dee2aaSAndroid Build Coastguard Worker            bumpStep = true;
3221*c8dee2aaSAndroid Build Coastguard Worker        }
3222*c8dee2aaSAndroid Build Coastguard Worker        if (recType == REC_TYPE_MARK) {
3223*c8dee2aaSAndroid Build Coastguard Worker            ++markMax;
3224*c8dee2aaSAndroid Build Coastguard Worker            if (!draw_mark || !inStepRange) {
3225*c8dee2aaSAndroid Build Coastguard Worker                continue;
3226*c8dee2aaSAndroid Build Coastguard Worker            }
3227*c8dee2aaSAndroid Build Coastguard Worker            lastMark = tIndex;
3228*c8dee2aaSAndroid Build Coastguard Worker            ++markCount;
3229*c8dee2aaSAndroid Build Coastguard Worker            bumpStep = true;
3230*c8dee2aaSAndroid Build Coastguard Worker        }
3231*c8dee2aaSAndroid Build Coastguard Worker        if (bumpStep) {
3232*c8dee2aaSAndroid Build Coastguard Worker            lastIndex = tIndex;
3233*c8dee2aaSAndroid Build Coastguard Worker            logStart = test[tIndex + 1];
3234*c8dee2aaSAndroid Build Coastguard Worker            logRange = records.length / 2;
3235*c8dee2aaSAndroid Build Coastguard Worker            ++curStep;
3236*c8dee2aaSAndroid Build Coastguard Worker        }
3237*c8dee2aaSAndroid Build Coastguard Worker    }
3238*c8dee2aaSAndroid Build Coastguard Worker    stepMax = (draw_add ? addMax : 0)
3239*c8dee2aaSAndroid Build Coastguard Worker            + (draw_active ? activeMax : 0)
3240*c8dee2aaSAndroid Build Coastguard Worker            + (draw_angle ? angleMax : 0)
3241*c8dee2aaSAndroid Build Coastguard Worker            + (draw_coincidence ? coinMax : 0)
3242*c8dee2aaSAndroid Build Coastguard Worker            + (draw_op ? opMax : 0)
3243*c8dee2aaSAndroid Build Coastguard Worker            + (draw_sort ? sortMax : 0)
3244*c8dee2aaSAndroid Build Coastguard Worker            + (draw_top ? topMax : 0)
3245*c8dee2aaSAndroid Build Coastguard Worker            + (draw_mark ? markMax : 0)
3246*c8dee2aaSAndroid Build Coastguard Worker            + (draw_intersection == 2 ? sectMax : draw_intersection == 3 ? sectMax2 : 0);
3247*c8dee2aaSAndroid Build Coastguard Worker    if (stepMax == 0) {
3248*c8dee2aaSAndroid Build Coastguard Worker        stepMax = addMax + activeMax + angleMax + coinMax + opMax + sortMax + topMax + markMax;
3249*c8dee2aaSAndroid Build Coastguard Worker    }
3250*c8dee2aaSAndroid Build Coastguard Worker    drawnPts = [];
3251*c8dee2aaSAndroid Build Coastguard Worker    drawnLines = [];
3252*c8dee2aaSAndroid Build Coastguard Worker    drawnQuads = [];
3253*c8dee2aaSAndroid Build Coastguard Worker    drawnConics = [];
3254*c8dee2aaSAndroid Build Coastguard Worker    drawnCubics = [];
3255*c8dee2aaSAndroid Build Coastguard Worker    focusXmin = focusYmin = Infinity;
3256*c8dee2aaSAndroid Build Coastguard Worker    focusXmax = focusYmax = -Infinity;
3257*c8dee2aaSAndroid Build Coastguard Worker    var pathIndex = 0;
3258*c8dee2aaSAndroid Build Coastguard Worker    var opLetter = 'S';
3259*c8dee2aaSAndroid Build Coastguard Worker    for (var tIndex = lastIndex; tIndex >= 0; tIndex -= 3) {
3260*c8dee2aaSAndroid Build Coastguard Worker        var recType = test[tIndex];
3261*c8dee2aaSAndroid Build Coastguard Worker        var records = test[tIndex + 2];
3262*c8dee2aaSAndroid Build Coastguard Worker        for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
3263*c8dee2aaSAndroid Build Coastguard Worker            var fragType = records[recordIndex];
3264*c8dee2aaSAndroid Build Coastguard Worker            if (!typeof fragType == 'number' || fragType < 1 || fragType > FRAG_TYPE_LAST) {
3265*c8dee2aaSAndroid Build Coastguard Worker                console.log("unknown in range frag type: " + fragType);
3266*c8dee2aaSAndroid Build Coastguard Worker                throw "stop execution";
3267*c8dee2aaSAndroid Build Coastguard Worker            }
3268*c8dee2aaSAndroid Build Coastguard Worker            var frags = records[recordIndex + 1];
3269*c8dee2aaSAndroid Build Coastguard Worker            focus_enabled = false;
3270*c8dee2aaSAndroid Build Coastguard Worker            switch (recType) {
3271*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_COMPUTED:
3272*c8dee2aaSAndroid Build Coastguard Worker                    if (draw_computed == 0) {
3273*c8dee2aaSAndroid Build Coastguard Worker                        continue;
3274*c8dee2aaSAndroid Build Coastguard Worker                    }
3275*c8dee2aaSAndroid Build Coastguard Worker                    ctx.lineWidth = 1;
3276*c8dee2aaSAndroid Build Coastguard Worker                    ctx.strokeStyle = pathIndex == 0 ? "black" : "red";
3277*c8dee2aaSAndroid Build Coastguard Worker                    ctx.fillStyle = "blue";
3278*c8dee2aaSAndroid Build Coastguard Worker                    var drawThis = false;
3279*c8dee2aaSAndroid Build Coastguard Worker                    switch (fragType) {
3280*c8dee2aaSAndroid Build Coastguard Worker                        case PATH_QUAD:
3281*c8dee2aaSAndroid Build Coastguard Worker                            if ((draw_computed & 0x9) == 1 || ((draw_computed & 8) != 0
3282*c8dee2aaSAndroid Build Coastguard Worker                                    && (draw_computed & 7) == pathIndex)) {
3283*c8dee2aaSAndroid Build Coastguard Worker                                drawQuad(frags[0], frags[1], frags[2], frags[3],
3284*c8dee2aaSAndroid Build Coastguard Worker                                        frags[4], frags[5]);
3285*c8dee2aaSAndroid Build Coastguard Worker                                drawThis = true;
3286*c8dee2aaSAndroid Build Coastguard Worker                            }
3287*c8dee2aaSAndroid Build Coastguard Worker                            break;
3288*c8dee2aaSAndroid Build Coastguard Worker                        case PATH_CONIC:
3289*c8dee2aaSAndroid Build Coastguard Worker                            if ((draw_computed & 0xA) == 2 || ((draw_computed & 8) != 0
3290*c8dee2aaSAndroid Build Coastguard Worker                                    && (draw_computed & 7) == pathIndex)) {
3291*c8dee2aaSAndroid Build Coastguard Worker                                drawConicWithQuads(frags[0], frags[1], frags[2], frags[3],
3292*c8dee2aaSAndroid Build Coastguard Worker                                        frags[4], frags[5], frags[6]);
3293*c8dee2aaSAndroid Build Coastguard Worker                                drawThis = true;
3294*c8dee2aaSAndroid Build Coastguard Worker                            }
3295*c8dee2aaSAndroid Build Coastguard Worker                            break;
3296*c8dee2aaSAndroid Build Coastguard Worker                        case PATH_CUBIC:
3297*c8dee2aaSAndroid Build Coastguard Worker                            if ((draw_computed & 0xC) == 4 || ((draw_computed & 8) != 0
3298*c8dee2aaSAndroid Build Coastguard Worker                                     && (draw_computed & 7) == pathIndex)) {
3299*c8dee2aaSAndroid Build Coastguard Worker                                drawCubic(frags[0], frags[1], frags[2], frags[3],
3300*c8dee2aaSAndroid Build Coastguard Worker                                        frags[4], frags[5], frags[6], frags[7]);
3301*c8dee2aaSAndroid Build Coastguard Worker                                drawThis = true;
3302*c8dee2aaSAndroid Build Coastguard Worker                            }
3303*c8dee2aaSAndroid Build Coastguard Worker                            ++pathIndex;
3304*c8dee2aaSAndroid Build Coastguard Worker                            break;
3305*c8dee2aaSAndroid Build Coastguard Worker                        case COMPUTED_SET_1:
3306*c8dee2aaSAndroid Build Coastguard Worker                            pathIndex = 0;
3307*c8dee2aaSAndroid Build Coastguard Worker                            break;
3308*c8dee2aaSAndroid Build Coastguard Worker                        case COMPUTED_SET_2:
3309*c8dee2aaSAndroid Build Coastguard Worker                            pathIndex = 1;
3310*c8dee2aaSAndroid Build Coastguard Worker                            break;
3311*c8dee2aaSAndroid Build Coastguard Worker                        default:
3312*c8dee2aaSAndroid Build Coastguard Worker                            console.log("unknown REC_TYPE_COMPUTED frag type: " + fragType);
3313*c8dee2aaSAndroid Build Coastguard Worker                            throw "stop execution";
3314*c8dee2aaSAndroid Build Coastguard Worker                    }
3315*c8dee2aaSAndroid Build Coastguard Worker                    if (!drawThis || collect_bounds) {
3316*c8dee2aaSAndroid Build Coastguard Worker                        break;
3317*c8dee2aaSAndroid Build Coastguard Worker                    }
3318*c8dee2aaSAndroid Build Coastguard Worker                    drawCurveSpecials(test, frags, fragType);
3319*c8dee2aaSAndroid Build Coastguard Worker                    break;
3320*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_ALIGNED:
3321*c8dee2aaSAndroid Build Coastguard Worker                    if (draw_path < 4) {
3322*c8dee2aaSAndroid Build Coastguard Worker                        continue;
3323*c8dee2aaSAndroid Build Coastguard Worker                    }
3324*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_PATH:
3325*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_PATH2:
3326*c8dee2aaSAndroid Build Coastguard Worker                    if (REC_TYPE_ALIGNED != recType && draw_path >= 4) {
3327*c8dee2aaSAndroid Build Coastguard Worker                        continue;
3328*c8dee2aaSAndroid Build Coastguard Worker                    }
3329*c8dee2aaSAndroid Build Coastguard Worker                    if (!draw_path) {
3330*c8dee2aaSAndroid Build Coastguard Worker                        continue;
3331*c8dee2aaSAndroid Build Coastguard Worker                    }
3332*c8dee2aaSAndroid Build Coastguard Worker                    var firstPath = tIndex < secondPath;
3333*c8dee2aaSAndroid Build Coastguard Worker                    if ((draw_path & (firstPath ? 1 : 2)) == 0) {
3334*c8dee2aaSAndroid Build Coastguard Worker                        continue;
3335*c8dee2aaSAndroid Build Coastguard Worker                    }
3336*c8dee2aaSAndroid Build Coastguard Worker                    ctx.lineWidth = 1;
3337*c8dee2aaSAndroid Build Coastguard Worker                    ctx.strokeStyle = firstPath ? "black" : "red";
3338*c8dee2aaSAndroid Build Coastguard Worker                    ctx.fillStyle = "blue";
3339*c8dee2aaSAndroid Build Coastguard Worker                    var frags2 = [];
3340*c8dee2aaSAndroid Build Coastguard Worker                    switch (fragType) {
3341*c8dee2aaSAndroid Build Coastguard Worker                        case PATH_LINE:
3342*c8dee2aaSAndroid Build Coastguard Worker                            for (var i = 0; i < 4; ++ i) { frags2[i] = frags[i + 1]; }
3343*c8dee2aaSAndroid Build Coastguard Worker                            drawLine(frags2[0], frags2[1], frags2[2], frags2[3]);
3344*c8dee2aaSAndroid Build Coastguard Worker                            break;
3345*c8dee2aaSAndroid Build Coastguard Worker                        case PATH_QUAD:
3346*c8dee2aaSAndroid Build Coastguard Worker                            for (var i = 0; i < 6; ++ i) { frags2[i] = frags[i + 1]; }
3347*c8dee2aaSAndroid Build Coastguard Worker                            drawQuad(frags2[0], frags2[1], frags2[2], frags2[3],
3348*c8dee2aaSAndroid Build Coastguard Worker                                    frags2[4], frags2[5]);
3349*c8dee2aaSAndroid Build Coastguard Worker                            break;
3350*c8dee2aaSAndroid Build Coastguard Worker                        case PATH_CONIC:
3351*c8dee2aaSAndroid Build Coastguard Worker                            for (var i = 0; i < 7; ++ i) { frags2[i] = frags[i + 1]; }
3352*c8dee2aaSAndroid Build Coastguard Worker                            drawConicWithQuads(frags2[0], frags2[1], frags2[2], frags2[3],
3353*c8dee2aaSAndroid Build Coastguard Worker                                    frags2[4], frags2[5], frags2[6]);
3354*c8dee2aaSAndroid Build Coastguard Worker                            break;
3355*c8dee2aaSAndroid Build Coastguard Worker                        case PATH_CUBIC:
3356*c8dee2aaSAndroid Build Coastguard Worker                            for (var i = 0; i < 8; ++ i) { frags2[i] = frags[i + 1]; }
3357*c8dee2aaSAndroid Build Coastguard Worker                            drawCubic(frags2[0], frags2[1], frags2[2], frags2[3],
3358*c8dee2aaSAndroid Build Coastguard Worker                                    frags2[4], frags2[5], frags2[6], frags2[7]);
3359*c8dee2aaSAndroid Build Coastguard Worker                            break;
3360*c8dee2aaSAndroid Build Coastguard Worker                        default:
3361*c8dee2aaSAndroid Build Coastguard Worker                            console.log("unknown " + recType + " frag type: " + fragType);
3362*c8dee2aaSAndroid Build Coastguard Worker                            throw "stop execution";
3363*c8dee2aaSAndroid Build Coastguard Worker                    }
3364*c8dee2aaSAndroid Build Coastguard Worker                    if (collect_bounds) {
3365*c8dee2aaSAndroid Build Coastguard Worker                        break;
3366*c8dee2aaSAndroid Build Coastguard Worker                    }
3367*c8dee2aaSAndroid Build Coastguard Worker                    drawCurveSpecials(test, frags2, fragType);
3368*c8dee2aaSAndroid Build Coastguard Worker                    break;
3369*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_OP:
3370*c8dee2aaSAndroid Build Coastguard Worker                    switch (fragType) {
3371*c8dee2aaSAndroid Build Coastguard Worker                        case OP_INTERSECT: opLetter = 'I'; break;
3372*c8dee2aaSAndroid Build Coastguard Worker                        case OP_DIFFERENCE: opLetter = 'D'; break;
3373*c8dee2aaSAndroid Build Coastguard Worker                        case OP_UNION: opLetter = 'U'; break;
3374*c8dee2aaSAndroid Build Coastguard Worker                        case OP_XOR: opLetter = 'X'; break;
3375*c8dee2aaSAndroid Build Coastguard Worker                        default:
3376*c8dee2aaSAndroid Build Coastguard Worker                            console.log("unknown REC_TYPE_OP frag type: " + fragType);
3377*c8dee2aaSAndroid Build Coastguard Worker                            throw "stop execution";
3378*c8dee2aaSAndroid Build Coastguard Worker                    }
3379*c8dee2aaSAndroid Build Coastguard Worker                    break;
3380*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_ACTIVE:
3381*c8dee2aaSAndroid Build Coastguard Worker                    if (!draw_active || (step_limit > 0 && tIndex < lastActive)) {
3382*c8dee2aaSAndroid Build Coastguard Worker                        continue;
3383*c8dee2aaSAndroid Build Coastguard Worker                    }
3384*c8dee2aaSAndroid Build Coastguard Worker                    var x1 = frags[SPAN_X1];
3385*c8dee2aaSAndroid Build Coastguard Worker                    var y1 = frags[SPAN_Y1];
3386*c8dee2aaSAndroid Build Coastguard Worker                    var x2 = frags[SPAN_X2];
3387*c8dee2aaSAndroid Build Coastguard Worker                    var y2 = frags[SPAN_Y2];
3388*c8dee2aaSAndroid Build Coastguard Worker                    var x3, y3, x3, y4, w;
3389*c8dee2aaSAndroid Build Coastguard Worker                    ctx.lineWidth = 3;
3390*c8dee2aaSAndroid Build Coastguard Worker                    ctx.strokeStyle = "rgba(0,0,255, 0.3)";
3391*c8dee2aaSAndroid Build Coastguard Worker                    focus_enabled = true;
3392*c8dee2aaSAndroid Build Coastguard Worker                    switch (fragType) {
3393*c8dee2aaSAndroid Build Coastguard Worker                        case ACTIVE_LINE_SPAN:
3394*c8dee2aaSAndroid Build Coastguard Worker                            drawLine(x1, y1, x2, y2);
3395*c8dee2aaSAndroid Build Coastguard Worker                            if (draw_id) {
3396*c8dee2aaSAndroid Build Coastguard Worker                                drawLineID(frags[0], x1, y1, x2, y2);
3397*c8dee2aaSAndroid Build Coastguard Worker                            }
3398*c8dee2aaSAndroid Build Coastguard Worker                            if (pt_labels) {
3399*c8dee2aaSAndroid Build Coastguard Worker                                var curve = [x1, y1, x2, y2];
3400*c8dee2aaSAndroid Build Coastguard Worker                                ctx.fillStyle = "blue";
3401*c8dee2aaSAndroid Build Coastguard Worker                                drawPoints(curve, PATH_LINE, pt_labels == 2);
3402*c8dee2aaSAndroid Build Coastguard Worker                            }
3403*c8dee2aaSAndroid Build Coastguard Worker                             break;
3404*c8dee2aaSAndroid Build Coastguard Worker                        case ACTIVE_QUAD_SPAN:
3405*c8dee2aaSAndroid Build Coastguard Worker                            x3 = frags[SPAN_X3];
3406*c8dee2aaSAndroid Build Coastguard Worker                            y3 = frags[SPAN_Y3];
3407*c8dee2aaSAndroid Build Coastguard Worker                            drawQuad(x1, y1, x2, y2, x3, y3);
3408*c8dee2aaSAndroid Build Coastguard Worker                            if (draw_id) {
3409*c8dee2aaSAndroid Build Coastguard Worker                                drawQuadID(frags[0], x1, y1, x2, y2, x3, y3);
3410*c8dee2aaSAndroid Build Coastguard Worker                            }
3411*c8dee2aaSAndroid Build Coastguard Worker                            if (pt_labels) {
3412*c8dee2aaSAndroid Build Coastguard Worker                                var curve = [x1, y1, x2, y2, x3, y3];
3413*c8dee2aaSAndroid Build Coastguard Worker                                ctx.fillStyle = "blue";
3414*c8dee2aaSAndroid Build Coastguard Worker                                drawPoints(curve, PATH_QUAD, pt_labels == 2);
3415*c8dee2aaSAndroid Build Coastguard Worker                            }
3416*c8dee2aaSAndroid Build Coastguard Worker                            break;
3417*c8dee2aaSAndroid Build Coastguard Worker                        case ACTIVE_CONIC_SPAN:
3418*c8dee2aaSAndroid Build Coastguard Worker                            x3 = frags[SPAN_X3];
3419*c8dee2aaSAndroid Build Coastguard Worker                            y3 = frags[SPAN_Y3];
3420*c8dee2aaSAndroid Build Coastguard Worker                            w = frags[SPAN_K_W];
3421*c8dee2aaSAndroid Build Coastguard Worker                            drawConicWithQuads(x1, y1, x2, y2, x3, y3, w);
3422*c8dee2aaSAndroid Build Coastguard Worker                            if (draw_id) {
3423*c8dee2aaSAndroid Build Coastguard Worker                                drawConicID(frags[0], x1, y1, x2, y2, x3, y3, w);
3424*c8dee2aaSAndroid Build Coastguard Worker                            }
3425*c8dee2aaSAndroid Build Coastguard Worker                            if (pt_labels) {
3426*c8dee2aaSAndroid Build Coastguard Worker                                var curve = [x1, y1, x2, y2, x3, y3, w];
3427*c8dee2aaSAndroid Build Coastguard Worker                                ctx.fillStyle = "blue";
3428*c8dee2aaSAndroid Build Coastguard Worker                                drawPoints(curve, PATH_CONIC, pt_labels == 2);
3429*c8dee2aaSAndroid Build Coastguard Worker                            }
3430*c8dee2aaSAndroid Build Coastguard Worker                            break;
3431*c8dee2aaSAndroid Build Coastguard Worker                        case ACTIVE_CUBIC_SPAN:
3432*c8dee2aaSAndroid Build Coastguard Worker                            x3 = frags[SPAN_X3];
3433*c8dee2aaSAndroid Build Coastguard Worker                            y3 = frags[SPAN_Y3];
3434*c8dee2aaSAndroid Build Coastguard Worker                            x4 = frags[SPAN_X4];
3435*c8dee2aaSAndroid Build Coastguard Worker                            y4 = frags[SPAN_Y4];
3436*c8dee2aaSAndroid Build Coastguard Worker                            drawCubic(x1, y1, x2, y2, x3, y3, x4, y4);
3437*c8dee2aaSAndroid Build Coastguard Worker                            if (draw_id) {
3438*c8dee2aaSAndroid Build Coastguard Worker                                drawCubicID(frags[0], x1, y1, x2, y2, x3, y3, x4, y4);
3439*c8dee2aaSAndroid Build Coastguard Worker                            }
3440*c8dee2aaSAndroid Build Coastguard Worker                            if (pt_labels) {
3441*c8dee2aaSAndroid Build Coastguard Worker                                var curve = [x1, y1, x2, y2, x3, y3, x4, y4];
3442*c8dee2aaSAndroid Build Coastguard Worker                                ctx.fillStyle = "blue";
3443*c8dee2aaSAndroid Build Coastguard Worker                                drawPoints(curve, PATH_CUBIC, pt_labels == 2);
3444*c8dee2aaSAndroid Build Coastguard Worker                            }
3445*c8dee2aaSAndroid Build Coastguard Worker                            break;
3446*c8dee2aaSAndroid Build Coastguard Worker                        default:
3447*c8dee2aaSAndroid Build Coastguard Worker                            console.log("unknown REC_TYPE_ACTIVE frag type: " + fragType);
3448*c8dee2aaSAndroid Build Coastguard Worker                            throw "stop execution";
3449*c8dee2aaSAndroid Build Coastguard Worker                    }
3450*c8dee2aaSAndroid Build Coastguard Worker                    break;
3451*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_ACTIVE_OP:
3452*c8dee2aaSAndroid Build Coastguard Worker                    if (!draw_op || (step_limit > 0 && tIndex < lastOp)) {
3453*c8dee2aaSAndroid Build Coastguard Worker                        continue;
3454*c8dee2aaSAndroid Build Coastguard Worker                    }
3455*c8dee2aaSAndroid Build Coastguard Worker                    focus_enabled = true;
3456*c8dee2aaSAndroid Build Coastguard Worker                    ctx.lineWidth = 3;
3457*c8dee2aaSAndroid Build Coastguard Worker                    var activeSpan = frags[7] == "1";
3458*c8dee2aaSAndroid Build Coastguard Worker                    ctx.strokeStyle = activeSpan ? "rgba(45,160,0, 0.3)" : "rgba(255,45,0, 0.5)";
3459*c8dee2aaSAndroid Build Coastguard Worker                    var curve = curvePartialByID(test, frags[0], frags[1], frags[2]);
3460*c8dee2aaSAndroid Build Coastguard Worker                    drawCurve(curve);
3461*c8dee2aaSAndroid Build Coastguard Worker                    if (draw_op > 1) {
3462*c8dee2aaSAndroid Build Coastguard Worker                        drawArc(curve, false, frags[3], frags[4]);
3463*c8dee2aaSAndroid Build Coastguard Worker                        drawArc(curve, true, frags[5], frags[6]);
3464*c8dee2aaSAndroid Build Coastguard Worker                    }
3465*c8dee2aaSAndroid Build Coastguard Worker                    break;
3466*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_ADD:
3467*c8dee2aaSAndroid Build Coastguard Worker                    if (!draw_add) {
3468*c8dee2aaSAndroid Build Coastguard Worker                        continue;
3469*c8dee2aaSAndroid Build Coastguard Worker                    }
3470*c8dee2aaSAndroid Build Coastguard Worker                    ctx.lineWidth = 3;
3471*c8dee2aaSAndroid Build Coastguard Worker                    ctx.strokeStyle = closeCount == 0 ? "rgba(0,0,255, 0.3)"
3472*c8dee2aaSAndroid Build Coastguard Worker                            : closeCount == 1 ? "rgba(0,127,0, 0.3)"
3473*c8dee2aaSAndroid Build Coastguard Worker                            : closeCount == 2 ? "rgba(0,127,127, 0.3)"
3474*c8dee2aaSAndroid Build Coastguard Worker                            : closeCount == 3 ? "rgba(127,127,0, 0.3)"
3475*c8dee2aaSAndroid Build Coastguard Worker                            : "rgba(127,0,127, 0.3)";
3476*c8dee2aaSAndroid Build Coastguard Worker                    focus_enabled = true;
3477*c8dee2aaSAndroid Build Coastguard Worker                    switch (fragType) {
3478*c8dee2aaSAndroid Build Coastguard Worker                        case ADD_MOVETO:
3479*c8dee2aaSAndroid Build Coastguard Worker                            break;
3480*c8dee2aaSAndroid Build Coastguard Worker                        case ADD_LINETO:
3481*c8dee2aaSAndroid Build Coastguard Worker                            if (step_limit == 0 || tIndex >= lastAdd) {
3482*c8dee2aaSAndroid Build Coastguard Worker                                drawLine(frags[0], frags[1], frags[2], frags[3]);
3483*c8dee2aaSAndroid Build Coastguard Worker                            }
3484*c8dee2aaSAndroid Build Coastguard Worker                            break;
3485*c8dee2aaSAndroid Build Coastguard Worker                        case ADD_QUADTO:
3486*c8dee2aaSAndroid Build Coastguard Worker                            if (step_limit == 0 || tIndex >= lastAdd) {
3487*c8dee2aaSAndroid Build Coastguard Worker                                drawQuad(frags[0], frags[1], frags[2], frags[3], frags[4], frags[5]);
3488*c8dee2aaSAndroid Build Coastguard Worker                            }
3489*c8dee2aaSAndroid Build Coastguard Worker                            break;
3490*c8dee2aaSAndroid Build Coastguard Worker                        case ADD_CONICTO:
3491*c8dee2aaSAndroid Build Coastguard Worker                            if (step_limit == 0 || tIndex >= lastAdd) {
3492*c8dee2aaSAndroid Build Coastguard Worker                                drawConicWithQuads(frags[0], frags[1], frags[2], frags[3],
3493*c8dee2aaSAndroid Build Coastguard Worker                                        frags[4], frags[5], frags[6]);
3494*c8dee2aaSAndroid Build Coastguard Worker                            }
3495*c8dee2aaSAndroid Build Coastguard Worker                            break;
3496*c8dee2aaSAndroid Build Coastguard Worker                        case ADD_CUBICTO:
3497*c8dee2aaSAndroid Build Coastguard Worker                            if (step_limit == 0 || tIndex >= lastAdd) {
3498*c8dee2aaSAndroid Build Coastguard Worker                                drawCubic(frags[0], frags[1], frags[2], frags[3],
3499*c8dee2aaSAndroid Build Coastguard Worker                                        frags[4], frags[5], frags[6], frags[7]);
3500*c8dee2aaSAndroid Build Coastguard Worker                            }
3501*c8dee2aaSAndroid Build Coastguard Worker                            break;
3502*c8dee2aaSAndroid Build Coastguard Worker                        case ADD_CLOSE:
3503*c8dee2aaSAndroid Build Coastguard Worker                            ++closeCount;
3504*c8dee2aaSAndroid Build Coastguard Worker                            break;
3505*c8dee2aaSAndroid Build Coastguard Worker                        case ADD_FILL:
3506*c8dee2aaSAndroid Build Coastguard Worker                            break;
3507*c8dee2aaSAndroid Build Coastguard Worker                        default:
3508*c8dee2aaSAndroid Build Coastguard Worker                            console.log("unknown REC_TYPE_ADD frag type: " + fragType);
3509*c8dee2aaSAndroid Build Coastguard Worker                            throw "stop execution";
3510*c8dee2aaSAndroid Build Coastguard Worker                    }
3511*c8dee2aaSAndroid Build Coastguard Worker                    break;
3512*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_ANGLE:
3513*c8dee2aaSAndroid Build Coastguard Worker                    angleBetween = frags[18] == "T";
3514*c8dee2aaSAndroid Build Coastguard Worker                    afterIndex = 0;
3515*c8dee2aaSAndroid Build Coastguard Worker                    if (draw_angle == 0 || draw_angle == 3 || (step_limit > 0 && tIndex < lastAngle)) {
3516*c8dee2aaSAndroid Build Coastguard Worker                        continue;
3517*c8dee2aaSAndroid Build Coastguard Worker                    }
3518*c8dee2aaSAndroid Build Coastguard Worker                    focus_enabled = true;
3519*c8dee2aaSAndroid Build Coastguard Worker                    ctx.lineWidth = 3;
3520*c8dee2aaSAndroid Build Coastguard Worker                    ctx.strokeStyle = "rgba(127,45,127, 0.3)";
3521*c8dee2aaSAndroid Build Coastguard Worker                    var leftCurve = curvePartialByID(test, frags[0], frags[4], frags[5]);
3522*c8dee2aaSAndroid Build Coastguard Worker                    var midCurve = curvePartialByID(test, frags[6], frags[10], frags[11]);
3523*c8dee2aaSAndroid Build Coastguard Worker                    var rightCurve = curvePartialByID(test, frags[12], frags[16], frags[17]);
3524*c8dee2aaSAndroid Build Coastguard Worker                    drawCurve(leftCurve);
3525*c8dee2aaSAndroid Build Coastguard Worker                    drawCurve(rightCurve);
3526*c8dee2aaSAndroid Build Coastguard Worker                    ctx.strokeStyle = angleBetween ? "rgba(0,160,45, 0.3)" : "rgba(255,0,45, 0.5)";
3527*c8dee2aaSAndroid Build Coastguard Worker                    drawCurve(midCurve);
3528*c8dee2aaSAndroid Build Coastguard Worker                    if (draw_angle > 1) {
3529*c8dee2aaSAndroid Build Coastguard Worker                        drawVisibleOrder(leftCurve, 'L');
3530*c8dee2aaSAndroid Build Coastguard Worker                        drawVisibleOrder(rightCurve, 'R');
3531*c8dee2aaSAndroid Build Coastguard Worker                    }
3532*c8dee2aaSAndroid Build Coastguard Worker                    if (draw_id) {
3533*c8dee2aaSAndroid Build Coastguard Worker                        drawVisibleID(leftCurve, 0.5, frags[0]);
3534*c8dee2aaSAndroid Build Coastguard Worker                        drawVisibleID(midCurve, 0.5, frags[6]);
3535*c8dee2aaSAndroid Build Coastguard Worker                        drawVisibleID(rightCurve, 0.5, frags[12]);
3536*c8dee2aaSAndroid Build Coastguard Worker                    }
3537*c8dee2aaSAndroid Build Coastguard Worker                    break;
3538*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_AFTERPART:
3539*c8dee2aaSAndroid Build Coastguard Worker                    if (draw_angle != 3 || (step_limit > 0 && tIndex < lastAngle)) {
3540*c8dee2aaSAndroid Build Coastguard Worker                        continue;
3541*c8dee2aaSAndroid Build Coastguard Worker                    }
3542*c8dee2aaSAndroid Build Coastguard Worker                    ctx.strokeStyle = afterIndex == 0 ? "rgba(255,0,0, 1.0)"
3543*c8dee2aaSAndroid Build Coastguard Worker                            : (afterIndex == 1) == angleBetween ? "rgba(0,128,0, 1.0)"
3544*c8dee2aaSAndroid Build Coastguard Worker                            : "rgba(0,0,255, 1.0)";
3545*c8dee2aaSAndroid Build Coastguard Worker                    var curve;
3546*c8dee2aaSAndroid Build Coastguard Worker                    var id;
3547*c8dee2aaSAndroid Build Coastguard Worker                    switch (fragType) {
3548*c8dee2aaSAndroid Build Coastguard Worker                        case PATH_LINE:
3549*c8dee2aaSAndroid Build Coastguard Worker                            curve = [ frags[0], frags[1], frags[2], frags[3] ];
3550*c8dee2aaSAndroid Build Coastguard Worker                            id = frags[4];
3551*c8dee2aaSAndroid Build Coastguard Worker                            break;
3552*c8dee2aaSAndroid Build Coastguard Worker                        case PATH_QUAD:
3553*c8dee2aaSAndroid Build Coastguard Worker                            curve = [ frags[0], frags[1], frags[2], frags[3],
3554*c8dee2aaSAndroid Build Coastguard Worker                                     frags[4], frags[5] ];
3555*c8dee2aaSAndroid Build Coastguard Worker                            id = frags[6];
3556*c8dee2aaSAndroid Build Coastguard Worker                            break;
3557*c8dee2aaSAndroid Build Coastguard Worker                        case PATH_CONIC:
3558*c8dee2aaSAndroid Build Coastguard Worker                            curve = [ frags[0], frags[1], frags[2], frags[3],
3559*c8dee2aaSAndroid Build Coastguard Worker                                     frags[4], frags[5], frags[6] ];
3560*c8dee2aaSAndroid Build Coastguard Worker                            id = frags[7];
3561*c8dee2aaSAndroid Build Coastguard Worker                            break;
3562*c8dee2aaSAndroid Build Coastguard Worker                        case PATH_CUBIC:
3563*c8dee2aaSAndroid Build Coastguard Worker                            curve = [ frags[0], frags[1], frags[2], frags[3],
3564*c8dee2aaSAndroid Build Coastguard Worker                                     frags[4], frags[5], frags[6], frags[7] ];
3565*c8dee2aaSAndroid Build Coastguard Worker                            id = frags[8];
3566*c8dee2aaSAndroid Build Coastguard Worker                            break;
3567*c8dee2aaSAndroid Build Coastguard Worker                        default:
3568*c8dee2aaSAndroid Build Coastguard Worker                            console.log("unknown REC_TYPE_AFTERPART frag type: " + fragType);
3569*c8dee2aaSAndroid Build Coastguard Worker                            throw "stop execution";
3570*c8dee2aaSAndroid Build Coastguard Worker                    }
3571*c8dee2aaSAndroid Build Coastguard Worker                    drawCurve(curve);
3572*c8dee2aaSAndroid Build Coastguard Worker                    if (draw_id) {
3573*c8dee2aaSAndroid Build Coastguard Worker                        drawVisibleID(curve, 0.5, id);
3574*c8dee2aaSAndroid Build Coastguard Worker                    }
3575*c8dee2aaSAndroid Build Coastguard Worker                    ++afterIndex;
3576*c8dee2aaSAndroid Build Coastguard Worker                    break;
3577*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_COINCIDENCE:
3578*c8dee2aaSAndroid Build Coastguard Worker                    if (!draw_coincidence || (step_limit > 0 && tIndex < lastCoin)) {
3579*c8dee2aaSAndroid Build Coastguard Worker                        continue;
3580*c8dee2aaSAndroid Build Coastguard Worker                    }
3581*c8dee2aaSAndroid Build Coastguard Worker                    focus_enabled = true;
3582*c8dee2aaSAndroid Build Coastguard Worker                    ctx.lineWidth = 3;
3583*c8dee2aaSAndroid Build Coastguard Worker                    ctx.strokeStyle = "rgba(127,45,63, 0.3)";
3584*c8dee2aaSAndroid Build Coastguard Worker                    var curve = curvePartialByID(test, frags[0], frags[1], frags[2]);
3585*c8dee2aaSAndroid Build Coastguard Worker                    drawCurve(curve);
3586*c8dee2aaSAndroid Build Coastguard Worker                    break;
3587*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_SECT:
3588*c8dee2aaSAndroid Build Coastguard Worker                    if (!draw_intersection) {
3589*c8dee2aaSAndroid Build Coastguard Worker                        continue;
3590*c8dee2aaSAndroid Build Coastguard Worker                    }
3591*c8dee2aaSAndroid Build Coastguard Worker                    if (draw_intersection != 1 && (step_limit > 0 && tIndex < lastSect)) {
3592*c8dee2aaSAndroid Build Coastguard Worker                        continue;
3593*c8dee2aaSAndroid Build Coastguard Worker                    }
3594*c8dee2aaSAndroid Build Coastguard Worker                    // draw_intersection == 1 : show all
3595*c8dee2aaSAndroid Build Coastguard Worker                    // draw_intersection == 2 : step == 0 ? show all : show intersection line #step
3596*c8dee2aaSAndroid Build Coastguard Worker                    // draw_intersection == 3 : step == 0 ? show all : show intersection #step
3597*c8dee2aaSAndroid Build Coastguard Worker                    ctx.lineWidth = 1;
3598*c8dee2aaSAndroid Build Coastguard Worker                    ctx.strokeStyle = "rgba(0,0,255, 0.3)";
3599*c8dee2aaSAndroid Build Coastguard Worker                    ctx.fillStyle = "blue";
3600*c8dee2aaSAndroid Build Coastguard Worker                    focus_enabled = true;
3601*c8dee2aaSAndroid Build Coastguard Worker                    var f = [];
3602*c8dee2aaSAndroid Build Coastguard Worker                    var c1s;
3603*c8dee2aaSAndroid Build Coastguard Worker                    var c1l;
3604*c8dee2aaSAndroid Build Coastguard Worker                    var c2s;
3605*c8dee2aaSAndroid Build Coastguard Worker                    var c2l;
3606*c8dee2aaSAndroid Build Coastguard Worker                    switch (fragType) {
3607*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_LINE:
3608*c8dee2aaSAndroid Build Coastguard Worker                            f.push(5, 6, 0, 7);
3609*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 1; c1l = 4; c2s = 8; c2l = 4;
3610*c8dee2aaSAndroid Build Coastguard Worker                            break;
3611*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_LINE_2:
3612*c8dee2aaSAndroid Build Coastguard Worker                            f.push(5, 6, 0, 10);
3613*c8dee2aaSAndroid Build Coastguard Worker                            f.push(8, 9, 7, 15);
3614*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 1; c1l = 4; c2s = 11; c2l = 4;
3615*c8dee2aaSAndroid Build Coastguard Worker                            break;
3616*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_LINE_NO:
3617*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 0; c1l = 4; c2s = 4; c2l = 4;
3618*c8dee2aaSAndroid Build Coastguard Worker                            break;
3619*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_QUAD_LINE:
3620*c8dee2aaSAndroid Build Coastguard Worker                            f.push(7, 8, 0, 9);
3621*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 1; c1l = 6; c2s = 10; c2l = 4;
3622*c8dee2aaSAndroid Build Coastguard Worker                            break;
3623*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_QUAD_LINE_2:
3624*c8dee2aaSAndroid Build Coastguard Worker                            f.push(7, 8, 0, 12);
3625*c8dee2aaSAndroid Build Coastguard Worker                            f.push(10, 11, 9, 17);
3626*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 1; c1l = 6; c2s = 13; c2l = 4;
3627*c8dee2aaSAndroid Build Coastguard Worker                            break;
3628*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_QUAD_LINE_NO:
3629*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 0; c1l = 6; c2s = 6; c2l = 4;
3630*c8dee2aaSAndroid Build Coastguard Worker                            break;
3631*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_QUAD:
3632*c8dee2aaSAndroid Build Coastguard Worker                            f.push(7, 8, 0, 9);
3633*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 1; c1l = 6; c2s = 10; c2l = 6;
3634*c8dee2aaSAndroid Build Coastguard Worker                            break;
3635*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_QUAD_2:
3636*c8dee2aaSAndroid Build Coastguard Worker                            f.push(7, 8, 0, 12);
3637*c8dee2aaSAndroid Build Coastguard Worker                            f.push(10, 11, 9, 19);
3638*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 1; c1l = 6; c2s = 13; c2l = 6;
3639*c8dee2aaSAndroid Build Coastguard Worker                            break;
3640*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_QUAD_NO:
3641*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 0; c1l = 6; c2s = 6; c2l = 6;
3642*c8dee2aaSAndroid Build Coastguard Worker                            break;
3643*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CONIC_LINE:
3644*c8dee2aaSAndroid Build Coastguard Worker                            f.push(8, 9, 0, 10);
3645*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 1; c1l = 7; c2s = 11; c2l = 4;
3646*c8dee2aaSAndroid Build Coastguard Worker                            break;
3647*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CONIC_LINE_2:
3648*c8dee2aaSAndroid Build Coastguard Worker                            f.push(8, 9, 0, 12);
3649*c8dee2aaSAndroid Build Coastguard Worker                            f.push(11, 12, 10, 18);
3650*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 1; c1l = 7; c2s = 14; c2l = 4;
3651*c8dee2aaSAndroid Build Coastguard Worker                            break;
3652*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CONIC_LINE_NO:
3653*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 0; c1l = 7; c2s = 7; c2l = 4;
3654*c8dee2aaSAndroid Build Coastguard Worker                            break;
3655*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CONIC_QUAD:
3656*c8dee2aaSAndroid Build Coastguard Worker                            f.push(8, 9, 0, 10);
3657*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 1; c1l = 7; c2s = 11; c2l = 6;
3658*c8dee2aaSAndroid Build Coastguard Worker                            break;
3659*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CONIC_QUAD_2:
3660*c8dee2aaSAndroid Build Coastguard Worker                            f.push(8, 9, 0, 12);
3661*c8dee2aaSAndroid Build Coastguard Worker                            f.push(11, 12, 10, 18);
3662*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 1; c1l = 7; c2s = 14; c2l = 6;
3663*c8dee2aaSAndroid Build Coastguard Worker                            break;
3664*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CONIC_QUAD_3:
3665*c8dee2aaSAndroid Build Coastguard Worker                            f.push(8, 9, 0, 15);
3666*c8dee2aaSAndroid Build Coastguard Worker                            f.push(11, 12, 10, 21);
3667*c8dee2aaSAndroid Build Coastguard Worker                            f.push(14, 15, 13, 22);
3668*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 1; c1l = 7; c2s = 17; c2l = 6;
3669*c8dee2aaSAndroid Build Coastguard Worker                            break;
3670*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CONIC_QUAD_4:
3671*c8dee2aaSAndroid Build Coastguard Worker                            f.push(8, 9, 0, 18);
3672*c8dee2aaSAndroid Build Coastguard Worker                            f.push(11, 12, 10, 24);
3673*c8dee2aaSAndroid Build Coastguard Worker                            f.push(14, 15, 13, 25);
3674*c8dee2aaSAndroid Build Coastguard Worker                            f.push(17, 18, 16, 26);
3675*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 1; c1l = 7; c2s = 20; c2l = 6;
3676*c8dee2aaSAndroid Build Coastguard Worker                            break;
3677*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CONIC_QUAD_NO:
3678*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 0; c1l = 7; c2s = 7; c2l = 6;
3679*c8dee2aaSAndroid Build Coastguard Worker                            break;
3680*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CONIC:
3681*c8dee2aaSAndroid Build Coastguard Worker                            f.push(8, 9, 0, 10);
3682*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 1; c1l = 7; c2s = 11; c2l = 7;
3683*c8dee2aaSAndroid Build Coastguard Worker                            break;
3684*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CONIC_2:
3685*c8dee2aaSAndroid Build Coastguard Worker                            f.push(8, 9, 0, 13);
3686*c8dee2aaSAndroid Build Coastguard Worker                            f.push(11, 12, 10, 21);
3687*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 1; c1l = 7; c2s = 14; c2l = 7;
3688*c8dee2aaSAndroid Build Coastguard Worker                            break;
3689*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CONIC_NO:
3690*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 0; c1l = 7; c2s = 7; c2l = 7;
3691*c8dee2aaSAndroid Build Coastguard Worker                            break;
3692*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_SELF_CUBIC:
3693*c8dee2aaSAndroid Build Coastguard Worker                            f.push(9, 10, 0, 11);
3694*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 1; c1l = 8; c2s = 0; c2l = 0;
3695*c8dee2aaSAndroid Build Coastguard Worker                            break;
3696*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_SELF_CUBIC_NO:
3697*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 0; c1l = 8; c2s = 0; c2l = 0;
3698*c8dee2aaSAndroid Build Coastguard Worker                            break;
3699*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC_LINE:
3700*c8dee2aaSAndroid Build Coastguard Worker                            f.push(9, 10, 0, 11);
3701*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 1; c1l = 8; c2s = 12; c2l = 4;
3702*c8dee2aaSAndroid Build Coastguard Worker                            break;
3703*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC_LINE_2:
3704*c8dee2aaSAndroid Build Coastguard Worker                            f.push(9, 10, 0, 14);
3705*c8dee2aaSAndroid Build Coastguard Worker                            f.push(12, 13, 11, 19);
3706*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 1; c1l = 8; c2s = 15; c2l = 4;
3707*c8dee2aaSAndroid Build Coastguard Worker                            break;
3708*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC_LINE_3:
3709*c8dee2aaSAndroid Build Coastguard Worker                            f.push(9, 10, 0, 17);
3710*c8dee2aaSAndroid Build Coastguard Worker                            f.push(12, 13, 11, 22);
3711*c8dee2aaSAndroid Build Coastguard Worker                            f.push(15, 16, 14, 23);
3712*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 1; c1l = 8; c2s = 18; c2l = 4;
3713*c8dee2aaSAndroid Build Coastguard Worker                            break;
3714*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC_QUAD_NO:
3715*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 0; c1l = 8; c2s = 8; c2l = 6;
3716*c8dee2aaSAndroid Build Coastguard Worker                            break;
3717*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC_QUAD:
3718*c8dee2aaSAndroid Build Coastguard Worker                            f.push(9, 10, 0, 11);
3719*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 1; c1l = 8; c2s = 12; c2l = 6;
3720*c8dee2aaSAndroid Build Coastguard Worker                            break;
3721*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC_QUAD_2:
3722*c8dee2aaSAndroid Build Coastguard Worker                            f.push(9, 10, 0, 14);
3723*c8dee2aaSAndroid Build Coastguard Worker                            f.push(12, 13, 11, 21);
3724*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 1; c1l = 8; c2s = 15; c2l = 6;
3725*c8dee2aaSAndroid Build Coastguard Worker                            break;
3726*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC_QUAD_3:
3727*c8dee2aaSAndroid Build Coastguard Worker                            f.push(9, 10, 0, 17);
3728*c8dee2aaSAndroid Build Coastguard Worker                            f.push(12, 13, 11, 24);
3729*c8dee2aaSAndroid Build Coastguard Worker                            f.push(15, 16, 14, 25);
3730*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 1; c1l = 8; c2s = 18; c2l = 6;
3731*c8dee2aaSAndroid Build Coastguard Worker                            break;
3732*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC_QUAD_4:
3733*c8dee2aaSAndroid Build Coastguard Worker                            f.push(9, 10, 0, 20);
3734*c8dee2aaSAndroid Build Coastguard Worker                            f.push(12, 13, 11, 27);
3735*c8dee2aaSAndroid Build Coastguard Worker                            f.push(15, 16, 14, 28);
3736*c8dee2aaSAndroid Build Coastguard Worker                            f.push(18, 19, 17, 29);
3737*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 1; c1l = 8; c2s = 21; c2l = 6;
3738*c8dee2aaSAndroid Build Coastguard Worker                            break;
3739*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC_LINE_NO:
3740*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 0; c1l = 8; c2s = 8; c2l = 4;
3741*c8dee2aaSAndroid Build Coastguard Worker                            break;
3742*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC:
3743*c8dee2aaSAndroid Build Coastguard Worker                            f.push(9, 10, 0, 11);
3744*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 1; c1l = 8; c2s = 12; c2l = 8;
3745*c8dee2aaSAndroid Build Coastguard Worker                            break;
3746*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC_2:
3747*c8dee2aaSAndroid Build Coastguard Worker                            f.push(9, 10, 0, 14);
3748*c8dee2aaSAndroid Build Coastguard Worker                            f.push(12, 13, 11, 23);
3749*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 1; c1l = 8; c2s = 15; c2l = 8;
3750*c8dee2aaSAndroid Build Coastguard Worker                            break;
3751*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC_3:
3752*c8dee2aaSAndroid Build Coastguard Worker                            f.push(9, 10, 0, 17);
3753*c8dee2aaSAndroid Build Coastguard Worker                            f.push(12, 13, 11, 26);
3754*c8dee2aaSAndroid Build Coastguard Worker                            f.push(15, 16, 14, 27);
3755*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 1; c1l = 8; c2s = 18; c2l = 8;
3756*c8dee2aaSAndroid Build Coastguard Worker                            break;
3757*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC_4:
3758*c8dee2aaSAndroid Build Coastguard Worker                            f.push(9, 10, 0, 20);
3759*c8dee2aaSAndroid Build Coastguard Worker                            f.push(12, 13, 11, 29);
3760*c8dee2aaSAndroid Build Coastguard Worker                            f.push(15, 16, 14, 30);
3761*c8dee2aaSAndroid Build Coastguard Worker                            f.push(18, 19, 17, 31);
3762*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 1; c1l = 8; c2s = 21; c2l = 8;
3763*c8dee2aaSAndroid Build Coastguard Worker                            break;
3764*c8dee2aaSAndroid Build Coastguard Worker                        case INTERSECT_CUBIC_NO:
3765*c8dee2aaSAndroid Build Coastguard Worker                            c1s = 0; c1l = 8; c2s = 8; c2l = 8;
3766*c8dee2aaSAndroid Build Coastguard Worker                            break;
3767*c8dee2aaSAndroid Build Coastguard Worker                        default:
3768*c8dee2aaSAndroid Build Coastguard Worker                            console.log("unknown REC_TYPE_SECT frag type: " + fragType);
3769*c8dee2aaSAndroid Build Coastguard Worker                            throw "stop execution";
3770*c8dee2aaSAndroid Build Coastguard Worker                    }
3771*c8dee2aaSAndroid Build Coastguard Worker                    if (draw_intersection != 1) {
3772*c8dee2aaSAndroid Build Coastguard Worker                        var id = -1;
3773*c8dee2aaSAndroid Build Coastguard Worker                        var curve;
3774*c8dee2aaSAndroid Build Coastguard Worker                        switch (c1l) {
3775*c8dee2aaSAndroid Build Coastguard Worker                            case 4:
3776*c8dee2aaSAndroid Build Coastguard Worker                                drawLine(frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3]);
3777*c8dee2aaSAndroid Build Coastguard Worker                                if (draw_id) {
3778*c8dee2aaSAndroid Build Coastguard Worker                                    curve = [frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3]];
3779*c8dee2aaSAndroid Build Coastguard Worker                                    id = idByCurve(test, curve, PATH_LINE);
3780*c8dee2aaSAndroid Build Coastguard Worker                                }
3781*c8dee2aaSAndroid Build Coastguard Worker                                break;
3782*c8dee2aaSAndroid Build Coastguard Worker                            case 6:
3783*c8dee2aaSAndroid Build Coastguard Worker                                drawQuad(frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3],
3784*c8dee2aaSAndroid Build Coastguard Worker                                        frags[c1s + 4], frags[c1s + 5]);
3785*c8dee2aaSAndroid Build Coastguard Worker                                if (draw_id) {
3786*c8dee2aaSAndroid Build Coastguard Worker                                    curve = [frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3],
3787*c8dee2aaSAndroid Build Coastguard Worker                                            frags[c1s + 4], frags[c1s + 5]];
3788*c8dee2aaSAndroid Build Coastguard Worker                                    id = idByCurve(test, curve, PATH_QUAD);
3789*c8dee2aaSAndroid Build Coastguard Worker                                }
3790*c8dee2aaSAndroid Build Coastguard Worker                                break;
3791*c8dee2aaSAndroid Build Coastguard Worker                            case 7:
3792*c8dee2aaSAndroid Build Coastguard Worker                                drawConicWithQuads(frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3],
3793*c8dee2aaSAndroid Build Coastguard Worker                                        frags[c1s + 4], frags[c1s + 5], frags[c1s + 6]);
3794*c8dee2aaSAndroid Build Coastguard Worker                                if (draw_id) {
3795*c8dee2aaSAndroid Build Coastguard Worker                                    curve = [frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3],
3796*c8dee2aaSAndroid Build Coastguard Worker                                            frags[c1s + 4], frags[c1s + 5], frags[c1s + 6]];
3797*c8dee2aaSAndroid Build Coastguard Worker                                    id = idByCurve(test, curve, PATH_CONIC);
3798*c8dee2aaSAndroid Build Coastguard Worker                                }
3799*c8dee2aaSAndroid Build Coastguard Worker                                break;
3800*c8dee2aaSAndroid Build Coastguard Worker                            case 8:
3801*c8dee2aaSAndroid Build Coastguard Worker                                drawCubic(frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3],
3802*c8dee2aaSAndroid Build Coastguard Worker                                        frags[c1s + 4], frags[c1s + 5], frags[c1s + 6], frags[c1s + 7]);
3803*c8dee2aaSAndroid Build Coastguard Worker                                if (draw_id) {
3804*c8dee2aaSAndroid Build Coastguard Worker                                    curve = [frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3],
3805*c8dee2aaSAndroid Build Coastguard Worker                                            frags[c1s + 4], frags[c1s + 5], frags[c1s + 6], frags[c1s + 7]];
3806*c8dee2aaSAndroid Build Coastguard Worker                                    id = idByCurve(test, curve, PATH_CUBIC);
3807*c8dee2aaSAndroid Build Coastguard Worker                                }
3808*c8dee2aaSAndroid Build Coastguard Worker                                break;
3809*c8dee2aaSAndroid Build Coastguard Worker                        }
3810*c8dee2aaSAndroid Build Coastguard Worker                        if (id >= 0) {
3811*c8dee2aaSAndroid Build Coastguard Worker                            drawVisibleID(curve, 0.5, id);
3812*c8dee2aaSAndroid Build Coastguard Worker                        }
3813*c8dee2aaSAndroid Build Coastguard Worker                        id = -1;
3814*c8dee2aaSAndroid Build Coastguard Worker                        switch (c2l) {
3815*c8dee2aaSAndroid Build Coastguard Worker                            case 0:
3816*c8dee2aaSAndroid Build Coastguard Worker                                break;
3817*c8dee2aaSAndroid Build Coastguard Worker                            case 4:
3818*c8dee2aaSAndroid Build Coastguard Worker                                drawLine(frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3]);
3819*c8dee2aaSAndroid Build Coastguard Worker                                if (draw_id) {
3820*c8dee2aaSAndroid Build Coastguard Worker                                    curve = [frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3]];
3821*c8dee2aaSAndroid Build Coastguard Worker                                    id = idByCurve(test, curve, PATH_LINE);
3822*c8dee2aaSAndroid Build Coastguard Worker                                }
3823*c8dee2aaSAndroid Build Coastguard Worker                                break;
3824*c8dee2aaSAndroid Build Coastguard Worker                            case 6:
3825*c8dee2aaSAndroid Build Coastguard Worker                                drawQuad(frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3],
3826*c8dee2aaSAndroid Build Coastguard Worker                                        frags[c2s + 4], frags[c2s + 5]);
3827*c8dee2aaSAndroid Build Coastguard Worker                                if (draw_id) {
3828*c8dee2aaSAndroid Build Coastguard Worker                                    curve = [frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3],
3829*c8dee2aaSAndroid Build Coastguard Worker                                            frags[c2s + 4], frags[c2s + 5]];
3830*c8dee2aaSAndroid Build Coastguard Worker                                    id = idByCurve(test, curve, PATH_QUAD);
3831*c8dee2aaSAndroid Build Coastguard Worker                                }
3832*c8dee2aaSAndroid Build Coastguard Worker                                break;
3833*c8dee2aaSAndroid Build Coastguard Worker                            case 7:
3834*c8dee2aaSAndroid Build Coastguard Worker                                drawConicWithQuads(frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3],
3835*c8dee2aaSAndroid Build Coastguard Worker                                        frags[c2s + 4], frags[c2s + 5], frags[c2s + 6]);
3836*c8dee2aaSAndroid Build Coastguard Worker                                if (draw_id) {
3837*c8dee2aaSAndroid Build Coastguard Worker                                    curve = [frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3],
3838*c8dee2aaSAndroid Build Coastguard Worker                                            frags[c2s + 4], frags[c2s + 5], frags[c2s + 6]];
3839*c8dee2aaSAndroid Build Coastguard Worker                                    id = idByCurve(test, curve, PATH_CONIC);
3840*c8dee2aaSAndroid Build Coastguard Worker                                }
3841*c8dee2aaSAndroid Build Coastguard Worker                                break;
3842*c8dee2aaSAndroid Build Coastguard Worker                            case 8:
3843*c8dee2aaSAndroid Build Coastguard Worker                                drawCubic(frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3],
3844*c8dee2aaSAndroid Build Coastguard Worker                                        frags[c2s + 4], frags[c2s + 5], frags[c2s + 6], frags[c2s + 7]);
3845*c8dee2aaSAndroid Build Coastguard Worker                                if (draw_id) {
3846*c8dee2aaSAndroid Build Coastguard Worker                                    curve = [frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3],
3847*c8dee2aaSAndroid Build Coastguard Worker                                            frags[c2s + 4], frags[c2s + 5], frags[c2s + 6], frags[c2s + 7]];
3848*c8dee2aaSAndroid Build Coastguard Worker                                    id = idByCurve(test, curve, PATH_CUBIC);
3849*c8dee2aaSAndroid Build Coastguard Worker                                }
3850*c8dee2aaSAndroid Build Coastguard Worker                                break;
3851*c8dee2aaSAndroid Build Coastguard Worker                        }
3852*c8dee2aaSAndroid Build Coastguard Worker                        if (id >= 0) {
3853*c8dee2aaSAndroid Build Coastguard Worker                            drawVisibleID(curve, 0.5, id);
3854*c8dee2aaSAndroid Build Coastguard Worker                        }
3855*c8dee2aaSAndroid Build Coastguard Worker                    }
3856*c8dee2aaSAndroid Build Coastguard Worker                    if (collect_bounds) {
3857*c8dee2aaSAndroid Build Coastguard Worker                        break;
3858*c8dee2aaSAndroid Build Coastguard Worker                    }
3859*c8dee2aaSAndroid Build Coastguard Worker                    if (draw_intersection != 3 || step_limit == 0 || tIndex >= lastSect) {
3860*c8dee2aaSAndroid Build Coastguard Worker                        for (var idx = 0; idx < f.length; idx += 4) {
3861*c8dee2aaSAndroid Build Coastguard Worker                            drawPoint(frags[f[idx]], frags[f[idx + 1]], true);
3862*c8dee2aaSAndroid Build Coastguard Worker                        }
3863*c8dee2aaSAndroid Build Coastguard Worker                    }
3864*c8dee2aaSAndroid Build Coastguard Worker                    if (!draw_intersectT) {
3865*c8dee2aaSAndroid Build Coastguard Worker                        break;
3866*c8dee2aaSAndroid Build Coastguard Worker                    }
3867*c8dee2aaSAndroid Build Coastguard Worker                    ctx.fillStyle = "red";
3868*c8dee2aaSAndroid Build Coastguard Worker                    if (draw_intersection != 3 || step_limit == 0 || tIndex >= lastSect) {
3869*c8dee2aaSAndroid Build Coastguard Worker                        for (var idx = 0; idx < f.length; idx += 4) {
3870*c8dee2aaSAndroid Build Coastguard Worker                            drawTAtPointUp(frags[f[idx]], frags[f[idx + 1]], frags[f[idx + 2]]);
3871*c8dee2aaSAndroid Build Coastguard Worker                            drawTAtPointDown(frags[f[idx]], frags[f[idx + 1]], frags[f[idx + 3]]);
3872*c8dee2aaSAndroid Build Coastguard Worker                        }
3873*c8dee2aaSAndroid Build Coastguard Worker                    }
3874*c8dee2aaSAndroid Build Coastguard Worker                    break;
3875*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_SORT:
3876*c8dee2aaSAndroid Build Coastguard Worker                    if (!draw_sort || (step_limit > 0 && tIndex < lastSort)) {
3877*c8dee2aaSAndroid Build Coastguard Worker                        continue;
3878*c8dee2aaSAndroid Build Coastguard Worker                    }
3879*c8dee2aaSAndroid Build Coastguard Worker                    ctx.lineWidth = 3;
3880*c8dee2aaSAndroid Build Coastguard Worker                    ctx.strokeStyle = "rgba(127,127,0, 0.5)";
3881*c8dee2aaSAndroid Build Coastguard Worker                    focus_enabled = true;
3882*c8dee2aaSAndroid Build Coastguard Worker                    switch (fragType) {
3883*c8dee2aaSAndroid Build Coastguard Worker                        case SORT_UNARY:
3884*c8dee2aaSAndroid Build Coastguard Worker                        case SORT_BINARY:
3885*c8dee2aaSAndroid Build Coastguard Worker                            var curve = curvePartialByID(test, frags[0], frags[6], frags[8]);
3886*c8dee2aaSAndroid Build Coastguard Worker                            drawCurve(curve);
3887*c8dee2aaSAndroid Build Coastguard Worker                            break;
3888*c8dee2aaSAndroid Build Coastguard Worker                        default:
3889*c8dee2aaSAndroid Build Coastguard Worker                            console.log("unknown REC_TYPE_SORT frag type: " + fragType);
3890*c8dee2aaSAndroid Build Coastguard Worker                            throw "stop execution";
3891*c8dee2aaSAndroid Build Coastguard Worker                    }
3892*c8dee2aaSAndroid Build Coastguard Worker                    break;
3893*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_TOP:
3894*c8dee2aaSAndroid Build Coastguard Worker                    if (!draw_top || (step_limit > 0 && tIndex < lastTop)) {
3895*c8dee2aaSAndroid Build Coastguard Worker                        continue;
3896*c8dee2aaSAndroid Build Coastguard Worker                    }
3897*c8dee2aaSAndroid Build Coastguard Worker                    ctx.lineWidth = 3;
3898*c8dee2aaSAndroid Build Coastguard Worker                    ctx.strokeStyle = "rgba(127,127,0, 0.5)";
3899*c8dee2aaSAndroid Build Coastguard Worker                    focus_enabled = true;
3900*c8dee2aaSAndroid Build Coastguard Worker                    {
3901*c8dee2aaSAndroid Build Coastguard Worker                        var curve = curvePartialByID(test, frags[0], frags[1], frags[2]);
3902*c8dee2aaSAndroid Build Coastguard Worker                        drawCurve(curve);
3903*c8dee2aaSAndroid Build Coastguard Worker                        var type = PATH_LINE + (curve.length / 2 - 2);
3904*c8dee2aaSAndroid Build Coastguard Worker                        var mid = pointAtT(curve, type, 0.5);
3905*c8dee2aaSAndroid Build Coastguard Worker                        var d = dxy_at_t(curve, type, 0.5);
3906*c8dee2aaSAndroid Build Coastguard Worker                        drawArrow(mid.x, mid.y, d.x, d.y, 0.3);
3907*c8dee2aaSAndroid Build Coastguard Worker                    }
3908*c8dee2aaSAndroid Build Coastguard Worker                    break;
3909*c8dee2aaSAndroid Build Coastguard Worker                case REC_TYPE_MARK:
3910*c8dee2aaSAndroid Build Coastguard Worker                    if (!draw_mark || (step_limit > 0 && tIndex < lastMark)) {
3911*c8dee2aaSAndroid Build Coastguard Worker                        continue;
3912*c8dee2aaSAndroid Build Coastguard Worker                    }
3913*c8dee2aaSAndroid Build Coastguard Worker                    ctx.lineWidth = 3;
3914*c8dee2aaSAndroid Build Coastguard Worker                    ctx.strokeStyle = fragType >= MARK_DONE_LINE ?
3915*c8dee2aaSAndroid Build Coastguard Worker                            "rgba(127,0,127, 0.5)" : "rgba(127,127,0, 0.5)";
3916*c8dee2aaSAndroid Build Coastguard Worker                    focus_enabled = true;
3917*c8dee2aaSAndroid Build Coastguard Worker                    switch (fragType) {
3918*c8dee2aaSAndroid Build Coastguard Worker                        case MARK_LINE:
3919*c8dee2aaSAndroid Build Coastguard Worker                        case MARK_DONE_LINE:
3920*c8dee2aaSAndroid Build Coastguard Worker                        case MARK_UNSORTABLE_LINE:
3921*c8dee2aaSAndroid Build Coastguard Worker                        case MARK_SIMPLE_LINE:
3922*c8dee2aaSAndroid Build Coastguard Worker                        case MARK_SIMPLE_DONE_LINE:
3923*c8dee2aaSAndroid Build Coastguard Worker                        case MARK_DONE_UNARY_LINE:
3924*c8dee2aaSAndroid Build Coastguard Worker                            drawLinePartial(frags[1], frags[2], frags[3], frags[4],
3925*c8dee2aaSAndroid Build Coastguard Worker                                frags[5], frags[9]);
3926*c8dee2aaSAndroid Build Coastguard Worker                            if (draw_id) {
3927*c8dee2aaSAndroid Build Coastguard Worker                                drawLinePartialID(frags[0], frags[1], frags[2], frags[3], frags[4],
3928*c8dee2aaSAndroid Build Coastguard Worker                                frags[5], frags[9]);
3929*c8dee2aaSAndroid Build Coastguard Worker                            }
3930*c8dee2aaSAndroid Build Coastguard Worker                            break;
3931*c8dee2aaSAndroid Build Coastguard Worker                        case MARK_QUAD:
3932*c8dee2aaSAndroid Build Coastguard Worker                        case MARK_DONE_QUAD:
3933*c8dee2aaSAndroid Build Coastguard Worker                        case MARK_UNSORTABLE_QUAD:
3934*c8dee2aaSAndroid Build Coastguard Worker                        case MARK_SIMPLE_QUAD:
3935*c8dee2aaSAndroid Build Coastguard Worker                        case MARK_SIMPLE_DONE_QUAD:
3936*c8dee2aaSAndroid Build Coastguard Worker                        case MARK_DONE_UNARY_QUAD:
3937*c8dee2aaSAndroid Build Coastguard Worker                            drawQuadPartial(frags[1], frags[2], frags[3], frags[4],
3938*c8dee2aaSAndroid Build Coastguard Worker                                frags[5], frags[6], frags[7], frags[11]);
3939*c8dee2aaSAndroid Build Coastguard Worker                            if (draw_id) {
3940*c8dee2aaSAndroid Build Coastguard Worker                                drawQuadPartialID(frags[0], frags[1], frags[2], frags[3], frags[4],
3941*c8dee2aaSAndroid Build Coastguard Worker                                frags[5], frags[6], frags[7], frags[11]);
3942*c8dee2aaSAndroid Build Coastguard Worker                            }
3943*c8dee2aaSAndroid Build Coastguard Worker                            break;
3944*c8dee2aaSAndroid Build Coastguard Worker                        case MARK_CUBIC:
3945*c8dee2aaSAndroid Build Coastguard Worker                        case MARK_DONE_CUBIC:
3946*c8dee2aaSAndroid Build Coastguard Worker                        case MARK_UNSORTABLE_CUBIC:
3947*c8dee2aaSAndroid Build Coastguard Worker                        case MARK_SIMPLE_CUBIC:
3948*c8dee2aaSAndroid Build Coastguard Worker                        case MARK_SIMPLE_DONE_CUBIC:
3949*c8dee2aaSAndroid Build Coastguard Worker                        case MARK_DONE_UNARY_CUBIC:
3950*c8dee2aaSAndroid Build Coastguard Worker                            drawCubicPartial(frags[1], frags[2], frags[3], frags[4],
3951*c8dee2aaSAndroid Build Coastguard Worker                                frags[5], frags[6], frags[7], frags[8], frags[9], frags[13]);
3952*c8dee2aaSAndroid Build Coastguard Worker                            if (draw_id) {
3953*c8dee2aaSAndroid Build Coastguard Worker                                drawCubicPartialID(frags[0], frags[1], frags[2], frags[3], frags[4],
3954*c8dee2aaSAndroid Build Coastguard Worker                                frags[5], frags[6], frags[7], frags[8], frags[9], frags[13]);
3955*c8dee2aaSAndroid Build Coastguard Worker                            }
3956*c8dee2aaSAndroid Build Coastguard Worker                            break;
3957*c8dee2aaSAndroid Build Coastguard Worker                        case MARK_ANGLE_LAST:
3958*c8dee2aaSAndroid Build Coastguard Worker                            // FIXME: ignored for now
3959*c8dee2aaSAndroid Build Coastguard Worker                            break;
3960*c8dee2aaSAndroid Build Coastguard Worker                        default:
3961*c8dee2aaSAndroid Build Coastguard Worker                            console.log("unknown REC_TYPE_MARK frag type: " + fragType);
3962*c8dee2aaSAndroid Build Coastguard Worker                            throw "stop execution";
3963*c8dee2aaSAndroid Build Coastguard Worker                    }
3964*c8dee2aaSAndroid Build Coastguard Worker                    break;
3965*c8dee2aaSAndroid Build Coastguard Worker                default:
3966*c8dee2aaSAndroid Build Coastguard Worker                    continue;
3967*c8dee2aaSAndroid Build Coastguard Worker            }
3968*c8dee2aaSAndroid Build Coastguard Worker        }
3969*c8dee2aaSAndroid Build Coastguard Worker        switch (recType) {
3970*c8dee2aaSAndroid Build Coastguard Worker            case REC_TYPE_SORT:
3971*c8dee2aaSAndroid Build Coastguard Worker                if (!draw_sort || (step_limit > 0 && tIndex < lastSort)) {
3972*c8dee2aaSAndroid Build Coastguard Worker                    break;
3973*c8dee2aaSAndroid Build Coastguard Worker                }
3974*c8dee2aaSAndroid Build Coastguard Worker                var angles = []; // use tangent lines to describe arcs
3975*c8dee2aaSAndroid Build Coastguard Worker                var windFrom = [];
3976*c8dee2aaSAndroid Build Coastguard Worker                var windTo = [];
3977*c8dee2aaSAndroid Build Coastguard Worker                var opp = [];
3978*c8dee2aaSAndroid Build Coastguard Worker                var minXY = Number.MAX_VALUE;
3979*c8dee2aaSAndroid Build Coastguard Worker                var partial;
3980*c8dee2aaSAndroid Build Coastguard Worker                focus_enabled = true;
3981*c8dee2aaSAndroid Build Coastguard Worker                var someUnsortable = false;
3982*c8dee2aaSAndroid Build Coastguard Worker                for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
3983*c8dee2aaSAndroid Build Coastguard Worker                    var fragType = records[recordIndex];
3984*c8dee2aaSAndroid Build Coastguard Worker                    var frags = records[recordIndex + 1];
3985*c8dee2aaSAndroid Build Coastguard Worker                    var unsortable = (fragType == SORT_UNARY && frags[14]) ||
3986*c8dee2aaSAndroid Build Coastguard Worker                            (fragType == SORT_BINARY && frags[16]);
3987*c8dee2aaSAndroid Build Coastguard Worker                    someUnsortable |= unsortable;
3988*c8dee2aaSAndroid Build Coastguard Worker                    switch (fragType) {
3989*c8dee2aaSAndroid Build Coastguard Worker                        case SORT_UNARY:
3990*c8dee2aaSAndroid Build Coastguard Worker                        case SORT_BINARY:
3991*c8dee2aaSAndroid Build Coastguard Worker                            partial = curvePartialByID(test, frags[0], frags[6], frags[8]);
3992*c8dee2aaSAndroid Build Coastguard Worker                            break;
3993*c8dee2aaSAndroid Build Coastguard Worker                        default:
3994*c8dee2aaSAndroid Build Coastguard Worker                            console.log("unknown REC_TYPE_SORT frag type: " + fragType);
3995*c8dee2aaSAndroid Build Coastguard Worker                            throw "stop execution";
3996*c8dee2aaSAndroid Build Coastguard Worker                    }
3997*c8dee2aaSAndroid Build Coastguard Worker                    var dx = boundsWidth(partial);
3998*c8dee2aaSAndroid Build Coastguard Worker                    var dy = boundsHeight(partial);
3999*c8dee2aaSAndroid Build Coastguard Worker                    minXY = Math.min(minXY, dx * dx + dy * dy);
4000*c8dee2aaSAndroid Build Coastguard Worker                    if (collect_bounds) {
4001*c8dee2aaSAndroid Build Coastguard Worker                        continue;
4002*c8dee2aaSAndroid Build Coastguard Worker                    }
4003*c8dee2aaSAndroid Build Coastguard Worker                    angles.push(tangent(partial));
4004*c8dee2aaSAndroid Build Coastguard Worker                    var from = frags[12];
4005*c8dee2aaSAndroid Build Coastguard Worker                    var to = frags[12];
4006*c8dee2aaSAndroid Build Coastguard Worker                    var sgn = frags[10];
4007*c8dee2aaSAndroid Build Coastguard Worker                    if (sgn < 0) {
4008*c8dee2aaSAndroid Build Coastguard Worker                        from -= frags[11];
4009*c8dee2aaSAndroid Build Coastguard Worker                    } else if (sgn > 0) {
4010*c8dee2aaSAndroid Build Coastguard Worker                        to -= frags[11];
4011*c8dee2aaSAndroid Build Coastguard Worker                    }
4012*c8dee2aaSAndroid Build Coastguard Worker                    windFrom.push(from + (unsortable ? "!" : ""));
4013*c8dee2aaSAndroid Build Coastguard Worker                    windTo.push(to + (unsortable ? "!" : ""));
4014*c8dee2aaSAndroid Build Coastguard Worker                    opp.push(fragType == SORT_BINARY);
4015*c8dee2aaSAndroid Build Coastguard Worker                    if (draw_sort == 1) {
4016*c8dee2aaSAndroid Build Coastguard Worker                        drawVisibleOrder(partial, frags[12]);
4017*c8dee2aaSAndroid Build Coastguard Worker                    } else {
4018*c8dee2aaSAndroid Build Coastguard Worker                        drawVisibleOrder(partial, (recordIndex / 2) + 1);
4019*c8dee2aaSAndroid Build Coastguard Worker                    }
4020*c8dee2aaSAndroid Build Coastguard Worker                }
4021*c8dee2aaSAndroid Build Coastguard Worker                var radius = Math.sqrt(minXY) / 2 * scale;
4022*c8dee2aaSAndroid Build Coastguard Worker                radius = Math.min(50, radius);
4023*c8dee2aaSAndroid Build Coastguard Worker                var scaledRadius = radius / scale;
4024*c8dee2aaSAndroid Build Coastguard Worker                var centerX = partial[0];
4025*c8dee2aaSAndroid Build Coastguard Worker                var centerY = partial[1];
4026*c8dee2aaSAndroid Build Coastguard Worker                if (collect_bounds) {
4027*c8dee2aaSAndroid Build Coastguard Worker                    if (focus_enabled) {
4028*c8dee2aaSAndroid Build Coastguard Worker                        focusXmin = Math.min(focusXmin, centerX - scaledRadius);
4029*c8dee2aaSAndroid Build Coastguard Worker                        focusYmin = Math.min(focusYmin, centerY - scaledRadius);
4030*c8dee2aaSAndroid Build Coastguard Worker                        focusXmax = Math.max(focusXmax, centerX + scaledRadius);
4031*c8dee2aaSAndroid Build Coastguard Worker                        focusYmax = Math.max(focusYmax, centerY + scaledRadius);
4032*c8dee2aaSAndroid Build Coastguard Worker                    }
4033*c8dee2aaSAndroid Build Coastguard Worker                    break;
4034*c8dee2aaSAndroid Build Coastguard Worker                }
4035*c8dee2aaSAndroid Build Coastguard Worker                break;
4036*c8dee2aaSAndroid Build Coastguard Worker            default:
4037*c8dee2aaSAndroid Build Coastguard Worker                break;
4038*c8dee2aaSAndroid Build Coastguard Worker        }
4039*c8dee2aaSAndroid Build Coastguard Worker    }
4040*c8dee2aaSAndroid Build Coastguard Worker    if (collect_bounds) {
4041*c8dee2aaSAndroid Build Coastguard Worker        return;
4042*c8dee2aaSAndroid Build Coastguard Worker    }
4043*c8dee2aaSAndroid Build Coastguard Worker    if (draw_log && logStart >= 0) {
4044*c8dee2aaSAndroid Build Coastguard Worker        ctx.font = "normal 10px Arial";
4045*c8dee2aaSAndroid Build Coastguard Worker        ctx.textAlign = "left";
4046*c8dee2aaSAndroid Build Coastguard Worker        ctx.beginPath();
4047*c8dee2aaSAndroid Build Coastguard Worker        var top = screenHeight - 20 - (logRange + 2) * 10;
4048*c8dee2aaSAndroid Build Coastguard Worker        ctx.rect(50, top, screenWidth - 100, (logRange + 2) * 10);
4049*c8dee2aaSAndroid Build Coastguard Worker        ctx.fillStyle = "white";
4050*c8dee2aaSAndroid Build Coastguard Worker        ctx.fill();
4051*c8dee2aaSAndroid Build Coastguard Worker        ctx.fillStyle = "rgba(0,0,0, 0.5)";
4052*c8dee2aaSAndroid Build Coastguard Worker        if (logStart > 0) {
4053*c8dee2aaSAndroid Build Coastguard Worker            ctx.fillText(lines[logStart - 1], 50, top + 8);
4054*c8dee2aaSAndroid Build Coastguard Worker        }
4055*c8dee2aaSAndroid Build Coastguard Worker        ctx.fillStyle = "black";
4056*c8dee2aaSAndroid Build Coastguard Worker        for (var idx = 0; idx < logRange; ++idx) {
4057*c8dee2aaSAndroid Build Coastguard Worker            ctx.fillText(lines[logStart + idx], 50, top + 18 + 10 * idx);
4058*c8dee2aaSAndroid Build Coastguard Worker        }
4059*c8dee2aaSAndroid Build Coastguard Worker        ctx.fillStyle = "rgba(0,0,0, 0.5)";
4060*c8dee2aaSAndroid Build Coastguard Worker        if (logStart + logRange < lines.length) {
4061*c8dee2aaSAndroid Build Coastguard Worker            ctx.fillText(lines[logStart + logRange], 50, top + 18 + 10 * logRange);
4062*c8dee2aaSAndroid Build Coastguard Worker        }
4063*c8dee2aaSAndroid Build Coastguard Worker    }
4064*c8dee2aaSAndroid Build Coastguard Worker    if (draw_legend) {
4065*c8dee2aaSAndroid Build Coastguard Worker        var pos = 0;
4066*c8dee2aaSAndroid Build Coastguard Worker        var drawSomething = draw_add | draw_active | draw_angle | draw_coincidence | draw_sort | draw_mark;
4067*c8dee2aaSAndroid Build Coastguard Worker   //     drawBox(pos++, "yellow", "black", opLetter, true, '');
4068*c8dee2aaSAndroid Build Coastguard Worker        drawBox(pos++, "rgba(0,0,255, 0.3)", "black", draw_intersection > 1 ? sectCount : sectMax2, draw_intersection, intersectionKey);
4069*c8dee2aaSAndroid Build Coastguard Worker        drawBox(pos++, "rgba(0,0,255, 0.3)", "black", draw_add ? addCount : addMax, draw_add, addKey);
4070*c8dee2aaSAndroid Build Coastguard Worker        drawBox(pos++, "rgba(0,0,255, 0.3)", "black", draw_active ? activeCount : activeMax, draw_active, activeKey);
4071*c8dee2aaSAndroid Build Coastguard Worker        drawBox(pos++, "rgba(127,127,0, 0.3)", "black", draw_angle ? angleCount : angleMax, draw_angle, angleKey);
4072*c8dee2aaSAndroid Build Coastguard Worker        drawBox(pos++, "rgba(127,127,0, 0.3)", "black", draw_coincidence ? coinCount : coinMax, draw_coincidence, coincidenceKey);
4073*c8dee2aaSAndroid Build Coastguard Worker        drawBox(pos++, "rgba(127,127,0, 0.3)", "black", draw_op ? opCount : opMax, draw_op, opKey);
4074*c8dee2aaSAndroid Build Coastguard Worker        drawBox(pos++, "rgba(127,127,0, 0.3)", "black", draw_sort ? sortCount : sortMax, draw_sort, sortKey);
4075*c8dee2aaSAndroid Build Coastguard Worker        drawBox(pos++, "rgba(127,127,0, 0.3)", "black", draw_top ? topCount : topMax, draw_top, topKey);
4076*c8dee2aaSAndroid Build Coastguard Worker        drawBox(pos++, "rgba(127,0,127, 0.3)", "black", draw_mark ? markCount : markMax, draw_mark, markKey);
4077*c8dee2aaSAndroid Build Coastguard Worker        drawBox(pos++, "black", "white",
4078*c8dee2aaSAndroid Build Coastguard Worker                (new Array('P', 'P1', 'P2', 'P', 'p', 'p1', 'p2'))[draw_path], draw_path != 0, pathKey);
4079*c8dee2aaSAndroid Build Coastguard Worker        drawBox(pos++, "rgba(0,63,0, 0.7)", "white",
4080*c8dee2aaSAndroid Build Coastguard Worker                (new Array('Q', 'Q', 'C', 'QC', 'Qc', 'Cq'))[draw_computed],
4081*c8dee2aaSAndroid Build Coastguard Worker                draw_computed != 0, computedKey);
4082*c8dee2aaSAndroid Build Coastguard Worker        drawBox(pos++, "green", "black", step_limit, drawSomething, '');
4083*c8dee2aaSAndroid Build Coastguard Worker        drawBox(pos++, "green", "black", stepMax, drawSomething, '');
4084*c8dee2aaSAndroid Build Coastguard Worker        drawBox(pos++, "rgba(255,0,0, 0.6)", "black", lastIndex, drawSomething & draw_log, '');
4085*c8dee2aaSAndroid Build Coastguard Worker        drawBox(pos++, "rgba(255,0,0, 0.6)", "black", test.length - 1, drawSomething & draw_log, '');
4086*c8dee2aaSAndroid Build Coastguard Worker        if (curve_t) {
4087*c8dee2aaSAndroid Build Coastguard Worker            drawCurveTControl();
4088*c8dee2aaSAndroid Build Coastguard Worker        }
4089*c8dee2aaSAndroid Build Coastguard Worker        ctx.font = "normal 20px Arial";
4090*c8dee2aaSAndroid Build Coastguard Worker        ctx.fillStyle = "rgba(0,0,0, 0.3)";
4091*c8dee2aaSAndroid Build Coastguard Worker        ctx.textAlign = "right";
4092*c8dee2aaSAndroid Build Coastguard Worker        ctx.fillText(scale.toFixed(decimal_places) + 'x' , screenWidth - 10, screenHeight - 5);
4093*c8dee2aaSAndroid Build Coastguard Worker    }
4094*c8dee2aaSAndroid Build Coastguard Worker    if (draw_hints) {
4095*c8dee2aaSAndroid Build Coastguard Worker        ctx.font = "normal 10px Arial";
4096*c8dee2aaSAndroid Build Coastguard Worker        ctx.fillStyle = "rgba(0,0,0, 0.5)";
4097*c8dee2aaSAndroid Build Coastguard Worker        ctx.textAlign = "right";
4098*c8dee2aaSAndroid Build Coastguard Worker        var y = 4;
4099*c8dee2aaSAndroid Build Coastguard Worker        ctx.fillText("control lines : " +  controlLinesKey, ctx.screenWidthwidth - 10, pos * 50 + y++ * 10);
4100*c8dee2aaSAndroid Build Coastguard Worker        ctx.fillText("curve t : " +  curveTKey, screenWidth - 10, pos * 50 + y++ * 10);
4101*c8dee2aaSAndroid Build Coastguard Worker        ctx.fillText("deriviatives : " +  deriviativesKey, screenWidth - 10, pos * 50 + y++ * 10);
4102*c8dee2aaSAndroid Build Coastguard Worker        ctx.fillText("intersect t : " +  intersectTKey, screenWidth - 10, pos * 50 + y++ * 10);
4103*c8dee2aaSAndroid Build Coastguard Worker        ctx.fillText("log : " +  logKey, screenWidth - 10, pos * 50 + y++ * 10);
4104*c8dee2aaSAndroid Build Coastguard Worker        ctx.fillText("log curve : " +  logCurvesKey, screenWidth - 10, pos * 50 + y++ * 10);
4105*c8dee2aaSAndroid Build Coastguard Worker        ctx.fillText("mid point : " +  midpointKey, screenWidth - 10, pos * 50 + y++ * 10);
4106*c8dee2aaSAndroid Build Coastguard Worker        ctx.fillText("points : " +  ptsKey, screenWidth - 10, pos * 50 + y++ * 10);
4107*c8dee2aaSAndroid Build Coastguard Worker        ctx.fillText("sequence : " +  sequenceKey, screenWidth - 10, pos * 50 + y++ * 10);
4108*c8dee2aaSAndroid Build Coastguard Worker        ctx.fillText("xy : " +  xyKey, screenWidth - 10, pos * 50 + y++ * 10);
4109*c8dee2aaSAndroid Build Coastguard Worker    }
4110*c8dee2aaSAndroid Build Coastguard Worker}
4111*c8dee2aaSAndroid Build Coastguard Worker
4112*c8dee2aaSAndroid Build Coastguard Workerfunction drawBox(y, backC, foreC, str, enable, label) {
4113*c8dee2aaSAndroid Build Coastguard Worker    ctx.beginPath();
4114*c8dee2aaSAndroid Build Coastguard Worker    ctx.fillStyle = backC;
4115*c8dee2aaSAndroid Build Coastguard Worker    ctx.rect(screenWidth - 40, y * 50 + 10, 40, 30);
4116*c8dee2aaSAndroid Build Coastguard Worker    ctx.fill();
4117*c8dee2aaSAndroid Build Coastguard Worker    ctx.font = "normal 16px Arial";
4118*c8dee2aaSAndroid Build Coastguard Worker    ctx.fillStyle = foreC;
4119*c8dee2aaSAndroid Build Coastguard Worker    ctx.textAlign = "center";
4120*c8dee2aaSAndroid Build Coastguard Worker    ctx.fillText(str, screenWidth - 20, y * 50 + 32);
4121*c8dee2aaSAndroid Build Coastguard Worker    if (!enable) {
4122*c8dee2aaSAndroid Build Coastguard Worker        ctx.fillStyle = "rgba(255,255,255, 0.5)";
4123*c8dee2aaSAndroid Build Coastguard Worker        ctx.fill();
4124*c8dee2aaSAndroid Build Coastguard Worker    }
4125*c8dee2aaSAndroid Build Coastguard Worker    if (label != '') {
4126*c8dee2aaSAndroid Build Coastguard Worker        ctx.font = "normal 9px Arial";
4127*c8dee2aaSAndroid Build Coastguard Worker        ctx.fillStyle = "black";
4128*c8dee2aaSAndroid Build Coastguard Worker        ctx.fillText(label, screenWidth - 47, y * 50 + 40);
4129*c8dee2aaSAndroid Build Coastguard Worker    }
4130*c8dee2aaSAndroid Build Coastguard Worker}
4131*c8dee2aaSAndroid Build Coastguard Worker
4132*c8dee2aaSAndroid Build Coastguard Workerfunction drawCurveTControl() {
4133*c8dee2aaSAndroid Build Coastguard Worker    ctx.lineWidth = 2;
4134*c8dee2aaSAndroid Build Coastguard Worker    ctx.strokeStyle = "rgba(0,0,0, 0.3)";
4135*c8dee2aaSAndroid Build Coastguard Worker    ctx.beginPath();
4136*c8dee2aaSAndroid Build Coastguard Worker    ctx.rect(screenWidth - 80, 40, 28, screenHeight - 80);
4137*c8dee2aaSAndroid Build Coastguard Worker    ctx.stroke();
4138*c8dee2aaSAndroid Build Coastguard Worker    var ty = 40 + curveT * (screenHeight - 80);
4139*c8dee2aaSAndroid Build Coastguard Worker    ctx.beginPath();
4140*c8dee2aaSAndroid Build Coastguard Worker    ctx.moveTo(screenWidth - 80, ty);
4141*c8dee2aaSAndroid Build Coastguard Worker    ctx.lineTo(screenWidth - 85, ty - 5);
4142*c8dee2aaSAndroid Build Coastguard Worker    ctx.lineTo(screenWidth - 85, ty + 5);
4143*c8dee2aaSAndroid Build Coastguard Worker    ctx.lineTo(screenWidth - 80, ty);
4144*c8dee2aaSAndroid Build Coastguard Worker    ctx.fillStyle = "rgba(0,0,0, 0.6)";
4145*c8dee2aaSAndroid Build Coastguard Worker    ctx.fill();
4146*c8dee2aaSAndroid Build Coastguard Worker    var num = curveT.toFixed(decimal_places);
4147*c8dee2aaSAndroid Build Coastguard Worker    ctx.font = "normal 10px Arial";
4148*c8dee2aaSAndroid Build Coastguard Worker    ctx.textAlign = "left";
4149*c8dee2aaSAndroid Build Coastguard Worker    ctx.fillText(num, screenWidth - 78, ty);
4150*c8dee2aaSAndroid Build Coastguard Worker}
4151*c8dee2aaSAndroid Build Coastguard Worker
4152*c8dee2aaSAndroid Build Coastguard Workerfunction ptInTControl() {
4153*c8dee2aaSAndroid Build Coastguard Worker    var e = window.event;
4154*c8dee2aaSAndroid Build Coastguard Worker    var tgt = e.target || e.srcElement;
4155*c8dee2aaSAndroid Build Coastguard Worker    var left = tgt.offsetLeft;
4156*c8dee2aaSAndroid Build Coastguard Worker    var top = tgt.offsetTop;
4157*c8dee2aaSAndroid Build Coastguard Worker    var x = (e.clientX - left);
4158*c8dee2aaSAndroid Build Coastguard Worker    var y = (e.clientY - top);
4159*c8dee2aaSAndroid Build Coastguard Worker    if (x < screenWidth - 80 || x > screenWidth - 50) {
4160*c8dee2aaSAndroid Build Coastguard Worker        return false;
4161*c8dee2aaSAndroid Build Coastguard Worker    }
4162*c8dee2aaSAndroid Build Coastguard Worker    if (y < 40 || y > screenHeight - 80) {
4163*c8dee2aaSAndroid Build Coastguard Worker        return false;
4164*c8dee2aaSAndroid Build Coastguard Worker    }
4165*c8dee2aaSAndroid Build Coastguard Worker    curveT = (y - 40) / (screenHeight - 120);
4166*c8dee2aaSAndroid Build Coastguard Worker    if (curveT < 0 || curveT > 1) {
4167*c8dee2aaSAndroid Build Coastguard Worker        throw "stop execution";
4168*c8dee2aaSAndroid Build Coastguard Worker    }
4169*c8dee2aaSAndroid Build Coastguard Worker    return true;
4170*c8dee2aaSAndroid Build Coastguard Worker}
4171*c8dee2aaSAndroid Build Coastguard Worker
4172*c8dee2aaSAndroid Build Coastguard Workerfunction drawTop() {
4173*c8dee2aaSAndroid Build Coastguard Worker    if (tests[testIndex] == null) {
4174*c8dee2aaSAndroid Build Coastguard Worker        var str = testDivs[testIndex].textContent;
4175*c8dee2aaSAndroid Build Coastguard Worker        parse_all(str);
4176*c8dee2aaSAndroid Build Coastguard Worker        var title = testDivs[testIndex].id.toString();
4177*c8dee2aaSAndroid Build Coastguard Worker        testTitles[testIndex] = title;
4178*c8dee2aaSAndroid Build Coastguard Worker    }
4179*c8dee2aaSAndroid Build Coastguard Worker    init(tests[testIndex]);
4180*c8dee2aaSAndroid Build Coastguard Worker    redraw();
4181*c8dee2aaSAndroid Build Coastguard Worker}
4182*c8dee2aaSAndroid Build Coastguard Worker
4183*c8dee2aaSAndroid Build Coastguard Workerfunction redraw() {
4184*c8dee2aaSAndroid Build Coastguard Worker    if (focus_on_selection) {
4185*c8dee2aaSAndroid Build Coastguard Worker        collect_bounds = true;
4186*c8dee2aaSAndroid Build Coastguard Worker        draw(tests[testIndex], testLines[testIndex], testTitles[testIndex]);
4187*c8dee2aaSAndroid Build Coastguard Worker        collect_bounds = false;
4188*c8dee2aaSAndroid Build Coastguard Worker        if (focusXmin < focusXmax && focusYmin < focusYmax) {
4189*c8dee2aaSAndroid Build Coastguard Worker            setScale(focusXmin, focusXmax, focusYmin, focusYmax);
4190*c8dee2aaSAndroid Build Coastguard Worker        }
4191*c8dee2aaSAndroid Build Coastguard Worker    }
4192*c8dee2aaSAndroid Build Coastguard Worker    ctx.beginPath();
4193*c8dee2aaSAndroid Build Coastguard Worker    ctx.fillStyle = "white";
4194*c8dee2aaSAndroid Build Coastguard Worker    ctx.rect(0, 0, screenWidth, screenHeight);
4195*c8dee2aaSAndroid Build Coastguard Worker    ctx.fill();
4196*c8dee2aaSAndroid Build Coastguard Worker    draw(tests[testIndex], testLines[testIndex], testTitles[testIndex]);
4197*c8dee2aaSAndroid Build Coastguard Worker}
4198*c8dee2aaSAndroid Build Coastguard Worker
4199*c8dee2aaSAndroid Build Coastguard Workerfunction dumpCurvePartial(test, id, t0, t1) {
4200*c8dee2aaSAndroid Build Coastguard Worker    var curve = curveByID(test, id);
4201*c8dee2aaSAndroid Build Coastguard Worker    var name = ["line", "quad", "cubic"][curve.length / 2 - 2];
4202*c8dee2aaSAndroid Build Coastguard Worker    console.log("id=" + id + " " + name + "=" +  curveToString(curve)
4203*c8dee2aaSAndroid Build Coastguard Worker        + " t0=" + t0 + " t1=" + t1
4204*c8dee2aaSAndroid Build Coastguard Worker        + " partial=" + curveToString(curvePartialByID(test, id, t0, t1)));
4205*c8dee2aaSAndroid Build Coastguard Worker}
4206*c8dee2aaSAndroid Build Coastguard Worker
4207*c8dee2aaSAndroid Build Coastguard Workerfunction dumpAngleTest(test, id, t0, t1) {
4208*c8dee2aaSAndroid Build Coastguard Worker    var curve = curveByID(test, id);
4209*c8dee2aaSAndroid Build Coastguard Worker    console.log("    { {" + curveToString(curve) + "}, "
4210*c8dee2aaSAndroid Build Coastguard Worker            + curve.length / 2 + ", " + t0 + ", " + t1 + ", {} }, //");
4211*c8dee2aaSAndroid Build Coastguard Worker}
4212*c8dee2aaSAndroid Build Coastguard Worker
4213*c8dee2aaSAndroid Build Coastguard Workerfunction dumpLogToConsole() {
4214*c8dee2aaSAndroid Build Coastguard Worker    if (logStart < 0) {
4215*c8dee2aaSAndroid Build Coastguard Worker        return;
4216*c8dee2aaSAndroid Build Coastguard Worker    }
4217*c8dee2aaSAndroid Build Coastguard Worker    var test = tests[testIndex];
4218*c8dee2aaSAndroid Build Coastguard Worker    var recType = REC_TYPE_UNKNOWN;
4219*c8dee2aaSAndroid Build Coastguard Worker    var records;
4220*c8dee2aaSAndroid Build Coastguard Worker    for (var index = 0; index < test.length; index += 3) {
4221*c8dee2aaSAndroid Build Coastguard Worker        var lastLineNo = test[index + 1];
4222*c8dee2aaSAndroid Build Coastguard Worker        if (lastLineNo >= logStart && lastLineNo < logStart + logRange) {
4223*c8dee2aaSAndroid Build Coastguard Worker            recType = test[index];
4224*c8dee2aaSAndroid Build Coastguard Worker            records = test[index + 2];
4225*c8dee2aaSAndroid Build Coastguard Worker            break;
4226*c8dee2aaSAndroid Build Coastguard Worker        }
4227*c8dee2aaSAndroid Build Coastguard Worker    }
4228*c8dee2aaSAndroid Build Coastguard Worker    if (recType == REC_TYPE_UNKNOWN) {
4229*c8dee2aaSAndroid Build Coastguard Worker        return;
4230*c8dee2aaSAndroid Build Coastguard Worker    }
4231*c8dee2aaSAndroid Build Coastguard Worker    var lines = testLines[testIndex];
4232*c8dee2aaSAndroid Build Coastguard Worker    for (var idx = 0; idx < logRange; ++idx) {
4233*c8dee2aaSAndroid Build Coastguard Worker        var line = lines[logStart + idx];
4234*c8dee2aaSAndroid Build Coastguard Worker        console.log(line);
4235*c8dee2aaSAndroid Build Coastguard Worker        for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
4236*c8dee2aaSAndroid Build Coastguard Worker            var fragType = records[recordIndex];
4237*c8dee2aaSAndroid Build Coastguard Worker            var frags = records[recordIndex + 1];
4238*c8dee2aaSAndroid Build Coastguard Worker            if (recType == REC_TYPE_ANGLE && fragType == ANGLE_AFTER) {
4239*c8dee2aaSAndroid Build Coastguard Worker                dumpCurvePartial(test, frags[0], frags[4], frags[5]);
4240*c8dee2aaSAndroid Build Coastguard Worker                dumpCurvePartial(test, frags[6], frags[10], frags[11]);
4241*c8dee2aaSAndroid Build Coastguard Worker                dumpCurvePartial(test, frags[12], frags[16], frags[17]);
4242*c8dee2aaSAndroid Build Coastguard Worker                console.log("\nstatic IntersectData intersectDataSet[] = { //");
4243*c8dee2aaSAndroid Build Coastguard Worker                dumpAngleTest(test, frags[0], frags[4], frags[5]);
4244*c8dee2aaSAndroid Build Coastguard Worker                dumpAngleTest(test, frags[6], frags[10], frags[11]);
4245*c8dee2aaSAndroid Build Coastguard Worker                dumpAngleTest(test, frags[12], frags[16], frags[17]);
4246*c8dee2aaSAndroid Build Coastguard Worker                console.log("}; //");
4247*c8dee2aaSAndroid Build Coastguard Worker            }
4248*c8dee2aaSAndroid Build Coastguard Worker        }
4249*c8dee2aaSAndroid Build Coastguard Worker    }
4250*c8dee2aaSAndroid Build Coastguard Worker}
4251*c8dee2aaSAndroid Build Coastguard Worker
4252*c8dee2aaSAndroid Build Coastguard Workervar activeKey = 'a';
4253*c8dee2aaSAndroid Build Coastguard Workervar pathKey = 'b';
4254*c8dee2aaSAndroid Build Coastguard Workervar pathBackKey = 'B';
4255*c8dee2aaSAndroid Build Coastguard Workervar centerKey = 'c';
4256*c8dee2aaSAndroid Build Coastguard Workervar coincidenceKey = 'C';
4257*c8dee2aaSAndroid Build Coastguard Workervar addKey = 'd';
4258*c8dee2aaSAndroid Build Coastguard Workervar deriviativesKey = 'f';
4259*c8dee2aaSAndroid Build Coastguard Workervar angleKey = 'g';
4260*c8dee2aaSAndroid Build Coastguard Workervar angleBackKey = 'G';
4261*c8dee2aaSAndroid Build Coastguard Workervar intersectionKey = 'i';
4262*c8dee2aaSAndroid Build Coastguard Workervar intersectionBackKey = 'I';
4263*c8dee2aaSAndroid Build Coastguard Workervar sequenceKey = 'j';
4264*c8dee2aaSAndroid Build Coastguard Workervar midpointKey = 'k';
4265*c8dee2aaSAndroid Build Coastguard Workervar logKey = 'l';
4266*c8dee2aaSAndroid Build Coastguard Workervar logToConsoleKey = 'L';
4267*c8dee2aaSAndroid Build Coastguard Workervar markKey = 'm';
4268*c8dee2aaSAndroid Build Coastguard Workervar sortKey = 'o';
4269*c8dee2aaSAndroid Build Coastguard Workervar opKey = 'p';
4270*c8dee2aaSAndroid Build Coastguard Workervar opBackKey = 'P';
4271*c8dee2aaSAndroid Build Coastguard Workervar computedKey = 'q';
4272*c8dee2aaSAndroid Build Coastguard Workervar computedBackKey = 'Q';
4273*c8dee2aaSAndroid Build Coastguard Workervar directionKey = 'r';
4274*c8dee2aaSAndroid Build Coastguard Workervar stepKey = 's';
4275*c8dee2aaSAndroid Build Coastguard Workervar stepBackKey = 'S';
4276*c8dee2aaSAndroid Build Coastguard Workervar intersectTKey = 't';
4277*c8dee2aaSAndroid Build Coastguard Workervar topKey = 'T';
4278*c8dee2aaSAndroid Build Coastguard Workervar curveTKey = 'u';
4279*c8dee2aaSAndroid Build Coastguard Workervar controlLinesBackKey = 'V';
4280*c8dee2aaSAndroid Build Coastguard Workervar controlLinesKey = 'v';
4281*c8dee2aaSAndroid Build Coastguard Workervar ptsKey = 'x';
4282*c8dee2aaSAndroid Build Coastguard Workervar xyKey = 'y';
4283*c8dee2aaSAndroid Build Coastguard Workervar logCurvesKey = 'z';
4284*c8dee2aaSAndroid Build Coastguard Workervar focusKey = '`';
4285*c8dee2aaSAndroid Build Coastguard Workervar idKey = '.';
4286*c8dee2aaSAndroid Build Coastguard Workervar retinaKey = '\\';
4287*c8dee2aaSAndroid Build Coastguard Worker
4288*c8dee2aaSAndroid Build Coastguard Workerfunction doKeyPress(evt) {
4289*c8dee2aaSAndroid Build Coastguard Worker    var char = String.fromCharCode(evt.charCode);
4290*c8dee2aaSAndroid Build Coastguard Worker    var focusWasOn = false;
4291*c8dee2aaSAndroid Build Coastguard Worker    switch (char) {
4292*c8dee2aaSAndroid Build Coastguard Worker    case '0':
4293*c8dee2aaSAndroid Build Coastguard Worker    case '1':
4294*c8dee2aaSAndroid Build Coastguard Worker    case '2':
4295*c8dee2aaSAndroid Build Coastguard Worker    case '3':
4296*c8dee2aaSAndroid Build Coastguard Worker    case '4':
4297*c8dee2aaSAndroid Build Coastguard Worker    case '5':
4298*c8dee2aaSAndroid Build Coastguard Worker    case '6':
4299*c8dee2aaSAndroid Build Coastguard Worker    case '7':
4300*c8dee2aaSAndroid Build Coastguard Worker    case '8':
4301*c8dee2aaSAndroid Build Coastguard Worker    case '9':
4302*c8dee2aaSAndroid Build Coastguard Worker        decimal_places = char - '0';
4303*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4304*c8dee2aaSAndroid Build Coastguard Worker        break;
4305*c8dee2aaSAndroid Build Coastguard Worker    case activeKey:
4306*c8dee2aaSAndroid Build Coastguard Worker        draw_active ^= true;
4307*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4308*c8dee2aaSAndroid Build Coastguard Worker        break;
4309*c8dee2aaSAndroid Build Coastguard Worker    case addKey:
4310*c8dee2aaSAndroid Build Coastguard Worker        draw_add ^= true;
4311*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4312*c8dee2aaSAndroid Build Coastguard Worker        break;
4313*c8dee2aaSAndroid Build Coastguard Worker    case angleKey:
4314*c8dee2aaSAndroid Build Coastguard Worker        draw_angle = (draw_angle + 1) % 4;
4315*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4316*c8dee2aaSAndroid Build Coastguard Worker        break;
4317*c8dee2aaSAndroid Build Coastguard Worker    case angleBackKey:
4318*c8dee2aaSAndroid Build Coastguard Worker        draw_angle = (draw_angle + 2) % 3;
4319*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4320*c8dee2aaSAndroid Build Coastguard Worker        break;
4321*c8dee2aaSAndroid Build Coastguard Worker    case centerKey:
4322*c8dee2aaSAndroid Build Coastguard Worker        setScale(xmin, xmax, ymin, ymax);
4323*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4324*c8dee2aaSAndroid Build Coastguard Worker        break;
4325*c8dee2aaSAndroid Build Coastguard Worker    case coincidenceKey:
4326*c8dee2aaSAndroid Build Coastguard Worker        draw_coincidence ^= true;
4327*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4328*c8dee2aaSAndroid Build Coastguard Worker        break;
4329*c8dee2aaSAndroid Build Coastguard Worker    case controlLinesBackKey:
4330*c8dee2aaSAndroid Build Coastguard Worker        control_lines = (control_lines + 3) % 4;
4331*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4332*c8dee2aaSAndroid Build Coastguard Worker        break;
4333*c8dee2aaSAndroid Build Coastguard Worker    case controlLinesKey:
4334*c8dee2aaSAndroid Build Coastguard Worker        control_lines = (control_lines + 1) % 4;
4335*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4336*c8dee2aaSAndroid Build Coastguard Worker        break;
4337*c8dee2aaSAndroid Build Coastguard Worker    case computedBackKey:
4338*c8dee2aaSAndroid Build Coastguard Worker        draw_computed = (draw_computed + 5) % 6;
4339*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4340*c8dee2aaSAndroid Build Coastguard Worker        break;
4341*c8dee2aaSAndroid Build Coastguard Worker    case computedKey:
4342*c8dee2aaSAndroid Build Coastguard Worker        draw_computed = (draw_computed + 1) % 6;
4343*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4344*c8dee2aaSAndroid Build Coastguard Worker        break;
4345*c8dee2aaSAndroid Build Coastguard Worker    case curveTKey:
4346*c8dee2aaSAndroid Build Coastguard Worker        curve_t ^= true;
4347*c8dee2aaSAndroid Build Coastguard Worker        if (curve_t) {
4348*c8dee2aaSAndroid Build Coastguard Worker            draw_legend = true;
4349*c8dee2aaSAndroid Build Coastguard Worker        }
4350*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4351*c8dee2aaSAndroid Build Coastguard Worker        break;
4352*c8dee2aaSAndroid Build Coastguard Worker    case deriviativesKey:
4353*c8dee2aaSAndroid Build Coastguard Worker        draw_deriviatives = (draw_deriviatives + 1) % 3;
4354*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4355*c8dee2aaSAndroid Build Coastguard Worker        break;
4356*c8dee2aaSAndroid Build Coastguard Worker    case directionKey:
4357*c8dee2aaSAndroid Build Coastguard Worker        draw_direction ^= true;
4358*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4359*c8dee2aaSAndroid Build Coastguard Worker        break;
4360*c8dee2aaSAndroid Build Coastguard Worker    case focusKey:
4361*c8dee2aaSAndroid Build Coastguard Worker        focus_on_selection ^= true;
4362*c8dee2aaSAndroid Build Coastguard Worker        setScale(xmin, xmax, ymin, ymax);
4363*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4364*c8dee2aaSAndroid Build Coastguard Worker        break;
4365*c8dee2aaSAndroid Build Coastguard Worker    case idKey:
4366*c8dee2aaSAndroid Build Coastguard Worker        draw_id ^= true;
4367*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4368*c8dee2aaSAndroid Build Coastguard Worker        break;
4369*c8dee2aaSAndroid Build Coastguard Worker    case intersectionBackKey:
4370*c8dee2aaSAndroid Build Coastguard Worker        draw_intersection = (draw_intersection + 3) % 4;
4371*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4372*c8dee2aaSAndroid Build Coastguard Worker        break;
4373*c8dee2aaSAndroid Build Coastguard Worker    case intersectionKey:
4374*c8dee2aaSAndroid Build Coastguard Worker        draw_intersection = (draw_intersection + 1) % 4;
4375*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4376*c8dee2aaSAndroid Build Coastguard Worker        break;
4377*c8dee2aaSAndroid Build Coastguard Worker    case intersectTKey:
4378*c8dee2aaSAndroid Build Coastguard Worker        draw_intersectT ^= true;
4379*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4380*c8dee2aaSAndroid Build Coastguard Worker        break;
4381*c8dee2aaSAndroid Build Coastguard Worker    case logCurvesKey:
4382*c8dee2aaSAndroid Build Coastguard Worker        logCurves(tests[testIndex]);
4383*c8dee2aaSAndroid Build Coastguard Worker        break;
4384*c8dee2aaSAndroid Build Coastguard Worker    case logKey:
4385*c8dee2aaSAndroid Build Coastguard Worker        draw_log ^= true;
4386*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4387*c8dee2aaSAndroid Build Coastguard Worker        break;
4388*c8dee2aaSAndroid Build Coastguard Worker    case logToConsoleKey:
4389*c8dee2aaSAndroid Build Coastguard Worker        if (draw_log) {
4390*c8dee2aaSAndroid Build Coastguard Worker            dumpLogToConsole();
4391*c8dee2aaSAndroid Build Coastguard Worker        }
4392*c8dee2aaSAndroid Build Coastguard Worker        break;
4393*c8dee2aaSAndroid Build Coastguard Worker    case markKey:
4394*c8dee2aaSAndroid Build Coastguard Worker        draw_mark ^= true;
4395*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4396*c8dee2aaSAndroid Build Coastguard Worker        break;
4397*c8dee2aaSAndroid Build Coastguard Worker    case midpointKey:
4398*c8dee2aaSAndroid Build Coastguard Worker        draw_midpoint ^= true;
4399*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4400*c8dee2aaSAndroid Build Coastguard Worker        break;
4401*c8dee2aaSAndroid Build Coastguard Worker    case opKey:
4402*c8dee2aaSAndroid Build Coastguard Worker        draw_op = (draw_op + 1) % 3;
4403*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4404*c8dee2aaSAndroid Build Coastguard Worker        break;
4405*c8dee2aaSAndroid Build Coastguard Worker    case opBackKey:
4406*c8dee2aaSAndroid Build Coastguard Worker        draw_op = (draw_op + 2) % 3;
4407*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4408*c8dee2aaSAndroid Build Coastguard Worker        break;
4409*c8dee2aaSAndroid Build Coastguard Worker    case pathKey:
4410*c8dee2aaSAndroid Build Coastguard Worker        draw_path = (draw_path + 1) % (4 + (hasAlignedPath ? 3 : 0));
4411*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4412*c8dee2aaSAndroid Build Coastguard Worker        break;
4413*c8dee2aaSAndroid Build Coastguard Worker    case pathBackKey:
4414*c8dee2aaSAndroid Build Coastguard Worker        draw_path = (draw_path + 3 + (hasAlignedPath ? 3 : 0)) % (4 + (hasAlignedPath ? 3 : 0));
4415*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4416*c8dee2aaSAndroid Build Coastguard Worker        break;
4417*c8dee2aaSAndroid Build Coastguard Worker    case ptsKey:
4418*c8dee2aaSAndroid Build Coastguard Worker        pt_labels = (pt_labels + 1) % 3;
4419*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4420*c8dee2aaSAndroid Build Coastguard Worker        break;
4421*c8dee2aaSAndroid Build Coastguard Worker    case retinaKey:
4422*c8dee2aaSAndroid Build Coastguard Worker        retina_scale ^= true;
4423*c8dee2aaSAndroid Build Coastguard Worker        drawTop();
4424*c8dee2aaSAndroid Build Coastguard Worker        break;
4425*c8dee2aaSAndroid Build Coastguard Worker    case sequenceKey:
4426*c8dee2aaSAndroid Build Coastguard Worker        draw_sequence ^= true;
4427*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4428*c8dee2aaSAndroid Build Coastguard Worker        break;
4429*c8dee2aaSAndroid Build Coastguard Worker    case sortKey:
4430*c8dee2aaSAndroid Build Coastguard Worker        draw_sort = (draw_sort + 1) % 3;
4431*c8dee2aaSAndroid Build Coastguard Worker        drawTop();
4432*c8dee2aaSAndroid Build Coastguard Worker        break;
4433*c8dee2aaSAndroid Build Coastguard Worker    case stepKey:
4434*c8dee2aaSAndroid Build Coastguard Worker        step_limit++;
4435*c8dee2aaSAndroid Build Coastguard Worker        if (step_limit > stepMax) {
4436*c8dee2aaSAndroid Build Coastguard Worker            step_limit = stepMax;
4437*c8dee2aaSAndroid Build Coastguard Worker        }
4438*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4439*c8dee2aaSAndroid Build Coastguard Worker        break;
4440*c8dee2aaSAndroid Build Coastguard Worker    case stepBackKey:
4441*c8dee2aaSAndroid Build Coastguard Worker        step_limit--;
4442*c8dee2aaSAndroid Build Coastguard Worker        if (step_limit < 0) {
4443*c8dee2aaSAndroid Build Coastguard Worker            step_limit = 0;
4444*c8dee2aaSAndroid Build Coastguard Worker        }
4445*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4446*c8dee2aaSAndroid Build Coastguard Worker        break;
4447*c8dee2aaSAndroid Build Coastguard Worker    case topKey:
4448*c8dee2aaSAndroid Build Coastguard Worker        draw_top ^= true;
4449*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4450*c8dee2aaSAndroid Build Coastguard Worker        break;
4451*c8dee2aaSAndroid Build Coastguard Worker    case xyKey:
4452*c8dee2aaSAndroid Build Coastguard Worker        debug_xy = (debug_xy + 1) % 3;
4453*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4454*c8dee2aaSAndroid Build Coastguard Worker        break;
4455*c8dee2aaSAndroid Build Coastguard Worker    case '-':
4456*c8dee2aaSAndroid Build Coastguard Worker        focusWasOn = focus_on_selection;
4457*c8dee2aaSAndroid Build Coastguard Worker        if (focusWasOn) {
4458*c8dee2aaSAndroid Build Coastguard Worker            focus_on_selection = false;
4459*c8dee2aaSAndroid Build Coastguard Worker            scale /= 1.2;
4460*c8dee2aaSAndroid Build Coastguard Worker        } else {
4461*c8dee2aaSAndroid Build Coastguard Worker            scale /= 2;
4462*c8dee2aaSAndroid Build Coastguard Worker            calcLeftTop();
4463*c8dee2aaSAndroid Build Coastguard Worker        }
4464*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4465*c8dee2aaSAndroid Build Coastguard Worker        focus_on_selection = focusWasOn;
4466*c8dee2aaSAndroid Build Coastguard Worker        break;
4467*c8dee2aaSAndroid Build Coastguard Worker    case '=':
4468*c8dee2aaSAndroid Build Coastguard Worker    case '+':
4469*c8dee2aaSAndroid Build Coastguard Worker        focusWasOn = focus_on_selection;
4470*c8dee2aaSAndroid Build Coastguard Worker        if (focusWasOn) {
4471*c8dee2aaSAndroid Build Coastguard Worker            focus_on_selection = false;
4472*c8dee2aaSAndroid Build Coastguard Worker            scale *= 1.2;
4473*c8dee2aaSAndroid Build Coastguard Worker        } else {
4474*c8dee2aaSAndroid Build Coastguard Worker            scale *= 2;
4475*c8dee2aaSAndroid Build Coastguard Worker            calcLeftTop();
4476*c8dee2aaSAndroid Build Coastguard Worker        }
4477*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4478*c8dee2aaSAndroid Build Coastguard Worker        focus_on_selection = focusWasOn;
4479*c8dee2aaSAndroid Build Coastguard Worker        break;
4480*c8dee2aaSAndroid Build Coastguard Worker    case '?':
4481*c8dee2aaSAndroid Build Coastguard Worker        draw_hints ^= true;
4482*c8dee2aaSAndroid Build Coastguard Worker        if (draw_hints && !draw_legend) {
4483*c8dee2aaSAndroid Build Coastguard Worker            draw_legend = true;
4484*c8dee2aaSAndroid Build Coastguard Worker        }
4485*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4486*c8dee2aaSAndroid Build Coastguard Worker        break;
4487*c8dee2aaSAndroid Build Coastguard Worker    case '/':
4488*c8dee2aaSAndroid Build Coastguard Worker        draw_legend ^= true;
4489*c8dee2aaSAndroid Build Coastguard Worker        redraw();
4490*c8dee2aaSAndroid Build Coastguard Worker        break;
4491*c8dee2aaSAndroid Build Coastguard Worker    }
4492*c8dee2aaSAndroid Build Coastguard Worker}
4493*c8dee2aaSAndroid Build Coastguard Worker
4494*c8dee2aaSAndroid Build Coastguard Workerfunction doKeyDown(evt) {
4495*c8dee2aaSAndroid Build Coastguard Worker    var char = evt.keyCode;
4496*c8dee2aaSAndroid Build Coastguard Worker    var preventDefault = false;
4497*c8dee2aaSAndroid Build Coastguard Worker    switch (char) {
4498*c8dee2aaSAndroid Build Coastguard Worker    case 37: // left arrow
4499*c8dee2aaSAndroid Build Coastguard Worker        if (evt.shiftKey) {
4500*c8dee2aaSAndroid Build Coastguard Worker            testIndex -= 9;
4501*c8dee2aaSAndroid Build Coastguard Worker        }
4502*c8dee2aaSAndroid Build Coastguard Worker        if (--testIndex < 0)
4503*c8dee2aaSAndroid Build Coastguard Worker            testIndex = tests.length - 1;
4504*c8dee2aaSAndroid Build Coastguard Worker        drawTop();
4505*c8dee2aaSAndroid Build Coastguard Worker        preventDefault = true;
4506*c8dee2aaSAndroid Build Coastguard Worker        break;
4507*c8dee2aaSAndroid Build Coastguard Worker    case 39: // right arrow
4508*c8dee2aaSAndroid Build Coastguard Worker        if (evt.shiftKey) {
4509*c8dee2aaSAndroid Build Coastguard Worker            testIndex += 9;
4510*c8dee2aaSAndroid Build Coastguard Worker        }
4511*c8dee2aaSAndroid Build Coastguard Worker        if (++testIndex >= tests.length)
4512*c8dee2aaSAndroid Build Coastguard Worker            testIndex = 0;
4513*c8dee2aaSAndroid Build Coastguard Worker        drawTop();
4514*c8dee2aaSAndroid Build Coastguard Worker        preventDefault = true;
4515*c8dee2aaSAndroid Build Coastguard Worker        break;
4516*c8dee2aaSAndroid Build Coastguard Worker    }
4517*c8dee2aaSAndroid Build Coastguard Worker    if (preventDefault) {
4518*c8dee2aaSAndroid Build Coastguard Worker          evt.preventDefault();
4519*c8dee2aaSAndroid Build Coastguard Worker          return false;
4520*c8dee2aaSAndroid Build Coastguard Worker    }
4521*c8dee2aaSAndroid Build Coastguard Worker    return true;
4522*c8dee2aaSAndroid Build Coastguard Worker}
4523*c8dee2aaSAndroid Build Coastguard Worker
4524*c8dee2aaSAndroid Build Coastguard Worker(function() {
4525*c8dee2aaSAndroid Build Coastguard Worker    var hidden = "hidden";
4526*c8dee2aaSAndroid Build Coastguard Worker
4527*c8dee2aaSAndroid Build Coastguard Worker    // Standards:
4528*c8dee2aaSAndroid Build Coastguard Worker    if (hidden in document)
4529*c8dee2aaSAndroid Build Coastguard Worker        document.addEventListener("visibilitychange", onchange);
4530*c8dee2aaSAndroid Build Coastguard Worker    else if ((hidden = "mozHidden") in document)
4531*c8dee2aaSAndroid Build Coastguard Worker        document.addEventListener("mozvisibilitychange", onchange);
4532*c8dee2aaSAndroid Build Coastguard Worker    else if ((hidden = "webkitHidden") in document)
4533*c8dee2aaSAndroid Build Coastguard Worker        document.addEventListener("webkitvisibilitychange", onchange);
4534*c8dee2aaSAndroid Build Coastguard Worker    else if ((hidden = "msHidden") in document)
4535*c8dee2aaSAndroid Build Coastguard Worker        document.addEventListener("msvisibilitychange", onchange);
4536*c8dee2aaSAndroid Build Coastguard Worker    // IE 9 and lower:
4537*c8dee2aaSAndroid Build Coastguard Worker    else if ('onfocusin' in document)
4538*c8dee2aaSAndroid Build Coastguard Worker        document.onfocusin = document.onfocusout = onchange;
4539*c8dee2aaSAndroid Build Coastguard Worker    // All others:
4540*c8dee2aaSAndroid Build Coastguard Worker    else
4541*c8dee2aaSAndroid Build Coastguard Worker        window.onpageshow = window.onpagehide
4542*c8dee2aaSAndroid Build Coastguard Worker            = window.onfocus = window.onblur = onchange;
4543*c8dee2aaSAndroid Build Coastguard Worker
4544*c8dee2aaSAndroid Build Coastguard Worker    function onchange (evt) {
4545*c8dee2aaSAndroid Build Coastguard Worker        var v = 'visible', h = 'hidden',
4546*c8dee2aaSAndroid Build Coastguard Worker            evtMap = {
4547*c8dee2aaSAndroid Build Coastguard Worker                focus:v, focusin:v, pageshow:v, blur:h, focusout:h, pagehide:h
4548*c8dee2aaSAndroid Build Coastguard Worker            };
4549*c8dee2aaSAndroid Build Coastguard Worker
4550*c8dee2aaSAndroid Build Coastguard Worker        evt = evt || window.event;
4551*c8dee2aaSAndroid Build Coastguard Worker        if (evt.type in evtMap)
4552*c8dee2aaSAndroid Build Coastguard Worker            document.body.className = evtMap[evt.type];
4553*c8dee2aaSAndroid Build Coastguard Worker        else
4554*c8dee2aaSAndroid Build Coastguard Worker            document.body.className = this[hidden] ? "hidden" : "visible";
4555*c8dee2aaSAndroid Build Coastguard Worker    }
4556*c8dee2aaSAndroid Build Coastguard Worker})();
4557*c8dee2aaSAndroid Build Coastguard Worker
4558*c8dee2aaSAndroid Build Coastguard Workerfunction calcXY() {
4559*c8dee2aaSAndroid Build Coastguard Worker    var e = window.event;
4560*c8dee2aaSAndroid Build Coastguard Worker    var tgt = e.target || e.srcElement;
4561*c8dee2aaSAndroid Build Coastguard Worker    var left = tgt.offsetLeft;
4562*c8dee2aaSAndroid Build Coastguard Worker    var top = tgt.offsetTop;
4563*c8dee2aaSAndroid Build Coastguard Worker    mouseX = (e.clientX - left) / scale + srcLeft;
4564*c8dee2aaSAndroid Build Coastguard Worker    mouseY = (e.clientY - top) / scale + srcTop;
4565*c8dee2aaSAndroid Build Coastguard Worker}
4566*c8dee2aaSAndroid Build Coastguard Worker
4567*c8dee2aaSAndroid Build Coastguard Workerfunction calcLeftTop() {
4568*c8dee2aaSAndroid Build Coastguard Worker    srcLeft = mouseX - screenWidth / 2 / scale;
4569*c8dee2aaSAndroid Build Coastguard Worker    srcTop = mouseY - screenHeight / 2 / scale;
4570*c8dee2aaSAndroid Build Coastguard Worker}
4571*c8dee2aaSAndroid Build Coastguard Worker
4572*c8dee2aaSAndroid Build Coastguard Workervar disableClick = false;
4573*c8dee2aaSAndroid Build Coastguard Worker
4574*c8dee2aaSAndroid Build Coastguard Workerfunction handleMouseClick() {
4575*c8dee2aaSAndroid Build Coastguard Worker    if (disableClick) {
4576*c8dee2aaSAndroid Build Coastguard Worker        return;
4577*c8dee2aaSAndroid Build Coastguard Worker    }
4578*c8dee2aaSAndroid Build Coastguard Worker    if (!curve_t || !ptInTControl()) {
4579*c8dee2aaSAndroid Build Coastguard Worker        calcXY();
4580*c8dee2aaSAndroid Build Coastguard Worker        calcLeftTop();
4581*c8dee2aaSAndroid Build Coastguard Worker    }
4582*c8dee2aaSAndroid Build Coastguard Worker    redraw();
4583*c8dee2aaSAndroid Build Coastguard Worker//    if (!curve_t || !ptInTControl()) {
4584*c8dee2aaSAndroid Build Coastguard Worker//        mouseX = screenWidth / 2 / scale + srcLeft;
4585*c8dee2aaSAndroid Build Coastguard Worker//        mouseY = screenHeight / 2 / scale + srcTop;
4586*c8dee2aaSAndroid Build Coastguard Worker//    }
4587*c8dee2aaSAndroid Build Coastguard Worker}
4588*c8dee2aaSAndroid Build Coastguard Worker
4589*c8dee2aaSAndroid Build Coastguard Workerfunction handleMouseOver() {
4590*c8dee2aaSAndroid Build Coastguard Worker    calcXY();
4591*c8dee2aaSAndroid Build Coastguard Worker    if (debug_xy != 2) {
4592*c8dee2aaSAndroid Build Coastguard Worker        return;
4593*c8dee2aaSAndroid Build Coastguard Worker    }
4594*c8dee2aaSAndroid Build Coastguard Worker    var num = mouseX.toFixed(decimal_places) + ", " + mouseY.toFixed(decimal_places);
4595*c8dee2aaSAndroid Build Coastguard Worker    ctx.beginPath();
4596*c8dee2aaSAndroid Build Coastguard Worker    ctx.rect(300,100,num.length * 6,10);
4597*c8dee2aaSAndroid Build Coastguard Worker    ctx.fillStyle="white";
4598*c8dee2aaSAndroid Build Coastguard Worker    ctx.fill();
4599*c8dee2aaSAndroid Build Coastguard Worker    ctx.font = "normal 10px Arial";
4600*c8dee2aaSAndroid Build Coastguard Worker    ctx.fillStyle="black";
4601*c8dee2aaSAndroid Build Coastguard Worker    ctx.textAlign = "left";
4602*c8dee2aaSAndroid Build Coastguard Worker    ctx.fillText(num, 300, 108);
4603*c8dee2aaSAndroid Build Coastguard Worker}
4604*c8dee2aaSAndroid Build Coastguard Worker
4605*c8dee2aaSAndroid Build Coastguard Workerfunction start() {
4606*c8dee2aaSAndroid Build Coastguard Worker    for (var i = 0; i < testDivs.length; ++i) {
4607*c8dee2aaSAndroid Build Coastguard Worker        tests[i] = null;
4608*c8dee2aaSAndroid Build Coastguard Worker    }
4609*c8dee2aaSAndroid Build Coastguard Worker    testIndex = 0;
4610*c8dee2aaSAndroid Build Coastguard Worker    drawTop();
4611*c8dee2aaSAndroid Build Coastguard Worker    window.addEventListener('keypress', doKeyPress, true);
4612*c8dee2aaSAndroid Build Coastguard Worker    window.addEventListener('keydown', doKeyDown, true);
4613*c8dee2aaSAndroid Build Coastguard Worker    window.onresize = function() {
4614*c8dee2aaSAndroid Build Coastguard Worker        drawTop();
4615*c8dee2aaSAndroid Build Coastguard Worker    }
4616*c8dee2aaSAndroid Build Coastguard Worker    /*
4617*c8dee2aaSAndroid Build Coastguard Worker    window.onpagehide = function() {
4618*c8dee2aaSAndroid Build Coastguard Worker        disableClick = true;
4619*c8dee2aaSAndroid Build Coastguard Worker    }
4620*c8dee2aaSAndroid Build Coastguard Worker    */
4621*c8dee2aaSAndroid Build Coastguard Worker    window.onpageshow = function () {
4622*c8dee2aaSAndroid Build Coastguard Worker        disableClick = false;
4623*c8dee2aaSAndroid Build Coastguard Worker    }
4624*c8dee2aaSAndroid Build Coastguard Worker}
4625*c8dee2aaSAndroid Build Coastguard Worker
4626*c8dee2aaSAndroid Build Coastguard Worker</script>
4627*c8dee2aaSAndroid Build Coastguard Worker</head>
4628*c8dee2aaSAndroid Build Coastguard Worker
4629*c8dee2aaSAndroid Build Coastguard Worker<body onLoad="start();">
4630*c8dee2aaSAndroid Build Coastguard Worker<canvas id="canvas" width="750" height="500"
4631*c8dee2aaSAndroid Build Coastguard Worker    onmousemove="handleMouseOver()"
4632*c8dee2aaSAndroid Build Coastguard Worker    onclick="handleMouseClick()"
4633*c8dee2aaSAndroid Build Coastguard Worker    ></canvas >
4634*c8dee2aaSAndroid Build Coastguard Worker</body>
4635*c8dee2aaSAndroid Build Coastguard Worker</html>
4636