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