1 <html> 2 <head> 3 <div height="0" hidden="true"> 4 5 <div id="issue3651_7"> 6 seg=1 {{{68.1999969f, 74.8000031f}, {68.4444427f, 74.8000031f}, {68.6888885f, 74.8039017f}, {68.9333344f, 74.8078003f}}} 7 seg=2 {{{68.9333344f, 74.8078003f}, {69.422226f, 74.8155975f}, {69.9111099f, 74.8233948f}, {70.4000015f, 74.8000031f}}} 8 seg=3 {{{70.4000015f, 74.8000031f}, {70.7796326f, 74.7818375f}, {71.1592636f, 74.7372665f}, {71.5388947f, 74.6926956f}}} 9 seg=4 {{{71.5388947f, 74.6926956f}, {71.8925934f, 74.6511688f}, {72.2462997f, 74.609642f}, {72.5999985f, 74.5894699f}}} 10 seg=5 {{{72.5999985f, 74.5894699f}, {73.1301117f, 74.5592346f}, {73.6602249f, 74.5564957f}, {74.1903381f, 74.5537567f}}} 11 seg=6 {{{74.1903381f, 74.5537567f}, {74.3935623f, 74.5527115f}, {74.5967789f, 74.5516663f}, {74.8000031f, 74.5490646f}}} 12 seg=7 {{{74.8000031f, 74.5490646f}, {75.0211792f, 74.5462341f}, {75.242363f, 74.5398636f}, {75.4635391f, 74.5335007f}}} 13 seg=8 {{{75.4635391f, 74.5335007f}, {75.9756927f, 74.5187607f}, {76.4878464f, 74.5040207f}, {77, 74.5332108f}}} 14 seg=9 {{{77, 74.5332108f}, {77.3702316f, 74.5543137f}, {77.7404709f, 74.610733f}, {78.1107025f, 74.66716f}}} 15 seg=10 {{{78.1107025f, 74.66716f}, {78.4738007f, 74.722496f}, {78.8368988f, 74.777832f}, {79.1999969f, 74.7998505f}}} 16 seg=11 {{{79.1999969f, 74.7998505f}, {79.689003f, 74.8295059f}, {80.1780014f, 74.819664f}, {80.6670074f, 74.8098221f}}} 17 seg=12 {{{80.6670074f, 74.8098221f}, {80.9113388f, 74.8049088f}, {81.1556702f, 74.7999954f}, {81.4000015f, 74.8000031f}}} 18 seg=13 {{{81.4000015f, 74.8000031f}, {81.6438522f, 74.8000107f}, {81.8877106f, 74.8010635f}, {82.1315613f, 74.8021164f}}} 19 seg=14 {{{82.1315613f, 74.8021164f}, {82.6210403f, 74.8042297f}, {83.1105194f, 74.8063507f}, {83.5999985f, 74.8000031f}}} 20 seg=15 {{{83.5999985f, 74.8000031f}, {83.9259109f, 74.7957764f}, {84.2518234f, 74.7840347f}, {84.5777359f, 74.7722931f}}} 21 seg=16 {{{84.5777359f, 74.7722931f}, {84.9851608f, 74.7576141f}, {85.3925781f, 74.7429352f}, {85.8000031f, 74.7429352f}}} 22 seg=17 {{{85.8000031f, 74.7429352f}, {86.2074203f, 74.7429352f}, {86.6148453f, 74.7576141f}, {87.0222626f, 74.7722931f}}} 23 seg=18 {{{87.0222626f, 74.7722931f}, {87.348175f, 74.7840347f}, {87.6740875f, 74.7957764f}, {88, 74.8000031f}}} 24 seg=19 {{{88, 74.8000031f}, {88.1576462f, 74.8020477f}, {88.3152924f, 74.8048859f}, {88.4729385f, 74.8077316f}}} 25 seg=20 {{{88.4729385f, 74.8077316f}, {89.0486221f, 74.8181076f}, {89.6243134f, 74.8284836f}, {90.1999969f, 74.8000031f}}} 26 seg=21 {{{90.1999969f, 74.8000031f}, {90.5620499f, 74.7820892f}, {90.9241028f, 74.7369537f}, {91.2861557f, 74.6918182f}}} 27 seg=22 {{{91.2861557f, 74.6918182f}, {91.6574402f, 74.6455307f}, {92.028717f, 74.5992432f}, {92.4000015f, 74.5823135f}}} 28 seg=23 {{{92.4000015f, 74.5823135f}, {92.9111481f, 74.5590057f}, {93.4223022f, 74.5721283f}, {93.9334488f, 74.5852509f}}} 29 seg=24 {{{93.9334488f, 74.5852509f}, {94.155632f, 74.59095f}, {94.3778152f, 74.5966568f}, {94.5999985f, 74.5993652f}}} 30 seg=25 {{{94.5999985f, 74.5993652f}, {94.8669891f, 74.602623f}, {95.1339798f, 74.6110153f}, {95.4009705f, 74.6194f}}} 31 seg=26 {{{95.4009705f, 74.6194f}, {95.8673172f, 74.6340485f}, {96.3336563f, 74.6486969f}, {96.8000031f, 74.6360168f}}} 32 seg=27 {{{96.8000031f, 74.6360168f}, {97.2396164f, 74.624054f}, {97.6792297f, 74.5860596f}, {98.1188431f, 74.5480652f}}} 33 seg=28 {{{98.1188431f, 74.5480652f}, {98.4125595f, 74.5226822f}, {98.7062836f, 74.4972992f}, {99, 74.4796829f}}} 34 seg=29 {{{99, 74.4796829f}, {99.7333298f, 74.4356995f}, {100.466667f, 74.3924866f}, {101.199997f, 74.3721085f}}} 35 seg=30 {{{101.199997f, 74.3721085f}, {101.6632f, 74.3592453f}, {102.126396f, 74.3594589f}, {102.5896f, 74.3596725f}}} 36 seg=31 {{{102.5896f, 74.3596725f}, {102.859734f, 74.3597946f}, {103.129868f, 74.3599167f}, {103.400002f, 74.3574448f}}} 37 seg=32 {{{103.400002f, 74.3574448f}, {103.499123f, 74.3565369f}, {103.598244f, 74.3556519f}, {103.697365f, 74.3547668f}}} 38 seg=33 {{{103.697365f, 74.3547668f}, {104.331573f, 74.3491211f}, {104.96579f, 74.3434753f}, {105.599998f, 74.3318787f}}} 39 seg=34 {{{105.599998f, 74.3318787f}, {105.951164f, 74.3254547f}, {106.30233f, 74.3153458f}, {106.653496f, 74.3052368f}}} 40 seg=35 {{{106.653496f, 74.3052368f}, {107.035667f, 74.2942352f}, {107.417831f, 74.2832336f}, {107.800003f, 74.2769852f}}} 41 seg=36 {{{107.800003f, 74.2769852f}, {107.904305f, 74.2752838f}, {108.008606f, 74.2734833f}, {108.112907f, 74.2716827f}}} 42 seg=37 {{{108.112907f, 74.2716827f}, {108.741936f, 74.2608261f}, {109.370972f, 74.2499771f}, {110, 74.2599411f}}} 43 seg=38 {{{110, 74.2599411f}, {110.73333f, 74.2715607f}, {111.466667f, 74.3080215f}, {112.199997f, 74.3467178f}}} 44 seg=39 {{{112.199997f, 74.3467178f}, {112.524193f, 74.3638306f}, {112.848389f, 74.3887024f}, {113.172585f, 74.4135742f}}} 45 seg=40 {{{113.172585f, 74.4135742f}, {113.581726f, 74.4449615f}, {113.99086f, 74.4763565f}, {114.400002f, 74.4921417f}}} 46 seg=41 {{{114.400002f, 74.4921417f}, {115.133331f, 74.5204391f}, {115.866669f, 74.5265198f}, {116.599998f, 74.5165176f}}} 47 seg=42 {{{116.599998f, 74.5165176f}, {117.013039f, 74.5108871f}, {117.426071f, 74.4911652f}, {117.839111f, 74.4714432f}}} 48 seg=43 {{{117.839111f, 74.4714432f}, {118.159409f, 74.4561462f}, {118.479706f, 74.4408493f}, {118.800003f, 74.4321289f}}} 49 seg=44 {{{118.800003f, 74.4321289f}, {118.915619f, 74.428978f}, {119.031235f, 74.4256439f}, {119.146851f, 74.4223099f}}} 50 seg=45 {{{119.146851f, 74.4223099f}, {119.764565f, 74.4045105f}, {120.382286f, 74.3867035f}, {121, 74.3966675f}}} 51 seg=46 {{{121, 74.3966675f}, {121.552635f, 74.405571f}, {122.105278f, 74.4385529f}, {122.657913f, 74.4715347f}}} 52 seg=47 {{{122.657913f, 74.4715347f}, {122.838608f, 74.4823227f}, {123.019302f, 74.4931107f}, {123.199997f, 74.5030518f}}} 53 seg=48 {{{123.199997f, 74.5030518f}, {123.480431f, 74.5184784f}, {123.760864f, 74.5394821f}, {124.041298f, 74.5604858f}}} 54 seg=49 {{{124.041298f, 74.5604858f}, {124.494202f, 74.5943985f}, {124.947098f, 74.6283112f}, {125.400002f, 74.6387558f}}} 55 seg=50 {{{125.400002f, 74.6387558f}, {126.133331f, 74.6556625f}, {126.866669f, 74.6397476f}, {127.599998f, 74.6044846f}}} 56 seg=51 {{{127.599998f, 74.6044846f}, {128.17691f, 74.5767441f}, {128.75383f, 74.5233994f}, {129.33075f, 74.4700623f}}} 57 seg=52 {{{129.33075f, 74.4700623f}, {129.487167f, 74.4555969f}, {129.643585f, 74.4411316f}, {129.800003f, 74.4271774f}}} 58 seg=53 {{{129.800003f, 74.4271774f}, {130.08493f, 74.4017639f}, {130.369843f, 74.3696442f}, {130.65477f, 74.3375244f}}} 59 seg=54 {{{130.65477f, 74.3375244f}, {131.10318f, 74.2869797f}, {131.55159f, 74.2364349f}, {132, 74.2120285f}}} 60 seg=55 {{{132, 74.2120285f}, {132.682098f, 74.1748962f}, {133.364182f, 74.1806335f}, {134.04628f, 74.1863708f}}} 61 seg=56 {{{134.04628f, 74.1863708f}, {134.199997f, 74.1876526f}}} 62 seg=57 {{{134.199997f, 74.1876526f}, {134.740479f, 74.1920013f}, {135.28096f, 74.2102814f}, {135.821426f, 74.2285538f}}} 63 seg=58 {{{135.821426f, 74.2285538f}, {136.014282f, 74.2350769f}, {136.207138f, 74.2416f}, {136.399994f, 74.2474899f}}} 64 seg=59 {{{136.399994f, 74.2474899f}, {136.723831f, 74.2573776f}, {137.047668f, 74.2692032f}, {137.371506f, 74.2810364f}}} 65 seg=60 {{{137.371506f, 74.2810364f}, {137.781006f, 74.2959976f}, {138.190506f, 74.3109589f}, {138.600006f, 74.3219833f}}} 66 seg=61 {{{138.600006f, 74.3219833f}, {138.775055f, 74.3266983f}, {138.950119f, 74.3321457f}, {139.125183f, 74.3375931f}}} 67 seg=62 {{{139.125183f, 74.3375931f}, {139.683456f, 74.3549652f}, {140.24173f, 74.3723373f}, {140.800003f, 74.3659744f}}} 68 seg=63 {{{140.800003f, 74.3659744f}, {141.173523f, 74.3617172f}, {141.547028f, 74.3401871f}, {141.920547f, 74.3186493f}}} 69 seg=64 {{{141.920547f, 74.3186493f}, {142.280365f, 74.297905f}, {142.640182f, 74.2771606f}, {143, 74.2718658f}}} 70 seg=65 {{{143, 74.2718658f}, {143.733337f, 74.2610703f}, {144.46666f, 74.2575989f}, {145.199997f, 74.3011856f}}} 71 seg=66 {{{145.199997f, 74.3011856f}, {145.574966f, 74.3234711f}, {145.949936f, 74.3711548f}, {146.32489f, 74.4188385f}}} 72 seg=67 {{{146.32489f, 74.4188385f}, {146.683258f, 74.4644165f}, {147.041626f, 74.5099869f}, {147.399994f, 74.5333862f}}} 73 seg=68 {{{147.399994f, 74.5333862f}, {148.133331f, 74.5812607f}, {148.866669f, 74.6018982f}, {149.600006f, 74.5884552f}}} 74 seg=69 {{{149.600006f, 74.5884552f}, {149.982086f, 74.5814514f}, {150.364182f, 74.5504913f}, {150.746277f, 74.5195313f}}} 75 seg=70 {{{150.746277f, 74.5195313f}, {151.097519f, 74.491066f}, {151.448761f, 74.4626007f}, {151.800003f, 74.4527512f}}} 76 seg=71 {{{151.800003f, 74.4527512f}, {152.343307f, 74.4375076f}, {152.886597f, 74.4468765f}, {153.429901f, 74.4562454f}}} 77 seg=72 {{{153.429901f, 74.4562454f}, {153.619934f, 74.4595261f}, {153.809967f, 74.4627991f}, {154, 74.4650269f}}} 78 seg=73 {{{154, 74.4650269f}, {154.295746f, 74.4684906f}, {154.591476f, 74.4761581f}, {154.887222f, 74.4838257f}}} 79 seg=74 {{{154.887222f, 74.4838257f}, {155.324814f, 74.4951782f}, {155.762405f, 74.5065308f}, {156.199997f, 74.5042419f}}} 80 seg=75 {{{156.199997f, 74.5042419f}, {156.559143f, 74.5023651f}, {156.918289f, 74.487793f}, {157.27742f, 74.4732208f}}} 81 seg=76 {{{157.27742f, 74.4732208f}, {157.651611f, 74.4580307f}, {158.025803f, 74.4428406f}, {158.399994f, 74.4420166f}}} 82 seg=77 {{{158.399994f, 74.4420166f}, {159.133331f, 74.4403992f}, {159.866669f, 74.448494f}, {160.600006f, 74.4945221f}}} 83 seg=78 {{{160.600006f, 74.4945221f}, {160.952393f, 74.5166473f}, {161.304794f, 74.5602722f}, {161.657196f, 74.6038971f}}} 84 seg=79 {{{161.657196f, 74.6038971f}, {162.038132f, 74.6510468f}, {162.419067f, 74.698204f}, {162.800003f, 74.7182007f}}} 85 seg=80 {{{162.800003f, 74.7182007f}, {163.53334f, 74.7566986f}, {164.266663f, 74.7636337f}, {165, 74.7255325f}}} 86 seg=81 {{{165, 74.7255325f}, {165.356293f, 74.7070236f}, {165.712585f, 74.65802f}, {166.068878f, 74.6090164f}}} 87 seg=82 {{{166.068878f, 74.6090164f}, {166.445923f, 74.5571594f}, {166.822952f, 74.5053024f}, {167.199997f, 74.4895782f}}} 88 seg=83 {{{167.199997f, 74.4895782f}, {167.933334f, 74.4590073f}, {168.666672f, 74.4903488f}, {169.399994f, 74.5420837f}}} 89 seg=84 {{{169.399994f, 74.5420837f}, {169.752808f, 74.5669785f}, {170.105621f, 74.6176682f}, {170.458435f, 74.6683578f}}} 90 seg=85 {{{170.458435f, 74.6683578f}, {170.838959f, 74.7230225f}, {171.219482f, 74.7776947f}, {171.600006f, 74.8000031f}}} 91 seg=86 {{{171.600006f, 74.8000031f}, {172.333328f, 74.8429871f}, {173.066666f, 74.8376999f}, {173.800003f, 74.8000031f}}} 92 seg=87 {{{173.800003f, 74.8000031f}, {174.500809f, 74.7639694f}, {175.201599f, 74.6750717f}, {175.902405f, 74.5861664f}}} 93 seg=88 {{{175.902405f, 74.5861664f}, {176, 74.5737915f}}} 94 seg=89 {{{176, 74.5737915f}, {176.306427f, 74.5349655f}, {176.612839f, 74.4810333f}, {176.919266f, 74.4270935f}}} 95 seg=90 {{{176.919266f, 74.4270935f}, {177.346176f, 74.3519516f}, {177.773087f, 74.2768097f}, {178.199997f, 74.2425385f}}} 96 seg=91 {{{178.199997f, 74.2425385f}, {178.933334f, 74.18367f}, {179.666672f, 74.1942673f}, {180.399994f, 74.2205505f}}} 97 seg=92 {{{180.399994f, 74.2205505f}, {180.822174f, 74.2356796f}, {181.244354f, 74.2772751f}, {181.666534f, 74.3188705f}}} 98 seg=93 {{{181.666534f, 74.3188705f}, {181.977692f, 74.3495255f}, {182.288849f, 74.3801804f}, {182.600006f, 74.400238f}}} 99 seg=94 {{{182.600006f, 74.400238f}, {183.153549f, 74.435936f}, {183.707108f, 74.4587555f}, {184.260666f, 74.481575f}}} 100 seg=95 {{{184.260666f, 74.481575f}, {184.440445f, 74.4889832f}, {184.620224f, 74.4963913f}, {184.800003f, 74.5042419f}}} 101 seg=96 {{{184.800003f, 74.5042419f}, {185.53334f, 74.5362625f}, {186.266663f, 74.5669022f}, {187, 74.5923843f}}} 102 seg=97 {{{187, 74.5923843f}, {187.218643f, 74.5999832f}, {187.437286f, 74.6105118f}, {187.65593f, 74.6210403f}}} 103 seg=98 {{{187.65593f, 74.6210403f}, {188.170624f, 74.6458359f}, {188.685303f, 74.6706314f}, {189.199997f, 74.6571732f}}} 104 seg=99 {{{189.199997f, 74.6571732f}, {189.560562f, 74.6477432f}, {189.921127f, 74.6077042f}, {190.281693f, 74.5676651f}}} 105 seg=100 {{{190.281693f, 74.5676651f}, {190.654465f, 74.526268f}, {191.027237f, 74.4848709f}, {191.399994f, 74.4773026f}}} 106 seg=101 {{{191.399994f, 74.4773026f}, {191.942627f, 74.4662857f}, {192.48526f, 74.5001678f}, {193.027893f, 74.5340576f}}} 107 seg=102 {{{193.027893f, 74.5340576f}, {193.218597f, 74.5459671f}, {193.409302f, 74.5578766f}, {193.600006f, 74.5678329f}}} 108 seg=103 {{{193.600006f, 74.5678329f}, {193.897125f, 74.5833511f}, {194.19426f, 74.6063919f}, {194.491394f, 74.6294403f}}} 109 seg=104 {{{194.491394f, 74.6294403f}, {194.927597f, 74.663269f}, {195.3638f, 74.6970978f}, {195.800003f, 74.7071152f}}} 110 seg=105 {{{195.800003f, 74.7071152f}, {196.363327f, 74.7200546f}, {196.926636f, 74.7021637f}, {197.48996f, 74.6842728f}}} 111 seg=106 {{{197.48996f, 74.6842728f}, {197.659973f, 74.6788712f}, {197.829987f, 74.6734695f}, {198, 74.6689148f}}} 112 seg=107 {{{198, 74.6689148f}, {198.539948f, 74.6544571f}, {199.07988f, 74.6331635f}, {199.619827f, 74.6118698f}}} 113 seg=108 {{{199.619827f, 74.6118698f}, {199.813217f, 74.6042404f}, {200.006607f, 74.596611f}, {200.199997f, 74.5892944f}}} 114 seg=109 {{{200.199997f, 74.5892944f}, {200.468765f, 74.5791321f}, {200.737534f, 74.5671921f}, {201.006287f, 74.5552597f}}} 115 seg=110 {{{201.006287f, 74.5552597f}, {201.470856f, 74.5346298f}, {201.935425f, 74.5139999f}, {202.399994f, 74.5025177f}}} 116 seg=111 {{{202.399994f, 74.5025177f}, {202.888885f, 74.4904327f}, {203.377777f, 74.4879456f}, {203.866669f, 74.4854507f}}} 117 seg=112 {{{203.866669f, 74.4854507f}, {204.111115f, 74.4842072f}, {204.35556f, 74.4829636f}, {204.600006f, 74.4805222f}}} 118 seg=113 {{{204.600006f, 74.4805222f}, {204.84462f, 74.4780731f}, {205.089233f, 74.476059f}, {205.333847f, 74.4740448f}}} 119 seg=114 {{{205.333847f, 74.4740448f}, {205.822556f, 74.4700241f}, {206.311279f, 74.4659958f}, {206.800003f, 74.4585342f}}} 120 seg=115 {{{206.800003f, 74.4585342f}, {207.53334f, 74.4473343f}, {208.266663f, 74.4324722f}, {209, 74.413353f}}} 121 seg=116 {{{209, 74.413353f}, {209.350708f, 74.404213f}, {209.701416f, 74.3919983f}, {210.052124f, 74.3797836f}}} 122 seg=117 {{{210.052124f, 74.3797836f}, {210.434753f, 74.3664627f}, {210.817368f, 74.3531418f}, {211.199997f, 74.3438034f}}} 123 seg=118 {{{211.199997f, 74.3438034f}, {211.933334f, 74.3259048f}, {212.666672f, 74.3128586f}, {213.399994f, 74.305954f}}} 124 seg=119 {{{213.399994f, 74.305954f}, {214.133331f, 74.2990494f}, {214.866669f, 74.2958145f}, {215.600006f, 74.3023758f}}} 125 seg=120 {{{215.600006f, 74.3023758f}, {216.076187f, 74.3066406f}, {216.552383f, 74.317627f}, {217.02858f, 74.3286133f}}} 126 seg=121 {{{217.02858f, 74.3286133f}, {217.285721f, 74.334549f}, {217.542862f, 74.340477f}, {217.800003f, 74.3453522f}}} 127 seg=122 {{{217.800003f, 74.3453522f}, {218.041779f, 74.3499298f}, {218.283554f, 74.358696f}, {218.52533f, 74.3674622f}}} 128 seg=123 {{{218.52533f, 74.3674622f}, {219.016891f, 74.3852844f}, {219.508438f, 74.4031067f}, {220, 74.3857574f}}} 129 seg=124 {{{220, 74.3857574f}, {220.409988f, 74.3712845f}, {220.819977f, 74.3263474f}, {221.229965f, 74.2814102f}}} 130 seg=125 {{{221.229965f, 74.2814102f}, {221.553314f, 74.2459717f}, {221.876648f, 74.2105331f}, {222.199997f, 74.190033f}}} 131 seg=126 {{{222.199997f, 74.190033f}, {222.933334f, 74.1435471f}, {223.666672f, 74.1037674f}, {224.399994f, 74.1068344f}}} 132 seg=127 {{{224.399994f, 74.1068344f}, {224.885803f, 74.1088638f}, {225.371613f, 74.1381073f}, {225.857422f, 74.1673508f}}} 133 seg=128 {{{225.857422f, 74.1673508f}, {226.10495f, 74.182251f}, {226.352478f, 74.1971512f}, {226.600006f, 74.2084503f}}} 134 seg=129 {{{226.600006f, 74.2084503f}, {226.839722f, 74.2193909f}, {227.079437f, 74.2324677f}, {227.319153f, 74.2455521f}}} 135 seg=130 {{{227.319153f, 74.2455521f}, {227.812759f, 74.2724838f}, {228.306381f, 74.2994156f}, {228.800003f, 74.3076782f}}} 136 seg=131 {{{228.800003f, 74.3076782f}, {229.309921f, 74.3162155f}, {229.819824f, 74.3054352f}, {230.329742f, 74.2946548f}}} 137 seg=132 {{{230.329742f, 74.2946548f}, {230.553162f, 74.2899323f}, {230.776581f, 74.2852097f}, {231, 74.2821121f}}} 138 seg=133 {{{231, 74.2821121f}, {231.290405f, 74.2780838f}, {231.580811f, 74.2724228f}, {231.871216f, 74.2667542f}}} 139 seg=134 {{{231.871216f, 74.2667542f}, {232.314148f, 74.2581177f}, {232.757065f, 74.2494812f}, {233.199997f, 74.2466507f}}} 140 seg=135 {{{233.199997f, 74.2466507f}, {233.343719f, 74.2457352f}, {233.487442f, 74.2448959f}, {233.631165f, 74.2442474f}}} 141 seg=136 {{{233.631165f, 74.2442474f}, {234.220779f, 74.2415924f}, {234.810394f, 74.2421951f}, {235.399994f, 74.2539825f}}} 142 seg=137 {{{235.399994f, 74.2539825f}, {235.845032f, 74.2628784f}, {236.29007f, 74.2817612f}, {236.735107f, 74.3006439f}}} 143 seg=138 {{{236.735107f, 74.3006439f}, {237.023407f, 74.3128738f}, {237.311707f, 74.3251038f}, {237.600006f, 74.3346176f}}} 144 seg=139 {{{237.600006f, 74.3346176f}, {238.333328f, 74.3588257f}, {239.066666f, 74.3803329f}, {239.800003f, 74.3992233f}}} 145 seg=140 {{{239.800003f, 74.3992233f}, {240.082169f, 74.4064941f}, {240.364334f, 74.4108353f}, {240.6465f, 74.4151764f}}} 146 seg=141 {{{240.6465f, 74.4151764f}, {241.097672f, 74.4221191f}, {241.548828f, 74.4290695f}, {242, 74.4479828f}}} 147 seg=142 {{{242, 74.4479828f}, {242.416458f, 74.4654388f}, {242.832916f, 74.4942093f}, {243.249374f, 74.5229874f}}} 148 seg=143 {{{243.249374f, 74.5229874f}, {243.566254f, 74.5448837f}, {243.883118f, 74.5667801f}, {244.199997f, 74.5836868f}}} 149 seg=144 {{{244.199997f, 74.5836868f}, {244.933334f, 74.6228104f}, {245.666672f, 74.6546402f}, {246.399994f, 74.6827393f}}} 150 seg=145 {{{246.399994f, 74.6827393f}, {247.133331f, 74.7108383f}, {247.866669f, 74.7327499f}, {248.600006f, 74.7522964f}}} 151 seg=146 {{{248.600006f, 74.7522964f}, {248.714218f, 74.7553406f}}} 152 seg=147 {{{248.714218f, 74.7553406f}, {249.40947f, 74.7739029f}, {250.104736f, 74.7924576f}, {250.800003f, 74.8000031f}}} 153 seg=148 {{{250.800003f, 74.8000031f}, {251.288895f, 74.8053055f}, {251.777771f, 74.8035355f}, {252.266663f, 74.8017731f}}} 154 seg=149 {{{252.266663f, 74.8017731f}, {252.511108f, 74.8008881f}, {252.755554f, 74.8000031f}, {253, 74.8000031f}}} 155 seg=150 {{{253, 74.8000031f}, {68.1999969f, 74.8000031f}}} 156 op union 157 seg=151 {{{68.1999969f, 74.8000031f}, {68.4444427f, 74.8000031f}, {68.6888885f, 74.7961044f}, {68.9333344f, 74.7922058f}}} 158 seg=152 {{{68.9333344f, 74.7922058f}, {69.422226f, 74.7844086f}, {69.9111099f, 74.7766113f}, {70.4000015f, 74.8000031f}}} 159 seg=153 {{{70.4000015f, 74.8000031f}, {70.7796326f, 74.8181686f}, {71.1592636f, 74.8627396f}, {71.5388947f, 74.9073105f}}} 160 seg=154 {{{71.5388947f, 74.9073105f}, {71.8925934f, 74.9488373f}, {72.2462997f, 74.9903641f}, {72.5999985f, 75.0105362f}}} 161 seg=155 {{{72.5999985f, 75.0105362f}, {73.1301117f, 75.0407715f}, {73.6602249f, 75.0435104f}, {74.1903381f, 75.0462494f}}} 162 seg=156 {{{74.1903381f, 75.0462494f}, {74.3935623f, 75.0472946f}, {74.5967789f, 75.0483398f}, {74.8000031f, 75.0509415f}}} 163 seg=157 {{{74.8000031f, 75.0509415f}, {75.0211792f, 75.053772f}, {75.242363f, 75.0601425f}, {75.4635391f, 75.0665054f}}} 164 seg=158 {{{75.4635391f, 75.0665054f}, {75.9756927f, 75.0812454f}, {76.4878464f, 75.0959854f}, {77, 75.0667953f}}} 165 seg=159 {{{77, 75.0667953f}, {77.3702316f, 75.0456924f}, {77.7404709f, 74.9892731f}, {78.1107025f, 74.9328461f}}} 166 seg=160 {{{78.1107025f, 74.9328461f}, {78.4738007f, 74.8775101f}, {78.8368988f, 74.8221741f}, {79.1999969f, 74.8001556f}}} 167 seg=161 {{{79.1999969f, 74.8001556f}, {79.689003f, 74.7705002f}, {80.1780014f, 74.7803421f}, {80.6670074f, 74.790184f}}} 168 seg=162 {{{80.6670074f, 74.790184f}, {80.9113388f, 74.7950974f}, {81.1556702f, 74.8000107f}, {81.4000015f, 74.8000031f}}} 169 seg=163 {{{81.4000015f, 74.8000031f}, {81.6438522f, 74.7999954f}, {81.8877106f, 74.7989426f}, {82.1315613f, 74.7978897f}}} 170 seg=164 {{{82.1315613f, 74.7978897f}, {82.6210403f, 74.7957764f}, {83.1105194f, 74.7936554f}, {83.5999985f, 74.8000031f}}} 171 seg=165 {{{83.5999985f, 74.8000031f}, {83.9259109f, 74.8042297f}, {84.2518234f, 74.8159714f}, {84.5777359f, 74.827713f}}} 172 seg=166 {{{84.5777359f, 74.827713f}, {84.9851608f, 74.842392f}, {85.3925781f, 74.8570709f}, {85.8000031f, 74.8570709f}}} 173 seg=167 {{{85.8000031f, 74.8570709f}, {86.2074203f, 74.8570709f}, {86.6148453f, 74.842392f}, {87.0222626f, 74.827713f}}} 174 seg=168 {{{87.0222626f, 74.827713f}, {87.348175f, 74.8159714f}, {87.6740875f, 74.8042297f}, {88, 74.8000031f}}} 175 seg=169 {{{88, 74.8000031f}, {88.1576462f, 74.7979584f}, {88.3152924f, 74.7951202f}, {88.4729385f, 74.7922745f}}} 176 seg=170 {{{88.4729385f, 74.7922745f}, {89.0486221f, 74.7818985f}, {89.6243134f, 74.7715225f}, {90.1999969f, 74.8000031f}}} 177 seg=171 {{{90.1999969f, 74.8000031f}, {90.5620499f, 74.8179169f}, {90.9241028f, 74.8630524f}, {91.2861557f, 74.9081879f}}} 178 seg=172 {{{91.2861557f, 74.9081879f}, {91.6574402f, 74.9544754f}, {92.028717f, 75.0007629f}, {92.4000015f, 75.0176926f}}} 179 seg=173 {{{92.4000015f, 75.0176926f}, {92.9111481f, 75.0410004f}, {93.4223022f, 75.0278778f}, {93.9334488f, 75.0147552f}}} 180 seg=174 {{{93.9334488f, 75.0147552f}, {94.155632f, 75.0090561f}, {94.3778152f, 75.0033493f}, {94.5999985f, 75.0006409f}}} 181 seg=175 {{{94.5999985f, 75.0006409f}, {94.8669891f, 74.9973831f}, {95.1339798f, 74.9889908f}, {95.4009705f, 74.9806061f}}} 182 seg=176 {{{95.4009705f, 74.9806061f}, {95.8673172f, 74.9659576f}, {96.3336563f, 74.9513092f}, {96.8000031f, 74.9639893f}}} 183 seg=177 {{{96.8000031f, 74.9639893f}, {97.2396164f, 74.9759521f}, {97.6792297f, 75.0139465f}, {98.1188431f, 75.0519409f}}} 184 seg=178 {{{98.1188431f, 75.0519409f}, {98.4125595f, 75.0773239f}, {98.7062836f, 75.1027069f}, {99, 75.1203232f}}} 185 seg=179 {{{99, 75.1203232f}, {99.7333298f, 75.1643066f}, {100.466667f, 75.2075195f}, {101.199997f, 75.2278976f}}} 186 seg=180 {{{101.199997f, 75.2278976f}, {101.6632f, 75.2407608f}, {102.126396f, 75.2405472f}, {102.5896f, 75.2403336f}}} 187 seg=181 {{{102.5896f, 75.2403336f}, {102.859734f, 75.2402115f}, {103.129868f, 75.2400894f}, {103.400002f, 75.2425613f}}} 188 seg=182 {{{103.400002f, 75.2425613f}, {103.499123f, 75.2434692f}, {103.598244f, 75.2443542f}, {103.697365f, 75.2452393f}}} 189 seg=183 {{{103.697365f, 75.2452393f}, {104.331573f, 75.250885f}, {104.96579f, 75.2565308f}, {105.599998f, 75.2681274f}}} 190 seg=184 {{{105.599998f, 75.2681274f}, {105.951164f, 75.2745514f}, {106.30233f, 75.2846603f}, {106.653496f, 75.2947693f}}} 191 seg=185 {{{106.653496f, 75.2947693f}, {107.035667f, 75.3057709f}, {107.417831f, 75.3167725f}, {107.800003f, 75.3230209f}}} 192 seg=186 {{{107.800003f, 75.3230209f}, {107.904305f, 75.3247223f}, {108.008606f, 75.3265228f}, {108.112907f, 75.3283234f}}} 193 seg=187 {{{108.112907f, 75.3283234f}, {108.741936f, 75.33918f}, {109.370972f, 75.350029f}, {110, 75.340065f}}} 194 seg=188 {{{110, 75.340065f}, {110.73333f, 75.3284454f}, {111.466667f, 75.2919846f}, {112.199997f, 75.2532883f}}} 195 seg=189 {{{112.199997f, 75.2532883f}, {112.524193f, 75.2361755f}, {112.848389f, 75.2113037f}, {113.172585f, 75.1864319f}}} 196 seg=190 {{{113.172585f, 75.1864319f}, {113.581726f, 75.1550446f}, {113.99086f, 75.1236496f}, {114.400002f, 75.1078644f}}} 197 seg=191 {{{114.400002f, 75.1078644f}, {115.133331f, 75.079567f}, {115.866669f, 75.0734863f}, {116.599998f, 75.0834885f}}} 198 seg=192 {{{116.599998f, 75.0834885f}, {117.013039f, 75.089119f}, {117.426071f, 75.1088409f}, {117.839111f, 75.1285629f}}} 199 seg=193 {{{117.839111f, 75.1285629f}, {118.159409f, 75.1438599f}, {118.479706f, 75.1591568f}, {118.800003f, 75.1678772f}}} 200 seg=194 {{{118.800003f, 75.1678772f}, {118.915619f, 75.1710281f}, {119.031235f, 75.1743622f}, {119.146851f, 75.1776962f}}} 201 seg=195 {{{119.146851f, 75.1776962f}, {119.764565f, 75.1954956f}, {120.382286f, 75.2133026f}, {121, 75.2033386f}}} 202 seg=196 {{{121, 75.2033386f}, {121.552635f, 75.1944351f}, {122.105278f, 75.1614532f}, {122.657913f, 75.1284714f}}} 203 seg=197 {{{122.657913f, 75.1284714f}, {122.838608f, 75.1176834f}, {123.019302f, 75.1068954f}, {123.199997f, 75.0969543f}}} 204 seg=198 {{{123.199997f, 75.0969543f}, {123.480431f, 75.0815277f}, {123.760864f, 75.060524f}, {124.041298f, 75.0395203f}}} 205 seg=199 {{{124.041298f, 75.0395203f}, {124.494202f, 75.0056076f}, {124.947098f, 74.9716949f}, {125.400002f, 74.9612503f}}} 206 seg=200 {{{125.400002f, 74.9612503f}, {126.133331f, 74.9443436f}, {126.866669f, 74.9602585f}, {127.599998f, 74.9955215f}}} 207 seg=201 {{{127.599998f, 74.9955215f}, {128.17691f, 75.023262f}, {128.75383f, 75.0766068f}, {129.33075f, 75.1299438f}}} 208 seg=202 {{{129.33075f, 75.1299438f}, {129.487167f, 75.1444092f}, {129.643585f, 75.1588745f}, {129.800003f, 75.1728287f}}} 209 seg=203 {{{129.800003f, 75.1728287f}, {130.08493f, 75.1982422f}, {130.369843f, 75.2303619f}, {130.65477f, 75.2624817f}}} 210 seg=204 {{{130.65477f, 75.2624817f}, {131.10318f, 75.3130264f}, {131.55159f, 75.3635712f}, {132, 75.3879776f}}} 211 seg=205 {{{132, 75.3879776f}, {132.682098f, 75.4251099f}, {133.364182f, 75.4193726f}, {134.04628f, 75.4136353f}}} 212 seg=206 {{{134.04628f, 75.4136353f}, {134.199997f, 75.4123535f}}} 213 seg=207 {{{134.199997f, 75.4123535f}, {134.740479f, 75.4080048f}, {135.28096f, 75.3897247f}, {135.821426f, 75.3714523f}}} 214 seg=208 {{{135.821426f, 75.3714523f}, {136.014282f, 75.3649292f}, {136.207138f, 75.3584061f}, {136.399994f, 75.3525162f}}} 215 seg=209 {{{136.399994f, 75.3525162f}, {136.723831f, 75.3426285f}, {137.047668f, 75.3308029f}, {137.371506f, 75.3189697f}}} 216 seg=210 {{{137.371506f, 75.3189697f}, {137.781006f, 75.3040085f}, {138.190506f, 75.2890472f}, {138.600006f, 75.2780228f}}} 217 seg=211 {{{138.600006f, 75.2780228f}, {138.775055f, 75.2733078f}, {138.950119f, 75.2678604f}, {139.125183f, 75.262413f}}} 218 seg=212 {{{139.125183f, 75.262413f}, {139.683456f, 75.2450409f}, {140.24173f, 75.2276688f}, {140.800003f, 75.2340317f}}} 219 seg=213 {{{140.800003f, 75.2340317f}, {141.173523f, 75.2382889f}, {141.547028f, 75.259819f}, {141.920547f, 75.2813568f}}} 220 seg=214 {{{141.920547f, 75.2813568f}, {142.280365f, 75.3021011f}, {142.640182f, 75.3228455f}, {143, 75.3281403f}}} 221 seg=215 {{{143, 75.3281403f}, {143.733337f, 75.3389359f}, {144.46666f, 75.3424072f}, {145.199997f, 75.2988205f}}} 222 seg=216 {{{145.199997f, 75.2988205f}, {145.574966f, 75.276535f}, {145.949936f, 75.2288513f}, {146.32489f, 75.1811676f}}} 223 seg=217 {{{146.32489f, 75.1811676f}, {146.683258f, 75.1355896f}, {147.041626f, 75.0900192f}, {147.399994f, 75.0666199f}}} 224 seg=218 {{{147.399994f, 75.0666199f}, {148.133331f, 75.0187454f}, {148.866669f, 74.9981079f}, {149.600006f, 75.0115509f}}} 225 seg=219 {{{149.600006f, 75.0115509f}, {149.982086f, 75.0185547f}, {150.364182f, 75.0495148f}, {150.746277f, 75.0804749f}}} 226 seg=220 {{{150.746277f, 75.0804749f}, {151.097519f, 75.1089401f}, {151.448761f, 75.1374054f}, {151.800003f, 75.1472549f}}} 227 seg=221 {{{151.800003f, 75.1472549f}, {152.343307f, 75.1624985f}, {152.886597f, 75.1531296f}, {153.429901f, 75.1437607f}}} 228 seg=222 {{{153.429901f, 75.1437607f}, {153.619934f, 75.14048f}, {153.809967f, 75.137207f}, {154, 75.1349792f}}} 229 seg=223 {{{154, 75.1349792f}, {154.295746f, 75.1315155f}, {154.591476f, 75.123848f}, {154.887222f, 75.1161804f}}} 230 seg=224 {{{154.887222f, 75.1161804f}, {155.324814f, 75.1048279f}, {155.762405f, 75.0934753f}, {156.199997f, 75.0957642f}}} 231 seg=225 {{{156.199997f, 75.0957642f}, {156.559143f, 75.097641f}, {156.918289f, 75.1122131f}, {157.27742f, 75.1267853f}}} 232 seg=226 {{{157.27742f, 75.1267853f}, {157.651611f, 75.1419754f}, {158.025803f, 75.1571655f}, {158.399994f, 75.1579895f}}} 233 seg=227 {{{158.399994f, 75.1579895f}, {159.133331f, 75.1596069f}, {159.866669f, 75.1515121f}, {160.600006f, 75.105484f}}} 234 seg=228 {{{160.600006f, 75.105484f}, {160.952393f, 75.0833588f}, {161.304794f, 75.0397339f}, {161.657196f, 74.996109f}}} 235 seg=229 {{{161.657196f, 74.996109f}, {162.038132f, 74.9489594f}, {162.419067f, 74.9018021f}, {162.800003f, 74.8818054f}}} 236 seg=230 {{{162.800003f, 74.8818054f}, {163.53334f, 74.8433075f}, {164.266663f, 74.8363724f}, {165, 74.8744736f}}} 237 seg=231 {{{165, 74.8744736f}, {165.356293f, 74.8929825f}, {165.712585f, 74.9419861f}, {166.068878f, 74.9909897f}}} 238 seg=232 {{{166.068878f, 74.9909897f}, {166.445923f, 75.0428467f}, {166.822952f, 75.0947037f}, {167.199997f, 75.1104279f}}} 239 seg=233 {{{167.199997f, 75.1104279f}, {167.933334f, 75.1409988f}, {168.666672f, 75.1096573f}, {169.399994f, 75.0579224f}}} 240 seg=234 {{{169.399994f, 75.0579224f}, {169.752808f, 75.0330276f}, {170.105621f, 74.982338f}, {170.458435f, 74.9316483f}}} 241 seg=235 {{{170.458435f, 74.9316483f}, {170.838959f, 74.8769836f}, {171.219482f, 74.8223114f}, {171.600006f, 74.8000031f}}} 242 seg=236 {{{171.600006f, 74.8000031f}, {172.333328f, 74.757019f}, {173.066666f, 74.7623062f}, {173.800003f, 74.8000031f}}} 243 seg=237 {{{173.800003f, 74.8000031f}, {174.500809f, 74.8360367f}, {175.201599f, 74.9249344f}, {175.902405f, 75.0138397f}}} 244 seg=238 {{{175.902405f, 75.0138397f}, {176, 75.0262146f}}} 245 seg=239 {{{176, 75.0262146f}, {176.306427f, 75.0650406f}, {176.612839f, 75.1189728f}, {176.919266f, 75.1729126f}}} 246 seg=240 {{{176.919266f, 75.1729126f}, {177.346176f, 75.2480545f}, {177.773087f, 75.3231964f}, {178.199997f, 75.3574677f}}} 247 seg=241 {{{178.199997f, 75.3574677f}, {178.933334f, 75.4163361f}, {179.666672f, 75.4057388f}, {180.399994f, 75.3794556f}}} 248 seg=242 {{{180.399994f, 75.3794556f}, {180.822174f, 75.3643265f}, {181.244354f, 75.322731f}, {181.666534f, 75.2811356f}}} 249 seg=243 {{{181.666534f, 75.2811356f}, {181.977692f, 75.2504807f}, {182.288849f, 75.2198257f}, {182.600006f, 75.1997681f}}} 250 seg=244 {{{182.600006f, 75.1997681f}, {183.153549f, 75.1640701f}, {183.707108f, 75.1412506f}, {184.260666f, 75.1184311f}}} 251 seg=245 {{{184.260666f, 75.1184311f}, {184.440445f, 75.1110229f}, {184.620224f, 75.1036148f}, {184.800003f, 75.0957642f}}} 252 seg=246 {{{184.800003f, 75.0957642f}, {185.53334f, 75.0637436f}, {186.266663f, 75.0331039f}, {187, 75.0076218f}}} 253 seg=247 {{{187, 75.0076218f}, {187.218643f, 75.0000229f}, {187.437286f, 74.9894943f}, {187.65593f, 74.9789658f}}} 254 seg=248 {{{187.65593f, 74.9789658f}, {188.170624f, 74.9541702f}, {188.685303f, 74.9293747f}, {189.199997f, 74.9428329f}}} 255 seg=249 {{{189.199997f, 74.9428329f}, {189.560562f, 74.9522629f}, {189.921127f, 74.9923019f}, {190.281693f, 75.032341f}}} 256 seg=250 {{{190.281693f, 75.032341f}, {190.654465f, 75.0737381f}, {191.027237f, 75.1151352f}, {191.399994f, 75.1227036f}}} 257 seg=251 {{{191.399994f, 75.1227036f}, {191.942627f, 75.1337204f}, {192.48526f, 75.0998383f}, {193.027893f, 75.0659485f}}} 258 seg=252 {{{193.027893f, 75.0659485f}, {193.218597f, 75.054039f}, {193.409302f, 75.0421295f}, {193.600006f, 75.0321732f}}} 259 seg=253 {{{193.600006f, 75.0321732f}, {193.897125f, 75.016655f}, {194.19426f, 74.9936142f}, {194.491394f, 74.9705658f}}} 260 seg=254 {{{194.491394f, 74.9705658f}, {194.927597f, 74.9367371f}, {195.3638f, 74.9029083f}, {195.800003f, 74.8928909f}}} 261 seg=255 {{{195.800003f, 74.8928909f}, {196.363327f, 74.8799515f}, {196.926636f, 74.8978424f}, {197.48996f, 74.9157333f}}} 262 seg=256 {{{197.48996f, 74.9157333f}, {197.659973f, 74.9211349f}, {197.829987f, 74.9265366f}, {198, 74.9310913f}}} 263 seg=257 {{{198, 74.9310913f}, {198.539948f, 74.945549f}, {199.07988f, 74.9668427f}, {199.619827f, 74.9881363f}}} 264 seg=258 {{{199.619827f, 74.9881363f}, {199.813217f, 74.9957657f}, {200.006607f, 75.0033951f}, {200.199997f, 75.0107117f}}} 265 seg=259 {{{200.199997f, 75.0107117f}, {200.468765f, 75.020874f}, {200.737534f, 75.032814f}, {201.006287f, 75.0447464f}}} 266 seg=260 {{{201.006287f, 75.0447464f}, {201.470856f, 75.0653763f}, {201.935425f, 75.0860062f}, {202.399994f, 75.0974884f}}} 267 seg=261 {{{202.399994f, 75.0974884f}, {202.888885f, 75.1095734f}, {203.377777f, 75.1120605f}, {203.866669f, 75.1145554f}}} 268 seg=262 {{{203.866669f, 75.1145554f}, {204.111115f, 75.115799f}, {204.35556f, 75.1170425f}, {204.600006f, 75.1194839f}}} 269 seg=263 {{{204.600006f, 75.1194839f}, {204.84462f, 75.121933f}, {205.089233f, 75.1239471f}, {205.333847f, 75.1259613f}}} 270 seg=264 {{{205.333847f, 75.1259613f}, {205.822556f, 75.129982f}, {206.311279f, 75.1340103f}, {206.800003f, 75.1414719f}}} 271 seg=265 {{{206.800003f, 75.1414719f}, {207.53334f, 75.1526718f}, {208.266663f, 75.1675339f}, {209, 75.1866531f}}} 272 seg=266 {{{209, 75.1866531f}, {209.350708f, 75.1957932f}, {209.701416f, 75.2080078f}, {210.052124f, 75.2202225f}}} 273 seg=267 {{{210.052124f, 75.2202225f}, {210.434753f, 75.2335434f}, {210.817368f, 75.2468643f}, {211.199997f, 75.2562027f}}} 274 seg=268 {{{211.199997f, 75.2562027f}, {211.933334f, 75.2741013f}, {212.666672f, 75.2871475f}, {213.399994f, 75.2940521f}}} 275 seg=269 {{{213.399994f, 75.2940521f}, {214.133331f, 75.3009567f}, {214.866669f, 75.3041916f}, {215.600006f, 75.2976303f}}} 276 seg=270 {{{215.600006f, 75.2976303f}, {216.076187f, 75.2933655f}, {216.552383f, 75.2823792f}, {217.02858f, 75.2713928f}}} 277 seg=271 {{{217.02858f, 75.2713928f}, {217.285721f, 75.2654572f}, {217.542862f, 75.2595291f}, {217.800003f, 75.2546539f}}} 278 seg=272 {{{217.800003f, 75.2546539f}, {218.041779f, 75.2500763f}, {218.283554f, 75.2413101f}, {218.52533f, 75.2325439f}}} 279 seg=273 {{{218.52533f, 75.2325439f}, {219.016891f, 75.2147217f}, {219.508438f, 75.1968994f}, {220, 75.2142487f}}} 280 seg=274 {{{220, 75.2142487f}, {220.409988f, 75.2287216f}, {220.819977f, 75.2736588f}, {221.229965f, 75.3185959f}}} 281 seg=275 {{{221.229965f, 75.3185959f}, {221.553314f, 75.3540344f}, {221.876648f, 75.389473f}, {222.199997f, 75.4099731f}}} 282 seg=276 {{{222.199997f, 75.4099731f}, {222.933334f, 75.456459f}, {223.666672f, 75.4962387f}, {224.399994f, 75.4931717f}}} 283 seg=277 {{{224.399994f, 75.4931717f}, {224.885803f, 75.4911423f}, {225.371613f, 75.4618988f}, {225.857422f, 75.4326553f}}} 284 seg=278 {{{225.857422f, 75.4326553f}, {226.10495f, 75.4177551f}, {226.352478f, 75.4028549f}, {226.600006f, 75.3915558f}}} 285 seg=279 {{{226.600006f, 75.3915558f}, {226.839722f, 75.3806152f}, {227.079437f, 75.3675385f}, {227.319153f, 75.354454f}}} 286 seg=280 {{{227.319153f, 75.354454f}, {227.812759f, 75.3275223f}, {228.306381f, 75.3005905f}, {228.800003f, 75.2923279f}}} 287 seg=281 {{{228.800003f, 75.2923279f}, {229.309921f, 75.2837906f}, {229.819824f, 75.2945709f}, {230.329742f, 75.3053513f}}} 288 seg=282 {{{230.329742f, 75.3053513f}, {230.553162f, 75.3100739f}, {230.776581f, 75.3147964f}, {231, 75.317894f}}} 289 seg=283 {{{231, 75.317894f}, {231.290405f, 75.3219223f}, {231.580811f, 75.3275833f}, {231.871216f, 75.333252f}}} 290 seg=284 {{{231.871216f, 75.333252f}, {232.314148f, 75.3418884f}, {232.757065f, 75.3505249f}, {233.199997f, 75.3533554f}}} 291 seg=285 {{{233.199997f, 75.3533554f}, {233.933334f, 75.3580399f}, {234.666672f, 75.3606873f}, {235.399994f, 75.3460236f}}} 292 seg=286 {{{235.399994f, 75.3460236f}, {235.845032f, 75.3371277f}, {236.29007f, 75.3182449f}, {236.735107f, 75.2993622f}}} 293 seg=287 {{{236.735107f, 75.2993622f}, {237.023407f, 75.2871323f}, {237.311707f, 75.2749023f}, {237.600006f, 75.2653885f}}} 294 seg=288 {{{237.600006f, 75.2653885f}, {238.333328f, 75.2411804f}, {239.066666f, 75.2196732f}, {239.800003f, 75.2007828f}}} 295 seg=289 {{{239.800003f, 75.2007828f}, {240.082169f, 75.193512f}, {240.364334f, 75.1891708f}, {240.6465f, 75.1848297f}}} 296 seg=290 {{{240.6465f, 75.1848297f}, {241.097672f, 75.177887f}, {241.548828f, 75.1709366f}, {242, 75.1520233f}}} 297 seg=291 {{{242, 75.1520233f}, {242.416458f, 75.1345673f}, {242.832916f, 75.1057968f}, {243.249374f, 75.0770187f}}} 298 seg=292 {{{243.249374f, 75.0770187f}, {243.566254f, 75.0551224f}, {243.883118f, 75.033226f}, {244.199997f, 75.0163193f}}} 299 seg=293 {{{244.199997f, 75.0163193f}, {244.933334f, 74.9771957f}, {245.666672f, 74.9453659f}, {246.399994f, 74.9172668f}}} 300 seg=294 {{{246.399994f, 74.9172668f}, {247.133331f, 74.8891678f}, {247.866669f, 74.8672562f}, {248.600006f, 74.8477097f}}} 301 seg=295 {{{248.600006f, 74.8477097f}, {248.714218f, 74.8446655f}}} 302 seg=296 {{{248.714218f, 74.8446655f}, {249.40947f, 74.8261032f}, {250.104736f, 74.8075485f}, {250.800003f, 74.8000031f}}} 303 seg=297 {{{250.800003f, 74.8000031f}, {251.288895f, 74.7947006f}, {251.777771f, 74.7964706f}, {252.266663f, 74.798233f}}} 304 seg=298 {{{252.266663f, 74.798233f}, {252.511108f, 74.799118f}, {252.755554f, 74.8000031f}, {253, 74.8000031f}}} 305 seg=299 {{{253, 74.8000031f}, {68.1999969f, 74.8000031f}}} 306 debugShowCubicIntersection 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}}} 307 debugShowCubicLineIntersection 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}}} 308 debugShowCubicIntersection 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}}} 309 debugShowCubicLineIntersection 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}}} 310 SkOpSegment::addT insert t=0.988095214 segID=150 spanID=599 311 debugShowCubicIntersection 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}}} 312 debugShowCubicLineIntersection 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}}} 313 debugShowCubicIntersection 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}}} 314 debugShowCubicIntersection 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}}} 315 debugShowCubicIntersection 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}}} 316 debugShowCubicIntersection 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}}} 317 debugShowCubicIntersection 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}}} 318 debugShowCubicIntersection 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}}} 319 debugShowCubicIntersection 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}}} 320 debugShowCubicIntersection 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}}} 321 debugShowCubicLineIntersection 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}}} 322 SkOpSegment::addT insert t=0.0017190524 segID=11 spanID=600 323 SkOpSegment::addT insert t=0.940462545 segID=150 spanID=601 324 debugShowCubicIntersection 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}}} 325 debugShowCubicLineIntersection 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 326 SkOpSegment::addT insert t=0.99844881 segID=12 spanID=602 327 SkOpSegment::addT insert t=0.928577558 segID=150 spanID=603 328 SkOpSegment::addT insert t=0.928571405 segID=150 spanID=604 329 debugShowCubicIntersection 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}}} 330 debugShowCubicLineIntersection 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}}} 331 debugShowCubicIntersection 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}}} 332 debugShowCubicLineIntersection 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}}} 333 SkOpSegment::addT insert t=0.91666666 segID=150 spanID=605 334 debugShowCubicIntersection 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}}} 335 debugShowCubicLineIntersection 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}}} 336 debugShowCubicIntersection 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}}} 337 debugShowCubicIntersection 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}}} 338 debugShowCubicIntersection 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}}} 339 debugShowCubicLineIntersection 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}}} 340 SkOpSegment::addT insert t=0.892857128 segID=150 spanID=606 341 debugShowCubicIntersection 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}}} 342 debugShowCubicLineIntersection 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}}} 343 debugShowCubicIntersection 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}}} 344 debugShowCubicLineIntersection 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}}} 345 SkOpSegment::addT insert t=0.880952383 segID=150 spanID=607 346 debugShowCubicIntersection 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}}} 347 debugShowCubicLineIntersection 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}}} 348 debugShowCubicIntersection 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}}} 349 debugShowCubicIntersection 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}}} 350 debugShowCubicIntersection 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}}} 351 debugShowCubicIntersection 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}}} 352 debugShowCubicIntersection 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}}} 353 debugShowCubicIntersection 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}}} 354 debugShowCubicIntersection 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}}} 355 debugShowCubicIntersection 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}}} 356 debugShowCubicIntersection 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}}} 357 debugShowCubicIntersection 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}}} 358 debugShowCubicIntersection 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}}} 359 debugShowCubicIntersection 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}}} 360 debugShowCubicIntersection 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}}} 361 debugShowCubicIntersection 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}}} 362 debugShowCubicIntersection 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}}} 363 debugShowCubicIntersection 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}}} 364 debugShowCubicIntersection 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}}} 365 debugShowCubicIntersection 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}}} 366 debugShowCubicIntersection 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}}} 367 debugShowCubicIntersection 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}}} 368 debugShowCubicIntersection 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}}} 369 debugShowCubicIntersection 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}}} 370 debugShowCubicIntersection 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}}} 371 debugShowCubicIntersection 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}}} 372 debugShowCubicIntersection 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}}} 373 debugShowCubicIntersection 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}}} 374 debugShowCubicIntersection 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}}} 375 debugShowCubicIntersection 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}}} 376 debugShowCubicIntersection 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}}} 377 debugShowCubicIntersection 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}}} 378 debugShowCubicIntersection 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}}} 379 debugShowCubicIntersection 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}}} 380 debugShowCubicIntersection 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}}} 381 debugShowCubicLineIntersection 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}}} 382 debugShowCubicLineIntersection 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}}} 383 debugShowCubicIntersection 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}}} 384 debugShowCubicIntersection 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}}} 385 debugShowCubicIntersection 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}}} 386 debugShowCubicIntersection 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}}} 387 debugShowCubicIntersection 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}}} 388 debugShowCubicIntersection 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}}} 389 debugShowCubicIntersection 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}}} 390 debugShowCubicIntersection 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}}} 391 debugShowCubicIntersection 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}}} 392 debugShowCubicIntersection 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}}} 393 debugShowCubicIntersection 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}}} 394 debugShowCubicIntersection 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}}} 395 debugShowCubicIntersection 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}}} 396 debugShowCubicIntersection 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}}} 397 debugShowCubicIntersection 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}}} 398 debugShowCubicIntersection 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}}} 399 debugShowCubicIntersection 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}}} 400 debugShowCubicIntersection 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}}} 401 debugShowCubicIntersection 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}}} 402 debugShowCubicIntersection 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}}} 403 debugShowCubicIntersection 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}}} 404 debugShowCubicIntersection 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}}} 405 debugShowCubicIntersection 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}}} 406 debugShowCubicIntersection 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}}} 407 debugShowCubicIntersection 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}}} 408 debugShowCubicIntersection 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}}} 409 debugShowCubicIntersection 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}}} 410 debugShowCubicIntersection 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}}} 411 debugShowCubicIntersection 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}}} 412 debugShowCubicLineIntersection 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}}} 413 SkOpSegment::addT insert t=0.44047615 segID=150 spanID=608 414 debugShowCubicIntersection 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}}} 415 debugShowCubicLineIntersection 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 416 SkOpSegment::addT insert t=0.428571405 segID=150 spanID=609 417 debugShowCubicLineIntersection 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}}} 418 debugShowCubicLineIntersection 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}}} 419 debugShowCubicLineIntersection 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}}} 420 debugShowCubicIntersection 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}}} 421 debugShowCubicIntersection 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}}} 422 debugShowCubicIntersection 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}}} 423 debugShowCubicIntersection 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}}} 424 debugShowCubicIntersection 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}}} 425 debugShowCubicIntersection 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}}} 426 debugShowCubicIntersection 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}}} 427 debugShowCubicIntersection 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}}} 428 debugShowCubicIntersection 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}}} 429 debugShowCubicIntersection 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}}} 430 debugShowCubicIntersection 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}}} 431 debugShowCubicIntersection 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}}} 432 debugShowCubicIntersection 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}}} 433 debugShowCubicIntersection 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}}} 434 debugShowCubicIntersection 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}}} 435 debugShowCubicIntersection 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}}} 436 debugShowCubicIntersection 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}}} 437 debugShowCubicIntersection 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}}} 438 debugShowCubicIntersection 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}}} 439 debugShowCubicIntersection 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}}} 440 debugShowCubicIntersection 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}}} 441 debugShowCubicIntersection 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}}} 442 debugShowCubicIntersection 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}}} 443 debugShowCubicIntersection 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}}} 444 debugShowCubicIntersection 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}}} 445 debugShowCubicIntersection 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}}} 446 debugShowCubicIntersection 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}}} 447 debugShowCubicIntersection 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}}} 448 debugShowCubicIntersection 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}}} 449 debugShowCubicIntersection 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}}} 450 debugShowCubicIntersection 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}}} 451 debugShowCubicIntersection 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}}} 452 debugShowCubicIntersection 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}}} 453 debugShowCubicIntersection 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}}} 454 debugShowCubicIntersection 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}}} 455 debugShowCubicIntersection 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}}} 456 debugShowCubicIntersection 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}}} 457 debugShowCubicIntersection 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}}} 458 debugShowCubicIntersection 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}}} 459 debugShowCubicIntersection 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}}} 460 debugShowCubicIntersection 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}}} 461 debugShowCubicIntersection 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}}} 462 debugShowCubicIntersection 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}}} 463 debugShowCubicIntersection 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}}} 464 debugShowCubicIntersection 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}}} 465 debugShowCubicIntersection 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}}} 466 debugShowCubicIntersection 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}}} 467 debugShowCubicIntersection 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}}} 468 debugShowCubicIntersection 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}}} 469 debugShowCubicIntersection 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}}} 470 debugShowCubicIntersection 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}}} 471 debugShowCubicIntersection 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}}} 472 debugShowCubicIntersection 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}}} 473 debugShowCubicIntersection 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}}} 474 debugShowCubicIntersection 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}}} 475 debugShowCubicIntersection 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}}} 476 debugShowCubicLineIntersection 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}}} 477 debugShowCubicLineIntersection 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}}} 478 debugShowCubicIntersection 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}}} 479 debugShowCubicLineIntersection 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}}} 480 SkOpSegment::addT insert t=0.0119047452 segID=150 spanID=610 481 debugShowCubicIntersection 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}}} 482 debugShowCubicLineIntersection 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}}} 483 debugShowCubicLineIntersection 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}}} 484 debugShowCubicIntersection 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}}} 485 debugShowCubicIntersection 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}}} 486 debugShowCubicLineIntersection 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}}} 487 debugShowCubicIntersection 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}}} 488 debugShowCubicIntersection 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}}} 489 debugShowCubicIntersection 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}}} 490 debugShowCubicLineIntersection 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}}} 491 SkOpSegment::addT insert t=0.988095214 segID=299 spanID=611 492 debugShowCubicIntersection 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}}} 493 debugShowCubicIntersection 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}}} 494 debugShowCubicLineIntersection 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}}} 495 debugShowCubicIntersection 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}}} 496 debugShowCubicIntersection 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}}} 497 debugShowCubicIntersection 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}}} 498 SkOpSegment::addT alias t=0.00172605823 segID=11 spanID=600 499 SkOpSegment::addT insert t=0.00172605823 segID=161 spanID=612 500 debugShowCubicIntersection 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}}} 501 debugShowCubicLineIntersection 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}}} 502 SkOpSegment::addT insert t=0.940462545 segID=299 spanID=613 503 debugShowCubicIntersection 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}}} 504 debugShowCubicIntersection 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}}} 505 debugShowCubicIntersection 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}}} 506 debugShowCubicLineIntersection 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 507 SkOpSegment::addT insert t=0.928577558 segID=299 spanID=614 508 SkOpSegment::addT insert t=0.928571405 segID=299 spanID=615 509 debugShowCubicIntersection 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}}} 510 debugShowCubicIntersection 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}}} 511 debugShowCubicIntersection 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}}} 512 debugShowCubicLineIntersection 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}}} 513 debugShowCubicIntersection 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}}} 514 debugShowCubicIntersection 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}}} 515 debugShowCubicIntersection 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}}} 516 debugShowCubicLineIntersection 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}}} 517 SkOpSegment::addT insert t=0.91666666 segID=299 spanID=616 518 debugShowCubicIntersection 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}}} 519 debugShowCubicIntersection 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}}} 520 debugShowCubicLineIntersection 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}}} 521 debugShowCubicIntersection 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}}} 522 debugShowCubicIntersection 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}}} 523 debugShowCubicLineIntersection 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}}} 524 SkOpSegment::addT insert t=0.892857128 segID=299 spanID=617 525 debugShowCubicIntersection 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}}} 526 debugShowCubicIntersection 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}}} 527 debugShowCubicIntersection 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}}} 528 debugShowCubicLineIntersection 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}}} 529 debugShowCubicIntersection 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}}} 530 debugShowCubicIntersection 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}}} 531 debugShowCubicIntersection 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}}} 532 debugShowCubicLineIntersection 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}}} 533 SkOpSegment::addT insert t=0.880952383 segID=299 spanID=618 534 debugShowCubicIntersection 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}}} 535 debugShowCubicIntersection 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}}} 536 debugShowCubicLineIntersection 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}}} 537 debugShowCubicIntersection 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}}} 538 debugShowCubicIntersection 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}}} 539 debugShowCubicLineIntersection 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}}} 540 SkOpSegment::addT insert t=0.44047615 segID=299 spanID=619 541 debugShowCubicIntersection 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}}} 542 debugShowCubicIntersection 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 543 debugShowCubicIntersection 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}}} 544 debugShowCubicLineIntersection 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 545 SkOpSegment::addT insert t=0.428571405 segID=299 spanID=620 546 debugShowCubicIntersection 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}}} 547 debugShowCubicIntersection 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}}} 548 debugShowCubicLineIntersection 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}}} 549 debugShowCubicIntersection 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}}} 550 debugShowCubicIntersection 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}}} 551 debugShowCubicLineIntersection 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}}} 552 SkOpSegment::addT insert t=0.0119047452 segID=299 spanID=621 553 debugShowCubicIntersection 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}}} 554 debugShowCubicIntersection 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}}} 555 debugShowCubicIntersection 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}}} 556 debugShowCubicLineIntersection 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}}} 557 debugShowCubicIntersection 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}}} 558 debugShowCubicIntersection 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}}} 559 debugShowCubicLineIntersection 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}}} 560 debugShowCubicLineIntersection 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}}} 561 debugShowCubicLineIntersection 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}}} 562 debugShowCubicLineIntersection 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}}} 563 debugShowCubicLineIntersection 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}}} 564 SkOpSegment::addT alias t=0.0017190524 segID=161 spanID=612 565 debugShowCubicLineIntersection 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 566 SkOpSegment::addT insert t=0.99844881 segID=162 spanID=622 567 debugShowCubicLineIntersection 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}}} 568 debugShowCubicLineIntersection 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}}} 569 debugShowCubicLineIntersection 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}}} 570 debugShowCubicLineIntersection 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}}} 571 debugShowCubicLineIntersection 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}}} 572 debugShowCubicLineIntersection 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}}} 573 debugShowCubicLineIntersection 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}}} 574 debugShowCubicLineIntersection 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}}} 575 debugShowCubicLineIntersection 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 576 debugShowCubicLineIntersection 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}}} 577 debugShowCubicLineIntersection 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}}} 578 debugShowCubicLineIntersection 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}}} 579 debugShowCubicLineIntersection 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}}} 580 debugShowLineIntersection 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 581 debugShowCubicIntersection 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}}} 582 debugShowCubicLineIntersection 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}}} 583 debugShowCubicIntersection 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}}} 584 debugShowCubicLineIntersection 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}}} 585 debugShowCubicIntersection 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}}} 586 debugShowCubicLineIntersection 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}}} 587 debugShowCubicIntersection 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}}} 588 debugShowCubicIntersection 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}}} 589 debugShowCubicIntersection 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}}} 590 debugShowCubicIntersection 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}}} 591 debugShowCubicIntersection 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}}} 592 debugShowCubicIntersection 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}}} 593 debugShowCubicIntersection 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}}} 594 debugShowCubicIntersection 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}}} 595 debugShowCubicLineIntersection 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}}} 596 debugShowCubicIntersection 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}}} 597 debugShowCubicLineIntersection 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 598 debugShowCubicIntersection 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}}} 599 debugShowCubicLineIntersection 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}}} 600 debugShowCubicIntersection 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}}} 601 debugShowCubicLineIntersection 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}}} 602 debugShowCubicIntersection 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}}} 603 debugShowCubicLineIntersection 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}}} 604 debugShowCubicIntersection 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}}} 605 debugShowCubicIntersection 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}}} 606 debugShowCubicIntersection 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}}} 607 debugShowCubicLineIntersection 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}}} 608 debugShowCubicIntersection 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}}} 609 debugShowCubicLineIntersection 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}}} 610 debugShowCubicIntersection 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}}} 611 debugShowCubicLineIntersection 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}}} 612 debugShowCubicIntersection 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}}} 613 debugShowCubicLineIntersection 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}}} 614 debugShowCubicIntersection 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}}} 615 debugShowCubicIntersection 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}}} 616 debugShowCubicIntersection 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}}} 617 debugShowCubicIntersection 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}}} 618 debugShowCubicIntersection 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}}} 619 debugShowCubicIntersection 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}}} 620 debugShowCubicIntersection 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}}} 621 debugShowCubicIntersection 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}}} 622 debugShowCubicIntersection 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}}} 623 debugShowCubicIntersection 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}}} 624 debugShowCubicIntersection 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}}} 625 debugShowCubicIntersection 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}}} 626 debugShowCubicIntersection 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}}} 627 debugShowCubicIntersection 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}}} 628 debugShowCubicIntersection 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}}} 629 debugShowCubicIntersection 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}}} 630 debugShowCubicIntersection 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}}} 631 debugShowCubicIntersection 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}}} 632 debugShowCubicIntersection 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}}} 633 debugShowCubicIntersection 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}}} 634 debugShowCubicIntersection 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}}} 635 debugShowCubicIntersection 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}}} 636 debugShowCubicIntersection 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}}} 637 debugShowCubicIntersection 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}}} 638 debugShowCubicIntersection 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}}} 639 debugShowCubicIntersection 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}}} 640 debugShowCubicIntersection 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}}} 641 debugShowCubicIntersection 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}}} 642 debugShowCubicIntersection 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}}} 643 debugShowCubicIntersection 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}}} 644 debugShowCubicIntersection 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}}} 645 debugShowCubicIntersection 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}}} 646 debugShowCubicIntersection 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}}} 647 debugShowCubicLineIntersection 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}}} 648 debugShowCubicLineIntersection 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}}} 649 debugShowCubicIntersection 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}}} 650 debugShowCubicIntersection 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}}} 651 debugShowCubicIntersection 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}}} 652 debugShowCubicIntersection 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}}} 653 debugShowCubicIntersection 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}}} 654 debugShowCubicIntersection 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}}} 655 debugShowCubicIntersection 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}}} 656 debugShowCubicIntersection 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}}} 657 debugShowCubicIntersection 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}}} 658 debugShowCubicIntersection 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}}} 659 debugShowCubicIntersection 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}}} 660 debugShowCubicIntersection 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}}} 661 debugShowCubicIntersection 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}}} 662 debugShowCubicIntersection 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}}} 663 debugShowCubicIntersection 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}}} 664 debugShowCubicIntersection 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}}} 665 debugShowCubicIntersection 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}}} 666 debugShowCubicIntersection 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}}} 667 debugShowCubicIntersection 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}}} 668 debugShowCubicIntersection 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}}} 669 debugShowCubicIntersection 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}}} 670 debugShowCubicIntersection 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}}} 671 debugShowCubicIntersection 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}}} 672 debugShowCubicIntersection 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}}} 673 debugShowCubicIntersection 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}}} 674 debugShowCubicIntersection 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}}} 675 debugShowCubicIntersection 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}}} 676 debugShowCubicIntersection 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}}} 677 debugShowCubicIntersection 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}}} 678 debugShowCubicLineIntersection 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}}} 679 debugShowCubicIntersection 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}}} 680 debugShowCubicLineIntersection 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 681 debugShowCubicLineIntersection 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}}} 682 debugShowCubicLineIntersection 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}}} 683 debugShowCubicLineIntersection 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}}} 684 debugShowCubicIntersection 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}}} 685 debugShowCubicIntersection 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}}} 686 debugShowCubicIntersection 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}}} 687 debugShowCubicIntersection 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}}} 688 debugShowCubicIntersection 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}}} 689 debugShowCubicIntersection 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}}} 690 debugShowCubicIntersection 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}}} 691 debugShowCubicIntersection 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}}} 692 debugShowCubicIntersection 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}}} 693 debugShowCubicIntersection 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}}} 694 debugShowCubicIntersection 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}}} 695 debugShowCubicIntersection 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}}} 696 debugShowCubicIntersection 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}}} 697 debugShowCubicIntersection 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}}} 698 debugShowCubicIntersection 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}}} 699 debugShowCubicIntersection 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}}} 700 debugShowCubicIntersection 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}}} 701 debugShowCubicIntersection 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}}} 702 debugShowCubicIntersection 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}}} 703 debugShowCubicIntersection 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}}} 704 debugShowCubicIntersection 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}}} 705 debugShowCubicIntersection 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}}} 706 debugShowCubicIntersection 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}}} 707 debugShowCubicIntersection 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}}} 708 debugShowCubicIntersection 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}}} 709 debugShowCubicIntersection 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}}} 710 debugShowCubicIntersection 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}}} 711 debugShowCubicIntersection 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}}} 712 debugShowCubicIntersection 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}}} 713 debugShowCubicIntersection 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}}} 714 debugShowCubicIntersection 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}}} 715 debugShowCubicIntersection 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}}} 716 debugShowCubicIntersection 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}}} 717 debugShowCubicIntersection 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}}} 718 debugShowCubicIntersection 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}}} 719 debugShowCubicIntersection 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}}} 720 debugShowCubicIntersection 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}}} 721 debugShowCubicIntersection 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}}} 722 debugShowCubicIntersection 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}}} 723 debugShowCubicIntersection 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}}} 724 debugShowCubicIntersection 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}}} 725 debugShowCubicIntersection 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}}} 726 debugShowCubicIntersection 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}}} 727 debugShowCubicIntersection 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}}} 728 debugShowCubicIntersection 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}}} 729 debugShowCubicIntersection 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}}} 730 debugShowCubicIntersection 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}}} 731 debugShowCubicIntersection 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}}} 732 debugShowCubicIntersection 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}}} 733 debugShowCubicIntersection 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}}} 734 debugShowCubicIntersection 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}}} 735 debugShowCubicIntersection 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}}} 736 debugShowCubicIntersection 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}}} 737 debugShowCubicIntersection 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}}} 738 debugShowCubicIntersection 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}}} 739 debugShowCubicLineIntersection 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}}} 740 debugShowCubicLineIntersection 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}}} 741 debugShowCubicIntersection 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}}} 742 debugShowCubicLineIntersection 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}}} 743 debugShowCubicIntersection 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}}} 744 debugShowCubicLineIntersection 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}}} 745 debugShowCubicLineIntersection 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}}} 746 SkOpSegment::addT insert t=0.928577558 segID=299 spanID=623 747 SkOpSegment::addT insert t=0.99844881 segID=12 spanID=624 748 </div> 749 750 </div> 751 752 <script type="text/javascript"> 753 754 var testDivs = [ 755 issue3651_7, 756 757 ]; 758 759 var decimal_places = 3; // make this 3 to show more precision 760 761 var tests = []; 762 var testLines = []; 763 var testTitles = []; 764 var testIndex = 0; 765 var ctx; 766 767 var xmin, xmax, focusXmin, focusXmax; 768 var ymin, ymax, focusYmin, focusYmax; 769 var scale; 770 var mouseX, mouseY; 771 var srcLeft, srcTop; 772 var screenWidth, screenHeight; 773 var drawnPts, drawnLines, drawnQuads, drawnConics, drawnCubics; 774 var curveT = 0; 775 776 var pt_labels = 2; 777 var collect_bounds = false; 778 var control_lines = 0; 779 var curve_t = false; 780 var debug_xy = 1; 781 var focus_enabled = false; 782 var focus_on_selection = false; 783 var step_limit = 0; 784 var draw_active = false; 785 var draw_add = false; 786 var draw_angle = 0; 787 var draw_coincidence = false; 788 var draw_deriviatives = 0; 789 var draw_hints = false; 790 var draw_id = false; 791 var draw_intersection = 0; 792 var draw_intersectT = false; 793 var draw_legend = true; 794 var draw_log = false; 795 var draw_mark = false; 796 var draw_midpoint = false; 797 var draw_op = 0; 798 var draw_sequence = false; 799 var draw_sort = 0; 800 var draw_top = false; 801 var draw_path = 3; 802 var draw_computed = 0; 803 var retina_scale = !!window.devicePixelRatio; 804 805 var activeCount = 0; 806 var addCount = 0; 807 var angleCount = 0; 808 var coinCount = 0; 809 var opCount = 0; 810 var sectCount = 0; 811 var sortCount = 0; 812 var topCount = 0; 813 var markCount = 0; 814 var activeMax = 0; 815 var addMax = 0; 816 var angleMax = 0; 817 var coinMax = 0; 818 var sectMax = 0; 819 var sectMax2 = 0; 820 var sortMax = 0; 821 var topMax = 0; 822 var markMax = 0; 823 var opMax = 0; 824 var stepMax = 0; 825 var lastIndex = 0; 826 var hasPath = false; 827 var hasComputedPath = false; 828 var angleBetween = false; 829 var afterIndex = 0; 830 831 var firstActiveSpan = -1; 832 var logStart = -1; 833 var logRange = 0; 834 835 var SPAN_ID = 0; 836 var SPAN_X1 = SPAN_ID + 1; 837 var SPAN_Y1 = SPAN_X1 + 1; 838 var SPAN_X2 = SPAN_Y1 + 1; 839 var SPAN_Y2 = SPAN_X2 + 1; 840 841 var SPAN_L_T = SPAN_Y2 + 1; 842 var SPAN_L_TX = SPAN_L_T + 1; 843 var SPAN_L_TY = SPAN_L_TX + 1; 844 var SPAN_L_TEND = SPAN_L_TY + 1; 845 var SPAN_L_OTHER = SPAN_L_TEND + 1; 846 var SPAN_L_OTHERT = SPAN_L_OTHER + 1; 847 var SPAN_L_OTHERI = SPAN_L_OTHERT + 1; 848 var SPAN_L_SUM = SPAN_L_OTHERI + 1; 849 var SPAN_L_VAL = SPAN_L_SUM + 1; 850 var SPAN_L_OPP = SPAN_L_VAL + 1; 851 852 var SPAN_X3 = SPAN_Y2 + 1; 853 var SPAN_Y3 = SPAN_X3 + 1; 854 855 var SPAN_Q_T = SPAN_Y3 + 1; 856 var SPAN_Q_TX = SPAN_Q_T + 1; 857 var SPAN_Q_TY = SPAN_Q_TX + 1; 858 var SPAN_Q_TEND = SPAN_Q_TY + 1; 859 var SPAN_Q_OTHER = SPAN_Q_TEND + 1; 860 var SPAN_Q_OTHERT = SPAN_Q_OTHER + 1; 861 var SPAN_Q_OTHERI = SPAN_Q_OTHERT + 1; 862 var SPAN_Q_SUM = SPAN_Q_OTHERI + 1; 863 var SPAN_Q_VAL = SPAN_Q_SUM + 1; 864 var SPAN_Q_OPP = SPAN_Q_VAL + 1; 865 866 var SPAN_K_W = SPAN_Y3 + 1; 867 var SPAN_K_T = SPAN_K_W + 1; 868 var SPAN_K_TX = SPAN_K_T + 1; 869 var SPAN_K_TY = SPAN_K_TX + 1; 870 var SPAN_K_TEND = SPAN_K_TY + 1; 871 var SPAN_K_OTHER = SPAN_K_TEND + 1; 872 var SPAN_K_OTHERT = SPAN_K_OTHER + 1; 873 var SPAN_K_OTHERI = SPAN_K_OTHERT + 1; 874 var SPAN_K_SUM = SPAN_K_OTHERI + 1; 875 var SPAN_K_VAL = SPAN_K_SUM + 1; 876 var SPAN_K_OPP = SPAN_K_VAL + 1; 877 878 var SPAN_X4 = SPAN_Y3 + 1; 879 var SPAN_Y4 = SPAN_X4 + 1; 880 881 var SPAN_C_T = SPAN_Y4 + 1; 882 var SPAN_C_TX = SPAN_C_T + 1; 883 var SPAN_C_TY = SPAN_C_TX + 1; 884 var SPAN_C_TEND = SPAN_C_TY + 1; 885 var SPAN_C_OTHER = SPAN_C_TEND + 1; 886 var SPAN_C_OTHERT = SPAN_C_OTHER + 1; 887 var SPAN_C_OTHERI = SPAN_C_OTHERT + 1; 888 var SPAN_C_SUM = SPAN_C_OTHERI + 1; 889 var SPAN_C_VAL = SPAN_C_SUM + 1; 890 var SPAN_C_OPP = SPAN_C_VAL + 1; 891 892 var ACTIVE_LINE_SPAN = 1; 893 var ACTIVE_QUAD_SPAN = ACTIVE_LINE_SPAN + 1; 894 var ACTIVE_CONIC_SPAN = ACTIVE_QUAD_SPAN + 1; 895 var ACTIVE_CUBIC_SPAN = ACTIVE_CONIC_SPAN + 1; 896 897 var ADD_MOVETO = ACTIVE_CUBIC_SPAN + 1; 898 var ADD_LINETO = ADD_MOVETO + 1; 899 var ADD_QUADTO = ADD_LINETO + 1; 900 var ADD_CONICTO = ADD_QUADTO + 1; 901 var ADD_CUBICTO = ADD_CONICTO + 1; 902 var ADD_CLOSE = ADD_CUBICTO + 1; 903 var ADD_FILL = ADD_CLOSE + 1; 904 905 var PATH_LINE = ADD_FILL + 1; 906 var PATH_QUAD = PATH_LINE + 1; 907 var PATH_CONIC = PATH_QUAD + 1; 908 var PATH_CUBIC = PATH_CONIC + 1; 909 910 var INTERSECT_LINE = PATH_CUBIC + 1; 911 var INTERSECT_LINE_2 = INTERSECT_LINE + 1; 912 var INTERSECT_LINE_NO = INTERSECT_LINE_2 + 1; 913 var INTERSECT_QUAD_LINE = INTERSECT_LINE_NO + 1; 914 var INTERSECT_QUAD_LINE_2 = INTERSECT_QUAD_LINE + 1; 915 var INTERSECT_QUAD_LINE_NO = INTERSECT_QUAD_LINE_2 + 1; 916 var INTERSECT_QUAD = INTERSECT_QUAD_LINE_NO + 1; 917 var INTERSECT_QUAD_2 = INTERSECT_QUAD + 1; 918 var INTERSECT_QUAD_NO = INTERSECT_QUAD_2 + 1; 919 var INTERSECT_CONIC_LINE = INTERSECT_QUAD_NO + 1; 920 var INTERSECT_CONIC_LINE_2 = INTERSECT_CONIC_LINE + 1; 921 var INTERSECT_CONIC_LINE_NO = INTERSECT_CONIC_LINE_2 + 1; 922 var INTERSECT_CONIC = INTERSECT_CONIC_LINE_NO + 1; 923 var INTERSECT_CONIC_2 = INTERSECT_CONIC + 1; 924 var INTERSECT_CONIC_NO = INTERSECT_CONIC_2 + 1; 925 var INTERSECT_SELF_CUBIC = INTERSECT_CONIC_NO + 1; 926 var INTERSECT_SELF_CUBIC_NO = INTERSECT_SELF_CUBIC + 1; 927 var INTERSECT_CUBIC_LINE = INTERSECT_SELF_CUBIC_NO + 1; 928 var INTERSECT_CUBIC_LINE_2 = INTERSECT_CUBIC_LINE + 1; 929 var INTERSECT_CUBIC_LINE_3 = INTERSECT_CUBIC_LINE_2 + 1; 930 var INTERSECT_CUBIC_LINE_NO = INTERSECT_CUBIC_LINE_3 + 1; 931 var INTERSECT_CUBIC_QUAD = INTERSECT_CUBIC_LINE_NO + 1; 932 var INTERSECT_CUBIC_QUAD_2 = INTERSECT_CUBIC_QUAD + 1; 933 var INTERSECT_CUBIC_QUAD_3 = INTERSECT_CUBIC_QUAD_2 + 1; 934 var INTERSECT_CUBIC_QUAD_4 = INTERSECT_CUBIC_QUAD_3 + 1; 935 var INTERSECT_CUBIC_QUAD_NO = INTERSECT_CUBIC_QUAD_4 + 1; 936 var INTERSECT_CUBIC = INTERSECT_CUBIC_QUAD_NO + 1; 937 var INTERSECT_CUBIC_2 = INTERSECT_CUBIC + 1; 938 var INTERSECT_CUBIC_3 = INTERSECT_CUBIC_2 + 1; 939 var INTERSECT_CUBIC_4 = INTERSECT_CUBIC_3 + 1; 940 // FIXME: add cubic 5- 9 941 var INTERSECT_CUBIC_NO = INTERSECT_CUBIC_4 + 1; 942 943 var SORT_UNARY = INTERSECT_CUBIC_NO + 1; 944 var SORT_BINARY = SORT_UNARY + 1; 945 946 var OP_DIFFERENCE = SORT_BINARY + 1; 947 var OP_INTERSECT = OP_DIFFERENCE + 1; 948 var OP_UNION = OP_INTERSECT + 1; 949 var OP_XOR = OP_UNION + 1; 950 951 var MARK_LINE = OP_XOR + 1; 952 var MARK_QUAD = MARK_LINE + 1; 953 var MARK_CONIC = MARK_QUAD + 1; 954 var MARK_CUBIC = MARK_CONIC + 1; 955 var MARK_DONE_LINE = MARK_CUBIC + 1; 956 var MARK_DONE_QUAD = MARK_DONE_LINE + 1; 957 var MARK_DONE_CONIC = MARK_DONE_QUAD + 1; 958 var MARK_DONE_CUBIC = MARK_DONE_CONIC + 1; 959 var MARK_UNSORTABLE_LINE = MARK_DONE_CUBIC + 1; 960 var MARK_UNSORTABLE_QUAD = MARK_UNSORTABLE_LINE + 1; 961 var MARK_UNSORTABLE_CONIC = MARK_UNSORTABLE_QUAD + 1; 962 var MARK_UNSORTABLE_CUBIC = MARK_UNSORTABLE_CONIC + 1; 963 var MARK_SIMPLE_LINE = MARK_UNSORTABLE_CUBIC + 1; 964 var MARK_SIMPLE_QUAD = MARK_SIMPLE_LINE + 1; 965 var MARK_SIMPLE_CONIC = MARK_SIMPLE_QUAD + 1; 966 var MARK_SIMPLE_CUBIC = MARK_SIMPLE_CONIC + 1; 967 var MARK_SIMPLE_DONE_LINE = MARK_SIMPLE_CUBIC + 1; 968 var MARK_SIMPLE_DONE_QUAD = MARK_SIMPLE_DONE_LINE + 1; 969 var MARK_SIMPLE_DONE_CONIC = MARK_SIMPLE_DONE_QUAD + 1; 970 var MARK_SIMPLE_DONE_CUBIC = MARK_SIMPLE_DONE_CONIC + 1; 971 var MARK_DONE_UNARY_LINE = MARK_SIMPLE_DONE_CUBIC + 1; 972 var MARK_DONE_UNARY_QUAD = MARK_DONE_UNARY_LINE + 1; 973 var MARK_DONE_UNARY_CONIC = MARK_DONE_UNARY_QUAD + 1; 974 var MARK_DONE_UNARY_CUBIC = MARK_DONE_UNARY_CONIC + 1; 975 var MARK_ANGLE_LAST = MARK_DONE_UNARY_CUBIC + 1; 976 977 var COMPUTED_SET_1 = MARK_ANGLE_LAST + 1; 978 var COMPUTED_SET_2 = COMPUTED_SET_1 + 1; 979 980 var ANGLE_AFTER = COMPUTED_SET_2 + 1; 981 var ANGLE_AFTERPART = ANGLE_AFTER + 1; 982 983 var ACTIVE_OP = ANGLE_AFTERPART + 1; 984 985 var COIN_MAIN_SPAN = ACTIVE_OP + 1; 986 var COIN_OPP_SPAN = COIN_MAIN_SPAN + 1; 987 988 var FRAG_TYPE_LAST = COIN_OPP_SPAN; 989 990 var REC_TYPE_UNKNOWN = -1; 991 var REC_TYPE_PATH = 0; 992 var REC_TYPE_PATH2 = 1; 993 var REC_TYPE_SECT = 2; 994 var REC_TYPE_ACTIVE = 3; 995 var REC_TYPE_ADD = 4; 996 var REC_TYPE_SORT = 5; 997 var REC_TYPE_OP = 6; 998 var REC_TYPE_MARK = 7; 999 var REC_TYPE_COMPUTED = 8; 1000 var REC_TYPE_COIN = 9; 1001 var REC_TYPE_ANGLE = 10; 1002 var REC_TYPE_ACTIVE_OP = 11; 1003 var REC_TYPE_AFTERPART = 12; 1004 var REC_TYPE_TOP = 13; 1005 var REC_TYPE_COINCIDENCE = 14; 1006 var REC_TYPE_LAST = REC_TYPE_COINCIDENCE; 1007 1008 function 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 1022 function 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 1033 function 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\\)"); 1037 escape = escape.replace(/CONIC_VAL/g, "\\(P_VAL P_VAL P_VAL W_VAL\\)"); 1038 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"); 1041 escape = escape.replace(/PTR_VAL/g, "0x[0-9A-F]+"); 1042 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+)?)"); 1045 escape = escape.replace(/W_VAL/g, "(-?\\d+\\.?\\d*(?:e-?\\d+)?)[Ff]?"); 1046 escape = escape.replace(/PATH/g, "pathB?"); 1047 escape = escape.replace(/IDX/g, "(-?\\d+)"); 1048 escape = escape.replace(/NUM/g, "(-?\\d+)"); 1049 escape = escape.replace(/OPT/g, "(\\?|-?\\d+)"); 1050 return new RegExp(escape, 'i'); 1051 } 1052 1053 function construct_regexp2c(pattern) { 1054 var escape = pattern.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&'); 1055 escape = escape.replace(/UNSORTABLE/g, "\\*\\*\\* UNSORTABLE \\*\\*\\*"); 1056 escape = escape.replace(/CUBIC_VAL/g, "(?:\\$\\d = )?\\{\\{\\{P_VAL\\}, \\{P_VAL\\}, \\{P_VAL\\}, \\{P_VAL\\}\\}\\}"); 1057 escape = escape.replace(/CONIC_VAL/g, "(?:\\$\\d = )?\\{\\{\\{\\{P_VAL\\}, \\{P_VAL\\}, \\{P_VAL\\}\\}\\}, W_VAL\\}"); 1058 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\\}\\}\\}"); 1060 escape = escape.replace(/FILL_TYPE/g, "SkPath::k[a-zA-Z]+_FillType"); 1061 escape = escape.replace(/PTR_VAL/g, "0x[0-9A-F]+"); 1062 escape = escape.replace(/PT_VAL/g, "\\{\\{P_VAL\\}\\}"); 1063 escape = escape.replace(/P_VAL/g, "(?:f?[xX] = )?(-?\\d+\\.?\\d*(?:e-?\\d+)?)[Ff]?, *(?: f?[yY] = )?(-?\\d+\\.?\\d*(?:e-?\\d+)?)[Ff]?"); 1064 escape = escape.replace(/T_VAL/g, "(-?\\d+\\.?\\d*(?:e-?\\d+)?)"); 1065 escape = escape.replace(/W_VAL/g, "(-?\\d+\\.?\\d*(?:e-?\\d+)?)[Ff]?"); 1066 escape = escape.replace(/OPER/g, "[a-z]+"); 1067 escape = escape.replace(/PATH/g, "pathB?"); 1068 escape = escape.replace(/T_F/g, "([TF])"); 1069 escape = escape.replace(/IDX/g, "(-?\\d+)"); 1070 escape = escape.replace(/NUM/g, "(-?\\d+)"); 1071 escape = escape.replace(/OPT/g, "(\\?|-?\\d+)"); 1072 return new RegExp(escape, 'i'); 1073 } 1074 1075 function 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 1084 function endsWith(str, suffix) { 1085 return str.indexOf(suffix, str.length - suffix.length) !== -1; 1086 } 1087 1088 function 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 } 1108 var coinStart = "SkOpCoincidence::"; 1109 if (line.lastIndexOf(coinStart, 0) === 0) { 1110 line = line.substr(coinStart.length); 1111 } 1112 var type = line.lastIndexOf("debugShowActiveSpans", 0) === 0 ? REC_TYPE_ACTIVE 1113 : line.lastIndexOf("debugShowCoincidence", 0) === 0 ? REC_TYPE_COINCIDENCE 1114 : line.lastIndexOf("((SkOpSegment*)", 0) === 0 ? REC_TYPE_PATH2 1115 : line.lastIndexOf("debugShowTs", 0) === 0 ? REC_TYPE_COIN 1116 : line.lastIndexOf("afterPart", 0) === 0 ? REC_TYPE_AFTERPART 1117 : 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 1122 : line.lastIndexOf("findTop", 0) === 0 ? REC_TYPE_TOP 1123 : 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 1128 : line.lastIndexOf("seg=", 0) === 0 ? REC_TYPE_PATH 1129 : 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" + 1147 " id=IDX LINE_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT windValue=IDX" 1148 ) || match_regexp(line, lineNo, record, ACTIVE_QUAD_SPAN, "debugShowActiveSpans" + 1149 " id=IDX QUAD_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT windValue=IDX" 1150 ) || match_regexp(line, lineNo, record, ACTIVE_CONIC_SPAN, "debugShowActiveSpans" + 1151 " id=IDX CONIC_VAL t=T_VAL PT_VAL tEnd=T_VAL windSum=OPT windValue=IDX" 1152 ) || match_regexp(line, lineNo, record, ACTIVE_CUBIC_SPAN, "debugShowActiveSpans" + 1153 " 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" 1162 ); 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; 1186 } 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; 1192 } 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; 1204 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") 1207 || match_regexp(line, lineNo, record, PATH_CONIC, "afterPart CONIC_VAL") 1208 || match_regexp(line, lineNo, record, PATH_CUBIC, "afterPart CUBIC_VAL") 1209 break; 1210 case REC_TYPE_ANGLE: 1211 found = match_regexp(line, lineNo, record, ANGLE_AFTER, "after " + 1212 "[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; 1217 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; 1224 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," 1229 ) || match_regexp(line, lineNo, record, PATH_CONIC, " CONIC_VAL," 1230 ) || match_regexp(line, lineNo, record, PATH_CUBIC, " CUBIC_VAL," 1231 ); 1232 break; 1233 case REC_TYPE_PATH: 1234 found = match_regexp(line, lineNo, record, PATH_LINE, "seg=IDX LINE_VAL" 1235 ) || match_regexp(line, lineNo, record, PATH_QUAD, "seg=IDX QUAD_VAL" 1236 ) || match_regexp(line, lineNo, record, PATH_CONIC, "seg=IDX CONIC_VAL" 1237 ) || 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}" 1243 ) || match_regexp(line, lineNo, record, PATH_CONIC, "((SkOpSegment*) PTR_VAL) [IDX] {CONIC_VAL}" 1244 ) || match_regexp(line, lineNo, record, PATH_CUBIC, "((SkOpSegment*) PTR_VAL) [IDX] {CUBIC_VAL}" 1245 ); 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" 1266 ) || 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" 1278 ) || 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; 1338 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; 1347 case REC_TYPE_MARK: 1348 found = match_regexp(line, lineNo, record, MARK_LINE, "markWinding" + 1349 " id=IDX LINE_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX" 1350 ) || match_regexp(line, lineNo, record, MARK_QUAD, "markWinding" + 1351 " id=IDX QUAD_VAL t=T_VAL [IDX] PT_VAL tEnd=T_VAL newWindSum=NUM newOppSum=OPT oppSum=OPT windSum=OPT windValue=IDX" 1352 ) || 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" 1354 ) || match_regexp(line, lineNo, record, MARK_CUBIC, "markWinding" + 1355 " 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" 1360 ) || 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" 1362 ) || 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" 1364 ) || 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" 1368 ) || 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" 1370 ) || 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" 1372 ) || match_regexp(line, lineNo, record, MARK_ANGLE_LAST, "markAngle" + 1373 " last segment=IDX span=IDX" 1374 ) || match_regexp(line, lineNo, record, MARK_ANGLE_LAST, "markAngle" + 1375 " last segment=IDX span=IDX windSum=OPT"); 1376 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 } 1383 found = match_regexp(line, lineNo, record, OP_DIFFERENCE, "op diff" 1384 ) || match_regexp(line, lineNo, record, OP_INTERSECT, "op intersect" 1385 ) || match_regexp(line, lineNo, record, OP_INTERSECT, "op sect" 1386 ) || 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 1409 function 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: 1456 first = 1; 1457 switch (fragType) { 1458 case PATH_LINE: 1459 last = 5; 1460 break; 1461 case PATH_CONIC: 1462 case PATH_QUAD: 1463 last = 7; 1464 break; 1465 case PATH_CUBIC: 1466 last = 9; 1467 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; 1477 case REC_TYPE_PATH2: 1478 first = 1; 1479 switch (fragType) { 1480 case PATH_LINE: 1481 last = 5; 1482 break; 1483 case PATH_CONIC: 1484 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; 1499 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; 1508 case ACTIVE_CONIC_SPAN: 1509 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; 1527 case ADD_CONICTO: 1528 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; 1542 case REC_TYPE_AFTERPART: 1543 switch (fragType) { 1544 case PATH_LINE: 1545 last = 4; 1546 break; 1547 case PATH_CONIC: 1548 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; 1559 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; 1570 case INTERSECT_CONIC_LINE: 1571 first = 1; last = 7; first2 = 11; last2 = 15; 1572 break; 1573 case INTERSECT_QUAD_LINE: 1574 first = 1; last = 7; first2 = 10; last2 = 14; 1575 break; 1576 case INTERSECT_CONIC_LINE_2: 1577 first = 1; last = 7; first2 = 14; last2 = 18; 1578 break; 1579 case INTERSECT_QUAD_LINE_2: 1580 first = 1; last = 7; first2 = 13; last2 = 17; 1581 break; 1582 case INTERSECT_CONIC_LINE_NO: 1583 first = 0; last = 6; first2 = 7; last2 = 11; 1584 break; 1585 case INTERSECT_QUAD_LINE_NO: 1586 first = 0; last = 6; first2 = 6; last2 = 10; 1587 break; 1588 case INTERSECT_CONIC: 1589 first = 1; last = 7; first2 = 11; last2 = 17; 1590 break; 1591 case INTERSECT_QUAD: 1592 first = 1; last = 7; first2 = 10; last2 = 16; 1593 break; 1594 case INTERSECT_CONIC_2: 1595 first = 1; last = 7; first2 = 14; last2 = 20; 1596 break; 1597 case INTERSECT_QUAD_2: 1598 first = 1; last = 7; first2 = 13; last2 = 19; 1599 break; 1600 case INTERSECT_CONIC_NO: 1601 first = 0; last = 6; first2 = 7; last2 = 13; 1602 break; 1603 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 } 1697 { 1698 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; 1705 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; 1714 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; 1723 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; 1732 } 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) { 1741 draw_computed = 7; // show quadratics, conics, and cubics 1742 } 1743 if (hasPath == true && hasComputedPath == false && draw_computed) { 1744 draw_computed = 0; 1745 } 1746 } 1747 1748 function curveByID(test, id) { 1749 var tIndex = -3; 1750 while ((tIndex += 3) < test.length) { 1751 var recType = test[tIndex]; 1752 if (recType == REC_TYPE_OP) { 1753 continue; 1754 } 1755 if (recType != REC_TYPE_PATH) { 1756 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) { 1764 case PATH_LINE: 1765 return [frags[1], frags[2], frags[3], frags[4]]; 1766 case PATH_QUAD: 1767 return [frags[1], frags[2], frags[3], frags[4], 1768 frags[5], frags[6]]; 1769 case PATH_CONIC: 1770 return [frags[1], frags[2], frags[3], frags[4], 1771 frags[5], frags[6], frags[7]]; 1772 case PATH_CUBIC: 1773 return [frags[1], frags[2], frags[3], frags[4], 1774 frags[5], frags[6], frags[7], frags[8]]; 1775 } 1776 } 1777 } 1778 } 1779 return []; 1780 } 1781 1782 function curvePartialByID(test, id, t0, t1) { 1783 var tIndex = -3; 1784 while ((tIndex += 3) < test.length) { 1785 var recType = test[tIndex]; 1786 if (recType == REC_TYPE_OP) { 1787 continue; 1788 } 1789 if (recType != REC_TYPE_PATH) { 1790 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) { 1798 case PATH_LINE: 1799 return linePartial(frags[1], frags[2], frags[3], frags[4], t0, t1); 1800 case PATH_QUAD: 1801 return quadPartial(frags[1], frags[2], frags[3], frags[4], 1802 frags[5], frags[6], t0, t1); 1803 case PATH_CONIC: 1804 return conicPartial(frags[1], frags[2], frags[3], frags[4], 1805 frags[5], frags[6], frags[7], t0, t1); 1806 case PATH_CUBIC: 1807 return cubicPartial(frags[1], frags[2], frags[3], frags[4], 1808 frags[5], frags[6], frags[7], frags[8], t0, t1); 1809 } 1810 } 1811 } 1812 } 1813 return []; 1814 } 1815 1816 function idByCurve(test, frag, type) { 1817 var tIndex = 0; 1818 while (tIndex < test.length) { 1819 var recType = test[tIndex]; 1820 if (recType != REC_TYPE_PATH) { 1821 ++tIndex; 1822 continue; 1823 } 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]; 1828 if (frag.length != frags.length - 1) { 1829 continue; 1830 } 1831 switch (fragType) { 1832 case PATH_LINE: 1833 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]; 1838 case PATH_QUAD: 1839 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]; 1845 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]; 1853 case PATH_CUBIC: 1854 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 1868 function curve_extremes(curve, bounds) { 1869 var length = curve.length == 7 ? 6 : curve.length; 1870 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 1880 function 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 1908 function 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 1965 function drawPoint(px, py, end) { 1966 var length = drawnPts.length == 7 ? 6 : drawnPts.length; 1967 for (var pts = 0; pts < length; pts += 2) { 1968 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 1993 function 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 2007 function drawPoints(ptArray, curveType, drawControls) { 2008 var count = coordCount(curveType); 2009 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 2017 function 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 2038 function 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; 2055 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; 2066 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 2081 function 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 2092 function 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 2099 function 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 2106 function 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 2129 function 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 2141 function 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 2153 function 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 2170 function 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 2196 function 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 2210 function interp(A, B, t) { 2211 return A + (B - A) * t; 2212 } 2213 2214 function 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 2222 function 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 2237 function 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 2258 function 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 2286 var kMaxConicToQuadPOW2 = 5; 2287 2288 function 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 2305 function subdivide_w_value(w) { 2306 return Math.sqrt(0.5 + w * 0.5); 2307 } 2308 2309 function 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 2325 function 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 2340 function chopIntoQuadsPOW2(curve, pow2, pts) { 2341 subdivide(curve, pow2, pts); 2342 return 1 << pow2; 2343 } 2344 2345 function 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 2365 function 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 2374 function 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 2381 function 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 2404 function 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 2416 function 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 2445 function 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 2461 function 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 2472 function 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 2495 function 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 2520 function 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; 2528 case 7: 2529 drawConicWithQuads(c[0], c[1], c[2], c[3], c[4], c[5], c[6]); 2530 break; 2531 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 2537 function boundsWidth(pts) { 2538 var min = pts[0]; 2539 var max = pts[0]; 2540 var length = pts.length == 7 ? 6 : pts.length; 2541 for (var idx = 2; idx < length; idx += 2) { 2542 min = Math.min(min, pts[idx]); 2543 max = Math.max(max, pts[idx]); 2544 } 2545 return max - min; 2546 } 2547 2548 function boundsHeight(pts) { 2549 var min = pts[1]; 2550 var max = pts[1]; 2551 var length = pts.length == 7 ? 6 : pts.length; 2552 for (var idx = 3; idx < length; idx += 2) { 2553 min = Math.min(min, pts[idx]); 2554 max = Math.max(max, pts[idx]); 2555 } 2556 return max - min; 2557 } 2558 2559 function 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]; 2565 if (dx == 0 && dy == 0 && pts.length == 8) { 2566 dx = pts[6] - pts[0]; 2567 dy = pts[7] - pts[1]; 2568 } 2569 } 2570 return Math.atan2(-dy, dx); 2571 } 2572 2573 function 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 2584 function 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 2594 function 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 2619 function 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 2634 function 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 2641 function 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 2652 function 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]; 2660 } 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; 2671 } 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 2687 function 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 2701 function drawLabelX(ymin, num, loc) { 2702 var px = (loc - srcLeft) * scale; 2703 var py = (ymin - srcTop) * scale - 20; 2704 drawLabel(num, px, py); 2705 } 2706 2707 function drawLabelY(xmin, num, loc) { 2708 var px = (xmin - srcLeft) * scale - 20; 2709 var py = (loc - srcTop) * scale; 2710 drawLabel(num, px, py); 2711 } 2712 2713 function 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 2736 function scalexy(x, y, mag) { 2737 var length = Math.sqrt(x * x + y * y); 2738 return mag / length; 2739 } 2740 2741 function drawArrow(x, y, dx, dy, s) { 2742 var dscale = scalexy(dx, dy, 1 / scale * 100 * s); 2743 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 2760 function 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 } 2770 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 } 2774 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 2781 function 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 } 2791 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 } 2795 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 2802 function 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 2826 function 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 2834 function 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 2849 function drawLinePartialID(id, x1, y1, x2, y2, t1, t2) { 2850 var curve = [x1, y1, x2, y2]; 2851 drawCurvePartialID(id, curve, t1, t2); 2852 } 2853 2854 function 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 2859 function 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 2864 function 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 2869 function 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 2877 function 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); 2902 drawArrow(curve[0], curve[1], d.x, d.y, 1); 2903 if (draw_deriviatives == 2) { 2904 d = dxy_at_t(curve, type, 1); 2905 if (type == PATH_CUBIC) { 2906 drawArrow(curve[6], curve[7], d.x, d.y, 1); 2907 } else { 2908 drawArrow(curve[4], curve[5], d.x, d.y, 1); 2909 } 2910 } 2911 if (draw_midpoint) { 2912 var mid = pointAtT(curve, type, 0.5); 2913 d = dxy_at_t(curve, type, 0.5); 2914 drawArrow(mid.x, mid.y, d.x, d.y, 1); 2915 } 2916 } 2917 if (type != PATH_CUBIC) { 2918 return; 2919 } 2920 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 2932 function logCurves(test) { 2933 for (curves in test) { 2934 var curve = test[curves]; 2935 dumpCurve(curve); 2936 } 2937 } 2938 2939 function curveToString(curve) { 2940 var str = "{{"; 2941 var length = curve.length == 7 ? 6 : curve.length; 2942 if (curve.length == 7) { 2943 str += "{"; 2944 } 2945 for (i = 0; i < length; i += 2) { 2946 str += curve[i].toFixed(decimal_places) + "," + curve[i + 1].toFixed(decimal_places); 2947 if (i < curve.length - 2) { 2948 str += "}, {"; 2949 } 2950 } 2951 str += "}"; 2952 if (curve.length == 7) { 2953 str += "}, " + curve[6].toFixed(decimal_places); 2954 } 2955 str += "}"; 2956 return str; 2957 } 2958 2959 function dumpCurve(curve) { 2960 console.log(curveToString(curve)); 2961 } 2962 2963 function 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; 2980 var lastCoin = 0; 2981 var lastSect = 0; 2982 var lastSort = 0; 2983 var lastMark = 0; 2984 var lastTop = 0; 2985 activeCount = 0; 2986 addCount = 0; 2987 angleCount = 0; 2988 opCount = 0; 2989 sectCount = 0; 2990 sortCount = 0; 2991 topCount = 0; 2992 markCount = 0; 2993 activeMax = 0; 2994 addMax = 0; 2995 angleMax = 0; 2996 coinMax = 0; 2997 opMax = 0; 2998 sectMax = 0; 2999 sectMax2 = 0; 3000 sortMax = 0; 3001 topMax = 0; 3002 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 } 3045 if (recType == REC_TYPE_PATH2 && hasOp) { 3046 secondPath = tIndex; 3047 } 3048 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 } 3066 if (recType == REC_TYPE_AFTERPART) { 3067 if (draw_angle != 3 || !inStepRange) { 3068 continue; 3069 } 3070 lastAngle = tIndex; 3071 ++angleCount; 3072 bumpStep = true; 3073 } 3074 if (recType == REC_TYPE_ANGLE) { 3075 ++angleMax; 3076 if (draw_angle == 0 || draw_angle == 3 || !inStepRange) { 3077 continue; 3078 } 3079 lastAngle = tIndex; 3080 ++angleCount; 3081 bumpStep = true; 3082 } 3083 if (recType == REC_TYPE_COINCIDENCE) { 3084 ++coinMax; 3085 if (!draw_coincidence || !inStepRange) { 3086 continue; 3087 } 3088 lastCoin = tIndex; 3089 ++coinCount; 3090 bumpStep = true; 3091 } 3092 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: 3103 case INTERSECT_CONIC_LINE: 3104 case INTERSECT_CONIC: 3105 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: 3114 case INTERSECT_CONIC_LINE_2: 3115 case INTERSECT_CONIC_2: 3116 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: 3124 case INTERSECT_CONIC_LINE_NO: 3125 case INTERSECT_CONIC_NO: 3126 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 } 3162 if (recType == REC_TYPE_TOP) { 3163 ++topMax; 3164 if (!draw_top || !inStepRange) { 3165 continue; 3166 } 3167 lastTop = tIndex; 3168 ++topCount; 3169 bumpStep = true; 3170 } 3171 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) 3189 + (draw_angle ? angleMax : 0) 3190 + (draw_coincidence ? coinMax : 0) 3191 + (draw_op ? opMax : 0) 3192 + (draw_sort ? sortMax : 0) 3193 + (draw_top ? topMax : 0) 3194 + (draw_mark ? markMax : 0) 3195 + (draw_intersection == 2 ? sectMax : draw_intersection == 3 ? sectMax2 : 0); 3196 if (stepMax == 0) { 3197 stepMax = addMax + activeMax + angleMax + coinMax + opMax + sortMax + topMax + markMax; 3198 } 3199 drawnPts = []; 3200 drawnLines = []; 3201 drawnQuads = []; 3202 drawnConics = []; 3203 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: 3230 if ((draw_computed & 0x9) == 1 || ((draw_computed & 8) != 0 3231 && (draw_computed & 7) == pathIndex)) { 3232 drawQuad(frags[0], frags[1], frags[2], frags[3], 3233 frags[4], frags[5]); 3234 drawThis = true; 3235 } 3236 break; 3237 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; 3245 case PATH_CUBIC: 3246 if ((draw_computed & 0xC) == 4 || ((draw_computed & 8) != 0 3247 && (draw_computed & 7) == pathIndex)) { 3248 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: 3270 case REC_TYPE_PATH2: 3271 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"; 3281 var frags2 = []; 3282 switch (fragType) { 3283 case PATH_LINE: 3284 for (var i = 0; i < 4; ++ i) { frags2[i] = frags[i + 1]; } 3285 drawLine(frags2[0], frags2[1], frags2[2], frags2[3]); 3286 break; 3287 case PATH_QUAD: 3288 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]); 3291 break; 3292 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; 3297 case PATH_CUBIC: 3298 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]); 3301 break; 3302 default: 3303 console.log("unknown REC_TYPE_PATH2 frag type: " + fragType); 3304 throw "stop execution"; 3305 } 3306 if (collect_bounds) { 3307 break; 3308 } 3309 drawCurveSpecials(test, frags2, fragType); 3310 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]; 3330 var x3, y3, x3, y4, t1, t2, w; 3331 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; 3353 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; 3364 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; 3420 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; 3426 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: 3443 angleBetween = frags[18] == "T"; 3444 afterIndex = 0; 3445 if (draw_angle == 0 || draw_angle == 3 || (step_limit > 0 && tIndex < lastAngle)) { 3446 continue; 3447 } 3448 focus_enabled = true; 3449 ctx.lineWidth = 3; 3450 ctx.strokeStyle = "rgba(127,45,127, 0.3)"; 3451 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]); 3454 drawCurve(leftCurve); 3455 drawCurve(rightCurve); 3456 ctx.strokeStyle = angleBetween ? "rgba(0,160,45, 0.3)" : "rgba(255,0,45, 0.5)"; 3457 drawCurve(midCurve); 3458 if (draw_angle > 1) { 3459 drawOrder(leftCurve, 'L'); 3460 drawOrder(rightCurve, 'R'); 3461 } 3462 break; 3463 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; 3478 case PATH_CONIC: 3479 drawConicWithQuads(frags[0], frags[1], frags[2], frags[3], 3480 frags[4], frags[5], frags[6]); 3481 break; 3482 case PATH_CUBIC: 3483 drawCubic(frags[0], frags[1], frags[2], frags[3], 3484 frags[4], frags[5], frags[6], frags[7]); 3485 break; 3486 default: 3487 console.log("unknown REC_TYPE_AFTERPART frag type: " + fragType); 3488 throw "stop execution"; 3489 } 3490 ++afterIndex; 3491 break; 3492 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; 3502 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; 3558 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; 3582 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; 3681 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; 3690 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; 3723 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; 3732 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 } 3749 if (draw_intersection != 3 || step_limit == 0 || tIndex >= lastSect) { 3750 for (var idx = 0; idx < f.length; idx += 4) { 3751 drawPoint(frags[f[idx]], frags[f[idx + 1]], true); 3752 } 3753 } 3754 if (!draw_intersectT) { 3755 break; 3756 } 3757 ctx.fillStyle = "red"; 3758 if (draw_intersection != 3 || step_limit == 0 || tIndex >= lastSect) { 3759 for (var idx = 0; idx < f.length; idx += 4) { 3760 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; 3783 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; 3799 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; 3956 var drawSomething = draw_add | draw_active | draw_angle | draw_coincidence | draw_sort | draw_mark; 3957 // 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); 3962 drawBox(pos++, "rgba(127,127,0, 0.3)", "black", draw_coincidence ? coinCount : coinMax, draw_coincidence, coincidenceKey); 3963 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); 3965 drawBox(pos++, "rgba(127,127,0, 0.3)", "black", draw_top ? topCount : topMax, draw_top, topKey); 3966 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); 3993 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 4002 function 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 4022 function 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 4042 function 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 4062 function 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 4073 function 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 4089 function 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 4097 function dumpAngleTest(test, id, t0, t1) { 4098 var curve = curveByID(test, id); 4099 console.log(" { {" + curveToString(curve) + "}, " 4100 + curve.length / 2 + ", " + t0 + ", " + t1 + ", {} }, //"); 4101 } 4102 4103 function 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) { 4129 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 4142 var activeKey = 'a'; 4143 var pathKey = 'b'; 4144 var pathBackKey = 'B'; 4145 var centerKey = 'c'; 4146 var coincidenceKey = 'C'; 4147 var addKey = 'd'; 4148 var deriviativesKey = 'f'; 4149 var angleKey = 'g'; 4150 var angleBackKey = 'G'; 4151 var intersectionKey = 'i'; 4152 var intersectionBackKey = 'I'; 4153 var sequenceKey = 'j'; 4154 var midpointKey = 'k'; 4155 var logKey = 'l'; 4156 var logToConsoleKey = 'L'; 4157 var markKey = 'm'; 4158 var sortKey = 'o'; 4159 var opKey = 'p'; 4160 var opBackKey = 'P'; 4161 var computedKey = 'q'; 4162 var computedBackKey = 'Q'; 4163 var stepKey = 's'; 4164 var stepBackKey = 'S'; 4165 var intersectTKey = 't'; 4166 var topKey = 'T'; 4167 var curveTKey = 'u'; 4168 var controlLinesBackKey = 'V'; 4169 var controlLinesKey = 'v'; 4170 var ptsKey = 'x'; 4171 var xyKey = 'y'; 4172 var logCurvesKey = 'z'; 4173 var focusKey = '`'; 4174 var idKey = '.'; 4175 var retinaKey = '\\'; 4176 4177 function 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: 4203 draw_angle = (draw_angle + 1) % 4; 4204 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; 4214 case coincidenceKey: 4215 draw_coincidence ^= true; 4216 redraw(); 4217 break; 4218 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; 4250 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; 4332 case topKey: 4333 draw_top ^= true; 4334 redraw(); 4335 break; 4336 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 4379 function 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 4443 function 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 4452 function calcLeftTop() { 4453 srcLeft = mouseX - screenWidth / 2 / scale; 4454 srcTop = mouseY - screenHeight / 2 / scale; 4455 } 4456 4457 var disableClick = false; 4458 4459 function 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 4474 function 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 4490 function 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> 4521