blob: ad606337a6de623664e11c1b8211b019554e9f5d [file] [log] [blame]
caryclarkdac1d172014-06-17 05:15:38 -07001<html>
2<head>
3<div height="0" hidden="true">
caryclarkdac1d172014-06-17 05:15:38 -07004
caryclark182b4992015-05-14 05:45:54 -07005<div id="issue3651_7">
6seg=1 {{{68.1999969f, 74.8000031f}, {68.4444427f, 74.8000031f}, {68.6888885f, 74.8039017f}, {68.9333344f, 74.8078003f}}}
7seg=2 {{{68.9333344f, 74.8078003f}, {69.422226f, 74.8155975f}, {69.9111099f, 74.8233948f}, {70.4000015f, 74.8000031f}}}
8seg=3 {{{70.4000015f, 74.8000031f}, {70.7796326f, 74.7818375f}, {71.1592636f, 74.7372665f}, {71.5388947f, 74.6926956f}}}
9seg=4 {{{71.5388947f, 74.6926956f}, {71.8925934f, 74.6511688f}, {72.2462997f, 74.609642f}, {72.5999985f, 74.5894699f}}}
10seg=5 {{{72.5999985f, 74.5894699f}, {73.1301117f, 74.5592346f}, {73.6602249f, 74.5564957f}, {74.1903381f, 74.5537567f}}}
11seg=6 {{{74.1903381f, 74.5537567f}, {74.3935623f, 74.5527115f}, {74.5967789f, 74.5516663f}, {74.8000031f, 74.5490646f}}}
12seg=7 {{{74.8000031f, 74.5490646f}, {75.0211792f, 74.5462341f}, {75.242363f, 74.5398636f}, {75.4635391f, 74.5335007f}}}
13seg=8 {{{75.4635391f, 74.5335007f}, {75.9756927f, 74.5187607f}, {76.4878464f, 74.5040207f}, {77, 74.5332108f}}}
14seg=9 {{{77, 74.5332108f}, {77.3702316f, 74.5543137f}, {77.7404709f, 74.610733f}, {78.1107025f, 74.66716f}}}
15seg=10 {{{78.1107025f, 74.66716f}, {78.4738007f, 74.722496f}, {78.8368988f, 74.777832f}, {79.1999969f, 74.7998505f}}}
16seg=11 {{{79.1999969f, 74.7998505f}, {79.689003f, 74.8295059f}, {80.1780014f, 74.819664f}, {80.6670074f, 74.8098221f}}}
17seg=12 {{{80.6670074f, 74.8098221f}, {80.9113388f, 74.8049088f}, {81.1556702f, 74.7999954f}, {81.4000015f, 74.8000031f}}}
18seg=13 {{{81.4000015f, 74.8000031f}, {81.6438522f, 74.8000107f}, {81.8877106f, 74.8010635f}, {82.1315613f, 74.8021164f}}}
19seg=14 {{{82.1315613f, 74.8021164f}, {82.6210403f, 74.8042297f}, {83.1105194f, 74.8063507f}, {83.5999985f, 74.8000031f}}}
20seg=15 {{{83.5999985f, 74.8000031f}, {83.9259109f, 74.7957764f}, {84.2518234f, 74.7840347f}, {84.5777359f, 74.7722931f}}}
21seg=16 {{{84.5777359f, 74.7722931f}, {84.9851608f, 74.7576141f}, {85.3925781f, 74.7429352f}, {85.8000031f, 74.7429352f}}}
22seg=17 {{{85.8000031f, 74.7429352f}, {86.2074203f, 74.7429352f}, {86.6148453f, 74.7576141f}, {87.0222626f, 74.7722931f}}}
23seg=18 {{{87.0222626f, 74.7722931f}, {87.348175f, 74.7840347f}, {87.6740875f, 74.7957764f}, {88, 74.8000031f}}}
24seg=19 {{{88, 74.8000031f}, {88.1576462f, 74.8020477f}, {88.3152924f, 74.8048859f}, {88.4729385f, 74.8077316f}}}
25seg=20 {{{88.4729385f, 74.8077316f}, {89.0486221f, 74.8181076f}, {89.6243134f, 74.8284836f}, {90.1999969f, 74.8000031f}}}
26seg=21 {{{90.1999969f, 74.8000031f}, {90.5620499f, 74.7820892f}, {90.9241028f, 74.7369537f}, {91.2861557f, 74.6918182f}}}
27seg=22 {{{91.2861557f, 74.6918182f}, {91.6574402f, 74.6455307f}, {92.028717f, 74.5992432f}, {92.4000015f, 74.5823135f}}}
28seg=23 {{{92.4000015f, 74.5823135f}, {92.9111481f, 74.5590057f}, {93.4223022f, 74.5721283f}, {93.9334488f, 74.5852509f}}}
29seg=24 {{{93.9334488f, 74.5852509f}, {94.155632f, 74.59095f}, {94.3778152f, 74.5966568f}, {94.5999985f, 74.5993652f}}}
30seg=25 {{{94.5999985f, 74.5993652f}, {94.8669891f, 74.602623f}, {95.1339798f, 74.6110153f}, {95.4009705f, 74.6194f}}}
31seg=26 {{{95.4009705f, 74.6194f}, {95.8673172f, 74.6340485f}, {96.3336563f, 74.6486969f}, {96.8000031f, 74.6360168f}}}
32seg=27 {{{96.8000031f, 74.6360168f}, {97.2396164f, 74.624054f}, {97.6792297f, 74.5860596f}, {98.1188431f, 74.5480652f}}}
33seg=28 {{{98.1188431f, 74.5480652f}, {98.4125595f, 74.5226822f}, {98.7062836f, 74.4972992f}, {99, 74.4796829f}}}
34seg=29 {{{99, 74.4796829f}, {99.7333298f, 74.4356995f}, {100.466667f, 74.3924866f}, {101.199997f, 74.3721085f}}}
35seg=30 {{{101.199997f, 74.3721085f}, {101.6632f, 74.3592453f}, {102.126396f, 74.3594589f}, {102.5896f, 74.3596725f}}}
36seg=31 {{{102.5896f, 74.3596725f}, {102.859734f, 74.3597946f}, {103.129868f, 74.3599167f}, {103.400002f, 74.3574448f}}}
37seg=32 {{{103.400002f, 74.3574448f}, {103.499123f, 74.3565369f}, {103.598244f, 74.3556519f}, {103.697365f, 74.3547668f}}}
38seg=33 {{{103.697365f, 74.3547668f}, {104.331573f, 74.3491211f}, {104.96579f, 74.3434753f}, {105.599998f, 74.3318787f}}}
39seg=34 {{{105.599998f, 74.3318787f}, {105.951164f, 74.3254547f}, {106.30233f, 74.3153458f}, {106.653496f, 74.3052368f}}}
40seg=35 {{{106.653496f, 74.3052368f}, {107.035667f, 74.2942352f}, {107.417831f, 74.2832336f}, {107.800003f, 74.2769852f}}}
41seg=36 {{{107.800003f, 74.2769852f}, {107.904305f, 74.2752838f}, {108.008606f, 74.2734833f}, {108.112907f, 74.2716827f}}}
42seg=37 {{{108.112907f, 74.2716827f}, {108.741936f, 74.2608261f}, {109.370972f, 74.2499771f}, {110, 74.2599411f}}}
43seg=38 {{{110, 74.2599411f}, {110.73333f, 74.2715607f}, {111.466667f, 74.3080215f}, {112.199997f, 74.3467178f}}}
44seg=39 {{{112.199997f, 74.3467178f}, {112.524193f, 74.3638306f}, {112.848389f, 74.3887024f}, {113.172585f, 74.4135742f}}}
45seg=40 {{{113.172585f, 74.4135742f}, {113.581726f, 74.4449615f}, {113.99086f, 74.4763565f}, {114.400002f, 74.4921417f}}}
46seg=41 {{{114.400002f, 74.4921417f}, {115.133331f, 74.5204391f}, {115.866669f, 74.5265198f}, {116.599998f, 74.5165176f}}}
47seg=42 {{{116.599998f, 74.5165176f}, {117.013039f, 74.5108871f}, {117.426071f, 74.4911652f}, {117.839111f, 74.4714432f}}}
48seg=43 {{{117.839111f, 74.4714432f}, {118.159409f, 74.4561462f}, {118.479706f, 74.4408493f}, {118.800003f, 74.4321289f}}}
49seg=44 {{{118.800003f, 74.4321289f}, {118.915619f, 74.428978f}, {119.031235f, 74.4256439f}, {119.146851f, 74.4223099f}}}
50seg=45 {{{119.146851f, 74.4223099f}, {119.764565f, 74.4045105f}, {120.382286f, 74.3867035f}, {121, 74.3966675f}}}
51seg=46 {{{121, 74.3966675f}, {121.552635f, 74.405571f}, {122.105278f, 74.4385529f}, {122.657913f, 74.4715347f}}}
52seg=47 {{{122.657913f, 74.4715347f}, {122.838608f, 74.4823227f}, {123.019302f, 74.4931107f}, {123.199997f, 74.5030518f}}}
53seg=48 {{{123.199997f, 74.5030518f}, {123.480431f, 74.5184784f}, {123.760864f, 74.5394821f}, {124.041298f, 74.5604858f}}}
54seg=49 {{{124.041298f, 74.5604858f}, {124.494202f, 74.5943985f}, {124.947098f, 74.6283112f}, {125.400002f, 74.6387558f}}}
55seg=50 {{{125.400002f, 74.6387558f}, {126.133331f, 74.6556625f}, {126.866669f, 74.6397476f}, {127.599998f, 74.6044846f}}}
56seg=51 {{{127.599998f, 74.6044846f}, {128.17691f, 74.5767441f}, {128.75383f, 74.5233994f}, {129.33075f, 74.4700623f}}}
57seg=52 {{{129.33075f, 74.4700623f}, {129.487167f, 74.4555969f}, {129.643585f, 74.4411316f}, {129.800003f, 74.4271774f}}}
58seg=53 {{{129.800003f, 74.4271774f}, {130.08493f, 74.4017639f}, {130.369843f, 74.3696442f}, {130.65477f, 74.3375244f}}}
59seg=54 {{{130.65477f, 74.3375244f}, {131.10318f, 74.2869797f}, {131.55159f, 74.2364349f}, {132, 74.2120285f}}}
60seg=55 {{{132, 74.2120285f}, {132.682098f, 74.1748962f}, {133.364182f, 74.1806335f}, {134.04628f, 74.1863708f}}}
61seg=56 {{{134.04628f, 74.1863708f}, {134.199997f, 74.1876526f}}}
62seg=57 {{{134.199997f, 74.1876526f}, {134.740479f, 74.1920013f}, {135.28096f, 74.2102814f}, {135.821426f, 74.2285538f}}}
63seg=58 {{{135.821426f, 74.2285538f}, {136.014282f, 74.2350769f}, {136.207138f, 74.2416f}, {136.399994f, 74.2474899f}}}
64seg=59 {{{136.399994f, 74.2474899f}, {136.723831f, 74.2573776f}, {137.047668f, 74.2692032f}, {137.371506f, 74.2810364f}}}
65seg=60 {{{137.371506f, 74.2810364f}, {137.781006f, 74.2959976f}, {138.190506f, 74.3109589f}, {138.600006f, 74.3219833f}}}
66seg=61 {{{138.600006f, 74.3219833f}, {138.775055f, 74.3266983f}, {138.950119f, 74.3321457f}, {139.125183f, 74.3375931f}}}
67seg=62 {{{139.125183f, 74.3375931f}, {139.683456f, 74.3549652f}, {140.24173f, 74.3723373f}, {140.800003f, 74.3659744f}}}
68seg=63 {{{140.800003f, 74.3659744f}, {141.173523f, 74.3617172f}, {141.547028f, 74.3401871f}, {141.920547f, 74.3186493f}}}
69seg=64 {{{141.920547f, 74.3186493f}, {142.280365f, 74.297905f}, {142.640182f, 74.2771606f}, {143, 74.2718658f}}}
70seg=65 {{{143, 74.2718658f}, {143.733337f, 74.2610703f}, {144.46666f, 74.2575989f}, {145.199997f, 74.3011856f}}}
71seg=66 {{{145.199997f, 74.3011856f}, {145.574966f, 74.3234711f}, {145.949936f, 74.3711548f}, {146.32489f, 74.4188385f}}}
72seg=67 {{{146.32489f, 74.4188385f}, {146.683258f, 74.4644165f}, {147.041626f, 74.5099869f}, {147.399994f, 74.5333862f}}}
73seg=68 {{{147.399994f, 74.5333862f}, {148.133331f, 74.5812607f}, {148.866669f, 74.6018982f}, {149.600006f, 74.5884552f}}}
74seg=69 {{{149.600006f, 74.5884552f}, {149.982086f, 74.5814514f}, {150.364182f, 74.5504913f}, {150.746277f, 74.5195313f}}}
75seg=70 {{{150.746277f, 74.5195313f}, {151.097519f, 74.491066f}, {151.448761f, 74.4626007f}, {151.800003f, 74.4527512f}}}
76seg=71 {{{151.800003f, 74.4527512f}, {152.343307f, 74.4375076f}, {152.886597f, 74.4468765f}, {153.429901f, 74.4562454f}}}
77seg=72 {{{153.429901f, 74.4562454f}, {153.619934f, 74.4595261f}, {153.809967f, 74.4627991f}, {154, 74.4650269f}}}
78seg=73 {{{154, 74.4650269f}, {154.295746f, 74.4684906f}, {154.591476f, 74.4761581f}, {154.887222f, 74.4838257f}}}
79seg=74 {{{154.887222f, 74.4838257f}, {155.324814f, 74.4951782f}, {155.762405f, 74.5065308f}, {156.199997f, 74.5042419f}}}
80seg=75 {{{156.199997f, 74.5042419f}, {156.559143f, 74.5023651f}, {156.918289f, 74.487793f}, {157.27742f, 74.4732208f}}}
81seg=76 {{{157.27742f, 74.4732208f}, {157.651611f, 74.4580307f}, {158.025803f, 74.4428406f}, {158.399994f, 74.4420166f}}}
82seg=77 {{{158.399994f, 74.4420166f}, {159.133331f, 74.4403992f}, {159.866669f, 74.448494f}, {160.600006f, 74.4945221f}}}
83seg=78 {{{160.600006f, 74.4945221f}, {160.952393f, 74.5166473f}, {161.304794f, 74.5602722f}, {161.657196f, 74.6038971f}}}
84seg=79 {{{161.657196f, 74.6038971f}, {162.038132f, 74.6510468f}, {162.419067f, 74.698204f}, {162.800003f, 74.7182007f}}}
85seg=80 {{{162.800003f, 74.7182007f}, {163.53334f, 74.7566986f}, {164.266663f, 74.7636337f}, {165, 74.7255325f}}}
86seg=81 {{{165, 74.7255325f}, {165.356293f, 74.7070236f}, {165.712585f, 74.65802f}, {166.068878f, 74.6090164f}}}
87seg=82 {{{166.068878f, 74.6090164f}, {166.445923f, 74.5571594f}, {166.822952f, 74.5053024f}, {167.199997f, 74.4895782f}}}
88seg=83 {{{167.199997f, 74.4895782f}, {167.933334f, 74.4590073f}, {168.666672f, 74.4903488f}, {169.399994f, 74.5420837f}}}
89seg=84 {{{169.399994f, 74.5420837f}, {169.752808f, 74.5669785f}, {170.105621f, 74.6176682f}, {170.458435f, 74.6683578f}}}
90seg=85 {{{170.458435f, 74.6683578f}, {170.838959f, 74.7230225f}, {171.219482f, 74.7776947f}, {171.600006f, 74.8000031f}}}
91seg=86 {{{171.600006f, 74.8000031f}, {172.333328f, 74.8429871f}, {173.066666f, 74.8376999f}, {173.800003f, 74.8000031f}}}
92seg=87 {{{173.800003f, 74.8000031f}, {174.500809f, 74.7639694f}, {175.201599f, 74.6750717f}, {175.902405f, 74.5861664f}}}
93seg=88 {{{175.902405f, 74.5861664f}, {176, 74.5737915f}}}
94seg=89 {{{176, 74.5737915f}, {176.306427f, 74.5349655f}, {176.612839f, 74.4810333f}, {176.919266f, 74.4270935f}}}
95seg=90 {{{176.919266f, 74.4270935f}, {177.346176f, 74.3519516f}, {177.773087f, 74.2768097f}, {178.199997f, 74.2425385f}}}
96seg=91 {{{178.199997f, 74.2425385f}, {178.933334f, 74.18367f}, {179.666672f, 74.1942673f}, {180.399994f, 74.2205505f}}}
97seg=92 {{{180.399994f, 74.2205505f}, {180.822174f, 74.2356796f}, {181.244354f, 74.2772751f}, {181.666534f, 74.3188705f}}}
98seg=93 {{{181.666534f, 74.3188705f}, {181.977692f, 74.3495255f}, {182.288849f, 74.3801804f}, {182.600006f, 74.400238f}}}
99seg=94 {{{182.600006f, 74.400238f}, {183.153549f, 74.435936f}, {183.707108f, 74.4587555f}, {184.260666f, 74.481575f}}}
100seg=95 {{{184.260666f, 74.481575f}, {184.440445f, 74.4889832f}, {184.620224f, 74.4963913f}, {184.800003f, 74.5042419f}}}
101seg=96 {{{184.800003f, 74.5042419f}, {185.53334f, 74.5362625f}, {186.266663f, 74.5669022f}, {187, 74.5923843f}}}
102seg=97 {{{187, 74.5923843f}, {187.218643f, 74.5999832f}, {187.437286f, 74.6105118f}, {187.65593f, 74.6210403f}}}
103seg=98 {{{187.65593f, 74.6210403f}, {188.170624f, 74.6458359f}, {188.685303f, 74.6706314f}, {189.199997f, 74.6571732f}}}
104seg=99 {{{189.199997f, 74.6571732f}, {189.560562f, 74.6477432f}, {189.921127f, 74.6077042f}, {190.281693f, 74.5676651f}}}
105seg=100 {{{190.281693f, 74.5676651f}, {190.654465f, 74.526268f}, {191.027237f, 74.4848709f}, {191.399994f, 74.4773026f}}}
106seg=101 {{{191.399994f, 74.4773026f}, {191.942627f, 74.4662857f}, {192.48526f, 74.5001678f}, {193.027893f, 74.5340576f}}}
107seg=102 {{{193.027893f, 74.5340576f}, {193.218597f, 74.5459671f}, {193.409302f, 74.5578766f}, {193.600006f, 74.5678329f}}}
108seg=103 {{{193.600006f, 74.5678329f}, {193.897125f, 74.5833511f}, {194.19426f, 74.6063919f}, {194.491394f, 74.6294403f}}}
109seg=104 {{{194.491394f, 74.6294403f}, {194.927597f, 74.663269f}, {195.3638f, 74.6970978f}, {195.800003f, 74.7071152f}}}
110seg=105 {{{195.800003f, 74.7071152f}, {196.363327f, 74.7200546f}, {196.926636f, 74.7021637f}, {197.48996f, 74.6842728f}}}
111seg=106 {{{197.48996f, 74.6842728f}, {197.659973f, 74.6788712f}, {197.829987f, 74.6734695f}, {198, 74.6689148f}}}
112seg=107 {{{198, 74.6689148f}, {198.539948f, 74.6544571f}, {199.07988f, 74.6331635f}, {199.619827f, 74.6118698f}}}
113seg=108 {{{199.619827f, 74.6118698f}, {199.813217f, 74.6042404f}, {200.006607f, 74.596611f}, {200.199997f, 74.5892944f}}}
114seg=109 {{{200.199997f, 74.5892944f}, {200.468765f, 74.5791321f}, {200.737534f, 74.5671921f}, {201.006287f, 74.5552597f}}}
115seg=110 {{{201.006287f, 74.5552597f}, {201.470856f, 74.5346298f}, {201.935425f, 74.5139999f}, {202.399994f, 74.5025177f}}}
116seg=111 {{{202.399994f, 74.5025177f}, {202.888885f, 74.4904327f}, {203.377777f, 74.4879456f}, {203.866669f, 74.4854507f}}}
117seg=112 {{{203.866669f, 74.4854507f}, {204.111115f, 74.4842072f}, {204.35556f, 74.4829636f}, {204.600006f, 74.4805222f}}}
118seg=113 {{{204.600006f, 74.4805222f}, {204.84462f, 74.4780731f}, {205.089233f, 74.476059f}, {205.333847f, 74.4740448f}}}
119seg=114 {{{205.333847f, 74.4740448f}, {205.822556f, 74.4700241f}, {206.311279f, 74.4659958f}, {206.800003f, 74.4585342f}}}
120seg=115 {{{206.800003f, 74.4585342f}, {207.53334f, 74.4473343f}, {208.266663f, 74.4324722f}, {209, 74.413353f}}}
121seg=116 {{{209, 74.413353f}, {209.350708f, 74.404213f}, {209.701416f, 74.3919983f}, {210.052124f, 74.3797836f}}}
122seg=117 {{{210.052124f, 74.3797836f}, {210.434753f, 74.3664627f}, {210.817368f, 74.3531418f}, {211.199997f, 74.3438034f}}}
123seg=118 {{{211.199997f, 74.3438034f}, {211.933334f, 74.3259048f}, {212.666672f, 74.3128586f}, {213.399994f, 74.305954f}}}
124seg=119 {{{213.399994f, 74.305954f}, {214.133331f, 74.2990494f}, {214.866669f, 74.2958145f}, {215.600006f, 74.3023758f}}}
125seg=120 {{{215.600006f, 74.3023758f}, {216.076187f, 74.3066406f}, {216.552383f, 74.317627f}, {217.02858f, 74.3286133f}}}
126seg=121 {{{217.02858f, 74.3286133f}, {217.285721f, 74.334549f}, {217.542862f, 74.340477f}, {217.800003f, 74.3453522f}}}
127seg=122 {{{217.800003f, 74.3453522f}, {218.041779f, 74.3499298f}, {218.283554f, 74.358696f}, {218.52533f, 74.3674622f}}}
128seg=123 {{{218.52533f, 74.3674622f}, {219.016891f, 74.3852844f}, {219.508438f, 74.4031067f}, {220, 74.3857574f}}}
129seg=124 {{{220, 74.3857574f}, {220.409988f, 74.3712845f}, {220.819977f, 74.3263474f}, {221.229965f, 74.2814102f}}}
130seg=125 {{{221.229965f, 74.2814102f}, {221.553314f, 74.2459717f}, {221.876648f, 74.2105331f}, {222.199997f, 74.190033f}}}
131seg=126 {{{222.199997f, 74.190033f}, {222.933334f, 74.1435471f}, {223.666672f, 74.1037674f}, {224.399994f, 74.1068344f}}}
132seg=127 {{{224.399994f, 74.1068344f}, {224.885803f, 74.1088638f}, {225.371613f, 74.1381073f}, {225.857422f, 74.1673508f}}}
133seg=128 {{{225.857422f, 74.1673508f}, {226.10495f, 74.182251f}, {226.352478f, 74.1971512f}, {226.600006f, 74.2084503f}}}
134seg=129 {{{226.600006f, 74.2084503f}, {226.839722f, 74.2193909f}, {227.079437f, 74.2324677f}, {227.319153f, 74.2455521f}}}
135seg=130 {{{227.319153f, 74.2455521f}, {227.812759f, 74.2724838f}, {228.306381f, 74.2994156f}, {228.800003f, 74.3076782f}}}
136seg=131 {{{228.800003f, 74.3076782f}, {229.309921f, 74.3162155f}, {229.819824f, 74.3054352f}, {230.329742f, 74.2946548f}}}
137seg=132 {{{230.329742f, 74.2946548f}, {230.553162f, 74.2899323f}, {230.776581f, 74.2852097f}, {231, 74.2821121f}}}
138seg=133 {{{231, 74.2821121f}, {231.290405f, 74.2780838f}, {231.580811f, 74.2724228f}, {231.871216f, 74.2667542f}}}
139seg=134 {{{231.871216f, 74.2667542f}, {232.314148f, 74.2581177f}, {232.757065f, 74.2494812f}, {233.199997f, 74.2466507f}}}
140seg=135 {{{233.199997f, 74.2466507f}, {233.343719f, 74.2457352f}, {233.487442f, 74.2448959f}, {233.631165f, 74.2442474f}}}
141seg=136 {{{233.631165f, 74.2442474f}, {234.220779f, 74.2415924f}, {234.810394f, 74.2421951f}, {235.399994f, 74.2539825f}}}
142seg=137 {{{235.399994f, 74.2539825f}, {235.845032f, 74.2628784f}, {236.29007f, 74.2817612f}, {236.735107f, 74.3006439f}}}
143seg=138 {{{236.735107f, 74.3006439f}, {237.023407f, 74.3128738f}, {237.311707f, 74.3251038f}, {237.600006f, 74.3346176f}}}
144seg=139 {{{237.600006f, 74.3346176f}, {238.333328f, 74.3588257f}, {239.066666f, 74.3803329f}, {239.800003f, 74.3992233f}}}
145seg=140 {{{239.800003f, 74.3992233f}, {240.082169f, 74.4064941f}, {240.364334f, 74.4108353f}, {240.6465f, 74.4151764f}}}
146seg=141 {{{240.6465f, 74.4151764f}, {241.097672f, 74.4221191f}, {241.548828f, 74.4290695f}, {242, 74.4479828f}}}
147seg=142 {{{242, 74.4479828f}, {242.416458f, 74.4654388f}, {242.832916f, 74.4942093f}, {243.249374f, 74.5229874f}}}
148seg=143 {{{243.249374f, 74.5229874f}, {243.566254f, 74.5448837f}, {243.883118f, 74.5667801f}, {244.199997f, 74.5836868f}}}
149seg=144 {{{244.199997f, 74.5836868f}, {244.933334f, 74.6228104f}, {245.666672f, 74.6546402f}, {246.399994f, 74.6827393f}}}
150seg=145 {{{246.399994f, 74.6827393f}, {247.133331f, 74.7108383f}, {247.866669f, 74.7327499f}, {248.600006f, 74.7522964f}}}
151seg=146 {{{248.600006f, 74.7522964f}, {248.714218f, 74.7553406f}}}
152seg=147 {{{248.714218f, 74.7553406f}, {249.40947f, 74.7739029f}, {250.104736f, 74.7924576f}, {250.800003f, 74.8000031f}}}
153seg=148 {{{250.800003f, 74.8000031f}, {251.288895f, 74.8053055f}, {251.777771f, 74.8035355f}, {252.266663f, 74.8017731f}}}
154seg=149 {{{252.266663f, 74.8017731f}, {252.511108f, 74.8008881f}, {252.755554f, 74.8000031f}, {253, 74.8000031f}}}
155seg=150 {{{253, 74.8000031f}, {68.1999969f, 74.8000031f}}}
156op union
157seg=151 {{{68.1999969f, 74.8000031f}, {68.4444427f, 74.8000031f}, {68.6888885f, 74.7961044f}, {68.9333344f, 74.7922058f}}}
158seg=152 {{{68.9333344f, 74.7922058f}, {69.422226f, 74.7844086f}, {69.9111099f, 74.7766113f}, {70.4000015f, 74.8000031f}}}
159seg=153 {{{70.4000015f, 74.8000031f}, {70.7796326f, 74.8181686f}, {71.1592636f, 74.8627396f}, {71.5388947f, 74.9073105f}}}
160seg=154 {{{71.5388947f, 74.9073105f}, {71.8925934f, 74.9488373f}, {72.2462997f, 74.9903641f}, {72.5999985f, 75.0105362f}}}
161seg=155 {{{72.5999985f, 75.0105362f}, {73.1301117f, 75.0407715f}, {73.6602249f, 75.0435104f}, {74.1903381f, 75.0462494f}}}
162seg=156 {{{74.1903381f, 75.0462494f}, {74.3935623f, 75.0472946f}, {74.5967789f, 75.0483398f}, {74.8000031f, 75.0509415f}}}
163seg=157 {{{74.8000031f, 75.0509415f}, {75.0211792f, 75.053772f}, {75.242363f, 75.0601425f}, {75.4635391f, 75.0665054f}}}
164seg=158 {{{75.4635391f, 75.0665054f}, {75.9756927f, 75.0812454f}, {76.4878464f, 75.0959854f}, {77, 75.0667953f}}}
165seg=159 {{{77, 75.0667953f}, {77.3702316f, 75.0456924f}, {77.7404709f, 74.9892731f}, {78.1107025f, 74.9328461f}}}
166seg=160 {{{78.1107025f, 74.9328461f}, {78.4738007f, 74.8775101f}, {78.8368988f, 74.8221741f}, {79.1999969f, 74.8001556f}}}
167seg=161 {{{79.1999969f, 74.8001556f}, {79.689003f, 74.7705002f}, {80.1780014f, 74.7803421f}, {80.6670074f, 74.790184f}}}
168seg=162 {{{80.6670074f, 74.790184f}, {80.9113388f, 74.7950974f}, {81.1556702f, 74.8000107f}, {81.4000015f, 74.8000031f}}}
169seg=163 {{{81.4000015f, 74.8000031f}, {81.6438522f, 74.7999954f}, {81.8877106f, 74.7989426f}, {82.1315613f, 74.7978897f}}}
170seg=164 {{{82.1315613f, 74.7978897f}, {82.6210403f, 74.7957764f}, {83.1105194f, 74.7936554f}, {83.5999985f, 74.8000031f}}}
171seg=165 {{{83.5999985f, 74.8000031f}, {83.9259109f, 74.8042297f}, {84.2518234f, 74.8159714f}, {84.5777359f, 74.827713f}}}
172seg=166 {{{84.5777359f, 74.827713f}, {84.9851608f, 74.842392f}, {85.3925781f, 74.8570709f}, {85.8000031f, 74.8570709f}}}
173seg=167 {{{85.8000031f, 74.8570709f}, {86.2074203f, 74.8570709f}, {86.6148453f, 74.842392f}, {87.0222626f, 74.827713f}}}
174seg=168 {{{87.0222626f, 74.827713f}, {87.348175f, 74.8159714f}, {87.6740875f, 74.8042297f}, {88, 74.8000031f}}}
175seg=169 {{{88, 74.8000031f}, {88.1576462f, 74.7979584f}, {88.3152924f, 74.7951202f}, {88.4729385f, 74.7922745f}}}
176seg=170 {{{88.4729385f, 74.7922745f}, {89.0486221f, 74.7818985f}, {89.6243134f, 74.7715225f}, {90.1999969f, 74.8000031f}}}
177seg=171 {{{90.1999969f, 74.8000031f}, {90.5620499f, 74.8179169f}, {90.9241028f, 74.8630524f}, {91.2861557f, 74.9081879f}}}
178seg=172 {{{91.2861557f, 74.9081879f}, {91.6574402f, 74.9544754f}, {92.028717f, 75.0007629f}, {92.4000015f, 75.0176926f}}}
179seg=173 {{{92.4000015f, 75.0176926f}, {92.9111481f, 75.0410004f}, {93.4223022f, 75.0278778f}, {93.9334488f, 75.0147552f}}}
180seg=174 {{{93.9334488f, 75.0147552f}, {94.155632f, 75.0090561f}, {94.3778152f, 75.0033493f}, {94.5999985f, 75.0006409f}}}
181seg=175 {{{94.5999985f, 75.0006409f}, {94.8669891f, 74.9973831f}, {95.1339798f, 74.9889908f}, {95.4009705f, 74.9806061f}}}
182seg=176 {{{95.4009705f, 74.9806061f}, {95.8673172f, 74.9659576f}, {96.3336563f, 74.9513092f}, {96.8000031f, 74.9639893f}}}
183seg=177 {{{96.8000031f, 74.9639893f}, {97.2396164f, 74.9759521f}, {97.6792297f, 75.0139465f}, {98.1188431f, 75.0519409f}}}
184seg=178 {{{98.1188431f, 75.0519409f}, {98.4125595f, 75.0773239f}, {98.7062836f, 75.1027069f}, {99, 75.1203232f}}}
185seg=179 {{{99, 75.1203232f}, {99.7333298f, 75.1643066f}, {100.466667f, 75.2075195f}, {101.199997f, 75.2278976f}}}
186seg=180 {{{101.199997f, 75.2278976f}, {101.6632f, 75.2407608f}, {102.126396f, 75.2405472f}, {102.5896f, 75.2403336f}}}
187seg=181 {{{102.5896f, 75.2403336f}, {102.859734f, 75.2402115f}, {103.129868f, 75.2400894f}, {103.400002f, 75.2425613f}}}
188seg=182 {{{103.400002f, 75.2425613f}, {103.499123f, 75.2434692f}, {103.598244f, 75.2443542f}, {103.697365f, 75.2452393f}}}
189seg=183 {{{103.697365f, 75.2452393f}, {104.331573f, 75.250885f}, {104.96579f, 75.2565308f}, {105.599998f, 75.2681274f}}}
190seg=184 {{{105.599998f, 75.2681274f}, {105.951164f, 75.2745514f}, {106.30233f, 75.2846603f}, {106.653496f, 75.2947693f}}}
191seg=185 {{{106.653496f, 75.2947693f}, {107.035667f, 75.3057709f}, {107.417831f, 75.3167725f}, {107.800003f, 75.3230209f}}}
192seg=186 {{{107.800003f, 75.3230209f}, {107.904305f, 75.3247223f}, {108.008606f, 75.3265228f}, {108.112907f, 75.3283234f}}}
193seg=187 {{{108.112907f, 75.3283234f}, {108.741936f, 75.33918f}, {109.370972f, 75.350029f}, {110, 75.340065f}}}
194seg=188 {{{110, 75.340065f}, {110.73333f, 75.3284454f}, {111.466667f, 75.2919846f}, {112.199997f, 75.2532883f}}}
195seg=189 {{{112.199997f, 75.2532883f}, {112.524193f, 75.2361755f}, {112.848389f, 75.2113037f}, {113.172585f, 75.1864319f}}}
196seg=190 {{{113.172585f, 75.1864319f}, {113.581726f, 75.1550446f}, {113.99086f, 75.1236496f}, {114.400002f, 75.1078644f}}}
197seg=191 {{{114.400002f, 75.1078644f}, {115.133331f, 75.079567f}, {115.866669f, 75.0734863f}, {116.599998f, 75.0834885f}}}
198seg=192 {{{116.599998f, 75.0834885f}, {117.013039f, 75.089119f}, {117.426071f, 75.1088409f}, {117.839111f, 75.1285629f}}}
199seg=193 {{{117.839111f, 75.1285629f}, {118.159409f, 75.1438599f}, {118.479706f, 75.1591568f}, {118.800003f, 75.1678772f}}}
200seg=194 {{{118.800003f, 75.1678772f}, {118.915619f, 75.1710281f}, {119.031235f, 75.1743622f}, {119.146851f, 75.1776962f}}}
201seg=195 {{{119.146851f, 75.1776962f}, {119.764565f, 75.1954956f}, {120.382286f, 75.2133026f}, {121, 75.2033386f}}}
202seg=196 {{{121, 75.2033386f}, {121.552635f, 75.1944351f}, {122.105278f, 75.1614532f}, {122.657913f, 75.1284714f}}}
203seg=197 {{{122.657913f, 75.1284714f}, {122.838608f, 75.1176834f}, {123.019302f, 75.1068954f}, {123.199997f, 75.0969543f}}}
204seg=198 {{{123.199997f, 75.0969543f}, {123.480431f, 75.0815277f}, {123.760864f, 75.060524f}, {124.041298f, 75.0395203f}}}
205seg=199 {{{124.041298f, 75.0395203f}, {124.494202f, 75.0056076f}, {124.947098f, 74.9716949f}, {125.400002f, 74.9612503f}}}
206seg=200 {{{125.400002f, 74.9612503f}, {126.133331f, 74.9443436f}, {126.866669f, 74.9602585f}, {127.599998f, 74.9955215f}}}
207seg=201 {{{127.599998f, 74.9955215f}, {128.17691f, 75.023262f}, {128.75383f, 75.0766068f}, {129.33075f, 75.1299438f}}}
208seg=202 {{{129.33075f, 75.1299438f}, {129.487167f, 75.1444092f}, {129.643585f, 75.1588745f}, {129.800003f, 75.1728287f}}}
209seg=203 {{{129.800003f, 75.1728287f}, {130.08493f, 75.1982422f}, {130.369843f, 75.2303619f}, {130.65477f, 75.2624817f}}}
210seg=204 {{{130.65477f, 75.2624817f}, {131.10318f, 75.3130264f}, {131.55159f, 75.3635712f}, {132, 75.3879776f}}}
211seg=205 {{{132, 75.3879776f}, {132.682098f, 75.4251099f}, {133.364182f, 75.4193726f}, {134.04628f, 75.4136353f}}}
212seg=206 {{{134.04628f, 75.4136353f}, {134.199997f, 75.4123535f}}}
213seg=207 {{{134.199997f, 75.4123535f}, {134.740479f, 75.4080048f}, {135.28096f, 75.3897247f}, {135.821426f, 75.3714523f}}}
214seg=208 {{{135.821426f, 75.3714523f}, {136.014282f, 75.3649292f}, {136.207138f, 75.3584061f}, {136.399994f, 75.3525162f}}}
215seg=209 {{{136.399994f, 75.3525162f}, {136.723831f, 75.3426285f}, {137.047668f, 75.3308029f}, {137.371506f, 75.3189697f}}}
216seg=210 {{{137.371506f, 75.3189697f}, {137.781006f, 75.3040085f}, {138.190506f, 75.2890472f}, {138.600006f, 75.2780228f}}}
217seg=211 {{{138.600006f, 75.2780228f}, {138.775055f, 75.2733078f}, {138.950119f, 75.2678604f}, {139.125183f, 75.262413f}}}
218seg=212 {{{139.125183f, 75.262413f}, {139.683456f, 75.2450409f}, {140.24173f, 75.2276688f}, {140.800003f, 75.2340317f}}}
219seg=213 {{{140.800003f, 75.2340317f}, {141.173523f, 75.2382889f}, {141.547028f, 75.259819f}, {141.920547f, 75.2813568f}}}
220seg=214 {{{141.920547f, 75.2813568f}, {142.280365f, 75.3021011f}, {142.640182f, 75.3228455f}, {143, 75.3281403f}}}
221seg=215 {{{143, 75.3281403f}, {143.733337f, 75.3389359f}, {144.46666f, 75.3424072f}, {145.199997f, 75.2988205f}}}
222seg=216 {{{145.199997f, 75.2988205f}, {145.574966f, 75.276535f}, {145.949936f, 75.2288513f}, {146.32489f, 75.1811676f}}}
223seg=217 {{{146.32489f, 75.1811676f}, {146.683258f, 75.1355896f}, {147.041626f, 75.0900192f}, {147.399994f, 75.0666199f}}}
224seg=218 {{{147.399994f, 75.0666199f}, {148.133331f, 75.0187454f}, {148.866669f, 74.9981079f}, {149.600006f, 75.0115509f}}}
225seg=219 {{{149.600006f, 75.0115509f}, {149.982086f, 75.0185547f}, {150.364182f, 75.0495148f}, {150.746277f, 75.0804749f}}}
226seg=220 {{{150.746277f, 75.0804749f}, {151.097519f, 75.1089401f}, {151.448761f, 75.1374054f}, {151.800003f, 75.1472549f}}}
227seg=221 {{{151.800003f, 75.1472549f}, {152.343307f, 75.1624985f}, {152.886597f, 75.1531296f}, {153.429901f, 75.1437607f}}}
228seg=222 {{{153.429901f, 75.1437607f}, {153.619934f, 75.14048f}, {153.809967f, 75.137207f}, {154, 75.1349792f}}}
229seg=223 {{{154, 75.1349792f}, {154.295746f, 75.1315155f}, {154.591476f, 75.123848f}, {154.887222f, 75.1161804f}}}
230seg=224 {{{154.887222f, 75.1161804f}, {155.324814f, 75.1048279f}, {155.762405f, 75.0934753f}, {156.199997f, 75.0957642f}}}
231seg=225 {{{156.199997f, 75.0957642f}, {156.559143f, 75.097641f}, {156.918289f, 75.1122131f}, {157.27742f, 75.1267853f}}}
232seg=226 {{{157.27742f, 75.1267853f}, {157.651611f, 75.1419754f}, {158.025803f, 75.1571655f}, {158.399994f, 75.1579895f}}}
233seg=227 {{{158.399994f, 75.1579895f}, {159.133331f, 75.1596069f}, {159.866669f, 75.1515121f}, {160.600006f, 75.105484f}}}
234seg=228 {{{160.600006f, 75.105484f}, {160.952393f, 75.0833588f}, {161.304794f, 75.0397339f}, {161.657196f, 74.996109f}}}
235seg=229 {{{161.657196f, 74.996109f}, {162.038132f, 74.9489594f}, {162.419067f, 74.9018021f}, {162.800003f, 74.8818054f}}}
236seg=230 {{{162.800003f, 74.8818054f}, {163.53334f, 74.8433075f}, {164.266663f, 74.8363724f}, {165, 74.8744736f}}}
237seg=231 {{{165, 74.8744736f}, {165.356293f, 74.8929825f}, {165.712585f, 74.9419861f}, {166.068878f, 74.9909897f}}}
238seg=232 {{{166.068878f, 74.9909897f}, {166.445923f, 75.0428467f}, {166.822952f, 75.0947037f}, {167.199997f, 75.1104279f}}}
239seg=233 {{{167.199997f, 75.1104279f}, {167.933334f, 75.1409988f}, {168.666672f, 75.1096573f}, {169.399994f, 75.0579224f}}}
240seg=234 {{{169.399994f, 75.0579224f}, {169.752808f, 75.0330276f}, {170.105621f, 74.982338f}, {170.458435f, 74.9316483f}}}
241seg=235 {{{170.458435f, 74.9316483f}, {170.838959f, 74.8769836f}, {171.219482f, 74.8223114f}, {171.600006f, 74.8000031f}}}
242seg=236 {{{171.600006f, 74.8000031f}, {172.333328f, 74.757019f}, {173.066666f, 74.7623062f}, {173.800003f, 74.8000031f}}}
243seg=237 {{{173.800003f, 74.8000031f}, {174.500809f, 74.8360367f}, {175.201599f, 74.9249344f}, {175.902405f, 75.0138397f}}}
244seg=238 {{{175.902405f, 75.0138397f}, {176, 75.0262146f}}}
245seg=239 {{{176, 75.0262146f}, {176.306427f, 75.0650406f}, {176.612839f, 75.1189728f}, {176.919266f, 75.1729126f}}}
246seg=240 {{{176.919266f, 75.1729126f}, {177.346176f, 75.2480545f}, {177.773087f, 75.3231964f}, {178.199997f, 75.3574677f}}}
247seg=241 {{{178.199997f, 75.3574677f}, {178.933334f, 75.4163361f}, {179.666672f, 75.4057388f}, {180.399994f, 75.3794556f}}}
248seg=242 {{{180.399994f, 75.3794556f}, {180.822174f, 75.3643265f}, {181.244354f, 75.322731f}, {181.666534f, 75.2811356f}}}
249seg=243 {{{181.666534f, 75.2811356f}, {181.977692f, 75.2504807f}, {182.288849f, 75.2198257f}, {182.600006f, 75.1997681f}}}
250seg=244 {{{182.600006f, 75.1997681f}, {183.153549f, 75.1640701f}, {183.707108f, 75.1412506f}, {184.260666f, 75.1184311f}}}
251seg=245 {{{184.260666f, 75.1184311f}, {184.440445f, 75.1110229f}, {184.620224f, 75.1036148f}, {184.800003f, 75.0957642f}}}
252seg=246 {{{184.800003f, 75.0957642f}, {185.53334f, 75.0637436f}, {186.266663f, 75.0331039f}, {187, 75.0076218f}}}
253seg=247 {{{187, 75.0076218f}, {187.218643f, 75.0000229f}, {187.437286f, 74.9894943f}, {187.65593f, 74.9789658f}}}
254seg=248 {{{187.65593f, 74.9789658f}, {188.170624f, 74.9541702f}, {188.685303f, 74.9293747f}, {189.199997f, 74.9428329f}}}
255seg=249 {{{189.199997f, 74.9428329f}, {189.560562f, 74.9522629f}, {189.921127f, 74.9923019f}, {190.281693f, 75.032341f}}}
256seg=250 {{{190.281693f, 75.032341f}, {190.654465f, 75.0737381f}, {191.027237f, 75.1151352f}, {191.399994f, 75.1227036f}}}
257seg=251 {{{191.399994f, 75.1227036f}, {191.942627f, 75.1337204f}, {192.48526f, 75.0998383f}, {193.027893f, 75.0659485f}}}
258seg=252 {{{193.027893f, 75.0659485f}, {193.218597f, 75.054039f}, {193.409302f, 75.0421295f}, {193.600006f, 75.0321732f}}}
259seg=253 {{{193.600006f, 75.0321732f}, {193.897125f, 75.016655f}, {194.19426f, 74.9936142f}, {194.491394f, 74.9705658f}}}
260seg=254 {{{194.491394f, 74.9705658f}, {194.927597f, 74.9367371f}, {195.3638f, 74.9029083f}, {195.800003f, 74.8928909f}}}
261seg=255 {{{195.800003f, 74.8928909f}, {196.363327f, 74.8799515f}, {196.926636f, 74.8978424f}, {197.48996f, 74.9157333f}}}
262seg=256 {{{197.48996f, 74.9157333f}, {197.659973f, 74.9211349f}, {197.829987f, 74.9265366f}, {198, 74.9310913f}}}
263seg=257 {{{198, 74.9310913f}, {198.539948f, 74.945549f}, {199.07988f, 74.9668427f}, {199.619827f, 74.9881363f}}}
264seg=258 {{{199.619827f, 74.9881363f}, {199.813217f, 74.9957657f}, {200.006607f, 75.0033951f}, {200.199997f, 75.0107117f}}}
265seg=259 {{{200.199997f, 75.0107117f}, {200.468765f, 75.020874f}, {200.737534f, 75.032814f}, {201.006287f, 75.0447464f}}}
266seg=260 {{{201.006287f, 75.0447464f}, {201.470856f, 75.0653763f}, {201.935425f, 75.0860062f}, {202.399994f, 75.0974884f}}}
267seg=261 {{{202.399994f, 75.0974884f}, {202.888885f, 75.1095734f}, {203.377777f, 75.1120605f}, {203.866669f, 75.1145554f}}}
268seg=262 {{{203.866669f, 75.1145554f}, {204.111115f, 75.115799f}, {204.35556f, 75.1170425f}, {204.600006f, 75.1194839f}}}
269seg=263 {{{204.600006f, 75.1194839f}, {204.84462f, 75.121933f}, {205.089233f, 75.1239471f}, {205.333847f, 75.1259613f}}}
270seg=264 {{{205.333847f, 75.1259613f}, {205.822556f, 75.129982f}, {206.311279f, 75.1340103f}, {206.800003f, 75.1414719f}}}
271seg=265 {{{206.800003f, 75.1414719f}, {207.53334f, 75.1526718f}, {208.266663f, 75.1675339f}, {209, 75.1866531f}}}
272seg=266 {{{209, 75.1866531f}, {209.350708f, 75.1957932f}, {209.701416f, 75.2080078f}, {210.052124f, 75.2202225f}}}
273seg=267 {{{210.052124f, 75.2202225f}, {210.434753f, 75.2335434f}, {210.817368f, 75.2468643f}, {211.199997f, 75.2562027f}}}
274seg=268 {{{211.199997f, 75.2562027f}, {211.933334f, 75.2741013f}, {212.666672f, 75.2871475f}, {213.399994f, 75.2940521f}}}
275seg=269 {{{213.399994f, 75.2940521f}, {214.133331f, 75.3009567f}, {214.866669f, 75.3041916f}, {215.600006f, 75.2976303f}}}
276seg=270 {{{215.600006f, 75.2976303f}, {216.076187f, 75.2933655f}, {216.552383f, 75.2823792f}, {217.02858f, 75.2713928f}}}
277seg=271 {{{217.02858f, 75.2713928f}, {217.285721f, 75.2654572f}, {217.542862f, 75.2595291f}, {217.800003f, 75.2546539f}}}
278seg=272 {{{217.800003f, 75.2546539f}, {218.041779f, 75.2500763f}, {218.283554f, 75.2413101f}, {218.52533f, 75.2325439f}}}
279seg=273 {{{218.52533f, 75.2325439f}, {219.016891f, 75.2147217f}, {219.508438f, 75.1968994f}, {220, 75.2142487f}}}
280seg=274 {{{220, 75.2142487f}, {220.409988f, 75.2287216f}, {220.819977f, 75.2736588f}, {221.229965f, 75.3185959f}}}
281seg=275 {{{221.229965f, 75.3185959f}, {221.553314f, 75.3540344f}, {221.876648f, 75.389473f}, {222.199997f, 75.4099731f}}}
282seg=276 {{{222.199997f, 75.4099731f}, {222.933334f, 75.456459f}, {223.666672f, 75.4962387f}, {224.399994f, 75.4931717f}}}
283seg=277 {{{224.399994f, 75.4931717f}, {224.885803f, 75.4911423f}, {225.371613f, 75.4618988f}, {225.857422f, 75.4326553f}}}
284seg=278 {{{225.857422f, 75.4326553f}, {226.10495f, 75.4177551f}, {226.352478f, 75.4028549f}, {226.600006f, 75.3915558f}}}
285seg=279 {{{226.600006f, 75.3915558f}, {226.839722f, 75.3806152f}, {227.079437f, 75.3675385f}, {227.319153f, 75.354454f}}}
286seg=280 {{{227.319153f, 75.354454f}, {227.812759f, 75.3275223f}, {228.306381f, 75.3005905f}, {228.800003f, 75.2923279f}}}
287seg=281 {{{228.800003f, 75.2923279f}, {229.309921f, 75.2837906f}, {229.819824f, 75.2945709f}, {230.329742f, 75.3053513f}}}
288seg=282 {{{230.329742f, 75.3053513f}, {230.553162f, 75.3100739f}, {230.776581f, 75.3147964f}, {231, 75.317894f}}}
289seg=283 {{{231, 75.317894f}, {231.290405f, 75.3219223f}, {231.580811f, 75.3275833f}, {231.871216f, 75.333252f}}}
290seg=284 {{{231.871216f, 75.333252f}, {232.314148f, 75.3418884f}, {232.757065f, 75.3505249f}, {233.199997f, 75.3533554f}}}
291seg=285 {{{233.199997f, 75.3533554f}, {233.933334f, 75.3580399f}, {234.666672f, 75.3606873f}, {235.399994f, 75.3460236f}}}
292seg=286 {{{235.399994f, 75.3460236f}, {235.845032f, 75.3371277f}, {236.29007f, 75.3182449f}, {236.735107f, 75.2993622f}}}
293seg=287 {{{236.735107f, 75.2993622f}, {237.023407f, 75.2871323f}, {237.311707f, 75.2749023f}, {237.600006f, 75.2653885f}}}
294seg=288 {{{237.600006f, 75.2653885f}, {238.333328f, 75.2411804f}, {239.066666f, 75.2196732f}, {239.800003f, 75.2007828f}}}
295seg=289 {{{239.800003f, 75.2007828f}, {240.082169f, 75.193512f}, {240.364334f, 75.1891708f}, {240.6465f, 75.1848297f}}}
296seg=290 {{{240.6465f, 75.1848297f}, {241.097672f, 75.177887f}, {241.548828f, 75.1709366f}, {242, 75.1520233f}}}
297seg=291 {{{242, 75.1520233f}, {242.416458f, 75.1345673f}, {242.832916f, 75.1057968f}, {243.249374f, 75.0770187f}}}
298seg=292 {{{243.249374f, 75.0770187f}, {243.566254f, 75.0551224f}, {243.883118f, 75.033226f}, {244.199997f, 75.0163193f}}}
299seg=293 {{{244.199997f, 75.0163193f}, {244.933334f, 74.9771957f}, {245.666672f, 74.9453659f}, {246.399994f, 74.9172668f}}}
300seg=294 {{{246.399994f, 74.9172668f}, {247.133331f, 74.8891678f}, {247.866669f, 74.8672562f}, {248.600006f, 74.8477097f}}}
301seg=295 {{{248.600006f, 74.8477097f}, {248.714218f, 74.8446655f}}}
302seg=296 {{{248.714218f, 74.8446655f}, {249.40947f, 74.8261032f}, {250.104736f, 74.8075485f}, {250.800003f, 74.8000031f}}}
303seg=297 {{{250.800003f, 74.8000031f}, {251.288895f, 74.7947006f}, {251.777771f, 74.7964706f}, {252.266663f, 74.798233f}}}
304seg=298 {{{252.266663f, 74.798233f}, {252.511108f, 74.799118f}, {252.755554f, 74.8000031f}, {253, 74.8000031f}}}
305seg=299 {{{253, 74.8000031f}, {68.1999969f, 74.8000031f}}}
306debugShowCubicIntersection wtTs[0]=1 {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.8039017}, {68.9333344,74.8078003}}} {{68.9333344,74.8078003}} wnTs[0]=0 {{{68.9333344,74.8078003}, {69.422226,74.8155975}, {69.9111099,74.8233948}, {70.4000015,74.8000031}}}
307debugShowCubicLineIntersection wtTs[0]=0 {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.8039017}, {68.9333344,74.8078003}}} {{68.1999969,74.8000031}} wnTs[0]=1 {{{253,74.8000031}, {68.1999969,74.8000031}}}
308debugShowCubicIntersection wtTs[0]=1 {{{68.9333344,74.8078003}, {69.422226,74.8155975}, {69.9111099,74.8233948}, {70.4000015,74.8000031}}} {{70.4000015,74.8000031}} wnTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.7818375}, {71.1592636,74.7372665}, {71.5388947,74.6926956}}}
309debugShowCubicLineIntersection wtTs[0]=1 {{{68.9333344,74.8078003}, {69.422226,74.8155975}, {69.9111099,74.8233948}, {70.4000015,74.8000031}}} {{70.4000015,74.8000031}} wnTs[0]=0.988095 {{{253,74.8000031}, {68.1999969,74.8000031}}}
310SkOpSegment::addT insert t=0.988095214 segID=150 spanID=599
311debugShowCubicIntersection wtTs[0]=1 {{{70.4000015,74.8000031}, {70.7796326,74.7818375}, {71.1592636,74.7372665}, {71.5388947,74.6926956}}} {{71.5388947,74.6926956}} wnTs[0]=0 {{{71.5388947,74.6926956}, {71.8925934,74.6511688}, {72.2462997,74.609642}, {72.5999985,74.5894699}}}
312debugShowCubicLineIntersection wtTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.7818375}, {71.1592636,74.7372665}, {71.5388947,74.6926956}}} {{70.4000015,74.8000031}} wnTs[0]=0.988095 {{{253,74.8000031}, {68.1999969,74.8000031}}}
313debugShowCubicIntersection wtTs[0]=1 {{{71.5388947,74.6926956}, {71.8925934,74.6511688}, {72.2462997,74.609642}, {72.5999985,74.5894699}}} {{72.5999985,74.5894699}} wnTs[0]=0 {{{72.5999985,74.5894699}, {73.1301117,74.5592346}, {73.6602249,74.5564957}, {74.1903381,74.5537567}}}
314debugShowCubicIntersection wtTs[0]=1 {{{72.5999985,74.5894699}, {73.1301117,74.5592346}, {73.6602249,74.5564957}, {74.1903381,74.5537567}}} {{74.1903381,74.5537567}} wnTs[0]=0 {{{74.1903381,74.5537567}, {74.3935623,74.5527115}, {74.5967789,74.5516663}, {74.8000031,74.5490646}}}
315debugShowCubicIntersection wtTs[0]=1 {{{74.1903381,74.5537567}, {74.3935623,74.5527115}, {74.5967789,74.5516663}, {74.8000031,74.5490646}}} {{74.8000031,74.5490646}} wnTs[0]=0 {{{74.8000031,74.5490646}, {75.0211792,74.5462341}, {75.242363,74.5398636}, {75.4635391,74.5335007}}}
316debugShowCubicIntersection wtTs[0]=1 {{{74.8000031,74.5490646}, {75.0211792,74.5462341}, {75.242363,74.5398636}, {75.4635391,74.5335007}}} {{75.4635391,74.5335007}} wnTs[0]=0 {{{75.4635391,74.5335007}, {75.9756927,74.5187607}, {76.4878464,74.5040207}, {77,74.5332108}}}
317debugShowCubicIntersection wtTs[0]=1 {{{75.4635391,74.5335007}, {75.9756927,74.5187607}, {76.4878464,74.5040207}, {77,74.5332108}}} {{77,74.5332108}} wnTs[0]=0 {{{77,74.5332108}, {77.3702316,74.5543137}, {77.7404709,74.610733}, {78.1107025,74.66716}}}
318debugShowCubicIntersection wtTs[0]=1 {{{77,74.5332108}, {77.3702316,74.5543137}, {77.7404709,74.610733}, {78.1107025,74.66716}}} {{78.1107025,74.66716}} wnTs[0]=0 {{{78.1107025,74.66716}, {78.4738007,74.722496}, {78.8368988,74.777832}, {79.1999969,74.7998505}}}
319debugShowCubicIntersection wtTs[0]=1 {{{78.1107025,74.66716}, {78.4738007,74.722496}, {78.8368988,74.777832}, {79.1999969,74.7998505}}} {{79.1999969,74.7998505}} wnTs[0]=0 {{{79.1999969,74.7998505}, {79.689003,74.8295059}, {80.1780014,74.819664}, {80.6670074,74.8098221}}}
320debugShowCubicIntersection wtTs[0]=1 {{{79.1999969,74.7998505}, {79.689003,74.8295059}, {80.1780014,74.819664}, {80.6670074,74.8098221}}} {{80.6670074,74.8098221}} wnTs[0]=0 {{{80.6670074,74.8098221}, {80.9113388,74.8049088}, {81.1556702,74.7999954}, {81.4000015,74.8000031}}}
321debugShowCubicLineIntersection wtTs[0]=0.0017190524 {{{79.1999969,74.7998505}, {79.689003,74.8295059}, {80.1780014,74.819664}, {80.6670074,74.8098221}}} {{79.2025223,74.8000031}} wnTs[0]=0.940463 {{{253,74.8000031}, {68.1999969,74.8000031}}}
322SkOpSegment::addT insert t=0.0017190524 segID=11 spanID=600
323SkOpSegment::addT insert t=0.940462545 segID=150 spanID=601
324debugShowCubicIntersection wtTs[0]=1 {{{80.6670074,74.8098221}, {80.9113388,74.8049088}, {81.1556702,74.7999954}, {81.4000015,74.8000031}}} {{81.4000015,74.8000031}} wnTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.8000107}, {81.8877106,74.8010635}, {82.1315613,74.8021164}}}
325debugShowCubicLineIntersection wtTs[0]=0.99844881 {{{80.6670074,74.8098221}, {80.9113388,74.8049088}, {81.1556702,74.7999954}, {81.4000015,74.8000031}}} {{81.3988647,74.8000031}} wtTs[1]=1 {{81.4000015,74.8000031}} wnTs[0]=0.928578 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=0.928571405
326SkOpSegment::addT insert t=0.99844881 segID=12 spanID=602
327SkOpSegment::addT insert t=0.928577558 segID=150 spanID=603
328SkOpSegment::addT insert t=0.928571405 segID=150 spanID=604
329debugShowCubicIntersection wtTs[0]=1 {{{81.4000015,74.8000031}, {81.6438522,74.8000107}, {81.8877106,74.8010635}, {82.1315613,74.8021164}}} {{82.1315613,74.8021164}} wnTs[0]=0 {{{82.1315613,74.8021164}, {82.6210403,74.8042297}, {83.1105194,74.8063507}, {83.5999985,74.8000031}}}
330debugShowCubicLineIntersection wtTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.8000107}, {81.8877106,74.8010635}, {82.1315613,74.8021164}}} {{81.4000015,74.8000031}} wnTs[0]=0.928571 {{{253,74.8000031}, {68.1999969,74.8000031}}}
331debugShowCubicIntersection wtTs[0]=1 {{{82.1315613,74.8021164}, {82.6210403,74.8042297}, {83.1105194,74.8063507}, {83.5999985,74.8000031}}} {{83.5999985,74.8000031}} wnTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.7957764}, {84.2518234,74.7840347}, {84.5777359,74.7722931}}}
332debugShowCubicLineIntersection wtTs[0]=1 {{{82.1315613,74.8021164}, {82.6210403,74.8042297}, {83.1105194,74.8063507}, {83.5999985,74.8000031}}} {{83.5999985,74.8000031}} wnTs[0]=0.916667 {{{253,74.8000031}, {68.1999969,74.8000031}}}
333SkOpSegment::addT insert t=0.91666666 segID=150 spanID=605
334debugShowCubicIntersection wtTs[0]=1 {{{83.5999985,74.8000031}, {83.9259109,74.7957764}, {84.2518234,74.7840347}, {84.5777359,74.7722931}}} {{84.5777359,74.7722931}} wnTs[0]=0 {{{84.5777359,74.7722931}, {84.9851608,74.7576141}, {85.3925781,74.7429352}, {85.8000031,74.7429352}}}
335debugShowCubicLineIntersection wtTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.7957764}, {84.2518234,74.7840347}, {84.5777359,74.7722931}}} {{83.5999985,74.8000031}} wnTs[0]=0.916667 {{{253,74.8000031}, {68.1999969,74.8000031}}}
336debugShowCubicIntersection wtTs[0]=1 {{{84.5777359,74.7722931}, {84.9851608,74.7576141}, {85.3925781,74.7429352}, {85.8000031,74.7429352}}} {{85.8000031,74.7429352}} wnTs[0]=0 {{{85.8000031,74.7429352}, {86.2074203,74.7429352}, {86.6148453,74.7576141}, {87.0222626,74.7722931}}}
337debugShowCubicIntersection wtTs[0]=1 {{{85.8000031,74.7429352}, {86.2074203,74.7429352}, {86.6148453,74.7576141}, {87.0222626,74.7722931}}} {{87.0222626,74.7722931}} wnTs[0]=0 {{{87.0222626,74.7722931}, {87.348175,74.7840347}, {87.6740875,74.7957764}, {88,74.8000031}}}
338debugShowCubicIntersection wtTs[0]=1 {{{87.0222626,74.7722931}, {87.348175,74.7840347}, {87.6740875,74.7957764}, {88,74.8000031}}} {{88,74.8000031}} wnTs[0]=0 {{{88,74.8000031}, {88.1576462,74.8020477}, {88.3152924,74.8048859}, {88.4729385,74.8077316}}}
339debugShowCubicLineIntersection wtTs[0]=1 {{{87.0222626,74.7722931}, {87.348175,74.7840347}, {87.6740875,74.7957764}, {88,74.8000031}}} {{88,74.8000031}} wnTs[0]=0.892857 {{{253,74.8000031}, {68.1999969,74.8000031}}}
340SkOpSegment::addT insert t=0.892857128 segID=150 spanID=606
341debugShowCubicIntersection wtTs[0]=1 {{{88,74.8000031}, {88.1576462,74.8020477}, {88.3152924,74.8048859}, {88.4729385,74.8077316}}} {{88.4729385,74.8077316}} wnTs[0]=0 {{{88.4729385,74.8077316}, {89.0486221,74.8181076}, {89.6243134,74.8284836}, {90.1999969,74.8000031}}}
342debugShowCubicLineIntersection wtTs[0]=0 {{{88,74.8000031}, {88.1576462,74.8020477}, {88.3152924,74.8048859}, {88.4729385,74.8077316}}} {{88,74.8000031}} wnTs[0]=0.892857 {{{253,74.8000031}, {68.1999969,74.8000031}}}
343debugShowCubicIntersection wtTs[0]=1 {{{88.4729385,74.8077316}, {89.0486221,74.8181076}, {89.6243134,74.8284836}, {90.1999969,74.8000031}}} {{90.1999969,74.8000031}} wnTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.7820892}, {90.9241028,74.7369537}, {91.2861557,74.6918182}}}
344debugShowCubicLineIntersection wtTs[0]=1 {{{88.4729385,74.8077316}, {89.0486221,74.8181076}, {89.6243134,74.8284836}, {90.1999969,74.8000031}}} {{90.1999969,74.8000031}} wnTs[0]=0.880952 {{{253,74.8000031}, {68.1999969,74.8000031}}}
345SkOpSegment::addT insert t=0.880952383 segID=150 spanID=607
346debugShowCubicIntersection wtTs[0]=1 {{{90.1999969,74.8000031}, {90.5620499,74.7820892}, {90.9241028,74.7369537}, {91.2861557,74.6918182}}} {{91.2861557,74.6918182}} wnTs[0]=0 {{{91.2861557,74.6918182}, {91.6574402,74.6455307}, {92.028717,74.5992432}, {92.4000015,74.5823135}}}
347debugShowCubicLineIntersection wtTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.7820892}, {90.9241028,74.7369537}, {91.2861557,74.6918182}}} {{90.1999969,74.8000031}} wnTs[0]=0.880952 {{{253,74.8000031}, {68.1999969,74.8000031}}}
348debugShowCubicIntersection wtTs[0]=1 {{{91.2861557,74.6918182}, {91.6574402,74.6455307}, {92.028717,74.5992432}, {92.4000015,74.5823135}}} {{92.4000015,74.5823135}} wnTs[0]=0 {{{92.4000015,74.5823135}, {92.9111481,74.5590057}, {93.4223022,74.5721283}, {93.9334488,74.5852509}}}
349debugShowCubicIntersection wtTs[0]=1 {{{92.4000015,74.5823135}, {92.9111481,74.5590057}, {93.4223022,74.5721283}, {93.9334488,74.5852509}}} {{93.9334488,74.5852509}} wnTs[0]=0 {{{93.9334488,74.5852509}, {94.155632,74.59095}, {94.3778152,74.5966568}, {94.5999985,74.5993652}}}
350debugShowCubicIntersection wtTs[0]=1 {{{93.9334488,74.5852509}, {94.155632,74.59095}, {94.3778152,74.5966568}, {94.5999985,74.5993652}}} {{94.5999985,74.5993652}} wnTs[0]=0 {{{94.5999985,74.5993652}, {94.8669891,74.602623}, {95.1339798,74.6110153}, {95.4009705,74.6194}}}
351debugShowCubicIntersection wtTs[0]=1 {{{94.5999985,74.5993652}, {94.8669891,74.602623}, {95.1339798,74.6110153}, {95.4009705,74.6194}}} {{95.4009705,74.6194}} wnTs[0]=0 {{{95.4009705,74.6194}, {95.8673172,74.6340485}, {96.3336563,74.6486969}, {96.8000031,74.6360168}}}
352debugShowCubicIntersection wtTs[0]=1 {{{95.4009705,74.6194}, {95.8673172,74.6340485}, {96.3336563,74.6486969}, {96.8000031,74.6360168}}} {{96.8000031,74.6360168}} wnTs[0]=0 {{{96.8000031,74.6360168}, {97.2396164,74.624054}, {97.6792297,74.5860596}, {98.1188431,74.5480652}}}
353debugShowCubicIntersection wtTs[0]=1 {{{96.8000031,74.6360168}, {97.2396164,74.624054}, {97.6792297,74.5860596}, {98.1188431,74.5480652}}} {{98.1188431,74.5480652}} wnTs[0]=0 {{{98.1188431,74.5480652}, {98.4125595,74.5226822}, {98.7062836,74.4972992}, {99,74.4796829}}}
354debugShowCubicIntersection wtTs[0]=1 {{{98.1188431,74.5480652}, {98.4125595,74.5226822}, {98.7062836,74.4972992}, {99,74.4796829}}} {{99,74.4796829}} wnTs[0]=0 {{{99,74.4796829}, {99.7333298,74.4356995}, {100.466667,74.3924866}, {101.199997,74.3721085}}}
355debugShowCubicIntersection wtTs[0]=1 {{{99,74.4796829}, {99.7333298,74.4356995}, {100.466667,74.3924866}, {101.199997,74.3721085}}} {{101.199997,74.3721085}} wnTs[0]=0 {{{101.199997,74.3721085}, {101.6632,74.3592453}, {102.126396,74.3594589}, {102.5896,74.3596725}}}
356debugShowCubicIntersection wtTs[0]=1 {{{101.199997,74.3721085}, {101.6632,74.3592453}, {102.126396,74.3594589}, {102.5896,74.3596725}}} {{102.5896,74.3596725}} wnTs[0]=0 {{{102.5896,74.3596725}, {102.859734,74.3597946}, {103.129868,74.3599167}, {103.400002,74.3574448}}}
357debugShowCubicIntersection wtTs[0]=1 {{{102.5896,74.3596725}, {102.859734,74.3597946}, {103.129868,74.3599167}, {103.400002,74.3574448}}} {{103.400002,74.3574448}} wnTs[0]=0 {{{103.400002,74.3574448}, {103.499123,74.3565369}, {103.598244,74.3556519}, {103.697365,74.3547668}}}
358debugShowCubicIntersection wtTs[0]=1 {{{103.400002,74.3574448}, {103.499123,74.3565369}, {103.598244,74.3556519}, {103.697365,74.3547668}}} {{103.697365,74.3547668}} wnTs[0]=0 {{{103.697365,74.3547668}, {104.331573,74.3491211}, {104.96579,74.3434753}, {105.599998,74.3318787}}}
359debugShowCubicIntersection wtTs[0]=1 {{{103.697365,74.3547668}, {104.331573,74.3491211}, {104.96579,74.3434753}, {105.599998,74.3318787}}} {{105.599998,74.3318787}} wnTs[0]=0 {{{105.599998,74.3318787}, {105.951164,74.3254547}, {106.30233,74.3153458}, {106.653496,74.3052368}}}
360debugShowCubicIntersection wtTs[0]=1 {{{105.599998,74.3318787}, {105.951164,74.3254547}, {106.30233,74.3153458}, {106.653496,74.3052368}}} {{106.653496,74.3052368}} wnTs[0]=0 {{{106.653496,74.3052368}, {107.035667,74.2942352}, {107.417831,74.2832336}, {107.800003,74.2769852}}}
361debugShowCubicIntersection wtTs[0]=1 {{{106.653496,74.3052368}, {107.035667,74.2942352}, {107.417831,74.2832336}, {107.800003,74.2769852}}} {{107.800003,74.2769852}} wnTs[0]=0 {{{107.800003,74.2769852}, {107.904305,74.2752838}, {108.008606,74.2734833}, {108.112907,74.2716827}}}
362debugShowCubicIntersection wtTs[0]=1 {{{107.800003,74.2769852}, {107.904305,74.2752838}, {108.008606,74.2734833}, {108.112907,74.2716827}}} {{108.112907,74.2716827}} wnTs[0]=0 {{{108.112907,74.2716827}, {108.741936,74.2608261}, {109.370972,74.2499771}, {110,74.2599411}}}
363debugShowCubicIntersection wtTs[0]=1 {{{108.112907,74.2716827}, {108.741936,74.2608261}, {109.370972,74.2499771}, {110,74.2599411}}} {{110,74.2599411}} wnTs[0]=0 {{{110,74.2599411}, {110.73333,74.2715607}, {111.466667,74.3080215}, {112.199997,74.3467178}}}
364debugShowCubicIntersection wtTs[0]=1 {{{110,74.2599411}, {110.73333,74.2715607}, {111.466667,74.3080215}, {112.199997,74.3467178}}} {{112.199997,74.3467178}} wnTs[0]=0 {{{112.199997,74.3467178}, {112.524193,74.3638306}, {112.848389,74.3887024}, {113.172585,74.4135742}}}
365debugShowCubicIntersection wtTs[0]=1 {{{112.199997,74.3467178}, {112.524193,74.3638306}, {112.848389,74.3887024}, {113.172585,74.4135742}}} {{113.172585,74.4135742}} wnTs[0]=0 {{{113.172585,74.4135742}, {113.581726,74.4449615}, {113.99086,74.4763565}, {114.400002,74.4921417}}}
366debugShowCubicIntersection wtTs[0]=1 {{{113.172585,74.4135742}, {113.581726,74.4449615}, {113.99086,74.4763565}, {114.400002,74.4921417}}} {{114.400002,74.4921417}} wnTs[0]=0 {{{114.400002,74.4921417}, {115.133331,74.5204391}, {115.866669,74.5265198}, {116.599998,74.5165176}}}
367debugShowCubicIntersection wtTs[0]=1 {{{114.400002,74.4921417}, {115.133331,74.5204391}, {115.866669,74.5265198}, {116.599998,74.5165176}}} {{116.599998,74.5165176}} wnTs[0]=0 {{{116.599998,74.5165176}, {117.013039,74.5108871}, {117.426071,74.4911652}, {117.839111,74.4714432}}}
368debugShowCubicIntersection wtTs[0]=1 {{{116.599998,74.5165176}, {117.013039,74.5108871}, {117.426071,74.4911652}, {117.839111,74.4714432}}} {{117.839111,74.4714432}} wnTs[0]=0 {{{117.839111,74.4714432}, {118.159409,74.4561462}, {118.479706,74.4408493}, {118.800003,74.4321289}}}
369debugShowCubicIntersection wtTs[0]=1 {{{117.839111,74.4714432}, {118.159409,74.4561462}, {118.479706,74.4408493}, {118.800003,74.4321289}}} {{118.800003,74.4321289}} wnTs[0]=0 {{{118.800003,74.4321289}, {118.915619,74.428978}, {119.031235,74.4256439}, {119.146851,74.4223099}}}
370debugShowCubicIntersection wtTs[0]=1 {{{118.800003,74.4321289}, {118.915619,74.428978}, {119.031235,74.4256439}, {119.146851,74.4223099}}} {{119.146851,74.4223099}} wnTs[0]=0 {{{119.146851,74.4223099}, {119.764565,74.4045105}, {120.382286,74.3867035}, {121,74.3966675}}}
371debugShowCubicIntersection wtTs[0]=1 {{{119.146851,74.4223099}, {119.764565,74.4045105}, {120.382286,74.3867035}, {121,74.3966675}}} {{121,74.3966675}} wnTs[0]=0 {{{121,74.3966675}, {121.552635,74.405571}, {122.105278,74.4385529}, {122.657913,74.4715347}}}
372debugShowCubicIntersection wtTs[0]=1 {{{121,74.3966675}, {121.552635,74.405571}, {122.105278,74.4385529}, {122.657913,74.4715347}}} {{122.657913,74.4715347}} wnTs[0]=0 {{{122.657913,74.4715347}, {122.838608,74.4823227}, {123.019302,74.4931107}, {123.199997,74.5030518}}}
373debugShowCubicIntersection wtTs[0]=1 {{{122.657913,74.4715347}, {122.838608,74.4823227}, {123.019302,74.4931107}, {123.199997,74.5030518}}} {{123.199997,74.5030518}} wnTs[0]=0 {{{123.199997,74.5030518}, {123.480431,74.5184784}, {123.760864,74.5394821}, {124.041298,74.5604858}}}
374debugShowCubicIntersection wtTs[0]=1 {{{123.199997,74.5030518}, {123.480431,74.5184784}, {123.760864,74.5394821}, {124.041298,74.5604858}}} {{124.041298,74.5604858}} wnTs[0]=0 {{{124.041298,74.5604858}, {124.494202,74.5943985}, {124.947098,74.6283112}, {125.400002,74.6387558}}}
375debugShowCubicIntersection wtTs[0]=1 {{{124.041298,74.5604858}, {124.494202,74.5943985}, {124.947098,74.6283112}, {125.400002,74.6387558}}} {{125.400002,74.6387558}} wnTs[0]=0 {{{125.400002,74.6387558}, {126.133331,74.6556625}, {126.866669,74.6397476}, {127.599998,74.6044846}}}
376debugShowCubicIntersection wtTs[0]=1 {{{125.400002,74.6387558}, {126.133331,74.6556625}, {126.866669,74.6397476}, {127.599998,74.6044846}}} {{127.599998,74.6044846}} wnTs[0]=0 {{{127.599998,74.6044846}, {128.17691,74.5767441}, {128.75383,74.5233994}, {129.33075,74.4700623}}}
377debugShowCubicIntersection wtTs[0]=1 {{{127.599998,74.6044846}, {128.17691,74.5767441}, {128.75383,74.5233994}, {129.33075,74.4700623}}} {{129.33075,74.4700623}} wnTs[0]=0 {{{129.33075,74.4700623}, {129.487167,74.4555969}, {129.643585,74.4411316}, {129.800003,74.4271774}}}
378debugShowCubicIntersection wtTs[0]=1 {{{129.33075,74.4700623}, {129.487167,74.4555969}, {129.643585,74.4411316}, {129.800003,74.4271774}}} {{129.800003,74.4271774}} wnTs[0]=0 {{{129.800003,74.4271774}, {130.08493,74.4017639}, {130.369843,74.3696442}, {130.65477,74.3375244}}}
379debugShowCubicIntersection wtTs[0]=1 {{{129.800003,74.4271774}, {130.08493,74.4017639}, {130.369843,74.3696442}, {130.65477,74.3375244}}} {{130.65477,74.3375244}} wnTs[0]=0 {{{130.65477,74.3375244}, {131.10318,74.2869797}, {131.55159,74.2364349}, {132,74.2120285}}}
380debugShowCubicIntersection wtTs[0]=1 {{{130.65477,74.3375244}, {131.10318,74.2869797}, {131.55159,74.2364349}, {132,74.2120285}}} {{132,74.2120285}} wnTs[0]=0 {{{132,74.2120285}, {132.682098,74.1748962}, {133.364182,74.1806335}, {134.04628,74.1863708}}}
381debugShowCubicLineIntersection wtTs[0]=1 {{{132,74.2120285}, {132.682098,74.1748962}, {133.364182,74.1806335}, {134.04628,74.1863708}}} {{134.04628,74.1863708}} wnTs[0]=0 {{{134.04628,74.1863708}, {134.199997,74.1876526}}}
382debugShowCubicLineIntersection wtTs[0]=0 {{{134.199997,74.1876526}, {134.740479,74.1920013}, {135.28096,74.2102814}, {135.821426,74.2285538}}} {{134.199997,74.1876526}} wnTs[0]=1 {{{134.04628,74.1863708}, {134.199997,74.1876526}}}
383debugShowCubicIntersection wtTs[0]=1 {{{134.199997,74.1876526}, {134.740479,74.1920013}, {135.28096,74.2102814}, {135.821426,74.2285538}}} {{135.821426,74.2285538}} wnTs[0]=0 {{{135.821426,74.2285538}, {136.014282,74.2350769}, {136.207138,74.2416}, {136.399994,74.2474899}}}
384debugShowCubicIntersection wtTs[0]=1 {{{135.821426,74.2285538}, {136.014282,74.2350769}, {136.207138,74.2416}, {136.399994,74.2474899}}} {{136.399994,74.2474899}} wnTs[0]=0 {{{136.399994,74.2474899}, {136.723831,74.2573776}, {137.047668,74.2692032}, {137.371506,74.2810364}}}
385debugShowCubicIntersection wtTs[0]=1 {{{136.399994,74.2474899}, {136.723831,74.2573776}, {137.047668,74.2692032}, {137.371506,74.2810364}}} {{137.371506,74.2810364}} wnTs[0]=0 {{{137.371506,74.2810364}, {137.781006,74.2959976}, {138.190506,74.3109589}, {138.600006,74.3219833}}}
386debugShowCubicIntersection wtTs[0]=1 {{{137.371506,74.2810364}, {137.781006,74.2959976}, {138.190506,74.3109589}, {138.600006,74.3219833}}} {{138.600006,74.3219833}} wnTs[0]=0 {{{138.600006,74.3219833}, {138.775055,74.3266983}, {138.950119,74.3321457}, {139.125183,74.3375931}}}
387debugShowCubicIntersection wtTs[0]=1 {{{138.600006,74.3219833}, {138.775055,74.3266983}, {138.950119,74.3321457}, {139.125183,74.3375931}}} {{139.125183,74.3375931}} wnTs[0]=0 {{{139.125183,74.3375931}, {139.683456,74.3549652}, {140.24173,74.3723373}, {140.800003,74.3659744}}}
388debugShowCubicIntersection wtTs[0]=1 {{{139.125183,74.3375931}, {139.683456,74.3549652}, {140.24173,74.3723373}, {140.800003,74.3659744}}} {{140.800003,74.3659744}} wnTs[0]=0 {{{140.800003,74.3659744}, {141.173523,74.3617172}, {141.547028,74.3401871}, {141.920547,74.3186493}}}
389debugShowCubicIntersection wtTs[0]=1 {{{140.800003,74.3659744}, {141.173523,74.3617172}, {141.547028,74.3401871}, {141.920547,74.3186493}}} {{141.920547,74.3186493}} wnTs[0]=0 {{{141.920547,74.3186493}, {142.280365,74.297905}, {142.640182,74.2771606}, {143,74.2718658}}}
390debugShowCubicIntersection wtTs[0]=1 {{{141.920547,74.3186493}, {142.280365,74.297905}, {142.640182,74.2771606}, {143,74.2718658}}} {{143,74.2718658}} wnTs[0]=0 {{{143,74.2718658}, {143.733337,74.2610703}, {144.46666,74.2575989}, {145.199997,74.3011856}}}
391debugShowCubicIntersection wtTs[0]=1 {{{143,74.2718658}, {143.733337,74.2610703}, {144.46666,74.2575989}, {145.199997,74.3011856}}} {{145.199997,74.3011856}} wnTs[0]=0 {{{145.199997,74.3011856}, {145.574966,74.3234711}, {145.949936,74.3711548}, {146.32489,74.4188385}}}
392debugShowCubicIntersection wtTs[0]=1 {{{145.199997,74.3011856}, {145.574966,74.3234711}, {145.949936,74.3711548}, {146.32489,74.4188385}}} {{146.32489,74.4188385}} wnTs[0]=0 {{{146.32489,74.4188385}, {146.683258,74.4644165}, {147.041626,74.5099869}, {147.399994,74.5333862}}}
393debugShowCubicIntersection wtTs[0]=1 {{{146.32489,74.4188385}, {146.683258,74.4644165}, {147.041626,74.5099869}, {147.399994,74.5333862}}} {{147.399994,74.5333862}} wnTs[0]=0 {{{147.399994,74.5333862}, {148.133331,74.5812607}, {148.866669,74.6018982}, {149.600006,74.5884552}}}
394debugShowCubicIntersection wtTs[0]=1 {{{147.399994,74.5333862}, {148.133331,74.5812607}, {148.866669,74.6018982}, {149.600006,74.5884552}}} {{149.600006,74.5884552}} wnTs[0]=0 {{{149.600006,74.5884552}, {149.982086,74.5814514}, {150.364182,74.5504913}, {150.746277,74.5195313}}}
395debugShowCubicIntersection wtTs[0]=1 {{{149.600006,74.5884552}, {149.982086,74.5814514}, {150.364182,74.5504913}, {150.746277,74.5195313}}} {{150.746277,74.5195313}} wnTs[0]=0 {{{150.746277,74.5195313}, {151.097519,74.491066}, {151.448761,74.4626007}, {151.800003,74.4527512}}}
396debugShowCubicIntersection wtTs[0]=1 {{{150.746277,74.5195313}, {151.097519,74.491066}, {151.448761,74.4626007}, {151.800003,74.4527512}}} {{151.800003,74.4527512}} wnTs[0]=0 {{{151.800003,74.4527512}, {152.343307,74.4375076}, {152.886597,74.4468765}, {153.429901,74.4562454}}}
397debugShowCubicIntersection wtTs[0]=1 {{{151.800003,74.4527512}, {152.343307,74.4375076}, {152.886597,74.4468765}, {153.429901,74.4562454}}} {{153.429901,74.4562454}} wnTs[0]=0 {{{153.429901,74.4562454}, {153.619934,74.4595261}, {153.809967,74.4627991}, {154,74.4650269}}}
398debugShowCubicIntersection wtTs[0]=1 {{{153.429901,74.4562454}, {153.619934,74.4595261}, {153.809967,74.4627991}, {154,74.4650269}}} {{154,74.4650269}} wnTs[0]=0 {{{154,74.4650269}, {154.295746,74.4684906}, {154.591476,74.4761581}, {154.887222,74.4838257}}}
399debugShowCubicIntersection wtTs[0]=1 {{{154,74.4650269}, {154.295746,74.4684906}, {154.591476,74.4761581}, {154.887222,74.4838257}}} {{154.887222,74.4838257}} wnTs[0]=0 {{{154.887222,74.4838257}, {155.324814,74.4951782}, {155.762405,74.5065308}, {156.199997,74.5042419}}}
400debugShowCubicIntersection wtTs[0]=1 {{{154.887222,74.4838257}, {155.324814,74.4951782}, {155.762405,74.5065308}, {156.199997,74.5042419}}} {{156.199997,74.5042419}} wnTs[0]=0 {{{156.199997,74.5042419}, {156.559143,74.5023651}, {156.918289,74.487793}, {157.27742,74.4732208}}}
401debugShowCubicIntersection wtTs[0]=1 {{{156.199997,74.5042419}, {156.559143,74.5023651}, {156.918289,74.487793}, {157.27742,74.4732208}}} {{157.27742,74.4732208}} wnTs[0]=0 {{{157.27742,74.4732208}, {157.651611,74.4580307}, {158.025803,74.4428406}, {158.399994,74.4420166}}}
402debugShowCubicIntersection wtTs[0]=1 {{{157.27742,74.4732208}, {157.651611,74.4580307}, {158.025803,74.4428406}, {158.399994,74.4420166}}} {{158.399994,74.4420166}} wnTs[0]=0 {{{158.399994,74.4420166}, {159.133331,74.4403992}, {159.866669,74.448494}, {160.600006,74.4945221}}}
403debugShowCubicIntersection wtTs[0]=1 {{{158.399994,74.4420166}, {159.133331,74.4403992}, {159.866669,74.448494}, {160.600006,74.4945221}}} {{160.600006,74.4945221}} wnTs[0]=0 {{{160.600006,74.4945221}, {160.952393,74.5166473}, {161.304794,74.5602722}, {161.657196,74.6038971}}}
404debugShowCubicIntersection wtTs[0]=1 {{{160.600006,74.4945221}, {160.952393,74.5166473}, {161.304794,74.5602722}, {161.657196,74.6038971}}} {{161.657196,74.6038971}} wnTs[0]=0 {{{161.657196,74.6038971}, {162.038132,74.6510468}, {162.419067,74.698204}, {162.800003,74.7182007}}}
405debugShowCubicIntersection wtTs[0]=1 {{{161.657196,74.6038971}, {162.038132,74.6510468}, {162.419067,74.698204}, {162.800003,74.7182007}}} {{162.800003,74.7182007}} wnTs[0]=0 {{{162.800003,74.7182007}, {163.53334,74.7566986}, {164.266663,74.7636337}, {165,74.7255325}}}
406debugShowCubicIntersection wtTs[0]=1 {{{162.800003,74.7182007}, {163.53334,74.7566986}, {164.266663,74.7636337}, {165,74.7255325}}} {{165,74.7255325}} wnTs[0]=0 {{{165,74.7255325}, {165.356293,74.7070236}, {165.712585,74.65802}, {166.068878,74.6090164}}}
407debugShowCubicIntersection wtTs[0]=1 {{{165,74.7255325}, {165.356293,74.7070236}, {165.712585,74.65802}, {166.068878,74.6090164}}} {{166.068878,74.6090164}} wnTs[0]=0 {{{166.068878,74.6090164}, {166.445923,74.5571594}, {166.822952,74.5053024}, {167.199997,74.4895782}}}
408debugShowCubicIntersection wtTs[0]=1 {{{166.068878,74.6090164}, {166.445923,74.5571594}, {166.822952,74.5053024}, {167.199997,74.4895782}}} {{167.199997,74.4895782}} wnTs[0]=0 {{{167.199997,74.4895782}, {167.933334,74.4590073}, {168.666672,74.4903488}, {169.399994,74.5420837}}}
409debugShowCubicIntersection wtTs[0]=1 {{{167.199997,74.4895782}, {167.933334,74.4590073}, {168.666672,74.4903488}, {169.399994,74.5420837}}} {{169.399994,74.5420837}} wnTs[0]=0 {{{169.399994,74.5420837}, {169.752808,74.5669785}, {170.105621,74.6176682}, {170.458435,74.6683578}}}
410debugShowCubicIntersection wtTs[0]=1 {{{169.399994,74.5420837}, {169.752808,74.5669785}, {170.105621,74.6176682}, {170.458435,74.6683578}}} {{170.458435,74.6683578}} wnTs[0]=0 {{{170.458435,74.6683578}, {170.838959,74.7230225}, {171.219482,74.7776947}, {171.600006,74.8000031}}}
411debugShowCubicIntersection wtTs[0]=1 {{{170.458435,74.6683578}, {170.838959,74.7230225}, {171.219482,74.7776947}, {171.600006,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.8429871}, {173.066666,74.8376999}, {173.800003,74.8000031}}}
412debugShowCubicLineIntersection wtTs[0]=1 {{{170.458435,74.6683578}, {170.838959,74.7230225}, {171.219482,74.7776947}, {171.600006,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=0.440476 {{{253,74.8000031}, {68.1999969,74.8000031}}}
413SkOpSegment::addT insert t=0.44047615 segID=150 spanID=608
414debugShowCubicIntersection wtTs[0]=1 {{{171.600006,74.8000031}, {172.333328,74.8429871}, {173.066666,74.8376999}, {173.800003,74.8000031}}} {{173.800003,74.8000031}} wnTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.7639694}, {175.201599,74.6750717}, {175.902405,74.5861664}}}
415debugShowCubicLineIntersection wtTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.8429871}, {173.066666,74.8376999}, {173.800003,74.8000031}}} {{171.600006,74.8000031}} wtTs[1]=1 {{173.800003,74.8000031}} wnTs[0]=0.440476 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=0.428571405
416SkOpSegment::addT insert t=0.428571405 segID=150 spanID=609
417debugShowCubicLineIntersection wtTs[0]=1 {{{173.800003,74.8000031}, {174.500809,74.7639694}, {175.201599,74.6750717}, {175.902405,74.5861664}}} {{175.902405,74.5861664}} wnTs[0]=0 {{{175.902405,74.5861664}, {176,74.5737915}}}
418debugShowCubicLineIntersection wtTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.7639694}, {175.201599,74.6750717}, {175.902405,74.5861664}}} {{173.800003,74.8000031}} wnTs[0]=0.428571 {{{253,74.8000031}, {68.1999969,74.8000031}}}
419debugShowCubicLineIntersection wtTs[0]=0 {{{176,74.5737915}, {176.306427,74.5349655}, {176.612839,74.4810333}, {176.919266,74.4270935}}} {{176,74.5737915}} wnTs[0]=1 {{{175.902405,74.5861664}, {176,74.5737915}}}
420debugShowCubicIntersection wtTs[0]=1 {{{176,74.5737915}, {176.306427,74.5349655}, {176.612839,74.4810333}, {176.919266,74.4270935}}} {{176.919266,74.4270935}} wnTs[0]=0 {{{176.919266,74.4270935}, {177.346176,74.3519516}, {177.773087,74.2768097}, {178.199997,74.2425385}}}
421debugShowCubicIntersection wtTs[0]=1 {{{176.919266,74.4270935}, {177.346176,74.3519516}, {177.773087,74.2768097}, {178.199997,74.2425385}}} {{178.199997,74.2425385}} wnTs[0]=0 {{{178.199997,74.2425385}, {178.933334,74.18367}, {179.666672,74.1942673}, {180.399994,74.2205505}}}
422debugShowCubicIntersection wtTs[0]=1 {{{178.199997,74.2425385}, {178.933334,74.18367}, {179.666672,74.1942673}, {180.399994,74.2205505}}} {{180.399994,74.2205505}} wnTs[0]=0 {{{180.399994,74.2205505}, {180.822174,74.2356796}, {181.244354,74.2772751}, {181.666534,74.3188705}}}
423debugShowCubicIntersection wtTs[0]=1 {{{180.399994,74.2205505}, {180.822174,74.2356796}, {181.244354,74.2772751}, {181.666534,74.3188705}}} {{181.666534,74.3188705}} wnTs[0]=0 {{{181.666534,74.3188705}, {181.977692,74.3495255}, {182.288849,74.3801804}, {182.600006,74.400238}}}
424debugShowCubicIntersection wtTs[0]=1 {{{181.666534,74.3188705}, {181.977692,74.3495255}, {182.288849,74.3801804}, {182.600006,74.400238}}} {{182.600006,74.400238}} wnTs[0]=0 {{{182.600006,74.400238}, {183.153549,74.435936}, {183.707108,74.4587555}, {184.260666,74.481575}}}
425debugShowCubicIntersection wtTs[0]=1 {{{182.600006,74.400238}, {183.153549,74.435936}, {183.707108,74.4587555}, {184.260666,74.481575}}} {{184.260666,74.481575}} wnTs[0]=0 {{{184.260666,74.481575}, {184.440445,74.4889832}, {184.620224,74.4963913}, {184.800003,74.5042419}}}
426debugShowCubicIntersection wtTs[0]=1 {{{184.260666,74.481575}, {184.440445,74.4889832}, {184.620224,74.4963913}, {184.800003,74.5042419}}} {{184.800003,74.5042419}} wnTs[0]=0 {{{184.800003,74.5042419}, {185.53334,74.5362625}, {186.266663,74.5669022}, {187,74.5923843}}}
427debugShowCubicIntersection wtTs[0]=1 {{{184.800003,74.5042419}, {185.53334,74.5362625}, {186.266663,74.5669022}, {187,74.5923843}}} {{187,74.5923843}} wnTs[0]=0 {{{187,74.5923843}, {187.218643,74.5999832}, {187.437286,74.6105118}, {187.65593,74.6210403}}}
428debugShowCubicIntersection wtTs[0]=1 {{{187,74.5923843}, {187.218643,74.5999832}, {187.437286,74.6105118}, {187.65593,74.6210403}}} {{187.65593,74.6210403}} wnTs[0]=0 {{{187.65593,74.6210403}, {188.170624,74.6458359}, {188.685303,74.6706314}, {189.199997,74.6571732}}}
429debugShowCubicIntersection wtTs[0]=1 {{{187.65593,74.6210403}, {188.170624,74.6458359}, {188.685303,74.6706314}, {189.199997,74.6571732}}} {{189.199997,74.6571732}} wnTs[0]=0 {{{189.199997,74.6571732}, {189.560562,74.6477432}, {189.921127,74.6077042}, {190.281693,74.5676651}}}
430debugShowCubicIntersection wtTs[0]=1 {{{189.199997,74.6571732}, {189.560562,74.6477432}, {189.921127,74.6077042}, {190.281693,74.5676651}}} {{190.281693,74.5676651}} wnTs[0]=0 {{{190.281693,74.5676651}, {190.654465,74.526268}, {191.027237,74.4848709}, {191.399994,74.4773026}}}
431debugShowCubicIntersection wtTs[0]=1 {{{190.281693,74.5676651}, {190.654465,74.526268}, {191.027237,74.4848709}, {191.399994,74.4773026}}} {{191.399994,74.4773026}} wnTs[0]=0 {{{191.399994,74.4773026}, {191.942627,74.4662857}, {192.48526,74.5001678}, {193.027893,74.5340576}}}
432debugShowCubicIntersection wtTs[0]=1 {{{191.399994,74.4773026}, {191.942627,74.4662857}, {192.48526,74.5001678}, {193.027893,74.5340576}}} {{193.027893,74.5340576}} wnTs[0]=0 {{{193.027893,74.5340576}, {193.218597,74.5459671}, {193.409302,74.5578766}, {193.600006,74.5678329}}}
433debugShowCubicIntersection wtTs[0]=1 {{{193.027893,74.5340576}, {193.218597,74.5459671}, {193.409302,74.5578766}, {193.600006,74.5678329}}} {{193.600006,74.5678329}} wnTs[0]=0 {{{193.600006,74.5678329}, {193.897125,74.5833511}, {194.19426,74.6063919}, {194.491394,74.6294403}}}
434debugShowCubicIntersection wtTs[0]=1 {{{193.600006,74.5678329}, {193.897125,74.5833511}, {194.19426,74.6063919}, {194.491394,74.6294403}}} {{194.491394,74.6294403}} wnTs[0]=0 {{{194.491394,74.6294403}, {194.927597,74.663269}, {195.3638,74.6970978}, {195.800003,74.7071152}}}
435debugShowCubicIntersection wtTs[0]=1 {{{194.491394,74.6294403}, {194.927597,74.663269}, {195.3638,74.6970978}, {195.800003,74.7071152}}} {{195.800003,74.7071152}} wnTs[0]=0 {{{195.800003,74.7071152}, {196.363327,74.7200546}, {196.926636,74.7021637}, {197.48996,74.6842728}}}
436debugShowCubicIntersection wtTs[0]=1 {{{195.800003,74.7071152}, {196.363327,74.7200546}, {196.926636,74.7021637}, {197.48996,74.6842728}}} {{197.48996,74.6842728}} wnTs[0]=0 {{{197.48996,74.6842728}, {197.659973,74.6788712}, {197.829987,74.6734695}, {198,74.6689148}}}
437debugShowCubicIntersection wtTs[0]=1 {{{197.48996,74.6842728}, {197.659973,74.6788712}, {197.829987,74.6734695}, {198,74.6689148}}} {{198,74.6689148}} wnTs[0]=0 {{{198,74.6689148}, {198.539948,74.6544571}, {199.07988,74.6331635}, {199.619827,74.6118698}}}
438debugShowCubicIntersection wtTs[0]=1 {{{198,74.6689148}, {198.539948,74.6544571}, {199.07988,74.6331635}, {199.619827,74.6118698}}} {{199.619827,74.6118698}} wnTs[0]=0 {{{199.619827,74.6118698}, {199.813217,74.6042404}, {200.006607,74.596611}, {200.199997,74.5892944}}}
439debugShowCubicIntersection wtTs[0]=1 {{{199.619827,74.6118698}, {199.813217,74.6042404}, {200.006607,74.596611}, {200.199997,74.5892944}}} {{200.199997,74.5892944}} wnTs[0]=0 {{{200.199997,74.5892944}, {200.468765,74.5791321}, {200.737534,74.5671921}, {201.006287,74.5552597}}}
440debugShowCubicIntersection wtTs[0]=1 {{{200.199997,74.5892944}, {200.468765,74.5791321}, {200.737534,74.5671921}, {201.006287,74.5552597}}} {{201.006287,74.5552597}} wnTs[0]=0 {{{201.006287,74.5552597}, {201.470856,74.5346298}, {201.935425,74.5139999}, {202.399994,74.5025177}}}
441debugShowCubicIntersection wtTs[0]=1 {{{201.006287,74.5552597}, {201.470856,74.5346298}, {201.935425,74.5139999}, {202.399994,74.5025177}}} {{202.399994,74.5025177}} wnTs[0]=0 {{{202.399994,74.5025177}, {202.888885,74.4904327}, {203.377777,74.4879456}, {203.866669,74.4854507}}}
442debugShowCubicIntersection wtTs[0]=1 {{{202.399994,74.5025177}, {202.888885,74.4904327}, {203.377777,74.4879456}, {203.866669,74.4854507}}} {{203.866669,74.4854507}} wnTs[0]=0 {{{203.866669,74.4854507}, {204.111115,74.4842072}, {204.35556,74.4829636}, {204.600006,74.4805222}}}
443debugShowCubicIntersection wtTs[0]=1 {{{203.866669,74.4854507}, {204.111115,74.4842072}, {204.35556,74.4829636}, {204.600006,74.4805222}}} {{204.600006,74.4805222}} wnTs[0]=0 {{{204.600006,74.4805222}, {204.84462,74.4780731}, {205.089233,74.476059}, {205.333847,74.4740448}}}
444debugShowCubicIntersection wtTs[0]=1 {{{204.600006,74.4805222}, {204.84462,74.4780731}, {205.089233,74.476059}, {205.333847,74.4740448}}} {{205.333847,74.4740448}} wnTs[0]=0 {{{205.333847,74.4740448}, {205.822556,74.4700241}, {206.311279,74.4659958}, {206.800003,74.4585342}}}
445debugShowCubicIntersection wtTs[0]=1 {{{205.333847,74.4740448}, {205.822556,74.4700241}, {206.311279,74.4659958}, {206.800003,74.4585342}}} {{206.800003,74.4585342}} wnTs[0]=0 {{{206.800003,74.4585342}, {207.53334,74.4473343}, {208.266663,74.4324722}, {209,74.413353}}}
446debugShowCubicIntersection wtTs[0]=1 {{{206.800003,74.4585342}, {207.53334,74.4473343}, {208.266663,74.4324722}, {209,74.413353}}} {{209,74.413353}} wnTs[0]=0 {{{209,74.413353}, {209.350708,74.404213}, {209.701416,74.3919983}, {210.052124,74.3797836}}}
447debugShowCubicIntersection wtTs[0]=1 {{{209,74.413353}, {209.350708,74.404213}, {209.701416,74.3919983}, {210.052124,74.3797836}}} {{210.052124,74.3797836}} wnTs[0]=0 {{{210.052124,74.3797836}, {210.434753,74.3664627}, {210.817368,74.3531418}, {211.199997,74.3438034}}}
448debugShowCubicIntersection wtTs[0]=1 {{{210.052124,74.3797836}, {210.434753,74.3664627}, {210.817368,74.3531418}, {211.199997,74.3438034}}} {{211.199997,74.3438034}} wnTs[0]=0 {{{211.199997,74.3438034}, {211.933334,74.3259048}, {212.666672,74.3128586}, {213.399994,74.305954}}}
449debugShowCubicIntersection wtTs[0]=1 {{{211.199997,74.3438034}, {211.933334,74.3259048}, {212.666672,74.3128586}, {213.399994,74.305954}}} {{213.399994,74.305954}} wnTs[0]=0 {{{213.399994,74.305954}, {214.133331,74.2990494}, {214.866669,74.2958145}, {215.600006,74.3023758}}}
450debugShowCubicIntersection wtTs[0]=1 {{{213.399994,74.305954}, {214.133331,74.2990494}, {214.866669,74.2958145}, {215.600006,74.3023758}}} {{215.600006,74.3023758}} wnTs[0]=0 {{{215.600006,74.3023758}, {216.076187,74.3066406}, {216.552383,74.317627}, {217.02858,74.3286133}}}
451debugShowCubicIntersection wtTs[0]=1 {{{215.600006,74.3023758}, {216.076187,74.3066406}, {216.552383,74.317627}, {217.02858,74.3286133}}} {{217.02858,74.3286133}} wnTs[0]=0 {{{217.02858,74.3286133}, {217.285721,74.334549}, {217.542862,74.340477}, {217.800003,74.3453522}}}
452debugShowCubicIntersection wtTs[0]=1 {{{217.02858,74.3286133}, {217.285721,74.334549}, {217.542862,74.340477}, {217.800003,74.3453522}}} {{217.800003,74.3453522}} wnTs[0]=0 {{{217.800003,74.3453522}, {218.041779,74.3499298}, {218.283554,74.358696}, {218.52533,74.3674622}}}
453debugShowCubicIntersection wtTs[0]=1 {{{217.800003,74.3453522}, {218.041779,74.3499298}, {218.283554,74.358696}, {218.52533,74.3674622}}} {{218.52533,74.3674622}} wnTs[0]=0 {{{218.52533,74.3674622}, {219.016891,74.3852844}, {219.508438,74.4031067}, {220,74.3857574}}}
454debugShowCubicIntersection wtTs[0]=1 {{{218.52533,74.3674622}, {219.016891,74.3852844}, {219.508438,74.4031067}, {220,74.3857574}}} {{220,74.3857574}} wnTs[0]=0 {{{220,74.3857574}, {220.409988,74.3712845}, {220.819977,74.3263474}, {221.229965,74.2814102}}}
455debugShowCubicIntersection wtTs[0]=1 {{{220,74.3857574}, {220.409988,74.3712845}, {220.819977,74.3263474}, {221.229965,74.2814102}}} {{221.229965,74.2814102}} wnTs[0]=0 {{{221.229965,74.2814102}, {221.553314,74.2459717}, {221.876648,74.2105331}, {222.199997,74.190033}}}
456debugShowCubicIntersection wtTs[0]=1 {{{221.229965,74.2814102}, {221.553314,74.2459717}, {221.876648,74.2105331}, {222.199997,74.190033}}} {{222.199997,74.190033}} wnTs[0]=0 {{{222.199997,74.190033}, {222.933334,74.1435471}, {223.666672,74.1037674}, {224.399994,74.1068344}}}
457debugShowCubicIntersection wtTs[0]=1 {{{222.199997,74.190033}, {222.933334,74.1435471}, {223.666672,74.1037674}, {224.399994,74.1068344}}} {{224.399994,74.1068344}} wnTs[0]=0 {{{224.399994,74.1068344}, {224.885803,74.1088638}, {225.371613,74.1381073}, {225.857422,74.1673508}}}
458debugShowCubicIntersection wtTs[0]=1 {{{224.399994,74.1068344}, {224.885803,74.1088638}, {225.371613,74.1381073}, {225.857422,74.1673508}}} {{225.857422,74.1673508}} wnTs[0]=0 {{{225.857422,74.1673508}, {226.10495,74.182251}, {226.352478,74.1971512}, {226.600006,74.2084503}}}
459debugShowCubicIntersection wtTs[0]=1 {{{225.857422,74.1673508}, {226.10495,74.182251}, {226.352478,74.1971512}, {226.600006,74.2084503}}} {{226.600006,74.2084503}} wnTs[0]=0 {{{226.600006,74.2084503}, {226.839722,74.2193909}, {227.079437,74.2324677}, {227.319153,74.2455521}}}
460debugShowCubicIntersection wtTs[0]=1 {{{226.600006,74.2084503}, {226.839722,74.2193909}, {227.079437,74.2324677}, {227.319153,74.2455521}}} {{227.319153,74.2455521}} wnTs[0]=0 {{{227.319153,74.2455521}, {227.812759,74.2724838}, {228.306381,74.2994156}, {228.800003,74.3076782}}}
461debugShowCubicIntersection wtTs[0]=1 {{{227.319153,74.2455521}, {227.812759,74.2724838}, {228.306381,74.2994156}, {228.800003,74.3076782}}} {{228.800003,74.3076782}} wnTs[0]=0 {{{228.800003,74.3076782}, {229.309921,74.3162155}, {229.819824,74.3054352}, {230.329742,74.2946548}}}
462debugShowCubicIntersection wtTs[0]=1 {{{228.800003,74.3076782}, {229.309921,74.3162155}, {229.819824,74.3054352}, {230.329742,74.2946548}}} {{230.329742,74.2946548}} wnTs[0]=0 {{{230.329742,74.2946548}, {230.553162,74.2899323}, {230.776581,74.2852097}, {231,74.2821121}}}
463debugShowCubicIntersection wtTs[0]=1 {{{230.329742,74.2946548}, {230.553162,74.2899323}, {230.776581,74.2852097}, {231,74.2821121}}} {{231,74.2821121}} wnTs[0]=0 {{{231,74.2821121}, {231.290405,74.2780838}, {231.580811,74.2724228}, {231.871216,74.2667542}}}
464debugShowCubicIntersection wtTs[0]=1 {{{231,74.2821121}, {231.290405,74.2780838}, {231.580811,74.2724228}, {231.871216,74.2667542}}} {{231.871216,74.2667542}} wnTs[0]=0 {{{231.871216,74.2667542}, {232.314148,74.2581177}, {232.757065,74.2494812}, {233.199997,74.2466507}}}
465debugShowCubicIntersection wtTs[0]=1 {{{231.871216,74.2667542}, {232.314148,74.2581177}, {232.757065,74.2494812}, {233.199997,74.2466507}}} {{233.199997,74.2466507}} wnTs[0]=0 {{{233.199997,74.2466507}, {233.343719,74.2457352}, {233.487442,74.2448959}, {233.631165,74.2442474}}}
466debugShowCubicIntersection wtTs[0]=1 {{{233.199997,74.2466507}, {233.343719,74.2457352}, {233.487442,74.2448959}, {233.631165,74.2442474}}} {{233.631165,74.2442474}} wnTs[0]=0 {{{233.631165,74.2442474}, {234.220779,74.2415924}, {234.810394,74.2421951}, {235.399994,74.2539825}}}
467debugShowCubicIntersection wtTs[0]=1 {{{233.631165,74.2442474}, {234.220779,74.2415924}, {234.810394,74.2421951}, {235.399994,74.2539825}}} {{235.399994,74.2539825}} wnTs[0]=0 {{{235.399994,74.2539825}, {235.845032,74.2628784}, {236.29007,74.2817612}, {236.735107,74.3006439}}}
468debugShowCubicIntersection wtTs[0]=1 {{{235.399994,74.2539825}, {235.845032,74.2628784}, {236.29007,74.2817612}, {236.735107,74.3006439}}} {{236.735107,74.3006439}} wnTs[0]=0 {{{236.735107,74.3006439}, {237.023407,74.3128738}, {237.311707,74.3251038}, {237.600006,74.3346176}}}
469debugShowCubicIntersection wtTs[0]=1 {{{236.735107,74.3006439}, {237.023407,74.3128738}, {237.311707,74.3251038}, {237.600006,74.3346176}}} {{237.600006,74.3346176}} wnTs[0]=0 {{{237.600006,74.3346176}, {238.333328,74.3588257}, {239.066666,74.3803329}, {239.800003,74.3992233}}}
470debugShowCubicIntersection wtTs[0]=1 {{{237.600006,74.3346176}, {238.333328,74.3588257}, {239.066666,74.3803329}, {239.800003,74.3992233}}} {{239.800003,74.3992233}} wnTs[0]=0 {{{239.800003,74.3992233}, {240.082169,74.4064941}, {240.364334,74.4108353}, {240.6465,74.4151764}}}
471debugShowCubicIntersection wtTs[0]=1 {{{239.800003,74.3992233}, {240.082169,74.4064941}, {240.364334,74.4108353}, {240.6465,74.4151764}}} {{240.6465,74.4151764}} wnTs[0]=0 {{{240.6465,74.4151764}, {241.097672,74.4221191}, {241.548828,74.4290695}, {242,74.4479828}}}
472debugShowCubicIntersection wtTs[0]=1 {{{240.6465,74.4151764}, {241.097672,74.4221191}, {241.548828,74.4290695}, {242,74.4479828}}} {{242,74.4479828}} wnTs[0]=0 {{{242,74.4479828}, {242.416458,74.4654388}, {242.832916,74.4942093}, {243.249374,74.5229874}}}
473debugShowCubicIntersection wtTs[0]=1 {{{242,74.4479828}, {242.416458,74.4654388}, {242.832916,74.4942093}, {243.249374,74.5229874}}} {{243.249374,74.5229874}} wnTs[0]=0 {{{243.249374,74.5229874}, {243.566254,74.5448837}, {243.883118,74.5667801}, {244.199997,74.5836868}}}
474debugShowCubicIntersection wtTs[0]=1 {{{243.249374,74.5229874}, {243.566254,74.5448837}, {243.883118,74.5667801}, {244.199997,74.5836868}}} {{244.199997,74.5836868}} wnTs[0]=0 {{{244.199997,74.5836868}, {244.933334,74.6228104}, {245.666672,74.6546402}, {246.399994,74.6827393}}}
475debugShowCubicIntersection wtTs[0]=1 {{{244.199997,74.5836868}, {244.933334,74.6228104}, {245.666672,74.6546402}, {246.399994,74.6827393}}} {{246.399994,74.6827393}} wnTs[0]=0 {{{246.399994,74.6827393}, {247.133331,74.7108383}, {247.866669,74.7327499}, {248.600006,74.7522964}}}
476debugShowCubicLineIntersection wtTs[0]=1 {{{246.399994,74.6827393}, {247.133331,74.7108383}, {247.866669,74.7327499}, {248.600006,74.7522964}}} {{248.600006,74.7522964}} wnTs[0]=0 {{{248.600006,74.7522964}, {248.714218,74.7553406}}}
477debugShowCubicLineIntersection wtTs[0]=0 {{{248.714218,74.7553406}, {249.40947,74.7739029}, {250.104736,74.7924576}, {250.800003,74.8000031}}} {{248.714218,74.7553406}} wnTs[0]=1 {{{248.600006,74.7522964}, {248.714218,74.7553406}}}
478debugShowCubicIntersection wtTs[0]=1 {{{248.714218,74.7553406}, {249.40947,74.7739029}, {250.104736,74.7924576}, {250.800003,74.8000031}}} {{250.800003,74.8000031}} wnTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.8053055}, {251.777771,74.8035355}, {252.266663,74.8017731}}}
479debugShowCubicLineIntersection wtTs[0]=1 {{{248.714218,74.7553406}, {249.40947,74.7739029}, {250.104736,74.7924576}, {250.800003,74.8000031}}} {{250.800003,74.8000031}} wnTs[0]=0.0119047 {{{253,74.8000031}, {68.1999969,74.8000031}}}
480SkOpSegment::addT insert t=0.0119047452 segID=150 spanID=610
481debugShowCubicIntersection wtTs[0]=1 {{{250.800003,74.8000031}, {251.288895,74.8053055}, {251.777771,74.8035355}, {252.266663,74.8017731}}} {{252.266663,74.8017731}} wnTs[0]=0 {{{252.266663,74.8017731}, {252.511108,74.8008881}, {252.755554,74.8000031}, {253,74.8000031}}}
482debugShowCubicLineIntersection wtTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.8053055}, {251.777771,74.8035355}, {252.266663,74.8017731}}} {{250.800003,74.8000031}} wnTs[0]=0.0119047 {{{253,74.8000031}, {68.1999969,74.8000031}}}
483debugShowCubicLineIntersection wtTs[0]=1 {{{252.266663,74.8017731}, {252.511108,74.8008881}, {252.755554,74.8000031}, {253,74.8000031}}} {{253,74.8000031}} wnTs[0]=0 {{{253,74.8000031}, {68.1999969,74.8000031}}}
484debugShowCubicIntersection wtTs[0]=0 {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.8039017}, {68.9333344,74.8078003}}} {{68.1999969,74.8000031}} wnTs[0]=0 {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.7961044}, {68.9333344,74.7922058}}}
485debugShowCubicIntersection no intersect {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.8039017}, {68.9333344,74.8078003}}} {{{68.9333344,74.7922058}, {69.422226,74.7844086}, {69.9111099,74.7766113}, {70.4000015,74.8000031}}}
486debugShowCubicLineIntersection wtTs[0]=0 {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.8039017}, {68.9333344,74.8078003}}} {{68.1999969,74.8000031}} wnTs[0]=1 {{{253,74.8000031}, {68.1999969,74.8000031}}}
487debugShowCubicIntersection no intersect {{{68.9333344,74.8078003}, {69.422226,74.8155975}, {69.9111099,74.8233948}, {70.4000015,74.8000031}}} {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.7961044}, {68.9333344,74.7922058}}}
488debugShowCubicIntersection wtTs[0]=1 {{{68.9333344,74.8078003}, {69.422226,74.8155975}, {69.9111099,74.8233948}, {70.4000015,74.8000031}}} {{70.4000015,74.8000031}} wnTs[0]=1 {{{68.9333344,74.7922058}, {69.422226,74.7844086}, {69.9111099,74.7766113}, {70.4000015,74.8000031}}}
489debugShowCubicIntersection wtTs[0]=1 {{{68.9333344,74.8078003}, {69.422226,74.8155975}, {69.9111099,74.8233948}, {70.4000015,74.8000031}}} {{70.4000015,74.8000031}} wnTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.8181686}, {71.1592636,74.8627396}, {71.5388947,74.9073105}}}
490debugShowCubicLineIntersection wtTs[0]=1 {{{68.9333344,74.8078003}, {69.422226,74.8155975}, {69.9111099,74.8233948}, {70.4000015,74.8000031}}} {{70.4000015,74.8000031}} wnTs[0]=0.988095 {{{253,74.8000031}, {68.1999969,74.8000031}}}
491SkOpSegment::addT insert t=0.988095214 segID=299 spanID=611
492debugShowCubicIntersection wtTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.7818375}, {71.1592636,74.7372665}, {71.5388947,74.6926956}}} {{70.4000015,74.8000031}} wnTs[0]=1 {{{68.9333344,74.7922058}, {69.422226,74.7844086}, {69.9111099,74.7766113}, {70.4000015,74.8000031}}}
493debugShowCubicIntersection wtTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.7818375}, {71.1592636,74.7372665}, {71.5388947,74.6926956}}} {{70.4000015,74.8000031}} wnTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.8181686}, {71.1592636,74.8627396}, {71.5388947,74.9073105}}}
494debugShowCubicLineIntersection wtTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.7818375}, {71.1592636,74.7372665}, {71.5388947,74.6926956}}} {{70.4000015,74.8000031}} wnTs[0]=0.988095 {{{253,74.8000031}, {68.1999969,74.8000031}}}
495debugShowCubicIntersection no intersect {{{78.1107025,74.66716}, {78.4738007,74.722496}, {78.8368988,74.777832}, {79.1999969,74.7998505}}} {{{79.1999969,74.8001556}, {79.689003,74.7705002}, {80.1780014,74.7803421}, {80.6670074,74.790184}}}
496debugShowCubicIntersection no intersect {{{79.1999969,74.7998505}, {79.689003,74.8295059}, {80.1780014,74.819664}, {80.6670074,74.8098221}}} {{{78.1107025,74.9328461}, {78.4738007,74.8775101}, {78.8368988,74.8221741}, {79.1999969,74.8001556}}}
497debugShowCubicIntersection wtTs[0]=0.00172605823 {{{79.1999969,74.7998505}, {79.689003,74.8295059}, {80.1780014,74.819664}, {80.6670074,74.8098221}}} {{79.2025299,74.8000031}} wnTs[0]=0.00172606 {{{79.1999969,74.8001556}, {79.689003,74.7705002}, {80.1780014,74.7803421}, {80.6670074,74.790184}}}
498SkOpSegment::addT alias t=0.00172605823 segID=11 spanID=600
499SkOpSegment::addT insert t=0.00172605823 segID=161 spanID=612
500debugShowCubicIntersection no intersect {{{79.1999969,74.7998505}, {79.689003,74.8295059}, {80.1780014,74.819664}, {80.6670074,74.8098221}}} {{{80.6670074,74.790184}, {80.9113388,74.7950974}, {81.1556702,74.8000107}, {81.4000015,74.8000031}}}
501debugShowCubicLineIntersection wtTs[0]=0.0017190524 {{{79.1999969,74.7998505}, {79.689003,74.8295059}, {80.1780014,74.819664}, {80.6670074,74.8098221}}} {{79.2025223,74.8000031}} wnTs[0]=0.940463 {{{253,74.8000031}, {68.1999969,74.8000031}}}
502SkOpSegment::addT insert t=0.940462545 segID=299 spanID=613
503debugShowCubicIntersection no intersect {{{80.6670074,74.8098221}, {80.9113388,74.8049088}, {81.1556702,74.7999954}, {81.4000015,74.8000031}}} {{{79.1999969,74.8001556}, {79.689003,74.7705002}, {80.1780014,74.7803421}, {80.6670074,74.790184}}}
504debugShowCubicIntersection wtTs[0]=1 {{{80.6670074,74.8098221}, {80.9113388,74.8049088}, {81.1556702,74.7999954}, {81.4000015,74.8000031}}} {{81.4000015,74.8000031}} wnTs[0]=1 {{{80.6670074,74.790184}, {80.9113388,74.7950974}, {81.1556702,74.8000107}, {81.4000015,74.8000031}}}
505debugShowCubicIntersection wtTs[0]=1 {{{80.6670074,74.8098221}, {80.9113388,74.8049088}, {81.1556702,74.7999954}, {81.4000015,74.8000031}}} {{81.4000015,74.8000031}} wnTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.7999954}, {81.8877106,74.7989426}, {82.1315613,74.7978897}}}
506debugShowCubicLineIntersection wtTs[0]=0.99844881 {{{80.6670074,74.8098221}, {80.9113388,74.8049088}, {81.1556702,74.7999954}, {81.4000015,74.8000031}}} {{81.3988647,74.8000031}} wtTs[1]=1 {{81.4000015,74.8000031}} wnTs[0]=0.928578 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=0.928571405
507SkOpSegment::addT insert t=0.928577558 segID=299 spanID=614
508SkOpSegment::addT insert t=0.928571405 segID=299 spanID=615
509debugShowCubicIntersection wtTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.8000107}, {81.8877106,74.8010635}, {82.1315613,74.8021164}}} {{81.4000015,74.8000031}} wnTs[0]=1 {{{80.6670074,74.790184}, {80.9113388,74.7950974}, {81.1556702,74.8000107}, {81.4000015,74.8000031}}}
510debugShowCubicIntersection wtTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.8000107}, {81.8877106,74.8010635}, {82.1315613,74.8021164}}} {{81.4000015,74.8000031}} wnTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.7999954}, {81.8877106,74.7989426}, {82.1315613,74.7978897}}}
511debugShowCubicIntersection no intersect {{{81.4000015,74.8000031}, {81.6438522,74.8000107}, {81.8877106,74.8010635}, {82.1315613,74.8021164}}} {{{82.1315613,74.7978897}, {82.6210403,74.7957764}, {83.1105194,74.7936554}, {83.5999985,74.8000031}}}
512debugShowCubicLineIntersection wtTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.8000107}, {81.8877106,74.8010635}, {82.1315613,74.8021164}}} {{81.4000015,74.8000031}} wnTs[0]=0.928571 {{{253,74.8000031}, {68.1999969,74.8000031}}}
513debugShowCubicIntersection no intersect {{{82.1315613,74.8021164}, {82.6210403,74.8042297}, {83.1105194,74.8063507}, {83.5999985,74.8000031}}} {{{81.4000015,74.8000031}, {81.6438522,74.7999954}, {81.8877106,74.7989426}, {82.1315613,74.7978897}}}
514debugShowCubicIntersection wtTs[0]=1 {{{82.1315613,74.8021164}, {82.6210403,74.8042297}, {83.1105194,74.8063507}, {83.5999985,74.8000031}}} {{83.5999985,74.8000031}} wnTs[0]=1 {{{82.1315613,74.7978897}, {82.6210403,74.7957764}, {83.1105194,74.7936554}, {83.5999985,74.8000031}}}
515debugShowCubicIntersection wtTs[0]=1 {{{82.1315613,74.8021164}, {82.6210403,74.8042297}, {83.1105194,74.8063507}, {83.5999985,74.8000031}}} {{83.5999985,74.8000031}} wnTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.8042297}, {84.2518234,74.8159714}, {84.5777359,74.827713}}}
516debugShowCubicLineIntersection wtTs[0]=1 {{{82.1315613,74.8021164}, {82.6210403,74.8042297}, {83.1105194,74.8063507}, {83.5999985,74.8000031}}} {{83.5999985,74.8000031}} wnTs[0]=0.916667 {{{253,74.8000031}, {68.1999969,74.8000031}}}
517SkOpSegment::addT insert t=0.91666666 segID=299 spanID=616
518debugShowCubicIntersection wtTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.7957764}, {84.2518234,74.7840347}, {84.5777359,74.7722931}}} {{83.5999985,74.8000031}} wnTs[0]=1 {{{82.1315613,74.7978897}, {82.6210403,74.7957764}, {83.1105194,74.7936554}, {83.5999985,74.8000031}}}
519debugShowCubicIntersection wtTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.7957764}, {84.2518234,74.7840347}, {84.5777359,74.7722931}}} {{83.5999985,74.8000031}} wnTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.8042297}, {84.2518234,74.8159714}, {84.5777359,74.827713}}}
520debugShowCubicLineIntersection wtTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.7957764}, {84.2518234,74.7840347}, {84.5777359,74.7722931}}} {{83.5999985,74.8000031}} wnTs[0]=0.916667 {{{253,74.8000031}, {68.1999969,74.8000031}}}
521debugShowCubicIntersection wtTs[0]=1 {{{87.0222626,74.7722931}, {87.348175,74.7840347}, {87.6740875,74.7957764}, {88,74.8000031}}} {{88,74.8000031}} wnTs[0]=1 {{{87.0222626,74.827713}, {87.348175,74.8159714}, {87.6740875,74.8042297}, {88,74.8000031}}}
522debugShowCubicIntersection wtTs[0]=1 {{{87.0222626,74.7722931}, {87.348175,74.7840347}, {87.6740875,74.7957764}, {88,74.8000031}}} {{88,74.8000031}} wnTs[0]=0 {{{88,74.8000031}, {88.1576462,74.7979584}, {88.3152924,74.7951202}, {88.4729385,74.7922745}}}
523debugShowCubicLineIntersection wtTs[0]=1 {{{87.0222626,74.7722931}, {87.348175,74.7840347}, {87.6740875,74.7957764}, {88,74.8000031}}} {{88,74.8000031}} wnTs[0]=0.892857 {{{253,74.8000031}, {68.1999969,74.8000031}}}
524SkOpSegment::addT insert t=0.892857128 segID=299 spanID=617
525debugShowCubicIntersection wtTs[0]=0 {{{88,74.8000031}, {88.1576462,74.8020477}, {88.3152924,74.8048859}, {88.4729385,74.8077316}}} {{88,74.8000031}} wnTs[0]=1 {{{87.0222626,74.827713}, {87.348175,74.8159714}, {87.6740875,74.8042297}, {88,74.8000031}}}
526debugShowCubicIntersection wtTs[0]=0 {{{88,74.8000031}, {88.1576462,74.8020477}, {88.3152924,74.8048859}, {88.4729385,74.8077316}}} {{88,74.8000031}} wnTs[0]=0 {{{88,74.8000031}, {88.1576462,74.7979584}, {88.3152924,74.7951202}, {88.4729385,74.7922745}}}
527debugShowCubicIntersection no intersect {{{88,74.8000031}, {88.1576462,74.8020477}, {88.3152924,74.8048859}, {88.4729385,74.8077316}}} {{{88.4729385,74.7922745}, {89.0486221,74.7818985}, {89.6243134,74.7715225}, {90.1999969,74.8000031}}}
528debugShowCubicLineIntersection wtTs[0]=0 {{{88,74.8000031}, {88.1576462,74.8020477}, {88.3152924,74.8048859}, {88.4729385,74.8077316}}} {{88,74.8000031}} wnTs[0]=0.892857 {{{253,74.8000031}, {68.1999969,74.8000031}}}
529debugShowCubicIntersection no intersect {{{88.4729385,74.8077316}, {89.0486221,74.8181076}, {89.6243134,74.8284836}, {90.1999969,74.8000031}}} {{{88,74.8000031}, {88.1576462,74.7979584}, {88.3152924,74.7951202}, {88.4729385,74.7922745}}}
530debugShowCubicIntersection wtTs[0]=1 {{{88.4729385,74.8077316}, {89.0486221,74.8181076}, {89.6243134,74.8284836}, {90.1999969,74.8000031}}} {{90.1999969,74.8000031}} wnTs[0]=1 {{{88.4729385,74.7922745}, {89.0486221,74.7818985}, {89.6243134,74.7715225}, {90.1999969,74.8000031}}}
531debugShowCubicIntersection wtTs[0]=1 {{{88.4729385,74.8077316}, {89.0486221,74.8181076}, {89.6243134,74.8284836}, {90.1999969,74.8000031}}} {{90.1999969,74.8000031}} wnTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.8179169}, {90.9241028,74.8630524}, {91.2861557,74.9081879}}}
532debugShowCubicLineIntersection wtTs[0]=1 {{{88.4729385,74.8077316}, {89.0486221,74.8181076}, {89.6243134,74.8284836}, {90.1999969,74.8000031}}} {{90.1999969,74.8000031}} wnTs[0]=0.880952 {{{253,74.8000031}, {68.1999969,74.8000031}}}
533SkOpSegment::addT insert t=0.880952383 segID=299 spanID=618
534debugShowCubicIntersection wtTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.7820892}, {90.9241028,74.7369537}, {91.2861557,74.6918182}}} {{90.1999969,74.8000031}} wnTs[0]=1 {{{88.4729385,74.7922745}, {89.0486221,74.7818985}, {89.6243134,74.7715225}, {90.1999969,74.8000031}}}
535debugShowCubicIntersection wtTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.7820892}, {90.9241028,74.7369537}, {91.2861557,74.6918182}}} {{90.1999969,74.8000031}} wnTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.8179169}, {90.9241028,74.8630524}, {91.2861557,74.9081879}}}
536debugShowCubicLineIntersection wtTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.7820892}, {90.9241028,74.7369537}, {91.2861557,74.6918182}}} {{90.1999969,74.8000031}} wnTs[0]=0.880952 {{{253,74.8000031}, {68.1999969,74.8000031}}}
537debugShowCubicIntersection wtTs[0]=1 {{{170.458435,74.6683578}, {170.838959,74.7230225}, {171.219482,74.7776947}, {171.600006,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=1 {{{170.458435,74.9316483}, {170.838959,74.8769836}, {171.219482,74.8223114}, {171.600006,74.8000031}}}
538debugShowCubicIntersection wtTs[0]=1 {{{170.458435,74.6683578}, {170.838959,74.7230225}, {171.219482,74.7776947}, {171.600006,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.757019}, {173.066666,74.7623062}, {173.800003,74.8000031}}}
539debugShowCubicLineIntersection wtTs[0]=1 {{{170.458435,74.6683578}, {170.838959,74.7230225}, {171.219482,74.7776947}, {171.600006,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=0.440476 {{{253,74.8000031}, {68.1999969,74.8000031}}}
540SkOpSegment::addT insert t=0.44047615 segID=299 spanID=619
541debugShowCubicIntersection wtTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.8429871}, {173.066666,74.8376999}, {173.800003,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=1 {{{170.458435,74.9316483}, {170.838959,74.8769836}, {171.219482,74.8223114}, {171.600006,74.8000031}}}
542debugShowCubicIntersection wtTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.8429871}, {173.066666,74.8376999}, {173.800003,74.8000031}}} {{171.600006,74.8000031}} wtTs[1]=1 {{173.800003,74.8000031}} wnTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.757019}, {173.066666,74.7623062}, {173.800003,74.8000031}}} wnTs[1]=1
543debugShowCubicIntersection wtTs[0]=1 {{{171.600006,74.8000031}, {172.333328,74.8429871}, {173.066666,74.8376999}, {173.800003,74.8000031}}} {{173.800003,74.8000031}} wnTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.8360367}, {175.201599,74.9249344}, {175.902405,75.0138397}}}
544debugShowCubicLineIntersection wtTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.8429871}, {173.066666,74.8376999}, {173.800003,74.8000031}}} {{171.600006,74.8000031}} wtTs[1]=1 {{173.800003,74.8000031}} wnTs[0]=0.440476 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=0.428571405
545SkOpSegment::addT insert t=0.428571405 segID=299 spanID=620
546debugShowCubicIntersection wtTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.7639694}, {175.201599,74.6750717}, {175.902405,74.5861664}}} {{173.800003,74.8000031}} wnTs[0]=1 {{{171.600006,74.8000031}, {172.333328,74.757019}, {173.066666,74.7623062}, {173.800003,74.8000031}}}
547debugShowCubicIntersection wtTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.7639694}, {175.201599,74.6750717}, {175.902405,74.5861664}}} {{173.800003,74.8000031}} wnTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.8360367}, {175.201599,74.9249344}, {175.902405,75.0138397}}}
548debugShowCubicLineIntersection wtTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.7639694}, {175.201599,74.6750717}, {175.902405,74.5861664}}} {{173.800003,74.8000031}} wnTs[0]=0.428571 {{{253,74.8000031}, {68.1999969,74.8000031}}}
549debugShowCubicIntersection wtTs[0]=1 {{{248.714218,74.7553406}, {249.40947,74.7739029}, {250.104736,74.7924576}, {250.800003,74.8000031}}} {{250.800003,74.8000031}} wnTs[0]=1 {{{248.714218,74.8446655}, {249.40947,74.8261032}, {250.104736,74.8075485}, {250.800003,74.8000031}}}
550debugShowCubicIntersection wtTs[0]=1 {{{248.714218,74.7553406}, {249.40947,74.7739029}, {250.104736,74.7924576}, {250.800003,74.8000031}}} {{250.800003,74.8000031}} wnTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.7947006}, {251.777771,74.7964706}, {252.266663,74.798233}}}
551debugShowCubicLineIntersection wtTs[0]=1 {{{248.714218,74.7553406}, {249.40947,74.7739029}, {250.104736,74.7924576}, {250.800003,74.8000031}}} {{250.800003,74.8000031}} wnTs[0]=0.0119047 {{{253,74.8000031}, {68.1999969,74.8000031}}}
552SkOpSegment::addT insert t=0.0119047452 segID=299 spanID=621
553debugShowCubicIntersection wtTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.8053055}, {251.777771,74.8035355}, {252.266663,74.8017731}}} {{250.800003,74.8000031}} wnTs[0]=1 {{{248.714218,74.8446655}, {249.40947,74.8261032}, {250.104736,74.8075485}, {250.800003,74.8000031}}}
554debugShowCubicIntersection wtTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.8053055}, {251.777771,74.8035355}, {252.266663,74.8017731}}} {{250.800003,74.8000031}} wnTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.7947006}, {251.777771,74.7964706}, {252.266663,74.798233}}}
555debugShowCubicIntersection no intersect {{{250.800003,74.8000031}, {251.288895,74.8053055}, {251.777771,74.8035355}, {252.266663,74.8017731}}} {{{252.266663,74.798233}, {252.511108,74.799118}, {252.755554,74.8000031}, {253,74.8000031}}}
556debugShowCubicLineIntersection wtTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.8053055}, {251.777771,74.8035355}, {252.266663,74.8017731}}} {{250.800003,74.8000031}} wnTs[0]=0.0119047 {{{253,74.8000031}, {68.1999969,74.8000031}}}
557debugShowCubicIntersection no intersect {{{252.266663,74.8017731}, {252.511108,74.8008881}, {252.755554,74.8000031}, {253,74.8000031}}} {{{250.800003,74.8000031}, {251.288895,74.7947006}, {251.777771,74.7964706}, {252.266663,74.798233}}}
558debugShowCubicIntersection wtTs[0]=1 {{{252.266663,74.8017731}, {252.511108,74.8008881}, {252.755554,74.8000031}, {253,74.8000031}}} {{253,74.8000031}} wnTs[0]=1 {{{252.266663,74.798233}, {252.511108,74.799118}, {252.755554,74.8000031}, {253,74.8000031}}}
559debugShowCubicLineIntersection wtTs[0]=1 {{{252.266663,74.8017731}, {252.511108,74.8008881}, {252.755554,74.8000031}, {253,74.8000031}}} {{253,74.8000031}} wnTs[0]=0 {{{253,74.8000031}, {68.1999969,74.8000031}}}
560debugShowCubicLineIntersection wtTs[0]=0 {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.7961044}, {68.9333344,74.7922058}}} {{68.1999969,74.8000031}} wnTs[0]=1 {{{253,74.8000031}, {68.1999969,74.8000031}}}
561debugShowCubicLineIntersection wtTs[0]=1 {{{68.9333344,74.7922058}, {69.422226,74.7844086}, {69.9111099,74.7766113}, {70.4000015,74.8000031}}} {{70.4000015,74.8000031}} wnTs[0]=0.988095 {{{253,74.8000031}, {68.1999969,74.8000031}}}
562debugShowCubicLineIntersection wtTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.8181686}, {71.1592636,74.8627396}, {71.5388947,74.9073105}}} {{70.4000015,74.8000031}} wnTs[0]=0.988095 {{{253,74.8000031}, {68.1999969,74.8000031}}}
563debugShowCubicLineIntersection wtTs[0]=0.0017190524 {{{79.1999969,74.8001556}, {79.689003,74.7705002}, {80.1780014,74.7803421}, {80.6670074,74.790184}}} {{79.2025223,74.8000031}} wnTs[0]=0.940463 {{{253,74.8000031}, {68.1999969,74.8000031}}}
564SkOpSegment::addT alias t=0.0017190524 segID=161 spanID=612
565debugShowCubicLineIntersection wtTs[0]=0.99844881 {{{80.6670074,74.790184}, {80.9113388,74.7950974}, {81.1556702,74.8000107}, {81.4000015,74.8000031}}} {{81.3988647,74.8000031}} wtTs[1]=1 {{81.4000015,74.8000031}} wnTs[0]=0.928578 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=0.928571405
566SkOpSegment::addT insert t=0.99844881 segID=162 spanID=622
567debugShowCubicLineIntersection wtTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.7999954}, {81.8877106,74.7989426}, {82.1315613,74.7978897}}} {{81.4000015,74.8000031}} wnTs[0]=0.928571 {{{253,74.8000031}, {68.1999969,74.8000031}}}
568debugShowCubicLineIntersection wtTs[0]=1 {{{82.1315613,74.7978897}, {82.6210403,74.7957764}, {83.1105194,74.7936554}, {83.5999985,74.8000031}}} {{83.5999985,74.8000031}} wnTs[0]=0.916667 {{{253,74.8000031}, {68.1999969,74.8000031}}}
569debugShowCubicLineIntersection wtTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.8042297}, {84.2518234,74.8159714}, {84.5777359,74.827713}}} {{83.5999985,74.8000031}} wnTs[0]=0.916667 {{{253,74.8000031}, {68.1999969,74.8000031}}}
570debugShowCubicLineIntersection wtTs[0]=1 {{{87.0222626,74.827713}, {87.348175,74.8159714}, {87.6740875,74.8042297}, {88,74.8000031}}} {{88,74.8000031}} wnTs[0]=0.892857 {{{253,74.8000031}, {68.1999969,74.8000031}}}
571debugShowCubicLineIntersection wtTs[0]=0 {{{88,74.8000031}, {88.1576462,74.7979584}, {88.3152924,74.7951202}, {88.4729385,74.7922745}}} {{88,74.8000031}} wnTs[0]=0.892857 {{{253,74.8000031}, {68.1999969,74.8000031}}}
572debugShowCubicLineIntersection wtTs[0]=1 {{{88.4729385,74.7922745}, {89.0486221,74.7818985}, {89.6243134,74.7715225}, {90.1999969,74.8000031}}} {{90.1999969,74.8000031}} wnTs[0]=0.880952 {{{253,74.8000031}, {68.1999969,74.8000031}}}
573debugShowCubicLineIntersection wtTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.8179169}, {90.9241028,74.8630524}, {91.2861557,74.9081879}}} {{90.1999969,74.8000031}} wnTs[0]=0.880952 {{{253,74.8000031}, {68.1999969,74.8000031}}}
574debugShowCubicLineIntersection wtTs[0]=1 {{{170.458435,74.9316483}, {170.838959,74.8769836}, {171.219482,74.8223114}, {171.600006,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=0.440476 {{{253,74.8000031}, {68.1999969,74.8000031}}}
575debugShowCubicLineIntersection wtTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.757019}, {173.066666,74.7623062}, {173.800003,74.8000031}}} {{171.600006,74.8000031}} wtTs[1]=1 {{173.800003,74.8000031}} wnTs[0]=0.440476 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=0.428571405
576debugShowCubicLineIntersection wtTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.8360367}, {175.201599,74.9249344}, {175.902405,75.0138397}}} {{173.800003,74.8000031}} wnTs[0]=0.428571 {{{253,74.8000031}, {68.1999969,74.8000031}}}
577debugShowCubicLineIntersection wtTs[0]=1 {{{248.714218,74.8446655}, {249.40947,74.8261032}, {250.104736,74.8075485}, {250.800003,74.8000031}}} {{250.800003,74.8000031}} wnTs[0]=0.0119047 {{{253,74.8000031}, {68.1999969,74.8000031}}}
578debugShowCubicLineIntersection wtTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.7947006}, {251.777771,74.7964706}, {252.266663,74.798233}}} {{250.800003,74.8000031}} wnTs[0]=0.0119047 {{{253,74.8000031}, {68.1999969,74.8000031}}}
579debugShowCubicLineIntersection wtTs[0]=1 {{{252.266663,74.798233}, {252.511108,74.799118}, {252.755554,74.8000031}, {253,74.8000031}}} {{253,74.8000031}} wnTs[0]=0 {{{253,74.8000031}, {68.1999969,74.8000031}}}
580debugShowLineIntersection wtTs[0]=0 {{{253,74.8000031}, {68.1999969,74.8000031}}} {{253,74.8000031}} wtTs[1]=1 {{68.1999969,74.8000031}} wnTs[0]=0 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=1
581debugShowCubicIntersection wtTs[0]=1 {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.7961044}, {68.9333344,74.7922058}}} {{68.9333344,74.7922058}} wnTs[0]=0 {{{68.9333344,74.7922058}, {69.422226,74.7844086}, {69.9111099,74.7766113}, {70.4000015,74.8000031}}}
582debugShowCubicLineIntersection wtTs[0]=0 {{{68.1999969,74.8000031}, {68.4444427,74.8000031}, {68.6888885,74.7961044}, {68.9333344,74.7922058}}} {{68.1999969,74.8000031}} wnTs[0]=1 {{{253,74.8000031}, {68.1999969,74.8000031}}}
583debugShowCubicIntersection wtTs[0]=1 {{{68.9333344,74.7922058}, {69.422226,74.7844086}, {69.9111099,74.7766113}, {70.4000015,74.8000031}}} {{70.4000015,74.8000031}} wnTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.8181686}, {71.1592636,74.8627396}, {71.5388947,74.9073105}}}
584debugShowCubicLineIntersection wtTs[0]=1 {{{68.9333344,74.7922058}, {69.422226,74.7844086}, {69.9111099,74.7766113}, {70.4000015,74.8000031}}} {{70.4000015,74.8000031}} wnTs[0]=0.988095 {{{253,74.8000031}, {68.1999969,74.8000031}}}
585debugShowCubicIntersection wtTs[0]=1 {{{70.4000015,74.8000031}, {70.7796326,74.8181686}, {71.1592636,74.8627396}, {71.5388947,74.9073105}}} {{71.5388947,74.9073105}} wnTs[0]=0 {{{71.5388947,74.9073105}, {71.8925934,74.9488373}, {72.2462997,74.9903641}, {72.5999985,75.0105362}}}
586debugShowCubicLineIntersection wtTs[0]=0 {{{70.4000015,74.8000031}, {70.7796326,74.8181686}, {71.1592636,74.8627396}, {71.5388947,74.9073105}}} {{70.4000015,74.8000031}} wnTs[0]=0.988095 {{{253,74.8000031}, {68.1999969,74.8000031}}}
587debugShowCubicIntersection wtTs[0]=1 {{{71.5388947,74.9073105}, {71.8925934,74.9488373}, {72.2462997,74.9903641}, {72.5999985,75.0105362}}} {{72.5999985,75.0105362}} wnTs[0]=0 {{{72.5999985,75.0105362}, {73.1301117,75.0407715}, {73.6602249,75.0435104}, {74.1903381,75.0462494}}}
588debugShowCubicIntersection wtTs[0]=1 {{{72.5999985,75.0105362}, {73.1301117,75.0407715}, {73.6602249,75.0435104}, {74.1903381,75.0462494}}} {{74.1903381,75.0462494}} wnTs[0]=0 {{{74.1903381,75.0462494}, {74.3935623,75.0472946}, {74.5967789,75.0483398}, {74.8000031,75.0509415}}}
589debugShowCubicIntersection wtTs[0]=1 {{{74.1903381,75.0462494}, {74.3935623,75.0472946}, {74.5967789,75.0483398}, {74.8000031,75.0509415}}} {{74.8000031,75.0509415}} wnTs[0]=0 {{{74.8000031,75.0509415}, {75.0211792,75.053772}, {75.242363,75.0601425}, {75.4635391,75.0665054}}}
590debugShowCubicIntersection wtTs[0]=1 {{{74.8000031,75.0509415}, {75.0211792,75.053772}, {75.242363,75.0601425}, {75.4635391,75.0665054}}} {{75.4635391,75.0665054}} wnTs[0]=0 {{{75.4635391,75.0665054}, {75.9756927,75.0812454}, {76.4878464,75.0959854}, {77,75.0667953}}}
591debugShowCubicIntersection wtTs[0]=1 {{{75.4635391,75.0665054}, {75.9756927,75.0812454}, {76.4878464,75.0959854}, {77,75.0667953}}} {{77,75.0667953}} wnTs[0]=0 {{{77,75.0667953}, {77.3702316,75.0456924}, {77.7404709,74.9892731}, {78.1107025,74.9328461}}}
592debugShowCubicIntersection wtTs[0]=1 {{{77,75.0667953}, {77.3702316,75.0456924}, {77.7404709,74.9892731}, {78.1107025,74.9328461}}} {{78.1107025,74.9328461}} wnTs[0]=0 {{{78.1107025,74.9328461}, {78.4738007,74.8775101}, {78.8368988,74.8221741}, {79.1999969,74.8001556}}}
593debugShowCubicIntersection wtTs[0]=1 {{{78.1107025,74.9328461}, {78.4738007,74.8775101}, {78.8368988,74.8221741}, {79.1999969,74.8001556}}} {{79.1999969,74.8001556}} wnTs[0]=0 {{{79.1999969,74.8001556}, {79.689003,74.7705002}, {80.1780014,74.7803421}, {80.6670074,74.790184}}}
594debugShowCubicIntersection wtTs[0]=1 {{{79.1999969,74.8001556}, {79.689003,74.7705002}, {80.1780014,74.7803421}, {80.6670074,74.790184}}} {{80.6670074,74.790184}} wnTs[0]=0 {{{80.6670074,74.790184}, {80.9113388,74.7950974}, {81.1556702,74.8000107}, {81.4000015,74.8000031}}}
595debugShowCubicLineIntersection wtTs[0]=0.0017190524 {{{79.1999969,74.8001556}, {79.689003,74.7705002}, {80.1780014,74.7803421}, {80.6670074,74.790184}}} {{79.2025223,74.8000031}} wnTs[0]=0.940463 {{{253,74.8000031}, {68.1999969,74.8000031}}}
596debugShowCubicIntersection wtTs[0]=1 {{{80.6670074,74.790184}, {80.9113388,74.7950974}, {81.1556702,74.8000107}, {81.4000015,74.8000031}}} {{81.4000015,74.8000031}} wnTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.7999954}, {81.8877106,74.7989426}, {82.1315613,74.7978897}}}
597debugShowCubicLineIntersection wtTs[0]=0.99844881 {{{80.6670074,74.790184}, {80.9113388,74.7950974}, {81.1556702,74.8000107}, {81.4000015,74.8000031}}} {{81.3988647,74.8000031}} wtTs[1]=1 {{81.4000015,74.8000031}} wnTs[0]=0.928578 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=0.928571405
598debugShowCubicIntersection wtTs[0]=1 {{{81.4000015,74.8000031}, {81.6438522,74.7999954}, {81.8877106,74.7989426}, {82.1315613,74.7978897}}} {{82.1315613,74.7978897}} wnTs[0]=0 {{{82.1315613,74.7978897}, {82.6210403,74.7957764}, {83.1105194,74.7936554}, {83.5999985,74.8000031}}}
599debugShowCubicLineIntersection wtTs[0]=0 {{{81.4000015,74.8000031}, {81.6438522,74.7999954}, {81.8877106,74.7989426}, {82.1315613,74.7978897}}} {{81.4000015,74.8000031}} wnTs[0]=0.928571 {{{253,74.8000031}, {68.1999969,74.8000031}}}
600debugShowCubicIntersection wtTs[0]=1 {{{82.1315613,74.7978897}, {82.6210403,74.7957764}, {83.1105194,74.7936554}, {83.5999985,74.8000031}}} {{83.5999985,74.8000031}} wnTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.8042297}, {84.2518234,74.8159714}, {84.5777359,74.827713}}}
601debugShowCubicLineIntersection wtTs[0]=1 {{{82.1315613,74.7978897}, {82.6210403,74.7957764}, {83.1105194,74.7936554}, {83.5999985,74.8000031}}} {{83.5999985,74.8000031}} wnTs[0]=0.916667 {{{253,74.8000031}, {68.1999969,74.8000031}}}
602debugShowCubicIntersection wtTs[0]=1 {{{83.5999985,74.8000031}, {83.9259109,74.8042297}, {84.2518234,74.8159714}, {84.5777359,74.827713}}} {{84.5777359,74.827713}} wnTs[0]=0 {{{84.5777359,74.827713}, {84.9851608,74.842392}, {85.3925781,74.8570709}, {85.8000031,74.8570709}}}
603debugShowCubicLineIntersection wtTs[0]=0 {{{83.5999985,74.8000031}, {83.9259109,74.8042297}, {84.2518234,74.8159714}, {84.5777359,74.827713}}} {{83.5999985,74.8000031}} wnTs[0]=0.916667 {{{253,74.8000031}, {68.1999969,74.8000031}}}
604debugShowCubicIntersection wtTs[0]=1 {{{84.5777359,74.827713}, {84.9851608,74.842392}, {85.3925781,74.8570709}, {85.8000031,74.8570709}}} {{85.8000031,74.8570709}} wnTs[0]=0 {{{85.8000031,74.8570709}, {86.2074203,74.8570709}, {86.6148453,74.842392}, {87.0222626,74.827713}}}
605debugShowCubicIntersection wtTs[0]=1 {{{85.8000031,74.8570709}, {86.2074203,74.8570709}, {86.6148453,74.842392}, {87.0222626,74.827713}}} {{87.0222626,74.827713}} wnTs[0]=0 {{{87.0222626,74.827713}, {87.348175,74.8159714}, {87.6740875,74.8042297}, {88,74.8000031}}}
606debugShowCubicIntersection wtTs[0]=1 {{{87.0222626,74.827713}, {87.348175,74.8159714}, {87.6740875,74.8042297}, {88,74.8000031}}} {{88,74.8000031}} wnTs[0]=0 {{{88,74.8000031}, {88.1576462,74.7979584}, {88.3152924,74.7951202}, {88.4729385,74.7922745}}}
607debugShowCubicLineIntersection wtTs[0]=1 {{{87.0222626,74.827713}, {87.348175,74.8159714}, {87.6740875,74.8042297}, {88,74.8000031}}} {{88,74.8000031}} wnTs[0]=0.892857 {{{253,74.8000031}, {68.1999969,74.8000031}}}
608debugShowCubicIntersection wtTs[0]=1 {{{88,74.8000031}, {88.1576462,74.7979584}, {88.3152924,74.7951202}, {88.4729385,74.7922745}}} {{88.4729385,74.7922745}} wnTs[0]=0 {{{88.4729385,74.7922745}, {89.0486221,74.7818985}, {89.6243134,74.7715225}, {90.1999969,74.8000031}}}
609debugShowCubicLineIntersection wtTs[0]=0 {{{88,74.8000031}, {88.1576462,74.7979584}, {88.3152924,74.7951202}, {88.4729385,74.7922745}}} {{88,74.8000031}} wnTs[0]=0.892857 {{{253,74.8000031}, {68.1999969,74.8000031}}}
610debugShowCubicIntersection wtTs[0]=1 {{{88.4729385,74.7922745}, {89.0486221,74.7818985}, {89.6243134,74.7715225}, {90.1999969,74.8000031}}} {{90.1999969,74.8000031}} wnTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.8179169}, {90.9241028,74.8630524}, {91.2861557,74.9081879}}}
611debugShowCubicLineIntersection wtTs[0]=1 {{{88.4729385,74.7922745}, {89.0486221,74.7818985}, {89.6243134,74.7715225}, {90.1999969,74.8000031}}} {{90.1999969,74.8000031}} wnTs[0]=0.880952 {{{253,74.8000031}, {68.1999969,74.8000031}}}
612debugShowCubicIntersection wtTs[0]=1 {{{90.1999969,74.8000031}, {90.5620499,74.8179169}, {90.9241028,74.8630524}, {91.2861557,74.9081879}}} {{91.2861557,74.9081879}} wnTs[0]=0 {{{91.2861557,74.9081879}, {91.6574402,74.9544754}, {92.028717,75.0007629}, {92.4000015,75.0176926}}}
613debugShowCubicLineIntersection wtTs[0]=0 {{{90.1999969,74.8000031}, {90.5620499,74.8179169}, {90.9241028,74.8630524}, {91.2861557,74.9081879}}} {{90.1999969,74.8000031}} wnTs[0]=0.880952 {{{253,74.8000031}, {68.1999969,74.8000031}}}
614debugShowCubicIntersection wtTs[0]=1 {{{91.2861557,74.9081879}, {91.6574402,74.9544754}, {92.028717,75.0007629}, {92.4000015,75.0176926}}} {{92.4000015,75.0176926}} wnTs[0]=0 {{{92.4000015,75.0176926}, {92.9111481,75.0410004}, {93.4223022,75.0278778}, {93.9334488,75.0147552}}}
615debugShowCubicIntersection wtTs[0]=1 {{{92.4000015,75.0176926}, {92.9111481,75.0410004}, {93.4223022,75.0278778}, {93.9334488,75.0147552}}} {{93.9334488,75.0147552}} wnTs[0]=0 {{{93.9334488,75.0147552}, {94.155632,75.0090561}, {94.3778152,75.0033493}, {94.5999985,75.0006409}}}
616debugShowCubicIntersection wtTs[0]=1 {{{93.9334488,75.0147552}, {94.155632,75.0090561}, {94.3778152,75.0033493}, {94.5999985,75.0006409}}} {{94.5999985,75.0006409}} wnTs[0]=0 {{{94.5999985,75.0006409}, {94.8669891,74.9973831}, {95.1339798,74.9889908}, {95.4009705,74.9806061}}}
617debugShowCubicIntersection wtTs[0]=1 {{{94.5999985,75.0006409}, {94.8669891,74.9973831}, {95.1339798,74.9889908}, {95.4009705,74.9806061}}} {{95.4009705,74.9806061}} wnTs[0]=0 {{{95.4009705,74.9806061}, {95.8673172,74.9659576}, {96.3336563,74.9513092}, {96.8000031,74.9639893}}}
618debugShowCubicIntersection wtTs[0]=1 {{{95.4009705,74.9806061}, {95.8673172,74.9659576}, {96.3336563,74.9513092}, {96.8000031,74.9639893}}} {{96.8000031,74.9639893}} wnTs[0]=0 {{{96.8000031,74.9639893}, {97.2396164,74.9759521}, {97.6792297,75.0139465}, {98.1188431,75.0519409}}}
619debugShowCubicIntersection wtTs[0]=1 {{{96.8000031,74.9639893}, {97.2396164,74.9759521}, {97.6792297,75.0139465}, {98.1188431,75.0519409}}} {{98.1188431,75.0519409}} wnTs[0]=0 {{{98.1188431,75.0519409}, {98.4125595,75.0773239}, {98.7062836,75.1027069}, {99,75.1203232}}}
620debugShowCubicIntersection wtTs[0]=1 {{{98.1188431,75.0519409}, {98.4125595,75.0773239}, {98.7062836,75.1027069}, {99,75.1203232}}} {{99,75.1203232}} wnTs[0]=0 {{{99,75.1203232}, {99.7333298,75.1643066}, {100.466667,75.2075195}, {101.199997,75.2278976}}}
621debugShowCubicIntersection wtTs[0]=1 {{{99,75.1203232}, {99.7333298,75.1643066}, {100.466667,75.2075195}, {101.199997,75.2278976}}} {{101.199997,75.2278976}} wnTs[0]=0 {{{101.199997,75.2278976}, {101.6632,75.2407608}, {102.126396,75.2405472}, {102.5896,75.2403336}}}
622debugShowCubicIntersection wtTs[0]=1 {{{101.199997,75.2278976}, {101.6632,75.2407608}, {102.126396,75.2405472}, {102.5896,75.2403336}}} {{102.5896,75.2403336}} wnTs[0]=0 {{{102.5896,75.2403336}, {102.859734,75.2402115}, {103.129868,75.2400894}, {103.400002,75.2425613}}}
623debugShowCubicIntersection wtTs[0]=1 {{{102.5896,75.2403336}, {102.859734,75.2402115}, {103.129868,75.2400894}, {103.400002,75.2425613}}} {{103.400002,75.2425613}} wnTs[0]=0 {{{103.400002,75.2425613}, {103.499123,75.2434692}, {103.598244,75.2443542}, {103.697365,75.2452393}}}
624debugShowCubicIntersection wtTs[0]=1 {{{103.400002,75.2425613}, {103.499123,75.2434692}, {103.598244,75.2443542}, {103.697365,75.2452393}}} {{103.697365,75.2452393}} wnTs[0]=0 {{{103.697365,75.2452393}, {104.331573,75.250885}, {104.96579,75.2565308}, {105.599998,75.2681274}}}
625debugShowCubicIntersection wtTs[0]=1 {{{103.697365,75.2452393}, {104.331573,75.250885}, {104.96579,75.2565308}, {105.599998,75.2681274}}} {{105.599998,75.2681274}} wnTs[0]=0 {{{105.599998,75.2681274}, {105.951164,75.2745514}, {106.30233,75.2846603}, {106.653496,75.2947693}}}
626debugShowCubicIntersection wtTs[0]=1 {{{105.599998,75.2681274}, {105.951164,75.2745514}, {106.30233,75.2846603}, {106.653496,75.2947693}}} {{106.653496,75.2947693}} wnTs[0]=0 {{{106.653496,75.2947693}, {107.035667,75.3057709}, {107.417831,75.3167725}, {107.800003,75.3230209}}}
627debugShowCubicIntersection wtTs[0]=1 {{{106.653496,75.2947693}, {107.035667,75.3057709}, {107.417831,75.3167725}, {107.800003,75.3230209}}} {{107.800003,75.3230209}} wnTs[0]=0 {{{107.800003,75.3230209}, {107.904305,75.3247223}, {108.008606,75.3265228}, {108.112907,75.3283234}}}
628debugShowCubicIntersection wtTs[0]=1 {{{107.800003,75.3230209}, {107.904305,75.3247223}, {108.008606,75.3265228}, {108.112907,75.3283234}}} {{108.112907,75.3283234}} wnTs[0]=0 {{{108.112907,75.3283234}, {108.741936,75.33918}, {109.370972,75.350029}, {110,75.340065}}}
629debugShowCubicIntersection wtTs[0]=1 {{{108.112907,75.3283234}, {108.741936,75.33918}, {109.370972,75.350029}, {110,75.340065}}} {{110,75.340065}} wnTs[0]=0 {{{110,75.340065}, {110.73333,75.3284454}, {111.466667,75.2919846}, {112.199997,75.2532883}}}
630debugShowCubicIntersection wtTs[0]=1 {{{110,75.340065}, {110.73333,75.3284454}, {111.466667,75.2919846}, {112.199997,75.2532883}}} {{112.199997,75.2532883}} wnTs[0]=0 {{{112.199997,75.2532883}, {112.524193,75.2361755}, {112.848389,75.2113037}, {113.172585,75.1864319}}}
631debugShowCubicIntersection wtTs[0]=1 {{{112.199997,75.2532883}, {112.524193,75.2361755}, {112.848389,75.2113037}, {113.172585,75.1864319}}} {{113.172585,75.1864319}} wnTs[0]=0 {{{113.172585,75.1864319}, {113.581726,75.1550446}, {113.99086,75.1236496}, {114.400002,75.1078644}}}
632debugShowCubicIntersection wtTs[0]=1 {{{113.172585,75.1864319}, {113.581726,75.1550446}, {113.99086,75.1236496}, {114.400002,75.1078644}}} {{114.400002,75.1078644}} wnTs[0]=0 {{{114.400002,75.1078644}, {115.133331,75.079567}, {115.866669,75.0734863}, {116.599998,75.0834885}}}
633debugShowCubicIntersection wtTs[0]=1 {{{114.400002,75.1078644}, {115.133331,75.079567}, {115.866669,75.0734863}, {116.599998,75.0834885}}} {{116.599998,75.0834885}} wnTs[0]=0 {{{116.599998,75.0834885}, {117.013039,75.089119}, {117.426071,75.1088409}, {117.839111,75.1285629}}}
634debugShowCubicIntersection wtTs[0]=1 {{{116.599998,75.0834885}, {117.013039,75.089119}, {117.426071,75.1088409}, {117.839111,75.1285629}}} {{117.839111,75.1285629}} wnTs[0]=0 {{{117.839111,75.1285629}, {118.159409,75.1438599}, {118.479706,75.1591568}, {118.800003,75.1678772}}}
635debugShowCubicIntersection wtTs[0]=1 {{{117.839111,75.1285629}, {118.159409,75.1438599}, {118.479706,75.1591568}, {118.800003,75.1678772}}} {{118.800003,75.1678772}} wnTs[0]=0 {{{118.800003,75.1678772}, {118.915619,75.1710281}, {119.031235,75.1743622}, {119.146851,75.1776962}}}
636debugShowCubicIntersection wtTs[0]=1 {{{118.800003,75.1678772}, {118.915619,75.1710281}, {119.031235,75.1743622}, {119.146851,75.1776962}}} {{119.146851,75.1776962}} wnTs[0]=0 {{{119.146851,75.1776962}, {119.764565,75.1954956}, {120.382286,75.2133026}, {121,75.2033386}}}
637debugShowCubicIntersection wtTs[0]=1 {{{119.146851,75.1776962}, {119.764565,75.1954956}, {120.382286,75.2133026}, {121,75.2033386}}} {{121,75.2033386}} wnTs[0]=0 {{{121,75.2033386}, {121.552635,75.1944351}, {122.105278,75.1614532}, {122.657913,75.1284714}}}
638debugShowCubicIntersection wtTs[0]=1 {{{121,75.2033386}, {121.552635,75.1944351}, {122.105278,75.1614532}, {122.657913,75.1284714}}} {{122.657913,75.1284714}} wnTs[0]=0 {{{122.657913,75.1284714}, {122.838608,75.1176834}, {123.019302,75.1068954}, {123.199997,75.0969543}}}
639debugShowCubicIntersection wtTs[0]=1 {{{122.657913,75.1284714}, {122.838608,75.1176834}, {123.019302,75.1068954}, {123.199997,75.0969543}}} {{123.199997,75.0969543}} wnTs[0]=0 {{{123.199997,75.0969543}, {123.480431,75.0815277}, {123.760864,75.060524}, {124.041298,75.0395203}}}
640debugShowCubicIntersection wtTs[0]=1 {{{123.199997,75.0969543}, {123.480431,75.0815277}, {123.760864,75.060524}, {124.041298,75.0395203}}} {{124.041298,75.0395203}} wnTs[0]=0 {{{124.041298,75.0395203}, {124.494202,75.0056076}, {124.947098,74.9716949}, {125.400002,74.9612503}}}
641debugShowCubicIntersection wtTs[0]=1 {{{124.041298,75.0395203}, {124.494202,75.0056076}, {124.947098,74.9716949}, {125.400002,74.9612503}}} {{125.400002,74.9612503}} wnTs[0]=0 {{{125.400002,74.9612503}, {126.133331,74.9443436}, {126.866669,74.9602585}, {127.599998,74.9955215}}}
642debugShowCubicIntersection wtTs[0]=1 {{{125.400002,74.9612503}, {126.133331,74.9443436}, {126.866669,74.9602585}, {127.599998,74.9955215}}} {{127.599998,74.9955215}} wnTs[0]=0 {{{127.599998,74.9955215}, {128.17691,75.023262}, {128.75383,75.0766068}, {129.33075,75.1299438}}}
643debugShowCubicIntersection wtTs[0]=1 {{{127.599998,74.9955215}, {128.17691,75.023262}, {128.75383,75.0766068}, {129.33075,75.1299438}}} {{129.33075,75.1299438}} wnTs[0]=0 {{{129.33075,75.1299438}, {129.487167,75.1444092}, {129.643585,75.1588745}, {129.800003,75.1728287}}}
644debugShowCubicIntersection wtTs[0]=1 {{{129.33075,75.1299438}, {129.487167,75.1444092}, {129.643585,75.1588745}, {129.800003,75.1728287}}} {{129.800003,75.1728287}} wnTs[0]=0 {{{129.800003,75.1728287}, {130.08493,75.1982422}, {130.369843,75.2303619}, {130.65477,75.2624817}}}
645debugShowCubicIntersection wtTs[0]=1 {{{129.800003,75.1728287}, {130.08493,75.1982422}, {130.369843,75.2303619}, {130.65477,75.2624817}}} {{130.65477,75.2624817}} wnTs[0]=0 {{{130.65477,75.2624817}, {131.10318,75.3130264}, {131.55159,75.3635712}, {132,75.3879776}}}
646debugShowCubicIntersection wtTs[0]=1 {{{130.65477,75.2624817}, {131.10318,75.3130264}, {131.55159,75.3635712}, {132,75.3879776}}} {{132,75.3879776}} wnTs[0]=0 {{{132,75.3879776}, {132.682098,75.4251099}, {133.364182,75.4193726}, {134.04628,75.4136353}}}
647debugShowCubicLineIntersection wtTs[0]=1 {{{132,75.3879776}, {132.682098,75.4251099}, {133.364182,75.4193726}, {134.04628,75.4136353}}} {{134.04628,75.4136353}} wnTs[0]=0 {{{134.04628,75.4136353}, {134.199997,75.4123535}}}
648debugShowCubicLineIntersection wtTs[0]=0 {{{134.199997,75.4123535}, {134.740479,75.4080048}, {135.28096,75.3897247}, {135.821426,75.3714523}}} {{134.199997,75.4123535}} wnTs[0]=1 {{{134.04628,75.4136353}, {134.199997,75.4123535}}}
649debugShowCubicIntersection wtTs[0]=1 {{{134.199997,75.4123535}, {134.740479,75.4080048}, {135.28096,75.3897247}, {135.821426,75.3714523}}} {{135.821426,75.3714523}} wnTs[0]=0 {{{135.821426,75.3714523}, {136.014282,75.3649292}, {136.207138,75.3584061}, {136.399994,75.3525162}}}
650debugShowCubicIntersection wtTs[0]=1 {{{135.821426,75.3714523}, {136.014282,75.3649292}, {136.207138,75.3584061}, {136.399994,75.3525162}}} {{136.399994,75.3525162}} wnTs[0]=0 {{{136.399994,75.3525162}, {136.723831,75.3426285}, {137.047668,75.3308029}, {137.371506,75.3189697}}}
651debugShowCubicIntersection wtTs[0]=1 {{{136.399994,75.3525162}, {136.723831,75.3426285}, {137.047668,75.3308029}, {137.371506,75.3189697}}} {{137.371506,75.3189697}} wnTs[0]=0 {{{137.371506,75.3189697}, {137.781006,75.3040085}, {138.190506,75.2890472}, {138.600006,75.2780228}}}
652debugShowCubicIntersection wtTs[0]=1 {{{137.371506,75.3189697}, {137.781006,75.3040085}, {138.190506,75.2890472}, {138.600006,75.2780228}}} {{138.600006,75.2780228}} wnTs[0]=0 {{{138.600006,75.2780228}, {138.775055,75.2733078}, {138.950119,75.2678604}, {139.125183,75.262413}}}
653debugShowCubicIntersection wtTs[0]=1 {{{138.600006,75.2780228}, {138.775055,75.2733078}, {138.950119,75.2678604}, {139.125183,75.262413}}} {{139.125183,75.262413}} wnTs[0]=0 {{{139.125183,75.262413}, {139.683456,75.2450409}, {140.24173,75.2276688}, {140.800003,75.2340317}}}
654debugShowCubicIntersection wtTs[0]=1 {{{139.125183,75.262413}, {139.683456,75.2450409}, {140.24173,75.2276688}, {140.800003,75.2340317}}} {{140.800003,75.2340317}} wnTs[0]=0 {{{140.800003,75.2340317}, {141.173523,75.2382889}, {141.547028,75.259819}, {141.920547,75.2813568}}}
655debugShowCubicIntersection wtTs[0]=1 {{{140.800003,75.2340317}, {141.173523,75.2382889}, {141.547028,75.259819}, {141.920547,75.2813568}}} {{141.920547,75.2813568}} wnTs[0]=0 {{{141.920547,75.2813568}, {142.280365,75.3021011}, {142.640182,75.3228455}, {143,75.3281403}}}
656debugShowCubicIntersection wtTs[0]=1 {{{141.920547,75.2813568}, {142.280365,75.3021011}, {142.640182,75.3228455}, {143,75.3281403}}} {{143,75.3281403}} wnTs[0]=0 {{{143,75.3281403}, {143.733337,75.3389359}, {144.46666,75.3424072}, {145.199997,75.2988205}}}
657debugShowCubicIntersection wtTs[0]=1 {{{143,75.3281403}, {143.733337,75.3389359}, {144.46666,75.3424072}, {145.199997,75.2988205}}} {{145.199997,75.2988205}} wnTs[0]=0 {{{145.199997,75.2988205}, {145.574966,75.276535}, {145.949936,75.2288513}, {146.32489,75.1811676}}}
658debugShowCubicIntersection wtTs[0]=1 {{{145.199997,75.2988205}, {145.574966,75.276535}, {145.949936,75.2288513}, {146.32489,75.1811676}}} {{146.32489,75.1811676}} wnTs[0]=0 {{{146.32489,75.1811676}, {146.683258,75.1355896}, {147.041626,75.0900192}, {147.399994,75.0666199}}}
659debugShowCubicIntersection wtTs[0]=1 {{{146.32489,75.1811676}, {146.683258,75.1355896}, {147.041626,75.0900192}, {147.399994,75.0666199}}} {{147.399994,75.0666199}} wnTs[0]=0 {{{147.399994,75.0666199}, {148.133331,75.0187454}, {148.866669,74.9981079}, {149.600006,75.0115509}}}
660debugShowCubicIntersection wtTs[0]=1 {{{147.399994,75.0666199}, {148.133331,75.0187454}, {148.866669,74.9981079}, {149.600006,75.0115509}}} {{149.600006,75.0115509}} wnTs[0]=0 {{{149.600006,75.0115509}, {149.982086,75.0185547}, {150.364182,75.0495148}, {150.746277,75.0804749}}}
661debugShowCubicIntersection wtTs[0]=1 {{{149.600006,75.0115509}, {149.982086,75.0185547}, {150.364182,75.0495148}, {150.746277,75.0804749}}} {{150.746277,75.0804749}} wnTs[0]=0 {{{150.746277,75.0804749}, {151.097519,75.1089401}, {151.448761,75.1374054}, {151.800003,75.1472549}}}
662debugShowCubicIntersection wtTs[0]=1 {{{150.746277,75.0804749}, {151.097519,75.1089401}, {151.448761,75.1374054}, {151.800003,75.1472549}}} {{151.800003,75.1472549}} wnTs[0]=0 {{{151.800003,75.1472549}, {152.343307,75.1624985}, {152.886597,75.1531296}, {153.429901,75.1437607}}}
663debugShowCubicIntersection wtTs[0]=1 {{{151.800003,75.1472549}, {152.343307,75.1624985}, {152.886597,75.1531296}, {153.429901,75.1437607}}} {{153.429901,75.1437607}} wnTs[0]=0 {{{153.429901,75.1437607}, {153.619934,75.14048}, {153.809967,75.137207}, {154,75.1349792}}}
664debugShowCubicIntersection wtTs[0]=1 {{{153.429901,75.1437607}, {153.619934,75.14048}, {153.809967,75.137207}, {154,75.1349792}}} {{154,75.1349792}} wnTs[0]=0 {{{154,75.1349792}, {154.295746,75.1315155}, {154.591476,75.123848}, {154.887222,75.1161804}}}
665debugShowCubicIntersection wtTs[0]=1 {{{154,75.1349792}, {154.295746,75.1315155}, {154.591476,75.123848}, {154.887222,75.1161804}}} {{154.887222,75.1161804}} wnTs[0]=0 {{{154.887222,75.1161804}, {155.324814,75.1048279}, {155.762405,75.0934753}, {156.199997,75.0957642}}}
666debugShowCubicIntersection wtTs[0]=1 {{{154.887222,75.1161804}, {155.324814,75.1048279}, {155.762405,75.0934753}, {156.199997,75.0957642}}} {{156.199997,75.0957642}} wnTs[0]=0 {{{156.199997,75.0957642}, {156.559143,75.097641}, {156.918289,75.1122131}, {157.27742,75.1267853}}}
667debugShowCubicIntersection wtTs[0]=1 {{{156.199997,75.0957642}, {156.559143,75.097641}, {156.918289,75.1122131}, {157.27742,75.1267853}}} {{157.27742,75.1267853}} wnTs[0]=0 {{{157.27742,75.1267853}, {157.651611,75.1419754}, {158.025803,75.1571655}, {158.399994,75.1579895}}}
668debugShowCubicIntersection wtTs[0]=1 {{{157.27742,75.1267853}, {157.651611,75.1419754}, {158.025803,75.1571655}, {158.399994,75.1579895}}} {{158.399994,75.1579895}} wnTs[0]=0 {{{158.399994,75.1579895}, {159.133331,75.1596069}, {159.866669,75.1515121}, {160.600006,75.105484}}}
669debugShowCubicIntersection wtTs[0]=1 {{{158.399994,75.1579895}, {159.133331,75.1596069}, {159.866669,75.1515121}, {160.600006,75.105484}}} {{160.600006,75.105484}} wnTs[0]=0 {{{160.600006,75.105484}, {160.952393,75.0833588}, {161.304794,75.0397339}, {161.657196,74.996109}}}
670debugShowCubicIntersection wtTs[0]=1 {{{160.600006,75.105484}, {160.952393,75.0833588}, {161.304794,75.0397339}, {161.657196,74.996109}}} {{161.657196,74.996109}} wnTs[0]=0 {{{161.657196,74.996109}, {162.038132,74.9489594}, {162.419067,74.9018021}, {162.800003,74.8818054}}}
671debugShowCubicIntersection wtTs[0]=1 {{{161.657196,74.996109}, {162.038132,74.9489594}, {162.419067,74.9018021}, {162.800003,74.8818054}}} {{162.800003,74.8818054}} wnTs[0]=0 {{{162.800003,74.8818054}, {163.53334,74.8433075}, {164.266663,74.8363724}, {165,74.8744736}}}
672debugShowCubicIntersection wtTs[0]=1 {{{162.800003,74.8818054}, {163.53334,74.8433075}, {164.266663,74.8363724}, {165,74.8744736}}} {{165,74.8744736}} wnTs[0]=0 {{{165,74.8744736}, {165.356293,74.8929825}, {165.712585,74.9419861}, {166.068878,74.9909897}}}
673debugShowCubicIntersection wtTs[0]=1 {{{165,74.8744736}, {165.356293,74.8929825}, {165.712585,74.9419861}, {166.068878,74.9909897}}} {{166.068878,74.9909897}} wnTs[0]=0 {{{166.068878,74.9909897}, {166.445923,75.0428467}, {166.822952,75.0947037}, {167.199997,75.1104279}}}
674debugShowCubicIntersection wtTs[0]=1 {{{166.068878,74.9909897}, {166.445923,75.0428467}, {166.822952,75.0947037}, {167.199997,75.1104279}}} {{167.199997,75.1104279}} wnTs[0]=0 {{{167.199997,75.1104279}, {167.933334,75.1409988}, {168.666672,75.1096573}, {169.399994,75.0579224}}}
675debugShowCubicIntersection wtTs[0]=1 {{{167.199997,75.1104279}, {167.933334,75.1409988}, {168.666672,75.1096573}, {169.399994,75.0579224}}} {{169.399994,75.0579224}} wnTs[0]=0 {{{169.399994,75.0579224}, {169.752808,75.0330276}, {170.105621,74.982338}, {170.458435,74.9316483}}}
676debugShowCubicIntersection wtTs[0]=1 {{{169.399994,75.0579224}, {169.752808,75.0330276}, {170.105621,74.982338}, {170.458435,74.9316483}}} {{170.458435,74.9316483}} wnTs[0]=0 {{{170.458435,74.9316483}, {170.838959,74.8769836}, {171.219482,74.8223114}, {171.600006,74.8000031}}}
677debugShowCubicIntersection wtTs[0]=1 {{{170.458435,74.9316483}, {170.838959,74.8769836}, {171.219482,74.8223114}, {171.600006,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.757019}, {173.066666,74.7623062}, {173.800003,74.8000031}}}
678debugShowCubicLineIntersection wtTs[0]=1 {{{170.458435,74.9316483}, {170.838959,74.8769836}, {171.219482,74.8223114}, {171.600006,74.8000031}}} {{171.600006,74.8000031}} wnTs[0]=0.440476 {{{253,74.8000031}, {68.1999969,74.8000031}}}
679debugShowCubicIntersection wtTs[0]=1 {{{171.600006,74.8000031}, {172.333328,74.757019}, {173.066666,74.7623062}, {173.800003,74.8000031}}} {{173.800003,74.8000031}} wnTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.8360367}, {175.201599,74.9249344}, {175.902405,75.0138397}}}
680debugShowCubicLineIntersection wtTs[0]=0 {{{171.600006,74.8000031}, {172.333328,74.757019}, {173.066666,74.7623062}, {173.800003,74.8000031}}} {{171.600006,74.8000031}} wtTs[1]=1 {{173.800003,74.8000031}} wnTs[0]=0.440476 {{{253,74.8000031}, {68.1999969,74.8000031}}} wnTs[1]=0.428571405
681debugShowCubicLineIntersection wtTs[0]=1 {{{173.800003,74.8000031}, {174.500809,74.8360367}, {175.201599,74.9249344}, {175.902405,75.0138397}}} {{175.902405,75.0138397}} wnTs[0]=0 {{{175.902405,75.0138397}, {176,75.0262146}}}
682debugShowCubicLineIntersection wtTs[0]=0 {{{173.800003,74.8000031}, {174.500809,74.8360367}, {175.201599,74.9249344}, {175.902405,75.0138397}}} {{173.800003,74.8000031}} wnTs[0]=0.428571 {{{253,74.8000031}, {68.1999969,74.8000031}}}
683debugShowCubicLineIntersection wtTs[0]=0 {{{176,75.0262146}, {176.306427,75.0650406}, {176.612839,75.1189728}, {176.919266,75.1729126}}} {{176,75.0262146}} wnTs[0]=1 {{{175.902405,75.0138397}, {176,75.0262146}}}
684debugShowCubicIntersection wtTs[0]=1 {{{176,75.0262146}, {176.306427,75.0650406}, {176.612839,75.1189728}, {176.919266,75.1729126}}} {{176.919266,75.1729126}} wnTs[0]=0 {{{176.919266,75.1729126}, {177.346176,75.2480545}, {177.773087,75.3231964}, {178.199997,75.3574677}}}
685debugShowCubicIntersection wtTs[0]=1 {{{176.919266,75.1729126}, {177.346176,75.2480545}, {177.773087,75.3231964}, {178.199997,75.3574677}}} {{178.199997,75.3574677}} wnTs[0]=0 {{{178.199997,75.3574677}, {178.933334,75.4163361}, {179.666672,75.4057388}, {180.399994,75.3794556}}}
686debugShowCubicIntersection wtTs[0]=1 {{{178.199997,75.3574677}, {178.933334,75.4163361}, {179.666672,75.4057388}, {180.399994,75.3794556}}} {{180.399994,75.3794556}} wnTs[0]=0 {{{180.399994,75.3794556}, {180.822174,75.3643265}, {181.244354,75.322731}, {181.666534,75.2811356}}}
687debugShowCubicIntersection wtTs[0]=1 {{{180.399994,75.3794556}, {180.822174,75.3643265}, {181.244354,75.322731}, {181.666534,75.2811356}}} {{181.666534,75.2811356}} wnTs[0]=0 {{{181.666534,75.2811356}, {181.977692,75.2504807}, {182.288849,75.2198257}, {182.600006,75.1997681}}}
688debugShowCubicIntersection wtTs[0]=1 {{{181.666534,75.2811356}, {181.977692,75.2504807}, {182.288849,75.2198257}, {182.600006,75.1997681}}} {{182.600006,75.1997681}} wnTs[0]=0 {{{182.600006,75.1997681}, {183.153549,75.1640701}, {183.707108,75.1412506}, {184.260666,75.1184311}}}
689debugShowCubicIntersection wtTs[0]=1 {{{182.600006,75.1997681}, {183.153549,75.1640701}, {183.707108,75.1412506}, {184.260666,75.1184311}}} {{184.260666,75.1184311}} wnTs[0]=0 {{{184.260666,75.1184311}, {184.440445,75.1110229}, {184.620224,75.1036148}, {184.800003,75.0957642}}}
690debugShowCubicIntersection wtTs[0]=1 {{{184.260666,75.1184311}, {184.440445,75.1110229}, {184.620224,75.1036148}, {184.800003,75.0957642}}} {{184.800003,75.0957642}} wnTs[0]=0 {{{184.800003,75.0957642}, {185.53334,75.0637436}, {186.266663,75.0331039}, {187,75.0076218}}}
691debugShowCubicIntersection wtTs[0]=1 {{{184.800003,75.0957642}, {185.53334,75.0637436}, {186.266663,75.0331039}, {187,75.0076218}}} {{187,75.0076218}} wnTs[0]=0 {{{187,75.0076218}, {187.218643,75.0000229}, {187.437286,74.9894943}, {187.65593,74.9789658}}}
692debugShowCubicIntersection wtTs[0]=1 {{{187,75.0076218}, {187.218643,75.0000229}, {187.437286,74.9894943}, {187.65593,74.9789658}}} {{187.65593,74.9789658}} wnTs[0]=0 {{{187.65593,74.9789658}, {188.170624,74.9541702}, {188.685303,74.9293747}, {189.199997,74.9428329}}}
693debugShowCubicIntersection wtTs[0]=1 {{{187.65593,74.9789658}, {188.170624,74.9541702}, {188.685303,74.9293747}, {189.199997,74.9428329}}} {{189.199997,74.9428329}} wnTs[0]=0 {{{189.199997,74.9428329}, {189.560562,74.9522629}, {189.921127,74.9923019}, {190.281693,75.032341}}}
694debugShowCubicIntersection wtTs[0]=1 {{{189.199997,74.9428329}, {189.560562,74.9522629}, {189.921127,74.9923019}, {190.281693,75.032341}}} {{190.281693,75.032341}} wnTs[0]=0 {{{190.281693,75.032341}, {190.654465,75.0737381}, {191.027237,75.1151352}, {191.399994,75.1227036}}}
695debugShowCubicIntersection wtTs[0]=1 {{{190.281693,75.032341}, {190.654465,75.0737381}, {191.027237,75.1151352}, {191.399994,75.1227036}}} {{191.399994,75.1227036}} wnTs[0]=0 {{{191.399994,75.1227036}, {191.942627,75.1337204}, {192.48526,75.0998383}, {193.027893,75.0659485}}}
696debugShowCubicIntersection wtTs[0]=1 {{{191.399994,75.1227036}, {191.942627,75.1337204}, {192.48526,75.0998383}, {193.027893,75.0659485}}} {{193.027893,75.0659485}} wnTs[0]=0 {{{193.027893,75.0659485}, {193.218597,75.054039}, {193.409302,75.0421295}, {193.600006,75.0321732}}}
697debugShowCubicIntersection wtTs[0]=1 {{{193.027893,75.0659485}, {193.218597,75.054039}, {193.409302,75.0421295}, {193.600006,75.0321732}}} {{193.600006,75.0321732}} wnTs[0]=0 {{{193.600006,75.0321732}, {193.897125,75.016655}, {194.19426,74.9936142}, {194.491394,74.9705658}}}
698debugShowCubicIntersection wtTs[0]=1 {{{193.600006,75.0321732}, {193.897125,75.016655}, {194.19426,74.9936142}, {194.491394,74.9705658}}} {{194.491394,74.9705658}} wnTs[0]=0 {{{194.491394,74.9705658}, {194.927597,74.9367371}, {195.3638,74.9029083}, {195.800003,74.8928909}}}
699debugShowCubicIntersection wtTs[0]=1 {{{194.491394,74.9705658}, {194.927597,74.9367371}, {195.3638,74.9029083}, {195.800003,74.8928909}}} {{195.800003,74.8928909}} wnTs[0]=0 {{{195.800003,74.8928909}, {196.363327,74.8799515}, {196.926636,74.8978424}, {197.48996,74.9157333}}}
700debugShowCubicIntersection wtTs[0]=1 {{{195.800003,74.8928909}, {196.363327,74.8799515}, {196.926636,74.8978424}, {197.48996,74.9157333}}} {{197.48996,74.9157333}} wnTs[0]=0 {{{197.48996,74.9157333}, {197.659973,74.9211349}, {197.829987,74.9265366}, {198,74.9310913}}}
701debugShowCubicIntersection wtTs[0]=1 {{{197.48996,74.9157333}, {197.659973,74.9211349}, {197.829987,74.9265366}, {198,74.9310913}}} {{198,74.9310913}} wnTs[0]=0 {{{198,74.9310913}, {198.539948,74.945549}, {199.07988,74.9668427}, {199.619827,74.9881363}}}
702debugShowCubicIntersection wtTs[0]=1 {{{198,74.9310913}, {198.539948,74.945549}, {199.07988,74.9668427}, {199.619827,74.9881363}}} {{199.619827,74.9881363}} wnTs[0]=0 {{{199.619827,74.9881363}, {199.813217,74.9957657}, {200.006607,75.0033951}, {200.199997,75.0107117}}}
703debugShowCubicIntersection wtTs[0]=1 {{{199.619827,74.9881363}, {199.813217,74.9957657}, {200.006607,75.0033951}, {200.199997,75.0107117}}} {{200.199997,75.0107117}} wnTs[0]=0 {{{200.199997,75.0107117}, {200.468765,75.020874}, {200.737534,75.032814}, {201.006287,75.0447464}}}
704debugShowCubicIntersection wtTs[0]=1 {{{200.199997,75.0107117}, {200.468765,75.020874}, {200.737534,75.032814}, {201.006287,75.0447464}}} {{201.006287,75.0447464}} wnTs[0]=0 {{{201.006287,75.0447464}, {201.470856,75.0653763}, {201.935425,75.0860062}, {202.399994,75.0974884}}}
705debugShowCubicIntersection wtTs[0]=1 {{{201.006287,75.0447464}, {201.470856,75.0653763}, {201.935425,75.0860062}, {202.399994,75.0974884}}} {{202.399994,75.0974884}} wnTs[0]=0 {{{202.399994,75.0974884}, {202.888885,75.1095734}, {203.377777,75.1120605}, {203.866669,75.1145554}}}
706debugShowCubicIntersection wtTs[0]=1 {{{202.399994,75.0974884}, {202.888885,75.1095734}, {203.377777,75.1120605}, {203.866669,75.1145554}}} {{203.866669,75.1145554}} wnTs[0]=0 {{{203.866669,75.1145554}, {204.111115,75.115799}, {204.35556,75.1170425}, {204.600006,75.1194839}}}
707debugShowCubicIntersection wtTs[0]=1 {{{203.866669,75.1145554}, {204.111115,75.115799}, {204.35556,75.1170425}, {204.600006,75.1194839}}} {{204.600006,75.1194839}} wnTs[0]=0 {{{204.600006,75.1194839}, {204.84462,75.121933}, {205.089233,75.1239471}, {205.333847,75.1259613}}}
708debugShowCubicIntersection wtTs[0]=1 {{{204.600006,75.1194839}, {204.84462,75.121933}, {205.089233,75.1239471}, {205.333847,75.1259613}}} {{205.333847,75.1259613}} wnTs[0]=0 {{{205.333847,75.1259613}, {205.822556,75.129982}, {206.311279,75.1340103}, {206.800003,75.1414719}}}
709debugShowCubicIntersection wtTs[0]=1 {{{205.333847,75.1259613}, {205.822556,75.129982}, {206.311279,75.1340103}, {206.800003,75.1414719}}} {{206.800003,75.1414719}} wnTs[0]=0 {{{206.800003,75.1414719}, {207.53334,75.1526718}, {208.266663,75.1675339}, {209,75.1866531}}}
710debugShowCubicIntersection wtTs[0]=1 {{{206.800003,75.1414719}, {207.53334,75.1526718}, {208.266663,75.1675339}, {209,75.1866531}}} {{209,75.1866531}} wnTs[0]=0 {{{209,75.1866531}, {209.350708,75.1957932}, {209.701416,75.2080078}, {210.052124,75.2202225}}}
711debugShowCubicIntersection wtTs[0]=1 {{{209,75.1866531}, {209.350708,75.1957932}, {209.701416,75.2080078}, {210.052124,75.2202225}}} {{210.052124,75.2202225}} wnTs[0]=0 {{{210.052124,75.2202225}, {210.434753,75.2335434}, {210.817368,75.2468643}, {211.199997,75.2562027}}}
712debugShowCubicIntersection wtTs[0]=1 {{{210.052124,75.2202225}, {210.434753,75.2335434}, {210.817368,75.2468643}, {211.199997,75.2562027}}} {{211.199997,75.2562027}} wnTs[0]=0 {{{211.199997,75.2562027}, {211.933334,75.2741013}, {212.666672,75.2871475}, {213.399994,75.2940521}}}
713debugShowCubicIntersection wtTs[0]=1 {{{211.199997,75.2562027}, {211.933334,75.2741013}, {212.666672,75.2871475}, {213.399994,75.2940521}}} {{213.399994,75.2940521}} wnTs[0]=0 {{{213.399994,75.2940521}, {214.133331,75.3009567}, {214.866669,75.3041916}, {215.600006,75.2976303}}}
714debugShowCubicIntersection wtTs[0]=1 {{{213.399994,75.2940521}, {214.133331,75.3009567}, {214.866669,75.3041916}, {215.600006,75.2976303}}} {{215.600006,75.2976303}} wnTs[0]=0 {{{215.600006,75.2976303}, {216.076187,75.2933655}, {216.552383,75.2823792}, {217.02858,75.2713928}}}
715debugShowCubicIntersection wtTs[0]=1 {{{215.600006,75.2976303}, {216.076187,75.2933655}, {216.552383,75.2823792}, {217.02858,75.2713928}}} {{217.02858,75.2713928}} wnTs[0]=0 {{{217.02858,75.2713928}, {217.285721,75.2654572}, {217.542862,75.2595291}, {217.800003,75.2546539}}}
716debugShowCubicIntersection wtTs[0]=1 {{{217.02858,75.2713928}, {217.285721,75.2654572}, {217.542862,75.2595291}, {217.800003,75.2546539}}} {{217.800003,75.2546539}} wnTs[0]=0 {{{217.800003,75.2546539}, {218.041779,75.2500763}, {218.283554,75.2413101}, {218.52533,75.2325439}}}
717debugShowCubicIntersection wtTs[0]=1 {{{217.800003,75.2546539}, {218.041779,75.2500763}, {218.283554,75.2413101}, {218.52533,75.2325439}}} {{218.52533,75.2325439}} wnTs[0]=0 {{{218.52533,75.2325439}, {219.016891,75.2147217}, {219.508438,75.1968994}, {220,75.2142487}}}
718debugShowCubicIntersection wtTs[0]=1 {{{218.52533,75.2325439}, {219.016891,75.2147217}, {219.508438,75.1968994}, {220,75.2142487}}} {{220,75.2142487}} wnTs[0]=0 {{{220,75.2142487}, {220.409988,75.2287216}, {220.819977,75.2736588}, {221.229965,75.3185959}}}
719debugShowCubicIntersection wtTs[0]=1 {{{220,75.2142487}, {220.409988,75.2287216}, {220.819977,75.2736588}, {221.229965,75.3185959}}} {{221.229965,75.3185959}} wnTs[0]=0 {{{221.229965,75.3185959}, {221.553314,75.3540344}, {221.876648,75.389473}, {222.199997,75.4099731}}}
720debugShowCubicIntersection wtTs[0]=1 {{{221.229965,75.3185959}, {221.553314,75.3540344}, {221.876648,75.389473}, {222.199997,75.4099731}}} {{222.199997,75.4099731}} wnTs[0]=0 {{{222.199997,75.4099731}, {222.933334,75.456459}, {223.666672,75.4962387}, {224.399994,75.4931717}}}
721debugShowCubicIntersection wtTs[0]=1 {{{222.199997,75.4099731}, {222.933334,75.456459}, {223.666672,75.4962387}, {224.399994,75.4931717}}} {{224.399994,75.4931717}} wnTs[0]=0 {{{224.399994,75.4931717}, {224.885803,75.4911423}, {225.371613,75.4618988}, {225.857422,75.4326553}}}
722debugShowCubicIntersection wtTs[0]=1 {{{224.399994,75.4931717}, {224.885803,75.4911423}, {225.371613,75.4618988}, {225.857422,75.4326553}}} {{225.857422,75.4326553}} wnTs[0]=0 {{{225.857422,75.4326553}, {226.10495,75.4177551}, {226.352478,75.4028549}, {226.600006,75.3915558}}}
723debugShowCubicIntersection wtTs[0]=1 {{{225.857422,75.4326553}, {226.10495,75.4177551}, {226.352478,75.4028549}, {226.600006,75.3915558}}} {{226.600006,75.3915558}} wnTs[0]=0 {{{226.600006,75.3915558}, {226.839722,75.3806152}, {227.079437,75.3675385}, {227.319153,75.354454}}}
724debugShowCubicIntersection wtTs[0]=1 {{{226.600006,75.3915558}, {226.839722,75.3806152}, {227.079437,75.3675385}, {227.319153,75.354454}}} {{227.319153,75.354454}} wnTs[0]=0 {{{227.319153,75.354454}, {227.812759,75.3275223}, {228.306381,75.3005905}, {228.800003,75.2923279}}}
725debugShowCubicIntersection wtTs[0]=1 {{{227.319153,75.354454}, {227.812759,75.3275223}, {228.306381,75.3005905}, {228.800003,75.2923279}}} {{228.800003,75.2923279}} wnTs[0]=0 {{{228.800003,75.2923279}, {229.309921,75.2837906}, {229.819824,75.2945709}, {230.329742,75.3053513}}}
726debugShowCubicIntersection wtTs[0]=1 {{{228.800003,75.2923279}, {229.309921,75.2837906}, {229.819824,75.2945709}, {230.329742,75.3053513}}} {{230.329742,75.3053513}} wnTs[0]=0 {{{230.329742,75.3053513}, {230.553162,75.3100739}, {230.776581,75.3147964}, {231,75.317894}}}
727debugShowCubicIntersection wtTs[0]=1 {{{230.329742,75.3053513}, {230.553162,75.3100739}, {230.776581,75.3147964}, {231,75.317894}}} {{231,75.317894}} wnTs[0]=0 {{{231,75.317894}, {231.290405,75.3219223}, {231.580811,75.3275833}, {231.871216,75.333252}}}
728debugShowCubicIntersection wtTs[0]=1 {{{231,75.317894}, {231.290405,75.3219223}, {231.580811,75.3275833}, {231.871216,75.333252}}} {{231.871216,75.333252}} wnTs[0]=0 {{{231.871216,75.333252}, {232.314148,75.3418884}, {232.757065,75.3505249}, {233.199997,75.3533554}}}
729debugShowCubicIntersection wtTs[0]=1 {{{231.871216,75.333252}, {232.314148,75.3418884}, {232.757065,75.3505249}, {233.199997,75.3533554}}} {{233.199997,75.3533554}} wnTs[0]=0 {{{233.199997,75.3533554}, {233.933334,75.3580399}, {234.666672,75.3606873}, {235.399994,75.3460236}}}
730debugShowCubicIntersection wtTs[0]=1 {{{233.199997,75.3533554}, {233.933334,75.3580399}, {234.666672,75.3606873}, {235.399994,75.3460236}}} {{235.399994,75.3460236}} wnTs[0]=0 {{{235.399994,75.3460236}, {235.845032,75.3371277}, {236.29007,75.3182449}, {236.735107,75.2993622}}}
731debugShowCubicIntersection wtTs[0]=1 {{{235.399994,75.3460236}, {235.845032,75.3371277}, {236.29007,75.3182449}, {236.735107,75.2993622}}} {{236.735107,75.2993622}} wnTs[0]=0 {{{236.735107,75.2993622}, {237.023407,75.2871323}, {237.311707,75.2749023}, {237.600006,75.2653885}}}
732debugShowCubicIntersection wtTs[0]=1 {{{236.735107,75.2993622}, {237.023407,75.2871323}, {237.311707,75.2749023}, {237.600006,75.2653885}}} {{237.600006,75.2653885}} wnTs[0]=0 {{{237.600006,75.2653885}, {238.333328,75.2411804}, {239.066666,75.2196732}, {239.800003,75.2007828}}}
733debugShowCubicIntersection wtTs[0]=1 {{{237.600006,75.2653885}, {238.333328,75.2411804}, {239.066666,75.2196732}, {239.800003,75.2007828}}} {{239.800003,75.2007828}} wnTs[0]=0 {{{239.800003,75.2007828}, {240.082169,75.193512}, {240.364334,75.1891708}, {240.6465,75.1848297}}}
734debugShowCubicIntersection wtTs[0]=1 {{{239.800003,75.2007828}, {240.082169,75.193512}, {240.364334,75.1891708}, {240.6465,75.1848297}}} {{240.6465,75.1848297}} wnTs[0]=0 {{{240.6465,75.1848297}, {241.097672,75.177887}, {241.548828,75.1709366}, {242,75.1520233}}}
735debugShowCubicIntersection wtTs[0]=1 {{{240.6465,75.1848297}, {241.097672,75.177887}, {241.548828,75.1709366}, {242,75.1520233}}} {{242,75.1520233}} wnTs[0]=0 {{{242,75.1520233}, {242.416458,75.1345673}, {242.832916,75.1057968}, {243.249374,75.0770187}}}
736debugShowCubicIntersection wtTs[0]=1 {{{242,75.1520233}, {242.416458,75.1345673}, {242.832916,75.1057968}, {243.249374,75.0770187}}} {{243.249374,75.0770187}} wnTs[0]=0 {{{243.249374,75.0770187}, {243.566254,75.0551224}, {243.883118,75.033226}, {244.199997,75.0163193}}}
737debugShowCubicIntersection wtTs[0]=1 {{{243.249374,75.0770187}, {243.566254,75.0551224}, {243.883118,75.033226}, {244.199997,75.0163193}}} {{244.199997,75.0163193}} wnTs[0]=0 {{{244.199997,75.0163193}, {244.933334,74.9771957}, {245.666672,74.9453659}, {246.399994,74.9172668}}}
738debugShowCubicIntersection wtTs[0]=1 {{{244.199997,75.0163193}, {244.933334,74.9771957}, {245.666672,74.9453659}, {246.399994,74.9172668}}} {{246.399994,74.9172668}} wnTs[0]=0 {{{246.399994,74.9172668}, {247.133331,74.8891678}, {247.866669,74.8672562}, {248.600006,74.8477097}}}
739debugShowCubicLineIntersection wtTs[0]=1 {{{246.399994,74.9172668}, {247.133331,74.8891678}, {247.866669,74.8672562}, {248.600006,74.8477097}}} {{248.600006,74.8477097}} wnTs[0]=0 {{{248.600006,74.8477097}, {248.714218,74.8446655}}}
740debugShowCubicLineIntersection wtTs[0]=0 {{{248.714218,74.8446655}, {249.40947,74.8261032}, {250.104736,74.8075485}, {250.800003,74.8000031}}} {{248.714218,74.8446655}} wnTs[0]=1 {{{248.600006,74.8477097}, {248.714218,74.8446655}}}
741debugShowCubicIntersection wtTs[0]=1 {{{248.714218,74.8446655}, {249.40947,74.8261032}, {250.104736,74.8075485}, {250.800003,74.8000031}}} {{250.800003,74.8000031}} wnTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.7947006}, {251.777771,74.7964706}, {252.266663,74.798233}}}
742debugShowCubicLineIntersection wtTs[0]=1 {{{248.714218,74.8446655}, {249.40947,74.8261032}, {250.104736,74.8075485}, {250.800003,74.8000031}}} {{250.800003,74.8000031}} wnTs[0]=0.0119047 {{{253,74.8000031}, {68.1999969,74.8000031}}}
743debugShowCubicIntersection wtTs[0]=1 {{{250.800003,74.8000031}, {251.288895,74.7947006}, {251.777771,74.7964706}, {252.266663,74.798233}}} {{252.266663,74.798233}} wnTs[0]=0 {{{252.266663,74.798233}, {252.511108,74.799118}, {252.755554,74.8000031}, {253,74.8000031}}}
744debugShowCubicLineIntersection wtTs[0]=0 {{{250.800003,74.8000031}, {251.288895,74.7947006}, {251.777771,74.7964706}, {252.266663,74.798233}}} {{250.800003,74.8000031}} wnTs[0]=0.0119047 {{{253,74.8000031}, {68.1999969,74.8000031}}}
745debugShowCubicLineIntersection wtTs[0]=1 {{{252.266663,74.798233}, {252.511108,74.799118}, {252.755554,74.8000031}, {253,74.8000031}}} {{253,74.8000031}} wnTs[0]=0 {{{253,74.8000031}, {68.1999969,74.8000031}}}
746SkOpSegment::addT insert t=0.928577558 segID=299 spanID=623
747SkOpSegment::addT insert t=0.99844881 segID=12 spanID=624
caryclarkdac1d172014-06-17 05:15:38 -0700748</div>
caryclark54359292015-03-26 07:52:43 -0700749
caryclarkdac1d172014-06-17 05:15:38 -0700750</div>
751
752<script type="text/javascript">
753
754var testDivs = [
caryclark182b4992015-05-14 05:45:54 -0700755 issue3651_7,
caryclarkbca19f72015-05-13 08:23:48 -0700756
caryclarkdac1d172014-06-17 05:15:38 -0700757];
758
759var decimal_places = 3; // make this 3 to show more precision
760
761var tests = [];
762var testLines = [];
763var testTitles = [];
764var testIndex = 0;
765var ctx;
766
767var xmin, xmax, focusXmin, focusXmax;
768var ymin, ymax, focusYmin, focusYmax;
769var scale;
770var mouseX, mouseY;
771var srcLeft, srcTop;
772var screenWidth, screenHeight;
caryclark1049f122015-04-20 08:31:59 -0700773var drawnPts, drawnLines, drawnQuads, drawnConics, drawnCubics;
caryclarkdac1d172014-06-17 05:15:38 -0700774var curveT = 0;
775
776var pt_labels = 2;
777var collect_bounds = false;
778var control_lines = 0;
779var curve_t = false;
780var debug_xy = 1;
781var focus_enabled = false;
782var focus_on_selection = false;
783var step_limit = 0;
784var draw_active = false;
785var draw_add = false;
786var draw_angle = 0;
caryclark624637c2015-05-11 07:21:27 -0700787var draw_coincidence = false;
caryclarkdac1d172014-06-17 05:15:38 -0700788var draw_deriviatives = 0;
789var draw_hints = false;
caryclarkdac1d172014-06-17 05:15:38 -0700790var draw_id = false;
791var draw_intersection = 0;
792var draw_intersectT = false;
793var draw_legend = true;
794var draw_log = false;
795var draw_mark = false;
796var draw_midpoint = false;
797var draw_op = 0;
798var draw_sequence = false;
799var draw_sort = 0;
caryclark03b03ca2015-04-23 09:13:37 -0700800var draw_top = false;
caryclarkdac1d172014-06-17 05:15:38 -0700801var draw_path = 3;
802var draw_computed = 0;
803var retina_scale = !!window.devicePixelRatio;
804
805var activeCount = 0;
806var addCount = 0;
807var angleCount = 0;
caryclark624637c2015-05-11 07:21:27 -0700808var coinCount = 0;
caryclarkdac1d172014-06-17 05:15:38 -0700809var opCount = 0;
810var sectCount = 0;
811var sortCount = 0;
caryclark03b03ca2015-04-23 09:13:37 -0700812var topCount = 0;
caryclarkdac1d172014-06-17 05:15:38 -0700813var markCount = 0;
814var activeMax = 0;
815var addMax = 0;
816var angleMax = 0;
caryclark624637c2015-05-11 07:21:27 -0700817var coinMax = 0;
caryclarkdac1d172014-06-17 05:15:38 -0700818var sectMax = 0;
819var sectMax2 = 0;
820var sortMax = 0;
caryclark03b03ca2015-04-23 09:13:37 -0700821var topMax = 0;
caryclarkdac1d172014-06-17 05:15:38 -0700822var markMax = 0;
823var opMax = 0;
824var stepMax = 0;
825var lastIndex = 0;
826var hasPath = false;
827var hasComputedPath = false;
caryclark54359292015-03-26 07:52:43 -0700828var angleBetween = false;
829var afterIndex = 0;
caryclarkdac1d172014-06-17 05:15:38 -0700830
831var firstActiveSpan = -1;
832var logStart = -1;
833var logRange = 0;
834
835var SPAN_ID = 0;
836var SPAN_X1 = SPAN_ID + 1;
837var SPAN_Y1 = SPAN_X1 + 1;
838var SPAN_X2 = SPAN_Y1 + 1;
839var SPAN_Y2 = SPAN_X2 + 1;
caryclark1049f122015-04-20 08:31:59 -0700840
caryclarkdac1d172014-06-17 05:15:38 -0700841var SPAN_L_T = SPAN_Y2 + 1;
842var SPAN_L_TX = SPAN_L_T + 1;
843var SPAN_L_TY = SPAN_L_TX + 1;
844var SPAN_L_TEND = SPAN_L_TY + 1;
845var SPAN_L_OTHER = SPAN_L_TEND + 1;
846var SPAN_L_OTHERT = SPAN_L_OTHER + 1;
847var SPAN_L_OTHERI = SPAN_L_OTHERT + 1;
848var SPAN_L_SUM = SPAN_L_OTHERI + 1;
849var SPAN_L_VAL = SPAN_L_SUM + 1;
850var SPAN_L_OPP = SPAN_L_VAL + 1;
851
852var SPAN_X3 = SPAN_Y2 + 1;
853var SPAN_Y3 = SPAN_X3 + 1;
caryclark1049f122015-04-20 08:31:59 -0700854
caryclarkdac1d172014-06-17 05:15:38 -0700855var SPAN_Q_T = SPAN_Y3 + 1;
856var SPAN_Q_TX = SPAN_Q_T + 1;
857var SPAN_Q_TY = SPAN_Q_TX + 1;
858var SPAN_Q_TEND = SPAN_Q_TY + 1;
859var SPAN_Q_OTHER = SPAN_Q_TEND + 1;
860var SPAN_Q_OTHERT = SPAN_Q_OTHER + 1;
861var SPAN_Q_OTHERI = SPAN_Q_OTHERT + 1;
862var SPAN_Q_SUM = SPAN_Q_OTHERI + 1;
863var SPAN_Q_VAL = SPAN_Q_SUM + 1;
864var SPAN_Q_OPP = SPAN_Q_VAL + 1;
865
caryclark1049f122015-04-20 08:31:59 -0700866var SPAN_K_W = SPAN_Y3 + 1;
867var SPAN_K_T = SPAN_K_W + 1;
868var SPAN_K_TX = SPAN_K_T + 1;
869var SPAN_K_TY = SPAN_K_TX + 1;
870var SPAN_K_TEND = SPAN_K_TY + 1;
871var SPAN_K_OTHER = SPAN_K_TEND + 1;
872var SPAN_K_OTHERT = SPAN_K_OTHER + 1;
873var SPAN_K_OTHERI = SPAN_K_OTHERT + 1;
874var SPAN_K_SUM = SPAN_K_OTHERI + 1;
875var SPAN_K_VAL = SPAN_K_SUM + 1;
876var SPAN_K_OPP = SPAN_K_VAL + 1;
877
caryclarkdac1d172014-06-17 05:15:38 -0700878var SPAN_X4 = SPAN_Y3 + 1;
879var SPAN_Y4 = SPAN_X4 + 1;
caryclark1049f122015-04-20 08:31:59 -0700880
caryclarkdac1d172014-06-17 05:15:38 -0700881var SPAN_C_T = SPAN_Y4 + 1;
882var SPAN_C_TX = SPAN_C_T + 1;
883var SPAN_C_TY = SPAN_C_TX + 1;
884var SPAN_C_TEND = SPAN_C_TY + 1;
885var SPAN_C_OTHER = SPAN_C_TEND + 1;
886var SPAN_C_OTHERT = SPAN_C_OTHER + 1;
887var SPAN_C_OTHERI = SPAN_C_OTHERT + 1;
888var SPAN_C_SUM = SPAN_C_OTHERI + 1;
889var SPAN_C_VAL = SPAN_C_SUM + 1;
890var SPAN_C_OPP = SPAN_C_VAL + 1;
891
892var ACTIVE_LINE_SPAN = 1;
893var ACTIVE_QUAD_SPAN = ACTIVE_LINE_SPAN + 1;
caryclark1049f122015-04-20 08:31:59 -0700894var ACTIVE_CONIC_SPAN = ACTIVE_QUAD_SPAN + 1;
895var ACTIVE_CUBIC_SPAN = ACTIVE_CONIC_SPAN + 1;
caryclarkdac1d172014-06-17 05:15:38 -0700896
897var ADD_MOVETO = ACTIVE_CUBIC_SPAN + 1;
898var ADD_LINETO = ADD_MOVETO + 1;
899var ADD_QUADTO = ADD_LINETO + 1;
caryclark1049f122015-04-20 08:31:59 -0700900var ADD_CONICTO = ADD_QUADTO + 1;
901var ADD_CUBICTO = ADD_CONICTO + 1;
caryclarkdac1d172014-06-17 05:15:38 -0700902var ADD_CLOSE = ADD_CUBICTO + 1;
903var ADD_FILL = ADD_CLOSE + 1;
904
905var PATH_LINE = ADD_FILL + 1;
906var PATH_QUAD = PATH_LINE + 1;
caryclark1049f122015-04-20 08:31:59 -0700907var PATH_CONIC = PATH_QUAD + 1;
908var PATH_CUBIC = PATH_CONIC + 1;
caryclarkdac1d172014-06-17 05:15:38 -0700909
910var INTERSECT_LINE = PATH_CUBIC + 1;
911var INTERSECT_LINE_2 = INTERSECT_LINE + 1;
912var INTERSECT_LINE_NO = INTERSECT_LINE_2 + 1;
913var INTERSECT_QUAD_LINE = INTERSECT_LINE_NO + 1;
914var INTERSECT_QUAD_LINE_2 = INTERSECT_QUAD_LINE + 1;
915var INTERSECT_QUAD_LINE_NO = INTERSECT_QUAD_LINE_2 + 1;
916var INTERSECT_QUAD = INTERSECT_QUAD_LINE_NO + 1;
917var INTERSECT_QUAD_2 = INTERSECT_QUAD + 1;
918var INTERSECT_QUAD_NO = INTERSECT_QUAD_2 + 1;
caryclark1049f122015-04-20 08:31:59 -0700919var INTERSECT_CONIC_LINE = INTERSECT_QUAD_NO + 1;
920var INTERSECT_CONIC_LINE_2 = INTERSECT_CONIC_LINE + 1;
921var INTERSECT_CONIC_LINE_NO = INTERSECT_CONIC_LINE_2 + 1;
922var INTERSECT_CONIC = INTERSECT_CONIC_LINE_NO + 1;
923var INTERSECT_CONIC_2 = INTERSECT_CONIC + 1;
924var INTERSECT_CONIC_NO = INTERSECT_CONIC_2 + 1;
925var INTERSECT_SELF_CUBIC = INTERSECT_CONIC_NO + 1;
caryclarkdac1d172014-06-17 05:15:38 -0700926var INTERSECT_SELF_CUBIC_NO = INTERSECT_SELF_CUBIC + 1;
927var INTERSECT_CUBIC_LINE = INTERSECT_SELF_CUBIC_NO + 1;
928var INTERSECT_CUBIC_LINE_2 = INTERSECT_CUBIC_LINE + 1;
929var INTERSECT_CUBIC_LINE_3 = INTERSECT_CUBIC_LINE_2 + 1;
930var INTERSECT_CUBIC_LINE_NO = INTERSECT_CUBIC_LINE_3 + 1;
931var INTERSECT_CUBIC_QUAD = INTERSECT_CUBIC_LINE_NO + 1;
932var INTERSECT_CUBIC_QUAD_2 = INTERSECT_CUBIC_QUAD + 1;
933var INTERSECT_CUBIC_QUAD_3 = INTERSECT_CUBIC_QUAD_2 + 1;
934var INTERSECT_CUBIC_QUAD_4 = INTERSECT_CUBIC_QUAD_3 + 1;
935var INTERSECT_CUBIC_QUAD_NO = INTERSECT_CUBIC_QUAD_4 + 1;
936var INTERSECT_CUBIC = INTERSECT_CUBIC_QUAD_NO + 1;
937var INTERSECT_CUBIC_2 = INTERSECT_CUBIC + 1;
938var INTERSECT_CUBIC_3 = INTERSECT_CUBIC_2 + 1;
939var INTERSECT_CUBIC_4 = INTERSECT_CUBIC_3 + 1;
940// FIXME: add cubic 5- 9
941var INTERSECT_CUBIC_NO = INTERSECT_CUBIC_4 + 1;
942
943var SORT_UNARY = INTERSECT_CUBIC_NO + 1;
944var SORT_BINARY = SORT_UNARY + 1;
945
946var OP_DIFFERENCE = SORT_BINARY + 1;
947var OP_INTERSECT = OP_DIFFERENCE + 1;
948var OP_UNION = OP_INTERSECT + 1;
949var OP_XOR = OP_UNION + 1;
950
951var MARK_LINE = OP_XOR + 1;
952var MARK_QUAD = MARK_LINE + 1;
caryclark1049f122015-04-20 08:31:59 -0700953var MARK_CONIC = MARK_QUAD + 1;
954var MARK_CUBIC = MARK_CONIC + 1;
caryclarkdac1d172014-06-17 05:15:38 -0700955var MARK_DONE_LINE = MARK_CUBIC + 1;
956var MARK_DONE_QUAD = MARK_DONE_LINE + 1;
caryclark1049f122015-04-20 08:31:59 -0700957var MARK_DONE_CONIC = MARK_DONE_QUAD + 1;
958var MARK_DONE_CUBIC = MARK_DONE_CONIC + 1;
caryclarkdac1d172014-06-17 05:15:38 -0700959var MARK_UNSORTABLE_LINE = MARK_DONE_CUBIC + 1;
960var MARK_UNSORTABLE_QUAD = MARK_UNSORTABLE_LINE + 1;
caryclark1049f122015-04-20 08:31:59 -0700961var MARK_UNSORTABLE_CONIC = MARK_UNSORTABLE_QUAD + 1;
962var MARK_UNSORTABLE_CUBIC = MARK_UNSORTABLE_CONIC + 1;
caryclarkdac1d172014-06-17 05:15:38 -0700963var MARK_SIMPLE_LINE = MARK_UNSORTABLE_CUBIC + 1;
964var MARK_SIMPLE_QUAD = MARK_SIMPLE_LINE + 1;
caryclark1049f122015-04-20 08:31:59 -0700965var MARK_SIMPLE_CONIC = MARK_SIMPLE_QUAD + 1;
966var MARK_SIMPLE_CUBIC = MARK_SIMPLE_CONIC + 1;
caryclarkdac1d172014-06-17 05:15:38 -0700967var MARK_SIMPLE_DONE_LINE = MARK_SIMPLE_CUBIC + 1;
968var MARK_SIMPLE_DONE_QUAD = MARK_SIMPLE_DONE_LINE + 1;
caryclark1049f122015-04-20 08:31:59 -0700969var MARK_SIMPLE_DONE_CONIC = MARK_SIMPLE_DONE_QUAD + 1;
970var MARK_SIMPLE_DONE_CUBIC = MARK_SIMPLE_DONE_CONIC + 1;
caryclarkdac1d172014-06-17 05:15:38 -0700971var MARK_DONE_UNARY_LINE = MARK_SIMPLE_DONE_CUBIC + 1;
972var MARK_DONE_UNARY_QUAD = MARK_DONE_UNARY_LINE + 1;
caryclark1049f122015-04-20 08:31:59 -0700973var MARK_DONE_UNARY_CONIC = MARK_DONE_UNARY_QUAD + 1;
974var MARK_DONE_UNARY_CUBIC = MARK_DONE_UNARY_CONIC + 1;
caryclarkdac1d172014-06-17 05:15:38 -0700975var MARK_ANGLE_LAST = MARK_DONE_UNARY_CUBIC + 1;
976
977var COMPUTED_SET_1 = MARK_ANGLE_LAST + 1;
978var COMPUTED_SET_2 = COMPUTED_SET_1 + 1;
979
caryclark624637c2015-05-11 07:21:27 -0700980var ANGLE_AFTER = COMPUTED_SET_2 + 1;
caryclark54359292015-03-26 07:52:43 -0700981var ANGLE_AFTERPART = ANGLE_AFTER + 1;
caryclarkdac1d172014-06-17 05:15:38 -0700982
caryclark54359292015-03-26 07:52:43 -0700983var ACTIVE_OP = ANGLE_AFTERPART + 1;
caryclarkdac1d172014-06-17 05:15:38 -0700984
caryclark624637c2015-05-11 07:21:27 -0700985var COIN_MAIN_SPAN = ACTIVE_OP + 1;
986var COIN_OPP_SPAN = COIN_MAIN_SPAN + 1;
987
988var FRAG_TYPE_LAST = COIN_OPP_SPAN;
caryclarkdac1d172014-06-17 05:15:38 -0700989
990var REC_TYPE_UNKNOWN = -1;
991var REC_TYPE_PATH = 0;
caryclark54359292015-03-26 07:52:43 -0700992var REC_TYPE_PATH2 = 1;
993var REC_TYPE_SECT = 2;
994var REC_TYPE_ACTIVE = 3;
995var REC_TYPE_ADD = 4;
996var REC_TYPE_SORT = 5;
997var REC_TYPE_OP = 6;
998var REC_TYPE_MARK = 7;
999var REC_TYPE_COMPUTED = 8;
1000var REC_TYPE_COIN = 9;
1001var REC_TYPE_ANGLE = 10;
1002var REC_TYPE_ACTIVE_OP = 11;
1003var REC_TYPE_AFTERPART = 12;
caryclark03b03ca2015-04-23 09:13:37 -07001004var REC_TYPE_TOP = 13;
caryclark624637c2015-05-11 07:21:27 -07001005var REC_TYPE_COINCIDENCE = 14;
1006var REC_TYPE_LAST = REC_TYPE_COINCIDENCE;
caryclarkdac1d172014-06-17 05:15:38 -07001007
1008function strs_to_nums(strs) {
1009 var result = [];
1010 for (var idx = 1; idx < strs.length; ++idx) {
1011 var str = strs[idx];
1012 var num = parseFloat(str);
1013 if (isNaN(num)) {
1014 result.push(str);
1015 } else {
1016 result.push(num);
1017 }
1018 }
1019 return result;
1020}
1021
1022function filter_str_by(id, str, regex, array) {
1023 if (regex.test(str)) {
1024 var strs = regex.exec(str);
1025 var result = strs_to_nums(strs);
1026 array.push(id);
1027 array.push(result);
1028 return true;
1029 }
1030 return false;
1031}
1032
1033function construct_regexp2(pattern) {
1034 var escape = pattern.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
1035 escape = escape.replace(/UNSORTABLE/g, "\\*\\*\\* UNSORTABLE \\*\\*\\*");
1036 escape = escape.replace(/CUBIC_VAL/g, "\\(P_VAL P_VAL P_VAL P_VAL\\)");
caryclark1049f122015-04-20 08:31:59 -07001037 escape = escape.replace(/CONIC_VAL/g, "\\(P_VAL P_VAL P_VAL W_VAL\\)");
caryclarkdac1d172014-06-17 05:15:38 -07001038 escape = escape.replace(/QUAD_VAL/g, "\\(P_VAL P_VAL P_VAL\\)");
1039 escape = escape.replace(/LINE_VAL/g, "\\(P_VAL P_VAL\\)");
1040 escape = escape.replace(/FILL_TYPE/g, "SkPath::k[a-zA-Z]+_FillType");
caryclark54359292015-03-26 07:52:43 -07001041 escape = escape.replace(/PTR_VAL/g, "0x[0-9A-F]+");
caryclarkdac1d172014-06-17 05:15:38 -07001042 escape = escape.replace(/PT_VAL/g, "\\(P_VAL\\)");
1043 escape = escape.replace(/P_VAL/g, "(-?\\d+\\.?\\d*(?:e-?\\d+)?)[Ff]?, ?(-?\\d+\\.?\\d*(?:e-?\\d+)?)[Ff]?");
1044 escape = escape.replace(/T_VAL/g, "(-?\\d+\\.?\\d*(?:e-?\\d+)?)");
caryclark1049f122015-04-20 08:31:59 -07001045 escape = escape.replace(/W_VAL/g, "(-?\\d+\\.?\\d*(?:e-?\\d+)?)[Ff]?");
caryclarkdac1d172014-06-17 05:15:38 -07001046 escape = escape.replace(/PATH/g, "pathB?");
caryclark1049f122015-04-20 08:31:59 -07001047 escape = escape.replace(/IDX/g, "(-?\\d+)");
caryclarkdac1d172014-06-17 05:15:38 -07001048 escape = escape.replace(/NUM/g, "(-?\\d+)");
1049 escape = escape.replace(/OPT/g, "(\\?|-?\\d+)");
1050 return new RegExp(escape, 'i');
1051}
1052
1053function construct_regexp2c(pattern) {
1054 var escape = pattern.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
1055 escape = escape.replace(/UNSORTABLE/g, "\\*\\*\\* UNSORTABLE \\*\\*\\*");
caryclark54359292015-03-26 07:52:43 -07001056 escape = escape.replace(/CUBIC_VAL/g, "(?:\\$\\d = )?\\{\\{\\{P_VAL\\}, \\{P_VAL\\}, \\{P_VAL\\}, \\{P_VAL\\}\\}\\}");
caryclark1049f122015-04-20 08:31:59 -07001057 escape = escape.replace(/CONIC_VAL/g, "(?:\\$\\d = )?\\{\\{\\{\\{P_VAL\\}, \\{P_VAL\\}, \\{P_VAL\\}\\}\\}, W_VAL\\}");
caryclark54359292015-03-26 07:52:43 -07001058 escape = escape.replace(/QUAD_VAL/g, "(?:\\$\\d = )?\\{\\{\\{P_VAL\\}, \\{P_VAL\\}, \\{P_VAL\\}\\}\\}");
1059 escape = escape.replace(/LINE_VAL/g, "(?:\\$\\d = )?\\{\\{\\{P_VAL\\}, \\{P_VAL\\}\\}\\}");
caryclarkdac1d172014-06-17 05:15:38 -07001060 escape = escape.replace(/FILL_TYPE/g, "SkPath::k[a-zA-Z]+_FillType");
caryclark54359292015-03-26 07:52:43 -07001061 escape = escape.replace(/PTR_VAL/g, "0x[0-9A-F]+");
caryclarkdac1d172014-06-17 05:15:38 -07001062 escape = escape.replace(/PT_VAL/g, "\\{\\{P_VAL\\}\\}");
caryclark54359292015-03-26 07:52:43 -07001063 escape = escape.replace(/P_VAL/g, "(?:f?[xX] = )?(-?\\d+\\.?\\d*(?:e-?\\d+)?)[Ff]?, *(?: f?[yY] = )?(-?\\d+\\.?\\d*(?:e-?\\d+)?)[Ff]?");
caryclarkdac1d172014-06-17 05:15:38 -07001064 escape = escape.replace(/T_VAL/g, "(-?\\d+\\.?\\d*(?:e-?\\d+)?)");
caryclark1049f122015-04-20 08:31:59 -07001065 escape = escape.replace(/W_VAL/g, "(-?\\d+\\.?\\d*(?:e-?\\d+)?)[Ff]?");
caryclarkdac1d172014-06-17 05:15:38 -07001066 escape = escape.replace(/OPER/g, "[a-z]+");
1067 escape = escape.replace(/PATH/g, "pathB?");
1068 escape = escape.replace(/T_F/g, "([TF])");
caryclark1049f122015-04-20 08:31:59 -07001069 escape = escape.replace(/IDX/g, "(-?\\d+)");
caryclarkdac1d172014-06-17 05:15:38 -07001070 escape = escape.replace(/NUM/g, "(-?\\d+)");
1071 escape = escape.replace(/OPT/g, "(\\?|-?\\d+)");
1072 return new RegExp(escape, 'i');
1073}
1074
1075function match_regexp(str, lineNo, array, id, pattern) {
1076 var regex = construct_regexp2(pattern);
1077 if (filter_str_by(id, str, regex, array)) {
1078 return true;
1079 }
1080 regex = construct_regexp2c(pattern);
1081 return filter_str_by(id, str, regex, array);
1082}
1083
1084function endsWith(str, suffix) {
1085 return str.indexOf(suffix, str.length - suffix.length) !== -1;
1086}
1087
1088function parse_all(test) {
1089 var lines = test.match(/[^\r\n]+/g);
1090 var records = []; // a rec can be the original paths, a set of intersections, a set of active spans, a sort, or a path add
1091 var record = [];
1092 var recType = REC_TYPE_UNKNOWN;
1093 var lastLineNo;
1094 var moveX, moveY;
1095 for (var lineNo = 0; lineNo < lines.length; ++lineNo) {
1096 var line = lines[lineNo];
1097 if (line.length == 0) {
1098 continue;
1099 }
1100 var opStart = "SkOpSegment::";
1101 if (line.lastIndexOf(opStart, 0) === 0) {
1102 line = line.substr(opStart.length);
1103 }
1104 var angleStart = "SkOpAngle::";
1105 if (line.lastIndexOf(angleStart, 0) === 0) {
1106 line = line.substr(angleStart.length);
1107 }
caryclark624637c2015-05-11 07:21:27 -07001108 var coinStart = "SkOpCoincidence::";
1109 if (line.lastIndexOf(coinStart, 0) === 0) {
1110 line = line.substr(coinStart.length);
1111 }
caryclark54359292015-03-26 07:52:43 -07001112 var type = line.lastIndexOf("debugShowActiveSpans", 0) === 0 ? REC_TYPE_ACTIVE
caryclark624637c2015-05-11 07:21:27 -07001113 : line.lastIndexOf("debugShowCoincidence", 0) === 0 ? REC_TYPE_COINCIDENCE
caryclark54359292015-03-26 07:52:43 -07001114 : line.lastIndexOf("((SkOpSegment*)", 0) === 0 ? REC_TYPE_PATH2
caryclarkdac1d172014-06-17 05:15:38 -07001115 : line.lastIndexOf("debugShowTs", 0) === 0 ? REC_TYPE_COIN
caryclark54359292015-03-26 07:52:43 -07001116 : line.lastIndexOf("afterPart", 0) === 0 ? REC_TYPE_AFTERPART
caryclarkdac1d172014-06-17 05:15:38 -07001117 : line.lastIndexOf("debugShow", 0) === 0 ? REC_TYPE_SECT
1118 : line.lastIndexOf("activeOp", 0) === 0 ? REC_TYPE_ACTIVE_OP
1119 : line.lastIndexOf("computed", 0) === 0 ? REC_TYPE_COMPUTED
1120 : line.lastIndexOf("debugOne", 0) === 0 ? REC_TYPE_SORT
1121 : line.lastIndexOf("dumpOne", 0) === 0 ? REC_TYPE_SORT
caryclark03b03ca2015-04-23 09:13:37 -07001122 : line.lastIndexOf("findTop", 0) === 0 ? REC_TYPE_TOP
caryclarkdac1d172014-06-17 05:15:38 -07001123 : line.lastIndexOf("pathB.", 0) === 0 ? REC_TYPE_ADD
1124 : line.lastIndexOf("path.", 0) === 0 ? REC_TYPE_ADD
1125 : line.lastIndexOf("after", 0) === 0 ? REC_TYPE_ANGLE
1126 : line.lastIndexOf("mark", 0) === 0 ? REC_TYPE_MARK
1127 : line.lastIndexOf(" {{", 0) === 0 ? REC_TYPE_COMPUTED
caryclark54359292015-03-26 07:52:43 -07001128 : line.lastIndexOf("seg=", 0) === 0 ? REC_TYPE_PATH
caryclarkdac1d172014-06-17 05:15:38 -07001129 : line.lastIndexOf("op", 0) === 0 ? REC_TYPE_OP
1130 : line.lastIndexOf("$", 0) === 0 ? REC_TYPE_PATH
1131 : REC_TYPE_UNKNOWN;
1132 if (recType != type || recType == REC_TYPE_ADD || recType == REC_TYPE_SECT
1133 || recType == REC_TYPE_ACTIVE_OP || recType == REC_TYPE_ANGLE) {
1134 if (recType != REC_TYPE_UNKNOWN) {
1135 records.push(recType);
1136 records.push(lastLineNo);
1137 records.push(record);
1138 }
1139 record = [];
1140 recType = type;
1141 lastLineNo = lineNo;
1142 }
1143 var found = false;
1144 switch (recType) {
1145 case REC_TYPE_ACTIVE:
1146 found = match_regexp(line, lineNo, record, ACTIVE_LINE_SPAN, "debugShowActiveSpans" +
caryclark624637c2015-05-11 07:21:27 -07001147" id=IDX LINE_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT windValue=IDX"
caryclarkdac1d172014-06-17 05:15:38 -07001148 ) || match_regexp(line, lineNo, record, ACTIVE_QUAD_SPAN, "debugShowActiveSpans" +
caryclark624637c2015-05-11 07:21:27 -07001149" id=IDX QUAD_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT windValue=IDX"
caryclark1049f122015-04-20 08:31:59 -07001150 ) || match_regexp(line, lineNo, record, ACTIVE_CONIC_SPAN, "debugShowActiveSpans" +
caryclark624637c2015-05-11 07:21:27 -07001151" id=IDX CONIC_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT windValue=IDX"
caryclarkdac1d172014-06-17 05:15:38 -07001152 ) || match_regexp(line, lineNo, record, ACTIVE_CUBIC_SPAN, "debugShowActiveSpans" +
caryclark624637c2015-05-11 07:21:27 -07001153" id=IDX CUBIC_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT windValue=IDX"
1154 ) || match_regexp(line, lineNo, record, ACTIVE_LINE_SPAN, "debugShowActiveSpans" +
1155" id=IDX LINE_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT oppSum=OPT windValue=IDX oppValue=NUM"
1156 ) || match_regexp(line, lineNo, record, ACTIVE_QUAD_SPAN, "debugShowActiveSpans" +
1157" id=IDX QUAD_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT oppSum=OPT windValue=IDX oppValue=NUM"
1158 ) || match_regexp(line, lineNo, record, ACTIVE_CONIC_SPAN, "debugShowActiveSpans" +
1159" id=IDX CONIC_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT oppSum=OPT windValue=IDX oppValue=NUM"
1160 ) || match_regexp(line, lineNo, record, ACTIVE_CUBIC_SPAN, "debugShowActiveSpans" +
1161" id=IDX CUBIC_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT oppSum=OPT windValue=IDX oppValue=NUM"
caryclarkdac1d172014-06-17 05:15:38 -07001162 );
1163 break;
1164 case REC_TYPE_ACTIVE_OP:
1165 found = match_regexp(line, lineNo, record, ACTIVE_OP, "activeOp" +
1166" id=IDX t=T_VAL tEnd=T_VAL op=OPER miFrom=NUM miTo=NUM suFrom=NUM suTo=NUM result=IDX"
1167 );
1168 break;
1169 case REC_TYPE_ADD:
1170 if (match_regexp(line, lineNo, record, ADD_MOVETO, "PATH.moveTo(P_VAL);")) {
1171 moveX = record[1][0];
1172 moveY = record[1][1];
1173 found = true;
1174 } else if (match_regexp(line, lineNo, record, ADD_LINETO, "PATH.lineTo(P_VAL);")) {
1175 record[1].unshift(moveY);
1176 record[1].unshift(moveX);
1177 moveX = record[1][2];
1178 moveY = record[1][3];
1179 found = true;
1180 } else if (match_regexp(line, lineNo, record, ADD_QUADTO, "PATH.quadTo(P_VAL, P_VAL);")) {
1181 record[1].unshift(moveY);
1182 record[1].unshift(moveX);
1183 moveX = record[1][4];
1184 moveY = record[1][5];
1185 found = true;
caryclark1049f122015-04-20 08:31:59 -07001186 } else if (match_regexp(line, lineNo, record, ADD_CONICTO, "PATH.conicTo(P_VAL, P_VAL, T_VAL);")) {
1187 record[1].unshift(moveY);
1188 record[1].unshift(moveX);
1189 moveX = record[1][4];
1190 moveY = record[1][5];
1191 found = true;
caryclarkdac1d172014-06-17 05:15:38 -07001192 } else if (match_regexp(line, lineNo, record, ADD_CUBICTO, "PATH.cubicTo(P_VAL, P_VAL, P_VAL);")) {
1193 record[1].unshift(moveY);
1194 record[1].unshift(moveX);
1195 moveX = record[1][6];
1196 moveY = record[1][7];
1197 found = true;
1198 } else if (match_regexp(line, lineNo, record, ADD_FILL, "PATH.setFillType(FILL_TYPE);")) {
1199 found = true;
1200 } else {
1201 found = match_regexp(line, lineNo, record, ADD_CLOSE, "PATH.close();");
1202 }
1203 break;
caryclark54359292015-03-26 07:52:43 -07001204 case REC_TYPE_AFTERPART:
1205 found = match_regexp(line, lineNo, record, PATH_LINE, "afterPart LINE_VAL")
1206 || match_regexp(line, lineNo, record, PATH_QUAD, "afterPart QUAD_VAL")
caryclark1049f122015-04-20 08:31:59 -07001207 || match_regexp(line, lineNo, record, PATH_CONIC, "afterPart CONIC_VAL")
caryclark54359292015-03-26 07:52:43 -07001208 || match_regexp(line, lineNo, record, PATH_CUBIC, "afterPart CUBIC_VAL")
1209 break;
caryclarkdac1d172014-06-17 05:15:38 -07001210 case REC_TYPE_ANGLE:
1211 found = match_regexp(line, lineNo, record, ANGLE_AFTER, "after " +
caryclarkdac1d172014-06-17 05:15:38 -07001212"[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");
1213 break;
1214 case REC_TYPE_COIN:
1215 found = true;
1216 break;
caryclark624637c2015-05-11 07:21:27 -07001217 case REC_TYPE_COINCIDENCE:
1218 found = match_regexp(line, lineNo, record, COIN_MAIN_SPAN, "debugShowCoincidence" +
1219" + id=IDX t=T_VAL tEnd=T_VAL"
1220 ) || match_regexp(line, lineNo, record, COIN_OPP_SPAN, "debugShowCoincidence" +
1221" - id=IDX t=T_VAL tEnd=T_VAL"
1222 );
1223 break;
caryclarkdac1d172014-06-17 05:15:38 -07001224 case REC_TYPE_COMPUTED:
1225 found = line == "computed quadratics given"
1226 || match_regexp(line, lineNo, record, COMPUTED_SET_1, "computed quadratics set 1"
1227 ) || match_regexp(line, lineNo, record, COMPUTED_SET_2, "computed quadratics set 2"
1228 ) || match_regexp(line, lineNo, record, PATH_QUAD, " QUAD_VAL,"
caryclark1049f122015-04-20 08:31:59 -07001229 ) || match_regexp(line, lineNo, record, PATH_CONIC, " CONIC_VAL,"
caryclarkdac1d172014-06-17 05:15:38 -07001230 ) || match_regexp(line, lineNo, record, PATH_CUBIC, " CUBIC_VAL,"
1231 );
1232 break;
1233 case REC_TYPE_PATH:
caryclark54359292015-03-26 07:52:43 -07001234 found = match_regexp(line, lineNo, record, PATH_LINE, "seg=IDX LINE_VAL"
1235 ) || match_regexp(line, lineNo, record, PATH_QUAD, "seg=IDX QUAD_VAL"
caryclark1049f122015-04-20 08:31:59 -07001236 ) || match_regexp(line, lineNo, record, PATH_CONIC, "seg=IDX CONIC_VAL"
caryclark54359292015-03-26 07:52:43 -07001237 ) || match_regexp(line, lineNo, record, PATH_CUBIC, "seg=IDX CUBIC_VAL"
1238 );
1239 break;
1240 case REC_TYPE_PATH2:
1241 found = match_regexp(line, lineNo, record, PATH_LINE, "((SkOpSegment*) PTR_VAL) [IDX] {LINE_VAL}"
1242 ) || match_regexp(line, lineNo, record, PATH_QUAD, "((SkOpSegment*) PTR_VAL) [IDX] {QUAD_VAL}"
caryclark1049f122015-04-20 08:31:59 -07001243 ) || match_regexp(line, lineNo, record, PATH_CONIC, "((SkOpSegment*) PTR_VAL) [IDX] {CONIC_VAL}"
caryclark54359292015-03-26 07:52:43 -07001244 ) || match_regexp(line, lineNo, record, PATH_CUBIC, "((SkOpSegment*) PTR_VAL) [IDX] {CUBIC_VAL}"
caryclarkdac1d172014-06-17 05:15:38 -07001245 );
1246 break;
1247 case REC_TYPE_SECT:
1248 found = match_regexp(line, lineNo, record, INTERSECT_LINE, "debugShowLineIntersection" +
1249" wtTs[0]=T_VAL LINE_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL"
1250 ) || match_regexp(line, lineNo, record, INTERSECT_LINE_2, "debugShowLineIntersection" +
1251" wtTs[0]=T_VAL LINE_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL wnTs[1]=T_VAL"
1252 ) || match_regexp(line, lineNo, record, INTERSECT_LINE_NO, "debugShowLineIntersection" +
1253" no intersect LINE_VAL LINE_VAL"
1254 ) || match_regexp(line, lineNo, record, INTERSECT_QUAD_LINE, "debugShowQuadLineIntersection" +
1255" wtTs[0]=T_VAL QUAD_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL"
1256 ) || match_regexp(line, lineNo, record, INTERSECT_QUAD_LINE_2, "debugShowQuadLineIntersection" +
1257" wtTs[0]=T_VAL QUAD_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL wnTs[1]=T_VAL"
1258 ) || match_regexp(line, lineNo, record, INTERSECT_QUAD_LINE_NO, "debugShowQuadLineIntersection" +
1259" no intersect QUAD_VAL LINE_VAL"
1260 ) || match_regexp(line, lineNo, record, INTERSECT_QUAD, "debugShowQuadIntersection" +
1261" wtTs[0]=T_VAL QUAD_VAL PT_VAL wnTs[0]=T_VAL QUAD_VAL"
1262 ) || match_regexp(line, lineNo, record, INTERSECT_QUAD_2, "debugShowQuadIntersection" +
1263" wtTs[0]=T_VAL QUAD_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL QUAD_VAL wnTs[1]=T_VAL"
1264 ) || match_regexp(line, lineNo, record, INTERSECT_QUAD_NO, "debugShowQuadIntersection" +
1265" no intersect QUAD_VAL QUAD_VAL"
caryclark1049f122015-04-20 08:31:59 -07001266 ) || match_regexp(line, lineNo, record, INTERSECT_CONIC_LINE, "debugShowConicLineIntersection" +
1267" wtTs[0]=T_VAL CONIC_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL"
1268 ) || match_regexp(line, lineNo, record, INTERSECT_CONIC_LINE_2, "debugShowConicLineIntersection" +
1269" wtTs[0]=T_VAL CONIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL wnTs[1]=T_VAL"
1270 ) || match_regexp(line, lineNo, record, INTERSECT_CONIC_LINE_NO, "debugShowConicLineIntersection" +
1271" no intersect CONIC_VAL LINE_VAL"
1272 ) || match_regexp(line, lineNo, record, INTERSECT_CONIC, "debugShowConicIntersection" +
1273" wtTs[0]=T_VAL CONIC_VAL PT_VAL wnTs[0]=T_VAL CONIC_VAL"
1274 ) || match_regexp(line, lineNo, record, INTERSECT_CONIC_2, "debugShowConicIntersection" +
1275" wtTs[0]=T_VAL CONIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL CONIC_VAL wnTs[1]=T_VAL"
1276 ) || match_regexp(line, lineNo, record, INTERSECT_CONIC_NO, "debugShowConicIntersection" +
1277" no intersect CONIC_VAL CONIC_VAL"
caryclarkdac1d172014-06-17 05:15:38 -07001278 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_LINE, "debugShowCubicLineIntersection" +
1279" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL"
1280 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_LINE_2, "debugShowCubicLineIntersection" +
1281" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL LINE_VAL wnTs[1]=T_VAL"
1282 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_LINE_3, "debugShowCubicLineIntersection" +
1283" 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"
1284 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_LINE_NO, "debugShowCubicLineIntersection" +
1285" no intersect CUBIC_VAL LINE_VAL"
1286 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_QUAD, "debugShowCubicQuadIntersection" +
1287" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wnTs[0]=T_VAL QUAD_VAL"
1288 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_QUAD_2, "debugShowCubicQuadIntersection" +
1289" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL QUAD_VAL wnTs[1]=T_VAL"
1290 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_QUAD_3, "debugShowCubicQuadIntersection" +
1291" 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"
1292 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_QUAD_4, "debugShowCubicQuadIntersection" +
1293" 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"
1294 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_QUAD_NO, "debugShowCubicQuadIntersection" +
1295" no intersect CUBIC_VAL QUAD_VAL"
1296 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC, "debugShowCubicIntersection" +
1297" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wnTs[0]=T_VAL CUBIC_VAL"
1298 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_2, "debugShowCubicIntersection" +
1299" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL PT_VAL wnTs[0]=T_VAL CUBIC_VAL wnTs[1]=T_VAL"
1300 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_3, "debugShowCubicIntersection" +
1301" 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"
1302 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_4, "debugShowCubicIntersection" +
1303" 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"
1304 ) || match_regexp(line, lineNo, record, INTERSECT_CUBIC_NO, "debugShowCubicIntersection" +
1305" no intersect CUBIC_VAL CUBIC_VAL"
1306 ) || match_regexp(line, lineNo, record, INTERSECT_SELF_CUBIC, "debugShowCubicIntersection" +
1307" wtTs[0]=T_VAL CUBIC_VAL PT_VAL wtTs[1]=T_VAL"
1308 ) || match_regexp(line, lineNo, record, INTERSECT_SELF_CUBIC_NO, "debugShowCubicIntersection" +
1309" no self intersect CUBIC_VAL"
1310 );
1311 break;
1312 case REC_TYPE_SORT:
1313 var hasDone = / done/.test(line);
1314 var hasUnorderable = / unorderable/.test(line);
1315 var hasSmall = / small/.test(line);
1316 var hasTiny = / tiny/.test(line);
1317 var hasOperand = / operand/.test(line);
1318 var hasStop = / stop/.test(line);
1319 line.replace(/[ a-z]+$/, "");
1320 found = match_regexp(line, lineNo, record, SORT_UNARY, "debugOne" +
1321" [IDX/IDX] next=IDX/IDX sect=IDX/IDX s=T_VAL [IDX] e=T_VAL [IDX] sgn=NUM windVal=IDX windSum=OPT"
1322 ) || match_regexp(line, lineNo, record, SORT_BINARY, "debugOne" +
1323" [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"
1324 ) || match_regexp(line, lineNo, record, SORT_UNARY, "dumpOne" +
1325" [IDX/IDX] next=IDX/IDX sect=NUM/NUM s=T_VAL [IDX] e=T_VAL [IDX] sgn=NUM windVal=IDX windSum=OPT"
1326 ) || match_regexp(line, lineNo, record, SORT_BINARY, "dumpOne" +
1327" [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"
1328 );
1329 if (found) {
1330 record[1].push(hasDone);
1331 record[1].push(hasUnorderable);
1332 record[1].push(hasSmall);
1333 record[1].push(hasTiny);
1334 record[1].push(hasOperand);
1335 record[1].push(hasStop);
1336 }
1337 break;
caryclark03b03ca2015-04-23 09:13:37 -07001338 case REC_TYPE_TOP:
1339 found = match_regexp(line, lineNo, record, ACTIVE_OP, "findTop" +
1340" id=IDX s=T_VAL e=T_VAL cw=NUM swap=NUM inflections=NUM monotonic=NUM"
1341 ) || match_regexp(line, lineNo, record, ACTIVE_OP, "findTop" +
1342" id=IDX s=T_VAL e=T_VAL (-) cw=NUM swap=NUM inflections=NUM monotonic=NUM"
1343 ) || match_regexp(line, lineNo, record, ACTIVE_OP, "findTop" +
1344" id=IDX s=T_VAL e=T_VAL (+) cw=NUM swap=NUM inflections=NUM monotonic=NUM"
1345 );
1346 break;
caryclarkdac1d172014-06-17 05:15:38 -07001347 case REC_TYPE_MARK:
1348 found = match_regexp(line, lineNo, record, MARK_LINE, "markWinding" +
caryclark54359292015-03-26 07:52:43 -07001349" id=IDX LINE_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX"
caryclarkdac1d172014-06-17 05:15:38 -07001350 ) || match_regexp(line, lineNo, record, MARK_QUAD, "markWinding" +
caryclark54359292015-03-26 07:52:43 -07001351" id=IDX QUAD_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX"
caryclark1049f122015-04-20 08:31:59 -07001352 ) || match_regexp(line, lineNo, record, MARK_CONIC, "markWinding" +
1353" id=IDX CONIC_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX"
caryclarkdac1d172014-06-17 05:15:38 -07001354 ) || match_regexp(line, lineNo, record, MARK_CUBIC, "markWinding" +
caryclark54359292015-03-26 07:52:43 -07001355" id=IDX CUBIC_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX"
1356 ) || match_regexp(line, lineNo, record, MARK_DONE_LINE, "markDone" +
1357" 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"
1358 ) || match_regexp(line, lineNo, record, MARK_DONE_QUAD, "markDone" +
1359" 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"
caryclark1049f122015-04-20 08:31:59 -07001360 ) || match_regexp(line, lineNo, record, MARK_DONE_CONIC, "markDone" +
1361" 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"
caryclark54359292015-03-26 07:52:43 -07001362 ) || match_regexp(line, lineNo, record, MARK_DONE_CUBIC, "markDone" +
1363" 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"
caryclarkdac1d172014-06-17 05:15:38 -07001364 ) || match_regexp(line, lineNo, record, MARK_SIMPLE_LINE, "markWinding" +
1365" id=IDX LINE_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM windSum=OPT windValue=IDX"
1366 ) || match_regexp(line, lineNo, record, MARK_SIMPLE_QUAD, "markWinding" +
1367" id=IDX QUAD_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM windSum=OPT windValue=IDX"
caryclark1049f122015-04-20 08:31:59 -07001368 ) || match_regexp(line, lineNo, record, MARK_SIMPLE_CONIC, "markWinding" +
1369" id=IDX CONIC_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM windSum=OPT windValue=IDX"
caryclarkdac1d172014-06-17 05:15:38 -07001370 ) || match_regexp(line, lineNo, record, MARK_SIMPLE_CUBIC, "markWinding" +
1371" id=IDX CUBIC_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM windSum=OPT windValue=IDX"
caryclarkdac1d172014-06-17 05:15:38 -07001372 ) || match_regexp(line, lineNo, record, MARK_ANGLE_LAST, "markAngle" +
caryclark1049f122015-04-20 08:31:59 -07001373" last segment=IDX span=IDX"
caryclark54359292015-03-26 07:52:43 -07001374 ) || match_regexp(line, lineNo, record, MARK_ANGLE_LAST, "markAngle" +
1375" last segment=IDX span=IDX windSum=OPT");
caryclarkdac1d172014-06-17 05:15:38 -07001376 break;
1377 case REC_TYPE_OP:
1378 if (line.lastIndexOf("oppSign oppSign=", 0) === 0
1379 || line.lastIndexOf("operator<", 0) === 0) {
1380 found = true;
1381 break;
1382 }
caryclark54359292015-03-26 07:52:43 -07001383 found = match_regexp(line, lineNo, record, OP_DIFFERENCE, "op diff"
caryclarkdac1d172014-06-17 05:15:38 -07001384 ) || match_regexp(line, lineNo, record, OP_INTERSECT, "op intersect"
caryclark54359292015-03-26 07:52:43 -07001385 ) || match_regexp(line, lineNo, record, OP_INTERSECT, "op sect"
caryclarkdac1d172014-06-17 05:15:38 -07001386 ) || match_regexp(line, lineNo, record, OP_UNION, "op union"
1387 ) || match_regexp(line, lineNo, record, OP_XOR, "op xor"
1388 );
1389 break;
1390 case REC_TYPE_UNKNOWN:
1391 found = true;
1392 break;
1393 }
1394 if (!found) {
1395 console.log(line + " [" + lineNo + "] of type " + type + " not found");
1396 }
1397 }
1398 if (recType != REC_TYPE_UNKNOWN) {
1399 records.push(recType);
1400 records.push(lastLineNo);
1401 records.push(record);
1402 }
1403 if (records.length >= 1) {
1404 tests[testIndex] = records;
1405 testLines[testIndex] = lines;
1406 }
1407}
1408
1409function init(test) {
1410 var canvas = document.getElementById('canvas');
1411 if (!canvas.getContext) return;
1412 ctx = canvas.getContext('2d');
1413 var resScale = retina_scale && window.devicePixelRatio ? window.devicePixelRatio : 1;
1414 var unscaledWidth = window.innerWidth - 20;
1415 var unscaledHeight = window.innerHeight - 20;
1416 screenWidth = unscaledWidth;
1417 screenHeight = unscaledHeight;
1418 canvas.width = unscaledWidth * resScale;
1419 canvas.height = unscaledHeight * resScale;
1420 canvas.style.width = unscaledWidth + 'px';
1421 canvas.style.height = unscaledHeight + 'px';
1422 if (resScale != 1) {
1423 ctx.scale(resScale, resScale);
1424 }
1425 xmin = Infinity;
1426 xmax = -Infinity;
1427 ymin = Infinity;
1428 ymax = -Infinity;
1429 hasPath = hasComputedPath = false;
1430 firstActiveSpan = -1;
1431 for (var tIndex = 0; tIndex < test.length; tIndex += 3) {
1432 var recType = test[tIndex];
1433 if (!typeof recType == 'number' || recType < REC_TYPE_UNKNOWN || recType > REC_TYPE_LAST) {
1434 console.log("unknown rec type: " + recType);
1435 throw "stop execution";
1436 }
1437 var records = test[tIndex + 2];
1438 for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
1439 var fragType = records[recordIndex];
1440 if (!typeof fragType == 'number' || fragType < 1 || fragType > FRAG_TYPE_LAST) {
1441 console.log("unknown in range frag type: " + fragType);
1442 throw "stop execution";
1443 }
1444 var frags = records[recordIndex + 1];
1445 var first = 0;
1446 var last = -1;
1447 var first2 = 0;
1448 var last2 = 0;
1449 switch (recType) {
1450 case REC_TYPE_COMPUTED:
1451 if (fragType == COMPUTED_SET_1 || fragType == COMPUTED_SET_2) {
1452 break;
1453 }
1454 hasComputedPath = true;
1455 case REC_TYPE_PATH:
caryclark54359292015-03-26 07:52:43 -07001456 first = 1;
caryclarkdac1d172014-06-17 05:15:38 -07001457 switch (fragType) {
1458 case PATH_LINE:
caryclark54359292015-03-26 07:52:43 -07001459 last = 5;
caryclarkdac1d172014-06-17 05:15:38 -07001460 break;
caryclark1049f122015-04-20 08:31:59 -07001461 case PATH_CONIC:
caryclarkdac1d172014-06-17 05:15:38 -07001462 case PATH_QUAD:
caryclark54359292015-03-26 07:52:43 -07001463 last = 7;
caryclarkdac1d172014-06-17 05:15:38 -07001464 break;
1465 case PATH_CUBIC:
caryclark54359292015-03-26 07:52:43 -07001466 last = 9;
caryclarkdac1d172014-06-17 05:15:38 -07001467 break;
1468 default:
1469 console.log("unknown " + (recType == REC_TYPE_PATH ? "REC_TYPE_PATH"
1470 : "REC_TYPE_COMPUTED") + " frag type:" + fragType);
1471 throw "stop execution";
1472 }
1473 if (recType == REC_TYPE_PATH) {
1474 hasPath = true;
1475 }
1476 break;
caryclark54359292015-03-26 07:52:43 -07001477 case REC_TYPE_PATH2:
1478 first = 1;
1479 switch (fragType) {
1480 case PATH_LINE:
1481 last = 5;
1482 break;
caryclark1049f122015-04-20 08:31:59 -07001483 case PATH_CONIC:
caryclark54359292015-03-26 07:52:43 -07001484 case PATH_QUAD:
1485 last = 7;
1486 break;
1487 case PATH_CUBIC:
1488 last = 9;
1489 break;
1490 default:
1491 console.log("unknown " + (recType == REC_TYPE_PATH2 ? "REC_TYPE_PATH2"
1492 : "REC_TYPE_COMPUTED") + " frag type:" + fragType);
1493 throw "stop execution";
1494 }
1495 if (recType == REC_TYPE_PATH2) {
1496 hasPath = true;
1497 }
1498 break;
caryclarkdac1d172014-06-17 05:15:38 -07001499 case REC_TYPE_ACTIVE:
1500 if (firstActiveSpan < 0) {
1501 firstActiveSpan = tIndex;
1502 }
1503 first = 1;
1504 switch (fragType) {
1505 case ACTIVE_LINE_SPAN:
1506 last = 5;
1507 break;
caryclark1049f122015-04-20 08:31:59 -07001508 case ACTIVE_CONIC_SPAN:
caryclarkdac1d172014-06-17 05:15:38 -07001509 case ACTIVE_QUAD_SPAN:
1510 last = 7;
1511 break;
1512 case ACTIVE_CUBIC_SPAN:
1513 last = 9;
1514 break;
1515 default:
1516 console.log("unknown REC_TYPE_ACTIVE frag type: " + fragType);
1517 throw "stop execution";
1518 }
1519 break;
1520 case REC_TYPE_ADD:
1521 switch (fragType) {
1522 case ADD_MOVETO:
1523 break;
1524 case ADD_LINETO:
1525 last = 4;
1526 break;
caryclark1049f122015-04-20 08:31:59 -07001527 case ADD_CONICTO:
caryclarkdac1d172014-06-17 05:15:38 -07001528 case ADD_QUADTO:
1529 last = 6;
1530 break;
1531 case ADD_CUBICTO:
1532 last = 8;
1533 break;
1534 case ADD_CLOSE:
1535 case ADD_FILL:
1536 break;
1537 default:
1538 console.log("unknown REC_TYPE_ADD frag type: " + fragType);
1539 throw "stop execution";
1540 }
1541 break;
caryclark54359292015-03-26 07:52:43 -07001542 case REC_TYPE_AFTERPART:
1543 switch (fragType) {
1544 case PATH_LINE:
1545 last = 4;
1546 break;
caryclark1049f122015-04-20 08:31:59 -07001547 case PATH_CONIC:
caryclark54359292015-03-26 07:52:43 -07001548 case PATH_QUAD:
1549 last = 6;
1550 break;
1551 case PATH_CUBIC:
1552 last = 8;
1553 break;
1554 default:
1555 console.log("unknown REC_TYPE_ACTIVEPART frag type: " + fragType);
1556 throw "stop execution";
1557 }
1558 break;
caryclarkdac1d172014-06-17 05:15:38 -07001559 case REC_TYPE_SECT:
1560 switch (fragType) {
1561 case INTERSECT_LINE:
1562 first = 1; last = 5; first2 = 8; last2 = 12;
1563 break;
1564 case INTERSECT_LINE_2:
1565 first = 1; last = 5; first2 = 11; last2 = 15;
1566 break;
1567 case INTERSECT_LINE_NO:
1568 first = 0; last = 4; first2 = 4; last2 = 8;
1569 break;
caryclark1049f122015-04-20 08:31:59 -07001570 case INTERSECT_CONIC_LINE:
1571 first = 1; last = 7; first2 = 11; last2 = 15;
1572 break;
caryclarkdac1d172014-06-17 05:15:38 -07001573 case INTERSECT_QUAD_LINE:
1574 first = 1; last = 7; first2 = 10; last2 = 14;
1575 break;
caryclark1049f122015-04-20 08:31:59 -07001576 case INTERSECT_CONIC_LINE_2:
1577 first = 1; last = 7; first2 = 14; last2 = 18;
1578 break;
caryclarkdac1d172014-06-17 05:15:38 -07001579 case INTERSECT_QUAD_LINE_2:
1580 first = 1; last = 7; first2 = 13; last2 = 17;
1581 break;
caryclark1049f122015-04-20 08:31:59 -07001582 case INTERSECT_CONIC_LINE_NO:
1583 first = 0; last = 6; first2 = 7; last2 = 11;
1584 break;
caryclarkdac1d172014-06-17 05:15:38 -07001585 case INTERSECT_QUAD_LINE_NO:
1586 first = 0; last = 6; first2 = 6; last2 = 10;
1587 break;
caryclark1049f122015-04-20 08:31:59 -07001588 case INTERSECT_CONIC:
1589 first = 1; last = 7; first2 = 11; last2 = 17;
1590 break;
caryclarkdac1d172014-06-17 05:15:38 -07001591 case INTERSECT_QUAD:
1592 first = 1; last = 7; first2 = 10; last2 = 16;
1593 break;
caryclark1049f122015-04-20 08:31:59 -07001594 case INTERSECT_CONIC_2:
1595 first = 1; last = 7; first2 = 14; last2 = 20;
1596 break;
caryclarkdac1d172014-06-17 05:15:38 -07001597 case INTERSECT_QUAD_2:
1598 first = 1; last = 7; first2 = 13; last2 = 19;
1599 break;
caryclark1049f122015-04-20 08:31:59 -07001600 case INTERSECT_CONIC_NO:
1601 first = 0; last = 6; first2 = 7; last2 = 13;
1602 break;
caryclarkdac1d172014-06-17 05:15:38 -07001603 case INTERSECT_QUAD_NO:
1604 first = 0; last = 6; first2 = 6; last2 = 12;
1605 break;
1606 case INTERSECT_SELF_CUBIC:
1607 first = 1; last = 9;
1608 break;
1609 case INTERSECT_SELF_CUBIC_NO:
1610 first = 0; last = 8;
1611 break;
1612 case INTERSECT_CUBIC_LINE:
1613 first = 1; last = 9; first2 = 12; last2 = 16;
1614 break;
1615 case INTERSECT_CUBIC_LINE_2:
1616 first = 1; last = 9; first2 = 15; last2 = 19;
1617 break;
1618 case INTERSECT_CUBIC_LINE_3:
1619 first = 1; last = 9; first2 = 18; last2 = 22;
1620 break;
1621 case INTERSECT_CUBIC_LINE_NO:
1622 first = 0; last = 8; first2 = 8; last2 = 12;
1623 break;
1624 case INTERSECT_CUBIC_QUAD:
1625 first = 1; last = 9; first2 = 12; last2 = 18;
1626 break;
1627 case INTERSECT_CUBIC_QUAD_2:
1628 first = 1; last = 9; first2 = 15; last2 = 21;
1629 break;
1630 case INTERSECT_CUBIC_QUAD_3:
1631 first = 1; last = 9; first2 = 18; last2 = 24;
1632 break;
1633 case INTERSECT_CUBIC_QUAD_4:
1634 first = 1; last = 9; first2 = 21; last2 = 27;
1635 break;
1636 case INTERSECT_CUBIC_QUAD_NO:
1637 first = 0; last = 8; first2 = 8; last2 = 14;
1638 break;
1639 case INTERSECT_CUBIC:
1640 first = 1; last = 9; first2 = 12; last2 = 20;
1641 break;
1642 case INTERSECT_CUBIC_2:
1643 first = 1; last = 9; first2 = 15; last2 = 23;
1644 break;
1645 case INTERSECT_CUBIC_3:
1646 first = 1; last = 9; first2 = 18; last2 = 26;
1647 break;
1648 case INTERSECT_CUBIC_4:
1649 first = 1; last = 9; first2 = 21; last2 = 29;
1650 break;
1651 case INTERSECT_CUBIC_NO:
1652 first = 0; last = 8; first2 = 8; last2 = 16;
1653 break;
1654 default:
1655 console.log("unknown REC_TYPE_SECT frag type: " + fragType);
1656 throw "stop execution";
1657 }
1658 break;
1659 default:
1660 continue;
1661 }
1662 for (var idx = first; idx < last; idx += 2) {
1663 xmin = Math.min(xmin, frags[idx]);
1664 xmax = Math.max(xmax, frags[idx]);
1665 ymin = Math.min(ymin, frags[idx + 1]);
1666 ymax = Math.max(ymax, frags[idx + 1]);
1667 }
1668 for (var idx = first2; idx < last2; idx += 2) {
1669 xmin = Math.min(xmin, frags[idx]);
1670 xmax = Math.max(xmax, frags[idx]);
1671 ymin = Math.min(ymin, frags[idx + 1]);
1672 ymax = Math.max(ymax, frags[idx + 1]);
1673 }
1674 }
1675 }
1676 var angleBounds = [Infinity, Infinity, -Infinity, -Infinity];
1677 for (var tIndex = 0; tIndex < test.length; tIndex += 3) {
1678 var recType = test[tIndex];
1679 var records = test[tIndex + 2];
1680 for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
1681 var fragType = records[recordIndex];
1682 var frags = records[recordIndex + 1];
1683 switch (recType) {
1684 case REC_TYPE_ACTIVE_OP:
1685 if (!draw_op) {
1686 break;
1687 }
1688 {
1689 var curve = curvePartialByID(test, frags[0], frags[1], frags[2]);
1690 curve_extremes(curve, angleBounds);
1691 }
1692 break;
1693 case REC_TYPE_ANGLE:
1694 if (!draw_angle) {
1695 break;
1696 }
caryclark54359292015-03-26 07:52:43 -07001697 {
caryclarkdac1d172014-06-17 05:15:38 -07001698 var curve = curvePartialByID(test, frags[0], frags[4], frags[5]);
1699 curve_extremes(curve, angleBounds);
1700 curve = curvePartialByID(test, frags[6], frags[10], frags[11]);
1701 curve_extremes(curve, angleBounds);
1702 curve = curvePartialByID(test, frags[12], frags[16], frags[17]);
1703 }
1704 break;
caryclark624637c2015-05-11 07:21:27 -07001705 case REC_TYPE_COINCIDENCE:
1706 if (!draw_coincidence) {
1707 break;
1708 }
1709 {
1710 var curve = curvePartialByID(test, frags[0], frags[1], frags[2]);
1711 curve_extremes(curve, angleBounds);
1712 }
1713 break;
caryclarkdac1d172014-06-17 05:15:38 -07001714 case REC_TYPE_SORT:
1715 if (!draw_sort) {
1716 break;
1717 }
1718 if (fragType == SORT_UNARY || fragType == SORT_BINARY) {
1719 var curve = curvePartialByID(test, frags[0], frags[6], frags[8]);
1720 curve_extremes(curve, angleBounds);
1721 }
1722 break;
caryclark03b03ca2015-04-23 09:13:37 -07001723 case REC_TYPE_TOP:
1724 if (!draw_top) {
1725 break;
1726 }
1727 {
1728 var curve = curvePartialByID(test, frags[0], frags[1], frags[2]);
1729 curve_extremes(curve, angleBounds);
1730 }
1731 break;
caryclarkdac1d172014-06-17 05:15:38 -07001732 }
1733 }
1734 }
1735 xmin = Math.min(xmin, angleBounds[0]);
1736 ymin = Math.min(ymin, angleBounds[1]);
1737 xmax = Math.max(xmax, angleBounds[2]);
1738 ymax = Math.max(ymax, angleBounds[3]);
1739 setScale(xmin, xmax, ymin, ymax);
1740 if (hasPath == false && hasComputedPath == true && !draw_computed) {
caryclark1049f122015-04-20 08:31:59 -07001741 draw_computed = 7; // show quadratics, conics, and cubics
caryclarkdac1d172014-06-17 05:15:38 -07001742 }
1743 if (hasPath == true && hasComputedPath == false && draw_computed) {
1744 draw_computed = 0;
1745 }
1746}
1747
1748function curveByID(test, id) {
caryclark54359292015-03-26 07:52:43 -07001749 var tIndex = -3;
1750 while ((tIndex += 3) < test.length) {
caryclarkdac1d172014-06-17 05:15:38 -07001751 var recType = test[tIndex];
caryclark54359292015-03-26 07:52:43 -07001752 if (recType == REC_TYPE_OP) {
1753 continue;
1754 }
1755 if (recType != REC_TYPE_PATH) {
caryclarkdac1d172014-06-17 05:15:38 -07001756 return [];
1757 }
1758 var records = test[tIndex + 2];
1759 for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
1760 var fragType = records[recordIndex];
1761 var frags = records[recordIndex + 1];
1762 if (frags[0] == id) {
1763 switch (fragType) {
caryclark54359292015-03-26 07:52:43 -07001764 case PATH_LINE:
caryclarkdac1d172014-06-17 05:15:38 -07001765 return [frags[1], frags[2], frags[3], frags[4]];
caryclark54359292015-03-26 07:52:43 -07001766 case PATH_QUAD:
caryclarkdac1d172014-06-17 05:15:38 -07001767 return [frags[1], frags[2], frags[3], frags[4],
1768 frags[5], frags[6]];
caryclark1049f122015-04-20 08:31:59 -07001769 case PATH_CONIC:
1770 return [frags[1], frags[2], frags[3], frags[4],
1771 frags[5], frags[6], frags[7]];
caryclark54359292015-03-26 07:52:43 -07001772 case PATH_CUBIC:
caryclarkdac1d172014-06-17 05:15:38 -07001773 return [frags[1], frags[2], frags[3], frags[4],
1774 frags[5], frags[6], frags[7], frags[8]];
1775 }
1776 }
1777 }
caryclarkdac1d172014-06-17 05:15:38 -07001778 }
1779 return [];
1780}
1781
1782function curvePartialByID(test, id, t0, t1) {
caryclark54359292015-03-26 07:52:43 -07001783 var tIndex = -3;
1784 while ((tIndex += 3) < test.length) {
caryclarkdac1d172014-06-17 05:15:38 -07001785 var recType = test[tIndex];
caryclark54359292015-03-26 07:52:43 -07001786 if (recType == REC_TYPE_OP) {
1787 continue;
1788 }
1789 if (recType != REC_TYPE_PATH) {
caryclarkdac1d172014-06-17 05:15:38 -07001790 return [];
1791 }
1792 var records = test[tIndex + 2];
1793 for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
1794 var fragType = records[recordIndex];
1795 var frags = records[recordIndex + 1];
1796 if (frags[0] == id) {
1797 switch (fragType) {
caryclark54359292015-03-26 07:52:43 -07001798 case PATH_LINE:
caryclarkdac1d172014-06-17 05:15:38 -07001799 return linePartial(frags[1], frags[2], frags[3], frags[4], t0, t1);
caryclark54359292015-03-26 07:52:43 -07001800 case PATH_QUAD:
caryclarkdac1d172014-06-17 05:15:38 -07001801 return quadPartial(frags[1], frags[2], frags[3], frags[4],
1802 frags[5], frags[6], t0, t1);
caryclark1049f122015-04-20 08:31:59 -07001803 case PATH_CONIC:
1804 return conicPartial(frags[1], frags[2], frags[3], frags[4],
1805 frags[5], frags[6], frags[7], t0, t1);
caryclark54359292015-03-26 07:52:43 -07001806 case PATH_CUBIC:
caryclarkdac1d172014-06-17 05:15:38 -07001807 return cubicPartial(frags[1], frags[2], frags[3], frags[4],
1808 frags[5], frags[6], frags[7], frags[8], t0, t1);
1809 }
1810 }
1811 }
caryclarkdac1d172014-06-17 05:15:38 -07001812 }
1813 return [];
1814}
1815
1816function idByCurve(test, frag, type) {
caryclark54359292015-03-26 07:52:43 -07001817 var tIndex = 0;
caryclarkdac1d172014-06-17 05:15:38 -07001818 while (tIndex < test.length) {
1819 var recType = test[tIndex];
caryclark54359292015-03-26 07:52:43 -07001820 if (recType != REC_TYPE_PATH) {
1821 ++tIndex;
1822 continue;
caryclarkdac1d172014-06-17 05:15:38 -07001823 }
1824 var records = test[tIndex + 2];
1825 for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
1826 var fragType = records[recordIndex];
1827 var frags = records[recordIndex + 1];
caryclark54359292015-03-26 07:52:43 -07001828 if (frag.length != frags.length - 1) {
1829 continue;
1830 }
caryclarkdac1d172014-06-17 05:15:38 -07001831 switch (fragType) {
caryclark54359292015-03-26 07:52:43 -07001832 case PATH_LINE:
caryclarkdac1d172014-06-17 05:15:38 -07001833 if (frag[0] != frags[1] || frag[1] != frags[2]
1834 || frag[2] != frags[3] || frag[3] != frags[4]) {
1835 continue;
1836 }
1837 return frags[0];
caryclark54359292015-03-26 07:52:43 -07001838 case PATH_QUAD:
caryclarkdac1d172014-06-17 05:15:38 -07001839 if (frag[0] != frags[1] || frag[1] != frags[2]
1840 || frag[2] != frags[3] || frag[3] != frags[4]
1841 || frag[4] != frags[5] || frag[5] != frags[6]) {
1842 continue;
1843 }
1844 return frags[0];
caryclark1049f122015-04-20 08:31:59 -07001845 case PATH_CONIC:
1846 if (frag[0] != frags[1] || frag[1] != frags[2]
1847 || frag[2] != frags[3] || frag[3] != frags[4]
1848 || frag[4] != frags[5] || frag[5] != frags[6]
1849 || frag[6] != frags[7]) {
1850 continue;
1851 }
1852 return frags[0];
caryclark54359292015-03-26 07:52:43 -07001853 case PATH_CUBIC:
caryclarkdac1d172014-06-17 05:15:38 -07001854 if (frag[0] != frags[1] || frag[1] != frags[2]
1855 || frag[2] != frags[3] || frag[3] != frags[4]
1856 || frag[4] != frags[5] || frag[5] != frags[6]
1857 || frag[6] != frags[7] || frag[7] != frags[8]) {
1858 continue;
1859 }
1860 return frags[0];
1861 }
1862 }
1863 ++tIndex;
1864 }
1865 return -1;
1866}
1867
1868function curve_extremes(curve, bounds) {
caryclark1049f122015-04-20 08:31:59 -07001869 var length = curve.length == 7 ? 6 : curve.length;
caryclarkdac1d172014-06-17 05:15:38 -07001870 for (var index = 0; index < curve.length; index += 2) {
1871 var x = curve[index];
1872 var y = curve[index + 1];
1873 bounds[0] = Math.min(bounds[0], x);
1874 bounds[1] = Math.min(bounds[1], y);
1875 bounds[2] = Math.max(bounds[2], x);
1876 bounds[3] = Math.max(bounds[3], y);
1877 }
1878}
1879
1880function setScale(x0, x1, y0, y1) {
1881 var srcWidth = x1 - x0;
1882 var srcHeight = y1 - y0;
1883 var usableWidth = screenWidth;
1884 var xDigits = Math.ceil(Math.log(Math.abs(xmax)) / Math.log(10));
1885 var yDigits = Math.ceil(Math.log(Math.abs(ymax)) / Math.log(10));
1886 usableWidth -= (xDigits + yDigits) * 10;
1887 usableWidth -= decimal_places * 10;
1888 if (draw_legend) {
1889 usableWidth -= 40;
1890 }
1891 var hscale = usableWidth / srcWidth;
1892 var vscale = screenHeight / srcHeight;
1893 scale = Math.min(hscale, vscale);
1894 var invScale = 1 / scale;
1895 var sxmin = x0 - invScale * 5;
1896 var symin = y0 - invScale * 10;
1897 var sxmax = x1 + invScale * (6 * decimal_places + 10);
1898 var symax = y1 + invScale * 10;
1899 srcWidth = sxmax - sxmin;
1900 srcHeight = symax - symin;
1901 hscale = usableWidth / srcWidth;
1902 vscale = screenHeight / srcHeight;
1903 scale = Math.min(hscale, vscale);
1904 srcLeft = sxmin;
1905 srcTop = symin;
1906}
1907
1908function drawArc(curve, op, from, to) {
1909 var type = PATH_LINE + (curve.length / 2 - 2);
1910 var pt = pointAtT(curve, type, op ? 0.4 : 0.6);
1911 var dy = pt.y - curve[1];
1912 var dx = pt.x - curve[0];
1913 var dist = Math.sqrt(dy * dy + dx * dx);
1914 var _dist = dist * scale;
1915 var angle = Math.atan2(dy, dx);
1916 var _px = (curve[0] - srcLeft) * scale;
1917 var _py = (curve[1] - srcTop) * scale;
1918 var divisor = 4;
1919 var endDist;
1920 do {
1921 var ends = [];
1922 for (var index = -1; index <= 1; index += 2) {
1923 var px = Math.cos(index * Math.PI / divisor);
1924 var py = Math.sin(index * Math.PI / divisor);
1925 ends.push(px);
1926 ends.push(py);
1927 }
1928 var endDx = (ends[2] - ends[0]) * scale * dist;
1929 var endDy = (ends[3] - ends[1]) * scale * dist;
1930 endDist = Math.sqrt(endDx * endDx + endDy * endDy);
1931 if (endDist < 100) {
1932 break;
1933 }
1934 divisor *= 2;
1935 } while (true);
1936 if (endDist < 30) {
1937 return;
1938 }
1939 if (op) {
1940 divisor *= 2;
1941 }
1942 ctx.strokeStyle = op ? "rgba(210,0,45, 0.4)" : "rgba(90,90,90, 0.5)";
1943 ctx.beginPath();
1944 ctx.arc(_px, _py, _dist, angle - Math.PI / divisor, angle + Math.PI / divisor, false);
1945 ctx.stroke();
1946 var saveAlign = ctx.textAlign;
1947 var saveStyle = ctx.fillStyle;
1948 var saveFont = ctx.font;
1949 ctx.textAlign = "center";
1950 ctx.fillStyle = "black";
1951 ctx.font = "normal 24px Arial";
1952 divisor *= 0.8;
1953 for (var index = -1; index <= 1; index += 2) {
1954 var px = curve[0] + Math.cos(angle + index * Math.PI / divisor) * dist;
1955 var py = curve[1] + Math.sin(angle + index * Math.PI / divisor) * dist;
1956 var _px = (px - srcLeft) * scale;
1957 var _py = (py - srcTop) * scale;
1958 ctx.fillText(index < 0 ? to.toString() : from.toString(), _px, _py + 8);
1959 }
1960 ctx.textAlign = saveAlign;
1961 ctx.fillStyle = saveStyle;
1962 ctx.font = saveFont;
1963}
1964
1965function drawPoint(px, py, end) {
caryclark1049f122015-04-20 08:31:59 -07001966 var length = drawnPts.length == 7 ? 6 : drawnPts.length;
1967 for (var pts = 0; pts < length; pts += 2) {
caryclarkdac1d172014-06-17 05:15:38 -07001968 var x = drawnPts[pts];
1969 var y = drawnPts[pts + 1];
1970 if (px == x && py == y) {
1971 return;
1972 }
1973 }
1974 drawnPts.push(px);
1975 drawnPts.push(py);
1976 var label = px.toFixed(decimal_places) + ", " + py.toFixed(decimal_places);
1977 var _px = (px - srcLeft) * scale;
1978 var _py = (py - srcTop) * scale;
1979 ctx.beginPath();
1980 ctx.arc(_px, _py, 3, 0, Math.PI*2, true);
1981 ctx.closePath();
1982 if (end) {
1983 ctx.fill();
1984 } else {
1985 ctx.stroke();
1986 }
1987 if (debug_xy) {
1988 ctx.textAlign = "left";
1989 ctx.fillText(label, _px + 5, _py);
1990 }
1991}
1992
caryclark1049f122015-04-20 08:31:59 -07001993function coordCount(curveType) {
1994 switch (curveType) {
1995 case PATH_LINE:
1996 return 4;
1997 case PATH_QUAD:
1998 return 6;
1999 case PATH_CONIC:
2000 return 6;
2001 case PATH_CUBIC:
2002 return 8;
2003 }
2004 return -1;
2005}
2006
caryclarkdac1d172014-06-17 05:15:38 -07002007function drawPoints(ptArray, curveType, drawControls) {
caryclark1049f122015-04-20 08:31:59 -07002008 var count = coordCount(curveType);
caryclarkdac1d172014-06-17 05:15:38 -07002009 for (var idx = 0; idx < count; idx += 2) {
2010 if (!drawControls && idx != 0 && idx != count - 2) {
2011 continue;
2012 }
2013 drawPoint(ptArray[idx], ptArray[idx + 1], idx == 0 || idx == count - 2);
2014 }
2015}
2016
2017function drawControlLines(curve, curveType, drawEnd) {
2018 if (curveType == PATH_LINE) {
2019 return;
2020 }
2021 ctx.strokeStyle = "rgba(0,0,0, 0.3)";
2022 drawLine(curve[0], curve[1], curve[2], curve[3]);
2023 drawLine(curve[2], curve[3], curve[4], curve[5]);
2024 if (curveType == PATH_CUBIC) {
2025 drawLine(curve[4], curve[5], curve[6], curve[7]);
2026 if (drawEnd > 1) {
2027 drawLine(curve[6], curve[7], curve[0], curve[1]);
2028 if (drawEnd > 2) {
2029 drawLine(curve[0], curve[1], curve[4], curve[5]);
2030 drawLine(curve[6], curve[7], curve[2], curve[3]);
2031 }
2032 }
2033 } else if (drawEnd > 1) {
2034 drawLine(curve[4], curve[5], curve[0], curve[1]);
2035 }
2036}
2037
2038function pointAtT(curve, curveType, t) {
2039 var xy = {};
2040 switch (curveType) {
2041 case PATH_LINE:
2042 var a = 1 - t;
2043 var b = t;
2044 xy.x = a * curve[0] + b * curve[2];
2045 xy.y = a * curve[1] + b * curve[3];
2046 break;
2047 case PATH_QUAD:
2048 var one_t = 1 - t;
2049 var a = one_t * one_t;
2050 var b = 2 * one_t * t;
2051 var c = t * t;
2052 xy.x = a * curve[0] + b * curve[2] + c * curve[4];
2053 xy.y = a * curve[1] + b * curve[3] + c * curve[5];
2054 break;
caryclark1049f122015-04-20 08:31:59 -07002055 case PATH_CONIC:
2056 var one_t = 1 - t;
2057 var a = one_t * one_t;
2058 var b = 2 * one_t * t;
2059 var c = t * t;
2060 xy.x = a * curve[0] + b * curve[2] * curve[6] + c * curve[4];
2061 xy.y = a * curve[1] + b * curve[3] * curve[6] + c * curve[5];
2062 var d = a + b * curve[6] + c;
2063 xy.x /= d;
2064 xy.y /= d;
2065 break;
caryclarkdac1d172014-06-17 05:15:38 -07002066 case PATH_CUBIC:
2067 var one_t = 1 - t;
2068 var one_t2 = one_t * one_t;
2069 var a = one_t2 * one_t;
2070 var b = 3 * one_t2 * t;
2071 var t2 = t * t;
2072 var c = 3 * one_t * t2;
2073 var d = t2 * t;
2074 xy.x = a * curve[0] + b * curve[2] + c * curve[4] + d * curve[6];
2075 xy.y = a * curve[1] + b * curve[3] + c * curve[5] + d * curve[7];
2076 break;
2077 }
2078 return xy;
2079}
2080
2081function drawPointAtT(curve, curveType) {
2082 var x, y;
2083 var xy = pointAtT(curve, curveType, curveT);
2084 drawPoint(xy.x, xy.y, true);
2085 if (!draw_intersectT) {
2086 return;
2087 }
2088 ctx.fillStyle = "red";
2089 drawTAtPointUp(xy.x, xy.y, curveT);
2090}
2091
2092function drawTAtPointUp(px, py, t) {
2093 var label = t.toFixed(decimal_places);
2094 var _px = (px - srcLeft)* scale;
2095 var _py = (py - srcTop) * scale;
2096 ctx.fillText(label, _px + 5, _py - 10);
2097}
2098
2099function drawTAtPointDown(px, py, t) {
2100 var label = t.toFixed(decimal_places);
2101 var _px = (px - srcLeft)* scale;
2102 var _py = (py - srcTop) * scale;
2103 ctx.fillText(label, _px + 5, _py + 10);
2104}
2105
2106function alreadyDrawnLine(x1, y1, x2, y2) {
2107 if (collect_bounds) {
2108 if (focus_enabled) {
2109 focusXmin = Math.min(focusXmin, x1, x2);
2110 focusYmin = Math.min(focusYmin, y1, y2);
2111 focusXmax = Math.max(focusXmax, x1, x2);
2112 focusYmax = Math.max(focusYmax, y1, y2);
2113 }
2114 return true;
2115 }
2116 for (var pts = 0; pts < drawnLines.length; pts += 4) {
2117 if (x1 == drawnLines[pts] && y1 == drawnLines[pts + 1]
2118 && x2 == drawnLines[pts + 2] && y2 == drawnLines[pts + 3]) {
2119 return true;
2120 }
2121 }
2122 drawnLines.push(x1);
2123 drawnLines.push(y1);
2124 drawnLines.push(x2);
2125 drawnLines.push(y2);
2126 return false;
2127}
2128
2129function drawLine(x1, y1, x2, y2) {
2130 if (alreadyDrawnLine(x1, y1, x2, y2)) {
2131 return;
2132 }
2133 ctx.beginPath();
2134 ctx.moveTo((x1 - srcLeft) * scale,
2135 (y1 - srcTop) * scale);
2136 ctx.lineTo((x2 - srcLeft) * scale,
2137 (y2 - srcTop) * scale);
2138 ctx.stroke();
2139}
2140
2141function linePartial(x1, y1, x2, y2, t1, t2) {
2142 var dx = x1 - x2;
2143 var dy = y1 - y2;
2144 var array = [
2145 x1 - t1 * dx,
2146 y1 - t1 * dy,
2147 x1 - t2 * dx,
2148 y1 - t2 * dy
2149 ];
2150 return array;
2151}
2152
2153function drawLinePartial(x1, y1, x2, y2, t1, t2) {
2154 var a = linePartial(x1, y1, x2, y2, t1, t2);
2155 var ax = a[0];
2156 var ay = a[1];
2157 var bx = a[2];
2158 var by = a[3];
2159 if (alreadyDrawnLine(ax, ay, bx, by)) {
2160 return;
2161 }
2162 ctx.beginPath();
2163 ctx.moveTo((ax - srcLeft) * scale,
2164 (ay - srcTop) * scale);
2165 ctx.lineTo((bx - srcLeft) * scale,
2166 (by - srcTop) * scale);
2167 ctx.stroke();
2168}
2169
2170function alreadyDrawnQuad(x1, y1, x2, y2, x3, y3) {
2171 if (collect_bounds) {
2172 if (focus_enabled) {
2173 focusXmin = Math.min(focusXmin, x1, x2, x3);
2174 focusYmin = Math.min(focusYmin, y1, y2, y3);
2175 focusXmax = Math.max(focusXmax, x1, x2, x3);
2176 focusYmax = Math.max(focusYmax, y1, y2, y3);
2177 }
2178 return true;
2179 }
2180 for (var pts = 0; pts < drawnQuads.length; pts += 6) {
2181 if (x1 == drawnQuads[pts] && y1 == drawnQuads[pts + 1]
2182 && x2 == drawnQuads[pts + 2] && y2 == drawnQuads[pts + 3]
2183 && x3 == drawnQuads[pts + 4] && y3 == drawnQuads[pts + 5]) {
2184 return true;
2185 }
2186 }
2187 drawnQuads.push(x1);
2188 drawnQuads.push(y1);
2189 drawnQuads.push(x2);
2190 drawnQuads.push(y2);
2191 drawnQuads.push(x3);
2192 drawnQuads.push(y3);
2193 return false;
2194}
2195
2196function drawQuad(x1, y1, x2, y2, x3, y3) {
2197 if (alreadyDrawnQuad(x1, y1, x2, y2, x3, y3)) {
2198 return;
2199 }
2200 ctx.beginPath();
2201 ctx.moveTo((x1 - srcLeft) * scale,
2202 (y1 - srcTop) * scale);
2203 ctx.quadraticCurveTo((x2 - srcLeft) * scale,
2204 (y2 - srcTop) * scale,
2205 (x3 - srcLeft) * scale,
2206 (y3 - srcTop) * scale);
2207 ctx.stroke();
2208}
2209
2210function interp(A, B, t) {
2211 return A + (B - A) * t;
2212}
2213
2214function interp_quad_coords(x1, x2, x3, t)
2215{
2216 var ab = interp(x1, x2, t);
2217 var bc = interp(x2, x3, t);
2218 var abc = interp(ab, bc, t);
2219 return abc;
2220}
2221
2222function quadPartial(x1, y1, x2, y2, x3, y3, t1, t2) {
2223 var ax = interp_quad_coords(x1, x2, x3, t1);
2224 var ay = interp_quad_coords(y1, y2, y3, t1);
2225 var dx = interp_quad_coords(x1, x2, x3, (t1 + t2) / 2);
2226 var dy = interp_quad_coords(y1, y2, y3, (t1 + t2) / 2);
2227 var cx = interp_quad_coords(x1, x2, x3, t2);
2228 var cy = interp_quad_coords(y1, y2, y3, t2);
2229 var bx = 2*dx - (ax + cx)/2;
2230 var by = 2*dy - (ay + cy)/2;
2231 var array = [
2232 ax, ay, bx, by, cx, cy
2233 ];
2234 return array;
2235}
2236
2237function drawQuadPartial(x1, y1, x2, y2, x3, y3, t1, t2) {
2238 var a = quadPartial(x1, y1, x2, y2, x3, y3, t1, t2);
2239 var ax = a[0];
2240 var ay = a[1];
2241 var bx = a[2];
2242 var by = a[3];
2243 var cx = a[4];
2244 var cy = a[5];
2245 if (alreadyDrawnQuad(ax, ay, bx, by, cx, cy)) {
2246 return;
2247 }
2248 ctx.beginPath();
2249 ctx.moveTo((ax - srcLeft) * scale,
2250 (ay - srcTop) * scale);
2251 ctx.quadraticCurveTo((bx - srcLeft) * scale,
2252 (by - srcTop) * scale,
2253 (cx - srcLeft) * scale,
2254 (cy - srcTop) * scale);
2255 ctx.stroke();
2256}
2257
caryclark1049f122015-04-20 08:31:59 -07002258function alreadyDrawnConic(x1, y1, x2, y2, x3, y3, w) {
2259 if (collect_bounds) {
2260 if (focus_enabled) {
2261 focusXmin = Math.min(focusXmin, x1, x2, x3);
2262 focusYmin = Math.min(focusYmin, y1, y2, y3);
2263 focusXmax = Math.max(focusXmax, x1, x2, x3);
2264 focusYmax = Math.max(focusYmax, y1, y2, y3);
2265 }
2266 return true;
2267 }
2268 for (var pts = 0; pts < drawnConics.length; pts += 8) {
2269 if (x1 == drawnConics[pts] && y1 == drawnCubics[pts + 1]
2270 && x2 == drawnCubics[pts + 2] && y2 == drawnCubics[pts + 3]
2271 && x3 == drawnCubics[pts + 4] && y3 == drawnCubics[pts + 5]
2272 && w == drawnCubics[pts + 6]) {
2273 return true;
2274 }
2275 }
2276 drawnConics.push(x1);
2277 drawnConics.push(y1);
2278 drawnConics.push(x2);
2279 drawnConics.push(y2);
2280 drawnConics.push(x3);
2281 drawnConics.push(y3);
2282 drawnCubics.push(w);
2283 return false;
2284}
2285
2286var kMaxConicToQuadPOW2 = 5;
2287
2288function computeQuadPOW2(curve, tol) {
2289 var a = curve[6] - 1;
2290 var k = a / (4 * (2 + a));
2291 var x = k * (curve[0] - 2 * curve[2] + curve[4]);
2292 var y = k * (curve[1] - 2 * curve[3] + curve[5]);
2293
2294 var error = Math.sqrt(x * x + y * y);
2295 var pow2;
2296 for (pow2 = 0; pow2 < kMaxConicToQuadPOW2; ++pow2) {
2297 if (error <= tol) {
2298 break;
2299 }
2300 error *= 0.25;
2301 }
2302 return pow2;
2303}
2304
2305function subdivide_w_value(w) {
2306 return Math.sqrt(0.5 + w * 0.5);
2307}
2308
2309function chop(curve, part1, part2) {
2310 var w = curve[6];
2311 var scale = 1 / (1 + w);
2312 part1[0] = curve[0];
2313 part1[1] = curve[1];
2314 part1[2] = (curve[0] + curve[2] * w) * scale;
2315 part1[3] = (curve[1] + curve[3] * w) * scale;
2316 part1[4] = part2[0] = (curve[0] + (curve[2] * w) * 2 + curve[4]) * scale * 0.5;
2317 part1[5] = part2[1] = (curve[1] + (curve[3] * w) * 2 + curve[5]) * scale * 0.5;
2318 part2[2] = (curve[2] * w + curve[4]) * scale;
2319 part2[3] = (curve[3] * w + curve[5]) * scale;
2320 part2[4] = curve[4];
2321 part2[5] = curve[5];
2322 part1[6] = part2[6] = subdivide_w_value(w);
2323}
2324
2325function subdivide(curve, level, pts) {
2326 if (0 == level) {
2327 pts.push(curve[2]);
2328 pts.push(curve[3]);
2329 pts.push(curve[4]);
2330 pts.push(curve[5]);
2331 } else {
2332 var part1 = [], part2 = [];
2333 chop(curve, part1, part2);
2334 --level;
2335 subdivide(part1, level, pts);
2336 subdivide(part2, level, pts);
2337 }
2338}
2339
2340function chopIntoQuadsPOW2(curve, pow2, pts) {
2341 subdivide(curve, pow2, pts);
2342 return 1 << pow2;
2343}
2344
2345function drawConicWithQuads(x1, y1, x2, y2, x3, y3, w) {
2346 if (alreadyDrawnConic(x1, y1, x2, y2, x3, y3, w)) {
2347 return;
2348 }
2349 ctx.beginPath();
2350 ctx.moveTo((x1 - srcLeft) * scale,
2351 (y1 - srcTop) * scale);
2352 var tol = 1 / scale;
2353 var curve = [x1, y1, x2, y2, x3, y3, w];
2354 var pow2 = computeQuadPOW2(curve, tol);
2355 var pts = [];
2356 chopIntoQuadsPOW2(curve, pow2, pts);
2357 for (var i = 0; i < pts.length; i += 4) {
2358 ctx.quadraticCurveTo(
2359 (pts[i + 0] - srcLeft) * scale, (pts[i + 1] - srcTop) * scale,
2360 (pts[i + 2] - srcLeft) * scale, (pts[i + 3] - srcTop) * scale);
2361 }
2362 ctx.stroke();
2363}
2364
2365function conic_eval_numerator(x1, x2, x3, w, t) {
2366 var src2w = x2 * w;
2367 var C = x1;
2368 var A = x3 - 2 * src2w + C;
2369 var B = 2 * (src2w - C);
2370 return (A * t + B) * t + C;
2371}
2372
2373
2374function conic_eval_denominator(w, t) {
2375 var B = 2 * (w - 1);
2376 var C = 1;
2377 var A = -B;
2378 return (A * t + B) * t + C;
2379}
2380
2381function conicPartial(x1, y1, x2, y2, x3, y3, w, t1, t2) {
2382 var ax = conic_eval_numerator(x1, x2, x3, w, t1);
2383 var ay = conic_eval_numerator(y1, y2, y3, w, t1);
2384 var az = conic_eval_denominator(w, t1);
2385 var midT = (t1 + t2) / 2;
2386 var dx = conic_eval_numerator(x1, x2, x3, w, midT);
2387 var dy = conic_eval_numerator(y1, y2, y3, w, midT);
2388 var dz = conic_eval_denominator(w, midT);
2389 var cx = conic_eval_numerator(x1, x2, x3, w, t2);
2390 var cy = conic_eval_numerator(y1, y2, y3, w, t2);
2391 var cz = conic_eval_denominator(w, t2);
2392 var bx = 2 * dx - (ax + cx) / 2;
2393 var by = 2 * dy - (ay + cy) / 2;
2394 var bz = 2 * dz - (az + cz) / 2;
2395 var dt = t2 - t1;
2396 var dt_1 = 1 - dt;
2397 var partW = (1 + dt * (w - 1)) / Math.sqrt(dt * dt + 2 * dt * dt_1 * w + dt_1 * dt_1);
2398 var array = [
2399 ax / az, ay / az, bx / bz, by / bz, cx / cz, cy / cz, partW
2400 ];
2401 return array;
2402}
2403
2404function drawConicPartial(x1, y1, x2, y2, x3, y3, w, t1, t2) {
2405 var a = conicPartial(x1, y1, x2, y2, x3, y3, w, t1, t2);
2406 var ax = a[0];
2407 var ay = a[1];
2408 var bx = a[2];
2409 var by = a[3];
2410 var cx = a[4];
2411 var cy = a[5];
2412 var w_ = a[6];
2413 drawConicWithQuads(ax, ay, bx, by, cx, cy, w_);
2414}
2415
caryclarkdac1d172014-06-17 05:15:38 -07002416function alreadyDrawnCubic(x1, y1, x2, y2, x3, y3, x4, y4) {
2417 if (collect_bounds) {
2418 if (focus_enabled) {
2419 focusXmin = Math.min(focusXmin, x1, x2, x3, x4);
2420 focusYmin = Math.min(focusYmin, y1, y2, y3, y4);
2421 focusXmax = Math.max(focusXmax, x1, x2, x3, x4);
2422 focusYmax = Math.max(focusYmax, y1, y2, y3, y4);
2423 }
2424 return true;
2425 }
2426 for (var pts = 0; pts < drawnCubics.length; pts += 8) {
2427 if (x1 == drawnCubics[pts] && y1 == drawnCubics[pts + 1]
2428 && x2 == drawnCubics[pts + 2] && y2 == drawnCubics[pts + 3]
2429 && x3 == drawnCubics[pts + 4] && y3 == drawnCubics[pts + 5]
2430 && x4 == drawnCubics[pts + 6] && y4 == drawnCubics[pts + 7]) {
2431 return true;
2432 }
2433 }
2434 drawnCubics.push(x1);
2435 drawnCubics.push(y1);
2436 drawnCubics.push(x2);
2437 drawnCubics.push(y2);
2438 drawnCubics.push(x3);
2439 drawnCubics.push(y3);
2440 drawnCubics.push(x4);
2441 drawnCubics.push(y4);
2442 return false;
2443}
2444
2445function drawCubic(x1, y1, x2, y2, x3, y3, x4, y4) {
2446 if (alreadyDrawnCubic(x1, y1, x2, y2, x3, y3, x4, y4)) {
2447 return;
2448 }
2449 ctx.beginPath();
2450 ctx.moveTo((x1 - srcLeft) * scale,
2451 (y1 - srcTop) * scale);
2452 ctx.bezierCurveTo((x2 - srcLeft) * scale,
2453 (y2 - srcTop) * scale,
2454 (x3 - srcLeft) * scale,
2455 (y3 - srcTop) * scale,
2456 (x4 - srcLeft) * scale,
2457 (y4 - srcTop) * scale);
2458 ctx.stroke();
2459}
2460
2461function interp_cubic_coords(x1, x2, x3, x4, t)
2462{
2463 var ab = interp(x1, x2, t);
2464 var bc = interp(x2, x3, t);
2465 var cd = interp(x3, x4, t);
2466 var abc = interp(ab, bc, t);
2467 var bcd = interp(bc, cd, t);
2468 var abcd = interp(abc, bcd, t);
2469 return abcd;
2470}
2471
2472function cubicPartial(x1, y1, x2, y2, x3, y3, x4, y4, t1, t2) {
2473 var ax = interp_cubic_coords(x1, x2, x3, x4, t1);
2474 var ay = interp_cubic_coords(y1, y2, y3, y4, t1);
2475 var ex = interp_cubic_coords(x1, x2, x3, x4, (t1*2+t2)/3);
2476 var ey = interp_cubic_coords(y1, y2, y3, y4, (t1*2+t2)/3);
2477 var fx = interp_cubic_coords(x1, x2, x3, x4, (t1+t2*2)/3);
2478 var fy = interp_cubic_coords(y1, y2, y3, y4, (t1+t2*2)/3);
2479 var dx = interp_cubic_coords(x1, x2, x3, x4, t2);
2480 var dy = interp_cubic_coords(y1, y2, y3, y4, t2);
2481 var mx = ex * 27 - ax * 8 - dx;
2482 var my = ey * 27 - ay * 8 - dy;
2483 var nx = fx * 27 - ax - dx * 8;
2484 var ny = fy * 27 - ay - dy * 8;
2485 var bx = (mx * 2 - nx) / 18;
2486 var by = (my * 2 - ny) / 18;
2487 var cx = (nx * 2 - mx) / 18;
2488 var cy = (ny * 2 - my) / 18;
2489 var array = [
2490 ax, ay, bx, by, cx, cy, dx, dy
2491 ];
2492 return array;
2493}
2494
2495function drawCubicPartial(x1, y1, x2, y2, x3, y3, x4, y4, t1, t2) {
2496 var a = cubicPartial(x1, y1, x2, y2, x3, y3, x4, y4, t1, t2);
2497 var ax = a[0];
2498 var ay = a[1];
2499 var bx = a[2];
2500 var by = a[3];
2501 var cx = a[4];
2502 var cy = a[5];
2503 var dx = a[6];
2504 var dy = a[7];
2505 if (alreadyDrawnCubic(ax, ay, bx, by, cx, cy, dx, dy)) {
2506 return;
2507 }
2508 ctx.beginPath();
2509 ctx.moveTo((ax - srcLeft) * scale,
2510 (ay - srcTop) * scale);
2511 ctx.bezierCurveTo((bx - srcLeft) * scale,
2512 (by - srcTop) * scale,
2513 (cx - srcLeft) * scale,
2514 (cy - srcTop) * scale,
2515 (dx - srcLeft) * scale,
2516 (dy - srcTop) * scale);
2517 ctx.stroke();
2518}
2519
2520function drawCurve(c) {
2521 switch (c.length) {
2522 case 4:
2523 drawLine(c[0], c[1], c[2], c[3]);
2524 break;
2525 case 6:
2526 drawQuad(c[0], c[1], c[2], c[3], c[4], c[5]);
2527 break;
caryclark1049f122015-04-20 08:31:59 -07002528 case 7:
2529 drawConicWithQuads(c[0], c[1], c[2], c[3], c[4], c[5], c[6]);
2530 break;
caryclarkdac1d172014-06-17 05:15:38 -07002531 case 8:
2532 drawCubic(c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7]);
2533 break;
2534 }
2535}
2536
2537function boundsWidth(pts) {
2538 var min = pts[0];
2539 var max = pts[0];
caryclark1049f122015-04-20 08:31:59 -07002540 var length = pts.length == 7 ? 6 : pts.length;
2541 for (var idx = 2; idx < length; idx += 2) {
caryclarkdac1d172014-06-17 05:15:38 -07002542 min = Math.min(min, pts[idx]);
2543 max = Math.max(max, pts[idx]);
2544 }
2545 return max - min;
2546}
2547
2548function boundsHeight(pts) {
2549 var min = pts[1];
2550 var max = pts[1];
caryclark1049f122015-04-20 08:31:59 -07002551 var length = pts.length == 7 ? 6 : pts.length;
2552 for (var idx = 3; idx < length; idx += 2) {
caryclarkdac1d172014-06-17 05:15:38 -07002553 min = Math.min(min, pts[idx]);
2554 max = Math.max(max, pts[idx]);
2555 }
2556 return max - min;
2557}
2558
2559function tangent(pts) {
2560 var dx = pts[2] - pts[0];
2561 var dy = pts[3] - pts[1];
2562 if (dx == 0 && dy == 0 && pts.length > 4) {
2563 dx = pts[4] - pts[0];
2564 dy = pts[5] - pts[1];
caryclark1049f122015-04-20 08:31:59 -07002565 if (dx == 0 && dy == 0 && pts.length == 8) {
caryclarkdac1d172014-06-17 05:15:38 -07002566 dx = pts[6] - pts[0];
2567 dy = pts[7] - pts[1];
2568 }
2569 }
2570 return Math.atan2(-dy, dx);
2571}
2572
2573function hodograph(cubic) {
2574 var hodo = [];
2575 hodo[0] = 3 * (cubic[2] - cubic[0]);
2576 hodo[1] = 3 * (cubic[3] - cubic[1]);
2577 hodo[2] = 3 * (cubic[4] - cubic[2]);
2578 hodo[3] = 3 * (cubic[5] - cubic[3]);
2579 hodo[4] = 3 * (cubic[6] - cubic[4]);
2580 hodo[5] = 3 * (cubic[7] - cubic[5]);
2581 return hodo;
2582}
2583
2584function hodograph2(cubic) {
2585 var quad = hodograph(cubic);
2586 var hodo = [];
2587 hodo[0] = 2 * (quad[2] - quad[0]);
2588 hodo[1] = 2 * (quad[3] - quad[1]);
2589 hodo[2] = 2 * (quad[4] - quad[2]);
2590 hodo[3] = 2 * (quad[5] - quad[3]);
2591 return hodo;
2592}
2593
2594function quadraticRootsReal(A, B, C, s) {
2595 if (A == 0) {
2596 if (B == 0) {
2597 s[0] = 0;
2598 return C == 0;
2599 }
2600 s[0] = -C / B;
2601 return 1;
2602 }
2603 /* normal form: x^2 + px + q = 0 */
2604 var p = B / (2 * A);
2605 var q = C / A;
2606 var p2 = p * p;
2607 if (p2 < q) {
2608 return 0;
2609 }
2610 var sqrt_D = 0;
2611 if (p2 > q) {
2612 sqrt_D = sqrt(p2 - q);
2613 }
2614 s[0] = sqrt_D - p;
2615 s[1] = -sqrt_D - p;
2616 return 1 + s[0] != s[1];
2617}
2618
2619function add_valid_ts(s, realRoots, t) {
2620 var foundRoots = 0;
2621 for (var index = 0; index < realRoots; ++index) {
2622 var tValue = s[index];
2623 if (tValue >= 0 && tValue <= 1) {
2624 for (var idx2 = 0; idx2 < foundRoots; ++idx2) {
2625 if (t[idx2] != tValue) {
2626 t[foundRoots++] = tValue;
2627 }
2628 }
2629 }
2630 }
2631 return foundRoots;
2632}
2633
2634function quadraticRootsValidT(a, b, c, t) {
2635 var s = [];
2636 var realRoots = quadraticRootsReal(A, B, C, s);
2637 var foundRoots = add_valid_ts(s, realRoots, t);
2638 return foundRoots != 0;
2639}
2640
2641function find_cubic_inflections(cubic, tValues) {
2642 var Ax = src[2] - src[0];
2643 var Ay = src[3] - src[1];
2644 var Bx = src[4] - 2 * src[2] + src[0];
2645 var By = src[5] - 2 * src[3] + src[1];
2646 var Cx = src[6] + 3 * (src[2] - src[4]) - src[0];
2647 var Cy = src[7] + 3 * (src[3] - src[5]) - src[1];
2648 return quadraticRootsValidT(Bx * Cy - By * Cx, (Ax * Cy - Ay * Cx),
2649 Ax * By - Ay * Bx, tValues);
2650}
2651
2652function dxy_at_t(curve, type, t) {
2653 var dxy = {};
2654 if (type == PATH_QUAD) {
2655 var a = t - 1;
2656 var b = 1 - 2 * t;
2657 var c = t;
2658 dxy.x = a * curve[0] + b * curve[2] + c * curve[4];
2659 dxy.y = a * curve[1] + b * curve[3] + c * curve[5];
caryclark1049f122015-04-20 08:31:59 -07002660 } else if (type == PATH_CONIC) {
2661 var p20x = curve[4] - curve[0];
2662 var p20y = curve[5] - curve[1];
2663 var p10xw = (curve[2] - curve[0]) * curve[6];
2664 var p10yw = (curve[3] - curve[1]) * curve[6];
2665 var coeff0x = curve[6] * p20x - p20x;
2666 var coeff0y = curve[6] * p20y - p20y;
2667 var coeff1x = p20x - 2 * p10xw;
2668 var coeff1y = p20y - 2 * p10yw;
2669 dxy.x = t * (t * coeff0x + coeff1x) + p10xw;
2670 dxy.y = t * (t * coeff0y + coeff1y) + p10yw;
caryclarkdac1d172014-06-17 05:15:38 -07002671 } else if (type == PATH_CUBIC) {
2672 var one_t = 1 - t;
2673 var a = curve[0];
2674 var b = curve[2];
2675 var c = curve[4];
2676 var d = curve[6];
2677 dxy.x = 3 * ((b - a) * one_t * one_t + 2 * (c - b) * t * one_t + (d - c) * t * t);
2678 a = curve[1];
2679 b = curve[3];
2680 c = curve[5];
2681 d = curve[7];
2682 dxy.y = 3 * ((b - a) * one_t * one_t + 2 * (c - b) * t * one_t + (d - c) * t * t);
2683 }
2684 return dxy;
2685}
2686
2687function drawLabel(num, px, py) {
2688 ctx.beginPath();
2689 ctx.arc(px, py, 8, 0, Math.PI*2, true);
2690 ctx.closePath();
2691 ctx.strokeStyle = "rgba(0,0,0, 0.4)";
2692 ctx.lineWidth = num == 0 || num == 3 ? 2 : 1;
2693 ctx.stroke();
2694 ctx.fillStyle = "black";
2695 ctx.font = "normal 10px Arial";
2696 // ctx.rotate(0.001);
2697 ctx.fillText(num, px - 2, py + 3);
2698 // ctx.rotate(-0.001);
2699}
2700
2701function drawLabelX(ymin, num, loc) {
2702 var px = (loc - srcLeft) * scale;
2703 var py = (ymin - srcTop) * scale - 20;
2704 drawLabel(num, px, py);
2705}
2706
2707function drawLabelY(xmin, num, loc) {
2708 var px = (xmin - srcLeft) * scale - 20;
2709 var py = (loc - srcTop) * scale;
2710 drawLabel(num, px, py);
2711}
2712
2713function drawHodoOrigin(hx, hy, hMinX, hMinY, hMaxX, hMaxY) {
2714 ctx.beginPath();
2715 ctx.moveTo(hx, hy - 100);
2716 ctx.lineTo(hx, hy);
2717 ctx.strokeStyle = hMinY < 0 ? "green" : "blue";
2718 ctx.stroke();
2719 ctx.beginPath();
2720 ctx.moveTo(hx, hy);
2721 ctx.lineTo(hx, hy + 100);
2722 ctx.strokeStyle = hMaxY > 0 ? "green" : "blue";
2723 ctx.stroke();
2724 ctx.beginPath();
2725 ctx.moveTo(hx - 100, hy);
2726 ctx.lineTo(hx, hy);
2727 ctx.strokeStyle = hMinX < 0 ? "green" : "blue";
2728 ctx.stroke();
2729 ctx.beginPath();
2730 ctx.moveTo(hx, hy);
2731 ctx.lineTo(hx + 100, hy);
2732 ctx.strokeStyle = hMaxX > 0 ? "green" : "blue";
2733 ctx.stroke();
2734}
2735
2736function scalexy(x, y, mag) {
2737 var length = Math.sqrt(x * x + y * y);
2738 return mag / length;
2739}
2740
caryclark03b03ca2015-04-23 09:13:37 -07002741function drawArrow(x, y, dx, dy, s) {
2742 var dscale = scalexy(dx, dy, 1 / scale * 100 * s);
caryclarkdac1d172014-06-17 05:15:38 -07002743 dx *= dscale;
2744 dy *= dscale;
2745 ctx.beginPath();
2746 ctx.moveTo((x - srcLeft) * scale, (y - srcTop) * scale);
2747 x += dx;
2748 y += dy;
2749 ctx.lineTo((x - srcLeft) * scale, (y - srcTop) * scale);
2750 dx /= 10;
2751 dy /= 10;
2752 ctx.lineTo((x - dy - srcLeft) * scale, (y + dx - srcTop) * scale);
2753 ctx.lineTo((x + dx * 2 - srcLeft) * scale, (y + dy * 2 - srcTop) * scale);
2754 ctx.lineTo((x + dy - srcLeft) * scale, (y - dx - srcTop) * scale);
2755 ctx.lineTo((x - srcLeft) * scale, (y - srcTop) * scale);
2756 ctx.strokeStyle = "rgba(0,75,0, 0.4)";
2757 ctx.stroke();
2758}
2759
2760function x_at_t(curve, t) {
2761 var one_t = 1 - t;
2762 if (curve.length == 4) {
2763 return one_t * curve[0] + t * curve[2];
2764 }
2765 var one_t2 = one_t * one_t;
2766 var t2 = t * t;
2767 if (curve.length == 6) {
2768 return one_t2 * curve[0] + 2 * one_t * t * curve[2] + t2 * curve[4];
2769 }
caryclark1049f122015-04-20 08:31:59 -07002770 if (curve.length == 7) {
2771 return (one_t2 * curve[0] + 2 * one_t * t * curve[2] * curve[6] + t2 * curve[4])
2772 / (one_t2 +2 * one_t * t * curve[6] + t2);
2773 }
caryclarkdac1d172014-06-17 05:15:38 -07002774 var a = one_t2 * one_t;
2775 var b = 3 * one_t2 * t;
2776 var c = 3 * one_t * t2;
2777 var d = t2 * t;
2778 return a * curve[0] + b * curve[2] + c * curve[4] + d * curve[6];
2779}
2780
2781function y_at_t(curve, t) {
2782 var one_t = 1 - t;
2783 if (curve.length == 4) {
2784 return one_t * curve[1] + t * curve[3];
2785 }
2786 var one_t2 = one_t * one_t;
2787 var t2 = t * t;
2788 if (curve.length == 6) {
2789 return one_t2 * curve[1] + 2 * one_t * t * curve[3] + t2 * curve[5];
2790 }
caryclark1049f122015-04-20 08:31:59 -07002791 if (curve.length == 7) {
2792 return (one_t2 * curve[1] + 2 * one_t * t * curve[3] * curve[6] + t2 * curve[5])
2793 / (one_t2 +2 * one_t * t * curve[6] + t2);
2794 }
caryclarkdac1d172014-06-17 05:15:38 -07002795 var a = one_t2 * one_t;
2796 var b = 3 * one_t2 * t;
2797 var c = 3 * one_t * t2;
2798 var d = t2 * t;
2799 return a * curve[1] + b * curve[3] + c * curve[5] + d * curve[7];
2800}
2801
2802function drawOrder(curve, label) {
2803 var px = x_at_t(curve, 0.75);
2804 var py = y_at_t(curve, 0.75);
2805 var _px = (px - srcLeft) * scale;
2806 var _py = (py - srcTop) * scale;
2807 ctx.beginPath();
2808 ctx.arc(_px, _py, 15, 0, Math.PI * 2, true);
2809 ctx.closePath();
2810 ctx.fillStyle = "white";
2811 ctx.fill();
2812 if (label == 'L') {
2813 ctx.strokeStyle = "rgba(255,0,0, 1)";
2814 ctx.fillStyle = "rgba(255,0,0, 1)";
2815 } else {
2816 ctx.strokeStyle = "rgba(0,0,255, 1)";
2817 ctx.fillStyle = "rgba(0,0,255, 1)";
2818 }
2819 ctx.stroke();
2820 ctx.font = "normal 16px Arial";
2821 ctx.textAlign = "center";
2822 ctx.fillText(label, _px, _py + 5);
2823 ctx.font = "normal 10px Arial";
2824}
2825
2826function drawID(curve, id) {
2827 var px = x_at_t(curve, 0.5);
2828 var py = y_at_t(curve, 0.5);
2829 var _px = (px - srcLeft) * scale;
2830 var _py = (py - srcTop) * scale;
2831 draw_id_at(id, _px, _py);
2832}
2833
2834function draw_id_at(id, _px, _py) {
2835 ctx.beginPath();
2836 ctx.arc(_px, _py, 15, 0, Math.PI * 2, true);
2837 ctx.closePath();
2838 ctx.fillStyle = "white";
2839 ctx.fill();
2840 ctx.strokeStyle = "rgba(127,127,0, 1)";
2841 ctx.fillStyle = "rgba(127,127,0, 1)";
2842 ctx.stroke();
2843 ctx.font = "normal 16px Arial";
2844 ctx.textAlign = "center";
2845 ctx.fillText(id, _px, _py + 5);
2846 ctx.font = "normal 10px Arial";
2847}
2848
2849function drawLinePartialID(id, x1, y1, x2, y2, t1, t2) {
2850 var curve = [x1, y1, x2, y2];
2851 drawCurvePartialID(id, curve, t1, t2);
2852}
2853
2854function drawQuadPartialID(id, x1, y1, x2, y2, x3, y3, t1, t2) {
2855 var curve = [x1, y1, x2, y2, x3, y3];
2856 drawCurvePartialID(id, curve, t1, t2);
2857}
2858
caryclark1049f122015-04-20 08:31:59 -07002859function drawConicPartialID(id, x1, y1, x2, y2, x3, y3, w, t1, t2) {
2860 var curve = [x1, y1, x2, y2, x3, y3, w];
2861 drawCurvePartialID(id, curve, t1, t2);
2862}
2863
caryclarkdac1d172014-06-17 05:15:38 -07002864function drawCubicPartialID(id, x1, y1, x2, y2, x3, y3, x4, y4, t1, t2) {
2865 var curve = [x1, y1, x2, y2, x3, y3, x4, y4];
2866 drawCurvePartialID(id, curve, t1, t2);
2867}
2868
2869function drawCurvePartialID(id, curve, t1, t2) {
2870 var px = x_at_t(curve, (t1 + t2) / 2);
2871 var py = y_at_t(curve, (t1 + t2) / 2);
2872 var _px = (px - srcLeft) * scale;
2873 var _py = (py - srcTop) * scale;
2874 draw_id_at(id, _px, _py);
2875}
2876
2877function drawCurveSpecials(test, curve, type) {
2878 if (pt_labels) {
2879 drawPoints(curve, type, pt_labels == 2);
2880 }
2881 if (control_lines != 0) {
2882 drawControlLines(curve, type, control_lines);
2883 }
2884 if (curve_t) {
2885 drawPointAtT(curve, type);
2886 }
2887 if (draw_midpoint) {
2888 var mid = pointAtT(curve, type, 0.5);
2889 drawPoint(mid.x, mid.y, true);
2890 }
2891 if (draw_id) {
2892 var id = idByCurve(test, curve, type);
2893 if (id >= 0) {
2894 drawID(curve, id);
2895 }
2896 }
2897 if (type == PATH_LINE) {
2898 return;
2899 }
2900 if (draw_deriviatives > 0) {
2901 var d = dxy_at_t(curve, type, 0);
caryclark03b03ca2015-04-23 09:13:37 -07002902 drawArrow(curve[0], curve[1], d.x, d.y, 1);
caryclarkdac1d172014-06-17 05:15:38 -07002903 if (draw_deriviatives == 2) {
2904 d = dxy_at_t(curve, type, 1);
2905 if (type == PATH_CUBIC) {
caryclark03b03ca2015-04-23 09:13:37 -07002906 drawArrow(curve[6], curve[7], d.x, d.y, 1);
caryclarkdac1d172014-06-17 05:15:38 -07002907 } else {
caryclark03b03ca2015-04-23 09:13:37 -07002908 drawArrow(curve[4], curve[5], d.x, d.y, 1);
caryclarkdac1d172014-06-17 05:15:38 -07002909 }
2910 }
2911 if (draw_midpoint) {
2912 var mid = pointAtT(curve, type, 0.5);
2913 d = dxy_at_t(curve, type, 0.5);
caryclark03b03ca2015-04-23 09:13:37 -07002914 drawArrow(mid.x, mid.y, d.x, d.y, 1);
caryclarkdac1d172014-06-17 05:15:38 -07002915 }
2916 }
2917 if (type != PATH_CUBIC) {
2918 return;
2919 }
caryclarkdac1d172014-06-17 05:15:38 -07002920 if (draw_sequence) {
2921 var ymin = Math.min(curve[1], curve[3], curve[5], curve[7]);
2922 for (var i = 0; i < 8; i+= 2) {
2923 drawLabelX(ymin, i >> 1, curve[i]);
2924 }
2925 var xmin = Math.min(curve[0], curve[2], curve[4], curve[6]);
2926 for (var i = 1; i < 8; i+= 2) {
2927 drawLabelY(xmin, i >> 1, curve[i]);
2928 }
2929 }
2930}
2931
2932function logCurves(test) {
2933 for (curves in test) {
2934 var curve = test[curves];
2935 dumpCurve(curve);
2936 }
2937}
2938
2939function curveToString(curve) {
2940 var str = "{{";
caryclark1049f122015-04-20 08:31:59 -07002941 var length = curve.length == 7 ? 6 : curve.length;
2942 if (curve.length == 7) {
2943 str += "{";
2944 }
2945 for (i = 0; i < length; i += 2) {
caryclarkdac1d172014-06-17 05:15:38 -07002946 str += curve[i].toFixed(decimal_places) + "," + curve[i + 1].toFixed(decimal_places);
2947 if (i < curve.length - 2) {
2948 str += "}, {";
2949 }
2950 }
caryclark1049f122015-04-20 08:31:59 -07002951 str += "}";
2952 if (curve.length == 7) {
2953 str += "}, " + curve[6].toFixed(decimal_places);
2954 }
2955 str += "}";
caryclarkdac1d172014-06-17 05:15:38 -07002956 return str;
2957}
2958
2959function dumpCurve(curve) {
2960 console.log(curveToString(curve));
2961}
2962
2963function draw(test, lines, title) {
2964 ctx.fillStyle = "rgba(0,0,0, 0.1)";
2965 ctx.font = "normal 50px Arial";
2966 ctx.textAlign = "left";
2967 ctx.fillText(title, 50, 50);
2968 ctx.font = "normal 10px Arial";
2969 ctx.lineWidth = "1.001"; "0.999";
2970 var secondPath = test.length;
2971 var closeCount = 0;
2972 logStart = -1;
2973 logRange = 0;
2974 // find last active rec type at this step
2975 var curType = test[0];
2976 var curStep = 0;
2977 var hasOp = false;
2978 var lastActive = 0;
2979 var lastAdd = 0;
caryclark624637c2015-05-11 07:21:27 -07002980 var lastCoin = 0;
caryclarkdac1d172014-06-17 05:15:38 -07002981 var lastSect = 0;
2982 var lastSort = 0;
2983 var lastMark = 0;
caryclark03b03ca2015-04-23 09:13:37 -07002984 var lastTop = 0;
caryclarkdac1d172014-06-17 05:15:38 -07002985 activeCount = 0;
2986 addCount = 0;
2987 angleCount = 0;
2988 opCount = 0;
2989 sectCount = 0;
2990 sortCount = 0;
caryclark03b03ca2015-04-23 09:13:37 -07002991 topCount = 0;
caryclarkdac1d172014-06-17 05:15:38 -07002992 markCount = 0;
2993 activeMax = 0;
2994 addMax = 0;
2995 angleMax = 0;
caryclark624637c2015-05-11 07:21:27 -07002996 coinMax = 0;
caryclarkdac1d172014-06-17 05:15:38 -07002997 opMax = 0;
2998 sectMax = 0;
2999 sectMax2 = 0;
3000 sortMax = 0;
caryclark03b03ca2015-04-23 09:13:37 -07003001 topMax = 0;
caryclarkdac1d172014-06-17 05:15:38 -07003002 markMax = 0;
3003 lastIndex = test.length - 3;
3004 for (var tIndex = 0; tIndex < test.length; tIndex += 3) {
3005 var recType = test[tIndex];
3006 if (!typeof recType == 'number' || recType < REC_TYPE_UNKNOWN || recType > REC_TYPE_LAST) {
3007 console.log("unknown rec type: " + recType);
3008 throw "stop execution";
3009 }
3010 // if (curType == recType && curType != REC_TYPE_ADD) {
3011 // continue;
3012 // }
3013 var inStepRange = step_limit == 0 || curStep < step_limit;
3014 curType = recType;
3015 if (recType == REC_TYPE_OP) {
3016 hasOp = true;
3017 continue;
3018 }
3019 if (recType == REC_TYPE_UNKNOWN) {
3020 // these types do not advance step
3021 continue;
3022 }
3023 var bumpStep = false;
3024 var records = test[tIndex + 2];
3025 var fragType = records[0];
3026 if (recType == REC_TYPE_ADD) {
3027 if (records.length != 2) {
3028 console.log("expect only two elements: " + records.length);
3029 throw "stop execution";
3030 }
3031 if (fragType == ADD_MOVETO || fragType == ADD_CLOSE) {
3032 continue;
3033 }
3034 ++addMax;
3035 if (!draw_add || !inStepRange) {
3036 continue;
3037 }
3038 lastAdd = tIndex;
3039 ++addCount;
3040 bumpStep = true;
3041 }
3042 if (recType == REC_TYPE_PATH && hasOp) {
3043 secondPath = tIndex;
3044 }
caryclark54359292015-03-26 07:52:43 -07003045 if (recType == REC_TYPE_PATH2 && hasOp) {
3046 secondPath = tIndex;
3047 }
caryclarkdac1d172014-06-17 05:15:38 -07003048 if (recType == REC_TYPE_ACTIVE) {
3049 ++activeMax;
3050 if (!draw_active || !inStepRange) {
3051 continue;
3052 }
3053 lastActive = tIndex;
3054 ++activeCount;
3055 bumpStep = true;
3056 }
3057 if (recType == REC_TYPE_ACTIVE_OP) {
3058 ++opMax;
3059 if (!draw_op || !inStepRange) {
3060 continue;
3061 }
3062 lastOp = tIndex;
3063 ++opCount;
3064 bumpStep = true;
3065 }
caryclark54359292015-03-26 07:52:43 -07003066 if (recType == REC_TYPE_AFTERPART) {
3067 if (draw_angle != 3 || !inStepRange) {
3068 continue;
3069 }
3070 lastAngle = tIndex;
3071 ++angleCount;
3072 bumpStep = true;
3073 }
caryclarkdac1d172014-06-17 05:15:38 -07003074 if (recType == REC_TYPE_ANGLE) {
3075 ++angleMax;
caryclark54359292015-03-26 07:52:43 -07003076 if (draw_angle == 0 || draw_angle == 3 || !inStepRange) {
caryclarkdac1d172014-06-17 05:15:38 -07003077 continue;
3078 }
3079 lastAngle = tIndex;
3080 ++angleCount;
3081 bumpStep = true;
3082 }
caryclark624637c2015-05-11 07:21:27 -07003083 if (recType == REC_TYPE_COINCIDENCE) {
3084 ++coinMax;
3085 if (!draw_coincidence || !inStepRange) {
3086 continue;
3087 }
3088 lastCoin = tIndex;
3089 ++coinCount;
3090 bumpStep = true;
3091 }
caryclarkdac1d172014-06-17 05:15:38 -07003092 if (recType == REC_TYPE_SECT) {
3093 if (records.length != 2) {
3094 console.log("expect only two elements: " + records.length);
3095 throw "stop execution";
3096 }
3097 ++sectMax;
3098 var sectBump = 1;
3099 switch (fragType) {
3100 case INTERSECT_LINE:
3101 case INTERSECT_QUAD_LINE:
3102 case INTERSECT_QUAD:
caryclark1049f122015-04-20 08:31:59 -07003103 case INTERSECT_CONIC_LINE:
3104 case INTERSECT_CONIC:
caryclarkdac1d172014-06-17 05:15:38 -07003105 case INTERSECT_SELF_CUBIC:
3106 case INTERSECT_CUBIC_LINE:
3107 case INTERSECT_CUBIC_QUAD:
3108 case INTERSECT_CUBIC:
3109 sectBump = 1;
3110 break;
3111 case INTERSECT_LINE_2:
3112 case INTERSECT_QUAD_LINE_2:
3113 case INTERSECT_QUAD_2:
caryclark1049f122015-04-20 08:31:59 -07003114 case INTERSECT_CONIC_LINE_2:
3115 case INTERSECT_CONIC_2:
caryclarkdac1d172014-06-17 05:15:38 -07003116 case INTERSECT_CUBIC_LINE_2:
3117 case INTERSECT_CUBIC_QUAD_2:
3118 case INTERSECT_CUBIC_2:
3119 sectBump = 2;
3120 break;
3121 case INTERSECT_LINE_NO:
3122 case INTERSECT_QUAD_LINE_NO:
3123 case INTERSECT_QUAD_NO:
caryclark1049f122015-04-20 08:31:59 -07003124 case INTERSECT_CONIC_LINE_NO:
3125 case INTERSECT_CONIC_NO:
caryclarkdac1d172014-06-17 05:15:38 -07003126 case INTERSECT_SELF_CUBIC_NO:
3127 case INTERSECT_CUBIC_LINE_NO:
3128 case INTERSECT_CUBIC_QUAD_NO:
3129 case INTERSECT_CUBIC_NO:
3130 sectBump = 0;
3131 break;
3132 case INTERSECT_CUBIC_LINE_3:
3133 case INTERSECT_CUBIC_QUAD_3:
3134 case INTERSECT_CUBIC_3:
3135 sectBump = 3;
3136 break;
3137 case INTERSECT_CUBIC_QUAD_4:
3138 case INTERSECT_CUBIC_4:
3139 sectBump = 4;
3140 break;
3141 default:
3142 console.log("missing case " + records.length);
3143 throw "stop execution";
3144 }
3145 sectMax2 += sectBump;
3146 if (draw_intersection <= 1 || !inStepRange) {
3147 continue;
3148 }
3149 lastSect = tIndex;
3150 sectCount += sectBump;
3151 bumpStep = true;
3152 }
3153 if (recType == REC_TYPE_SORT) {
3154 ++sortMax;
3155 if (!draw_sort || !inStepRange) {
3156 continue;
3157 }
3158 lastSort = tIndex;
3159 ++sortCount;
3160 bumpStep = true;
3161 }
caryclark03b03ca2015-04-23 09:13:37 -07003162 if (recType == REC_TYPE_TOP) {
3163 ++topMax;
3164 if (!draw_top || !inStepRange) {
3165 continue;
3166 }
3167 lastTop = tIndex;
3168 ++topCount;
3169 bumpStep = true;
3170 }
caryclarkdac1d172014-06-17 05:15:38 -07003171 if (recType == REC_TYPE_MARK) {
3172 ++markMax;
3173 if (!draw_mark || !inStepRange) {
3174 continue;
3175 }
3176 lastMark = tIndex;
3177 ++markCount;
3178 bumpStep = true;
3179 }
3180 if (bumpStep) {
3181 lastIndex = tIndex;
3182 logStart = test[tIndex + 1];
3183 logRange = records.length / 2;
3184 ++curStep;
3185 }
3186 }
3187 stepMax = (draw_add ? addMax : 0)
3188 + (draw_active ? activeMax : 0)
reed0dc4dd62015-03-24 13:55:33 -07003189 + (draw_angle ? angleMax : 0)
caryclark624637c2015-05-11 07:21:27 -07003190 + (draw_coincidence ? coinMax : 0)
caryclark54359292015-03-26 07:52:43 -07003191 + (draw_op ? opMax : 0)
caryclarkdac1d172014-06-17 05:15:38 -07003192 + (draw_sort ? sortMax : 0)
caryclark03b03ca2015-04-23 09:13:37 -07003193 + (draw_top ? topMax : 0)
caryclarkdac1d172014-06-17 05:15:38 -07003194 + (draw_mark ? markMax : 0)
3195 + (draw_intersection == 2 ? sectMax : draw_intersection == 3 ? sectMax2 : 0);
3196 if (stepMax == 0) {
caryclark624637c2015-05-11 07:21:27 -07003197 stepMax = addMax + activeMax + angleMax + coinMax + opMax + sortMax + topMax + markMax;
caryclarkdac1d172014-06-17 05:15:38 -07003198 }
3199 drawnPts = [];
3200 drawnLines = [];
3201 drawnQuads = [];
caryclark1049f122015-04-20 08:31:59 -07003202 drawnConics = [];
caryclarkdac1d172014-06-17 05:15:38 -07003203 drawnCubics = [];
3204 focusXmin = focusYmin = Infinity;
3205 focusXmax = focusYmax = -Infinity;
3206 var pathIndex = 0;
3207 var opLetter = 'S';
3208 for (var tIndex = lastIndex; tIndex >= 0; tIndex -= 3) {
3209 var recType = test[tIndex];
3210 var records = test[tIndex + 2];
3211 for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
3212 var fragType = records[recordIndex];
3213 if (!typeof fragType == 'number' || fragType < 1 || fragType > FRAG_TYPE_LAST) {
3214 console.log("unknown in range frag type: " + fragType);
3215 throw "stop execution";
3216 }
3217 var frags = records[recordIndex + 1];
3218 focus_enabled = false;
3219 switch (recType) {
3220 case REC_TYPE_COMPUTED:
3221 if (draw_computed == 0) {
3222 continue;
3223 }
3224 ctx.lineWidth = 1;
3225 ctx.strokeStyle = pathIndex == 0 ? "black" : "red";
3226 ctx.fillStyle = "blue";
3227 var drawThis = false;
3228 switch (fragType) {
3229 case PATH_QUAD:
caryclark1049f122015-04-20 08:31:59 -07003230 if ((draw_computed & 0x9) == 1 || ((draw_computed & 8) != 0
3231 && (draw_computed & 7) == pathIndex)) {
caryclarkdac1d172014-06-17 05:15:38 -07003232 drawQuad(frags[0], frags[1], frags[2], frags[3],
3233 frags[4], frags[5]);
3234 drawThis = true;
3235 }
3236 break;
caryclark1049f122015-04-20 08:31:59 -07003237 case PATH_CONIC:
3238 if ((draw_computed & 0xA) == 2 || ((draw_computed & 8) != 0
3239 && (draw_computed & 7) == pathIndex)) {
3240 drawConicWithQuads(frags[0], frags[1], frags[2], frags[3],
3241 frags[4], frags[5], frags[6]);
3242 drawThis = true;
3243 }
3244 break;
caryclarkdac1d172014-06-17 05:15:38 -07003245 case PATH_CUBIC:
caryclark1049f122015-04-20 08:31:59 -07003246 if ((draw_computed & 0xC) == 4 || ((draw_computed & 8) != 0
3247 && (draw_computed & 7) == pathIndex)) {
caryclarkdac1d172014-06-17 05:15:38 -07003248 drawCubic(frags[0], frags[1], frags[2], frags[3],
3249 frags[4], frags[5], frags[6], frags[7]);
3250 drawThis = true;
3251 }
3252 ++pathIndex;
3253 break;
3254 case COMPUTED_SET_1:
3255 pathIndex = 0;
3256 break;
3257 case COMPUTED_SET_2:
3258 pathIndex = 1;
3259 break;
3260 default:
3261 console.log("unknown REC_TYPE_COMPUTED frag type: " + fragType);
3262 throw "stop execution";
3263 }
3264 if (!drawThis || collect_bounds) {
3265 break;
3266 }
3267 drawCurveSpecials(test, frags, fragType);
3268 break;
3269 case REC_TYPE_PATH:
caryclark54359292015-03-26 07:52:43 -07003270 case REC_TYPE_PATH2:
caryclarkdac1d172014-06-17 05:15:38 -07003271 if (!draw_path) {
3272 continue;
3273 }
3274 var firstPath = tIndex < secondPath;
3275 if ((draw_path & (firstPath ? 1 : 2)) == 0) {
3276 continue;
3277 }
3278 ctx.lineWidth = 1;
3279 ctx.strokeStyle = firstPath ? "black" : "red";
3280 ctx.fillStyle = "blue";
caryclark54359292015-03-26 07:52:43 -07003281 var frags2 = [];
caryclarkdac1d172014-06-17 05:15:38 -07003282 switch (fragType) {
3283 case PATH_LINE:
caryclark54359292015-03-26 07:52:43 -07003284 for (var i = 0; i < 4; ++ i) { frags2[i] = frags[i + 1]; }
3285 drawLine(frags2[0], frags2[1], frags2[2], frags2[3]);
caryclarkdac1d172014-06-17 05:15:38 -07003286 break;
3287 case PATH_QUAD:
caryclark54359292015-03-26 07:52:43 -07003288 for (var i = 0; i < 6; ++ i) { frags2[i] = frags[i + 1]; }
3289 drawQuad(frags2[0], frags2[1], frags2[2], frags2[3],
3290 frags2[4], frags2[5]);
caryclarkdac1d172014-06-17 05:15:38 -07003291 break;
caryclark1049f122015-04-20 08:31:59 -07003292 case PATH_CONIC:
3293 for (var i = 0; i < 7; ++ i) { frags2[i] = frags[i + 1]; }
3294 drawConicWithQuads(frags2[0], frags2[1], frags2[2], frags2[3],
3295 frags2[4], frags2[5], frags2[6]);
3296 break;
caryclarkdac1d172014-06-17 05:15:38 -07003297 case PATH_CUBIC:
caryclark54359292015-03-26 07:52:43 -07003298 for (var i = 0; i < 8; ++ i) { frags2[i] = frags[i + 1]; }
3299 drawCubic(frags2[0], frags2[1], frags2[2], frags2[3],
3300 frags2[4], frags2[5], frags2[6], frags2[7]);
caryclarkdac1d172014-06-17 05:15:38 -07003301 break;
3302 default:
caryclark54359292015-03-26 07:52:43 -07003303 console.log("unknown REC_TYPE_PATH2 frag type: " + fragType);
caryclarkdac1d172014-06-17 05:15:38 -07003304 throw "stop execution";
3305 }
3306 if (collect_bounds) {
3307 break;
3308 }
caryclark54359292015-03-26 07:52:43 -07003309 drawCurveSpecials(test, frags2, fragType);
caryclarkdac1d172014-06-17 05:15:38 -07003310 break;
3311 case REC_TYPE_OP:
3312 switch (fragType) {
3313 case OP_INTERSECT: opLetter = 'I'; break;
3314 case OP_DIFFERENCE: opLetter = 'D'; break;
3315 case OP_UNION: opLetter = 'U'; break;
3316 case OP_XOR: opLetter = 'X'; break;
3317 default:
3318 console.log("unknown REC_TYPE_OP frag type: " + fragType);
3319 throw "stop execution";
3320 }
3321 break;
3322 case REC_TYPE_ACTIVE:
3323 if (!draw_active || (step_limit > 0 && tIndex < lastActive)) {
3324 continue;
3325 }
3326 var x1 = frags[SPAN_X1];
3327 var y1 = frags[SPAN_Y1];
3328 var x2 = frags[SPAN_X2];
3329 var y2 = frags[SPAN_Y2];
caryclark1049f122015-04-20 08:31:59 -07003330 var x3, y3, x3, y4, t1, t2, w;
caryclarkdac1d172014-06-17 05:15:38 -07003331 ctx.lineWidth = 3;
3332 ctx.strokeStyle = "rgba(0,0,255, 0.3)";
3333 focus_enabled = true;
3334 switch (fragType) {
3335 case ACTIVE_LINE_SPAN:
3336 t1 = frags[SPAN_L_T];
3337 t2 = frags[SPAN_L_TEND];
3338 drawLinePartial(x1, y1, x2, y2, t1, t2);
3339 if (draw_id) {
3340 drawLinePartialID(frags[0], x1, y1, x2, y2, t1, t2);
3341 }
3342 break;
3343 case ACTIVE_QUAD_SPAN:
3344 x3 = frags[SPAN_X3];
3345 y3 = frags[SPAN_Y3];
3346 t1 = frags[SPAN_Q_T];
3347 t2 = frags[SPAN_Q_TEND];
3348 drawQuadPartial(x1, y1, x2, y2, x3, y3, t1, t2);
3349 if (draw_id) {
3350 drawQuadPartialID(frags[0], x1, y1, x2, y2, x3, y3, t1, t2);
3351 }
3352 break;
caryclark1049f122015-04-20 08:31:59 -07003353 case ACTIVE_CONIC_SPAN:
3354 x3 = frags[SPAN_X3];
3355 y3 = frags[SPAN_Y3];
3356 t1 = frags[SPAN_K_T];
3357 t2 = frags[SPAN_K_TEND];
3358 w = frags[SPAN_K_W];
3359 drawConicPartial(x1, y1, x2, y2, x3, y3, w, t1, t2);
3360 if (draw_id) {
3361 drawConicPartialID(frags[0], x1, y1, x2, y2, x3, y3, w, t1, t2);
3362 }
3363 break;
caryclarkdac1d172014-06-17 05:15:38 -07003364 case ACTIVE_CUBIC_SPAN:
3365 x3 = frags[SPAN_X3];
3366 y3 = frags[SPAN_Y3];
3367 x4 = frags[SPAN_X4];
3368 y4 = frags[SPAN_Y4];
3369 t1 = frags[SPAN_C_T];
3370 t2 = frags[SPAN_C_TEND];
3371 drawCubicPartial(x1, y1, x2, y2, x3, y3, x4, y4, t1, t2);
3372 if (draw_id) {
3373 drawCubicPartialID(frags[0], x1, y1, x2, y2, x3, y3, x4, y4, t1, t2);
3374 }
3375 break;
3376 default:
3377 console.log("unknown REC_TYPE_ACTIVE frag type: " + fragType);
3378 throw "stop execution";
3379 }
3380 break;
3381 case REC_TYPE_ACTIVE_OP:
3382 if (!draw_op || (step_limit > 0 && tIndex < lastOp)) {
3383 continue;
3384 }
3385 focus_enabled = true;
3386 ctx.lineWidth = 3;
3387 var activeSpan = frags[7] == "1";
3388 ctx.strokeStyle = activeSpan ? "rgba(45,160,0, 0.3)" : "rgba(255,45,0, 0.5)";
3389 var curve = curvePartialByID(test, frags[0], frags[1], frags[2]);
3390 drawCurve(curve);
3391 if (draw_op > 1) {
3392 drawArc(curve, false, frags[3], frags[4]);
3393 drawArc(curve, true, frags[5], frags[6]);
3394 }
3395 break;
3396 case REC_TYPE_ADD:
3397 if (!draw_add) {
3398 continue;
3399 }
3400 ctx.lineWidth = 3;
3401 ctx.strokeStyle = closeCount == 0 ? "rgba(0,0,255, 0.3)"
3402 : closeCount == 1 ? "rgba(0,127,0, 0.3)"
3403 : closeCount == 2 ? "rgba(0,127,127, 0.3)"
3404 : closeCount == 3 ? "rgba(127,127,0, 0.3)"
3405 : "rgba(127,0,127, 0.3)";
3406 focus_enabled = true;
3407 switch (fragType) {
3408 case ADD_MOVETO:
3409 break;
3410 case ADD_LINETO:
3411 if (step_limit == 0 || tIndex >= lastAdd) {
3412 drawLine(frags[0], frags[1], frags[2], frags[3]);
3413 }
3414 break;
3415 case ADD_QUADTO:
3416 if (step_limit == 0 || tIndex >= lastAdd) {
3417 drawQuad(frags[0], frags[1], frags[2], frags[3], frags[4], frags[5]);
3418 }
3419 break;
caryclark1049f122015-04-20 08:31:59 -07003420 case ADD_CONICTO:
3421 if (step_limit == 0 || tIndex >= lastAdd) {
3422 drawConicWithQuads(frags[0], frags[1], frags[2], frags[3],
3423 frags[4], frags[5], frags[6]);
3424 }
3425 break;
caryclarkdac1d172014-06-17 05:15:38 -07003426 case ADD_CUBICTO:
3427 if (step_limit == 0 || tIndex >= lastAdd) {
3428 drawCubic(frags[0], frags[1], frags[2], frags[3],
3429 frags[4], frags[5], frags[6], frags[7]);
3430 }
3431 break;
3432 case ADD_CLOSE:
3433 ++closeCount;
3434 break;
3435 case ADD_FILL:
3436 break;
3437 default:
3438 console.log("unknown REC_TYPE_ADD frag type: " + fragType);
3439 throw "stop execution";
3440 }
3441 break;
3442 case REC_TYPE_ANGLE:
caryclark54359292015-03-26 07:52:43 -07003443 angleBetween = frags[18] == "T";
3444 afterIndex = 0;
3445 if (draw_angle == 0 || draw_angle == 3 || (step_limit > 0 && tIndex < lastAngle)) {
caryclarkdac1d172014-06-17 05:15:38 -07003446 continue;
3447 }
3448 focus_enabled = true;
3449 ctx.lineWidth = 3;
3450 ctx.strokeStyle = "rgba(127,45,127, 0.3)";
caryclark54359292015-03-26 07:52:43 -07003451 var leftCurve = curvePartialByID(test, frags[0], frags[4], frags[5]);
3452 var midCurve = curvePartialByID(test, frags[6], frags[10], frags[11]);
3453 var rightCurve = curvePartialByID(test, frags[12], frags[16], frags[17]);
caryclarkdac1d172014-06-17 05:15:38 -07003454 drawCurve(leftCurve);
3455 drawCurve(rightCurve);
caryclark54359292015-03-26 07:52:43 -07003456 ctx.strokeStyle = angleBetween ? "rgba(0,160,45, 0.3)" : "rgba(255,0,45, 0.5)";
caryclarkdac1d172014-06-17 05:15:38 -07003457 drawCurve(midCurve);
3458 if (draw_angle > 1) {
3459 drawOrder(leftCurve, 'L');
3460 drawOrder(rightCurve, 'R');
3461 }
3462 break;
caryclark54359292015-03-26 07:52:43 -07003463 case REC_TYPE_AFTERPART:
3464 if (draw_angle != 3 || (step_limit > 0 && tIndex < lastAngle)) {
3465 continue;
3466 }
3467 ctx.strokeStyle = afterIndex == 0 ? "rgba(255,0,0, 1.0)"
3468 : (afterIndex == 1) == angleBetween ? "rgba(0,128,0, 1.0)"
3469 : "rgba(0,0,255, 1.0)";
3470 switch (fragType) {
3471 case PATH_LINE:
3472 drawLine(frags[0], frags[1], frags[2], frags[3]);
3473 break;
3474 case PATH_QUAD:
3475 drawQuad(frags[0], frags[1], frags[2], frags[3],
3476 frags[4], frags[5]);
3477 break;
caryclark1049f122015-04-20 08:31:59 -07003478 case PATH_CONIC:
3479 drawConicWithQuads(frags[0], frags[1], frags[2], frags[3],
3480 frags[4], frags[5], frags[6]);
3481 break;
caryclark54359292015-03-26 07:52:43 -07003482 case PATH_CUBIC:
3483 drawCubic(frags[0], frags[1], frags[2], frags[3],
caryclark1049f122015-04-20 08:31:59 -07003484 frags[4], frags[5], frags[6], frags[7]);
caryclark54359292015-03-26 07:52:43 -07003485 break;
3486 default:
3487 console.log("unknown REC_TYPE_AFTERPART frag type: " + fragType);
3488 throw "stop execution";
3489 }
3490 ++afterIndex;
3491 break;
caryclark624637c2015-05-11 07:21:27 -07003492 case REC_TYPE_COINCIDENCE:
3493 if (!draw_coincidence || (step_limit > 0 && tIndex < lastCoin)) {
3494 continue;
3495 }
3496 focus_enabled = true;
3497 ctx.lineWidth = 3;
3498 ctx.strokeStyle = "rgba(127,45,63, 0.3)";
3499 var curve = curvePartialByID(test, frags[0], frags[1], frags[2]);
3500 drawCurve(curve);
3501 break;
caryclarkdac1d172014-06-17 05:15:38 -07003502 case REC_TYPE_SECT:
3503 if (!draw_intersection) {
3504 continue;
3505 }
3506 if (draw_intersection != 1 && (step_limit > 0 && tIndex < lastSect)) {
3507 continue;
3508 }
3509 // draw_intersection == 1 : show all
3510 // draw_intersection == 2 : step == 0 ? show all : show intersection line #step
3511 // draw_intersection == 3 : step == 0 ? show all : show intersection #step
3512 ctx.lineWidth = 1;
3513 ctx.strokeStyle = "rgba(0,0,255, 0.3)";
3514 ctx.fillStyle = "blue";
3515 focus_enabled = true;
3516 var f = [];
3517 var c1s;
3518 var c1l;
3519 var c2s;
3520 var c2l;
3521 switch (fragType) {
3522 case INTERSECT_LINE:
3523 f.push(5, 6, 0, 7);
3524 c1s = 1; c1l = 4; c2s = 8; c2l = 4;
3525 break;
3526 case INTERSECT_LINE_2:
3527 f.push(5, 6, 0, 10);
3528 f.push(8, 9, 7, 15);
3529 c1s = 1; c1l = 4; c2s = 11; c2l = 4;
3530 break;
3531 case INTERSECT_LINE_NO:
3532 c1s = 0; c1l = 4; c2s = 4; c2l = 4;
3533 break;
3534 case INTERSECT_QUAD_LINE:
3535 f.push(7, 8, 0, 9);
3536 c1s = 1; c1l = 6; c2s = 10; c2l = 4;
3537 break;
3538 case INTERSECT_QUAD_LINE_2:
3539 f.push(7, 8, 0, 12);
3540 f.push(10, 11, 9, 17);
3541 c1s = 1; c1l = 6; c2s = 13; c2l = 4;
3542 break;
3543 case INTERSECT_QUAD_LINE_NO:
3544 c1s = 0; c1l = 6; c2s = 6; c2l = 4;
3545 break;
3546 case INTERSECT_QUAD:
3547 f.push(7, 8, 0, 9);
3548 c1s = 1; c1l = 6; c2s = 10; c2l = 6;
3549 break;
3550 case INTERSECT_QUAD_2:
3551 f.push(7, 8, 0, 12);
3552 f.push(10, 11, 9, 19);
3553 c1s = 1; c1l = 6; c2s = 13; c2l = 6;
3554 break;
3555 case INTERSECT_QUAD_NO:
3556 c1s = 0; c1l = 6; c2s = 6; c2l = 6;
3557 break;
caryclark1049f122015-04-20 08:31:59 -07003558 case INTERSECT_CONIC_LINE:
3559 f.push(8, 9, 0, 10);
3560 c1s = 1; c1l = 7; c2s = 11; c2l = 4;
3561 break;
3562 case INTERSECT_CONIC_LINE_2:
3563 f.push(8, 9, 0, 12);
3564 f.push(11, 12, 10, 18);
3565 c1s = 1; c1l = 7; c2s = 14; c2l = 4;
3566 break;
3567 case INTERSECT_CONIC_LINE_NO:
3568 c1s = 0; c1l = 7; c2s = 7; c2l = 4;
3569 break;
3570 case INTERSECT_CONIC:
3571 f.push(8, 9, 0, 10);
3572 c1s = 1; c1l = 7; c2s = 11; c2l = 7;
3573 break;
3574 case INTERSECT_CONIC_2:
3575 f.push(8, 9, 0, 13);
3576 f.push(11, 12, 10, 21);
3577 c1s = 1; c1l = 7; c2s = 14; c2l = 7;
3578 break;
3579 case INTERSECT_CONIC_NO:
3580 c1s = 0; c1l = 7; c2s = 7; c2l = 7;
3581 break;
caryclarkdac1d172014-06-17 05:15:38 -07003582 case INTERSECT_SELF_CUBIC:
3583 f.push(9, 10, 0, 11);
3584 c1s = 1; c1l = 8; c2s = 0; c2l = 0;
3585 break;
3586 case INTERSECT_SELF_CUBIC_NO:
3587 c1s = 0; c1l = 8; c2s = 0; c2l = 0;
3588 break;
3589 case INTERSECT_CUBIC_LINE:
3590 f.push(9, 10, 0, 11);
3591 c1s = 1; c1l = 8; c2s = 12; c2l = 4;
3592 break;
3593 case INTERSECT_CUBIC_LINE_2:
3594 f.push(9, 10, 0, 14);
3595 f.push(12, 13, 11, 19);
3596 c1s = 1; c1l = 8; c2s = 15; c2l = 4;
3597 break;
3598 case INTERSECT_CUBIC_LINE_3:
3599 f.push(9, 10, 0, 17);
3600 f.push(12, 13, 11, 22);
3601 f.push(15, 16, 14, 23);
3602 c1s = 1; c1l = 8; c2s = 18; c2l = 4;
3603 break;
3604 case INTERSECT_CUBIC_QUAD_NO:
3605 c1s = 0; c1l = 8; c2s = 8; c2l = 6;
3606 break;
3607 case INTERSECT_CUBIC_QUAD:
3608 f.push(9, 10, 0, 11);
3609 c1s = 1; c1l = 8; c2s = 12; c2l = 6;
3610 break;
3611 case INTERSECT_CUBIC_QUAD_2:
3612 f.push(9, 10, 0, 14);
3613 f.push(12, 13, 11, 21);
3614 c1s = 1; c1l = 8; c2s = 15; c2l = 6;
3615 break;
3616 case INTERSECT_CUBIC_QUAD_3:
3617 f.push(9, 10, 0, 17);
3618 f.push(12, 13, 11, 24);
3619 f.push(15, 16, 14, 25);
3620 c1s = 1; c1l = 8; c2s = 18; c2l = 6;
3621 break;
3622 case INTERSECT_CUBIC_QUAD_4:
3623 f.push(9, 10, 0, 20);
3624 f.push(12, 13, 11, 27);
3625 f.push(15, 16, 14, 28);
3626 f.push(18, 19, 17, 29);
3627 c1s = 1; c1l = 8; c2s = 21; c2l = 6;
3628 break;
3629 case INTERSECT_CUBIC_LINE_NO:
3630 c1s = 0; c1l = 8; c2s = 8; c2l = 4;
3631 break;
3632 case INTERSECT_CUBIC:
3633 f.push(9, 10, 0, 11);
3634 c1s = 1; c1l = 8; c2s = 12; c2l = 8;
3635 break;
3636 case INTERSECT_CUBIC_2:
3637 f.push(9, 10, 0, 14);
3638 f.push(12, 13, 11, 23);
3639 c1s = 1; c1l = 8; c2s = 15; c2l = 8;
3640 break;
3641 case INTERSECT_CUBIC_3:
3642 f.push(9, 10, 0, 17);
3643 f.push(12, 13, 11, 26);
3644 f.push(15, 16, 14, 27);
3645 c1s = 1; c1l = 8; c2s = 18; c2l = 8;
3646 break;
3647 case INTERSECT_CUBIC_4:
3648 f.push(9, 10, 0, 20);
3649 f.push(12, 13, 11, 29);
3650 f.push(15, 16, 14, 30);
3651 f.push(18, 19, 17, 31);
3652 c1s = 1; c1l = 8; c2s = 21; c2l = 8;
3653 break;
3654 case INTERSECT_CUBIC_NO:
3655 c1s = 0; c1l = 8; c2s = 8; c2l = 8;
3656 break;
3657 default:
3658 console.log("unknown REC_TYPE_SECT frag type: " + fragType);
3659 throw "stop execution";
3660 }
3661 if (draw_intersection != 1) {
3662 var id = -1;
3663 var curve;
3664 switch (c1l) {
3665 case 4:
3666 drawLine(frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3]);
3667 if (draw_id) {
3668 curve = [frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3]];
3669 id = idByCurve(test, curve, PATH_LINE);
3670 }
3671 break;
3672 case 6:
3673 drawQuad(frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3],
3674 frags[c1s + 4], frags[c1s + 5]);
3675 if (draw_id) {
3676 curve = [frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3],
3677 frags[c1s + 4], frags[c1s + 5]];
3678 id = idByCurve(test, curve, PATH_QUAD);
3679 }
3680 break;
caryclark1049f122015-04-20 08:31:59 -07003681 case 7:
3682 drawConicWithQuads(frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3],
3683 frags[c1s + 4], frags[c1s + 5], frags[c1s + 6]);
3684 if (draw_id) {
3685 curve = [frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3],
3686 frags[c1s + 4], frags[c1s + 5], frags[c1s + 6]];
3687 id = idByCurve(test, curve, PATH_CONIC);
3688 }
3689 break;
caryclarkdac1d172014-06-17 05:15:38 -07003690 case 8:
3691 drawCubic(frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3],
3692 frags[c1s + 4], frags[c1s + 5], frags[c1s + 6], frags[c1s + 7]);
3693 if (draw_id) {
3694 curve = [frags[c1s], frags[c1s + 1], frags[c1s + 2], frags[c1s + 3],
3695 frags[c1s + 4], frags[c1s + 5], frags[c1s + 6], frags[c1s + 7]];
3696 id = idByCurve(test, curve, PATH_CUBIC);
3697 }
3698 break;
3699 }
3700 if (id >= 0) {
3701 drawID(curve, id);
3702 }
3703 id = -1;
3704 switch (c2l) {
3705 case 0:
3706 break;
3707 case 4:
3708 drawLine(frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3]);
3709 if (draw_id) {
3710 curve = [frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3]];
3711 id = idByCurve(test, curve, PATH_LINE);
3712 }
3713 break;
3714 case 6:
3715 drawQuad(frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3],
3716 frags[c2s + 4], frags[c2s + 5]);
3717 if (draw_id) {
3718 curve = [frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3],
3719 frags[c2s + 4], frags[c2s + 5]];
3720 id = idByCurve(test, curve, PATH_QUAD);
3721 }
3722 break;
caryclark1049f122015-04-20 08:31:59 -07003723 case 7:
3724 drawConicWithQuads(frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3],
3725 frags[c2s + 4], frags[c2s + 5], frags[c2s + 6]);
3726 if (draw_id) {
3727 curve = [frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3],
3728 frags[c2s + 4], frags[c2s + 5], frags[c2s + 6]];
3729 id = idByCurve(test, curve, PATH_CONIC);
3730 }
3731 break;
caryclarkdac1d172014-06-17 05:15:38 -07003732 case 8:
3733 drawCubic(frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3],
3734 frags[c2s + 4], frags[c2s + 5], frags[c2s + 6], frags[c2s + 7]);
3735 if (draw_id) {
3736 curve = [frags[c2s], frags[c2s + 1], frags[c2s + 2], frags[c2s + 3],
3737 frags[c2s + 4], frags[c2s + 5], frags[c2s + 6], frags[c2s + 7]];
3738 id = idByCurve(test, curve, PATH_CUBIC);
3739 }
3740 break;
3741 }
3742 if (id >= 0) {
3743 drawID(curve, id);
3744 }
3745 }
3746 if (collect_bounds) {
3747 break;
3748 }
caryclark54359292015-03-26 07:52:43 -07003749 if (draw_intersection != 3 || step_limit == 0 || tIndex >= lastSect) {
3750 for (var idx = 0; idx < f.length; idx += 4) {
caryclarkdac1d172014-06-17 05:15:38 -07003751 drawPoint(frags[f[idx]], frags[f[idx + 1]], true);
3752 }
3753 }
3754 if (!draw_intersectT) {
3755 break;
3756 }
3757 ctx.fillStyle = "red";
caryclark54359292015-03-26 07:52:43 -07003758 if (draw_intersection != 3 || step_limit == 0 || tIndex >= lastSect) {
3759 for (var idx = 0; idx < f.length; idx += 4) {
caryclarkdac1d172014-06-17 05:15:38 -07003760 drawTAtPointUp(frags[f[idx]], frags[f[idx + 1]], frags[f[idx + 2]]);
3761 drawTAtPointDown(frags[f[idx]], frags[f[idx + 1]], frags[f[idx + 3]]);
3762 }
3763 }
3764 break;
3765 case REC_TYPE_SORT:
3766 if (!draw_sort || (step_limit > 0 && tIndex < lastSort)) {
3767 continue;
3768 }
3769 ctx.lineWidth = 3;
3770 ctx.strokeStyle = "rgba(127,127,0, 0.5)";
3771 focus_enabled = true;
3772 switch (fragType) {
3773 case SORT_UNARY:
3774 case SORT_BINARY:
3775 var curve = curvePartialByID(test, frags[0], frags[6], frags[8]);
3776 drawCurve(curve);
3777 break;
3778 default:
3779 console.log("unknown REC_TYPE_SORT frag type: " + fragType);
3780 throw "stop execution";
3781 }
3782 break;
caryclark03b03ca2015-04-23 09:13:37 -07003783 case REC_TYPE_TOP:
3784 if (!draw_top || (step_limit > 0 && tIndex < lastTop)) {
3785 continue;
3786 }
3787 ctx.lineWidth = 3;
3788 ctx.strokeStyle = "rgba(127,127,0, 0.5)";
3789 focus_enabled = true;
3790 {
3791 var curve = curvePartialByID(test, frags[0], frags[1], frags[2]);
3792 drawCurve(curve);
3793 var type = PATH_LINE + (curve.length / 2 - 2);
3794 var mid = pointAtT(curve, type, 0.5);
3795 var d = dxy_at_t(curve, type, 0.5);
3796 drawArrow(mid.x, mid.y, d.x, d.y, 0.3);
3797 }
3798 break;
caryclarkdac1d172014-06-17 05:15:38 -07003799 case REC_TYPE_MARK:
3800 if (!draw_mark || (step_limit > 0 && tIndex < lastMark)) {
3801 continue;
3802 }
3803 ctx.lineWidth = 3;
3804 ctx.strokeStyle = fragType >= MARK_DONE_LINE ?
3805 "rgba(127,0,127, 0.5)" : "rgba(127,127,0, 0.5)";
3806 focus_enabled = true;
3807 switch (fragType) {
3808 case MARK_LINE:
3809 case MARK_DONE_LINE:
3810 case MARK_UNSORTABLE_LINE:
3811 case MARK_SIMPLE_LINE:
3812 case MARK_SIMPLE_DONE_LINE:
3813 case MARK_DONE_UNARY_LINE:
3814 drawLinePartial(frags[1], frags[2], frags[3], frags[4],
3815 frags[5], frags[9]);
3816 if (draw_id) {
3817 drawLinePartialID(frags[0], frags[1], frags[2], frags[3], frags[4],
3818 frags[5], frags[9]);
3819 }
3820 break;
3821 case MARK_QUAD:
3822 case MARK_DONE_QUAD:
3823 case MARK_UNSORTABLE_QUAD:
3824 case MARK_SIMPLE_QUAD:
3825 case MARK_SIMPLE_DONE_QUAD:
3826 case MARK_DONE_UNARY_QUAD:
3827 drawQuadPartial(frags[1], frags[2], frags[3], frags[4],
3828 frags[5], frags[6], frags[7], frags[11]);
3829 if (draw_id) {
3830 drawQuadPartialID(frags[0], frags[1], frags[2], frags[3], frags[4],
3831 frags[5], frags[6], frags[7], frags[11]);
3832 }
3833 break;
3834 case MARK_CUBIC:
3835 case MARK_DONE_CUBIC:
3836 case MARK_UNSORTABLE_CUBIC:
3837 case MARK_SIMPLE_CUBIC:
3838 case MARK_SIMPLE_DONE_CUBIC:
3839 case MARK_DONE_UNARY_CUBIC:
3840 drawCubicPartial(frags[1], frags[2], frags[3], frags[4],
3841 frags[5], frags[6], frags[7], frags[8], frags[9], frags[13]);
3842 if (draw_id) {
3843 drawCubicPartialID(frags[0], frags[1], frags[2], frags[3], frags[4],
3844 frags[5], frags[6], frags[7], frags[8], frags[9], frags[13]);
3845 }
3846 break;
3847 case MARK_ANGLE_LAST:
3848 // FIXME: ignored for now
3849 break;
3850 default:
3851 console.log("unknown REC_TYPE_MARK frag type: " + fragType);
3852 throw "stop execution";
3853 }
3854 break;
3855 default:
3856 continue;
3857 }
3858 }
3859 switch (recType) {
3860 case REC_TYPE_SORT:
3861 if (!draw_sort || (step_limit > 0 && tIndex < lastSort)) {
3862 break;
3863 }
3864 var angles = []; // use tangent lines to describe arcs
3865 var windFrom = [];
3866 var windTo = [];
3867 var opp = [];
3868 var minXY = Number.MAX_VALUE;
3869 var partial;
3870 focus_enabled = true;
3871 var someUnsortable = false;
3872 for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
3873 var fragType = records[recordIndex];
3874 var frags = records[recordIndex + 1];
3875 var unsortable = (fragType == SORT_UNARY && frags[14]) ||
3876 (fragType == SORT_BINARY && frags[16]);
3877 someUnsortable |= unsortable;
3878 switch (fragType) {
3879 case SORT_UNARY:
3880 case SORT_BINARY:
3881 partial = curvePartialByID(test, frags[0], frags[6], frags[8]);
3882 break;
3883 default:
3884 console.log("unknown REC_TYPE_SORT frag type: " + fragType);
3885 throw "stop execution";
3886 }
3887 var dx = boundsWidth(partial);
3888 var dy = boundsHeight(partial);
3889 minXY = Math.min(minXY, dx * dx + dy * dy);
3890 if (collect_bounds) {
3891 continue;
3892 }
3893 angles.push(tangent(partial));
3894 var from = frags[12];
3895 var to = frags[12];
3896 var sgn = frags[10];
3897 if (sgn < 0) {
3898 from -= frags[11];
3899 } else if (sgn > 0) {
3900 to -= frags[11];
3901 }
3902 windFrom.push(from + (unsortable ? "!" : ""));
3903 windTo.push(to + (unsortable ? "!" : ""));
3904 opp.push(fragType == SORT_BINARY);
3905 if (draw_sort == 1) {
3906 drawOrder(partial, frags[12]);
3907 } else {
3908 drawOrder(partial, (recordIndex / 2) + 1);
3909 }
3910 }
3911 var radius = Math.sqrt(minXY) / 2 * scale;
3912 radius = Math.min(50, radius);
3913 var scaledRadius = radius / scale;
3914 var centerX = partial[0];
3915 var centerY = partial[1];
3916 if (collect_bounds) {
3917 if (focus_enabled) {
3918 focusXmin = Math.min(focusXmin, centerX - scaledRadius);
3919 focusYmin = Math.min(focusYmin, centerY - scaledRadius);
3920 focusXmax = Math.max(focusXmax, centerX + scaledRadius);
3921 focusYmax = Math.max(focusYmax, centerY + scaledRadius);
3922 }
3923 break;
3924 }
3925 break;
3926 default:
3927 break;
3928 }
3929 }
3930 if (collect_bounds) {
3931 return;
3932 }
3933 if (draw_log && logStart >= 0) {
3934 ctx.font = "normal 10px Arial";
3935 ctx.textAlign = "left";
3936 ctx.beginPath();
3937 var top = screenHeight - 20 - (logRange + 2) * 10;
3938 ctx.rect(50, top, screenWidth - 100, (logRange + 2) * 10);
3939 ctx.fillStyle = "white";
3940 ctx.fill();
3941 ctx.fillStyle = "rgba(0,0,0, 0.5)";
3942 if (logStart > 0) {
3943 ctx.fillText(lines[logStart - 1], 50, top + 8);
3944 }
3945 ctx.fillStyle = "black";
3946 for (var idx = 0; idx < logRange; ++idx) {
3947 ctx.fillText(lines[logStart + idx], 50, top + 18 + 10 * idx);
3948 }
3949 ctx.fillStyle = "rgba(0,0,0, 0.5)";
3950 if (logStart + logRange < lines.length) {
3951 ctx.fillText(lines[logStart + logRange], 50, top + 18 + 10 * logRange);
3952 }
3953 }
3954 if (draw_legend) {
3955 var pos = 0;
caryclark624637c2015-05-11 07:21:27 -07003956 var drawSomething = draw_add | draw_active | draw_angle | draw_coincidence | draw_sort | draw_mark;
caryclarkdac1d172014-06-17 05:15:38 -07003957 // drawBox(pos++, "yellow", "black", opLetter, true, '');
3958 drawBox(pos++, "rgba(0,0,255, 0.3)", "black", draw_intersection > 1 ? sectCount : sectMax2, draw_intersection, intersectionKey);
3959 drawBox(pos++, "rgba(0,0,255, 0.3)", "black", draw_add ? addCount : addMax, draw_add, addKey);
3960 drawBox(pos++, "rgba(0,0,255, 0.3)", "black", draw_active ? activeCount : activeMax, draw_active, activeKey);
3961 drawBox(pos++, "rgba(127,127,0, 0.3)", "black", draw_angle ? angleCount : angleMax, draw_angle, angleKey);
caryclark624637c2015-05-11 07:21:27 -07003962 drawBox(pos++, "rgba(127,127,0, 0.3)", "black", draw_coincidence ? coinCount : coinMax, draw_coincidence, coincidenceKey);
caryclarkdac1d172014-06-17 05:15:38 -07003963 drawBox(pos++, "rgba(127,127,0, 0.3)", "black", draw_op ? opCount : opMax, draw_op, opKey);
3964 drawBox(pos++, "rgba(127,127,0, 0.3)", "black", draw_sort ? sortCount : sortMax, draw_sort, sortKey);
caryclark03b03ca2015-04-23 09:13:37 -07003965 drawBox(pos++, "rgba(127,127,0, 0.3)", "black", draw_top ? topCount : topMax, draw_top, topKey);
caryclarkdac1d172014-06-17 05:15:38 -07003966 drawBox(pos++, "rgba(127,0,127, 0.3)", "black", draw_mark ? markCount : markMax, draw_mark, markKey);
3967 drawBox(pos++, "black", "white",
3968 (new Array('P', 'P1', 'P2', 'P'))[draw_path], draw_path != 0, pathKey);
3969 drawBox(pos++, "rgba(0,63,0, 0.7)", "white",
3970 (new Array('Q', 'Q', 'C', 'QC', 'Qc', 'Cq'))[draw_computed],
3971 draw_computed != 0, computedKey);
3972 drawBox(pos++, "green", "black", step_limit, drawSomething, '');
3973 drawBox(pos++, "green", "black", stepMax, drawSomething, '');
3974 drawBox(pos++, "rgba(255,0,0, 0.6)", "black", lastIndex, drawSomething & draw_log, '');
3975 drawBox(pos++, "rgba(255,0,0, 0.6)", "black", test.length - 1, drawSomething & draw_log, '');
3976 if (curve_t) {
3977 drawCurveTControl();
3978 }
3979 ctx.font = "normal 20px Arial";
3980 ctx.fillStyle = "rgba(0,0,0, 0.3)";
3981 ctx.textAlign = "right";
3982 ctx.fillText(scale.toFixed(decimal_places) + 'x' , screenWidth - 10, screenHeight - 5);
3983 }
3984 if (draw_hints) {
3985 ctx.font = "normal 10px Arial";
3986 ctx.fillStyle = "rgba(0,0,0, 0.5)";
3987 ctx.textAlign = "right";
3988 var y = 4;
3989 ctx.fillText("control lines : " + controlLinesKey, ctx.screenWidthwidth - 10, pos * 50 + y++ * 10);
3990 ctx.fillText("curve t : " + curveTKey, screenWidth - 10, pos * 50 + y++ * 10);
3991 ctx.fillText("deriviatives : " + deriviativesKey, screenWidth - 10, pos * 50 + y++ * 10);
3992 ctx.fillText("intersect t : " + intersectTKey, screenWidth - 10, pos * 50 + y++ * 10);
caryclarkdac1d172014-06-17 05:15:38 -07003993 ctx.fillText("log : " + logKey, screenWidth - 10, pos * 50 + y++ * 10);
3994 ctx.fillText("log curve : " + logCurvesKey, screenWidth - 10, pos * 50 + y++ * 10);
3995 ctx.fillText("mid point : " + midpointKey, screenWidth - 10, pos * 50 + y++ * 10);
3996 ctx.fillText("points : " + ptsKey, screenWidth - 10, pos * 50 + y++ * 10);
3997 ctx.fillText("sequence : " + sequenceKey, screenWidth - 10, pos * 50 + y++ * 10);
3998 ctx.fillText("xy : " + xyKey, screenWidth - 10, pos * 50 + y++ * 10);
3999 }
4000}
4001
4002function drawBox(y, backC, foreC, str, enable, label) {
4003 ctx.beginPath();
4004 ctx.fillStyle = backC;
4005 ctx.rect(screenWidth - 40, y * 50 + 10, 40, 30);
4006 ctx.fill();
4007 ctx.font = "normal 16px Arial";
4008 ctx.fillStyle = foreC;
4009 ctx.textAlign = "center";
4010 ctx.fillText(str, screenWidth - 20, y * 50 + 32);
4011 if (!enable) {
4012 ctx.fillStyle = "rgba(255,255,255, 0.5)";
4013 ctx.fill();
4014 }
4015 if (label != '') {
4016 ctx.font = "normal 9px Arial";
4017 ctx.fillStyle = "black";
4018 ctx.fillText(label, screenWidth - 47, y * 50 + 40);
4019 }
4020}
4021
4022function drawCurveTControl() {
4023 ctx.lineWidth = 2;
4024 ctx.strokeStyle = "rgba(0,0,0, 0.3)";
4025 ctx.beginPath();
4026 ctx.rect(screenWidth - 80, 40, 28, screenHeight - 80);
4027 ctx.stroke();
4028 var ty = 40 + curveT * (screenHeight - 80);
4029 ctx.beginPath();
4030 ctx.moveTo(screenWidth - 80, ty);
4031 ctx.lineTo(screenWidth - 85, ty - 5);
4032 ctx.lineTo(screenWidth - 85, ty + 5);
4033 ctx.lineTo(screenWidth - 80, ty);
4034 ctx.fillStyle = "rgba(0,0,0, 0.6)";
4035 ctx.fill();
4036 var num = curveT.toFixed(decimal_places);
4037 ctx.font = "normal 10px Arial";
4038 ctx.textAlign = "left";
4039 ctx.fillText(num, screenWidth - 78, ty);
4040}
4041
4042function ptInTControl() {
4043 var e = window.event;
4044 var tgt = e.target || e.srcElement;
4045 var left = tgt.offsetLeft;
4046 var top = tgt.offsetTop;
4047 var x = (e.clientX - left);
4048 var y = (e.clientY - top);
4049 if (x < screenWidth - 80 || x > screenWidth - 50) {
4050 return false;
4051 }
4052 if (y < 40 || y > screenHeight - 80) {
4053 return false;
4054 }
4055 curveT = (y - 40) / (screenHeight - 120);
4056 if (curveT < 0 || curveT > 1) {
4057 throw "stop execution";
4058 }
4059 return true;
4060}
4061
4062function drawTop() {
4063 if (tests[testIndex] == null) {
4064 var str = testDivs[testIndex].textContent;
4065 parse_all(str);
4066 var title = testDivs[testIndex].id.toString();
4067 testTitles[testIndex] = title;
4068 }
4069 init(tests[testIndex]);
4070 redraw();
4071}
4072
4073function redraw() {
4074 if (focus_on_selection) {
4075 collect_bounds = true;
4076 draw(tests[testIndex], testLines[testIndex], testTitles[testIndex]);
4077 collect_bounds = false;
4078 if (focusXmin < focusXmax && focusYmin < focusYmax) {
4079 setScale(focusXmin, focusXmax, focusYmin, focusYmax);
4080 }
4081 }
4082 ctx.beginPath();
4083 ctx.fillStyle = "white";
4084 ctx.rect(0, 0, screenWidth, screenHeight);
4085 ctx.fill();
4086 draw(tests[testIndex], testLines[testIndex], testTitles[testIndex]);
4087}
4088
4089function dumpCurvePartial(test, id, t0, t1) {
4090 var curve = curveByID(test, id);
4091 var name = ["line", "quad", "cubic"][curve.length / 2 - 2];
4092 console.log("id=" + id + " " + name + "=" + curveToString(curve)
4093 + " t0=" + t0 + " t1=" + t1
4094 + " partial=" + curveToString(curvePartialByID(test, id, t0, t1)));
4095}
4096
4097function dumpAngleTest(test, id, t0, t1) {
4098 var curve = curveByID(test, id);
4099 console.log(" { {" + curveToString(curve) + "}, "
4100 + curve.length / 2 + ", " + t0 + ", " + t1 + ", {} }, //");
4101}
4102
4103function dumpLogToConsole() {
4104 if (logStart < 0) {
4105 return;
4106 }
4107 var test = tests[testIndex];
4108 var recType = REC_TYPE_UNKNOWN;
4109 var records;
4110 for (var index = 0; index < test.length; index += 3) {
4111 var lastLineNo = test[index + 1];
4112 if (lastLineNo >= logStart && lastLineNo < logStart + logRange) {
4113 recType = test[index];
4114 records = test[index + 2];
4115 break;
4116 }
4117 }
4118 if (recType == REC_TYPE_UNKNOWN) {
4119 return;
4120 }
4121 var lines = testLines[testIndex];
4122 for (var idx = 0; idx < logRange; ++idx) {
4123 var line = lines[logStart + idx];
4124 console.log(line);
4125 for (var recordIndex = 0; recordIndex < records.length; recordIndex += 2) {
4126 var fragType = records[recordIndex];
4127 var frags = records[recordIndex + 1];
4128 if (recType == REC_TYPE_ANGLE && fragType == ANGLE_AFTER) {
caryclarkdac1d172014-06-17 05:15:38 -07004129 dumpCurvePartial(test, frags[0], frags[4], frags[5]);
4130 dumpCurvePartial(test, frags[6], frags[10], frags[11]);
4131 dumpCurvePartial(test, frags[12], frags[16], frags[17]);
4132 console.log("\nstatic IntersectData intersectDataSet[] = { //");
4133 dumpAngleTest(test, frags[0], frags[4], frags[5]);
4134 dumpAngleTest(test, frags[6], frags[10], frags[11]);
4135 dumpAngleTest(test, frags[12], frags[16], frags[17]);
4136 console.log("}; //");
4137 }
4138 }
4139 }
4140}
4141
4142var activeKey = 'a';
4143var pathKey = 'b';
4144var pathBackKey = 'B';
4145var centerKey = 'c';
caryclark624637c2015-05-11 07:21:27 -07004146var coincidenceKey = 'C';
caryclarkdac1d172014-06-17 05:15:38 -07004147var addKey = 'd';
4148var deriviativesKey = 'f';
4149var angleKey = 'g';
4150var angleBackKey = 'G';
caryclarkdac1d172014-06-17 05:15:38 -07004151var intersectionKey = 'i';
4152var intersectionBackKey = 'I';
4153var sequenceKey = 'j';
4154var midpointKey = 'k';
4155var logKey = 'l';
4156var logToConsoleKey = 'L';
4157var markKey = 'm';
4158var sortKey = 'o';
4159var opKey = 'p';
4160var opBackKey = 'P';
4161var computedKey = 'q';
4162var computedBackKey = 'Q';
4163var stepKey = 's';
4164var stepBackKey = 'S';
4165var intersectTKey = 't';
caryclark03b03ca2015-04-23 09:13:37 -07004166var topKey = 'T';
caryclarkdac1d172014-06-17 05:15:38 -07004167var curveTKey = 'u';
4168var controlLinesBackKey = 'V';
4169var controlLinesKey = 'v';
4170var ptsKey = 'x';
4171var xyKey = 'y';
4172var logCurvesKey = 'z';
4173var focusKey = '`';
4174var idKey = '.';
4175var retinaKey = '\\';
4176
4177function doKeyPress(evt) {
4178 var char = String.fromCharCode(evt.charCode);
4179 var focusWasOn = false;
4180 switch (char) {
4181 case '0':
4182 case '1':
4183 case '2':
4184 case '3':
4185 case '4':
4186 case '5':
4187 case '6':
4188 case '7':
4189 case '8':
4190 case '9':
4191 decimal_places = char - '0';
4192 redraw();
4193 break;
4194 case activeKey:
4195 draw_active ^= true;
4196 redraw();
4197 break;
4198 case addKey:
4199 draw_add ^= true;
4200 redraw();
4201 break;
4202 case angleKey:
caryclark54359292015-03-26 07:52:43 -07004203 draw_angle = (draw_angle + 1) % 4;
caryclarkdac1d172014-06-17 05:15:38 -07004204 redraw();
4205 break;
4206 case angleBackKey:
4207 draw_angle = (draw_angle + 2) % 3;
4208 redraw();
4209 break;
4210 case centerKey:
4211 setScale(xmin, xmax, ymin, ymax);
4212 redraw();
4213 break;
caryclark624637c2015-05-11 07:21:27 -07004214 case coincidenceKey:
4215 draw_coincidence ^= true;
4216 redraw();
4217 break;
caryclarkdac1d172014-06-17 05:15:38 -07004218 case controlLinesBackKey:
4219 control_lines = (control_lines + 3) % 4;
4220 redraw();
4221 break;
4222 case controlLinesKey:
4223 control_lines = (control_lines + 1) % 4;
4224 redraw();
4225 break;
4226 case computedBackKey:
4227 draw_computed = (draw_computed + 5) % 6;
4228 redraw();
4229 break;
4230 case computedKey:
4231 draw_computed = (draw_computed + 1) % 6;
4232 redraw();
4233 break;
4234 case curveTKey:
4235 curve_t ^= true;
4236 if (curve_t) {
4237 draw_legend = true;
4238 }
4239 redraw();
4240 break;
4241 case deriviativesKey:
4242 draw_deriviatives = (draw_deriviatives + 1) % 3;
4243 redraw();
4244 break;
4245 case focusKey:
4246 focus_on_selection ^= true;
4247 setScale(xmin, xmax, ymin, ymax);
4248 redraw();
4249 break;
caryclarkdac1d172014-06-17 05:15:38 -07004250 case idKey:
4251 draw_id ^= true;
4252 redraw();
4253 break;
4254 case intersectionBackKey:
4255 draw_intersection = (draw_intersection + 3) % 4;
4256 redraw();
4257 break;
4258 case intersectionKey:
4259 draw_intersection = (draw_intersection + 1) % 4;
4260 redraw();
4261 break;
4262 case intersectTKey:
4263 draw_intersectT ^= true;
4264 redraw();
4265 break;
4266 case logCurvesKey:
4267 logCurves(tests[testIndex]);
4268 break;
4269 case logKey:
4270 draw_log ^= true;
4271 redraw();
4272 break;
4273 case logToConsoleKey:
4274 if (draw_log) {
4275 dumpLogToConsole();
4276 }
4277 break;
4278 case markKey:
4279 draw_mark ^= true;
4280 redraw();
4281 break;
4282 case midpointKey:
4283 draw_midpoint ^= true;
4284 redraw();
4285 break;
4286 case opKey:
4287 draw_op = (draw_op + 1) % 3;
4288 redraw();
4289 break;
4290 case opBackKey:
4291 draw_op = (draw_op + 2) % 3;
4292 redraw();
4293 break;
4294 case pathKey:
4295 draw_path = (draw_path + 1) % 4;
4296 redraw();
4297 break;
4298 case pathBackKey:
4299 draw_path = (draw_path + 3) % 4;
4300 redraw();
4301 break;
4302 case ptsKey:
4303 pt_labels = (pt_labels + 1) % 3;
4304 redraw();
4305 break;
4306 case retinaKey:
4307 retina_scale ^= true;
4308 drawTop();
4309 break;
4310 case sequenceKey:
4311 draw_sequence ^= true;
4312 redraw();
4313 break;
4314 case sortKey:
4315 draw_sort = (draw_sort + 1) % 3;
4316 drawTop();
4317 break;
4318 case stepKey:
4319 step_limit++;
4320 if (step_limit > stepMax) {
4321 step_limit = stepMax;
4322 }
4323 redraw();
4324 break;
4325 case stepBackKey:
4326 step_limit--;
4327 if (step_limit < 0) {
4328 step_limit = 0;
4329 }
4330 redraw();
4331 break;
caryclark03b03ca2015-04-23 09:13:37 -07004332 case topKey:
4333 draw_top ^= true;
4334 redraw();
4335 break;
caryclarkdac1d172014-06-17 05:15:38 -07004336 case xyKey:
4337 debug_xy = (debug_xy + 1) % 3;
4338 redraw();
4339 break;
4340 case '-':
4341 focusWasOn = focus_on_selection;
4342 if (focusWasOn) {
4343 focus_on_selection = false;
4344 scale /= 1.2;
4345 } else {
4346 scale /= 2;
4347 calcLeftTop();
4348 }
4349 redraw();
4350 focus_on_selection = focusWasOn;
4351 break;
4352 case '=':
4353 case '+':
4354 focusWasOn = focus_on_selection;
4355 if (focusWasOn) {
4356 focus_on_selection = false;
4357 scale *= 1.2;
4358 } else {
4359 scale *= 2;
4360 calcLeftTop();
4361 }
4362 redraw();
4363 focus_on_selection = focusWasOn;
4364 break;
4365 case '?':
4366 draw_hints ^= true;
4367 if (draw_hints && !draw_legend) {
4368 draw_legend = true;
4369 }
4370 redraw();
4371 break;
4372 case '/':
4373 draw_legend ^= true;
4374 redraw();
4375 break;
4376 }
4377}
4378
4379function doKeyDown(evt) {
4380 var char = evt.keyCode;
4381 var preventDefault = false;
4382 switch (char) {
4383 case 37: // left arrow
4384 if (evt.shiftKey) {
4385 testIndex -= 9;
4386 }
4387 if (--testIndex < 0)
4388 testIndex = tests.length - 1;
4389 drawTop();
4390 preventDefault = true;
4391 break;
4392 case 39: // right arrow
4393 if (evt.shiftKey) {
4394 testIndex += 9;
4395 }
4396 if (++testIndex >= tests.length)
4397 testIndex = 0;
4398 drawTop();
4399 preventDefault = true;
4400 break;
4401 }
4402 if (preventDefault) {
4403 evt.preventDefault();
4404 return false;
4405 }
4406 return true;
4407}
4408
4409(function() {
4410 var hidden = "hidden";
4411
4412 // Standards:
4413 if (hidden in document)
4414 document.addEventListener("visibilitychange", onchange);
4415 else if ((hidden = "mozHidden") in document)
4416 document.addEventListener("mozvisibilitychange", onchange);
4417 else if ((hidden = "webkitHidden") in document)
4418 document.addEventListener("webkitvisibilitychange", onchange);
4419 else if ((hidden = "msHidden") in document)
4420 document.addEventListener("msvisibilitychange", onchange);
4421 // IE 9 and lower:
4422 else if ('onfocusin' in document)
4423 document.onfocusin = document.onfocusout = onchange;
4424 // All others:
4425 else
4426 window.onpageshow = window.onpagehide
4427 = window.onfocus = window.onblur = onchange;
4428
4429 function onchange (evt) {
4430 var v = 'visible', h = 'hidden',
4431 evtMap = {
4432 focus:v, focusin:v, pageshow:v, blur:h, focusout:h, pagehide:h
4433 };
4434
4435 evt = evt || window.event;
4436 if (evt.type in evtMap)
4437 document.body.className = evtMap[evt.type];
4438 else
4439 document.body.className = this[hidden] ? "hidden" : "visible";
4440 }
4441})();
4442
4443function calcXY() {
4444 var e = window.event;
4445 var tgt = e.target || e.srcElement;
4446 var left = tgt.offsetLeft;
4447 var top = tgt.offsetTop;
4448 mouseX = (e.clientX - left) / scale + srcLeft;
4449 mouseY = (e.clientY - top) / scale + srcTop;
4450}
4451
4452function calcLeftTop() {
4453 srcLeft = mouseX - screenWidth / 2 / scale;
4454 srcTop = mouseY - screenHeight / 2 / scale;
4455}
4456
4457var disableClick = false;
4458
4459function handleMouseClick() {
4460 if (disableClick) {
4461 return;
4462 }
4463 if (!curve_t || !ptInTControl()) {
4464 calcXY();
4465 calcLeftTop();
4466 }
4467 redraw();
4468// if (!curve_t || !ptInTControl()) {
4469// mouseX = screenWidth / 2 / scale + srcLeft;
4470// mouseY = screenHeight / 2 / scale + srcTop;
4471// }
4472}
4473
4474function handleMouseOver() {
4475 calcXY();
4476 if (debug_xy != 2) {
4477 return;
4478 }
4479 var num = mouseX.toFixed(decimal_places) + ", " + mouseY.toFixed(decimal_places);
4480 ctx.beginPath();
4481 ctx.rect(300,100,num.length * 6,10);
4482 ctx.fillStyle="white";
4483 ctx.fill();
4484 ctx.font = "normal 10px Arial";
4485 ctx.fillStyle="black";
4486 ctx.textAlign = "left";
4487 ctx.fillText(num, 300, 108);
4488}
4489
4490function start() {
4491 for (var i = 0; i < testDivs.length; ++i) {
4492 tests[i] = null;
4493 }
4494 testIndex = 0;
4495 drawTop();
4496 window.addEventListener('keypress', doKeyPress, true);
4497 window.addEventListener('keydown', doKeyDown, true);
4498 window.onresize = function() {
4499 drawTop();
4500 }
4501 /*
4502 window.onpagehide = function() {
4503 disableClick = true;
4504 }
4505 */
4506 window.onpageshow = function () {
4507 disableClick = false;
4508 }
4509}
4510
4511</script>
4512</head>
4513
4514<body onLoad="start();">
4515<canvas id="canvas" width="750" height="500"
4516 onmousemove="handleMouseOver()"
4517 onclick="handleMouseClick()"
4518 ></canvas >
4519</body>
4520</html>