From ff14df88979aa5ba692c8720d3b8a49829425c77 Mon Sep 17 00:00:00 2001 From: zengyue Date: Fri, 15 Nov 2024 10:44:43 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8D=87=E7=BA=A7=20g=206.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jest.config.js | 1 + ...-tsx-word-cloud-word-cloud-1-snap-diff.png | Bin 0 -> 179221 bytes ...loud-word-cloud-mask-shape-1-snap-diff.png | Bin 0 -> 102613 bytes packages/f2-wordcloud/test/index.test.tsx | 2 +- packages/f2/package.json | 2 +- packages/f2/src/chart/index.tsx | 3 +- .../f2/src/components/guide/views/Tag.tsx | 2 + ...2\347\247\257\345\233\276-1-snap-diff.png" | Bin 0 -> 90275 bytes ...d\345\233\236\350\260\203-1-snap-diff.png" | Bin 0 -> 65893 bytes ...-\346\227\213\350\275\254-1-snap-diff.png" | Bin 0 -> 71522 bytes ...e-test-tsx-guide-tag-guide-1-snap-diff.png | Bin 0 -> 10790 bytes ...tsx-guide-tag-guide-update-1-snap-diff.png | Bin 0 -> 11857 bytes ...4\346\226\271\345\220\221-1-snap-diff.png" | Bin 0 -> 15042 bytes ...1\347\212\266\345\233\276-1-snap-diff.png" | Bin 0 -> 80705 bytes ...6\345\233\276\344\276\213-1-snap-diff.png" | Bin 0 -> 31136 bytes ...0\347\251\272\345\200\274-1-snap-diff.png" | Bin 0 -> 57906 bytes ...x-test-tsx-sunburst-render-1-snap-diff.png | Bin 0 -> 117540 bytes ...33\262\347\272\277-smooth-1-snap-diff.png" | Bin 0 -> 51021 bytes site/.dumi/components/MultiRender.tsx | 6 +- site/.dumi/components/Pan.tsx | 2 +- site/.dumi/components/Pinch.tsx | 2 +- .../{5_0_pendding => 5_0_30}/f2.assign.js | 0 .../benchmark/{5_0_pendding => 5_0_30}/f2.js | 0 .../{5_0_pendding => 5_0_30}/first_render.tsx | 0 .../{5_0_pendding => 5_0_30}/multi_render.tsx | 0 .../{5_0_pendding => 5_0_30}/pan.tsx | 0 .../{5_0_pendding => 5_0_30}/pinch.tsx | 0 .../{5_0_pendding => 5_0_30}/tooltip.tsx | 0 site/.dumi/pages/benchmark/5_0_next/f2.js | 71498 ++++++++++++++++ .../pages/benchmark/5_0_next/first_render.tsx | 7 + .../pages/benchmark/5_0_next/multi_render.tsx | 7 + site/.dumi/pages/benchmark/5_0_next/pan.tsx | 7 + site/.dumi/pages/benchmark/5_0_next/pinch.tsx | 7 + .../pages/benchmark/5_0_next/tooltip.tsx | 7 + site/.dumi/pages/benchmark/result.json | 45 +- site/.dumi/tsconfig.json | 6 + 36 files changed, 71574 insertions(+), 30 deletions(-) create mode 100644 packages/f2-wordcloud/test/__image_snapshots__/__diff_output__/index-test-tsx-word-cloud-word-cloud-1-snap-diff.png create mode 100644 packages/f2-wordcloud/test/__image_snapshots__/__diff_output__/index-test-tsx-word-cloud-word-cloud-mask-shape-1-snap-diff.png create mode 100644 "packages/f2/test/components/area/__image_snapshots__/__diff_output__/area-test-tsx-\351\235\242\347\247\257\345\233\276-\345\237\272\347\241\200\351\235\242\347\247\257\345\233\276-\346\270\220\345\217\230\345\241\253\345\205\205\351\235\242\347\247\257\345\233\276-1-snap-diff.png" create mode 100644 "packages/f2/test/components/axis/__image_snapshots__/__diff_output__/axis-test-tsx-axis-\350\275\264-grid\345\233\236\350\260\203-1-snap-diff.png" create mode 100644 "packages/f2/test/components/axis/__image_snapshots__/__diff_output__/axis-test-tsx-axis-\350\275\264-\346\227\213\350\275\254-1-snap-diff.png" create mode 100644 packages/f2/test/components/guide/__image_snapshots__/__diff_output__/type-test-tsx-guide-tag-guide-1-snap-diff.png create mode 100644 packages/f2/test/components/guide/__image_snapshots__/__diff_output__/type-test-tsx-guide-tag-guide-update-1-snap-diff.png create mode 100644 "packages/f2/test/components/guide/__image_snapshots__/__diff_output__/type-test-tsx-guide-tag-guide\344\270\215\345\220\214\346\226\271\345\220\221-1-snap-diff.png" create mode 100644 "packages/f2/test/components/interval/__image_snapshots__/__diff_output__/example-test-tsx-\346\237\261\345\233\276\347\244\272\344\276\213-\347\272\271\347\220\206\346\237\261\347\212\266\345\233\276-1-snap-diff.png" create mode 100644 "packages/f2/test/components/interval/__image_snapshots__/__diff_output__/rect-stack-test-tsx-\345\233\276\344\276\213-\351\245\274\345\233\276\345\233\276\344\276\213-1-snap-diff.png" create mode 100644 "packages/f2/test/components/line/__image_snapshots__/__diff_output__/line-test-tsx-\346\212\230\347\272\277\345\233\276-\345\205\266\344\273\226\346\212\230\347\272\277\345\233\276-\345\255\230\345\234\250\347\251\272\345\200\274-1-snap-diff.png" create mode 100644 packages/f2/test/components/sunburst/__image_snapshots__/__diff_output__/index-test-tsx-sunburst-render-1-snap-diff.png create mode 100644 "packages/f2/test/issues/__image_snapshots__/__diff_output__/1835-test-tsx-\346\233\262\347\272\277-smooth-\346\233\262\347\272\277-smooth-1-snap-diff.png" rename site/.dumi/pages/benchmark/{5_0_pendding => 5_0_30}/f2.assign.js (100%) rename site/.dumi/pages/benchmark/{5_0_pendding => 5_0_30}/f2.js (100%) rename site/.dumi/pages/benchmark/{5_0_pendding => 5_0_30}/first_render.tsx (100%) rename site/.dumi/pages/benchmark/{5_0_pendding => 5_0_30}/multi_render.tsx (100%) rename site/.dumi/pages/benchmark/{5_0_pendding => 5_0_30}/pan.tsx (100%) rename site/.dumi/pages/benchmark/{5_0_pendding => 5_0_30}/pinch.tsx (100%) rename site/.dumi/pages/benchmark/{5_0_pendding => 5_0_30}/tooltip.tsx (100%) create mode 100644 site/.dumi/pages/benchmark/5_0_next/f2.js create mode 100644 site/.dumi/pages/benchmark/5_0_next/first_render.tsx create mode 100644 site/.dumi/pages/benchmark/5_0_next/multi_render.tsx create mode 100644 site/.dumi/pages/benchmark/5_0_next/pan.tsx create mode 100644 site/.dumi/pages/benchmark/5_0_next/pinch.tsx create mode 100644 site/.dumi/pages/benchmark/5_0_next/tooltip.tsx create mode 100644 site/.dumi/tsconfig.json diff --git a/jest.config.js b/jest.config.js index 0dda7e94a..1eacf9ec2 100644 --- a/jest.config.js +++ b/jest.config.js @@ -25,4 +25,5 @@ module.exports = { }, }, }, + transformIgnorePatterns: ['/node_modules/(?!d3-color/)'], }; diff --git a/packages/f2-wordcloud/test/__image_snapshots__/__diff_output__/index-test-tsx-word-cloud-word-cloud-1-snap-diff.png b/packages/f2-wordcloud/test/__image_snapshots__/__diff_output__/index-test-tsx-word-cloud-word-cloud-1-snap-diff.png new file mode 100644 index 0000000000000000000000000000000000000000..e5f03dcd6e57dcc34941b415f0a47cc3c2c5245b GIT binary patch literal 179221 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�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

l@`$h|Tlm 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 OcxkHXqKmKEJoq0_F9CW0 literal 0 HcmV?d00001 diff --git a/packages/f2-wordcloud/test/__image_snapshots__/__diff_output__/index-test-tsx-word-cloud-word-cloud-mask-shape-1-snap-diff.png b/packages/f2-wordcloud/test/__image_snapshots__/__diff_output__/index-test-tsx-word-cloud-word-cloud-mask-shape-1-snap-diff.png new file mode 100644 index 0000000000000000000000000000000000000000..0ead188030c4b437ef86f2499e43583041cd6612 GIT binary patch literal 102613 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 { style={{ x: 0, y: 0, - img, + src: img, width: 300, height: 225, }} diff --git a/packages/f2/package.json b/packages/f2/package.json index c7b29b627..905782ef5 100644 --- a/packages/f2/package.json +++ b/packages/f2/package.json @@ -43,7 +43,7 @@ "type-fest": "^3.5.0" }, "devDependencies": { - "@antv/g-mobile-svg": "~0.10.0" + "@antv/g-mobile-svg": "~1.0.0" }, "miniprogram": "dist" } diff --git a/packages/f2/src/chart/index.tsx b/packages/f2/src/chart/index.tsx index 0aa0b1bec..3683bf9a9 100644 --- a/packages/f2/src/chart/index.tsx +++ b/packages/f2/src/chart/index.tsx @@ -7,7 +7,6 @@ import { Children, jsx, Ref, - createRef, } from '@antv/f-engine'; import { ScaleConfig } from '../deps/f2-scale/src'; import { each, findIndex, isArray, deepMix } from '@antv/util'; @@ -76,7 +75,7 @@ class Chart< this.scale = new ScaleController(data); this.coord = new CoordController(); - this.coordRef = createRef(); + this.coordRef = {}; // state this.state = { filters: {}, diff --git a/packages/f2/src/components/guide/views/Tag.tsx b/packages/f2/src/components/guide/views/Tag.tsx index 834e7c3c0..664f9ca5a 100644 --- a/packages/f2/src/components/guide/views/Tag.tsx +++ b/packages/f2/src/components/guide/views/Tag.tsx @@ -219,7 +219,9 @@ export default class Tag extends Component { return ( diff --git "a/packages/f2/test/components/area/__image_snapshots__/__diff_output__/area-test-tsx-\351\235\242\347\247\257\345\233\276-\345\237\272\347\241\200\351\235\242\347\247\257\345\233\276-\346\270\220\345\217\230\345\241\253\345\205\205\351\235\242\347\247\257\345\233\276-1-snap-diff.png" "b/packages/f2/test/components/area/__image_snapshots__/__diff_output__/area-test-tsx-\351\235\242\347\247\257\345\233\276-\345\237\272\347\241\200\351\235\242\347\247\257\345\233\276-\346\270\220\345\217\230\345\241\253\345\205\205\351\235\242\347\247\257\345\233\276-1-snap-diff.png" new file mode 100644 index 0000000000000000000000000000000000000000..65c62324924967ef76684120c5f8ad251609cd91 GIT binary patch literal 90275 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%0AOtc#?exwK*l17=%%0tXnN#n9c}h@DaI!9UfD#+ z7qO3afXP#g8CAOYW31-v5+yo!7c)z4|5b9aNoIou_B3c|tQjYBZLD(Z3ugVa$6+;6 zS)GSskz-h$`_ZBt9;|=ecsf94YWBb8f!{q z_}Xl`Gw6XnmF%int-~nMO|s?pxxMW-Ka6#_DR)O14B0&u1oBgwD0yqkWzHG$t>o){ zZ7vrEB`xzTV4!Z6tki|*M;FtV6jXC7elllDI$!V02d+;_Z(D>YzH)3`Lrz|}!Olb0 zkLywHuecTYO93KUyiKUdxxFeX;|DWxn^p#E@-6TVa`Jl+h_l!WY!i1ZVC*mo3|e45 zF=!SnMN}k%>TMOFXS+2;hN*ol>$($cn@a@;=peGF8tuIwyM9^$7n&5&5@5 zs$6R7eZmx2{#79XwDX!S(Wec0(Yb408fLQlS0GH+Y9>&fn%9RdU*WZ(ejSRwJ=Mv$qK^?d1YLZK~RxbRCuS)g^!9X(q4PL6CX%RZ{d<=`La-IE>XX8VX`y#5$t4 zNoM=jrV)9zv6wg2+3IW_Eu>$Jxvm#$VpIGLus99h{g{BKm&sh(=&=k-TF#7iUVwz; zcB{ir>gRO$)6i~UHBd*ZW*K^e6;Vr`*qM<_sQoZj%8pEvHWO1*9y5qYPz;oP1m^fG z@{e0`$pM}&x8?X*V_^SLw0>#j8-K+SQPCACxxH)Rh_d%KB+OfaEu zG`GKnf)j9&NTkLMMSght3Asjc-vM_+aDnV{SMyCJA5gTSut-1Ns`qbvh&V_N)@;co zhlE$IbZFil?n-kd2d|wyP9ZF>TTM4ti;KSAcg$T&t3@~^AhenDoM};xqb^RUSp!l- zyPEUE<@v__0vmUIi$bUV96eh^$M@uuM;^a(s%YeqU*z}g#-3ix*7lv*AvPAA@<+KS z`hpJdOKeYEu>LKWV`iAj0~pfk60LA1e6oSpJ(}Nl9&|V)b}T1aU29LtOYOBK==hu- zi$jMFdG_3$9IhjnAdy{;qrn*5kM$>Ih=&%mmiZ9ySnN{i+mdLbl0n)_;Mi5}E1<%b zf1|?BkFKH2@a|UJk00+wXQrq7k%KGAmPfFrQgn{V>{??)6^$l=*aTi1P=M>>DJVJ^ zl%s(}8+z}1nEEK($i%J>=-nwvP1elx1bjWYsgT;;n=p)iJro#dkBR2h( z1HJXZ{}b7Np2%+Mb*x%#VX>gGu~E46I|-)ac_Lv~GdSP$d^4=+YcvylZaxU!vwHRF zl>EMv9U)}RlAgWKuQ@IUHId?iDc>NmhBw&COCjSW`7z|%lEut*e?Qd3i23To1`R%u z{EQjIklTLsS-4rEk5jY3Y>6EhSN8>A3uk0yW|nWnFjMrtlvF17aSOz`n`SnwZy2~k zUb9q_RXzvzcv*1RthV)yn_H-m*ikFCx!;l9+SUGeyswT}-~$T8~f}cQr9X zme0Gh#x_L_bDkJ@`0$%-VC>%_>u)cJTC#ZY;=AM_SxO$+IIieO!nUhlFHG#p#FWmG z+2G$!!5LofQwt+q^U`7m7j>aMELLi0XgmfjARBvnKSuT90_&%CjDuJ(okuF63-8D{ z#lCd!5_zcugsE>P00iZwo-am#H4HAU*(wuatJT`UDkJxY))Nys%c{7jDx<@AybdU! z*PQYT=2@!%z@9AYjmwdzbHN=29waLnB>1RrC4=SL4ro{hNjS^}|JC5>Ovnyr(J7D%UVai^@wH$0h)u*cx{$zFODo}Qir)vaOv;r z!R6GdK1>cX8szj>?bxViYa&f2du8d_N`zuC zq6Ex4?@~}+`U2->nWHuiKOk*WwE51MwiDRo=t%>utn{`o_Gjoljw5fgN3C8x+=wmt zAo95-&#P0Clam47rQ3Hmr&+(awdLwAbI{fs$Uo1Jx_H;8os#M}I*VrSSgIIk@q$CT zp>yG{2wER>TLkF2Ga|mZ)~5)D>sjpE!M1XqcK)@#jU5XCV(PGCkHjx;8*kpci7YsD z>eLU4-X}`;sx7ho+76=%8vkibB~qdK5{JWad2S3=yX@`Tdkf=$QS!($Ey%&;WQIm$ z=Mz4kzfvm;IN@{&rSKh?HeUCtT25Z~C}sW7oyD?674R*#3AJkhYtJ>XP5Y0o(TvK? z%Tp#doLtC|H;fP#j@i=EqVW%k?6U!*EG6dx zDJ$);x7W3Vcl#HhrcD)!(eh`{o-F`n)?I95<^$i&wO%=^`a2^9W299C5O(QaMX_<$ zvm&()_@Z6`xF;zZz-ihjqG6}7dnA^OI5{5OI!PJdbAO! zv*`e<1^TfFvGE8of%Kj7JF_-hz2i#{^@C!Y_txIRNKktB%Y!SrA7ETu0I(-Zm&Jnq zdc;G0PUIqNWb_Rk@y*i)F%DP`^xE{!ARQm@s(~}xWv;c@v=(2G`+s8ioAmp)h@oH( z+hi?J{@WdMRHPeyb;O$7p3N9l_X}KgEv@y{n&b?LlDX4|nLohLgZ^1I;OYo(D!4>O zGg06p`yvagh{0hncb_!(kIpq~$Xtk!&FVze)YLTIh$JtitrRJWo5hZcj)-QvEka}^ zfuR$<@cn-72CKjls|c=&id94@iry6pt^*HnPe>rnM6?pm6+}msI^Ock!XmGe%_y-A`va>yk*aFpDeZ zOy7*Pj-wb%_aly$7}ITNk!8~H&+Cry8vu7sxKx0^2QTsHR$@$SyT8Sf6J&pXe| r{WU;*K5N&8_Ys%PHQ4%Jd*c*=berrjmi96Kq_qTlujk1PlC`;BTBU>0s*%|vTgk+hrXJ01kC$c0FLdH%*vW;EVBxK)B z*~XH6d+zc1et&<#b6wAKJx^DckI$Iqe&6Rl=XGA^b@8k_4W90P-mKY0)>iuwFu@X9aoW?n&K-8 zW!BDHZ+p_Ey90d!y)+YLKRS}Ab@E>GQOJb!Z`ZL>vi<-5 zmAMw~oq_ZD_b=Z^@aF&g1RusY_n((DaPR+7`tLv3uDh&@`tLu;@KU1L{GXp_KDhQj zA2mfS@PA;Dscoy`mvn9l8@kSGwqReJIa{*%x&_}SCSt@XfE{d;FuS+0C)h{DnD|+r z9RAkr46e|BH{%6klf_d}Z`QSRn$&W5OF>9vg1n5J1D%RrLiWYQF0xX}{u&U55??zOe z7J}SJUQ+U}#f&O2a$K2E_k+PVusG_FAd_O%dW-ym0&2u{4ZWx~DEeW&1)qlA9IPEY z+JnmB2Bt40Mr6liM%2f`8xB~>nG@)iJc7yU;QROQe!=XUb)?{QBVUQzN23Ei*VZ0M zJW3I9(HeYCl-ersY-N4D;Vr}PSbV`U8^MU=P^Bzw?l{|YB#H{%^-PD6L4|=%Enz0T z1uXVNto^CZP`sy?SD^i$AGvFeY4k*i-t8`vlao>s%_c|U2szSz8LDd;UXbA;+ z)$2kt;?6GNa*Q5{#wXX=a&2j8ayWRBl#Y!K^)yiRmU&>k9-bE(Gr^T4v%Z_Og_b84t z%;5_R89L-pSv+@`_mrYh^)qwoeLA;mZWq6|qqwO)n-q(XPEpl0nH=48UhBoOkE-0C z@yYNaLkKcG%)MmInvGsHC>{B>ot~F>BZT{dLE&qhG~rZRz^V_iu0a=q{eteOk|}-| za(cnGp*ll1JZ5R^>`F1!DRP&j-|wmtSlGz9dw5La-pJNscjM^Dh?g|amh3cDI?dAz zaohINVoW}9Wl%ndAQ>7s8N)RVJ>WwcdRO3NI1XrtI0cTwG0i5XiD2cj;pAe>yP%TA z?v%jF(o(#K>Vi)L1B~gHtZjRYrKz(PsXejQyicSW3dhOI@JDAz^zY8j_0{L~m^**| z{5c3gPgOpf{2KN?fVQqCKOg6TunQxc9+e;?%}=M>U5mHq+&Orlt?ud=lUy^AK?oVK zPex*%z_}Nr{(f3!IXpbP(m;NJnQ-2cT=z zurTkOK9i$T?23;n+djjFh4Y$yT~51+DS6bf!)<4mS0`n|&q$I@omu96I^I6aRm#Av z3eYOkgp;(h*5x=nd4hWB=;C4*2#l@6sKd{=Q8yop*|iKF*^arj!821oJl5-dKNeF( z!+6l|G(2|c$hvrvOsINTq+KRksg6f6C^D##C<^KkhYq0dZZ(k^GI=+{DNON&VV|SF z)0_SlNxzIHn=OCRL&*gnO@I#n;vQ;-Qw~IIhj<3=gp&9w$tekcRHrohkZp#+c}?Hh zCB*A9>x}9QQkG|4x|6DoN2FCo7d<>ixB9me*fKC7?@uDs5zR6ZGc#RfWvE5LT{ z9P^y=AQ&R*7kxA_CMpO927q_gtUvy-V^d4`ZWWWIFK7*7Bt*A#pli6zkgqY*&V{lVb$)@89gpO;h38J=~_IAwO|&t@J~jr zvttFY_A@rlYYO5@h_e*T?v)R0MqClIrpzK{`>?4`G@Efzz-#^*J69JhOUud0ap?}7 z2}ALELxOHA02Pvrol7ZB$@fV&%iZG3BGG-!W!&f}T+lxH=!Bd#yV1kfYS_J?GyN%4;#Ka@g|asSN~xw=`o zx#ayaSA~trKJ=T^Y9RUvsPGT^)Rn;}6KxP|I#O&}-DBc+dqWh<6|_gpLONpV+-O~V zB0M$g5sVowix#)XAlG$p6a7J!q>WOmmzX zw?C*LN=X`?#T;A%aM#H81rBd0MQdOID7-`Lj03xw2HmM^`NJ`DeKi~1NUTY263Xq( zrA;cIjyo7vd0c|NHD@|JrgaOX50M$mWFh0NIS{qQ9ounw=!XfsVb%{IWRh?lc(NV% zR=GgGnN^uJ0>GF)6Mo~{HV2NQmd#chafM*LaHZh$tQo;g#m`71`R3tu!6X_&V)34G zM^k+Mw2Z)x#EL6ChG*cUNK;Uqdk74*cO}NN5*<*RpYL$tdxRJ4J!xH-x&Dq6w&0#K zgbYvWgpJ&m4Xj1=AP}nl-6ltBsz%P!_BoG;Dss*MPfM1`7E=7=a;gUR{wqdB-#Fva!Q0;==*ht6gCO_c&`p(OV+aE zs{RhG=hsYg`<~Rz$`>ocuW<)#Sl>FG%X6Ge;9YqAA?OC_%&nQ|dr~|h+^KJH2hsXF zjNBFt{yxtalMM4>%7z1|_bV{F`QABy;)8A`J+v(xLRSnP=rGEq=lv0yQCZ#kofDtY ztf@8Y(~%|A{e&unhyj2+h;BM`6p|j1s|cd{iWBAv04g%#so&s#KmzzB+>eYAe{39q zjGNR?qF?|qe*b^>^TeVd_y>;06_39~Z_8c`x}d)!fyEbL6h03JT=>HArCeXorO=?z zk~9OA{aem4Ev=!Uq2I*0lvtjqhq9!N9f3YHSJf{ZQUPp-%e2mWQ$~Mh#W5|TNz;6I zY-N0W{Hz}2>Kh+OWI<-+OGipRHU_+{gW#^fbJOx#-D6PN#Rlh)MhBu=DeGQZ9$=MO z+E{jT0><%DpF8j;gF;CusX+jFJ{h(#Sq6mzR_Bl>{3uz-$2|i_>=q1?!v1^AZshQo zD{%^`RPw`Imm#MeXY6Gi#(KaE2S-Nsi~$T|DT5BM81I~ih{kS|6XxqDK>lo_SwsUO z(E)NAgA%_Ax=s9E`uQC-?(OVMlIaIgZmJ?sULSipw~xg=uaGp*n{{c95aEae!867D zqN=lP3L$?9j>WKG85dj_bPHqynII{25r&j-Rt7_&JAf~cJqYSIa^|WW7A#}h*RZtY z;&Foh0L^W5*75svYMcw;bCJ~We!0O! zUTI*;M8tN1Plnd>zF0&OGtMj#eG`4DzzNh4caj-GLqkcS39tT%N=*~bgJ#>=_S}Pz znW}{3XY>0)VRzDdWUUv5ubD`DZUq=uG3Z~l^x{D8ES0m395sevx}^zb9v+SGL1NR^hJ zo*wn!hLWI-Q+sL@Dmhl1R1xx&i8>=H`}ZqYT%ZDSsVA0$e0YrHh(H)++-fnq3&8Rk z&};xN89h|aE_$pHiT~zd28KCKi6V^Mt|FY#JA~))+8D+m&(T*iEzjYxv8PG$^}(uV zlL=(OqZ|>lgY98jk=7gRR?b=4zn0S3J1d?(f#;T%mU^z&lWt+vZ zCP!hIN_`dH4hC;Ut1sua1Z_C z0~&_wte{1xz{T3Rp{%xI?QTM1?Pa3S5Y&thAJp09?Mny)dBzNtajoatTL3GGd4Jf9 zliw%Xeftd3HLs%8ok;8b&*HO#)~v@AzfAZUtE6!h6+-M+bpEWY6u$Rczj^wGVfu7; zFK}RL%HpY`qYF(-*$}Hll|`u*(G8Ns_ucli7e`M0-M(uy{K*q-w`Nsfi0UIJn)cUY z>yokZ&Iz+HG+yQ6@@js6Rw-*^8}MTPfTf);>eFI9Sh|SPv!g2IT13q`olv!;zWbv(KPDAFUy~vk(#mRNP<5k7N?i>nc{EPwe zAba=!3mZm+J-TtZan+uqkuzrO0G!fJm5Zs&vzo?2cCQ-$f#(St{EiV_Ze6I4&hPG2)P4;LLI`qm%jIo&?# z6t12q3Rn8$V9gp(SXj7H4GzG}y>B+1rymJu3S1{lJi_)h3KWuxknb~uSHVWEQIW)m zpKoNp!f6PdVrRS?2R`qsN6n3JrRRap&MP<>8JWOu;!g;M435Pr+_C|6exPot;k15n z9v680cNlH{6Cv6b*B38doG|0VAak61zJ7k9MI+9x!YP#b9qz~5OG`f-YQHW`_FqtU zaKMQMTi&u6Lf2Zn;~gFETI|9-t6dw84OiOqt90l;70kfZe*mRL1`dV;Iu3u7So?;O zZ459u;Lo!CY6)cL$3jL7-dDD>yK7-oIx=MKT zA5kjw!weko9D>L&ZV(c5bK3_J6C0;ie)mttO!VMF36l#ZyKVq%)@L ztjM77-MciJ>9yswGp4wpOuCp%Z7uaq{$+wgx+(A&6q{_8Jk0fNN@;jLc)iVLP$Adx ztIg^00jYP#dkFqZ1&EgdHQn0B-d_%r#UvX!WIT`O;^N{gk!0#8A(~1)Yf_mLo2shn z#(CG7u1?8f?-o6dNhm3)u_SJ&@LU@+L=?7gswEuHn|n=ep1?$=27se60--5UKS`(? zJUllQDw_)6Xb1rVd@=@s(gZd}!C?KFOc5kXfSTLspeBNlg;}EjR8Ex>#2~%IkDlK) z+;)Vmp9DyIuI{%1{AygHNYaLif(NH=0y3KqZQI%?sI;kUw>zJ zNRw!urpNWum8wW5$+0TmbPG6w_2IS;QPe)(gOrcib3W$e%#UD8@eN1odfkg#*8v_` z`gCx5`SbN}zx&TQc90>ici-BQ<)b12gct<>2lP1{$Q1|z2?i(K&Kkmf56&t~069P! zlkI-4ya0tBtumYpXo7UrQ@$&|xT#8hHM~3`Z?oCFf0<9yAFsk<{ug#1`z>>Dvt|~< zpI<>~`-HsDm8;{x--1j0+C|sHpr^KPKn^>;vcEIwHT}}5#;oD-(eBz!{FnJSJg7eg zj}NvfH!L=k>R9TMZsO}I%&s79)eIOx%UlxKudlS1X-c%-FbRYf{?M= zvI;|$7*+mjnr1OxT4f-peKjbl+wSu4*;lfCsE~Qft}B;-W1ajmYxh%_UUa`3FUUMS zycf88i<&Z;EGe5hGJ26e^D3`i^`jj+_S-IMj*!0R(hiyjb@I6pky4h|SJtuBxgs z1(CTU40fLl{HgoaIYn-nJvSO1poZvd^d~{UJSr3jF}QE_%G+$uU}8OB154P0mp{D_o83DOKahE zdGXru_JcyC&$~R~%Y(BlnRz-dXa-u2SuUm3l{qSHzbSoh&INN-Hj%H)G>;KuvRnSy zzrqgph81s)7jq?EQ*9!+6p7~$8d1uh(#_Ryu=H+v4Cw9MfHpLQ?}aeV)z3`$;nNZi zj|#a2Qz*4u932m~`U6k50g}(U(|?b-9mqtvrc(+3QG^&#;_p?oH+jEMd_%I>H?s;- zk@#o;0_XHGi1{&_l9~4>tbl{aHsal*`9Kc?egDJwq+(a!bUBnZSzmNix|H49Q+eIf zlUIdymvd%rZya&yMytbJ?d3`ua4yGo;Y^Ns<~mh-R^m zig1`V!Ono%0Y61|Rl4_Op*i>g^@jgSL<6f5$~S_wBL=vk1nnZ(4rq0ZDui}HY>6M< z9H|=^xTCzdHB%rgENppt&>z@PuFWsoN1Rr^R66%T&MEmp8fMvqDp$Hwy)dzEC@c?w zA7obY^boib@`&-Vbc|D-}%{9aTQR ziqLS!ewS%c4rxtH1Ch?HA*6w}T1bQ!O88rgn!CgbGS zc5Hw-b%@jTNv9)0ia0-jPk>~DqwwHQM}88FR02g15Kp52Wt9Zd2yLDPwGp7+AbmQf z>6VUAxBMeUyD97XyvV5B=9%R*woOB$4R7iDXOYXU_4bIFgm`y_rxl6;cd{In_u0bb zT8^>1@TKoDIinwhqdr5&;L7L+{E|<8L&y+zu4(rbO?*ZRO5|sGA@l~n{{9va)~m)0 zd)9d>8@#u$7j1X*rO($g&pRP2at_{!H^2UZK2fN9tVPV>>G_{RZ($ng)ZSOs>t2{S{@623+`4(^=h4~6_?M6t z?>AEP(iRFnZ{?qoT=iQP9Btm-kP6(Ex-6I!HR0AmXF6&(RrjdG60=;AsV|7RIN>?& zQtIU7bf^zl7BfH{p??E`P?)zoI~T4r^ysBPDbzJP156EJ*i}J*eu`|rcstN9SX;KU z(2}6&6pn(P_dU{)fHe~G`7D8v|KGUBI$H~rSC46p$09i>;RDV2;d|zuqkbiJTp7OZ zE;eQoqG;xcMDDKbH*}4wZ;I}?U%8^vJbUf2b=Kmv#U;3@$;$ZIc!aFuqhFM^V%SlB z2jBth$VD$x`5s^Rn@}E%iHixSQ?V9b0eih@=8Jn@9r)PIZR62R!;<4jY2=bWW&d_Y z3W40w+S0mnREiRS+?F;H$bN`LH$B7^c$mXHp?W&^@DP-n7@>%0XWg}r$~v z0TOXd5dw_7UFosdbpfQRv#;8y_1e{nJ+p3k*`2wu)-U!J`odrM6yM+k*aJodj9um= zC8NSxlslW1x*O|xQB|LZtIw+Ge10UCU2L}ss?_Pr_^K|o)P=9|Pu)TBQ{H#NjD1$h zDhsZE4!AMbm%n{7u4kPfg`^mim>paMrTzi^l(=xKOkS~(J1$Z%Y4&VjY;4!7(!Tdl z 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 literal 0 HcmV?d00001 diff --git "a/packages/f2/test/components/axis/__image_snapshots__/__diff_output__/axis-test-tsx-axis-\350\275\264-\346\227\213\350\275\254-1-snap-diff.png" "b/packages/f2/test/components/axis/__image_snapshots__/__diff_output__/axis-test-tsx-axis-\350\275\264-\346\227\213\350\275\254-1-snap-diff.png" new file mode 100644 index 0000000000000000000000000000000000000000..e8067d33454e94270c04354a099d3157658e7fec GIT binary patch literal 71522 zcmeEv30#cZA9o8aXpyC~N|SU&Qd($n6D?Fiw`f%=w2~ApQ;MW$L()c;tR^nl#P4zvr2mR2TPu|JVKB`@S!qkLg*?bIy6rbAI3R+fUd=BVC?p!qZq- zSa|gHbT+ZDu!q2LGZzQ^My2=~v#<)v>g)Wv#fSC7eVe0+bx8!;P+I=LzUnuwa%Eoc z)nt~8E_gbl_?}8A39^)y+)?*z=Kxv?KfT44KB*u65qLF!Bw;B&1vg|9XM|0t@nCA(sjg5E~3`=gocB&NujmK z4fscq-L7lCb?esQ&8r!IZG%sZ|JU)HWAXTZ)t7jF8~-nPJz5V^7y3^tfEsDTB!Wf zsSLk%_k=nvPHPtG;vO@bfMJLH1O0EYEYt-(=FdBdDDCnzUSu4!F7N~x5h!m}YTcU( zhBJb2*>~>_d<+f__70S9$n)w_=$U8BMG;dRiNiBGVCN_*Dthbg-ICH$j!1Ehma=_V=*&$0ZkCXoUT6GMKitN9?a&SjlJ*v*?uczJovEi773V&;ZVb#`{9U>r+j z_0P;p!)$j2&ptLw*%A%9vu-hR24RrYkh;0;!_qc=}(y13e)GaR4&c!wjlu0nI#r?!z5 z#I7ANpE@dCrbU!tI{Wb*Ww5~QZ*MB}#m*(O#^$~2 zUtP`JVafL?(W7c$b#-(RiGUuAzvesC?Y~1a#amF`y5P~c8{GN?_~Pv$p6Q$ijZ`}h zp6dvSFO=N2olLuN@d_^rlt7q%QL89-+Syy~9zTlJe3m7`;TBI#Wlp zwy+rS_OgmpYf0=1N}g4fEB;QcIk78}l0FnrF|iM{CSTHM8ZgA4ME4*Ah1M!M+>ret zqj#1l#-CqX$nzoN%`~18^1VrB82=Yz7wB)T`?&~PJo#FMi~Y(Zs$hp@`8S3(psXT7 zH&PrXxW1`r;x-!_C(V>BI57ybM|c3G7**-8H2s!cF+OK8$qVU+st%5#u@7bS)eQxV zV?!`T$ZhhTn5c&e^h@v;?$=;?l^Eya4iywz&x}<>uXD3wse*oD4E+JUmXpYB2^sFO zI-o8_#UVho_DE0m>b0P?*aHbqYKEdZv977GUR%gsQVFslz+7Dt(1v5h&LZo=Rot{K zcv@TJc1MygiT?3YHY^O4y~OuEFF+9eR?N@#d}vgJ`TdyJ_L7*T9PBBWO1-QDp-k&%__&(|0n>3Mv zsE?)faT6z3P_mRi0XMEQ=%Ey;Xrwy@L>z*5m4C|EOoR@{6m72cnlLpKM+orUY3b=* zlPM~iFwiu4G824Bg)|T{W0R%6jE_{x$m!7)0f&Mw@@aF~e<8rnKRrJpu@`YW9P9D!fJoGZx|q>e5F4?d$-S*O z_`JScE-W^6@Xe*B@q`u=(l%PvW^A4x(!+5WzHbtnmlcg~+Dos|l~Xx_@6%GzyXVro zyccb$9q5`(ekh~a8;Y0M1ea=MH`aPhSuhoS%&9urpUcuAOq&Zkh2k{r1yTW~GKi)Z zl$UPPG4JH2mes+QrR1L$YYcxg-mI zJr7+;TWwWK3)c3s!WjkKx9!2vU+YTOXEFLqYxag2QzUyrXTv2gcnz^2^bOMRby-dl zY-U?i`5#EI(&Ay5a7L{9oX9MRyPV!7O!8lUd1Q!$Q%|V8+%zH!oPl$}(2{t&2zi5pN#?O0% zoFZHU02`blPXl5tryuF1BAA7gOkVN-%(zL`+m>1Te!MHI6Up-qhFE zziw&@n3IFFGrW170B$D?@aeLOD0JA(7XkxUzQa+^E*?IgTr7M5r?B|#46YBp1>=iQ z?;HT7&1H({-0+e#&;b!R#bcmT%PSqTjM-FzWRZ>lhbcXuZRl|=%aY-xte!+=w0EVY zrB!~KG}T+W$UCV_S<0S`l!%8;R#$fPn+1xXqru6^DY44)ZADs8mt0xWDsSu84GokT z9>@K7p2qBQcXzk<^&K%K{sL9Dueo<$(G6H|PE*rD-T2dNrlzAF$_a+DHJfbx{YRJR zM=q+_^j6IFSGd(b?1#H{%^PkxvZ)X{~GF@WKmG#w~F(w8A(#TIW$gy`NwwMlxJ8YW< ze~Rl|lrKRI0|Nuu7>(2o>*Kuxr@}2*^+vB6T=(m zJiDhUdv?^x!0X6?dg$2epzrkcpWg8KVFEFWq~XU$999QFN6gN*fvk{MU|H0wue1V*3^FlK?Bv@*4z2f7RHvH%1h5+K2TQi3g(AXlBZc2z1;&5#LLipVfK@eFrc44vDv}@OvbTo)F>w&tLUD~%a#3P(Jq~4?^4Kvf1 zRUWDZzcQDS&V6}21*$?b(z7s*_g2JjNPpqwf1LS%<2}tJBdxB)d;@y%@=zD}fWY&= zXl`yE!LLEVs?KFlpSW({U2t2-n(2T|lWf_EU! zMUms}+qb#He$;6m!3YR+5{X26&`1v}c_c~adUjMzPe@2eVNFM{arwuOA6;GC-Eq?_ zk#=rS!kA!&3~J_v-yvSLfMPL2dWDf58}Fas_7mI?i2Vs}Kf&!Mxc%hZesXR^kW7Y^HYKS}1{~^e%?`HtbE3R#SBZ#KgtjK79D#$DU&dbyF%L+q?Db zk{ZPHZ^Y(Hg?a7u#$+0GpTN8-Ym9!lGIv!>jzNQ%x30idC~r;1z~yVzU(`Lbde6{S>OeHRzo|OH=v`mSQ=-;#;Xq<-nYh9 zf*gpv!=1Z#z5H`6i?|!4k=`XGCKlx7<_?<@d7b-uA4%YDgU{~@q8Qo;=tN6FGp-U? z4|PB8a0y?RyVwnO!2& z7SuR zN)3%kj+Ke&(7d$(>f4*E{>!nJS$#Tv6@h}#sH%pB|EAd`R?t<@xN5OCIUGmqTM|`{ zStNLBJ7}8KQmP3Hjd$=U=d^$Yz!#jE^p1$AxHU+{#;;u-!mqgi`FqmgK*|QkxnXZ}Iu1C>0f*{YMDBSNaxvSN3Hfm}Y(I`kVj)G{uUIe-+I&jsE=!>(6V$cOl@I~GnL+I~~`y6HsF3P^w7ailQ zO}FwjNWHx47sYVQK?=Dy4!o}#D&AstpS=vDkb2M6Chn8pG9mQ^CN)Z@;@1j@Nk|a3 zC4uGLe>LN&l`B`iS$xcHRfvZkOWaR64D*Jay?hmh@p0n_7!13>Y)tRTzca;T#av}A602Fp;OTIVnG zW3F`NsRYjb+fmrB3JCpRp|#cQk~9E_MaNo3;Y$M+t-%p!8=nKH^)+z*26xPt#_0my zX(#I?&+9p)9z7#1EzS5?YR-CqIk4b3;qz}i1JB_>u%!or2hwIzIC>sPA z_|>&A%qx}-YkOXTZz8xi!H@O2LhFpB$67YSQ?u9hQtdL&02ZAmkg$t70n`q3voD4_ za&hGs0PiFLTW9$E3XQ@NAhXt_0RXTVNMDg?_3GW-TI-Q!7v&L6fWpC{p*SEL*FK$B zw!w?tR7Hz)5unQ1(^{&r97t{rSF;rQckAh)G6Xh!eSPVG((Iwi?zm$a;2s2qVAIb&mg?j2@y*>dCU8B9l)xUyG_R<1F=CL>?)pJ5{c4~wDJB5*_V(U< z84vC)oXn>#T)0q}y6D~-u2AL`u#$hs>qgun#|nk=Nm$DtvvXG!ZIWi7BKQS}5eM$u zdW5dnGxQN=!*5$plbE2;P^gtsjT6_-F{JmTV82$+)spIe{lXJ-;YFe`Kssb8%>GcVO_JxR&pNzeJm0pTZG_Wuc6#&d+wZ}WD;aJ8!9 z4zdQ#VQB?5Iv`Z*FfdC@Kv}ORkc){1hlcO|boI5AOs8Ui>!<9(M6VZ6!}Kl}<_#r9 zBU~9k+#Zy1++sXvvKp7Nzfga}pf(Qjv zW8)RuwOT8pnujQHxywd$KZ{Xk10c@7%I+2mOr`U!`*T$OMNEsP)B9dhpxLnfZ&if0 zM>|p0@pq&yKkvU`*S>;;y$4pQsoifJZnZwpJ|{pF*bcQZIVm34$T@3!iEr*Y8#4hZ zQbLQ`2McUMT_OYRUflcG6_d=z5v5a}G z0tTUW4Ocd!*6KRo#dqHoPD)PJWKWJk1Uhi)Fbnj>CnECN3$I3z)zj4%fUx$wk?k~| z9hJ<$(Al&%mm=VyhsdiUY$JHOyb2y-UFGe4hQy@^H}$Tqt?eba-es_P=WIjHdwM+V zot!#E@UBoxn^SM%J@~H7Dl%r|8Vt)_vjAd|_j-d6yV#m;={*|TTXCbR1$L)I{_xG0P4 zxAOJ}7GL-g?_V%-i!BT+52*Jf}-(-AyUg9X5QD4GZbbTQ5h% zz^~xSpOq_T4d?U9z96If`*bDWUR+Rjm~gkR zC^qa@#9p8Y&etA?zYRAjvAsT)ERmo#u^F!NF6zgsDvC#n5Ie|gXuj&=v<3112$h?i z%i9gWX+wS>NX{aT7c3{j6rwgG@9IEh{#Nu?D(w1h zb#X!bg#aAQtf)VUM3Jb9c+|>4R--0SQYc}|bJTR=7VI~`i}eIIpd8a{(f zi{NFIqS)F?77R2C)Sy0%Nm-pydp$grd=li$wI&5PAQ=!r-wlmO7#uVL33LR14DJBD zUs-g_81!n2?A8Ev&49=HCbPW(4{sF~j?VCjyFOm0)piU-?e>yz!JJibzg?fxQA940 z?{hK~7$=p|m2H#*3~3D+Iof8TSx^coFTFax*M~A4zZfr$-C1UQ?#HPAUP4!KI9y_N zhkLBdZ4MDX&D4vW-PDYn`JIA|{=AfH7jyGzA^~g=_kc>R#m7Zdx=}dP=8{1FKDk|B zj0m=`>+4scx;gM8p0`X2(Rno#9OwtXWkh^L+=$t`Jxa!DzAQ~f15&Ir9+j1G$K|E3 z5kTVoT-@CHV!_24idX*$EL>wJZtR0XBeE#AHg-tfZ$3%HHN_c zwW0_w8PbEYd*|iKM^L>TWHmqq@L~_uL{>#qu&qo`NntTYRd;}hibP(sh;iJguuG4c zP~;=pVPvMHc;0U$u%)xw>>I+dQx}}qT2j9E`Mr;zdtukFxh*H-T7M!B zx!ef;>^n2fX9U^Ae5(jNx!2E+V(3kX{Z5hPDb=*kyYGI!-c8-V^>pk#S6!=GF}<^= z9n^N!?*|4a=;AK=yKIdcHZBzjTg3IBn`h z73uMHPij(BLIPXUI5eU8Nkxm6Oj&hC$ z&~{CpR^w+IkgqrJx`dB;-SP%s`P$4$pr)xwy_`?dpHyTPRSS$5#0G>^0lB)Xav_NH zmbo0cMG*Hm#qsVoNpAg|Rmf7F=;@7-I{a%ldTBMVV#z1Y0~AV}-c6nB!9z~Xr->0&f-ET9n2#$A z6;F>Re&g(W_oyEsMkV0`L$-(U)p#LWsjr%NyG<`uy@GDbBOR=(%X4=+vq6J78Q6^oZD9@ zYaFTxI&2Nd{tEVvBNEN-frAihZTCGo>ZS$*8*}G-gQ-s-<#h{67s`GGF_A?9x!eXk zc0zZN%y)`h+;!IG{lGzNeIw0tA|x=s$)5sho9Itv9;y`Uui);dRkU!4&JLA)oCmBQ zDo?&3GV)c7n{0B)tpV-FwaDc(wt)PvjNyN^~f4NF^lGuUxe@r2Je37?H>lw@ETz6(5&g4UsYiTFBPn>N>Zj`x>$QJX;6 zyn9>D`P^IN%I>8h{JYP+-B6>{%Kt#&~F3j62;$ zPLB5UXXuZE=AV~5#Ty4HrI-c zo{}LO*;fc6hZ3*|x#n7SgK3T`^M_qU>|$*Z@yEw?KbP3;>!>{b9ksz`f*8pO-rn9a ziQJMeR#zV8*XDU)$tC&1utt4Z7Wc$X41mzq0eUm+aYbZ2=yfa7h~A^}y;2n7TG|lI z29Jekmw!t?A zn5BTey60NZI%Gn!s@&8?qssAjM~;14B%fPM7uB5*A|GwNQQY{e|gM0 zBlOETEI+_DO6%*jKv@9t&VhrLG4%4-lW@gIASMUHtq<2g6YmMp^7NwAMT{r(1!Bx^ z{x+@&ZbTV|*#p;+=Mur3_vxU!0TGuCutQ4P&2yJ{cSQt1C*8DZ+dlOl@L4 zq{*#+d`ZD z+AMMeYem^SMUin711$GY#e_L^7|_@k#4sEXk&)_uK%QVPs!~x=p$U&81Sjf!(r23% zUGn{KD(RGiTJr`JHEvjnX+6M_d#2NZ$5V%4O~e{5`w8?~p)28k=WbTk=Cj{K652Bk z=jGy&SWX`-h;(nk;2*4*QPB4U!te$TdV!`46l3QX9UB6RKPb^=06(`zzZ&F7PYLsA zkRfv|#X*zG4aP`E{B$rzCW3}i_E^hO(6rsl&Q4(^?H!n4@ti%}%!k#>sD;!L;V*ZW zsOeL-M*ZHMV@$u6Rt9W^7;zN9Gy#lOJXO%M#VIjY{~j6hMzt0zwF_Ddz5eoj2WGUD zKt4_&M{M{TWK7Cz*<**a$iZ4fRO|*{Ak^wh_hCVGi{JQ3U!dO>qrESI%Jmpi!2Q3QFIrT$-WSK4}bjd!Q(1{l$DiLjDlQm>|XEj{vQ9mqR%W0uw0bx zaT1gB1b~oN5PrmLJMsym>Hb|7gq5e;C{zA#(0OV)iQK5m#*Kb_TTh@WYhC?Ev|q;Y zu!N?p_;W@F%AMiCY+R$?NIl`L%-wA_*MSR0bzmB5bAbE=bBN;0WDt{rm(>u*Q?^LN zJ#SxjpmY!2+YJ&DWLqx9O%X*5E1gI1nmw$Dg<>aU+W5RT*KbzNdc;|7rJC9SFHg_@ z>v*yB)5y8Hdc*6wx?v8F1h8`qC%Sr+3>+-X1GO8V1{lH{zXuXImY+9RI8$JFQB(Fs zgWJm4bD~KiG{d^a88bencLYUorWAX|L{BHTUs*9&YFDf;U-#Y(UNl6KKhz@{5oI$FPy@O+rPEF@N&zlFbtTEWkX3|SE-O}`i z=>FFUm5%a(9RL}tQ$ZEL+9R|RU?NDzsjStF!LG>`2FA*!tyWf}LOu^0H$hE+Nu%H^Y#by7l@WEd9)mOQ za!|CGF9fhFM||SqflZe~JboQO=hJ%+G*)13VmQY=^v^Pv8-!(KIuY@Li`uD~f@M+X z5Jox%idz!vik=9-A-y4%ok3`CO>l&iJFX*3Jq+@uaa|N)&BxC|%07GZ=FM;Q_axY4 z&{qW+%lkJoGc6ABJ=t5}ZfEB%ti65fX5vw(%%}Ks!yZWbYXi<_Vh7m3s!HCinWECh zz2n`$L7Vjl^^;d8r{NE&2hDJ;w}vuH4zL}#j9=V0WjV~UuGB?Fk7qr;Ra8V}BPZs| zL~Zx>&UQWfRAjCgnHZTUr)dQXjOQ1-DCdK#TnKcgtE)>susYY5Z60`C)?ePG zDP?TS4R3Pc*}L`NU@;%@inB)#K=E({yvZJe>&0gD0;K7f9~(b)dBnO4vdg4{;RxKa zE!k_q^J4W8@VwCIIl8K}f(`N4oe7BM!3Sx9=)QWW!`|0_T9(pr@1ehv@bMxHQa|Ej zybw76n}j=9b%SO&Y}J%TE^JsBJ00!HPNlPKn?d(!6;2)&e}cqz(+e#N1^mzMqu6G(s7#Uf!h$n^uVAj2@N1}Mq`jonWqDt4Lmq2L;SO9mB7Fm+PMS(30tj?Tx z`*Yy&KLz1L#5b~6Be1cLFL17^6moH3WEAWVBsPR`S)DiY)^v5WEI4eqf;C*yLmMa= z1D^N?oV>gS?1?kI*TX~L6EdixtgJcp1X7vA==`suN#+J%QBNcB1NBv?Et=_RJ5>3< z$3C7e&qp_J-0(A*UE&R30c_LlCIb49I_bFDdq|n}fNZio#{f(~>I9x{7IX$lR?4E; z(apW%bz`Gz!sX!z^&shYo{x^NyC4sKvOx&@7Kt8!yeNXu@S3fsjnNCSWo?HLoLMG( z{4)L|m>nPA%F6QOu>?0Qwt3({JA{|&76SSPflC*l2CwlSg#qLiHG$HRxJQ2Oy}6{gwB1R!9&OiR>o?5257v0 z|9%u^=$Wl+7@*;01x`hKf&8URA~Kg}txhd3FXs%e1;K9~14OJWEjJuXHJ9KGO=Ca? zWMBfDrYq>qm>{w*AfU)}cF7JU;Up$r)hLPJixHRGRTz}(0aviImxp(#ii*?OARW<7IkPTqtSONb+48r7~PgoOV@^@+M2`nN80s&`*s+ zOO+edV%a~2+hAYW>y4p`WsD~1lJL`LCuz-#iKM<&AG*8m8P@o%OU6gW=#6Du8$+q= zmv))Nw{MT&+#DPZr%>8tC`%EC`H`It4(;IpQc{3OCbMn8bNmQk5tx0Q_2tWEJ?@`v zj-aJ$JyJ&6cz*S4pS6H$buRlMT7er-4K{nQVM+1i+}A?VqpY$XQHg8{nnRVP6`SD+ z?cRR}el_g{DeoviTTUq5e+>0^{pL^ah&D*DdnA4gc#bu0eh8R(Nc;=lFInK!*ufyZ zeXw3ac#M0+4M_&Q=B0zfjGEAlWTte{-rgQug6Oa#7#!5nrArsCHMzkTTD+OTU7R&a z1K)sqK;*L+S5|6i5q>#lw_NzR5re+~hjkueGdONNw5VwGg)hHclsA%o&!akLRW>uw zj$BX zI}o|zRBMocwks!C39j9v4de|;7zObi1?^)}4N+I0k-~8dP$09TKf*lZM8YmLMZj6D z0?q|QvzIXY5vi$bpy>3c81*1^-v2DVjTEgjjiq0)|%!8%Hok@QbkLP9Yl|Q_E1%qW&lj*zLoFu z+?>_LwV068-`@{GHw!@u4Pijc*~@h-;=JHsUQp6dSgTYi1B~NQ`n{oue9!+>F8T^j z^F_$=si%iN>a`Tb|0~2qpYVS|17q>w)2BPQ%*(L&lotQqw|?%mtO z$mG#5>Y?n2i@d4}z#Mh@T(y`AWG9D2Brf2KpvF`-T3I3K14I;^nQDmiuFx235G|aT z8ju4AhHZP__^4|#HJ0Jw;Sdtk1tP~uhB$J$rW4{jZi25BQ$VSzu7;cmXTTc9(0EX8 zrLg%280So~q5cRHPr%Xq{*lr#mir%6;`9^;O#3vf(fmKM=rkz)Nww-80_u&ADX zJ}Fy4AJnL{&BCG{QeUhgBAVeGr-_P{zplH$Yuw4tuU9tgpLc*w%V5Ez{U<=zAo&v8Ja9BnfvB$4M{did zpm$)0f~gSL8?{|Y*f2;IHNQZ(wQvsPOqtp(`NjOA(nchnV@U>|A{;F%W%L7X6!zTt zpaDDo;81gZ(KqN_83775*_iXi)5Kaz6Vu7MwD4=<1VIPZ|#l_eo>Pq1eYy zo=oem$_N-(j6~6abHt7G^qBI-@h08xsxFurnkMT(M!<6d70kU~-oO7Vt9lniBhZ|* zM(VI5?ef?wJj80=J&bUW_mDJrn-1JQ<^CP0Sh zC=F}hzP2(gPAcm%HtOR>np986j%{*teZllNwFe3C*MrPYS}fx1JcywNAbKcJ*axBJ zi@q#(@bl1%1d=hNYY|k1Y)Mm|9}l!5qDGya;LU#BwVp2sas41Bt7&L_ba!#_n5(t>XJ@KQ!#4{fY3bhQaKKC0aT zyGs8BUGaFl1qTrxRe1A^g8fkYbm|l3o;b>>I2Z;Fze;z>T>|#%QTr@Uw{N$q^|h+~ zm_O1BmcTeKD-vvBC*PSPS6-Z#J_I{@#*Hhqe&y2gzFX;Ch3Q>`(qeHA2h3{+tZThS zVosFbR=?48FrzEaU;h!uyzEoZw3!zMm_xV;=;r$=sx6j_p&2nM88?2;J2^MoEYA&JSx^Mf^*`8n$(PMVN<_QYtZk;l*03V zXruxBWSUhPl1`nP6M%$pAA$p_6SC3k*Wwqy8Q9p|EjM@ir1;C6yXJCH6Jj*=T23SC z`f(AIXsBfN?*k^oEG8F<$!Y&qRONSiMUTS-m%zy#d1VKC-A)J*g(j<(AW^U&kVIOho z;tVlSQOY6QZ61m=w!QtylVhwl{T6y>9}4kd#z97RKmoX|Is6eJj>nZr(||d-dcmy^ zA$o;UtmOBwH&vHU@wrwAaDGwR%|^xSEuV+5THzfoFm$JPEt3kWZNE*@o$_aQh(bhxXz`IzS_q!$Obqs=EPc}IIedA?~s5SvNX(^5zG!DR)Y}1vEy-uqKgCVVc@^`u|O|Z@-yN{A2C~>p_S`ZB!0h2!Y)AXKa zL29423%Hk~A3JK~%4mW4HfQT_MC*t>Y#Tt}mmvgA$zuk4dDt#f!srO5wmO`+yuW`K1gVs5?^QET_Pld4*^m`9wQ9#ReVsO z7b+BLopPo}unDrtYH6yg`<2{8E_le7s7!bQ%F@Xg4m+G$z=oe zt8&{XmBa&0?uFe%PuL?}LR({0{zNTXp>)c)O7S5UHJx`l^V}4KkBfVb^#EQ6h{@J5 zG8cVQ#+!tfv}hgXryABMr8OM;^3Kozrh{UuD!R~Z+#A2@Nm+%fk{BJq4a?J>5k@~^ zAJJd4OM+@aTSXDZQbz~T>B6Y%xAbJ2RvYYq3iYG~I%Z9Agc;NgEx7)axX)9w(cz`P zOL=29q(i8#oG_jq8KeAj*{`&!>g zx2E=ZQXf=7st{=!dw0MtN7^BDT)?`W;s-m!^T9H(aBOa(^X!zTn|%cLxLFv;ot>VM zp=G%=4(m8+A^?~!%X&0^-rM*n3eBLBdwP22jQ>(Fp~}>>AiZ-K{gaMSk0tp055J!~ zsVwV4wT{!1O0pmfZ7-1Pi3u|f=w)$7L#fcLi6jZG3YWX`N_Hw8tQbGxKutE{oiQ0mreUFA3z$45F|JP$Vmc(W_i)~^0EJb{x6`9~oNl?#u(_mB?1rtQoSkY+>3EMJq*A zTb5=y9W!mfpT@e3-P$C5szAFqo0x}D?p(duuwQ0tdY3qh(@Ezbom>u84(p9@|M33( z`v>#WM}$-_!IR1rb#-;NkQPjlDBHemey@lf?E0JD1p!>=Nxt1KuCBdW!9Z5O&l&Y4 zV{r}21Q~$Vjm*>c4|G{dq(k~vD%`2{ijxd+zY=>z zacU8A-!3zUTQYHzOlA;doXLkU95pWi=Ve4)Btx22_b8P_qsj;NN>H06#FxgEYhhss zVsM8p?ml=c^z;FKL%+?mM?EL(4ix~27HTFclr>+2YPRteQFyZh17$OCHYC$XK z6Xy%b$Z)jjwv$V94M4#pnqYpmOfP>XR=*g z+-6f*g}|J%m*d%xzN9{Y%yv8;Yo;o$cbTuR(Q|T|<7x9?R_8%ZY!9a=RTx>gB}4jQ z*{+=p>z?E3Mf<>At9fs3BBZa>R_l0GA#fP@w2_!5QE~C2)QwfSE3$OXU%!4m^tuI@ zD40b+Qhp>EGGrIw#Ha;Si3vrdAuwZ1pVppep}2l_UQW(yKFNrL%W9X&Vy+S~~%4RYHBeui^PbPiMz4?b_N} z3Hb7mDNpvKr(30*38Wh?l<%yB3~Gy+J%$*NoV*pn$Ez4cAmn4OsJ4%Msn0q_EeKmM z5`a|_E8DoQZ_B>XgIsIMOT?9mc8w!5$M~!@y<`~ zu1ql@+V+fDgw<=1PWcvnYbB2An@$Z>B{58&jZ9UNoPF~B#7KU4;veg zrgv#_7$Hycc<$e?3=X-Fl+6IZjM9cWCjCB5`WP}PA4jA#bfgS{rTg1E^q8Zd6+Fck z0-;`wy#mQ<_vTtw!4VQ`aO$GU3;h=dxNiUnKlN&K;A%#|Wa zq#kjDa5bZ(hsMYBChgn+aAJrF+ZOX0*)QXVAebEw^cbAx4;eU~zTyEouSDd4-=1<7 z`3w2i=(GlIyeRRV-*r}Y*`-4Weu#-RvZ!oXmi3S$<^{Vkf)hMQ*RDu@@8|Uvq<|p= z1PP*81A4p;^gyV!7X1tCehk{Oc%(c^_J%bZf@A@DOq$=ld&iM;9@1-r6?C`0HqR4a<8L!20)UURhnF+N5-^K^0!THa z$2y`nf>F!mnq4(Rqg3D^eq~Ss1V4>PhU@{ZmtM>3W!*&@unrto&>W+8CV_71u0rV* zA@4s$?RK+Z%|yuFu4Y48jj=XY2V|7bU{WUp@)X1J09z=~@njk#Y9Ep=R0H8*Eu)tp z9`KoELr^EPh?TYVi8WlHS*%{ffPs}s%KijWT3=OV6Jn>9;0HCrP$P1I_{a47r+5t_)iDQ&2+_fM4_#aF-Jb*lD3A$hXMYHWtPtu!A~aJ%_^XBn2d$aZ z3EtemBw{m_;BcS~QfuDO@4hgaHHlR=R#J zB0w00JcAP6fh)3B$TGLHZ%@)|5h+DQ$~1-2FEsvN67rX2+hqZ|oQvtZoP}^HeXeFd z*qC7jgMh8T_cRAMP)Fr7#_|fmN<|k{AY*d|vzMTGX@37|r_xGh5s-xTa5aNqGmlXV zBJPkzMxX8cbcit=5RoyshN~6Q4bib9b31Gu0PBjdy&r?d(V6`}kRDMS(@=&TvYOI4_{+N>a1!YFipRcv``8;c-mef4(c8qQjx5~D zQP8#2Bj5Y6+l&-YhTP6S1VcF3oA%Unegbx77?SlnGdWKPb@u?~2zC=;EL@;w^w)Ri z<>Rwq(kn#R6~DasZ09~^k+`@x$o>Wz3`Hgk7^N8!hDLx*pUR{sOUnZKwzi1t5lzK7K5`%phQf>JRpOVoC~-_9yPsTSO_s z?4^~JhGio-Ky)xy-~$KLcqI!2?bR#8=m!G&f|*5iFv{i zx&<$Y~>4;J>EPd#&_8=uo5!%&{NE z5>qZ7{e51j*E)!{$`JN%T){2rw?0YdF#iK!yZ0Kw5!lc&Fog)8z20^$oTqm!UBg8H zU7XW2KVvvAvD-6CTlJEW9Xssa=M9n)-~d7u=|4t&1q}FqrcHYdyBYit3=y8;gM|0} zYvfJPDg8N(*cc&y5xAA3$GA#xkp0&v3DB8+cUuxH3#7nWbYX^MuQPi@&!Bp+&qXwr zGprelKp5W37sRWIs`7a_g7?&V@dYX(YqKT0D7!pzUmI+=kSE=LM&c&WpozTw@WJI4 zYnxH3e z7i7^Nrh!AKVufMQh}3l{!Q{G=#>5w)%I5ic}!3Ka3M@- zI#-EUF#jz|0x~kQVIPH9NS`Rya~4^c?^rI?VoPR6^`^?H!f}><>S>Jfvmd2_1H%w0=f~K< zfB}cD?biF=kMb!fU^nXrVF+0F(14bIi@XUsrSI6NzDLMk3|_Bw=!USE*Gm5;C4m+) zvtRD^x(z$Bv0I}HGi-*Yi}$oet?2JZsO+{J1*wQ)TVu*fBFc;_3C$?As?}hrLf38{ zj~NB$5Pluf>3#q;xPk{_vT`{C+VA_Y)dB1~4iw%ZgJw3I$Z1bhmF+_P#u4+M%h~@y zhfveqUt)=aDNQM4i9KB@{w1#n2Q#t>BeQ5y-KwWYklR zVex#ZG3bZ zDa|^z$tfB&H5q6?xuK|AMF7PAZXy7<;)Qs(fo@9tf zASW+!=u;c0cFVXxz(Z$uc6~7TJuKLWwAFhM??vQApMxmO_n?dY#UtEDnrI$w!gj*x zM&;Dn-FKVHZhsKpCCYtU&KF!i#iC22@k0GYN7XUMr7Ep#e-+j}H0-DO9^{63YtfiM%!wpM8ZxZdaZhj97gcF43xSRw?E9?CF-0hy7;N% zVerM-O`4rq_+NnXgtRE5?>hF>ODoa6~?!H~gZ&%uQij zvN|DK7HChKDS7H>l(vqZ^n#20lP=$ytE=PF1RGku#K(~z(wge)M;rto^37X+$4xH` zxG@zOqU|PktP$7>t-`j1R_FnESRB=PwN3Ysb%qK@DdraRzu?pJ^%86nG5Bp==HYhG ztcE9$9+_^`aeA>z+Uaa`FC$cjoPhVTG;Nd1y zqcE<_Epw35y#_i*FI_tdr>8bA(3Ue@i<~A3%(T1u3v$|i@+kj$)0xO=nofv0GU?H| z-BSQt-u)Zj*WUFv9i4!!rjdcz1q*bqeU=y&1(UJ}FiET)DL_6)VFycVb~kq2hl^Qt zFY-U&!LxHBhXu}f(bqE8+^P%i)_=V3r-_|;1tm@m;!2ND@|OvDYWfl)#SO2&6u$cY6u7sznan;uR5VNb-L?0S zkh|2Ez%9AY)N9l1wXKCDKvf9|QPF+jUwX%U7iNV{nkgxF>OX2ZludXtgg@`vO4(zn zz38jX9A0yp`FfKpfF5b6sSWS+^vt3c{?=Rl!MNasUSIiZV^UdGR<_UH{(_pS>btpL z{WNIbtH8sg7eZCDCyy5T&cg|`_(z|&kuDB_gJ9#AF)wqc9(}Ys+)ey6kkHt3(%dWdq88hMA3?G-UJ^ASC6C{vS>ot0N!c>C(S}ubPFHPHDz@B

#gTHhkm_Qa#-t|iWb3!ZRcuaVA1)2cA8YfsV;39@cdqzk8n05Z|HNnVFEt$v*TLdiN~Jwy5=jdn65e4VKc z=e@ua*Qmerbm3QMuDSm5&5a4u$1T5++PXjAzxvB(0g9M7uT7I!s=j-B$JRlJ=O4L} z-WA8BsmV0}2(S<`CNw<}58xx-{LT5|H8XIP$@>cRp!5tR4B=w|ejXlAmoTaBD}*%c z7w{ZF=%n-)B={ZiuWjSo+V^dQ8iFmxFF-cViAXW|t^QzKSnO>f`Q~356WBq#1`_bU zg}8bP6s#t9fsU?VX?`@35&`{~@7(52brSD#E{tuOgmSoHDe>z|@(%oNI9VRpTlz{C z5Lv$rU}d$Hr0=r!G@)n8>rt3zLSu(YK%j~E*XIvwkxlJD`8bF~KUR<0-L28!2W-P0 zaQu=xcBCF>QafM_ydCvDcqXLu2*KNwuih0gkB#Rk=YGNP5)atbq-cn`@|H8>+Hr+7 z=U6}E(-jq_CP?nFIH?qm*~%Z7&ut<%{#EB;`p@}eR=({_bL@q zoFRDXn6A`k5q``oiHEh-)-=q zM#tChxPjL}wJ%m9&!fmV=hNMqHvjK{8yoWKhr|Hh~a6I zKP3C7wQYi1ydIB@<(CP)V0qiD$#XTRQLg;Rfn-8olMQ{4>GZ;!FusM!{olING*mDo zAHr{dki)oXi_D1MeJLhAxxl|8{GUtDWUw$M2|}RVBudW6Vim$G+(1UaIT4X1%Itgh z_PZugU-1pRvnf)bx_)V+Z(h->6#th({kjYSi>mf0c{hE0jWd7UGAxVpS@D0$`x1C4 zzxMB0Y}r*rmXO_Kn=oW+A%m2qERlUA*=dNFQ9=k~FHx2xN>Gb(?O4S|&V3tVg?cqZey7SrL0)e?OKl|}i3yPA!C*+;m7Oy4 z=5ld`mybl(Eb}dpbUiUo83^`qcQ1m;bbbgr0p)i6tWkoyl>hK-Hqf7Ssd!wweqqe>0L4^U$ zRN85f8$T9-)aiTW_R`c@eIK=Lwib5#;a$VO^pw30lA7Q^`fZHJ{e6;_wSo@py9lZlB1@jxP~%;*Q#Ma{pM{(a`_1uVY!&0L*@GT9QMQA}e8E);Na0RvKWA1l{TG7WDKp`CCuZJ+`$=79?_ z0OOd#;z2g<*U)nsLWB0>EPzrqwcaLHeBDJO%2!}dp_O-!g5^CuJdXZ>n7EIW0(>B2 ztQ!7j;sq-lEL_Xp{5bwQQG@Ln@f$;aZ(2LtH~Do9tUFWtEA8E$I7=~we4GNvR>l( z&daOyM}@}rOofim&##^t3tpeR;o5ZlxLmwqM&*@1@Z)VnVC)pdRU5NTm9q!e3SLD` zn`vcr9Q^&7J?rl5fZL5K{*i?_8;Czns9m5^G<%h}*8lcxO*IH_h>5N(^A9exWD~&N z^tFoDjCVlhqp8RqNXS$st9T!vB6`ds{SXar9q_TKhJl2q`S+$Z145*+*=_hsR9K-G zeix3VA%b8t2n(<-*8+dM_|CpfsH`nksWZ)dK=ZNIfnklzaBXT zD#u)2mYCKCWalZz6C)q}M0>48wQi5qM&teSjMMr2jfS$DOBrV z2UI=;?0|TGaCuafL-)X*=mf{nV5>BK2$6(c=oC4gz8{OQdd#$#3Ms0F8CNQvIh+h z{H(Eq@WgsT|Jl_16zzioFRLC6)&#OqQ9%L^a7}W4+KF$R3kek|04~hh55$``$3MX) ze?XQ!#{ftv^k{MP>X)ltb!}s>CceBArvjz+Apco~29O42anKOU-{zOrp-T|<*-4ui zfd6=TlK>{EKizF8e~u~SNuL40Pi3EthV#d_mbh9ysIRC9_<=0`E>EJqgNOFWod zNpEl(4UPxNhHq(X_aR72jLIXRM&{r;vw%!aeJZLCwvcnOH-fp}8J0dV@Z!@up0I2A zcHiWe`Ie^U+%pT;3YQZqTpO$>sxJJ?@WJ%%+wEWu@%U~67`+=hRHw44X))I=_ z8Lyc7&TjdYZL6^>*l)_6FW1aNpY$OeXmJDShz0JRtPC1Q3=>TLJJEsZ-5fi#KKRrvG|S)r`iW{~xgdq&?Yi!t4g;Wo z)&@s`H5w(IKr*{ea&0udTe1MYJk_|~XaQ?^dU*_WO+IbekTl!l7_3rlfh8fjafup2 z^ZS@AVsfhXuV3P@wD}@jXg|*~vwN4(f0$7%Yoz{l`0tD&?V4`|8xAB$qduKsBzTfqO*bcH$LB&v6CmZ$EgYh8PZbdUi1+*~Mx<_^#-^ zZ#$UHe}e;^CL4e%loR=vTCmtw01(Z~e@pRM)+m5rBKJwZ$6yDn-ZI47K>!i_5cM-N zGey8Sdtx1Y;5$DM=2y9aXAkyC)7jttf+plGShb%T8?)UC!qmYs zz#6p_|JA=5UaH@9AJpLZ@0+DglQ|$7hwK>*cdxLX0_r>-5bt_K3WQ7b?PG)N4hRui z5=Z6k34<7Th!!X&*8}3$7}m^$meMncsGb}Uxm&j@e>XDM>G1CxvNXoixyo|)-_j7J zXB>ddmX;8eU~oWRM3frcj$$f2aAB+HJ{c~Nh~Jxgm~9JQyA-9-4;)JJCeKid`sR$)l%#C!<+c_r*Sgt&pd?Au-wIr3kw>v#j%SYB zsVy!xW}p7#H@e3zP1R~CqwrsuiW(pqwkg}i$?3f0FZEPIQf6l6v=xZSS}wgYq1j4* zSEv4bfF{-( za;8Qzy=zP!#!bx;DPgo>q)dyoGfc}{sxJqgKe&wT3GMllx|%L7lo6rRddk}N4kgh|BUk7yNZAw(o6xkVKIRU9!~x6rY1lC*W4%KN1K0QofT`A7!YYb z;6H&IihKSs3Cm$JXw)(WOzTS2bQ+!pYV?hWirVPiIW}<((Ln(@T*4jq=K<$&0WT|7 zaVqA?{$msWsJQNZ)$jvQ#V@qXeaBxURP|&X2X|Op?2n3timLoU!`%BCvV}`77vN{> z8Cjs1LM07xcrqLE-fQ#$%<-Ox8n#n0rf{!j6o zh7(|Lu)v|kU;P}UpPFElMc%P?ceOjGIn2>*it*b%ONE-n2gX*Xv_H7lugtqN6fEaf zeyNvP7ByTO?QvWheS4NfV5*;=Ea}i5-n5<%G|f7&e0LSrj9omTChW`^l${cD1TiAPHAZ^wMN!n)?5^E?@HQW7Y$IV z#9rm<3<|)JQB2t?*Njb$Qgud43xhTbC~*r)PY*j==@q?tkKSOZA+&kQxPSY4v*YCA zjepc6ho|GiEW+HLzt=7;pNF3lL8K3a94|mr?D$+UxVoe?WVZVJ?KeB_(8T;OKljpe zvmTll^o7Btue~GLGj!{zl7Sb2` zM_ae_FP~dc!z|0EhE7C2bhADU!l#mmUCCk7J65xR<3EN5&*D#TM^p9V?%hnAJnzjt zuWjyD$zIURYM|v)IxBnL+kKoV`~2_5Bi9&%p&$1szGCdE)2>TVocoWW^KaV#kYG%l z%G=<()l$da168rV%ZE<3)SG+tz0c>zkM2r+u-G&;v$Z9CUiX7Yk^7fQ`f{GOKB+LsR!5ZBeyP!6DM(eGBGWsS`r zV2a`JHo(2~R8V9CFLY14^h^C?BmBENzD<7})%yoH!D+G^6pH^dv?sTjsz&YQvBD7KWdN-4AAJ-X;dSb$vIIuZpS%ahI$ z_g&sNSs|}vj4j&frXrr6bT-6iO3j35y|hv97eo%5Zqa>yI4(Zk6>o;d{{w?Phc+ev;j@=h12~=sEi*L{ilvsP zvoo%_jK66VO*Y7P09#;-S zBLvS|SB$IG*{}DQ@=eDr!OoG7-+#I>YFZY#ZLgqV|HFWZP@-r>W#yDZv{lWS$80l0>ip_5!SzaQ=HY*@`I!L#w%hUPNasnoL zR&cb=jhoBPO!loH_5!Rf*z$tx-KzJzF)u-?EtsnTK(vKU(19!K(wy(-e?PPELiSiO zsu`C5Vw}J4?c4c#7g*WYY&|fpy~S3u2t$4KYjroMXJ+yL^tx2`{Y;?aWM2iN<#ixf z_fy9@CC3L`*NfB%+c@@L8_VEh8KI=}8AjL4Y9O7YeXyk12w!ZLD+ZBV;{6yPaer-2zqMyTirDVLyrGEh*&rJN`?%H@n9ibfYn0V$(v(zF}fN=oOUgUUxp zT}mINwg+ZqIAChG=14hS0XNTxB^+k}s?Q*w4k#jT((l#Dr}azcdl4>teKbY#lIYFq zJ(!kqVWzxVETO2UKc5zHt5WnAUueN|T}ePcDo5!RlczNoVCPLK>l8zr-DTczVLq%X#02 zEs5E5^rd-pcomLgv@TKIf}N2cjk z1KBvz&Y@w2(L!NJLV|Z$aT+Cmtu=kRBKN7eWvgNH0#oOd;?U}O*>vwMWBnYp*&l_R z8nm@)GMTU5YI%Lh54nY+T@}7b)u+<}hc%rw@YkHSOZQ%T%xzQ^?Z*x+8RBjqklxB{ zo}@2!>!u}Qvo2Q(s9MAnj!SD_SU|lJ+q~(7OulKf0&C&cnC7U~VRNLGma#G$8=JYA zObSzDg27%+K&CoRWe;!F-5R4Slff5#Al%}%u;bCK(}yHN7LTxSJDNLq7c`bAe4phO z)>YoX%(PA?qlLcb7@6YXe8&*FvH2g9qA; zviWT1%Mf}A+A~)aO0O8qe7d1(y4N%$WY8|eZ6Tn(!|`Rd z=2v9Ih{X|UpZ7C^bXpAv>_C7;PHFl=j7exjbChfR^68=b7AA#5AI!W8E~T6go4JwH zyDS%z$onR2f8Cc;GRm3n)(p+7Chpd3{!;y$EW)($NnO~UcMtIfY;X2^-MCaS_-3Z` zM)pT%#m$n8VQTfhTT(u@c5AoAqlepC!;~vOTgxGmkOpZj}7_NBLgpN29 zX(2C2rf&<&_pgOFM4+e?63jlf`Bq81nM|Astwoz1jBSvwD5Jbv4Am;_N_6Atyj2ou z>K1DdePAa!8A!hSyfcCD#bq}cWo26i)Ceo<_H%q-1}sM{EDo2V^zsknaCxWRx2-wT z%)rQ4&%P|0fGpzx`yJKO9zOl;VcpL!%?^9ezhfh(62Rzh*D*&tgPi4$9ZcqM@U@Bz83vH zt%5~BFJH`fTFmsaOa~5!@9N^|s=X)^u26ZmzP|oZP0gOCThWK|yMNn7%B7rE-y4C) z<5T^|Kc$#+v9$KS+ZaIFN%wjd{dQj7lRtB;;!rj99K(x=swQy`<_RxZ z{SVTKaOO5J?|HY382LCck=EL!F?)5fr`JSUD((*Ky-u_=$d4@rdA~Bm!kp-`xc$le zU?z)qwv6im^3>k zDzLhpI+bIIAasotmXwU;uzK^fRVlzTBa~Pm1(`k$3@GjG!wsz77~XB0=@bDi*`z}| z<6Ed*_*x?9_Og1n^KHZ6kc|pX4Q{s!i;5Tl>AdINW(sOBqGB8wD9MV#hDX=Q@b^RW zKNc2b^)c7-Su!p&V%JKDc4pu;3wt#q>N8&n1+|2>PFta~6U+B@YlYHvqz(2mWxAwV zA|A9Lq+mWWRtaE(f(cwB;)vryTNvCqT|B#MhHb?5Q=BnyN;zvP;p;Iy+W`kUX*q>jZi+N_Q@k%EG)Dqq<1@#&AmgkAt zrE^6Z*ky;fjG;w^IiYhIDdtis26xg^aHy1i(d*p2j=P6*b;?rJZM^ zm5tqOK63G(N%D2(_~tIyA@iu9(k$xaD~>C$?>23F8q@5^k^pJ|Hzs`hc9s+ysL=_O ziOE(jI;b{t8N~Ypg#;r8RkMWik`d?Fd1s|lF1>s;lZzzpjv?br4ryiY90FNY}=D>75*YmgMya70OiXcP9AEKMMQy)T#97jIaeF z!Zka1^mY5I$&#~YtoGZwKd302nO_}m%!uHz5pJm1`Rq0Ix>!jeKEpS%$@m`~9&rrtR>z-ZK0c$gCWw3zL6;8bPgr#Zht8L`c50e9}mN^Lc)HY?E6IAK@$sfFKb zxgX5Bn^MU@CO_{L~vTarN&HXLhi@r&cCZjQVttT>`e%l+Ut} zn`a*0{4_q)G7&b~K3KIYX)$2EH>T%n{=tLiOG{e~7sInpTGtgjSUEYJQwdh`QO}M8 zqxMvLynPU-(=srB#p-R~$zFlQ9r3!wZ>Gain{#?b8G5pI`F=K1M9uVc%vP>iOC-@L zeZPP6p~1K0Lf_v&x|dWbJ-VM?z1TD}9MGj1TrU3n^^r=Kj?}d}Fm&$5?OvM?t6zTF zxN~)KEQr4^4#*A zyPh#?g>zZ%uxxMnHS4mQ9#1DTNNF@$g7Q=8TYGI*+wN=3!yg|C2uW&!MTHj_g zItEx_{T5o(hvkH#<^$b6e9(VZ9#UOmS@AIN%<0%9$@pHcfrnpuz&-JRD1pi`z?t*G zh6~$Y$>7rE+RLesEp>?r1=a;B?h^8{e;{>9iYleI^QV~{+8UwLR4#09>NKo$lbdv8QsR=tMCW z==R38w78gWxhPH&Z3nV`{hO``r{XTAbYR4$^TewvfTa=1ESti4TR6B z!LkAI=hKx{r=9e?yED7Xq-`KNC(2i3FK2G44_}w;)|Tj2{`6g!s3#T5&EUyO>l)J+ z+n#X@!4uUiDih&=w1Zr`LHqSkGuaC;Alq(zB@Maq#g%dah$hb|H=4(dtU z-8UlX@20E!=AnwI4;+pg4_l`)AnxqWsn_R-OgHL=Y^^l?aO@OQNC4MboWHv54}rLL z_T$S5j%#ixo2G+}&wNX9-_GV%M8&UmSGd+_WwjO4(TEDLzTF-|@P4i^$J(u#`b`ZT z6Nsp7GtXyCr!N{w%&Kj0{892XyXMjf;F8Rx=BcZ(6NS82v!GyzH__|Pxo%UAhf+TgzU z$m)9LgJHMLu#Nj$V|o})Q$+=Kx5n!2u(J=wy}5SmN=3Xq;`&svwlFHb?(6;cJ!|Q0 zC@?45H7xZd_LuO`7%ch#qPDg(JdkULpgeu_AMc!s5WDSc^pvuu&rRM;OP(0(tNfP1 z51zCko5@Yb<-5Y>dX+NX;$zn($nc;L-*L?o%wJzJ?pE&6wTL~K$tzDU`4N6a324QQ zUON*OUsuj@sI;6sbvwT2qVdd!K<{!zy%$|}S!*9gjYhFQG(Z~1hy`OyBOAWtjA&=7 zW8?(<%66EYU$Dfi`1-S=iSneuwyEPMrix<3cgQ*hVPjHzmp&Fv^hR`qO=r1Q$t_N;mJ^nbfS+38)Qh!AoFvA23OF z5}N3_W2m&()K)+%=*3ljul!4c1?uQ9mHY8~@Lxx!Urin_-4w38!Dgfnmq7W_!D{6IWxv)krLSY<+NYV`%w$Gs(hz-3M`3oxIPnr;Z3S zhPd)Ak3D#hy(5&`9l zVXB8O?>V+&K1BRVHu4^9)n1)x6@L^YKF7Fs`uSk!i`M!sU4838Cc7s)O4sIs+dgbd zKNuEP{3!7Lf*!%w!t^%>&M@fw0hnEC_>?&_xxpx{rqm9F<-COgx!2(8-z(T zXGHW~O&w?#4SByMd%;pVJM3W6(thG^Ok((p5(^6>X>0EtPUr#T(n$+wjy6Gs_cJJD z=9_Tb$5=j!Jp=n*&Lf=}&MoCtt&bs*!c4b1AIGW*01zk>uBRbXkcr#{n$kN&m|(Y+ zFjeRIP)&}CxBV2H*g;>ZF&tNXYsL_XhtAxUG{Q*-J<5mdf6OZ2SjxN2nZy-H4A~q_ z7lYxPN0D)gZNk&I+pL?j$QtL*mK0nOW;ZCOg!=#Z+CnF{Oz;L&jz|4;V3KD!S zFpfWrP3lVDIgJCwA5J>z?cb`aHd^XA@K8*9yJ9?l(9A$X%#_55V@(>KADXc&F@8H@ zuv=pMIJA#B3RNCSNpE$fc8NbID4#V2nS!hy=?>5l2n>%&Fel7O60|%pYxWq)T&air zx8R-3Q*s%1%px-m)sahND1qi+o&nKiiVGxI5gRn2J^awKVgw>5TovYJVKs!s=w;=3!;HN(}L3U7(uU4G_6A!)(bt3Pa$%Gqv&37<3z~J0{anNxwPZ-%X_Z# z>qCZ#PCA0GUildFPjjJFtCyUJz4#<^5owN)OS%dE>ELg3Rf-j%?SrwsnU74sYLQsH(Em-4XQTy4&ur*QSdqGBny<5qc-Z!5E*T3xXmpOv^` znt|5?Fa^$wB3%F_q(|n;V0oHiS&;4NK0Ylu873)vp6@|JzJsrJgpEXZZZAUu>2#oW*A4=cgk{p%29N~%G=5aTM}LUP76 z2J3+pTOx;8g}#hp^T4hY15Ng2C^6K zA1PC?P~k#d(`admClC@oFYB0s3K(Vjm*BmM@rSOeXuf>@oJ&d9 zRG{i|(CNPN@f)Dz&DdmJi#vs#7TBOE|)rK3uk<>%1 z+JQ5;eY@ZlU(}t?e53PNzEq2xpU_% zA{=fSek(oh%t^&I zQN|IV?)n#a{!yCXeQ*_@K3YZ^Lb}7gVGNZ zcm%Q!=LPA&4V&`{2-t8q|Mk?HT`;?qm1*$`OI|0!o^-{wYiJA(YOMB$FP*I5OA-my z1yKbEl##D1fp3hD%z#41qA5m7!y52@fK|~B%yh-^lSv8^)yTHkSypd20HegPqe?`G z>qYQ;HLJq<@p5n~qLl;)5(3Y>&FW3OWsgHfLfLsoz(_K10fqKzXr}-J%HCXoSlA9> zjOAmfqBV^1B56G`WmvsO6^PK>On$Pt3l6SF54hsg($`5>oGb;9sdB`=q4GQ!m43Cu z)lWFv+S;~SU1(`(8S|~~cOkqRqf9aOiQQqe#sjDAvgwV|(iyM`7d9hrzItg1uY#Vy zAG;2g+2@irUmWteUP`4!us(Y~W%bzg1dz!|m!rV?!knpb8uje;1~p>CWRE<-lv%(` zcrUtPHvRfHnF|hq0w+IBOw`;4D=!mj>ba$y%ihT1rC1wxm;IC9xUXEjn%#ye+XV<} zpx4IlsRfWB4L}_CxGH5}tAY);>K@F<2fMRooK|@Y2=U#yr^>w{`9SXUSNpl1lSm4R ztf@R;;-Ab6IG_uhlFFnM_q)}jvOwAlbza*u0idTn{g1?{7vA09zigy()dLXzRNd$m z_quK%4JrNAWm-vXwT%PEbEMP_=+OrOnAr=KsXGyRe7Ojh=jP{20DjjhcE<%OCOAGd zWoL)riAP&^=<2I?4-VGXSt5jz%2VkR{PXJT!_JjjYDl>4+9oot9~QRu4dlxibzAf3 zbSJK^u6_Y|9_e`%HW%`C0!wxRB-1LQ-K`*hJmF_07fh`%CeyVgJl!XYZ<`AMJALFx zto_o%q%P`zn{>V^vzCl(>i=p5q_^uupS>7zC+lzyiFl2#g+2qn2N}DlW)Dn4Z@C62 z+%^1s8HAk|wM8H^#+yjYAd?X|I725LVJv(ZKap?&T%IqJJ~^){u4cn?1?T& z*X_QQSJR-dd?Rmj0^>WT5VnQ#JPmHKID?0>tc^PiWS~LhIASmEuwgqgCeH+ojc{1l zj}{l^sO4JNKJA7MlF{Fu;%~uwQ9Icj_L<0!FM(#KCcE;Wa|smY#_33cfsRn%&S_=x z3&Lmf-#&dJp}!^6tc?JfBZoEtb&PO|$R&N?awr*slAp%ik^L+3ppXI;-$Y}c4GdgMozvyH1!4fZ#$yos)(5E0 zLscoZNsSqKkNSE$5llKW$jN@hbZ0$2szQT05%^qKy$dqoEn>)aUUH`mJ8u#R=(jy1 zz<$jzX@OvAhw-88aqv#Mg3R;$NhBf^E&!gVpBfmLRRD+)s!n_yhsKa`P~BHONH$+O~mKr_%H&ib$ucz>XJ>!EU<_ zw-fy1^Xj8>e%rN|vskHY2yE)aSVIlVMCJvHtsL5_>$NG|J|%+mzZd@S_+N8#}u-dkc$Rg>7FQ&{y#i_F&6qZ+1 zkwDG*5v7KWyl?w?!<{bf*)~dMXko>U zj?v!aNRQco-$m-8z1gG#`f=hZP-l!qw;(!~slHDc>Xn+kkrKv7u2X8vCf%g78kL*r z=b)!H_CD6PGlFjO8`<`$Q-H)RAZnQ`FEfF_ENf(UD)ezz4FFzgLxw5Cq`09@jN120;gCB(d26NIAR zdHtI9`*<%V=9Li-iVy7PCY;43*Dx9}H7XGNc@}Qv1>X`bWYn(?CSFir-HCR^#~VD1 zlo1ldJV%#`3aKN7L;hHm#G!h<7wy9bC*_j1NU)Ub9Zq_$d%4amB&9MylwU!}$r z&LuoX>0pW27n2t(?r|eLuLghhyf81+mr_@IM5p+z?jpcz$fqyp>%?k{5!nG)cs z+n6JG(DMd;`v9ddcrxhW1n&Jf5?}`WReWGH;^%!go{5g1Kp(%gk2;$_A4!kK!d2lr zb=WQcJiWghDLn2;#@N$6f&M;U=6^i0#8NMS0riUS6(5=8LUI6B$Zh1P0x)Cz`246g z&c|3aQu>EZn-&3#k#B)I9E8)TCWZ|IuxhAw%STqKg#v6GKR#Yy&=A?YZzC0m84gtQ z#swHFjldKt?4;T?P){5(4NtSLA%AZm8p#-dxV@M%6iq%$HnCTo-h~WqAHYt&E*-7| z>$e2T^iRPE#4p5Lq9^${=4*1zR9~r6>p5Dm_18aP5?|7Z;V1A1@dLz4(kE%`V1-lb zHp*>7km5bApYkCznkih zlP0J@4jX(V>~2b?hCD;G>e;HSyP-Gr`yd+9g@)anw21JB*+mcHD+0TMZZ`uNjkYCR zOjlA+cm`sil~4;qb>dbuKTc9S0KMHY_2;9QF)%P#e_mWxA)i7sri;44r}OgU(ECZh z7^R&^)G^e`9%QiDH4ZTo^MGU}zZ7?ivikWbMtmTa+cq})7FQ%LXn!e>jhIAuD8{DP z@$*rnsX=T|c8TA+A`fnqSPl&|HBHMC!TfxbnM(j+AqtYxoim3)OgXOAZ_6rIb-?+pVv1 z)s|5JRE0%6kYH`(LUSNRQVb@2=jTDD!CUb-V21_}9d0%`mMS~&Ue-UG4m`qBX*Kn# z8Ak8q+{CUvy$feY8X|a(Z@D-Wl^2NdMP-m?ZYHN4~STGvVz%q$oHU_Ch3B? zOhw1Q;8i0Due9BSrDN(SDF$jzS}jR1%w_Y?7?w)2E^3AgM#jc3fPia$FVBMrjn zI&v9CLdi|L(Mw_@_+$1_(my-e5IhBXUvQ(Yi`_)`NlJ5+!}iyjR-3g5lB$HU?SN=! zeG6jur2FgzMmHmJbi|kst1ui6tZsG;spFaw#lD5U+N=`_1S`NI#&CG3aR3F_Z9rnm zVcXU0?Qv$;s3sbasU6pR*?D=%<^YOd1X6d@7Z`Iu48QuX9bO1t)y^+Vo94cL6(X2R zj!zJCDWNRSWXET9#Ksl4sUAN1cG6q`*#uip|69sjkTAhN-RkGf%v9(>>=pW(`t+@u zLD-zZHw{j-ItlU9W}^tIOGx-Ac1|$x<$xFTtoS*hC^11y>Q9?*?mK+A>jl9W-0WO} z5ahm&>^(kSKx#|kigyYM#@x^afCNm?91yGP+^<<<0duSn(trI+&x;qc<#}en6}*+l zh(kPMKFy#9cp?-{`sFW16XWAS*4>5XG6Ck@a2=kL^eXV&HfP^@G0ZQ2x%p*oPGi@& zxlD?>%s5n-r5tt@|J+%r+HP~%FMoM)_UzfLRDYQi1HqIzNCLez{weXKQbxag^qXJ) z;-;yodDu`r#UTH(!CA-?*c~Fqes_iuC9Uc7FMpAZKhI~MIcB8L=`-r90FRx`+|;55 zXb4F}b!FIR0yNv6fp<)8ORQg}FFOY3lZAYYYR%|)%&O4oC&4?08WA8thBaKneJ&%@ z;0(YFXs1yeQbKKn>R7;OAE>0umz3#CA&q?hKqcZ>w6PlSE53iAl5>k#LFOL6jSp19 zb|RQ{UaQ{t07x8|9nxb||Ah8oEi8Dtq;GU()n_5#{K@O0`!Di#Jr10HCc?YfH_aOeISt=Q=Jq~`d4JoMtT+vM&7en=B|jrI z`PLAf$k2Oiu{aCjjg07`Gx$~_+@7BoT7uh;+|uzMJaJeG$|-Y;z3{OuuCabF)+XQg zu|CE)yyc-x#m-F%oE_1~7Bwh?qq0v6N|LC9knH3gqvMU*;dHv?b!I7_lV1xa_9@?0 zMHSbL20bQ`{*&CR=lfS!re(KL>!(^Z4%9>HefNT@lS$nFcC#1DYkFhZ6a!FnvR-M7 z(ghaabs#$Q5Ph&S_!kEG1W-A)gjBs$29_Ktb=>E&@PO73-SSP_u09>L80}xN0wo_Z zT;4?K9w*9qTNj#t#*{6lsA0o;Ccd1&SgE|fy~}W;ZgP}!U1_RJb>uvkJK)a)xg z`Sa7-RM3Bd6{Hx5gOb^H8GiGwpsa^Ws>@EEU!1n+0nV0OZd&-^DP~sIkFr_}*7cI^ zpKi+e`DuM#@!Vs{JSLM;`{s10OXol~s4<;pl^SPR{`1q`{l#5aOFDqI5$@R{?gO4^ zaudCyrpe}QQLp~exO1~Ok_ahHJ~ zZRk?*y~;{eQ2xTKvwG<;QA-xo|6%+1XZUjVT)P@}ZPRPl2%v@b zK01-@i?3Ou`&8Bd)Xeo0C5P3<{xp(Yg0pmfJdsfcXalpXu|08m!*qeBTbo4`-e-y# zN}r?Cf?P3@$o{M`2o|A85<$^mc0AWM{rkz?2g&g3K;eVJPS^BueP9~Wm)>*o`WO@P zleJ(wAV5_e4$7L^y*+LV85G!zBu24_Ss9G)oQ6IFDZ$BOi^jRnQP8Zdx;{*?D9JWc zgB^Gd9MEC~8eQ1!aV?vsLG9uF_D%EzME)Gt0t6_8koMV-g6AhQA%`#Jpy>26lYTjI z7&_JT8&e1bXaud1pt=_)cN^nC&1C`D&QA0%CyxK+)sFpg;#E4oyxKLjmik!adzeqk zjQntHl@3B_)g_Z_TU1eO7@sR3sl@eW8<*t{)J{3hnD5QfPKkW_#m)#NcyvXqE=IVN zQ2K;btVf9_1K(uOB8p6~?67oZ*euHzL(*~F_3O?DfIK%Jup61#}fX<#GuNeKPmpU1L!HhE?Wx&>RJI7aaTXwGr6h@pSYKrpds zz#Rw}>Y_iMz$eTDp7TNqKJ(iFGh@KYaC)Kp2P)q_Vl?W1)RI|K57xPQ;UkOxZy8Dz z4~4NR)FnY3rQvkE_92q+CT<2M1>%A+LsUL1r#)`w8Y`y-uP_lZyoXOXRY?a2ZNVz( z*f`)I@YpG5oTYOz;D6yB1p^=`ID6OM+Q48g8R0%iqIqIsaQ>f(Ro zH{7X;vo>3sJ+Sptlqvi{Vrh-GOY~3LB7V~L|46@)uqzO_q9mub4i2BbCCZ&ifzuB* z0|+8Y4LpvY{NzNJj;GrUY(N7TNe8wGn0~vU7-2jeZ+a;Kf=tkXv63teaeVs1PzFq~ z7?D*h0Rl(%Y_@0EtPgBT*-Z-YO=7^5toR$lP<4v=koGMgKC71OPG4VtU%n0m_j^iM zDSrKZ<~)$R(KTz$4By{5P63%uS>2`$>P?v#6iSa@tEoRTf8Myj4D5IgC$pzHTd5dG zD~mt!oA0HBJ{$Kx^#X(f`W>Qyi6NbTGY?By?Hk}wzh>+~4Ik{WA-KGe%72+W*EwKU zv$VJ1MIqS05$YW&ejmY~pL~Vzu6oHGtNok5dd0ZEI)vhlPIbvmHZ|+sgAJRcFkUk* z083&SiGrz5?w?LJJ!Noqj8ZbNa{a~lOHjcOQq?F9RK2OeA@o%LN=3~MfAwp9{_27d ztflDxiOElEAHtRLL0jUt*q_$J%?#7=Ugff1M$sCQNjf=VM9Y0Rz`oH0h!Z_juZ>mA z02V7w$19FZklLhhjMM%<-H9p^3L3(aYt~vW_OGa_kSX=0BG|P!wyGts(@zG%oZysI ze*Tk{Z@a`F=}Qkdf>IIZD4@_?WaH54X%*S3ya7+`v^mjy|Cs7yMPI5x!7oAf$fdG3 z#rDx>YF2EzW0Jdfje-@oW1;n7Sd;(-r2K~)f+{tBXn9kE%5+d3CVOdRbzsQ5O8e?l z=G6a>PPC9Mp(3fW^T*##PWu)<69V+T3?72)j3Tgdc5I?c_t8ss##I>z6JwD%V(=zk z7!;GqCC(>&cQcd1aI91tq%>0p$LD$g%@9>Y2P2_&8YltB;%^PLk7-DvkkeBPxn(-e z4;YHftd@^SbRokwz)FO{dlZn+L6ikBHiC#&3@}5lzbMuVxagql{Wc@Ih`HGnjK0M^h z6MKju0k&u5^)XKJY&aad3`5_BLl~!`b8=4J=WNY%Ke|}o>@mjSCJxf^z)zg5d6ERG z^d=*Q_Twb|`-jD}vW$?+R?oed)N86wrtX+<#^FR1n%1OjmQa>utX_5(Pp<4(UeRqF zz82#-KG={ybWN48629<4jfbaOo*so-A=evpy{^uPN-WOUjyk8eQgpLH;29ewbkieE z{zprGfeXTCdNmh@+6G4|8~EFz$8G5k*+t@-!+GFnCpjniM_B{|&ed;V#@A?6MZrEl zZqsIU}oToK>ZT?4CQ|vHd5N35z3x&y($Ea(zakyQt%A6Z6SC9*BqrONV+gqfkpWdYF43 zH3Ix5M}A^>o3Y0K>(wR_d(rNBg(LM{ub*CI^??uE zJR0IAftw|nyhEjGXVNA*3kM&3XsC{0JekE>c%+N^DdB(>Sk7)E2DA7_2}xlxDk|vt zX?C7OhEZbC^Q(5BMZ>1E2M^fA#EP=&E}(Dlg8_{7FfrC)ogdpuJ0EAZ+(KiVB4zjN zX;)HJCEj`{;`NgUr6~TjY&ATkJcnwA65vj}tuint@QFYlD#(+F<3G61bn_){Zl1XA zzz#c{AM3RJq8`kcqQQ|;jgG|`y!fV_yR%ghgK=;+iN<=7+L`H5iZ_TE;i}|h_DAk2 z6I1Z6Sr+96)-XNi61Sj*;Z+fyxSqg{Heygx!-c|_m2F|-;-~{IRQ_yXQ078)Fb6!WW6Vc>}a zxrfu92i+68`IuZ$)UGB%2(dr2tmu+9+sf{Pk@Pxfdd!^PD#bMa{TBf(`EuiWsmXmS zp%I5ahsLkfp9!8(bpIyi`3-NJvK?ibe>}%W)Qz~Ku#DH*CT{S?VWfEE<6I4r7(sIaM7y9{Cl%)bsUWU?5Peq%9B!_##Z^$mgP3!gVtqx27aWB~k2h%%==vT{^QE&(GOJL8}kA)fsrkPVtq6*ER~(8?))&Hq2(hHNWw3Ehh1% zdz8jUea0C?w9XQ;WLp)KnBJ3HCnPcViZqlhomq@ktqvlCkEN!5*Y#VN5)?a~S{kq& z#ryD%^cVk{OWXz>n|Tr~jY*5y8p{Fr1UaMbny~|PJVLBq%032%N5T1)S(G^^s~DUC zsn2!r`VCThE=0)mSEbd%gf&*1I>)_qJt0NgJghG{Qj#x)sBY7N#QZx*c zuCGsBJJvKvVDRAD;Wt+eVNj5+#3+KF&7lfYE!JnAG)ciq8eYU16r3e*_E8{bRCqr= zHRcEBH#nrc@=D!>&Q9|j|LZL%lx{Ny#2S!xM^mt=$oUQvc3CKU>ol@5LEbTu13R*#XXyur3*BnKQpi9gKi9o* zRc%E>U4DbkKzfC+AUAA6eblIZSQ#pVrRnBhJ|LytX>wE4g9VQfU6w!BpFmeY;ydDS znB8rDPx|HD(s}pmVI(bvl~&IUJ{0V=?wCh2LCi7{7fywh3kgR)+V?L9Y>mh-Qgvi_ zqvEP~2BuY~KT%(zerih&)%oAncV*0pbo8x|HR^rMo(lH7w20SbSLd=c;7y11^YV6o z({3U)mja$45nx{*RKGvzjnf8js(2L|J1st#w2fnl4uwi=nH33eadNsOX$bN4hwup| zE_%7{_F^%GNP5)UAAn}e^-N076wfIb!xqd_b_8Xe$bbLm#4B8p9L}NGku&M+44SNwm z14e(IJg>PexKtL|=5J48AVe15db+!AXtF+7R^IRohcmbb0G+qHRQ9e#J`}+G-p)50 zu9e3-yGMs5N^o;0KJ$CGMYr_QhbLuatVpDonVXLUT}y+6L2~Qt6)~&l?)}|XjOpwE zgmal*`xz{UiQ`+^Do(BAdX?7p?c3K=;0X)InXAG@r?h*$>rOt;k6Jr< zp9E_^ER}sVOOP~Ncf_{e9-=Yex08qOHYmncpLXeKTb~+<*feC%Zvm+6y*{MPE5$%0 zE)sk8ggY?GGw777dro2g?Fj3dmq!Z*vGuuIa;cf@X|U<5r9_Rf}%UdVh0P2W)c4Lfcq8-qdKzrfeM$mEOqu}5`6 zKjxSo<`czhU_?bWAOE)_-YP>pSWk``+cuWAq&gZfVkCq4%9Q&SP7mf~ax4LRO57cP zF)y#V6weKRl%%KLA0kfCpQL(p2?!pigL=qQreoW1nMrrI%&%0?%;a>|Pr<@gzv8UK ziU#*bi~YfG90QPb$0B-Htcsv_S9$xhXz*|Ro%((uAt4DvUMRxme?M#FhA4bY%vf~| zuw@G^D|;b=Y@;>FB=dygaa%Y5} zk`bkWBx4FiW3N>TI8~`g{UbZc4OIiS()^y29q)%CG7IET493cTjBqLPUG%`S;&z=Y$nbV`2=bl_10&PP=^cpoCrxrY8c6Gix~=>r z7gf{y+=Ah2H&h+)ly+%eRY4I4@I zR)M^~AN<@w$D=XWsk)M|+vRB^ML@0VJz}$7>haBt<G^w)Iu1Z`rK4W;&k9!S{l(nzcc`EzhE8K-YvM!tHgS^IC>AvnJZL9t&k5EwH$Rx$0a-&!UZmb_!hc{`b71jn4g+$vLLR&z>z8_pPuS(*-*Xzof^!`e*JJJu{pZ%3$YD>uq zoeXQm>Ygz17MQq&Uf|O@8eRAk!=1NOaWku>H?JTIJBMD;6{biIHeTUaI`UU#;HGy= zhgy<9vuD+VkQ~V+uR0;0xCHULboG588>bfnuqBY%5HNrlq_ee*%xa_8m-fJbmoEyk zhsch*M=OPlXn+2{7muokhasMoq`qc?G5Q%s%8fQzB=>zFeEv zjtSpG$J0%D!a`w)P4_h%_gLEct29GDaJC%&DETTy;1W5zPNbWQkj=j9$D=#npH#~x%miS|qi7*x5H+tRf6c~3`z(BpCQhE)!95__s*YlcC6!eoM;fN4^ z#U%VFQ0U9cJ@ly3HY4SgnaO2FpN{88k*W*TW>@@0>q31R-a~XJ1W@E7Gq!~9=L-V* zQ`%NF>zrb>KiSvTow}XeJ1u~_INKzJg+JhYxqh8nL{w-rtl#9oj*N@Dg5M+vSWu|vn>yIbplDF zv%7|*kwT~3KG)H&!MRS1*Aco@7AnLcNuJflqiE`b}QmosO~V zk}R|ukl*MWN*~Bjy!Qr4BE(#8gif7ubZA#oJzK?oi|8K&rjDbRsk$)~5oVWKf$#D9W(*(|1;p%> zVvgH%~HamIqZAUN;K4-uFezq^o7yGop9}hP}v&%t|q)$c9@LNeJ!z zgZQ$*bs#i`zu8uRJ1CMj`gH`8e6V)y59g|xe4kFS*(>ZMLCfz#5mM9azj}bUWWSxv z_z*060o35i-W`|pXaS$6Gu*Z@i!QWQ#Zygu2?P5QWSQnFiitin^m2Ck#~R5C)RSek zs@6oVi`f?hZHO=D)QvHcCS+E}v>6$VGwk>N3dPq|siL`Y6H18v3frR1cZn=XeK}v< z`Z0pdc8y(q)TfF{nI1V*&;0C#UV7^Hlj3|Kc|3+Qo&``E{SJ z2cgBe65+kCk=CWOjS({vuH`@$8|Rl-80XK!VW{_(V<;3^b4;D&qM(j7npd$Idr)g`R?%f25bWva;7$?a;-qRLKI&u}an zJssOQtldaBTA|v7w5#u_{$ohT{;Ll{ni-{E&CGlTAk<@kq)-663;;X3`AvkI=Z@k% z>jQpr)qYy4kt+*Y#5cU;Gy@tPcOzQ(M@y9pxoB`M191Z_;7EfG%)9T#O`N1lT(bZ0 zS+(t{`m)X1A*DwnAAKnkr*C$fv*Tv0A}(tss01E$@6ox4!;q>^dYxHDxuhvcLz5zV zdp=!_TnP)gR@pX)2&ked@v`W|i7{TR`kS!U@>G}n?Z%NG=95^xOs423U@ z)WCt~Co8&K|Enu<{`G9>w4Rf^b?rN{Xhfmz`>Uo}c(L~`p?uM(24BuHS{KB_Gv>$X zHFsXq^H!s{Z@{lcX{AVKSe`+Yc+1d-&{%M%yXTA@X1*q}+14!kyNt9(r=_z^v$$_P z(iq_kKDt--j{Kw+d{J;kq$=*j)srwP(oYb>sjii;$EP7qj|wpi>#U^DHDw@N@nLGu z6+jxO#Ag+cA7h|3$K&w|I4GG2zgQ{M89x=(@x@opK_M)7#-oN2d7bMGVCCy1G?(^G ztd|jxus?v65c{pHt?%?w-zsTp9;V^ZsJ+rN=U1uBS*?m{InV$d#>|&OS}26y*RAcx z4h$wlweU)vIx!Dz4(fzC|B)j{K$mOl>Jp@pi;NkWl_9F!EK>x#S&Bk;ItV?bTpKar z#(XD#PKDeI!VfE0n-$olmL@>SOe>XjtL(jjjY~tTs?xZ1myylqx~bEn=xdFxrX}I_ zEjlsHpi})+!M8223}9t^l!Dr(76ZzMbwDT_9(@mwG1$1Ah3y8AJbil82ORgSSpD5$E^TFi{N zoa{+*dBK9up5pK&tNHDi`DjQ9aQ19p^$q?Hm0Js%NXV*?*9aBN*>(5sT^d_>*tQrn zY10xveu|^haTGVP6T<(N&iGAwO1q*=ft;ist6+U>pCMIsDbDAR_{ev-;1l zkqxZ4W#&VqMPKsWiP=S~=7;pvV6sE<`}5G-sTxpK^T6N2#NxR;)!g({17Y z82}<6_;uO`e~R6t8||qEn@@v%*YxM)?M{-k_wc}57lLr;@t<+LQIXA=Qt7MOghEbt z(!%~frYRuSZb71YGb7bsI3U*|9|=nuQ*?&Trm_2LF%d6s#u720+3U4Wl9w(KJFN6< zAamSu=JvewctmJS|23R}6W~z4R|ntzGaer7hzO+mpFsu~dd0b~W#ODYjIE@=5BnQ! zq4&51keq1}o26_lBrFWC>3_G4ZC|7(xt~tx?67f!5_$X!TF%b3D+v7i z00N2DIN{sdO#$_k2jUK+rP#bdN%|u z6cs^q#Q)w{(TG@NP=5#QTNTl_|T_UQ(eAM1F z<}9*eG)3O1cTN8u*G4DTca&wz!=q6<-#ThvxNV<}WEs}#tykr))}$=+d<2CQ5Mb7Xa8` zl)qph(^&LtZ1MZdn{OQpyj46z6X|%aM;*(aZQKQbBGuX#IJqu}{SQcZ*!FYi25DG3 z8SAATP-3r!0!jJpk88Cp5&2&gr-;c`&MZxpITK}w9rJdB9i@K{gG08T>&!2t1q{D} zPHPzIkrjr?NN=%cpR%d!z6-*S|^6RPeQoLaig53+8r#72nT%Sfs! zf$n53>qp_c(lLJ?14`{;%ZmcL!D*>r!di7zgDv3Pe^3OjY@!-7zWAUnstuH*Fd4F&te@-S98bRa`&10_sY(m@!atxu`#-}HB{pAoz1p_0{Tl)3f|WCWlf1{{HVA0|62z3UM}m=b zMx?kdpauULrg)E@_kLWC?tr~01uc7I&{Rvc2T|FKtWx04($t)PZ~n=m9GboZ75iVq zgdFJN$P0w*LH^l#Q@w-x!_8P)YFjvk0^!VwX*0e8#DcdEoPMbaBt&0yKca zYY}=+#j{QSZv@yB1y}`fc6TNxdy2fHV8Ot>C+jM1`C_Dq&v&6Zc8X1kMy;Q3j|rs4 ze&A2EtA!gtpkNi~by|JM*tAA1fn4f&%*f4+BazUL1*q3vK%}-gI!^`Ha z?LK=-^;2x6)6D=pRw)xmQKq#E4%G5zExkrh$~Xgg1I`Us7smAC zaG)D@Q#x&_he8@O?Ht|?3C{Zr9K9;MC3oU3Y~ohlZrFr0YhIp10&-D8Q$5fKhoLf# zhsGJkI(9V%>8f~H5=s+LsI`ZY6H4xCOT#T&lg%3>eWdpisr4M{z1G4LQUIXGQg*ROc%@a^(+|og~rZLj!86n*UUMU&MeIjeD_f8)M zm5MzC?8ifx$;!wHmEp2g`e?&JC&FGG7h=V+QqLv*QxLH9w0%L;?gdgzo68xnfgM1P zktw?Oy9fhL$w zf36NuJ}fds=RM)dBM z?eqht79PE{>x~IMy6U5yUNd~HTazbiFV(E@kuL;Y^{h1R-iAa3P4qr!T6_rZRgF)) zRenjL`4H}htQ_BF-t?)AcwQ}6R6?!TRl~s3olE~s23&YW*1q(diK0tF9pfW!<6dTX z1)4B$Uu7>g0a5VQ?;QlQX9TRCJAEcNLG#FF^D(`G3j|DKz3^AJ{la}L&~as)!z}7G zLN*kZUh5O{5s+PxH9$YXN+~-+;41ry%0ANPt<$>!!NzRKGRiYj4J`MPyktVGZyNy4&z7ZXqLQ1{w(EFTeNeXqYe&eM$ znH3h>(rZbE_-Lz{(|(VPj#u;tr>t!HhuxDA`3+*87FJS^=5_|Y(mX7M=5&4;@VZ*j zu-kteX@Eu|+1N|s_Js4YB-?&NO^!?l;Va<^Y%iD{T22rwewn>hktU#T;XAb~$t(4A zcp;k-3OZl-KgfaJ566Sn29D=d*(yr2H|Jn75uXNitt1-&fo_90f*Q4A|bRChtxJvZ!+s}OH0rPh&14Mo2s;E z*@CqyJ(Pk4o6~qAlRNavIJBF>*mR(uh2TjGa*e<0L_W^o9X-P&P9wtUIO4oOX&EoS zE}PFD{TCjULk#Gdo6}Mlv~hq0tPt!A;f!c?kZaP+kbDtsiSHFrJ*jajAk%#h+#7CW zG7BST8@$xqEfp255d7>~Nwvz$@2MJq2S9g_1JVcN(!Lx5{zIyVAduuZvx2)0yy~0o zQpN={PMxqxNZXDI+o5pgtFf+-OH#am&rUy`vEuvX4LbTq;Y&sgkNz_DrYPCgO%gy$ zt^{`+C8pi`#Mt+Wa8%R7&9gY6y#p>rkDbv&t}+e5*c<14DuhUK9>wxdO#Wf(Kfej_ zzea}1ziGPG^C>okcyFiClUa2_7O#t6A@Pq&lWu>&%)v>Tfo@=5i9!JVx(HO>1yEM=V)A`LxS6V!Qg@-q+os&55;C;aux$ICg@bm{9iYPOF!i1j94@ z`fbLX8BpxPWP$9B)XV&3bSS+v4?>__nbC+yGB0RM+h}1w*Edoe@F?|*JEJZOS>wExV-{{uH;UJC#K literal 0 HcmV?d00001 diff --git a/packages/f2/test/components/guide/__image_snapshots__/__diff_output__/type-test-tsx-guide-tag-guide-update-1-snap-diff.png b/packages/f2/test/components/guide/__image_snapshots__/__diff_output__/type-test-tsx-guide-tag-guide-update-1-snap-diff.png new file mode 100644 index 0000000000000000000000000000000000000000..d07a2e59af18e5b8434239ddbf80b05998341c03 GIT binary patch literal 11857 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 MW{!Mu)alm$0V3|4$N&HU literal 0 HcmV?d00001 diff --git "a/packages/f2/test/components/guide/__image_snapshots__/__diff_output__/type-test-tsx-guide-tag-guide\344\270\215\345\220\214\346\226\271\345\220\221-1-snap-diff.png" "b/packages/f2/test/components/guide/__image_snapshots__/__diff_output__/type-test-tsx-guide-tag-guide\344\270\215\345\220\214\346\226\271\345\220\221-1-snap-diff.png" new file mode 100644 index 0000000000000000000000000000000000000000..bbc12882aad91ebfa398825a8ef7cd2c5198cc18 GIT binary patch literal 15042 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 literal 0 HcmV?d00001 diff --git "a/packages/f2/test/components/line/__image_snapshots__/__diff_output__/line-test-tsx-\346\212\230\347\272\277\345\233\276-\345\205\266\344\273\226\346\212\230\347\272\277\345\233\276-\345\255\230\345\234\250\347\251\272\345\200\274-1-snap-diff.png" "b/packages/f2/test/components/line/__image_snapshots__/__diff_output__/line-test-tsx-\346\212\230\347\272\277\345\233\276-\345\205\266\344\273\226\346\212\230\347\272\277\345\233\276-\345\255\230\345\234\250\347\251\272\345\200\274-1-snap-diff.png" new file mode 100644 index 0000000000000000000000000000000000000000..677f258d0343adae55ce37a080668f0227c9d34d GIT binary patch literal 57906 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 OO-En;VK$%|o=0IoG-XH3B*cqEWa!A$6|%bx{c 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

Q50{~-;Lh^1zFBCn#m7uua}$ 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 Kt-id9l<^N5QruSn literal 0 HcmV?d00001 diff --git a/packages/f2/test/components/sunburst/__image_snapshots__/__diff_output__/index-test-tsx-sunburst-render-1-snap-diff.png b/packages/f2/test/components/sunburst/__image_snapshots__/__diff_output__/index-test-tsx-sunburst-render-1-snap-diff.png new file mode 100644 index 0000000000000000000000000000000000000000..01a07d8690b1ac1f8f8f24a44d17448d4e2296c1 GIT binary patch literal 117540 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 CnvD_w literal 0 HcmV?d00001 diff --git a/site/.dumi/components/MultiRender.tsx b/site/.dumi/components/MultiRender.tsx index 2b165ad65..e62764dda 100644 --- a/site/.dumi/components/MultiRender.tsx +++ b/site/.dumi/components/MultiRender.tsx @@ -1,4 +1,3 @@ -import { Renderer as CanvasRenderer } from '@antv/g-mobile-canvas'; import { Renderer as SVGRenderer } from '@antv/g-mobile-svg'; import { Renderer as WebGLRenderer } from '@antv/g-mobile-webgl'; import React, { useRef, useState } from 'react'; @@ -19,7 +18,6 @@ function renderChart(F2, options) { const { Canvas, Chart, Axis, Line } = F2; function getProps(data) { const { props } = ( - // @ts-ignore @@ -66,9 +64,9 @@ export default ({ F2 }) => { canvasEl.style.width = '100%'; canvasEl.style.height = '100%'; container.appendChild(canvasEl); - const canvasRenderer = new CanvasRenderer(); + // const canvasRenderer = new CanvasRenderer(); const canvas = renderChart(F2, { - renderer: canvasRenderer, + // renderer: canvasRenderer, context: canvasEl.getContext('2d'), }); setCanvas(canvas); diff --git a/site/.dumi/components/Pan.tsx b/site/.dumi/components/Pan.tsx index e0a0c585a..12bc75092 100644 --- a/site/.dumi/components/Pan.tsx +++ b/site/.dumi/components/Pan.tsx @@ -66,7 +66,7 @@ function renderChart(F2, canvasEl: HTMLCanvasElement) { setTimeout(async () => { gestureSimulator(canvasEl, 'touchstart', { x: 350, y: 35 }); loopTouchmove(); - }); + }, 1000); return canvas; } diff --git a/site/.dumi/components/Pinch.tsx b/site/.dumi/components/Pinch.tsx index 1e3dac90c..c1da05998 100644 --- a/site/.dumi/components/Pinch.tsx +++ b/site/.dumi/components/Pinch.tsx @@ -76,7 +76,7 @@ function renderChart(F2, canvasEl: HTMLCanvasElement) { { x: 260, y: 260 }, ]); loopTouchmove(); - }); + }, 1000); return canvas; } diff --git a/site/.dumi/pages/benchmark/5_0_pendding/f2.assign.js b/site/.dumi/pages/benchmark/5_0_30/f2.assign.js similarity index 100% rename from site/.dumi/pages/benchmark/5_0_pendding/f2.assign.js rename to site/.dumi/pages/benchmark/5_0_30/f2.assign.js diff --git a/site/.dumi/pages/benchmark/5_0_pendding/f2.js b/site/.dumi/pages/benchmark/5_0_30/f2.js similarity index 100% rename from site/.dumi/pages/benchmark/5_0_pendding/f2.js rename to site/.dumi/pages/benchmark/5_0_30/f2.js diff --git a/site/.dumi/pages/benchmark/5_0_pendding/first_render.tsx b/site/.dumi/pages/benchmark/5_0_30/first_render.tsx similarity index 100% rename from site/.dumi/pages/benchmark/5_0_pendding/first_render.tsx rename to site/.dumi/pages/benchmark/5_0_30/first_render.tsx diff --git a/site/.dumi/pages/benchmark/5_0_pendding/multi_render.tsx b/site/.dumi/pages/benchmark/5_0_30/multi_render.tsx similarity index 100% rename from site/.dumi/pages/benchmark/5_0_pendding/multi_render.tsx rename to site/.dumi/pages/benchmark/5_0_30/multi_render.tsx diff --git a/site/.dumi/pages/benchmark/5_0_pendding/pan.tsx b/site/.dumi/pages/benchmark/5_0_30/pan.tsx similarity index 100% rename from site/.dumi/pages/benchmark/5_0_pendding/pan.tsx rename to site/.dumi/pages/benchmark/5_0_30/pan.tsx diff --git a/site/.dumi/pages/benchmark/5_0_pendding/pinch.tsx b/site/.dumi/pages/benchmark/5_0_30/pinch.tsx similarity index 100% rename from site/.dumi/pages/benchmark/5_0_pendding/pinch.tsx rename to site/.dumi/pages/benchmark/5_0_30/pinch.tsx diff --git a/site/.dumi/pages/benchmark/5_0_pendding/tooltip.tsx b/site/.dumi/pages/benchmark/5_0_30/tooltip.tsx similarity index 100% rename from site/.dumi/pages/benchmark/5_0_pendding/tooltip.tsx rename to site/.dumi/pages/benchmark/5_0_30/tooltip.tsx diff --git a/site/.dumi/pages/benchmark/5_0_next/f2.js b/site/.dumi/pages/benchmark/5_0_next/f2.js new file mode 100644 index 000000000..4d819cf51 --- /dev/null +++ b/site/.dumi/pages/benchmark/5_0_next/f2.js @@ -0,0 +1,71498 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' + ? factory(exports) + : typeof define === 'function' && define.amd + ? define(['exports'], factory) + : ((global = typeof globalThis !== 'undefined' ? globalThis : global || self), + factory((global.F2 = {}))); +})(this, function (exports) { + 'use strict'; + + /****************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + /* global Reflect, Promise, SuppressedError, Symbol */ + + var extendStatics = function (d, b) { + extendStatics = + Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && + function (d, b) { + d.__proto__ = b; + }) || + function (d, b) { + for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; + }; + return extendStatics(d, b); + }; + + function __extends(d, b) { + if (typeof b !== 'function' && b !== null) + throw new TypeError('Class extends value ' + String(b) + ' is not a constructor or null'); + extendStatics(d, b); + function __() { + this.constructor = d; + } + d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __()); + } + + var __assign = function () { + __assign = + Object.assign || + function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + function __rest(s, e) { + var t = {}; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === 'function') + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; + } + + function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P + ? value + : new P(function (resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator['throw'](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + } + + function __generator(thisArg, body) { + var _ = { + label: 0, + sent: function () { + if (t[0] & 1) throw t[1]; + return t[1]; + }, + trys: [], + ops: [], + }, + f, + y, + t, + g; + return ( + (g = { next: verb(0), throw: verb(1), return: verb(2) }), + typeof Symbol === 'function' && + (g[Symbol.iterator] = function () { + return this; + }), + g + ); + function verb(n) { + return function (v) { + return step([n, v]); + }; + } + function step(op) { + if (f) throw new TypeError('Generator is already executing.'); + while ((g && ((g = 0), op[0] && (_ = 0)), _)) + try { + if ( + ((f = 1), + y && + (t = + op[0] & 2 + ? y['return'] + : op[0] + ? y['throw'] || ((t = y['return']) && t.call(y), 0) + : y.next) && + !(t = t.call(y, op[1])).done) + ) + return t; + if (((y = 0), t)) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: + case 1: + t = op; + break; + case 4: + _.label++; + return { value: op[1], done: false }; + case 5: + _.label++; + y = op[1]; + op = [0]; + continue; + case 7: + op = _.ops.pop(); + _.trys.pop(); + continue; + default: + if ( + !((t = _.trys), (t = t.length > 0 && t[t.length - 1])) && + (op[0] === 6 || op[0] === 2) + ) { + _ = 0; + continue; + } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { + _.label = op[1]; + break; + } + if (op[0] === 6 && _.label < t[1]) { + _.label = t[1]; + t = op; + break; + } + if (t && _.label < t[2]) { + _.label = t[2]; + _.ops.push(op); + break; + } + if (t[2]) _.ops.pop(); + _.trys.pop(); + continue; + } + op = body.call(thisArg, _); + } catch (e) { + op = [6, e]; + y = 0; + } finally { + f = t = 0; + } + if (op[0] & 5) throw op[1]; + return { value: op[0] ? op[1] : void 0, done: true }; + } + } + + function __values(o) { + var s = typeof Symbol === 'function' && Symbol.iterator, + m = s && o[s], + i = 0; + if (m) return m.call(o); + if (o && typeof o.length === 'number') + return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + }, + }; + throw new TypeError(s ? 'Object is not iterable.' : 'Symbol.iterator is not defined.'); + } + + function __read(o, n) { + var m = typeof Symbol === 'function' && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), + r, + ar = [], + e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } catch (error) { + e = { error: error }; + } finally { + try { + if (r && !r.done && (m = i['return'])) m.call(i); + } finally { + if (e) throw e.error; + } + } + return ar; + } + + function __spreadArray(to, from, pack) { + if (pack || arguments.length === 2) + for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); + } + + var _SuppressedError = + typeof SuppressedError === 'function' + ? SuppressedError + : function (error, suppressed, message) { + var e = new Error(message); + return (e.name = 'SuppressedError'), (e.error = error), (e.suppressed = suppressed), e; + }; + + var isArrayLike = function (value) { + /** + * isArrayLike([1, 2, 3]) => true + * isArrayLike(document.body.children) => true + * isArrayLike('abc') => true + * isArrayLike(Function) => false + */ + return value !== null && typeof value !== 'function' && isFinite(value.length); + }; + + /** + * @see https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore#_isfunction + */ + var isFunction = function (value) { + return typeof value === 'function'; + }; + + // isFinite, + var isNil = function (value) { + /** + * isNil(null) => true + * isNil() => true + */ + return value === null || value === undefined; + }; + + var toString = {}.toString; + var isType = function (value, type) { + return toString.call(value) === '[object ' + type + ']'; + }; + + var isArray = function (value) { + return Array.isArray ? Array.isArray(value) : isType(value, 'Array'); + }; + + var isObject = function (value) { + /** + * isObject({}) => true + * isObject([1, 2, 3]) => true + * isObject(Function) => true + * isObject(null) => false + */ + var type = typeof value; + return (value !== null && type === 'object') || type === 'function'; + }; + + function each(elements, func) { + if (!elements) { + return; + } + var rst; + if (isArray(elements)) { + for (var i = 0, len = elements.length; i < len; i++) { + rst = func(elements[i], i); + if (rst === false) { + break; + } + } + } else if (isObject(elements)) { + for (var k in elements) { + if (elements.hasOwnProperty(k)) { + rst = func(elements[k], k); + if (rst === false) { + break; + } + } + } + } + } + + var isObjectLike = function (value) { + /** + * isObjectLike({}) => true + * isObjectLike([1, 2, 3]) => true + * isObjectLike(Function) => false + * isObjectLike(null) => false + */ + return typeof value === 'object' && value !== null; + }; + + var isPlainObject = function (value) { + /** + * isObjectLike(new Foo) => false + * isObjectLike([1, 2, 3]) => false + * isObjectLike({ x: 0, y: 0 }) => true + * isObjectLike(Object.create(null)) => true + */ + if (!isObjectLike(value) || !isType(value, 'Object')) { + return false; + } + if (Object.getPrototypeOf(value) === null) { + return true; + } + var proto = value; + while (Object.getPrototypeOf(proto) !== null) { + proto = Object.getPrototypeOf(proto); + } + return Object.getPrototypeOf(value) === proto; + }; + + /** + * @param {Array} arr The array to iterate over. + * @return {*} Returns the maximum value. + * @example + * + * max([1, 2]); + * // => 2 + * + * max([]); + * // => undefined + * + * const data = new Array(1250010).fill(1).map((d,idx) => idx); + * + * max(data); + * // => 1250010 + * // Math.max(...data) will encounter "Maximum call stack size exceeded" error + */ + var max = function (arr) { + if (!isArray(arr)) { + return undefined; + } + return arr.reduce(function (prev, curr) { + return Math.max(prev, curr); + }, arr[0]); + }; + + /** + * @param {Array} arr The array to iterate over. + * @return {*} Returns the minimum value. + * @example + * + * min([1, 2]); + * // => 1 + * + * min([]); + * // => undefined + * + * const data = new Array(1250010).fill(1).map((d,idx) => idx); + * + * min(data); + * // => 1250010 + * // Math.min(...data) will encounter "Maximum call stack size exceeded" error + */ + var min = function (arr) { + if (!isArray(arr)) { + return undefined; + } + return arr.reduce(function (prev, curr) { + return Math.min(prev, curr); + }, arr[0]); + }; + + var reduce = function (arr, fn, init) { + if (!isArray(arr) && !isPlainObject(arr)) { + return arr; + } + var result = init; + each(arr, function (data, i) { + result = fn(result, data, i); + }); + return result; + }; + + var isString = function (str) { + return isType(str, 'String'); + }; + + var clamp = function (a, min, max) { + if (a < min) { + return min; + } else if (a > max) { + return max; + } + return a; + }; + + /** + * 判断是否数字 + * @return {Boolean} 是否数字 + */ + var isNumber = function (value) { + return isType(value, 'Number'); + }; + + var PRECISION = 0.00001; // numbers less than this is considered as 0 + function isNumberEqual(a, b, precision) { + if (precision === void 0) { + precision = PRECISION; + } + return Math.abs(a - b) < precision; + } + + var mod = function (n, m) { + return ((n % m) + m) % m; + }; + + /** + * 是否是布尔类型 + * + * @param {Object} value 测试的值 + * @return {Boolean} + */ + var isBoolean = function (value) { + return isType(value, 'Boolean'); + }; + + var isUndefined = function (value) { + return value === undefined; + }; + + var isEqual = function (value, other) { + if (value === other) { + return true; + } + if (!value || !other) { + return false; + } + if (isString(value) || isString(other)) { + return false; + } + if (isArrayLike(value) || isArrayLike(other)) { + if (value.length !== other.length) { + return false; + } + var rst = true; + for (var i = 0; i < value.length; i++) { + rst = isEqual(value[i], other[i]); + if (!rst) { + break; + } + } + return rst; + } + if (isObjectLike(value) || isObjectLike(other)) { + var valueKeys = Object.keys(value); + var otherKeys = Object.keys(other); + if (valueKeys.length !== otherKeys.length) { + return false; + } + var rst = true; + for (var i = 0; i < valueKeys.length; i++) { + rst = isEqual(value[valueKeys[i]], other[valueKeys[i]]); + if (!rst) { + break; + } + } + return rst; + } + return false; + }; + + var hasOwnProperty = Object.prototype.hasOwnProperty; + var pick = function (object, keys) { + if (object === null || !isPlainObject(object)) { + return {}; + } + var result = {}; + each(keys, function (key) { + if (hasOwnProperty.call(object, key)) { + result[key] = object[key]; + } + }); + return result; + }; + + var omit = function (obj, keys) { + return reduce( + obj, + function (r, curr, key) { + if (!keys.includes(key)) { + r[key] = curr; + } + return r; + }, + {} + ); + }; + + /** + * Common utilities + * @module glMatrix + */ + // Configuration Constants + var EPSILON = 0.000001; + var ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array; + if (!Math.hypot) + Math.hypot = function () { + var y = 0, + i = arguments.length; + + while (i--) { + y += arguments[i] * arguments[i]; + } + + return Math.sqrt(y); + }; + + /** + * 3x3 Matrix + * @module mat3 + */ + + /** + * Creates a new identity mat3 + * + * @returns {mat3} a new 3x3 matrix + */ + + function create() { + var out = new ARRAY_TYPE(9); + + if (ARRAY_TYPE != Float32Array) { + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[5] = 0; + out[6] = 0; + out[7] = 0; + } + + out[0] = 1; + out[4] = 1; + out[8] = 1; + return out; + } + /** + * Copies the upper-left 3x3 values into the given mat3. + * + * @param {mat3} out the receiving 3x3 matrix + * @param {ReadonlyMat4} a the source 4x4 matrix + * @returns {mat3} out + */ + + function fromMat4(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[4]; + out[4] = a[5]; + out[5] = a[6]; + out[6] = a[8]; + out[7] = a[9]; + out[8] = a[10]; + return out; + } + /** + * Create a new mat3 with the given values + * + * @param {Number} m00 Component in column 0, row 0 position (index 0) + * @param {Number} m01 Component in column 0, row 1 position (index 1) + * @param {Number} m02 Component in column 0, row 2 position (index 2) + * @param {Number} m10 Component in column 1, row 0 position (index 3) + * @param {Number} m11 Component in column 1, row 1 position (index 4) + * @param {Number} m12 Component in column 1, row 2 position (index 5) + * @param {Number} m20 Component in column 2, row 0 position (index 6) + * @param {Number} m21 Component in column 2, row 1 position (index 7) + * @param {Number} m22 Component in column 2, row 2 position (index 8) + * @returns {mat3} A new mat3 + */ + + function fromValues(m00, m01, m02, m10, m11, m12, m20, m21, m22) { + var out = new ARRAY_TYPE(9); + out[0] = m00; + out[1] = m01; + out[2] = m02; + out[3] = m10; + out[4] = m11; + out[5] = m12; + out[6] = m20; + out[7] = m21; + out[8] = m22; + return out; + } + + /** + * 4x4 Matrix
Format: column-major, when typed out it looks like row-major
The matrices are being post multiplied. + * @module mat4 + */ + + /** + * Creates a new identity mat4 + * + * @returns {mat4} a new 4x4 matrix + */ + + function create$1() { + var out = new ARRAY_TYPE(16); + + if (ARRAY_TYPE != Float32Array) { + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + } + + out[0] = 1; + out[5] = 1; + out[10] = 1; + out[15] = 1; + return out; + } + /** + * Creates a new mat4 initialized with values from an existing matrix + * + * @param {ReadonlyMat4} a matrix to clone + * @returns {mat4} a new 4x4 matrix + */ + + function clone(a) { + var out = new ARRAY_TYPE(16); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[8] = a[8]; + out[9] = a[9]; + out[10] = a[10]; + out[11] = a[11]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + return out; + } + /** + * Copy the values from one mat4 to another + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the source matrix + * @returns {mat4} out + */ + + function copy(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[8] = a[8]; + out[9] = a[9]; + out[10] = a[10]; + out[11] = a[11]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + return out; + } + /** + * Create a new mat4 with the given values + * + * @param {Number} m00 Component in column 0, row 0 position (index 0) + * @param {Number} m01 Component in column 0, row 1 position (index 1) + * @param {Number} m02 Component in column 0, row 2 position (index 2) + * @param {Number} m03 Component in column 0, row 3 position (index 3) + * @param {Number} m10 Component in column 1, row 0 position (index 4) + * @param {Number} m11 Component in column 1, row 1 position (index 5) + * @param {Number} m12 Component in column 1, row 2 position (index 6) + * @param {Number} m13 Component in column 1, row 3 position (index 7) + * @param {Number} m20 Component in column 2, row 0 position (index 8) + * @param {Number} m21 Component in column 2, row 1 position (index 9) + * @param {Number} m22 Component in column 2, row 2 position (index 10) + * @param {Number} m23 Component in column 2, row 3 position (index 11) + * @param {Number} m30 Component in column 3, row 0 position (index 12) + * @param {Number} m31 Component in column 3, row 1 position (index 13) + * @param {Number} m32 Component in column 3, row 2 position (index 14) + * @param {Number} m33 Component in column 3, row 3 position (index 15) + * @returns {mat4} A new mat4 + */ + + function fromValues$1( + m00, + m01, + m02, + m03, + m10, + m11, + m12, + m13, + m20, + m21, + m22, + m23, + m30, + m31, + m32, + m33 + ) { + var out = new ARRAY_TYPE(16); + out[0] = m00; + out[1] = m01; + out[2] = m02; + out[3] = m03; + out[4] = m10; + out[5] = m11; + out[6] = m12; + out[7] = m13; + out[8] = m20; + out[9] = m21; + out[10] = m22; + out[11] = m23; + out[12] = m30; + out[13] = m31; + out[14] = m32; + out[15] = m33; + return out; + } + /** + * Set the components of a mat4 to the given values + * + * @param {mat4} out the receiving matrix + * @param {Number} m00 Component in column 0, row 0 position (index 0) + * @param {Number} m01 Component in column 0, row 1 position (index 1) + * @param {Number} m02 Component in column 0, row 2 position (index 2) + * @param {Number} m03 Component in column 0, row 3 position (index 3) + * @param {Number} m10 Component in column 1, row 0 position (index 4) + * @param {Number} m11 Component in column 1, row 1 position (index 5) + * @param {Number} m12 Component in column 1, row 2 position (index 6) + * @param {Number} m13 Component in column 1, row 3 position (index 7) + * @param {Number} m20 Component in column 2, row 0 position (index 8) + * @param {Number} m21 Component in column 2, row 1 position (index 9) + * @param {Number} m22 Component in column 2, row 2 position (index 10) + * @param {Number} m23 Component in column 2, row 3 position (index 11) + * @param {Number} m30 Component in column 3, row 0 position (index 12) + * @param {Number} m31 Component in column 3, row 1 position (index 13) + * @param {Number} m32 Component in column 3, row 2 position (index 14) + * @param {Number} m33 Component in column 3, row 3 position (index 15) + * @returns {mat4} out + */ + + function set( + out, + m00, + m01, + m02, + m03, + m10, + m11, + m12, + m13, + m20, + m21, + m22, + m23, + m30, + m31, + m32, + m33 + ) { + out[0] = m00; + out[1] = m01; + out[2] = m02; + out[3] = m03; + out[4] = m10; + out[5] = m11; + out[6] = m12; + out[7] = m13; + out[8] = m20; + out[9] = m21; + out[10] = m22; + out[11] = m23; + out[12] = m30; + out[13] = m31; + out[14] = m32; + out[15] = m33; + return out; + } + /** + * Set a mat4 to the identity matrix + * + * @param {mat4} out the receiving matrix + * @returns {mat4} out + */ + + function identity(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = 1; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 1; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; + } + /** + * Transpose the values of a mat4 + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the source matrix + * @returns {mat4} out + */ + + function transpose(out, a) { + // If we are transposing ourselves we can skip a few steps but have to cache some values + if (out === a) { + var a01 = a[1], + a02 = a[2], + a03 = a[3]; + var a12 = a[6], + a13 = a[7]; + var a23 = a[11]; + out[1] = a[4]; + out[2] = a[8]; + out[3] = a[12]; + out[4] = a01; + out[6] = a[9]; + out[7] = a[13]; + out[8] = a02; + out[9] = a12; + out[11] = a[14]; + out[12] = a03; + out[13] = a13; + out[14] = a23; + } else { + out[0] = a[0]; + out[1] = a[4]; + out[2] = a[8]; + out[3] = a[12]; + out[4] = a[1]; + out[5] = a[5]; + out[6] = a[9]; + out[7] = a[13]; + out[8] = a[2]; + out[9] = a[6]; + out[10] = a[10]; + out[11] = a[14]; + out[12] = a[3]; + out[13] = a[7]; + out[14] = a[11]; + out[15] = a[15]; + } + + return out; + } + /** + * Inverts a mat4 + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the source matrix + * @returns {mat4} out + */ + + function invert(out, a) { + var a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3]; + var a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7]; + var a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + var a30 = a[12], + a31 = a[13], + a32 = a[14], + a33 = a[15]; + var b00 = a00 * a11 - a01 * a10; + var b01 = a00 * a12 - a02 * a10; + var b02 = a00 * a13 - a03 * a10; + var b03 = a01 * a12 - a02 * a11; + var b04 = a01 * a13 - a03 * a11; + var b05 = a02 * a13 - a03 * a12; + var b06 = a20 * a31 - a21 * a30; + var b07 = a20 * a32 - a22 * a30; + var b08 = a20 * a33 - a23 * a30; + var b09 = a21 * a32 - a22 * a31; + var b10 = a21 * a33 - a23 * a31; + var b11 = a22 * a33 - a23 * a32; // Calculate the determinant + + var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + + if (!det) { + return null; + } + + det = 1.0 / det; + out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det; + out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det; + out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det; + out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det; + out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det; + out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det; + out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det; + out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det; + out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det; + out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det; + out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det; + out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det; + out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det; + out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det; + out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det; + out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det; + return out; + } + /** + * Calculates the adjugate of a mat4 + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the source matrix + * @returns {mat4} out + */ + + function adjoint(out, a) { + var a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3]; + var a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7]; + var a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + var a30 = a[12], + a31 = a[13], + a32 = a[14], + a33 = a[15]; + out[0] = + a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22); + out[1] = -( + a01 * (a22 * a33 - a23 * a32) - + a21 * (a02 * a33 - a03 * a32) + + a31 * (a02 * a23 - a03 * a22) + ); + out[2] = + a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12); + out[3] = -( + a01 * (a12 * a23 - a13 * a22) - + a11 * (a02 * a23 - a03 * a22) + + a21 * (a02 * a13 - a03 * a12) + ); + out[4] = -( + a10 * (a22 * a33 - a23 * a32) - + a20 * (a12 * a33 - a13 * a32) + + a30 * (a12 * a23 - a13 * a22) + ); + out[5] = + a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22); + out[6] = -( + a00 * (a12 * a33 - a13 * a32) - + a10 * (a02 * a33 - a03 * a32) + + a30 * (a02 * a13 - a03 * a12) + ); + out[7] = + a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12); + out[8] = + a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21); + out[9] = -( + a00 * (a21 * a33 - a23 * a31) - + a20 * (a01 * a33 - a03 * a31) + + a30 * (a01 * a23 - a03 * a21) + ); + out[10] = + a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11); + out[11] = -( + a00 * (a11 * a23 - a13 * a21) - + a10 * (a01 * a23 - a03 * a21) + + a20 * (a01 * a13 - a03 * a11) + ); + out[12] = -( + a10 * (a21 * a32 - a22 * a31) - + a20 * (a11 * a32 - a12 * a31) + + a30 * (a11 * a22 - a12 * a21) + ); + out[13] = + a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21); + out[14] = -( + a00 * (a11 * a32 - a12 * a31) - + a10 * (a01 * a32 - a02 * a31) + + a30 * (a01 * a12 - a02 * a11) + ); + out[15] = + a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11); + return out; + } + /** + * Calculates the determinant of a mat4 + * + * @param {ReadonlyMat4} a the source matrix + * @returns {Number} determinant of a + */ + + function determinant(a) { + var a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3]; + var a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7]; + var a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + var a30 = a[12], + a31 = a[13], + a32 = a[14], + a33 = a[15]; + var b00 = a00 * a11 - a01 * a10; + var b01 = a00 * a12 - a02 * a10; + var b02 = a00 * a13 - a03 * a10; + var b03 = a01 * a12 - a02 * a11; + var b04 = a01 * a13 - a03 * a11; + var b05 = a02 * a13 - a03 * a12; + var b06 = a20 * a31 - a21 * a30; + var b07 = a20 * a32 - a22 * a30; + var b08 = a20 * a33 - a23 * a30; + var b09 = a21 * a32 - a22 * a31; + var b10 = a21 * a33 - a23 * a31; + var b11 = a22 * a33 - a23 * a32; // Calculate the determinant + + return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06; + } + /** + * Multiplies two mat4s + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the first operand + * @param {ReadonlyMat4} b the second operand + * @returns {mat4} out + */ + + function multiply(out, a, b) { + var a00 = a[0], + a01 = a[1], + a02 = a[2], + a03 = a[3]; + var a10 = a[4], + a11 = a[5], + a12 = a[6], + a13 = a[7]; + var a20 = a[8], + a21 = a[9], + a22 = a[10], + a23 = a[11]; + var a30 = a[12], + a31 = a[13], + a32 = a[14], + a33 = a[15]; // Cache only the current line of the second matrix + + var b0 = b[0], + b1 = b[1], + b2 = b[2], + b3 = b[3]; + out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; + out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; + out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; + out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; + b0 = b[4]; + b1 = b[5]; + b2 = b[6]; + b3 = b[7]; + out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; + out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; + out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; + out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; + b0 = b[8]; + b1 = b[9]; + b2 = b[10]; + b3 = b[11]; + out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; + out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; + out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; + out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; + b0 = b[12]; + b1 = b[13]; + b2 = b[14]; + b3 = b[15]; + out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30; + out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31; + out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32; + out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33; + return out; + } + /** + * Translate a mat4 by the given vector + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to translate + * @param {ReadonlyVec3} v vector to translate by + * @returns {mat4} out + */ + + function translate(out, a, v) { + var x = v[0], + y = v[1], + z = v[2]; + var a00, a01, a02, a03; + var a10, a11, a12, a13; + var a20, a21, a22, a23; + + if (a === out) { + out[12] = a[0] * x + a[4] * y + a[8] * z + a[12]; + out[13] = a[1] * x + a[5] * y + a[9] * z + a[13]; + out[14] = a[2] * x + a[6] * y + a[10] * z + a[14]; + out[15] = a[3] * x + a[7] * y + a[11] * z + a[15]; + } else { + a00 = a[0]; + a01 = a[1]; + a02 = a[2]; + a03 = a[3]; + a10 = a[4]; + a11 = a[5]; + a12 = a[6]; + a13 = a[7]; + a20 = a[8]; + a21 = a[9]; + a22 = a[10]; + a23 = a[11]; + out[0] = a00; + out[1] = a01; + out[2] = a02; + out[3] = a03; + out[4] = a10; + out[5] = a11; + out[6] = a12; + out[7] = a13; + out[8] = a20; + out[9] = a21; + out[10] = a22; + out[11] = a23; + out[12] = a00 * x + a10 * y + a20 * z + a[12]; + out[13] = a01 * x + a11 * y + a21 * z + a[13]; + out[14] = a02 * x + a12 * y + a22 * z + a[14]; + out[15] = a03 * x + a13 * y + a23 * z + a[15]; + } + + return out; + } + /** + * Scales the mat4 by the dimensions in the given vec3 not using vectorization + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to scale + * @param {ReadonlyVec3} v the vec3 to scale the matrix by + * @returns {mat4} out + **/ + + function scale(out, a, v) { + var x = v[0], + y = v[1], + z = v[2]; + out[0] = a[0] * x; + out[1] = a[1] * x; + out[2] = a[2] * x; + out[3] = a[3] * x; + out[4] = a[4] * y; + out[5] = a[5] * y; + out[6] = a[6] * y; + out[7] = a[7] * y; + out[8] = a[8] * z; + out[9] = a[9] * z; + out[10] = a[10] * z; + out[11] = a[11] * z; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + return out; + } + /** + * Rotates a mat4 by the given angle around the given axis + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @param {ReadonlyVec3} axis the axis to rotate around + * @returns {mat4} out + */ + + function rotate(out, a, rad, axis) { + var x = axis[0], + y = axis[1], + z = axis[2]; + var len = Math.hypot(x, y, z); + var s, c, t; + var a00, a01, a02, a03; + var a10, a11, a12, a13; + var a20, a21, a22, a23; + var b00, b01, b02; + var b10, b11, b12; + var b20, b21, b22; + + if (len < EPSILON) { + return null; + } + + len = 1 / len; + x *= len; + y *= len; + z *= len; + s = Math.sin(rad); + c = Math.cos(rad); + t = 1 - c; + a00 = a[0]; + a01 = a[1]; + a02 = a[2]; + a03 = a[3]; + a10 = a[4]; + a11 = a[5]; + a12 = a[6]; + a13 = a[7]; + a20 = a[8]; + a21 = a[9]; + a22 = a[10]; + a23 = a[11]; // Construct the elements of the rotation matrix + + b00 = x * x * t + c; + b01 = y * x * t + z * s; + b02 = z * x * t - y * s; + b10 = x * y * t - z * s; + b11 = y * y * t + c; + b12 = z * y * t + x * s; + b20 = x * z * t + y * s; + b21 = y * z * t - x * s; + b22 = z * z * t + c; // Perform rotation-specific matrix multiplication + + out[0] = a00 * b00 + a10 * b01 + a20 * b02; + out[1] = a01 * b00 + a11 * b01 + a21 * b02; + out[2] = a02 * b00 + a12 * b01 + a22 * b02; + out[3] = a03 * b00 + a13 * b01 + a23 * b02; + out[4] = a00 * b10 + a10 * b11 + a20 * b12; + out[5] = a01 * b10 + a11 * b11 + a21 * b12; + out[6] = a02 * b10 + a12 * b11 + a22 * b12; + out[7] = a03 * b10 + a13 * b11 + a23 * b12; + out[8] = a00 * b20 + a10 * b21 + a20 * b22; + out[9] = a01 * b20 + a11 * b21 + a21 * b22; + out[10] = a02 * b20 + a12 * b21 + a22 * b22; + out[11] = a03 * b20 + a13 * b21 + a23 * b22; + + if (a !== out) { + // If the source and destination differ, copy the unchanged last row + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } + + return out; + } + /** + * Rotates a matrix by the given angle around the X axis + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + + function rotateX(out, a, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); + var a10 = a[4]; + var a11 = a[5]; + var a12 = a[6]; + var a13 = a[7]; + var a20 = a[8]; + var a21 = a[9]; + var a22 = a[10]; + var a23 = a[11]; + + if (a !== out) { + // If the source and destination differ, copy the unchanged rows + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } // Perform axis-specific matrix multiplication + + out[4] = a10 * c + a20 * s; + out[5] = a11 * c + a21 * s; + out[6] = a12 * c + a22 * s; + out[7] = a13 * c + a23 * s; + out[8] = a20 * c - a10 * s; + out[9] = a21 * c - a11 * s; + out[10] = a22 * c - a12 * s; + out[11] = a23 * c - a13 * s; + return out; + } + /** + * Rotates a matrix by the given angle around the Y axis + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + + function rotateY(out, a, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); + var a00 = a[0]; + var a01 = a[1]; + var a02 = a[2]; + var a03 = a[3]; + var a20 = a[8]; + var a21 = a[9]; + var a22 = a[10]; + var a23 = a[11]; + + if (a !== out) { + // If the source and destination differ, copy the unchanged rows + out[4] = a[4]; + out[5] = a[5]; + out[6] = a[6]; + out[7] = a[7]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } // Perform axis-specific matrix multiplication + + out[0] = a00 * c - a20 * s; + out[1] = a01 * c - a21 * s; + out[2] = a02 * c - a22 * s; + out[3] = a03 * c - a23 * s; + out[8] = a00 * s + a20 * c; + out[9] = a01 * s + a21 * c; + out[10] = a02 * s + a22 * c; + out[11] = a03 * s + a23 * c; + return out; + } + /** + * Rotates a matrix by the given angle around the Z axis + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to rotate + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + + function rotateZ(out, a, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); + var a00 = a[0]; + var a01 = a[1]; + var a02 = a[2]; + var a03 = a[3]; + var a10 = a[4]; + var a11 = a[5]; + var a12 = a[6]; + var a13 = a[7]; + + if (a !== out) { + // If the source and destination differ, copy the unchanged last row + out[8] = a[8]; + out[9] = a[9]; + out[10] = a[10]; + out[11] = a[11]; + out[12] = a[12]; + out[13] = a[13]; + out[14] = a[14]; + out[15] = a[15]; + } // Perform axis-specific matrix multiplication + + out[0] = a00 * c + a10 * s; + out[1] = a01 * c + a11 * s; + out[2] = a02 * c + a12 * s; + out[3] = a03 * c + a13 * s; + out[4] = a10 * c - a00 * s; + out[5] = a11 * c - a01 * s; + out[6] = a12 * c - a02 * s; + out[7] = a13 * c - a03 * s; + return out; + } + /** + * Creates a matrix from a vector translation + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.translate(dest, dest, vec); + * + * @param {mat4} out mat4 receiving operation result + * @param {ReadonlyVec3} v Translation vector + * @returns {mat4} out + */ + + function fromTranslation(out, v) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = 1; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 1; + out[11] = 0; + out[12] = v[0]; + out[13] = v[1]; + out[14] = v[2]; + out[15] = 1; + return out; + } + /** + * Creates a matrix from a vector scaling + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.scale(dest, dest, vec); + * + * @param {mat4} out mat4 receiving operation result + * @param {ReadonlyVec3} v Scaling vector + * @returns {mat4} out + */ + + function fromScaling(out, v) { + out[0] = v[0]; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = v[1]; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = v[2]; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; + } + /** + * Creates a matrix from a given angle around a given axis + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.rotate(dest, dest, rad, axis); + * + * @param {mat4} out mat4 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @param {ReadonlyVec3} axis the axis to rotate around + * @returns {mat4} out + */ + + function fromRotation(out, rad, axis) { + var x = axis[0], + y = axis[1], + z = axis[2]; + var len = Math.hypot(x, y, z); + var s, c, t; + + if (len < EPSILON) { + return null; + } + + len = 1 / len; + x *= len; + y *= len; + z *= len; + s = Math.sin(rad); + c = Math.cos(rad); + t = 1 - c; // Perform rotation-specific matrix multiplication + + out[0] = x * x * t + c; + out[1] = y * x * t + z * s; + out[2] = z * x * t - y * s; + out[3] = 0; + out[4] = x * y * t - z * s; + out[5] = y * y * t + c; + out[6] = z * y * t + x * s; + out[7] = 0; + out[8] = x * z * t + y * s; + out[9] = y * z * t - x * s; + out[10] = z * z * t + c; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; + } + /** + * Creates a matrix from the given angle around the X axis + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.rotateX(dest, dest, rad); + * + * @param {mat4} out mat4 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + + function fromXRotation(out, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); // Perform axis-specific matrix multiplication + + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = c; + out[6] = s; + out[7] = 0; + out[8] = 0; + out[9] = -s; + out[10] = c; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; + } + /** + * Creates a matrix from the given angle around the Y axis + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.rotateY(dest, dest, rad); + * + * @param {mat4} out mat4 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + + function fromYRotation(out, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); // Perform axis-specific matrix multiplication + + out[0] = c; + out[1] = 0; + out[2] = -s; + out[3] = 0; + out[4] = 0; + out[5] = 1; + out[6] = 0; + out[7] = 0; + out[8] = s; + out[9] = 0; + out[10] = c; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; + } + /** + * Creates a matrix from the given angle around the Z axis + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.rotateZ(dest, dest, rad); + * + * @param {mat4} out mat4 receiving operation result + * @param {Number} rad the angle to rotate the matrix by + * @returns {mat4} out + */ + + function fromZRotation(out, rad) { + var s = Math.sin(rad); + var c = Math.cos(rad); // Perform axis-specific matrix multiplication + + out[0] = c; + out[1] = s; + out[2] = 0; + out[3] = 0; + out[4] = -s; + out[5] = c; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 1; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; + } + /** + * Creates a matrix from a quaternion rotation and vector translation + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.translate(dest, vec); + * let quatMat = mat4.create(); + * quat4.toMat4(quat, quatMat); + * mat4.multiply(dest, quatMat); + * + * @param {mat4} out mat4 receiving operation result + * @param {quat4} q Rotation quaternion + * @param {ReadonlyVec3} v Translation vector + * @returns {mat4} out + */ + + function fromRotationTranslation(out, q, v) { + // Quaternion math + var x = q[0], + y = q[1], + z = q[2], + w = q[3]; + var x2 = x + x; + var y2 = y + y; + var z2 = z + z; + var xx = x * x2; + var xy = x * y2; + var xz = x * z2; + var yy = y * y2; + var yz = y * z2; + var zz = z * z2; + var wx = w * x2; + var wy = w * y2; + var wz = w * z2; + out[0] = 1 - (yy + zz); + out[1] = xy + wz; + out[2] = xz - wy; + out[3] = 0; + out[4] = xy - wz; + out[5] = 1 - (xx + zz); + out[6] = yz + wx; + out[7] = 0; + out[8] = xz + wy; + out[9] = yz - wx; + out[10] = 1 - (xx + yy); + out[11] = 0; + out[12] = v[0]; + out[13] = v[1]; + out[14] = v[2]; + out[15] = 1; + return out; + } + /** + * Creates a new mat4 from a dual quat. + * + * @param {mat4} out Matrix + * @param {ReadonlyQuat2} a Dual Quaternion + * @returns {mat4} mat4 receiving operation result + */ + + function fromQuat2(out, a) { + var translation = new ARRAY_TYPE(3); + var bx = -a[0], + by = -a[1], + bz = -a[2], + bw = a[3], + ax = a[4], + ay = a[5], + az = a[6], + aw = a[7]; + var magnitude = bx * bx + by * by + bz * bz + bw * bw; //Only scale if it makes sense + + if (magnitude > 0) { + translation[0] = ((ax * bw + aw * bx + ay * bz - az * by) * 2) / magnitude; + translation[1] = ((ay * bw + aw * by + az * bx - ax * bz) * 2) / magnitude; + translation[2] = ((az * bw + aw * bz + ax * by - ay * bx) * 2) / magnitude; + } else { + translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2; + translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2; + translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2; + } + + fromRotationTranslation(out, a, translation); + return out; + } + /** + * Returns the translation vector component of a transformation + * matrix. If a matrix is built with fromRotationTranslation, + * the returned vector will be the same as the translation vector + * originally supplied. + * @param {vec3} out Vector to receive translation component + * @param {ReadonlyMat4} mat Matrix to be decomposed (input) + * @return {vec3} out + */ + + function getTranslation(out, mat) { + out[0] = mat[12]; + out[1] = mat[13]; + out[2] = mat[14]; + return out; + } + /** + * Returns the scaling factor component of a transformation + * matrix. If a matrix is built with fromRotationTranslationScale + * with a normalized Quaternion paramter, the returned vector will be + * the same as the scaling vector + * originally supplied. + * @param {vec3} out Vector to receive scaling factor component + * @param {ReadonlyMat4} mat Matrix to be decomposed (input) + * @return {vec3} out + */ + + function getScaling(out, mat) { + var m11 = mat[0]; + var m12 = mat[1]; + var m13 = mat[2]; + var m21 = mat[4]; + var m22 = mat[5]; + var m23 = mat[6]; + var m31 = mat[8]; + var m32 = mat[9]; + var m33 = mat[10]; + out[0] = Math.hypot(m11, m12, m13); + out[1] = Math.hypot(m21, m22, m23); + out[2] = Math.hypot(m31, m32, m33); + return out; + } + /** + * Returns a quaternion representing the rotational component + * of a transformation matrix. If a matrix is built with + * fromRotationTranslation, the returned quaternion will be the + * same as the quaternion originally supplied. + * @param {quat} out Quaternion to receive the rotation component + * @param {ReadonlyMat4} mat Matrix to be decomposed (input) + * @return {quat} out + */ + + function getRotation(out, mat) { + var scaling = new ARRAY_TYPE(3); + getScaling(scaling, mat); + var is1 = 1 / scaling[0]; + var is2 = 1 / scaling[1]; + var is3 = 1 / scaling[2]; + var sm11 = mat[0] * is1; + var sm12 = mat[1] * is2; + var sm13 = mat[2] * is3; + var sm21 = mat[4] * is1; + var sm22 = mat[5] * is2; + var sm23 = mat[6] * is3; + var sm31 = mat[8] * is1; + var sm32 = mat[9] * is2; + var sm33 = mat[10] * is3; + var trace = sm11 + sm22 + sm33; + var S = 0; + + if (trace > 0) { + S = Math.sqrt(trace + 1.0) * 2; + out[3] = 0.25 * S; + out[0] = (sm23 - sm32) / S; + out[1] = (sm31 - sm13) / S; + out[2] = (sm12 - sm21) / S; + } else if (sm11 > sm22 && sm11 > sm33) { + S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2; + out[3] = (sm23 - sm32) / S; + out[0] = 0.25 * S; + out[1] = (sm12 + sm21) / S; + out[2] = (sm31 + sm13) / S; + } else if (sm22 > sm33) { + S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2; + out[3] = (sm31 - sm13) / S; + out[0] = (sm12 + sm21) / S; + out[1] = 0.25 * S; + out[2] = (sm23 + sm32) / S; + } else { + S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2; + out[3] = (sm12 - sm21) / S; + out[0] = (sm31 + sm13) / S; + out[1] = (sm23 + sm32) / S; + out[2] = 0.25 * S; + } + + return out; + } + /** + * Creates a matrix from a quaternion rotation, vector translation and vector scale + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.translate(dest, vec); + * let quatMat = mat4.create(); + * quat4.toMat4(quat, quatMat); + * mat4.multiply(dest, quatMat); + * mat4.scale(dest, scale) + * + * @param {mat4} out mat4 receiving operation result + * @param {quat4} q Rotation quaternion + * @param {ReadonlyVec3} v Translation vector + * @param {ReadonlyVec3} s Scaling vector + * @returns {mat4} out + */ + + function fromRotationTranslationScale(out, q, v, s) { + // Quaternion math + var x = q[0], + y = q[1], + z = q[2], + w = q[3]; + var x2 = x + x; + var y2 = y + y; + var z2 = z + z; + var xx = x * x2; + var xy = x * y2; + var xz = x * z2; + var yy = y * y2; + var yz = y * z2; + var zz = z * z2; + var wx = w * x2; + var wy = w * y2; + var wz = w * z2; + var sx = s[0]; + var sy = s[1]; + var sz = s[2]; + out[0] = (1 - (yy + zz)) * sx; + out[1] = (xy + wz) * sx; + out[2] = (xz - wy) * sx; + out[3] = 0; + out[4] = (xy - wz) * sy; + out[5] = (1 - (xx + zz)) * sy; + out[6] = (yz + wx) * sy; + out[7] = 0; + out[8] = (xz + wy) * sz; + out[9] = (yz - wx) * sz; + out[10] = (1 - (xx + yy)) * sz; + out[11] = 0; + out[12] = v[0]; + out[13] = v[1]; + out[14] = v[2]; + out[15] = 1; + return out; + } + /** + * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin + * This is equivalent to (but much faster than): + * + * mat4.identity(dest); + * mat4.translate(dest, vec); + * mat4.translate(dest, origin); + * let quatMat = mat4.create(); + * quat4.toMat4(quat, quatMat); + * mat4.multiply(dest, quatMat); + * mat4.scale(dest, scale) + * mat4.translate(dest, negativeOrigin); + * + * @param {mat4} out mat4 receiving operation result + * @param {quat4} q Rotation quaternion + * @param {ReadonlyVec3} v Translation vector + * @param {ReadonlyVec3} s Scaling vector + * @param {ReadonlyVec3} o The origin vector around which to scale and rotate + * @returns {mat4} out + */ + + function fromRotationTranslationScaleOrigin(out, q, v, s, o) { + // Quaternion math + var x = q[0], + y = q[1], + z = q[2], + w = q[3]; + var x2 = x + x; + var y2 = y + y; + var z2 = z + z; + var xx = x * x2; + var xy = x * y2; + var xz = x * z2; + var yy = y * y2; + var yz = y * z2; + var zz = z * z2; + var wx = w * x2; + var wy = w * y2; + var wz = w * z2; + var sx = s[0]; + var sy = s[1]; + var sz = s[2]; + var ox = o[0]; + var oy = o[1]; + var oz = o[2]; + var out0 = (1 - (yy + zz)) * sx; + var out1 = (xy + wz) * sx; + var out2 = (xz - wy) * sx; + var out4 = (xy - wz) * sy; + var out5 = (1 - (xx + zz)) * sy; + var out6 = (yz + wx) * sy; + var out8 = (xz + wy) * sz; + var out9 = (yz - wx) * sz; + var out10 = (1 - (xx + yy)) * sz; + out[0] = out0; + out[1] = out1; + out[2] = out2; + out[3] = 0; + out[4] = out4; + out[5] = out5; + out[6] = out6; + out[7] = 0; + out[8] = out8; + out[9] = out9; + out[10] = out10; + out[11] = 0; + out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz); + out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz); + out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz); + out[15] = 1; + return out; + } + /** + * Calculates a 4x4 matrix from the given quaternion + * + * @param {mat4} out mat4 receiving operation result + * @param {ReadonlyQuat} q Quaternion to create matrix from + * + * @returns {mat4} out + */ + + function fromQuat(out, q) { + var x = q[0], + y = q[1], + z = q[2], + w = q[3]; + var x2 = x + x; + var y2 = y + y; + var z2 = z + z; + var xx = x * x2; + var yx = y * x2; + var yy = y * y2; + var zx = z * x2; + var zy = z * y2; + var zz = z * z2; + var wx = w * x2; + var wy = w * y2; + var wz = w * z2; + out[0] = 1 - yy - zz; + out[1] = yx + wz; + out[2] = zx - wy; + out[3] = 0; + out[4] = yx - wz; + out[5] = 1 - xx - zz; + out[6] = zy + wx; + out[7] = 0; + out[8] = zx + wy; + out[9] = zy - wx; + out[10] = 1 - xx - yy; + out[11] = 0; + out[12] = 0; + out[13] = 0; + out[14] = 0; + out[15] = 1; + return out; + } + /** + * Generates a frustum matrix with the given bounds + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {Number} left Left bound of the frustum + * @param {Number} right Right bound of the frustum + * @param {Number} bottom Bottom bound of the frustum + * @param {Number} top Top bound of the frustum + * @param {Number} near Near bound of the frustum + * @param {Number} far Far bound of the frustum + * @returns {mat4} out + */ + + function frustum(out, left, right, bottom, top, near, far) { + var rl = 1 / (right - left); + var tb = 1 / (top - bottom); + var nf = 1 / (near - far); + out[0] = near * 2 * rl; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = near * 2 * tb; + out[6] = 0; + out[7] = 0; + out[8] = (right + left) * rl; + out[9] = (top + bottom) * tb; + out[10] = (far + near) * nf; + out[11] = -1; + out[12] = 0; + out[13] = 0; + out[14] = far * near * 2 * nf; + out[15] = 0; + return out; + } + /** + * Generates a perspective projection matrix with the given bounds. + * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1], + * which matches WebGL/OpenGL's clip volume. + * Passing null/undefined/no value for far will generate infinite projection matrix. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {number} fovy Vertical field of view in radians + * @param {number} aspect Aspect ratio. typically viewport width/height + * @param {number} near Near bound of the frustum + * @param {number} far Far bound of the frustum, can be null or Infinity + * @returns {mat4} out + */ + + function perspectiveNO(out, fovy, aspect, near, far) { + var f = 1.0 / Math.tan(fovy / 2), + nf; + out[0] = f / aspect; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = f; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[11] = -1; + out[12] = 0; + out[13] = 0; + out[15] = 0; + + if (far != null && far !== Infinity) { + nf = 1 / (near - far); + out[10] = (far + near) * nf; + out[14] = 2 * far * near * nf; + } else { + out[10] = -1; + out[14] = -2 * near; + } + + return out; + } + /** + * Alias for {@link mat4.perspectiveNO} + * @function + */ + + var perspective = perspectiveNO; + /** + * Generates a perspective projection matrix suitable for WebGPU with the given bounds. + * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1], + * which matches WebGPU/Vulkan/DirectX/Metal's clip volume. + * Passing null/undefined/no value for far will generate infinite projection matrix. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {number} fovy Vertical field of view in radians + * @param {number} aspect Aspect ratio. typically viewport width/height + * @param {number} near Near bound of the frustum + * @param {number} far Far bound of the frustum, can be null or Infinity + * @returns {mat4} out + */ + + function perspectiveZO(out, fovy, aspect, near, far) { + var f = 1.0 / Math.tan(fovy / 2), + nf; + out[0] = f / aspect; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = f; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[11] = -1; + out[12] = 0; + out[13] = 0; + out[15] = 0; + + if (far != null && far !== Infinity) { + nf = 1 / (near - far); + out[10] = far * nf; + out[14] = far * near * nf; + } else { + out[10] = -1; + out[14] = -near; + } + + return out; + } + /** + * Generates a perspective projection matrix with the given field of view. + * This is primarily useful for generating projection matrices to be used + * with the still experiemental WebVR API. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees + * @param {number} near Near bound of the frustum + * @param {number} far Far bound of the frustum + * @returns {mat4} out + */ + + function perspectiveFromFieldOfView(out, fov, near, far) { + var upTan = Math.tan((fov.upDegrees * Math.PI) / 180.0); + var downTan = Math.tan((fov.downDegrees * Math.PI) / 180.0); + var leftTan = Math.tan((fov.leftDegrees * Math.PI) / 180.0); + var rightTan = Math.tan((fov.rightDegrees * Math.PI) / 180.0); + var xScale = 2.0 / (leftTan + rightTan); + var yScale = 2.0 / (upTan + downTan); + out[0] = xScale; + out[1] = 0.0; + out[2] = 0.0; + out[3] = 0.0; + out[4] = 0.0; + out[5] = yScale; + out[6] = 0.0; + out[7] = 0.0; + out[8] = -((leftTan - rightTan) * xScale * 0.5); + out[9] = (upTan - downTan) * yScale * 0.5; + out[10] = far / (near - far); + out[11] = -1.0; + out[12] = 0.0; + out[13] = 0.0; + out[14] = (far * near) / (near - far); + out[15] = 0.0; + return out; + } + /** + * Generates a orthogonal projection matrix with the given bounds. + * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1], + * which matches WebGL/OpenGL's clip volume. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {number} left Left bound of the frustum + * @param {number} right Right bound of the frustum + * @param {number} bottom Bottom bound of the frustum + * @param {number} top Top bound of the frustum + * @param {number} near Near bound of the frustum + * @param {number} far Far bound of the frustum + * @returns {mat4} out + */ + + function orthoNO(out, left, right, bottom, top, near, far) { + var lr = 1 / (left - right); + var bt = 1 / (bottom - top); + var nf = 1 / (near - far); + out[0] = -2 * lr; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = -2 * bt; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = 2 * nf; + out[11] = 0; + out[12] = (left + right) * lr; + out[13] = (top + bottom) * bt; + out[14] = (far + near) * nf; + out[15] = 1; + return out; + } + /** + * Alias for {@link mat4.orthoNO} + * @function + */ + + var ortho = orthoNO; + /** + * Generates a orthogonal projection matrix with the given bounds. + * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1], + * which matches WebGPU/Vulkan/DirectX/Metal's clip volume. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {number} left Left bound of the frustum + * @param {number} right Right bound of the frustum + * @param {number} bottom Bottom bound of the frustum + * @param {number} top Top bound of the frustum + * @param {number} near Near bound of the frustum + * @param {number} far Far bound of the frustum + * @returns {mat4} out + */ + + function orthoZO(out, left, right, bottom, top, near, far) { + var lr = 1 / (left - right); + var bt = 1 / (bottom - top); + var nf = 1 / (near - far); + out[0] = -2 * lr; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = -2 * bt; + out[6] = 0; + out[7] = 0; + out[8] = 0; + out[9] = 0; + out[10] = nf; + out[11] = 0; + out[12] = (left + right) * lr; + out[13] = (top + bottom) * bt; + out[14] = near * nf; + out[15] = 1; + return out; + } + /** + * Generates a look-at matrix with the given eye position, focal point, and up axis. + * If you want a matrix that actually makes an object look at another object, you should use targetTo instead. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {ReadonlyVec3} eye Position of the viewer + * @param {ReadonlyVec3} center Point the viewer is looking at + * @param {ReadonlyVec3} up vec3 pointing up + * @returns {mat4} out + */ + + function lookAt(out, eye, center, up) { + var x0, x1, x2, y0, y1, y2, z0, z1, z2, len; + var eyex = eye[0]; + var eyey = eye[1]; + var eyez = eye[2]; + var upx = up[0]; + var upy = up[1]; + var upz = up[2]; + var centerx = center[0]; + var centery = center[1]; + var centerz = center[2]; + + if ( + Math.abs(eyex - centerx) < EPSILON && + Math.abs(eyey - centery) < EPSILON && + Math.abs(eyez - centerz) < EPSILON + ) { + return identity(out); + } + + z0 = eyex - centerx; + z1 = eyey - centery; + z2 = eyez - centerz; + len = 1 / Math.hypot(z0, z1, z2); + z0 *= len; + z1 *= len; + z2 *= len; + x0 = upy * z2 - upz * z1; + x1 = upz * z0 - upx * z2; + x2 = upx * z1 - upy * z0; + len = Math.hypot(x0, x1, x2); + + if (!len) { + x0 = 0; + x1 = 0; + x2 = 0; + } else { + len = 1 / len; + x0 *= len; + x1 *= len; + x2 *= len; + } + + y0 = z1 * x2 - z2 * x1; + y1 = z2 * x0 - z0 * x2; + y2 = z0 * x1 - z1 * x0; + len = Math.hypot(y0, y1, y2); + + if (!len) { + y0 = 0; + y1 = 0; + y2 = 0; + } else { + len = 1 / len; + y0 *= len; + y1 *= len; + y2 *= len; + } + + out[0] = x0; + out[1] = y0; + out[2] = z0; + out[3] = 0; + out[4] = x1; + out[5] = y1; + out[6] = z1; + out[7] = 0; + out[8] = x2; + out[9] = y2; + out[10] = z2; + out[11] = 0; + out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez); + out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez); + out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez); + out[15] = 1; + return out; + } + /** + * Generates a matrix that makes something look at something else. + * + * @param {mat4} out mat4 frustum matrix will be written into + * @param {ReadonlyVec3} eye Position of the viewer + * @param {ReadonlyVec3} center Point the viewer is looking at + * @param {ReadonlyVec3} up vec3 pointing up + * @returns {mat4} out + */ + + function targetTo(out, eye, target, up) { + var eyex = eye[0], + eyey = eye[1], + eyez = eye[2], + upx = up[0], + upy = up[1], + upz = up[2]; + var z0 = eyex - target[0], + z1 = eyey - target[1], + z2 = eyez - target[2]; + var len = z0 * z0 + z1 * z1 + z2 * z2; + + if (len > 0) { + len = 1 / Math.sqrt(len); + z0 *= len; + z1 *= len; + z2 *= len; + } + + var x0 = upy * z2 - upz * z1, + x1 = upz * z0 - upx * z2, + x2 = upx * z1 - upy * z0; + len = x0 * x0 + x1 * x1 + x2 * x2; + + if (len > 0) { + len = 1 / Math.sqrt(len); + x0 *= len; + x1 *= len; + x2 *= len; + } + + out[0] = x0; + out[1] = x1; + out[2] = x2; + out[3] = 0; + out[4] = z1 * x2 - z2 * x1; + out[5] = z2 * x0 - z0 * x2; + out[6] = z0 * x1 - z1 * x0; + out[7] = 0; + out[8] = z0; + out[9] = z1; + out[10] = z2; + out[11] = 0; + out[12] = eyex; + out[13] = eyey; + out[14] = eyez; + out[15] = 1; + return out; + } + /** + * Returns a string representation of a mat4 + * + * @param {ReadonlyMat4} a matrix to represent as a string + * @returns {String} string representation of the matrix + */ + + function str(a) { + return ( + 'mat4(' + + a[0] + + ', ' + + a[1] + + ', ' + + a[2] + + ', ' + + a[3] + + ', ' + + a[4] + + ', ' + + a[5] + + ', ' + + a[6] + + ', ' + + a[7] + + ', ' + + a[8] + + ', ' + + a[9] + + ', ' + + a[10] + + ', ' + + a[11] + + ', ' + + a[12] + + ', ' + + a[13] + + ', ' + + a[14] + + ', ' + + a[15] + + ')' + ); + } + /** + * Returns Frobenius norm of a mat4 + * + * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of + * @returns {Number} Frobenius norm + */ + + function frob(a) { + return Math.hypot( + a[0], + a[1], + a[2], + a[3], + a[4], + a[5], + a[6], + a[7], + a[8], + a[9], + a[10], + a[11], + a[12], + a[13], + a[14], + a[15] + ); + } + /** + * Adds two mat4's + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the first operand + * @param {ReadonlyMat4} b the second operand + * @returns {mat4} out + */ + + function add(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + out[3] = a[3] + b[3]; + out[4] = a[4] + b[4]; + out[5] = a[5] + b[5]; + out[6] = a[6] + b[6]; + out[7] = a[7] + b[7]; + out[8] = a[8] + b[8]; + out[9] = a[9] + b[9]; + out[10] = a[10] + b[10]; + out[11] = a[11] + b[11]; + out[12] = a[12] + b[12]; + out[13] = a[13] + b[13]; + out[14] = a[14] + b[14]; + out[15] = a[15] + b[15]; + return out; + } + /** + * Subtracts matrix b from matrix a + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the first operand + * @param {ReadonlyMat4} b the second operand + * @returns {mat4} out + */ + + function subtract(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + out[2] = a[2] - b[2]; + out[3] = a[3] - b[3]; + out[4] = a[4] - b[4]; + out[5] = a[5] - b[5]; + out[6] = a[6] - b[6]; + out[7] = a[7] - b[7]; + out[8] = a[8] - b[8]; + out[9] = a[9] - b[9]; + out[10] = a[10] - b[10]; + out[11] = a[11] - b[11]; + out[12] = a[12] - b[12]; + out[13] = a[13] - b[13]; + out[14] = a[14] - b[14]; + out[15] = a[15] - b[15]; + return out; + } + /** + * Multiply each element of the matrix by a scalar. + * + * @param {mat4} out the receiving matrix + * @param {ReadonlyMat4} a the matrix to scale + * @param {Number} b amount to scale the matrix's elements by + * @returns {mat4} out + */ + + function multiplyScalar(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + out[2] = a[2] * b; + out[3] = a[3] * b; + out[4] = a[4] * b; + out[5] = a[5] * b; + out[6] = a[6] * b; + out[7] = a[7] * b; + out[8] = a[8] * b; + out[9] = a[9] * b; + out[10] = a[10] * b; + out[11] = a[11] * b; + out[12] = a[12] * b; + out[13] = a[13] * b; + out[14] = a[14] * b; + out[15] = a[15] * b; + return out; + } + /** + * Adds two mat4's after multiplying each element of the second operand by a scalar value. + * + * @param {mat4} out the receiving vector + * @param {ReadonlyMat4} a the first operand + * @param {ReadonlyMat4} b the second operand + * @param {Number} scale the amount to scale b's elements by before adding + * @returns {mat4} out + */ + + function multiplyScalarAndAdd(out, a, b, scale) { + out[0] = a[0] + b[0] * scale; + out[1] = a[1] + b[1] * scale; + out[2] = a[2] + b[2] * scale; + out[3] = a[3] + b[3] * scale; + out[4] = a[4] + b[4] * scale; + out[5] = a[5] + b[5] * scale; + out[6] = a[6] + b[6] * scale; + out[7] = a[7] + b[7] * scale; + out[8] = a[8] + b[8] * scale; + out[9] = a[9] + b[9] * scale; + out[10] = a[10] + b[10] * scale; + out[11] = a[11] + b[11] * scale; + out[12] = a[12] + b[12] * scale; + out[13] = a[13] + b[13] * scale; + out[14] = a[14] + b[14] * scale; + out[15] = a[15] + b[15] * scale; + return out; + } + /** + * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===) + * + * @param {ReadonlyMat4} a The first matrix. + * @param {ReadonlyMat4} b The second matrix. + * @returns {Boolean} True if the matrices are equal, false otherwise. + */ + + function exactEquals(a, b) { + return ( + a[0] === b[0] && + a[1] === b[1] && + a[2] === b[2] && + a[3] === b[3] && + a[4] === b[4] && + a[5] === b[5] && + a[6] === b[6] && + a[7] === b[7] && + a[8] === b[8] && + a[9] === b[9] && + a[10] === b[10] && + a[11] === b[11] && + a[12] === b[12] && + a[13] === b[13] && + a[14] === b[14] && + a[15] === b[15] + ); + } + /** + * Returns whether or not the matrices have approximately the same elements in the same position. + * + * @param {ReadonlyMat4} a The first matrix. + * @param {ReadonlyMat4} b The second matrix. + * @returns {Boolean} True if the matrices are equal, false otherwise. + */ + + function equals(a, b) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3]; + var a4 = a[4], + a5 = a[5], + a6 = a[6], + a7 = a[7]; + var a8 = a[8], + a9 = a[9], + a10 = a[10], + a11 = a[11]; + var a12 = a[12], + a13 = a[13], + a14 = a[14], + a15 = a[15]; + var b0 = b[0], + b1 = b[1], + b2 = b[2], + b3 = b[3]; + var b4 = b[4], + b5 = b[5], + b6 = b[6], + b7 = b[7]; + var b8 = b[8], + b9 = b[9], + b10 = b[10], + b11 = b[11]; + var b12 = b[12], + b13 = b[13], + b14 = b[14], + b15 = b[15]; + return ( + Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && + Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && + Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && + Math.abs(a3 - b3) <= EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && + Math.abs(a4 - b4) <= EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && + Math.abs(a5 - b5) <= EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && + Math.abs(a6 - b6) <= EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && + Math.abs(a7 - b7) <= EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && + Math.abs(a8 - b8) <= EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && + Math.abs(a9 - b9) <= EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && + Math.abs(a10 - b10) <= EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && + Math.abs(a11 - b11) <= EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && + Math.abs(a12 - b12) <= EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && + Math.abs(a13 - b13) <= EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && + Math.abs(a14 - b14) <= EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && + Math.abs(a15 - b15) <= EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15)) + ); + } + /** + * Alias for {@link mat4.multiply} + * @function + */ + + var mul = multiply; + /** + * Alias for {@link mat4.subtract} + * @function + */ + + var sub = subtract; + + var mat4 = /*#__PURE__*/ Object.freeze({ + __proto__: null, + create: create$1, + clone: clone, + copy: copy, + fromValues: fromValues$1, + set: set, + identity: identity, + transpose: transpose, + invert: invert, + adjoint: adjoint, + determinant: determinant, + multiply: multiply, + translate: translate, + scale: scale, + rotate: rotate, + rotateX: rotateX, + rotateY: rotateY, + rotateZ: rotateZ, + fromTranslation: fromTranslation, + fromScaling: fromScaling, + fromRotation: fromRotation, + fromXRotation: fromXRotation, + fromYRotation: fromYRotation, + fromZRotation: fromZRotation, + fromRotationTranslation: fromRotationTranslation, + fromQuat2: fromQuat2, + getTranslation: getTranslation, + getScaling: getScaling, + getRotation: getRotation, + fromRotationTranslationScale: fromRotationTranslationScale, + fromRotationTranslationScaleOrigin: fromRotationTranslationScaleOrigin, + fromQuat: fromQuat, + frustum: frustum, + perspectiveNO: perspectiveNO, + perspective: perspective, + perspectiveZO: perspectiveZO, + perspectiveFromFieldOfView: perspectiveFromFieldOfView, + orthoNO: orthoNO, + ortho: ortho, + orthoZO: orthoZO, + lookAt: lookAt, + targetTo: targetTo, + str: str, + frob: frob, + add: add, + subtract: subtract, + multiplyScalar: multiplyScalar, + multiplyScalarAndAdd: multiplyScalarAndAdd, + exactEquals: exactEquals, + equals: equals, + mul: mul, + sub: sub, + }); + + /** + * 3 Dimensional Vector + * @module vec3 + */ + + /** + * Creates a new, empty vec3 + * + * @returns {vec3} a new 3D vector + */ + + function create$2() { + var out = new ARRAY_TYPE(3); + + if (ARRAY_TYPE != Float32Array) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + } + + return out; + } + /** + * Creates a new vec3 initialized with values from an existing vector + * + * @param {ReadonlyVec3} a vector to clone + * @returns {vec3} a new 3D vector + */ + + function clone$1(a) { + var out = new ARRAY_TYPE(3); + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + return out; + } + /** + * Calculates the length of a vec3 + * + * @param {ReadonlyVec3} a vector to calculate length of + * @returns {Number} length of a + */ + + function length(a) { + var x = a[0]; + var y = a[1]; + var z = a[2]; + return Math.hypot(x, y, z); + } + /** + * Creates a new vec3 initialized with the given values + * + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @returns {vec3} a new 3D vector + */ + + function fromValues$2(x, y, z) { + var out = new ARRAY_TYPE(3); + out[0] = x; + out[1] = y; + out[2] = z; + return out; + } + /** + * Copy the values from one vec3 to another + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the source vector + * @returns {vec3} out + */ + + function copy$1(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + return out; + } + /** + * Set the components of a vec3 to the given values + * + * @param {vec3} out the receiving vector + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @returns {vec3} out + */ + + function set$1(out, x, y, z) { + out[0] = x; + out[1] = y; + out[2] = z; + return out; + } + /** + * Adds two vec3's + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {vec3} out + */ + + function add$1(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + out[2] = a[2] + b[2]; + return out; + } + /** + * Subtracts vector b from vector a + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {vec3} out + */ + + function subtract$1(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + out[2] = a[2] - b[2]; + return out; + } + /** + * Multiplies two vec3's + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {vec3} out + */ + + function multiply$1(out, a, b) { + out[0] = a[0] * b[0]; + out[1] = a[1] * b[1]; + out[2] = a[2] * b[2]; + return out; + } + /** + * Scales a vec3 by a scalar number + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the vector to scale + * @param {Number} b amount to scale the vector by + * @returns {vec3} out + */ + + function scale$1(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + out[2] = a[2] * b; + return out; + } + /** + * Normalize a vec3 + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a vector to normalize + * @returns {vec3} out + */ + + function normalize(out, a) { + var x = a[0]; + var y = a[1]; + var z = a[2]; + var len = x * x + y * y + z * z; + + if (len > 0) { + //TODO: evaluate use of glm_invsqrt here? + len = 1 / Math.sqrt(len); + } + + out[0] = a[0] * len; + out[1] = a[1] * len; + out[2] = a[2] * len; + return out; + } + /** + * Calculates the dot product of two vec3's + * + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {Number} dot product of a and b + */ + + function dot(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; + } + /** + * Computes the cross product of two vec3's + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @returns {vec3} out + */ + + function cross(out, a, b) { + var ax = a[0], + ay = a[1], + az = a[2]; + var bx = b[0], + by = b[1], + bz = b[2]; + out[0] = ay * bz - az * by; + out[1] = az * bx - ax * bz; + out[2] = ax * by - ay * bx; + return out; + } + /** + * Performs a linear interpolation between two vec3's + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the first operand + * @param {ReadonlyVec3} b the second operand + * @param {Number} t interpolation amount, in the range [0-1], between the two inputs + * @returns {vec3} out + */ + + function lerp(out, a, b, t) { + var ax = a[0]; + var ay = a[1]; + var az = a[2]; + out[0] = ax + t * (b[0] - ax); + out[1] = ay + t * (b[1] - ay); + out[2] = az + t * (b[2] - az); + return out; + } + /** + * Transforms the vec3 with a mat4. + * 4th vector component is implicitly '1' + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the vector to transform + * @param {ReadonlyMat4} m matrix to transform with + * @returns {vec3} out + */ + + function transformMat4(out, a, m) { + var x = a[0], + y = a[1], + z = a[2]; + var w = m[3] * x + m[7] * y + m[11] * z + m[15]; + w = w || 1.0; + out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w; + out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w; + out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w; + return out; + } + /** + * Transforms the vec3 with a mat3. + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the vector to transform + * @param {ReadonlyMat3} m the 3x3 matrix to transform with + * @returns {vec3} out + */ + + function transformMat3(out, a, m) { + var x = a[0], + y = a[1], + z = a[2]; + out[0] = x * m[0] + y * m[3] + z * m[6]; + out[1] = x * m[1] + y * m[4] + z * m[7]; + out[2] = x * m[2] + y * m[5] + z * m[8]; + return out; + } + /** + * Transforms the vec3 with a quat + * Can also be used for dual quaternions. (Multiply it with the real part) + * + * @param {vec3} out the receiving vector + * @param {ReadonlyVec3} a the vector to transform + * @param {ReadonlyQuat} q quaternion to transform with + * @returns {vec3} out + */ + + function transformQuat(out, a, q) { + // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed + var qx = q[0], + qy = q[1], + qz = q[2], + qw = q[3]; + var x = a[0], + y = a[1], + z = a[2]; // var qvec = [qx, qy, qz]; + // var uv = vec3.cross([], qvec, a); + + var uvx = qy * z - qz * y, + uvy = qz * x - qx * z, + uvz = qx * y - qy * x; // var uuv = vec3.cross([], qvec, uv); + + var uuvx = qy * uvz - qz * uvy, + uuvy = qz * uvx - qx * uvz, + uuvz = qx * uvy - qy * uvx; // vec3.scale(uv, uv, 2 * w); + + var w2 = qw * 2; + uvx *= w2; + uvy *= w2; + uvz *= w2; // vec3.scale(uuv, uuv, 2); + + uuvx *= 2; + uuvy *= 2; + uuvz *= 2; // return vec3.add(out, a, vec3.add(out, uv, uuv)); + + out[0] = x + uvx + uuvx; + out[1] = y + uvy + uuvy; + out[2] = z + uvz + uuvz; + return out; + } + /** + * Returns whether or not the vectors have approximately the same elements in the same position. + * + * @param {ReadonlyVec3} a The first vector. + * @param {ReadonlyVec3} b The second vector. + * @returns {Boolean} True if the vectors are equal, false otherwise. + */ + + function equals$1(a, b) { + var a0 = a[0], + a1 = a[1], + a2 = a[2]; + var b0 = b[0], + b1 = b[1], + b2 = b[2]; + return ( + Math.abs(a0 - b0) <= EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && + Math.abs(a1 - b1) <= EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && + Math.abs(a2 - b2) <= EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) + ); + } + /** + * Alias for {@link vec3.length} + * @function + */ + + var len = length; + /** + * Perform some operation over an array of vec3s. + * + * @param {Array} a the array of vectors to iterate over + * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed + * @param {Number} offset Number of elements to skip at the beginning of the array + * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array + * @param {Function} fn Function to call for each vector in the array + * @param {Object} [arg] additional argument to pass to fn + * @returns {Array} a + * @function + */ + + var forEach = (function () { + var vec = create$2(); + return function (a, stride, offset, count, fn, arg) { + var i, l; + + if (!stride) { + stride = 3; + } + + if (!offset) { + offset = 0; + } + + if (count) { + l = Math.min(count * stride + offset, a.length); + } else { + l = a.length; + } + + for (i = offset; i < l; i += stride) { + vec[0] = a[i]; + vec[1] = a[i + 1]; + vec[2] = a[i + 2]; + fn(vec, vec, arg); + a[i] = vec[0]; + a[i + 1] = vec[1]; + a[i + 2] = vec[2]; + } + + return a; + }; + })(); + + /** + * 4 Dimensional Vector + * @module vec4 + */ + + /** + * Creates a new, empty vec4 + * + * @returns {vec4} a new 4D vector + */ + + function create$3() { + var out = new ARRAY_TYPE(4); + + if (ARRAY_TYPE != Float32Array) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 0; + } + + return out; + } + /** + * Creates a new vec4 initialized with the given values + * + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @param {Number} w W component + * @returns {vec4} a new 4D vector + */ + + function fromValues$3(x, y, z, w) { + var out = new ARRAY_TYPE(4); + out[0] = x; + out[1] = y; + out[2] = z; + out[3] = w; + return out; + } + /** + * Copy the values from one vec4 to another + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the source vector + * @returns {vec4} out + */ + + function copy$2(out, a) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + return out; + } + /** + * Normalize a vec4 + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a vector to normalize + * @returns {vec4} out + */ + + function normalize$1(out, a) { + var x = a[0]; + var y = a[1]; + var z = a[2]; + var w = a[3]; + var len = x * x + y * y + z * z + w * w; + + if (len > 0) { + len = 1 / Math.sqrt(len); + } + + out[0] = x * len; + out[1] = y * len; + out[2] = z * len; + out[3] = w * len; + return out; + } + /** + * Transforms the vec4 with a mat4. + * + * @param {vec4} out the receiving vector + * @param {ReadonlyVec4} a the vector to transform + * @param {ReadonlyMat4} m matrix to transform with + * @returns {vec4} out + */ + + function transformMat4$1(out, a, m) { + var x = a[0], + y = a[1], + z = a[2], + w = a[3]; + out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w; + out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w; + out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w; + out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w; + return out; + } + /** + * Perform some operation over an array of vec4s. + * + * @param {Array} a the array of vectors to iterate over + * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed + * @param {Number} offset Number of elements to skip at the beginning of the array + * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array + * @param {Function} fn Function to call for each vector in the array + * @param {Object} [arg] additional argument to pass to fn + * @returns {Array} a + * @function + */ + + var forEach$1 = (function () { + var vec = create$3(); + return function (a, stride, offset, count, fn, arg) { + var i, l; + + if (!stride) { + stride = 4; + } + + if (!offset) { + offset = 0; + } + + if (count) { + l = Math.min(count * stride + offset, a.length); + } else { + l = a.length; + } + + for (i = offset; i < l; i += stride) { + vec[0] = a[i]; + vec[1] = a[i + 1]; + vec[2] = a[i + 2]; + vec[3] = a[i + 3]; + fn(vec, vec, arg); + a[i] = vec[0]; + a[i + 1] = vec[1]; + a[i + 2] = vec[2]; + a[i + 3] = vec[3]; + } + + return a; + }; + })(); + + /** + * Quaternion + * @module quat + */ + + /** + * Creates a new identity quat + * + * @returns {quat} a new quaternion + */ + + function create$4() { + var out = new ARRAY_TYPE(4); + + if (ARRAY_TYPE != Float32Array) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + } + + out[3] = 1; + return out; + } + /** + * Sets a quat from the given angle and rotation axis, + * then returns it. + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyVec3} axis the axis around which to rotate + * @param {Number} rad the angle in radians + * @returns {quat} out + **/ + + function setAxisAngle(out, axis, rad) { + rad = rad * 0.5; + var s = Math.sin(rad); + out[0] = s * axis[0]; + out[1] = s * axis[1]; + out[2] = s * axis[2]; + out[3] = Math.cos(rad); + return out; + } + /** + * Multiplies two quat's + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a the first operand + * @param {ReadonlyQuat} b the second operand + * @returns {quat} out + */ + + function multiply$2(out, a, b) { + var ax = a[0], + ay = a[1], + az = a[2], + aw = a[3]; + var bx = b[0], + by = b[1], + bz = b[2], + bw = b[3]; + out[0] = ax * bw + aw * bx + ay * bz - az * by; + out[1] = ay * bw + aw * by + az * bx - ax * bz; + out[2] = az * bw + aw * bz + ax * by - ay * bx; + out[3] = aw * bw - ax * bx - ay * by - az * bz; + return out; + } + /** + * Performs a spherical linear interpolation between two quat + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a the first operand + * @param {ReadonlyQuat} b the second operand + * @param {Number} t interpolation amount, in the range [0-1], between the two inputs + * @returns {quat} out + */ + + function slerp(out, a, b, t) { + // benchmarks: + // http://jsperf.com/quaternion-slerp-implementations + var ax = a[0], + ay = a[1], + az = a[2], + aw = a[3]; + var bx = b[0], + by = b[1], + bz = b[2], + bw = b[3]; + var omega, cosom, sinom, scale0, scale1; // calc cosine + + cosom = ax * bx + ay * by + az * bz + aw * bw; // adjust signs (if necessary) + + if (cosom < 0.0) { + cosom = -cosom; + bx = -bx; + by = -by; + bz = -bz; + bw = -bw; + } // calculate coefficients + + if (1.0 - cosom > EPSILON) { + // standard case (slerp) + omega = Math.acos(cosom); + sinom = Math.sin(omega); + scale0 = Math.sin((1.0 - t) * omega) / sinom; + scale1 = Math.sin(t * omega) / sinom; + } else { + // "from" and "to" quaternions are very close + // ... so we can do a linear interpolation + scale0 = 1.0 - t; + scale1 = t; + } // calculate final values + + out[0] = scale0 * ax + scale1 * bx; + out[1] = scale0 * ay + scale1 * by; + out[2] = scale0 * az + scale1 * bz; + out[3] = scale0 * aw + scale1 * bw; + return out; + } + /** + * Calculates the inverse of a quat + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a quat to calculate inverse of + * @returns {quat} out + */ + + function invert$1(out, a) { + var a0 = a[0], + a1 = a[1], + a2 = a[2], + a3 = a[3]; + var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3; + var invDot = dot ? 1.0 / dot : 0; // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0 + + out[0] = -a0 * invDot; + out[1] = -a1 * invDot; + out[2] = -a2 * invDot; + out[3] = a3 * invDot; + return out; + } + /** + * Creates a quaternion from the given 3x3 rotation matrix. + * + * NOTE: The resultant quaternion is not normalized, so you should be sure + * to renormalize the quaternion yourself where necessary. + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyMat3} m rotation matrix + * @returns {quat} out + * @function + */ + + function fromMat3(out, m) { + // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes + // article "Quaternion Calculus and Fast Animation". + var fTrace = m[0] + m[4] + m[8]; + var fRoot; + + if (fTrace > 0.0) { + // |w| > 1/2, may as well choose w > 1/2 + fRoot = Math.sqrt(fTrace + 1.0); // 2w + + out[3] = 0.5 * fRoot; + fRoot = 0.5 / fRoot; // 1/(4w) + + out[0] = (m[5] - m[7]) * fRoot; + out[1] = (m[6] - m[2]) * fRoot; + out[2] = (m[1] - m[3]) * fRoot; + } else { + // |w| <= 1/2 + var i = 0; + if (m[4] > m[0]) i = 1; + if (m[8] > m[i * 3 + i]) i = 2; + var j = (i + 1) % 3; + var k = (i + 2) % 3; + fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0); + out[i] = 0.5 * fRoot; + fRoot = 0.5 / fRoot; + out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot; + out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot; + out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot; + } + + return out; + } + /** + * Creates a quaternion from the given euler angle x, y, z. + * + * @param {quat} out the receiving quaternion + * @param {x} Angle to rotate around X axis in degrees. + * @param {y} Angle to rotate around Y axis in degrees. + * @param {z} Angle to rotate around Z axis in degrees. + * @returns {quat} out + * @function + */ + + function fromEuler(out, x, y, z) { + var halfToRad = (0.5 * Math.PI) / 180.0; + x *= halfToRad; + y *= halfToRad; + z *= halfToRad; + var sx = Math.sin(x); + var cx = Math.cos(x); + var sy = Math.sin(y); + var cy = Math.cos(y); + var sz = Math.sin(z); + var cz = Math.cos(z); + out[0] = sx * cy * cz - cx * sy * sz; + out[1] = cx * sy * cz + sx * cy * sz; + out[2] = cx * cy * sz - sx * sy * cz; + out[3] = cx * cy * cz + sx * sy * sz; + return out; + } + /** + * Creates a new quat initialized with the given values + * + * @param {Number} x X component + * @param {Number} y Y component + * @param {Number} z Z component + * @param {Number} w W component + * @returns {quat} a new quaternion + * @function + */ + + var fromValues$4 = fromValues$3; + /** + * Copy the values from one quat to another + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a the source quaternion + * @returns {quat} out + * @function + */ + + var copy$3 = copy$2; + /** + * Alias for {@link quat.multiply} + * @function + */ + + var mul$1 = multiply$2; + /** + * Normalize a quat + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a quaternion to normalize + * @returns {quat} out + * @function + */ + + var normalize$2 = normalize$1; + /** + * Sets a quaternion to represent the shortest rotation from one + * vector to another. + * + * Both vectors are assumed to be unit length. + * + * @param {quat} out the receiving quaternion. + * @param {ReadonlyVec3} a the initial vector + * @param {ReadonlyVec3} b the destination vector + * @returns {quat} out + */ + + var rotationTo = (function () { + var tmpvec3 = create$2(); + var xUnitVec3 = fromValues$2(1, 0, 0); + var yUnitVec3 = fromValues$2(0, 1, 0); + return function (out, a, b) { + var dot$1 = dot(a, b); + + if (dot$1 < -0.999999) { + cross(tmpvec3, xUnitVec3, a); + if (len(tmpvec3) < 0.000001) cross(tmpvec3, yUnitVec3, a); + normalize(tmpvec3, tmpvec3); + setAxisAngle(out, tmpvec3, Math.PI); + return out; + } else if (dot$1 > 0.999999) { + out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] = 1; + return out; + } else { + cross(tmpvec3, a, b); + out[0] = tmpvec3[0]; + out[1] = tmpvec3[1]; + out[2] = tmpvec3[2]; + out[3] = 1 + dot$1; + return normalize$2(out, out); + } + }; + })(); + /** + * Performs a spherical linear interpolation with two control points + * + * @param {quat} out the receiving quaternion + * @param {ReadonlyQuat} a the first operand + * @param {ReadonlyQuat} b the second operand + * @param {ReadonlyQuat} c the third operand + * @param {ReadonlyQuat} d the fourth operand + * @param {Number} t interpolation amount, in the range [0-1], between the two inputs + * @returns {quat} out + */ + + var sqlerp = (function () { + var temp1 = create$4(); + var temp2 = create$4(); + return function (out, a, b, c, d, t) { + slerp(temp1, a, d, t); + slerp(temp2, b, c, t); + slerp(out, temp1, temp2, 2 * t * (1 - t)); + return out; + }; + })(); + /** + * Sets the specified quaternion with values corresponding to the given + * axes. Each axis is a vec3 and is expected to be unit length and + * perpendicular to all other specified axes. + * + * @param {ReadonlyVec3} view the vector representing the viewing direction + * @param {ReadonlyVec3} right the vector representing the local "right" direction + * @param {ReadonlyVec3} up the vector representing the local "up" direction + * @returns {quat} out + */ + + var setAxes = (function () { + var matr = create(); + return function (out, view, right, up) { + matr[0] = right[0]; + matr[3] = right[1]; + matr[6] = right[2]; + matr[1] = up[0]; + matr[4] = up[1]; + matr[7] = up[2]; + matr[2] = -view[0]; + matr[5] = -view[1]; + matr[8] = -view[2]; + return normalize$2(out, fromMat3(out, matr)); + }; + })(); + + /** + * 2 Dimensional Vector + * @module vec2 + */ + + /** + * Creates a new, empty vec2 + * + * @returns {vec2} a new 2D vector + */ + + function create$5() { + var out = new ARRAY_TYPE(2); + + if (ARRAY_TYPE != Float32Array) { + out[0] = 0; + out[1] = 0; + } + + return out; + } + /** + * Creates a new vec2 initialized with the given values + * + * @param {Number} x X component + * @param {Number} y Y component + * @returns {vec2} a new 2D vector + */ + + function fromValues$5(x, y) { + var out = new ARRAY_TYPE(2); + out[0] = x; + out[1] = y; + return out; + } + /** + * Copy the values from one vec2 to another + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the source vector + * @returns {vec2} out + */ + + function copy$4(out, a) { + out[0] = a[0]; + out[1] = a[1]; + return out; + } + /** + * Adds two vec2's + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @returns {vec2} out + */ + + function add$2(out, a, b) { + out[0] = a[0] + b[0]; + out[1] = a[1] + b[1]; + return out; + } + /** + * Subtracts vector b from vector a + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @returns {vec2} out + */ + + function subtract$2(out, a, b) { + out[0] = a[0] - b[0]; + out[1] = a[1] - b[1]; + return out; + } + /** + * Returns the minimum of two vec2's + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @returns {vec2} out + */ + + function min$1(out, a, b) { + out[0] = Math.min(a[0], b[0]); + out[1] = Math.min(a[1], b[1]); + return out; + } + /** + * Returns the maximum of two vec2's + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @returns {vec2} out + */ + + function max$1(out, a, b) { + out[0] = Math.max(a[0], b[0]); + out[1] = Math.max(a[1], b[1]); + return out; + } + /** + * Scales a vec2 by a scalar number + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a the vector to scale + * @param {Number} b amount to scale the vector by + * @returns {vec2} out + */ + + function scale$2(out, a, b) { + out[0] = a[0] * b; + out[1] = a[1] * b; + return out; + } + /** + * Calculates the euclidian distance between two vec2's + * + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @returns {Number} distance between a and b + */ + + function distance(a, b) { + var x = b[0] - a[0], + y = b[1] - a[1]; + return Math.hypot(x, y); + } + /** + * Normalize a vec2 + * + * @param {vec2} out the receiving vector + * @param {ReadonlyVec2} a vector to normalize + * @returns {vec2} out + */ + + function normalize$3(out, a) { + var x = a[0], + y = a[1]; + var len = x * x + y * y; + + if (len > 0) { + //TODO: evaluate use of glm_invsqrt here? + len = 1 / Math.sqrt(len); + } + + out[0] = a[0] * len; + out[1] = a[1] * len; + return out; + } + /** + * Calculates the dot product of two vec2's + * + * @param {ReadonlyVec2} a the first operand + * @param {ReadonlyVec2} b the second operand + * @returns {Number} dot product of a and b + */ + + function dot$1(a, b) { + return a[0] * b[0] + a[1] * b[1]; + } + /** + * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===) + * + * @param {ReadonlyVec2} a The first vector. + * @param {ReadonlyVec2} b The second vector. + * @returns {Boolean} True if the vectors are equal, false otherwise. + */ + + function exactEquals$1(a, b) { + return a[0] === b[0] && a[1] === b[1]; + } + /** + * Alias for {@link vec2.subtract} + * @function + */ + + var sub$1 = subtract$2; + /** + * Perform some operation over an array of vec2s. + * + * @param {Array} a the array of vectors to iterate over + * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed + * @param {Number} offset Number of elements to skip at the beginning of the array + * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array + * @param {Function} fn Function to call for each vector in the array + * @param {Object} [arg] additional argument to pass to fn + * @returns {Array} a + * @function + */ + + var forEach$2 = (function () { + var vec = create$5(); + return function (a, stride, offset, count, fn, arg) { + var i, l; + + if (!stride) { + stride = 2; + } + + if (!offset) { + offset = 0; + } + + if (count) { + l = Math.min(count * stride + offset, a.length); + } else { + l = a.length; + } + + for (i = offset; i < l; i += stride) { + vec[0] = a[i]; + vec[1] = a[i + 1]; + fn(vec, vec, arg); + a[i] = vec[0]; + a[i + 1] = vec[1]; + } + + return a; + }; + })(); + + var paramsParser = { + x1: 0, + y1: 0, + x2: 0, + y2: 0, + x: 0, + y: 0, + qx: null, + qy: null, + }; + + function fixArc(pathArray, allPathCommands, i) { + if (pathArray[i].length > 7) { + pathArray[i].shift(); + var pi = pathArray[i]; + // const ni = i + 1; + var ni = i; + while (pi.length) { + // if created multiple C:s, their original seg is saved + allPathCommands[i] = 'A'; + // @ts-ignore + pathArray.splice((ni += 1), 0, ['C'].concat(pi.splice(0, 6))); + } + pathArray.splice(i, 1); + } + } + + var paramsCount = { + a: 7, + c: 6, + h: 1, + l: 2, + m: 2, + r: 4, + q: 4, + s: 4, + t: 2, + v: 1, + z: 0, + }; + + /** + * Iterates an array to check if it's an actual `PathArray`. + */ + function isPathArray(path) { + return ( + Array.isArray(path) && + path.every(function (seg) { + var lk = seg[0].toLowerCase(); + return paramsCount[lk] === seg.length - 1 && 'achlmqstvz'.includes(lk); + }) + ); + } + + /** + * Iterates an array to check if it's a `PathArray` + * with all absolute values. + */ + function isAbsoluteArray(path) { + return ( + isPathArray(path) && + // @ts-ignore -- `isPathArray` also checks if it's `Array` + path.every(function (_a) { + var x = _a[0]; + return x === x.toUpperCase(); + }) + ); + } + + /** + * Iterates an array to check if it's a `PathArray` + * with all segments are in non-shorthand notation + * with absolute values. + */ + function isNormalizedArray(path) { + return ( + isAbsoluteArray(path) && + path.every(function (_a) { + var pc = _a[0]; + return 'ACLMQZ'.includes(pc); + }) + ); + } + + /** + * Breaks the parsing of a pathString once a segment is finalized. + */ + function finalizeSegment(path) { + var pathCommand = path.pathValue[path.segmentStart]; + var LK = pathCommand.toLowerCase(); + var data = path.data; + while (data.length >= paramsCount[LK]) { + // overloaded `moveTo` + // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts + if (LK === 'm' && data.length > 2) { + // @ts-ignore + path.segments.push([pathCommand].concat(data.splice(0, 2))); + LK = 'l'; + pathCommand = pathCommand === 'm' ? 'l' : 'L'; + } else { + // @ts-ignore + path.segments.push([pathCommand].concat(data.splice(0, paramsCount[LK]))); + } + if (!paramsCount[LK]) { + break; + } + } + } + + /** + * Validates an A (arc-to) specific path command value. + * Usually a `large-arc-flag` or `sweep-flag`. + */ + function scanFlag(path) { + var index = path.index, + pathValue = path.pathValue; + var code = pathValue.charCodeAt(index); + if (code === 0x30 /* 0 */) { + path.param = 0; + path.index += 1; + return; + } + if (code === 0x31 /* 1 */) { + path.param = 1; + path.index += 1; + return; + } + path.err = + '[path-util]: invalid Arc flag "' + + pathValue[index] + + '", expecting 0 or 1 at index ' + + index; + } + + /** + * Checks if the character is or belongs to a number. + * [0-9]|+|-|. + */ + function isDigitStart(code) { + return ( + (code >= 48 && code <= 57) /* 0..9 */ || + code === 0x2b /* + */ || + code === 0x2d /* - */ || + code === 0x2e + ); /* . */ + } + function isDigit(code) { + return code >= 48 && code <= 57; // 0..9 + } + + /** + * Validates every character of the path string, + * every path command, negative numbers or floating point numbers. + */ + function scanParam(path) { + var max = path.max, + pathValue = path.pathValue, + start = path.index; + var index = start; + var zeroFirst = false; + var hasCeiling = false; + var hasDecimal = false; + var hasDot = false; + var ch; + if (index >= max) { + // path.err = 'SvgPath: missed param (at pos ' + index + ')'; + path.err = + '[path-util]: Invalid path value at index ' + index + ', "pathValue" is missing param'; + return; + } + ch = pathValue.charCodeAt(index); + if (ch === 0x2b /* + */ || ch === 0x2d /* - */) { + index += 1; + // ch = (index < max) ? pathValue.charCodeAt(index) : 0; + ch = pathValue.charCodeAt(index); + } + // This logic is shamelessly borrowed from Esprima + // https://github.com/ariya/esprimas + if (!isDigit(ch) && ch !== 0x2e /* . */) { + // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')'; + path.err = + '[path-util]: Invalid path value at index ' + + index + + ', "' + + pathValue[index] + + '" is not a number'; + return; + } + if (ch !== 0x2e /* . */) { + zeroFirst = ch === 0x30 /* 0 */; + index += 1; + ch = pathValue.charCodeAt(index); + if (zeroFirst && index < max) { + // decimal number starts with '0' such as '09' is illegal. + if (ch && isDigit(ch)) { + // path.err = 'SvgPath: numbers started with `0` such as `09` + // are illegal (at pos ' + start + ')'; + path.err = + '[path-util]: Invalid path value at index ' + + start + + ', "' + + pathValue[start] + + '" illegal number'; + return; + } + } + while (index < max && isDigit(pathValue.charCodeAt(index))) { + index += 1; + hasCeiling = true; + } + ch = pathValue.charCodeAt(index); + } + if (ch === 0x2e /* . */) { + hasDot = true; + index += 1; + while (isDigit(pathValue.charCodeAt(index))) { + index += 1; + hasDecimal = true; + } + ch = pathValue.charCodeAt(index); + } + if (ch === 0x65 /* e */ || ch === 0x45 /* E */) { + if (hasDot && !hasCeiling && !hasDecimal) { + path.err = + '[path-util]: Invalid path value at index ' + + index + + ', "' + + pathValue[index] + + '" invalid float exponent'; + return; + } + index += 1; + ch = pathValue.charCodeAt(index); + if (ch === 0x2b /* + */ || ch === 0x2d /* - */) { + index += 1; + } + if (index < max && isDigit(pathValue.charCodeAt(index))) { + while (index < max && isDigit(pathValue.charCodeAt(index))) { + index += 1; + } + } else { + path.err = + '[path-util]: Invalid path value at index ' + + index + + ', "' + + pathValue[index] + + '" invalid integer exponent'; + return; + } + } + path.index = index; + path.param = +path.pathValue.slice(start, index); + } + + /** + * Checks if the character is a space. + */ + function isSpace(ch) { + var specialSpaces = [ + 0x1680, 0x180e, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, + 0x2009, 0x200a, 0x202f, 0x205f, 0x3000, 0xfeff, + ]; + /* istanbul ignore next */ + return ( + ch === 0x0a || + ch === 0x0d || + ch === 0x2028 || + ch === 0x2029 || // Line terminators + // White spaces + ch === 0x20 || + ch === 0x09 || + ch === 0x0b || + ch === 0x0c || + ch === 0xa0 || + (ch >= 0x1680 && specialSpaces.includes(ch)) + ); + } + + /** + * Points the parser to the next character in the + * path string every time it encounters any kind of + * space character. + */ + function skipSpaces(path) { + var pathValue = path.pathValue, + max = path.max; + while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) { + path.index += 1; + } + } + + /** + * Checks if the character is a path command. + */ + function isPathCommand(code) { + // eslint-disable-next-line no-bitwise -- Impossible to satisfy + switch (code | 0x20) { + case 0x6d /* m */: + case 0x7a /* z */: + case 0x6c /* l */: + case 0x68 /* h */: + case 0x76 /* v */: + case 0x63 /* c */: + case 0x73 /* s */: + case 0x71 /* q */: + case 0x74 /* t */: + case 0x61 /* a */: + // case 0x72/* r */: + return true; + default: + return false; + } + } + + /** + * Checks if the character is an A (arc-to) path command. + */ + function isArcCommand(code) { + return (code | 0x20) === 0x61; + } + + /** + * Scans every character in the path string to determine + * where a segment starts and where it ends. + */ + function scanSegment(path) { + var max = path.max, + pathValue = path.pathValue, + index = path.index; + var cmdCode = pathValue.charCodeAt(index); + var reqParams = paramsCount[pathValue[index].toLowerCase()]; + path.segmentStart = index; + if (!isPathCommand(cmdCode)) { + path.err = '[path-util]: Invalid path value "' + pathValue[index] + '" is not a path command'; + return; + } + path.index += 1; + skipSpaces(path); + path.data = []; + if (!reqParams) { + // Z + finalizeSegment(path); + return; + } + for (;;) { + for (var i = reqParams; i > 0; i -= 1) { + if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path); + else scanParam(path); + if (path.err.length) { + return; + } + path.data.push(path.param); + skipSpaces(path); + // after ',' param is mandatory + if (path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */) { + path.index += 1; + skipSpaces(path); + } + } + if (path.index >= path.max) { + break; + } + // Stop on next segment + if (!isDigitStart(pathValue.charCodeAt(path.index))) { + break; + } + } + finalizeSegment(path); + } + + /** + * The `PathParser` is used by the `parsePathString` static method + * to generate a `pathArray`. + */ + var PathParser = /** @class */ (function () { + function PathParser(pathString) { + this.pathValue = pathString; + // @ts-ignore + this.segments = []; + this.max = pathString.length; + this.index = 0; + this.param = 0.0; + this.segmentStart = 0; + this.data = []; + this.err = ''; + } + return PathParser; + })(); + + /** + * Parses a path string value and returns an array + * of segments we like to call `pathArray`. + */ + function parsePathString(pathInput) { + if (isPathArray(pathInput)) { + return [].concat(pathInput); + } + var path = new PathParser(pathInput); + skipSpaces(path); + while (path.index < path.max && !path.err.length) { + scanSegment(path); + } + return path.err ? path.err : path.segments; + } + + function path2Absolute(pathInput) { + if (isAbsoluteArray(pathInput)) { + return [].concat(pathInput); + } + var path = parsePathString(pathInput); + // if (!path || !path.length) { + // return [['M', 0, 0]]; + // } + var x = 0; + var y = 0; + var mx = 0; + var my = 0; + // @ts-ignore + return path.map(function (segment) { + var values = segment.slice(1).map(Number); + var pathCommand = segment[0]; + var absCommand = pathCommand.toUpperCase(); + if (pathCommand === 'M') { + (x = values[0]), (y = values[1]); + mx = x; + my = y; + return ['M', x, y]; + } + var absoluteSegment; + if (pathCommand !== absCommand) { + switch (absCommand) { + case 'A': + absoluteSegment = [ + absCommand, + values[0], + values[1], + values[2], + values[3], + values[4], + values[5] + x, + values[6] + y, + ]; + break; + case 'V': + absoluteSegment = [absCommand, values[0] + y]; + break; + case 'H': + absoluteSegment = [absCommand, values[0] + x]; + break; + default: { + // use brakets for `eslint: no-case-declaration` + // https://stackoverflow.com/a/50753272/803358 + var absValues = values.map(function (n, j) { + return n + (j % 2 ? y : x); + }); + // for n, l, c, s, q, t + // @ts-ignore + absoluteSegment = [absCommand].concat(absValues); + } + } + } else { + // @ts-ignore + absoluteSegment = [absCommand].concat(values); + } + var segLength = absoluteSegment.length; + switch (absCommand) { + case 'Z': + x = mx; + y = my; + break; + case 'H': + x = absoluteSegment[1]; + break; + case 'V': + y = absoluteSegment[1]; + break; + default: + x = absoluteSegment[segLength - 2]; + y = absoluteSegment[segLength - 1]; + if (absCommand === 'M') { + mx = x; + my = y; + } + } + return absoluteSegment; + }); + } + + /** + * Normalizes a single segment of a `PathArray` object. + * eg. H/V -> L, T -> Q + */ + function normalizeSegment(segment, params) { + var pathCommand = segment[0]; + var px1 = params.x1, + py1 = params.y1, + px2 = params.x2, + py2 = params.y2; + var values = segment.slice(1).map(Number); + var result = segment; + if (!'TQ'.includes(pathCommand)) { + // optional but good to be cautious + params.qx = null; + params.qy = null; + } + if (pathCommand === 'H') { + result = ['L', segment[1], py1]; + } else if (pathCommand === 'V') { + result = ['L', px1, segment[1]]; + } else if (pathCommand === 'S') { + var x1 = px1 * 2 - px2; + var y1 = py1 * 2 - py2; + params.x1 = x1; + params.y1 = y1; + result = ['C', x1, y1].concat(values); + } else if (pathCommand === 'T') { + var qx = px1 * 2 - params.qx; + var qy = py1 * 2 - params.qy; + params.qx = qx; + params.qy = qy; + result = ['Q', qx, qy].concat(values); + } else if (pathCommand === 'Q') { + var nqx = values[0], + nqy = values[1]; + params.qx = nqx; + params.qy = nqy; + } + return result; + } + + /** + * @example + * const path = 'M0 0 H50'; + * const normalizedPath = SVGPathCommander.normalizePath(path); + * // result => [['M', 0, 0], ['L', 50, 0]] + */ + function normalizePath(pathInput) { + if (isNormalizedArray(pathInput)) { + return [].concat(pathInput); + } + var path = path2Absolute(pathInput); + var params = __assign({}, paramsParser); + for (var i = 0; i < path.length; i += 1) { + // Save current path command + path[i] = normalizeSegment(path[i], params); + var segment = path[i]; + var seglen = segment.length; + params.x1 = +segment[seglen - 2]; + params.y1 = +segment[seglen - 1]; + params.x2 = +segment[seglen - 4] || params.x1; + params.y2 = +segment[seglen - 3] || params.y1; + } + return path; + } + + /** + * Iterates an array to check if it's a `PathArray` + * with all C (cubic bezier) segments. + * + * @param {string | PathArray} path the `Array` to be checked + * @returns {boolean} iteration result + */ + function isCurveArray(path) { + return ( + isNormalizedArray(path) && + path.every(function (_a) { + var pc = _a[0]; + return 'MC'.includes(pc); + }) + ); + } + + function rotateVector(x, y, rad) { + var X = x * Math.cos(rad) - y * Math.sin(rad); + var Y = x * Math.sin(rad) + y * Math.cos(rad); + return { x: X, y: Y }; + } + + /** + * Converts A (arc-to) segments to C (cubic-bezier-to). + * + * For more information of where this math came from visit: + * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes + */ + function arcToCubic(X1, Y1, RX, RY, angle, LAF, SF, X2, Y2, recursive) { + var x1 = X1; + var y1 = Y1; + var rx = RX; + var ry = RY; + var x2 = X2; + var y2 = Y2; + // for more information of where this Math came from visit: + // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes + var d120 = (Math.PI * 120) / 180; + var rad = (Math.PI / 180) * (+angle || 0); + /** @type {number[]} */ + var res = []; + var xy; + var f1; + var f2; + var cx; + var cy; + if (!recursive) { + xy = rotateVector(x1, y1, -rad); + x1 = xy.x; + y1 = xy.y; + xy = rotateVector(x2, y2, -rad); + x2 = xy.x; + y2 = xy.y; + var x = (x1 - x2) / 2; + var y = (y1 - y2) / 2; + var h = (x * x) / (rx * rx) + (y * y) / (ry * ry); + if (h > 1) { + h = Math.sqrt(h); + rx *= h; + ry *= h; + } + var rx2 = rx * rx; + var ry2 = ry * ry; + var k = + (LAF === SF ? -1 : 1) * + Math.sqrt(Math.abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))); + cx = (k * rx * y) / ry + (x1 + x2) / 2; + cy = (k * -ry * x) / rx + (y1 + y2) / 2; + // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise + f1 = Math.asin(((((y1 - cy) / ry) * Math.pow(10, 9)) >> 0) / Math.pow(10, 9)); + // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise + f2 = Math.asin(((((y2 - cy) / ry) * Math.pow(10, 9)) >> 0) / Math.pow(10, 9)); + f1 = x1 < cx ? Math.PI - f1 : f1; + f2 = x2 < cx ? Math.PI - f2 : f2; + if (f1 < 0) f1 = Math.PI * 2 + f1; + if (f2 < 0) f2 = Math.PI * 2 + f2; + if (SF && f1 > f2) { + f1 -= Math.PI * 2; + } + if (!SF && f2 > f1) { + f2 -= Math.PI * 2; + } + } else { + (f1 = recursive[0]), (f2 = recursive[1]), (cx = recursive[2]), (cy = recursive[3]); + } + var df = f2 - f1; + if (Math.abs(df) > d120) { + var f2old = f2; + var x2old = x2; + var y2old = y2; + f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1); + x2 = cx + rx * Math.cos(f2); + y2 = cy + ry * Math.sin(f2); + res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [f2, f2old, cx, cy]); + } + df = f2 - f1; + var c1 = Math.cos(f1); + var s1 = Math.sin(f1); + var c2 = Math.cos(f2); + var s2 = Math.sin(f2); + var t = Math.tan(df / 4); + var hx = (4 / 3) * rx * t; + var hy = (4 / 3) * ry * t; + var m1 = [x1, y1]; + var m2 = [x1 + hx * s1, y1 - hy * c1]; + var m3 = [x2 + hx * s2, y2 - hy * c2]; + var m4 = [x2, y2]; + m2[0] = 2 * m1[0] - m2[0]; + m2[1] = 2 * m1[1] - m2[1]; + if (recursive) { + return m2.concat(m3, m4, res); + // return [...m2, ...m3, ...m4, ...res]; + } + res = m2.concat(m3, m4, res); + // res = [...m2, ...m3, ...m4, ...res]; + var newres = []; + for (var i = 0, ii = res.length; i < ii; i += 1) { + newres[i] = + i % 2 ? rotateVector(res[i - 1], res[i], rad).y : rotateVector(res[i], res[i + 1], rad).x; + } + return newres; + } + // const TAU = Math.PI * 2; + // const mapToEllipse = ( + // { x, y }: { x: number; y: number }, + // rx: number, + // ry: number, + // cosphi: number, + // sinphi: number, + // centerx: number, + // centery: number, + // ) => { + // x *= rx; + // y *= ry; + // const xp = cosphi * x - sinphi * y; + // const yp = sinphi * x + cosphi * y; + // return { + // x: xp + centerx, + // y: yp + centery, + // }; + // }; + // const approxUnitArc = (ang1: number, ang2: number) => { + // // If 90 degree circular arc, use a constant + // // as derived from http://spencermortensen.com/articles/bezier-circle + // const a = + // ang2 === 1.5707963267948966 + // ? 0.551915024494 + // : ang2 === -1.5707963267948966 + // ? -0.551915024494 + // : (4 / 3) * Math.tan(ang2 / 4); + // const x1 = Math.cos(ang1); + // const y1 = Math.sin(ang1); + // const x2 = Math.cos(ang1 + ang2); + // const y2 = Math.sin(ang1 + ang2); + // return [ + // { + // x: x1 - y1 * a, + // y: y1 + x1 * a, + // }, + // { + // x: x2 + y2 * a, + // y: y2 - x2 * a, + // }, + // { + // x: x2, + // y: y2, + // }, + // ]; + // }; + // const vectorAngle = (ux: number, uy: number, vx: number, vy: number) => { + // const sign = ux * vy - uy * vx < 0 ? -1 : 1; + // let dot = ux * vx + uy * vy; + // if (dot > 1) { + // dot = 1; + // } + // if (dot < -1) { + // dot = -1; + // } + // return sign * Math.acos(dot); + // }; + // const getArcCenter = ( + // px: any, + // py: any, + // cx: any, + // cy: any, + // rx: number, + // ry: number, + // largeArcFlag: number, + // sweepFlag: number, + // sinphi: number, + // cosphi: number, + // pxp: number, + // pyp: number, + // ) => { + // const rxsq = Math.pow(rx, 2); + // const rysq = Math.pow(ry, 2); + // const pxpsq = Math.pow(pxp, 2); + // const pypsq = Math.pow(pyp, 2); + // let radicant = rxsq * rysq - rxsq * pypsq - rysq * pxpsq; + // if (radicant < 0) { + // radicant = 0; + // } + // radicant /= rxsq * pypsq + rysq * pxpsq; + // radicant = Math.sqrt(radicant) * (largeArcFlag === sweepFlag ? -1 : 1); + // const centerxp = ((radicant * rx) / ry) * pyp; + // const centeryp = ((radicant * -ry) / rx) * pxp; + // const centerx = cosphi * centerxp - sinphi * centeryp + (px + cx) / 2; + // const centery = sinphi * centerxp + cosphi * centeryp + (py + cy) / 2; + // const vx1 = (pxp - centerxp) / rx; + // const vy1 = (pyp - centeryp) / ry; + // const vx2 = (-pxp - centerxp) / rx; + // const vy2 = (-pyp - centeryp) / ry; + // const ang1 = vectorAngle(1, 0, vx1, vy1); + // let ang2 = vectorAngle(vx1, vy1, vx2, vy2); + // if (sweepFlag === 0 && ang2 > 0) { + // ang2 -= TAU; + // } + // if (sweepFlag === 1 && ang2 < 0) { + // ang2 += TAU; + // } + // return [centerx, centery, ang1, ang2]; + // }; + // const arcToBezier = ({ px, py, cx, cy, rx, ry, xAxisRotation = 0, largeArcFlag = 0, sweepFlag = 0 }) => { + // const curves = []; + // if (rx === 0 || ry === 0) { + // return [{ x1: 0, y1: 0, x2: 0, y2: 0, x: cx, y: cy }]; + // } + // const sinphi = Math.sin((xAxisRotation * TAU) / 360); + // const cosphi = Math.cos((xAxisRotation * TAU) / 360); + // const pxp = (cosphi * (px - cx)) / 2 + (sinphi * (py - cy)) / 2; + // const pyp = (-sinphi * (px - cx)) / 2 + (cosphi * (py - cy)) / 2; + // if (pxp === 0 && pyp === 0) { + // return [{ x1: 0, y1: 0, x2: 0, y2: 0, x: cx, y: cy }]; + // } + // rx = Math.abs(rx); + // ry = Math.abs(ry); + // const lambda = Math.pow(pxp, 2) / Math.pow(rx, 2) + Math.pow(pyp, 2) / Math.pow(ry, 2); + // if (lambda > 1) { + // rx *= Math.sqrt(lambda); + // ry *= Math.sqrt(lambda); + // } + // let [centerx, centery, ang1, ang2] = getArcCenter( + // px, + // py, + // cx, + // cy, + // rx, + // ry, + // largeArcFlag, + // sweepFlag, + // sinphi, + // cosphi, + // pxp, + // pyp, + // ); + // // If 'ang2' == 90.0000000001, then `ratio` will evaluate to + // // 1.0000000001. This causes `segments` to be greater than one, which is an + // // unecessary split, and adds extra points to the bezier curve. To alleviate + // // this issue, we round to 1.0 when the ratio is close to 1.0. + // let ratio = Math.abs(ang2) / (TAU / 4); + // if (Math.abs(1.0 - ratio) < 0.0000001) { + // ratio = 1.0; + // } + // const segments = Math.max(Math.ceil(ratio), 1); + // ang2 /= segments; + // for (let i = 0; i < segments; i++) { + // curves.push(approxUnitArc(ang1, ang2)); + // ang1 += ang2; + // } + // return curves.map((curve) => { + // const { x: x1, y: y1 } = mapToEllipse(curve[0], rx, ry, cosphi, sinphi, centerx, centery); + // const { x: x2, y: y2 } = mapToEllipse(curve[1], rx, ry, cosphi, sinphi, centerx, centery); + // const { x, y } = mapToEllipse(curve[2], rx, ry, cosphi, sinphi, centerx, centery); + // return { x1, y1, x2, y2, x, y }; + // }); + // }; + // export function arcToCubic( + // x1: number, + // y1: number, + // rx: number, + // ry: number, + // angle: number, + // LAF: number, + // SF: number, + // x2: number, + // y2: number, + // ) { + // const curves = arcToBezier({ + // px: x1, + // py: y1, + // cx: x2, + // cy: y2, + // rx, + // ry, + // xAxisRotation: angle, + // largeArcFlag: LAF, + // sweepFlag: SF, + // }); + // return curves.reduce((prev, cur) => { + // const { x1, y1, x2, y2, x, y } = cur; + // prev.push(x1, y1, x2, y2, x, y); + // return prev; + // }, [] as number[]); + // } + + function quadToCubic(x1, y1, qx, qy, x2, y2) { + var r13 = 1 / 3; + var r23 = 2 / 3; + return [ + r13 * x1 + r23 * qx, + r13 * y1 + r23 * qy, + r13 * x2 + r23 * qx, + r13 * y2 + r23 * qy, + x2, + y2, // x,y + ]; + } + + function midPoint(a, b, t) { + var ax = a[0]; + var ay = a[1]; + var bx = b[0]; + var by = b[1]; + return [ax + (bx - ax) * t, ay + (by - ay) * t]; + } + + var lineToCubic = function (x1, y1, x2, y2) { + var t = 0.5; + var mid = midPoint([x1, y1], [x2, y2], t); + return __spreadArray(__spreadArray([], mid, true), [x2, y2, x2, y2], false); + }; + + function segmentToCubic(segment, params) { + var pathCommand = segment[0]; + var values = segment.slice(1).map(Number); + var x = values[0], + y = values[1]; + var args; + var px1 = params.x1, + py1 = params.y1, + px = params.x, + py = params.y; + if (!'TQ'.includes(pathCommand)) { + params.qx = null; + params.qy = null; + } + switch (pathCommand) { + case 'M': + params.x = x; + params.y = y; + return segment; + case 'A': + args = [px1, py1].concat(values); + // @ts-ignore + return ['C'].concat( + arcToCubic( + args[0], + args[1], + args[2], + args[3], + args[4], + args[5], + args[6], + args[7], + args[8], + args[9] + ) + ); + case 'Q': + params.qx = x; + params.qy = y; + args = [px1, py1].concat(values); + // @ts-ignore + return ['C'].concat(quadToCubic(args[0], args[1], args[2], args[3], args[4], args[5])); + case 'L': + // @ts-ignore + return ['C'].concat(lineToCubic(px1, py1, x, y)); + case 'Z': + // prevent NaN from divide 0 + if (px1 === px && py1 === py) { + return ['C', px1, py1, px, py, px, py]; + } + // @ts-ignore + return ['C'].concat(lineToCubic(px1, py1, px, py)); + } + return segment; + } + + // import { fixPath } from '../process/fix-path'; + function path2Curve(pathInput, needZCommandIndexes) { + if (needZCommandIndexes === void 0) { + needZCommandIndexes = false; + } + if (isCurveArray(pathInput)) { + var cloned = [].concat(pathInput); + if (needZCommandIndexes) { + return [cloned, []]; + } else { + return cloned; + } + } + // fixPath will remove 'Z' command + // const path = fixPath(normalizePath(pathInput)); + var path = normalizePath(pathInput); + var params = __assign({}, paramsParser); + var allPathCommands = []; + var pathCommand = ''; + var ii = path.length; + var segment; + var seglen; + var zCommandIndexes = []; + for (var i = 0; i < ii; i += 1) { + if (path[i]) pathCommand = path[i][0]; + allPathCommands[i] = pathCommand; + var curveSegment = segmentToCubic(path[i], params); + path[i] = curveSegment; + fixArc(path, allPathCommands, i); + ii = path.length; // solves curveArrays ending in Z + // keep Z command account for lineJoin + // @see https://github.com/antvis/util/issues/68 + if (pathCommand === 'Z') { + zCommandIndexes.push(i); + } + segment = path[i]; + seglen = segment.length; + params.x1 = +segment[seglen - 2]; + params.y1 = +segment[seglen - 1]; + params.x2 = +segment[seglen - 4] || params.x1; + params.y2 = +segment[seglen - 3] || params.y1; + } + // validate + if (needZCommandIndexes) { + return [path, zCommandIndexes]; + } else { + return path; + } + } + + function clonePath(path) { + return path.map(function (x) { + return Array.isArray(x) ? [].concat(x) : x; + }); + } + + // reverse CURVE based pathArray segments only + function reverseCurve(pathArray) { + var rotatedCurve = pathArray + .slice(1) + .map(function (x, i, curveOnly) { + // @ts-ignore + return !i + ? pathArray[0].slice(1).concat(x.slice(1)) + : curveOnly[i - 1].slice(-2).concat(x.slice(1)); + }) + // @ts-ignore + .map(function (x) { + return x.map(function (y, i) { + return x[x.length - i - 2 * (1 - (i % 2))]; + }); + }) + .reverse(); + return [['M'].concat(rotatedCurve[0].slice(0, 2))].concat( + rotatedCurve.map(function (x) { + return ['C'].concat(x.slice(2)); + }) + ); + } + + function distanceSquareRoot(a, b) { + return Math.sqrt((a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1])); + } + + /** + * Returns a {x,y} point at a given length, the total length and + * the minimum and maximum {x,y} coordinates of a line (L,V,H,Z) segment. + */ + function segmentLineFactory(x1, y1, x2, y2, distance) { + var length = distanceSquareRoot([x1, y1], [x2, y2]); + var point = { x: 0, y: 0 }; + if (typeof distance === 'number') { + if (distance <= 0) { + point = { x: x1, y: y1 }; + } else if (distance >= length) { + point = { x: x2, y: y2 }; + } else { + var _a = midPoint([x1, y1], [x2, y2], distance / length), + x = _a[0], + y = _a[1]; + point = { x: x, y: y }; + } + } + return { + length: length, + point: point, + min: { + x: Math.min(x1, x2), + y: Math.min(y1, y2), + }, + max: { + x: Math.max(x1, x2), + y: Math.max(y1, y2), + }, + }; + } + + function angleBetween(v0, v1) { + var v0x = v0.x, + v0y = v0.y; + var v1x = v1.x, + v1y = v1.y; + var p = v0x * v1x + v0y * v1y; + var n = Math.sqrt( + (Math.pow(v0x, 2) + Math.pow(v0y, 2)) * (Math.pow(v1x, 2) + Math.pow(v1y, 2)) + ); + var sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1; + var angle = sign * Math.acos(p / n); + return angle; + } + /** + * Returns a {x,y} point at a given length, the total length and + * the minimum and maximum {x,y} coordinates of a C (cubic-bezier) segment. + * @see https://github.com/MadLittleMods/svg-curve-lib/blob/master/src/js/svg-curve-lib.js + */ + function getPointAtArcSegmentLength(x1, y1, RX, RY, angle, LAF, SF, x, y, t) { + var abs = Math.abs, + sin = Math.sin, + cos = Math.cos, + sqrt = Math.sqrt, + PI = Math.PI; + var rx = abs(RX); + var ry = abs(RY); + var xRot = ((angle % 360) + 360) % 360; + var xRotRad = xRot * (PI / 180); + if (x1 === x && y1 === y) { + return { x: x1, y: y1 }; + } + if (rx === 0 || ry === 0) { + return segmentLineFactory(x1, y1, x, y, t).point; + } + var dx = (x1 - x) / 2; + var dy = (y1 - y) / 2; + var transformedPoint = { + x: cos(xRotRad) * dx + sin(xRotRad) * dy, + y: -sin(xRotRad) * dx + cos(xRotRad) * dy, + }; + var radiiCheck = + Math.pow(transformedPoint.x, 2) / Math.pow(rx, 2) + + Math.pow(transformedPoint.y, 2) / Math.pow(ry, 2); + if (radiiCheck > 1) { + rx *= sqrt(radiiCheck); + ry *= sqrt(radiiCheck); + } + var cSquareNumerator = + Math.pow(rx, 2) * Math.pow(ry, 2) - + Math.pow(rx, 2) * Math.pow(transformedPoint.y, 2) - + Math.pow(ry, 2) * Math.pow(transformedPoint.x, 2); + var cSquareRootDenom = + Math.pow(rx, 2) * Math.pow(transformedPoint.y, 2) + + Math.pow(ry, 2) * Math.pow(transformedPoint.x, 2); + var cRadicand = cSquareNumerator / cSquareRootDenom; + cRadicand = cRadicand < 0 ? 0 : cRadicand; + var cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand); + var transformedCenter = { + x: cCoef * ((rx * transformedPoint.y) / ry), + y: cCoef * (-(ry * transformedPoint.x) / rx), + }; + var center = { + x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y + (x1 + x) / 2, + y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y + (y1 + y) / 2, + }; + var startVector = { + x: (transformedPoint.x - transformedCenter.x) / rx, + y: (transformedPoint.y - transformedCenter.y) / ry, + }; + var startAngle = angleBetween({ x: 1, y: 0 }, startVector); + var endVector = { + x: (-transformedPoint.x - transformedCenter.x) / rx, + y: (-transformedPoint.y - transformedCenter.y) / ry, + }; + var sweepAngle = angleBetween(startVector, endVector); + if (!SF && sweepAngle > 0) { + sweepAngle -= 2 * PI; + } else if (SF && sweepAngle < 0) { + sweepAngle += 2 * PI; + } + sweepAngle %= 2 * PI; + var alpha = startAngle + sweepAngle * t; + var ellipseComponentX = rx * cos(alpha); + var ellipseComponentY = ry * sin(alpha); + var point = { + x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY + center.x, + y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY + center.y, + }; + // to be used later + // point.ellipticalArcStartAngle = startAngle; + // point.ellipticalArcEndAngle = startAngle + sweepAngle; + // point.ellipticalArcAngle = alpha; + // point.ellipticalArcCenter = center; + // point.resultantRx = rx; + // point.resultantRy = ry; + return point; + } + /** + * Returns a {x,y} point at a given length, the total length and + * the shape minimum and maximum {x,y} coordinates of an A (arc-to) segment. + * + * For better performance, it can skip calculate bbox or length in some scenario. + */ + function segmentArcFactory(X1, Y1, RX, RY, angle, LAF, SF, X2, Y2, distance, options) { + var _a; + var _b = options.bbox, + bbox = _b === void 0 ? true : _b, + _c = options.length, + length = _c === void 0 ? true : _c, + _d = options.sampleSize, + sampleSize = _d === void 0 ? 30 : _d; + var distanceIsNumber = typeof distance === 'number'; + var x = X1; + var y = Y1; + var LENGTH = 0; + var prev = [x, y, LENGTH]; + var cur = [x, y]; + var t = 0; + var POINT = { x: 0, y: 0 }; + var POINTS = [{ x: x, y: y }]; + if (distanceIsNumber && distance <= 0) { + POINT = { x: x, y: y }; + } + // bad perf when size > 100 + for (var j = 0; j <= sampleSize; j += 1) { + t = j / sampleSize; + (_a = getPointAtArcSegmentLength(X1, Y1, RX, RY, angle, LAF, SF, X2, Y2, t)), + (x = _a.x), + (y = _a.y); + if (bbox) { + POINTS.push({ x: x, y: y }); + } + if (length) { + LENGTH += distanceSquareRoot(cur, [x, y]); + } + cur = [x, y]; + if (distanceIsNumber && LENGTH >= distance && distance > prev[2]) { + var dv = (LENGTH - distance) / (LENGTH - prev[2]); + POINT = { + x: cur[0] * (1 - dv) + prev[0] * dv, + y: cur[1] * (1 - dv) + prev[1] * dv, + }; + } + prev = [x, y, LENGTH]; + } + if (distanceIsNumber && distance >= LENGTH) { + POINT = { x: X2, y: Y2 }; + } + return { + length: LENGTH, + point: POINT, + min: { + x: Math.min.apply( + null, + POINTS.map(function (n) { + return n.x; + }) + ), + y: Math.min.apply( + null, + POINTS.map(function (n) { + return n.y; + }) + ), + }, + max: { + x: Math.max.apply( + null, + POINTS.map(function (n) { + return n.x; + }) + ), + y: Math.max.apply( + null, + POINTS.map(function (n) { + return n.y; + }) + ), + }, + }; + } + + /** + * Returns a {x,y} point at a given length, the total length and + * the minimum and maximum {x,y} coordinates of a C (cubic-bezier) segment. + */ + function getPointAtCubicSegmentLength(x1, y1, c1x, c1y, c2x, c2y, x2, y2, t) { + var t1 = 1 - t; + return { + x: + Math.pow(t1, 3) * x1 + + 3 * Math.pow(t1, 2) * t * c1x + + 3 * t1 * Math.pow(t, 2) * c2x + + Math.pow(t, 3) * x2, + y: + Math.pow(t1, 3) * y1 + + 3 * Math.pow(t1, 2) * t * c1y + + 3 * t1 * Math.pow(t, 2) * c2y + + Math.pow(t, 3) * y2, + }; + } + /** + * Returns the length of a C (cubic-bezier) segment + * or an {x,y} point at a given length. + */ + function segmentCubicFactory(x1, y1, c1x, c1y, c2x, c2y, x2, y2, distance, options) { + var _a; + var _b = options.bbox, + bbox = _b === void 0 ? true : _b, + _c = options.length, + length = _c === void 0 ? true : _c, + _d = options.sampleSize, + sampleSize = _d === void 0 ? 10 : _d; + var distanceIsNumber = typeof distance === 'number'; + var x = x1; + var y = y1; + var LENGTH = 0; + var prev = [x, y, LENGTH]; + var cur = [x, y]; + var t = 0; + var POINT = { x: 0, y: 0 }; + var POINTS = [{ x: x, y: y }]; + if (distanceIsNumber && distance <= 0) { + POINT = { x: x, y: y }; + } + // bad perf when size = 300 + for (var j = 0; j <= sampleSize; j += 1) { + t = j / sampleSize; + (_a = getPointAtCubicSegmentLength(x1, y1, c1x, c1y, c2x, c2y, x2, y2, t)), + (x = _a.x), + (y = _a.y); + if (bbox) { + POINTS.push({ x: x, y: y }); + } + if (length) { + LENGTH += distanceSquareRoot(cur, [x, y]); + } + cur = [x, y]; + if (distanceIsNumber && LENGTH >= distance && distance > prev[2]) { + var dv = (LENGTH - distance) / (LENGTH - prev[2]); + POINT = { + x: cur[0] * (1 - dv) + prev[0] * dv, + y: cur[1] * (1 - dv) + prev[1] * dv, + }; + } + prev = [x, y, LENGTH]; + } + if (distanceIsNumber && distance >= LENGTH) { + POINT = { x: x2, y: y2 }; + } + return { + length: LENGTH, + point: POINT, + min: { + x: Math.min.apply( + null, + POINTS.map(function (n) { + return n.x; + }) + ), + y: Math.min.apply( + null, + POINTS.map(function (n) { + return n.y; + }) + ), + }, + max: { + x: Math.max.apply( + null, + POINTS.map(function (n) { + return n.x; + }) + ), + y: Math.max.apply( + null, + POINTS.map(function (n) { + return n.y; + }) + ), + }, + }; + } + + /** + * Returns the {x,y} coordinates of a point at a + * given length of a quadratic-bezier segment. + * + * @see https://github.com/substack/point-at-length + */ + function getPointAtQuadSegmentLength(x1, y1, cx, cy, x2, y2, t) { + var t1 = 1 - t; + return { + x: Math.pow(t1, 2) * x1 + 2 * t1 * t * cx + Math.pow(t, 2) * x2, + y: Math.pow(t1, 2) * y1 + 2 * t1 * t * cy + Math.pow(t, 2) * y2, + }; + } + /** + * Returns a {x,y} point at a given length, the total length and + * the minimum and maximum {x,y} coordinates of a Q (quadratic-bezier) segment. + */ + function segmentQuadFactory(x1, y1, qx, qy, x2, y2, distance, options) { + var _a; + var _b = options.bbox, + bbox = _b === void 0 ? true : _b, + _c = options.length, + length = _c === void 0 ? true : _c, + _d = options.sampleSize, + sampleSize = _d === void 0 ? 10 : _d; + var distanceIsNumber = typeof distance === 'number'; + var x = x1; + var y = y1; + var LENGTH = 0; + var prev = [x, y, LENGTH]; + var cur = [x, y]; + var t = 0; + var POINT = { x: 0, y: 0 }; + var POINTS = [{ x: x, y: y }]; + if (distanceIsNumber && distance <= 0) { + POINT = { x: x, y: y }; + } + for (var j = 0; j <= sampleSize; j += 1) { + t = j / sampleSize; + (_a = getPointAtQuadSegmentLength(x1, y1, qx, qy, x2, y2, t)), (x = _a.x), (y = _a.y); + if (bbox) { + POINTS.push({ x: x, y: y }); + } + if (length) { + LENGTH += distanceSquareRoot(cur, [x, y]); + } + cur = [x, y]; + if (distanceIsNumber && LENGTH >= distance && distance > prev[2]) { + var dv = (LENGTH - distance) / (LENGTH - prev[2]); + POINT = { + x: cur[0] * (1 - dv) + prev[0] * dv, + y: cur[1] * (1 - dv) + prev[1] * dv, + }; + } + prev = [x, y, LENGTH]; + } + /* istanbul ignore else */ + if (distanceIsNumber && distance >= LENGTH) { + POINT = { x: x2, y: y2 }; + } + return { + length: LENGTH, + point: POINT, + min: { + x: Math.min.apply( + null, + POINTS.map(function (n) { + return n.x; + }) + ), + y: Math.min.apply( + null, + POINTS.map(function (n) { + return n.y; + }) + ), + }, + max: { + x: Math.max.apply( + null, + POINTS.map(function (n) { + return n.x; + }) + ), + y: Math.max.apply( + null, + POINTS.map(function (n) { + return n.y; + }) + ), + }, + }; + } + + /** + * Returns a {x,y} point at a given length + * of a shape, the shape total length and + * the shape minimum and maximum {x,y} coordinates. + */ + function pathLengthFactory(pathInput, distance, options) { + var _a, _b, _c, _d, _e, _f; + var path = normalizePath(pathInput); + var distanceIsNumber = typeof distance === 'number'; + var isM; + var data = []; + var pathCommand; + var x = 0; + var y = 0; + var mx = 0; + var my = 0; + var seg; + var MIN = []; + var MAX = []; + var length = 0; + var min = { x: 0, y: 0 }; + var max = min; + var point = min; + var POINT = min; + var LENGTH = 0; + for (var i = 0, ll = path.length; i < ll; i += 1) { + seg = path[i]; + pathCommand = seg[0]; + isM = pathCommand === 'M'; + data = !isM ? [x, y].concat(seg.slice(1)) : data; + // this segment is always ZERO + /* istanbul ignore else */ + if (isM) { + // remember mx, my for Z + (mx = seg[1]), (my = seg[2]); + min = { x: mx, y: my }; + max = min; + length = 0; + if (distanceIsNumber && distance < 0.001) { + POINT = min; + } + } else if (pathCommand === 'L') { + (_a = segmentLineFactory(data[0], data[1], data[2], data[3], (distance || 0) - LENGTH)), + (length = _a.length), + (min = _a.min), + (max = _a.max), + (point = _a.point); + } else if (pathCommand === 'A') { + (_b = segmentArcFactory( + data[0], + data[1], + data[2], + data[3], + data[4], + data[5], + data[6], + data[7], + data[8], + (distance || 0) - LENGTH, + options || {} + )), + (length = _b.length), + (min = _b.min), + (max = _b.max), + (point = _b.point); + } else if (pathCommand === 'C') { + (_c = segmentCubicFactory( + data[0], + data[1], + data[2], + data[3], + data[4], + data[5], + data[6], + data[7], + (distance || 0) - LENGTH, + options || {} + )), + (length = _c.length), + (min = _c.min), + (max = _c.max), + (point = _c.point); + } else if (pathCommand === 'Q') { + (_d = segmentQuadFactory( + data[0], + data[1], + data[2], + data[3], + data[4], + data[5], + (distance || 0) - LENGTH, + options || {} + )), + (length = _d.length), + (min = _d.min), + (max = _d.max), + (point = _d.point); + } else if (pathCommand === 'Z') { + data = [x, y, mx, my]; + (_e = segmentLineFactory(data[0], data[1], data[2], data[3], (distance || 0) - LENGTH)), + (length = _e.length), + (min = _e.min), + (max = _e.max), + (point = _e.point); + } + if (distanceIsNumber && LENGTH < distance && LENGTH + length >= distance) { + POINT = point; + } + MAX.push(max); + MIN.push(min); + LENGTH += length; + (_f = pathCommand !== 'Z' ? seg.slice(-2) : [mx, my]), (x = _f[0]), (y = _f[1]); + } + // native `getPointAtLength` behavior when the given distance + // is higher than total length + if (distanceIsNumber && distance >= LENGTH) { + POINT = { x: x, y: y }; + } + return { + length: LENGTH, + point: POINT, + min: { + x: Math.min.apply( + null, + MIN.map(function (n) { + return n.x; + }) + ), + y: Math.min.apply( + null, + MIN.map(function (n) { + return n.y; + }) + ), + }, + max: { + x: Math.max.apply( + null, + MAX.map(function (n) { + return n.x; + }) + ), + y: Math.max.apply( + null, + MAX.map(function (n) { + return n.y; + }) + ), + }, + }; + } + + /** + * Returns the shape total length, or the equivalent to `shape.getTotalLength()`. + * + * The `normalizePath` version is lighter, faster, more efficient and more accurate + * with paths that are not `curveArray`. + */ + function getTotalLength(pathInput, options) { + return pathLengthFactory( + pathInput, + undefined, + __assign(__assign({}, options), { bbox: false, length: true }) + ).length; + } + + function getRotations(a) { + var segCount = a.length; + var pointCount = segCount - 1; + return a.map(function (f, idx) { + return a.map(function (p, i) { + var oldSegIdx = idx + i; + var seg; + if (i === 0 || (a[oldSegIdx] && a[oldSegIdx][0] === 'M')) { + seg = a[oldSegIdx]; + return ['M'].concat(seg.slice(-2)); + } + if (oldSegIdx >= segCount) oldSegIdx -= pointCount; + return a[oldSegIdx]; + }); + }); + } + function getRotatedCurve(a, b) { + var segCount = a.length - 1; + var lineLengths = []; + var computedIndex = 0; + var sumLensSqrd = 0; + var rotations = getRotations(a); + rotations.forEach(function (r, i) { + a.slice(1).forEach(function (s, j) { + // @ts-ignore + sumLensSqrd += distanceSquareRoot( + a[(i + j) % segCount].slice(-2), + b[j % segCount].slice(-2) + ); + }); + lineLengths[i] = sumLensSqrd; + sumLensSqrd = 0; + }); + computedIndex = lineLengths.indexOf(Math.min.apply(null, lineLengths)); + return rotations[computedIndex]; + } + + /** + * Returns the area of a single cubic-bezier segment. + * + * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html + */ + function getCubicSegArea(x1, y1, c1x, c1y, c2x, c2y, x2, y2) { + // https://stackoverflow.com/a/15845996 + return ( + (3 * + ((y2 - y1) * (c1x + c2x) - + (x2 - x1) * (c1y + c2y) + + c1y * (x1 - c2x) - + c1x * (y1 - c2y) + + y2 * (c2x + x1 / 3) - + x2 * (c2y + y1 / 3))) / + 20 + ); + } + /** + * Returns the area of a shape. + * @author Jürg Lehni & Jonathan Puckey + * + * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js + */ + function getPathArea(path) { + var x = 0; + var y = 0; + var len = 0; + return path2Curve(path) + .map(function (seg) { + var _a; + switch (seg[0]) { + case 'M': + (x = seg[1]), (y = seg[2]); + return 0; + default: + // @ts-ignore + var _b = seg.slice(1), + c1x = _b[0], + c1y = _b[1], + c2x = _b[2], + c2y = _b[3], + x2 = _b[4], + y2 = _b[5]; + len = getCubicSegArea(x, y, c1x, c1y, c2x, c2y, x2, y2); + (_a = seg.slice(-2)), (x = _a[0]), (y = _a[1]); + return len; + } + }) + .reduce(function (a, b) { + return a + b; + }, 0); + } + // export function getPathArea(pathArray: AbsoluteArray) { + // let x = 0; + // let y = 0; + // let mx = 0; + // let my = 0; + // let len = 0; + // return pathArray + // .map((seg) => { + // switch (seg[0]) { + // case 'M': + // case 'Z': + // mx = seg[0] === 'M' ? seg[1] : mx; + // my = seg[0] === 'M' ? seg[2] : my; + // x = mx; + // y = my; + // return 0; + // default: + // // @ts-ignore + // len = getCubicSegArea.apply(0, [x, y].concat(seg.slice(1))); + // [x, y] = seg.slice(-2) as [number, number]; + // return len; + // } + // }) + // .reduce((a, b) => a + b, 0); + // } + + function getDrawDirection(pathArray) { + return getPathArea(pathArray) >= 0; + } + + /** + * Returns [x,y] coordinates of a point at a given length of a shape. + */ + function getPointAtLength(pathInput, distance, options) { + return pathLengthFactory( + pathInput, + distance, + __assign(__assign({}, options), { bbox: false, length: true }) + ).point; + } + + function splitCubic(pts, t) { + if (t === void 0) { + t = 0.5; + } + var p0 = pts.slice(0, 2); + var p1 = pts.slice(2, 4); + var p2 = pts.slice(4, 6); + var p3 = pts.slice(6, 8); + var p4 = midPoint(p0, p1, t); + var p5 = midPoint(p1, p2, t); + var p6 = midPoint(p2, p3, t); + var p7 = midPoint(p4, p5, t); + var p8 = midPoint(p5, p6, t); + var p9 = midPoint(p7, p8, t); + return [ + // @ts-ignore + ['C'].concat(p4, p7, p9), + // @ts-ignore + ['C'].concat(p8, p6, p3), + ]; + } + function getCurveArray(segments) { + return segments.map(function (segment, i, pathArray) { + // @ts-ignore + var segmentData = i && pathArray[i - 1].slice(-2).concat(segment.slice(1)); + // @ts-ignore + var curveLength = i + ? segmentCubicFactory( + segmentData[0], + segmentData[1], + segmentData[2], + segmentData[3], + segmentData[4], + segmentData[5], + segmentData[6], + segmentData[7], + segmentData[8], + { bbox: false } + ).length + : 0; + var subsegs; + if (i) { + // must be [segment,segment] + subsegs = curveLength ? splitCubic(segmentData) : [segment, segment]; + } else { + subsegs = [segment]; + } + return { + s: segment, + ss: subsegs, + l: curveLength, + }; + }); + } + function equalizeSegments(path1, path2, TL) { + var c1 = getCurveArray(path1); + var c2 = getCurveArray(path2); + var L1 = c1.length; + var L2 = c2.length; + var l1 = c1.filter(function (x) { + return x.l; + }).length; + var l2 = c2.filter(function (x) { + return x.l; + }).length; + var m1 = + c1 + .filter(function (x) { + return x.l; + }) + .reduce(function (a, _a) { + var l = _a.l; + return a + l; + }, 0) / l1 || 0; + var m2 = + c2 + .filter(function (x) { + return x.l; + }) + .reduce(function (a, _a) { + var l = _a.l; + return a + l; + }, 0) / l2 || 0; + var tl = TL || Math.max(L1, L2); + var mm = [m1, m2]; + var dif = [tl - L1, tl - L2]; + var canSplit = 0; + var result = [c1, c2].map(function (x, i) { + // @ts-ignore + return x.l === tl + ? x.map(function (y) { + return y.s; + }) + : x + .map(function (y, j) { + canSplit = j && dif[i] && y.l >= mm[i]; + dif[i] -= canSplit ? 1 : 0; + return canSplit ? y.ss : [y.s]; + }) + .flat(); + }); + return result[0].length === result[1].length + ? result + : equalizeSegments(result[0], result[1], tl); + } + + var Component = /** @class */ (function () { + function Component(props, context, updater) { + this.isMounted = false; + // State 内部私有属性 + this.destroyed = false; + this.props = props; + this.state = {}; + this.context = context; + this.updater = updater; + } + Component.prototype.willMount = function () {}; + Component.prototype.didMount = function () {}; + Component.prototype.shouldUpdate = function (_nextProps) { + return true; + }; + Component.prototype.willReceiveProps = function (_props, _context) {}; + Component.prototype.willUpdate = function () {}; + Component.prototype.didUpdate = function () {}; + Component.prototype.render = function () { + return null; + }; + Component.prototype.willUnmount = function () {}; + Component.prototype.didUnmount = function () {}; + Component.prototype.setState = function (partialState, callback) { + if (this.destroyed) { + return; + } + this.updater.enqueueSetState(this, partialState, callback); + }; + Component.prototype.forceUpdate = function (callback) { + if (this.destroyed) { + return; + } + this.updater.enqueueForceUpdate(this, {}, callback); + }; + Component.prototype.setAnimate = function (animate) { + this.animate = animate; + this._vNode.animate = animate; + }; + Component.prototype.destroy = function () { + this.destroyed = true; + this.animator = null; + }; + return Component; + })(); + // 标识是否是组件 + // @ts-ignore + Component.prototype.isF2Component = true; + + function cloneElement(element, props) { + if (!element) return element; + return __assign(__assign({}, element), { + props: __assign(__assign({}, element.props), props), + }); + } + function map(children, fn) { + if (!children) { + return fn(children); + } + if (isArray(children)) { + return children.map(function (child) { + return map(child, fn); + }); + } + return fn(children); + } + function compareArray(nextElements, lastElements, callback) { + var keyed = {}; + var nextLength = nextElements.length; + var lastLength = lastElements.length; + for (var i = 0, len = lastLength; i < len; i++) { + var element = lastElements[i]; + if (element && !isNil(element.key)) { + var key = element.key; + keyed[key] = element; + } + } + var result = []; + // 比较元素 + for (var i = 0, len = nextLength; i < len; i++) { + var element = nextElements[i]; + if (!element) { + continue; + } + var key = element.key; + var lastElement = void 0; + // 有key值定义 + if (!isNil(element.key)) { + lastElement = keyed[key]; + if (lastElement) delete keyed[key]; + } else { + // 取相同位置的元素 + lastElement = lastElements[i]; + } + // 没有直接返回 + if (!lastElement) { + result.push(compare(element, null, callback)); + continue; + } + // 如果 lastElement 已经被处理过, next 处理成新增 + if (lastElement === null || lastElement === void 0 ? void 0 : lastElement.__processed) { + result.push(compare(element, null, callback)); + continue; + } + // 标记 element 已经被处理过 + lastElement.__processed = true; + result.push(compare(element, lastElement, callback)); + } + // 处理 lastElements 里面还未被处理的元素 + for (var i = 0, len = lastLength; i < len; i++) { + var lastElement = lastElements[i]; + if (!lastElement) { + continue; + } + if (!(lastElement === null || lastElement === void 0 ? void 0 : lastElement.__processed)) { + result.push(compare(null, lastElement, callback)); + } else { + delete lastElement.__processed; + } + } + return result; + } + // 比较2棵树 + function compare(nextElement, lastElement, callback) { + // 有一个为空 + if (!nextElement || !lastElement) { + return callback(nextElement, lastElement); + } + if (isArray(nextElement) || isArray(lastElement)) { + var nextElementArray = isArray(nextElement) ? nextElement : [nextElement]; + var lastElementArray = isArray(lastElement) ? lastElement : [lastElement]; + return compareArray(nextElementArray, lastElementArray, callback); + } + return callback(nextElement, lastElement); + } + function toArray(element) { + if (!element) { + return element; + } + if (!isArray(element)) { + return [element]; + } + var newArray = []; + for (var i = 0, len = element.length; i < len; i++) { + var item = element[i]; + if (isArray(item)) { + newArray = newArray.concat(toArray(item)); + } else { + newArray.push(item); + } + } + return newArray; + } + var Children = { + cloneElement: cloneElement, + map: map, + toArray: toArray, + compare: compare, + }; + + function getDefaultExportFromCjs(x) { + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') + ? x['default'] + : x; + } + + function createCommonjsModule(fn, basedir, module) { + return ( + (module = { + path: basedir, + exports: {}, + require: function (path, base) { + return commonjsRequire(path, base === undefined || base === null ? module.path : base); + }, + }), + fn(module, module.exports), + module.exports + ); + } + + function commonjsRequire() { + throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs'); + } + + var eventemitter3 = createCommonjsModule(function (module) { + var has = Object.prototype.hasOwnProperty, + prefix = '~'; + + /** + * Constructor to create a storage for our `EE` objects. + * An `Events` instance is a plain object whose properties are event names. + * + * @constructor + * @private + */ + function Events() {} + + // + // We try to not inherit from `Object.prototype`. In some engines creating an + // instance in this way is faster than calling `Object.create(null)` directly. + // If `Object.create(null)` is not supported we prefix the event names with a + // character to make sure that the built-in object properties are not + // overridden or used as an attack vector. + // + if (Object.create) { + Events.prototype = Object.create(null); + + // + // This hack is needed because the `__proto__` property is still inherited in + // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5. + // + if (!new Events().__proto__) prefix = false; + } + + /** + * Representation of a single event listener. + * + * @param {Function} fn The listener function. + * @param {*} context The context to invoke the listener with. + * @param {Boolean} [once=false] Specify if the listener is a one-time listener. + * @constructor + * @private + */ + function EE(fn, context, once) { + this.fn = fn; + this.context = context; + this.once = once || false; + } + + /** + * Add a listener for a given event. + * + * @param {EventEmitter} emitter Reference to the `EventEmitter` instance. + * @param {(String|Symbol)} event The event name. + * @param {Function} fn The listener function. + * @param {*} context The context to invoke the listener with. + * @param {Boolean} once Specify if the listener is a one-time listener. + * @returns {EventEmitter} + * @private + */ + function addListener(emitter, event, fn, context, once) { + if (typeof fn !== 'function') { + throw new TypeError('The listener must be a function'); + } + + var listener = new EE(fn, context || emitter, once), + evt = prefix ? prefix + event : event; + + if (!emitter._events[evt]) (emitter._events[evt] = listener), emitter._eventsCount++; + else if (!emitter._events[evt].fn) emitter._events[evt].push(listener); + else emitter._events[evt] = [emitter._events[evt], listener]; + + return emitter; + } + + /** + * Clear event by name. + * + * @param {EventEmitter} emitter Reference to the `EventEmitter` instance. + * @param {(String|Symbol)} evt The Event name. + * @private + */ + function clearEvent(emitter, evt) { + if (--emitter._eventsCount === 0) emitter._events = new Events(); + else delete emitter._events[evt]; + } + + /** + * Minimal `EventEmitter` interface that is molded against the Node.js + * `EventEmitter` interface. + * + * @constructor + * @public + */ + function EventEmitter() { + this._events = new Events(); + this._eventsCount = 0; + } + + /** + * Return an array listing the events for which the emitter has registered + * listeners. + * + * @returns {Array} + * @public + */ + EventEmitter.prototype.eventNames = function eventNames() { + var names = [], + events, + name; + + if (this._eventsCount === 0) return names; + + for (name in (events = this._events)) { + if (has.call(events, name)) names.push(prefix ? name.slice(1) : name); + } + + if (Object.getOwnPropertySymbols) { + return names.concat(Object.getOwnPropertySymbols(events)); + } + + return names; + }; + + /** + * Return the listeners registered for a given event. + * + * @param {(String|Symbol)} event The event name. + * @returns {Array} The registered listeners. + * @public + */ + EventEmitter.prototype.listeners = function listeners(event) { + var evt = prefix ? prefix + event : event, + handlers = this._events[evt]; + + if (!handlers) return []; + if (handlers.fn) return [handlers.fn]; + + for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) { + ee[i] = handlers[i].fn; + } + + return ee; + }; + + /** + * Return the number of listeners listening to a given event. + * + * @param {(String|Symbol)} event The event name. + * @returns {Number} The number of listeners. + * @public + */ + EventEmitter.prototype.listenerCount = function listenerCount(event) { + var evt = prefix ? prefix + event : event, + listeners = this._events[evt]; + + if (!listeners) return 0; + if (listeners.fn) return 1; + return listeners.length; + }; + + /** + * Calls each of the listeners registered for a given event. + * + * @param {(String|Symbol)} event The event name. + * @returns {Boolean} `true` if the event had listeners, else `false`. + * @public + */ + EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) { + var evt = prefix ? prefix + event : event; + + if (!this._events[evt]) return false; + + var listeners = this._events[evt], + len = arguments.length, + args, + i; + + if (listeners.fn) { + if (listeners.once) this.removeListener(event, listeners.fn, undefined, true); + + switch (len) { + case 1: + return listeners.fn.call(listeners.context), true; + case 2: + return listeners.fn.call(listeners.context, a1), true; + case 3: + return listeners.fn.call(listeners.context, a1, a2), true; + case 4: + return listeners.fn.call(listeners.context, a1, a2, a3), true; + case 5: + return listeners.fn.call(listeners.context, a1, a2, a3, a4), true; + case 6: + return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true; + } + + for (i = 1, args = new Array(len - 1); i < len; i++) { + args[i - 1] = arguments[i]; + } + + listeners.fn.apply(listeners.context, args); + } else { + var length = listeners.length, + j; + + for (i = 0; i < length; i++) { + if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true); + + switch (len) { + case 1: + listeners[i].fn.call(listeners[i].context); + break; + case 2: + listeners[i].fn.call(listeners[i].context, a1); + break; + case 3: + listeners[i].fn.call(listeners[i].context, a1, a2); + break; + case 4: + listeners[i].fn.call(listeners[i].context, a1, a2, a3); + break; + default: + if (!args) + for (j = 1, args = new Array(len - 1); j < len; j++) { + args[j - 1] = arguments[j]; + } + + listeners[i].fn.apply(listeners[i].context, args); + } + } + } + + return true; + }; + + /** + * Add a listener for a given event. + * + * @param {(String|Symbol)} event The event name. + * @param {Function} fn The listener function. + * @param {*} [context=this] The context to invoke the listener with. + * @returns {EventEmitter} `this`. + * @public + */ + EventEmitter.prototype.on = function on(event, fn, context) { + return addListener(this, event, fn, context, false); + }; + + /** + * Add a one-time listener for a given event. + * + * @param {(String|Symbol)} event The event name. + * @param {Function} fn The listener function. + * @param {*} [context=this] The context to invoke the listener with. + * @returns {EventEmitter} `this`. + * @public + */ + EventEmitter.prototype.once = function once(event, fn, context) { + return addListener(this, event, fn, context, true); + }; + + /** + * Remove the listeners of a given event. + * + * @param {(String|Symbol)} event The event name. + * @param {Function} fn Only remove the listeners that match this function. + * @param {*} context Only remove the listeners that have this context. + * @param {Boolean} once Only remove one-time listeners. + * @returns {EventEmitter} `this`. + * @public + */ + EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) { + var evt = prefix ? prefix + event : event; + + if (!this._events[evt]) return this; + if (!fn) { + clearEvent(this, evt); + return this; + } + + var listeners = this._events[evt]; + + if (listeners.fn) { + if ( + listeners.fn === fn && + (!once || listeners.once) && + (!context || listeners.context === context) + ) { + clearEvent(this, evt); + } + } else { + for (var i = 0, events = [], length = listeners.length; i < length; i++) { + if ( + listeners[i].fn !== fn || + (once && !listeners[i].once) || + (context && listeners[i].context !== context) + ) { + events.push(listeners[i]); + } + } + + // + // Reset the array, or remove it completely if we have no more listeners. + // + if (events.length) this._events[evt] = events.length === 1 ? events[0] : events; + else clearEvent(this, evt); + } + + return this; + }; + + /** + * Remove all listeners, or those of the specified event. + * + * @param {(String|Symbol)} [event] The event name. + * @returns {EventEmitter} `this`. + * @public + */ + EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) { + var evt; + + if (event) { + evt = prefix ? prefix + event : event; + if (this._events[evt]) clearEvent(this, evt); + } else { + this._events = new Events(); + this._eventsCount = 0; + } + + return this; + }; + + // + // Alias methods names because people roll like that. + // + EventEmitter.prototype.off = EventEmitter.prototype.removeListener; + EventEmitter.prototype.addListener = EventEmitter.prototype.on; + + // + // Expose the prefix. + // + EventEmitter.prefixed = prefix; + + // + // Allow `EventEmitter` to be imported as module namespace. + // + EventEmitter.EventEmitter = EventEmitter; + + // + // Expose the module. + // + { + module.exports = EventEmitter; + } + }); + + function define(constructor, factory, prototype) { + constructor.prototype = factory.prototype = prototype; + prototype.constructor = constructor; + } + function extend(parent, definition) { + var prototype = Object.create(parent.prototype); + for (var key in definition) prototype[key] = definition[key]; + return prototype; + } + + function Color() {} + var _darker = 0.7; + var _brighter = 1 / _darker; + var reI = '\\s*([+-]?\\d+)\\s*', + reN = '\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*', + reP = '\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*', + reHex = /^#([0-9a-f]{3,8})$/, + reRgbInteger = new RegExp('^rgb\\('.concat(reI, ',').concat(reI, ',').concat(reI, '\\)$')), + reRgbPercent = new RegExp('^rgb\\('.concat(reP, ',').concat(reP, ',').concat(reP, '\\)$')), + reRgbaInteger = new RegExp( + '^rgba\\('.concat(reI, ',').concat(reI, ',').concat(reI, ',').concat(reN, '\\)$') + ), + reRgbaPercent = new RegExp( + '^rgba\\('.concat(reP, ',').concat(reP, ',').concat(reP, ',').concat(reN, '\\)$') + ), + reHslPercent = new RegExp('^hsl\\('.concat(reN, ',').concat(reP, ',').concat(reP, '\\)$')), + reHslaPercent = new RegExp( + '^hsla\\('.concat(reN, ',').concat(reP, ',').concat(reP, ',').concat(reN, '\\)$') + ); + var named = { + aliceblue: 0xf0f8ff, + antiquewhite: 0xfaebd7, + aqua: 0x00ffff, + aquamarine: 0x7fffd4, + azure: 0xf0ffff, + beige: 0xf5f5dc, + bisque: 0xffe4c4, + black: 0x000000, + blanchedalmond: 0xffebcd, + blue: 0x0000ff, + blueviolet: 0x8a2be2, + brown: 0xa52a2a, + burlywood: 0xdeb887, + cadetblue: 0x5f9ea0, + chartreuse: 0x7fff00, + chocolate: 0xd2691e, + coral: 0xff7f50, + cornflowerblue: 0x6495ed, + cornsilk: 0xfff8dc, + crimson: 0xdc143c, + cyan: 0x00ffff, + darkblue: 0x00008b, + darkcyan: 0x008b8b, + darkgoldenrod: 0xb8860b, + darkgray: 0xa9a9a9, + darkgreen: 0x006400, + darkgrey: 0xa9a9a9, + darkkhaki: 0xbdb76b, + darkmagenta: 0x8b008b, + darkolivegreen: 0x556b2f, + darkorange: 0xff8c00, + darkorchid: 0x9932cc, + darkred: 0x8b0000, + darksalmon: 0xe9967a, + darkseagreen: 0x8fbc8f, + darkslateblue: 0x483d8b, + darkslategray: 0x2f4f4f, + darkslategrey: 0x2f4f4f, + darkturquoise: 0x00ced1, + darkviolet: 0x9400d3, + deeppink: 0xff1493, + deepskyblue: 0x00bfff, + dimgray: 0x696969, + dimgrey: 0x696969, + dodgerblue: 0x1e90ff, + firebrick: 0xb22222, + floralwhite: 0xfffaf0, + forestgreen: 0x228b22, + fuchsia: 0xff00ff, + gainsboro: 0xdcdcdc, + ghostwhite: 0xf8f8ff, + gold: 0xffd700, + goldenrod: 0xdaa520, + gray: 0x808080, + green: 0x008000, + greenyellow: 0xadff2f, + grey: 0x808080, + honeydew: 0xf0fff0, + hotpink: 0xff69b4, + indianred: 0xcd5c5c, + indigo: 0x4b0082, + ivory: 0xfffff0, + khaki: 0xf0e68c, + lavender: 0xe6e6fa, + lavenderblush: 0xfff0f5, + lawngreen: 0x7cfc00, + lemonchiffon: 0xfffacd, + lightblue: 0xadd8e6, + lightcoral: 0xf08080, + lightcyan: 0xe0ffff, + lightgoldenrodyellow: 0xfafad2, + lightgray: 0xd3d3d3, + lightgreen: 0x90ee90, + lightgrey: 0xd3d3d3, + lightpink: 0xffb6c1, + lightsalmon: 0xffa07a, + lightseagreen: 0x20b2aa, + lightskyblue: 0x87cefa, + lightslategray: 0x778899, + lightslategrey: 0x778899, + lightsteelblue: 0xb0c4de, + lightyellow: 0xffffe0, + lime: 0x00ff00, + limegreen: 0x32cd32, + linen: 0xfaf0e6, + magenta: 0xff00ff, + maroon: 0x800000, + mediumaquamarine: 0x66cdaa, + mediumblue: 0x0000cd, + mediumorchid: 0xba55d3, + mediumpurple: 0x9370db, + mediumseagreen: 0x3cb371, + mediumslateblue: 0x7b68ee, + mediumspringgreen: 0x00fa9a, + mediumturquoise: 0x48d1cc, + mediumvioletred: 0xc71585, + midnightblue: 0x191970, + mintcream: 0xf5fffa, + mistyrose: 0xffe4e1, + moccasin: 0xffe4b5, + navajowhite: 0xffdead, + navy: 0x000080, + oldlace: 0xfdf5e6, + olive: 0x808000, + olivedrab: 0x6b8e23, + orange: 0xffa500, + orangered: 0xff4500, + orchid: 0xda70d6, + palegoldenrod: 0xeee8aa, + palegreen: 0x98fb98, + paleturquoise: 0xafeeee, + palevioletred: 0xdb7093, + papayawhip: 0xffefd5, + peachpuff: 0xffdab9, + peru: 0xcd853f, + pink: 0xffc0cb, + plum: 0xdda0dd, + powderblue: 0xb0e0e6, + purple: 0x800080, + rebeccapurple: 0x663399, + red: 0xff0000, + rosybrown: 0xbc8f8f, + royalblue: 0x4169e1, + saddlebrown: 0x8b4513, + salmon: 0xfa8072, + sandybrown: 0xf4a460, + seagreen: 0x2e8b57, + seashell: 0xfff5ee, + sienna: 0xa0522d, + silver: 0xc0c0c0, + skyblue: 0x87ceeb, + slateblue: 0x6a5acd, + slategray: 0x708090, + slategrey: 0x708090, + snow: 0xfffafa, + springgreen: 0x00ff7f, + steelblue: 0x4682b4, + tan: 0xd2b48c, + teal: 0x008080, + thistle: 0xd8bfd8, + tomato: 0xff6347, + turquoise: 0x40e0d0, + violet: 0xee82ee, + wheat: 0xf5deb3, + white: 0xffffff, + whitesmoke: 0xf5f5f5, + yellow: 0xffff00, + yellowgreen: 0x9acd32, + }; + define(Color, color, { + copy: function copy(channels) { + return Object.assign(new this.constructor(), this, channels); + }, + displayable: function displayable() { + return this.rgb().displayable(); + }, + hex: color_formatHex, + // Deprecated! Use color.formatHex. + formatHex: color_formatHex, + formatHex8: color_formatHex8, + formatHsl: color_formatHsl, + formatRgb: color_formatRgb, + toString: color_formatRgb, + }); + function color_formatHex() { + return this.rgb().formatHex(); + } + function color_formatHex8() { + return this.rgb().formatHex8(); + } + function color_formatHsl() { + return hslConvert(this).formatHsl(); + } + function color_formatRgb() { + return this.rgb().formatRgb(); + } + function color(format) { + var m, l; + format = (format + '').trim().toLowerCase(); + return (m = reHex.exec(format)) + ? ((l = m[1].length), + (m = parseInt(m[1], 16)), + l === 6 + ? rgbn(m) // #ff0000 + : l === 3 + ? new Rgb( + ((m >> 8) & 0xf) | ((m >> 4) & 0xf0), + ((m >> 4) & 0xf) | (m & 0xf0), + ((m & 0xf) << 4) | (m & 0xf), + 1 + ) // #f00 + : l === 8 + ? rgba((m >> 24) & 0xff, (m >> 16) & 0xff, (m >> 8) & 0xff, (m & 0xff) / 0xff) // #ff000000 + : l === 4 + ? rgba( + ((m >> 12) & 0xf) | ((m >> 8) & 0xf0), + ((m >> 8) & 0xf) | ((m >> 4) & 0xf0), + ((m >> 4) & 0xf) | (m & 0xf0), + (((m & 0xf) << 4) | (m & 0xf)) / 0xff + ) // #f000 + : null) // invalid hex + : (m = reRgbInteger.exec(format)) + ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0) + : (m = reRgbPercent.exec(format)) + ? new Rgb((m[1] * 255) / 100, (m[2] * 255) / 100, (m[3] * 255) / 100, 1) // rgb(100%, 0%, 0%) + : (m = reRgbaInteger.exec(format)) + ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1) + : (m = reRgbaPercent.exec(format)) + ? rgba((m[1] * 255) / 100, (m[2] * 255) / 100, (m[3] * 255) / 100, m[4]) // rgb(100%, 0%, 0%, 1) + : (m = reHslPercent.exec(format)) + ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%) + : (m = reHslaPercent.exec(format)) + ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1) + : named.hasOwnProperty(format) + ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins + : format === 'transparent' + ? new Rgb(NaN, NaN, NaN, 0) + : null; + } + function rgbn(n) { + return new Rgb((n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff, 1); + } + function rgba(r, g, b, a) { + if (a <= 0) r = g = b = NaN; + return new Rgb(r, g, b, a); + } + function rgbConvert(o) { + if (!(o instanceof Color)) o = color(o); + if (!o) return new Rgb(); + o = o.rgb(); + return new Rgb(o.r, o.g, o.b, o.opacity); + } + function rgb(r, g, b, opacity) { + return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); + } + function Rgb(r, g, b, opacity) { + this.r = +r; + this.g = +g; + this.b = +b; + this.opacity = +opacity; + } + define( + Rgb, + rgb, + extend(Color, { + brighter: function brighter(k) { + k = k == null ? _brighter : Math.pow(_brighter, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + darker: function darker(k) { + k = k == null ? _darker : Math.pow(_darker, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + rgb: function rgb() { + return this; + }, + clamp: function clamp() { + return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity)); + }, + displayable: function displayable() { + return ( + -0.5 <= this.r && + this.r < 255.5 && + -0.5 <= this.g && + this.g < 255.5 && + -0.5 <= this.b && + this.b < 255.5 && + 0 <= this.opacity && + this.opacity <= 1 + ); + }, + hex: rgb_formatHex, + // Deprecated! Use color.formatHex. + formatHex: rgb_formatHex, + formatHex8: rgb_formatHex8, + formatRgb: rgb_formatRgb, + toString: rgb_formatRgb, + }) + ); + function rgb_formatHex() { + return '#'.concat(hex(this.r)).concat(hex(this.g)).concat(hex(this.b)); + } + function rgb_formatHex8() { + return '#' + .concat(hex(this.r)) + .concat(hex(this.g)) + .concat(hex(this.b)) + .concat(hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)); + } + function rgb_formatRgb() { + var a = clampa(this.opacity); + return '' + .concat(a === 1 ? 'rgb(' : 'rgba(') + .concat(clampi(this.r), ', ') + .concat(clampi(this.g), ', ') + .concat(clampi(this.b)) + .concat(a === 1 ? ')' : ', '.concat(a, ')')); + } + function clampa(opacity) { + return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity)); + } + function clampi(value) { + return Math.max(0, Math.min(255, Math.round(value) || 0)); + } + function hex(value) { + value = clampi(value); + return (value < 16 ? '0' : '') + value.toString(16); + } + function hsla(h, s, l, a) { + if (a <= 0) h = s = l = NaN; + else if (l <= 0 || l >= 1) h = s = NaN; + else if (s <= 0) h = NaN; + return new Hsl(h, s, l, a); + } + function hslConvert(o) { + if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Color)) o = color(o); + if (!o) return new Hsl(); + if (o instanceof Hsl) return o; + o = o.rgb(); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + min = Math.min(r, g, b), + max = Math.max(r, g, b), + h = NaN, + s = max - min, + l = (max + min) / 2; + if (s) { + if (r === max) h = (g - b) / s + (g < b) * 6; + else if (g === max) h = (b - r) / s + 2; + else h = (r - g) / s + 4; + s /= l < 0.5 ? max + min : 2 - max - min; + h *= 60; + } else { + s = l > 0 && l < 1 ? 0 : h; + } + return new Hsl(h, s, l, o.opacity); + } + function hsl(h, s, l, opacity) { + return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); + } + function Hsl(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; + } + define( + Hsl, + hsl, + extend(Color, { + brighter: function brighter(k) { + k = k == null ? _brighter : Math.pow(_brighter, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + darker: function darker(k) { + k = k == null ? _darker : Math.pow(_darker, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function rgb() { + var h = (this.h % 360) + (this.h < 0) * 360, + s = isNaN(h) || isNaN(this.s) ? 0 : this.s, + l = this.l, + m2 = l + (l < 0.5 ? l : 1 - l) * s, + m1 = 2 * l - m2; + return new Rgb( + hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), + hsl2rgb(h, m1, m2), + hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), + this.opacity + ); + }, + clamp: function clamp() { + return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity)); + }, + displayable: function displayable() { + return ( + ((0 <= this.s && this.s <= 1) || isNaN(this.s)) && + 0 <= this.l && + this.l <= 1 && + 0 <= this.opacity && + this.opacity <= 1 + ); + }, + formatHsl: function formatHsl() { + var a = clampa(this.opacity); + return '' + .concat(a === 1 ? 'hsl(' : 'hsla(') + .concat(clamph(this.h), ', ') + .concat(clampt(this.s) * 100, '%, ') + .concat(clampt(this.l) * 100, '%') + .concat(a === 1 ? ')' : ', '.concat(a, ')')); + }, + }) + ); + function clamph(value) { + value = (value || 0) % 360; + return value < 0 ? value + 360 : value; + } + function clampt(value) { + return Math.max(0, Math.min(1, value || 0)); + } + + /* From FvD 13.37, CSS Color Module Level 3 */ + function hsl2rgb(h, m1, m2) { + return ( + (h < 60 + ? m1 + ((m2 - m1) * h) / 60 + : h < 180 + ? m2 + : h < 240 + ? m1 + ((m2 - m1) * (240 - h)) / 60 + : m1) * 255 + ); + } + + function distance$1(x1, y1, x2, y2) { + var dx = x1 - x2; + var dy = y1 - y2; + return Math.sqrt(dx * dx + dy * dy); + } + function getBBoxByArray(xArr, yArr) { + var minX = Math.min.apply(Math, __spreadArray([], __read(xArr), false)); + var minY = Math.min.apply(Math, __spreadArray([], __read(yArr), false)); + var maxX = Math.max.apply(Math, __spreadArray([], __read(xArr), false)); + var maxY = Math.max.apply(Math, __spreadArray([], __read(yArr), false)); + return { + x: minX, + y: minY, + width: maxX - minX, + height: maxY - minY, + }; + } + // x 的极值 + function xExtrema(rx, ry, xRotation) { + return Math.atan((-ry / rx) * Math.tan(xRotation)); + } + // y 的极值 + function yExtrema(rx, ry, xRotation) { + return Math.atan(ry / (rx * Math.tan(xRotation))); + } + // 根据角度求 x 坐标 + function xAt(cx, cy, rx, ry, xRotation, angle) { + return ( + rx * Math.cos(xRotation) * Math.cos(angle) - ry * Math.sin(xRotation) * Math.sin(angle) + cx + ); + } + // 根据角度求 y 坐标 + function yAt(cx, cy, rx, ry, xRotation, angle) { + return ( + rx * Math.sin(xRotation) * Math.cos(angle) + ry * Math.cos(xRotation) * Math.sin(angle) + cy + ); + } + function box$5(cx, cy, rx, ry, xRotation, startAngle, endAngle) { + var xDim = xExtrema(rx, ry, xRotation); + var minX = Infinity; + var maxX = -Infinity; + var xs = [startAngle, endAngle]; + for (var i = -Math.PI * 2; i <= Math.PI * 2; i += Math.PI) { + var xAngle = xDim + i; + if (startAngle < endAngle) { + if (startAngle < xAngle && xAngle < endAngle) { + xs.push(xAngle); + } + } else { + if (endAngle < xAngle && xAngle < startAngle) { + xs.push(xAngle); + } + } + } + for (var i = 0; i < xs.length; i++) { + var x = xAt(cx, cy, rx, ry, xRotation, xs[i]); + if (x < minX) { + minX = x; + } + if (x > maxX) { + maxX = x; + } + } + var yDim = yExtrema(rx, ry, xRotation); + var minY = Infinity; + var maxY = -Infinity; + var ys = [startAngle, endAngle]; + for (var i = -Math.PI * 2; i <= Math.PI * 2; i += Math.PI) { + var yAngle = yDim + i; + if (startAngle < endAngle) { + if (startAngle < yAngle && yAngle < endAngle) { + ys.push(yAngle); + } + } else { + if (endAngle < yAngle && yAngle < startAngle) { + ys.push(yAngle); + } + } + } + for (var i = 0; i < ys.length; i++) { + var y = yAt(cx, cy, rx, ry, xRotation, ys[i]); + if (y < minY) { + minY = y; + } + if (y > maxY) { + maxY = y; + } + } + return { + x: minX, + y: minY, + width: maxX - minX, + height: maxY - minY, + }; + } + function length$4(x1, y1, x2, y2) { + return distance$1(x1, y1, x2, y2); + } + function pointAt$3(x1, y1, x2, y2, t) { + return { + x: (1 - t) * x1 + t * x2, + y: (1 - t) * y1 + t * y2, + }; + } + + function cubicAt(p0, p1, p2, p3, t) { + var onet = 1 - t; // t * t * t 的性能大概是 Math.pow(t, 3) 的三倍 + return ( + onet * onet * onet * p0 + 3 * p1 * t * onet * onet + 3 * p2 * t * t * onet + p3 * t * t * t + ); + } + function extrema$1(p0, p1, p2, p3) { + var a = -3 * p0 + 9 * p1 - 9 * p2 + 3 * p3; + var b = 6 * p0 - 12 * p1 + 6 * p2; + var c = 3 * p1 - 3 * p0; + var extremas = []; + var t1; + var t2; + var discSqrt; + if (isNumberEqual(a, 0)) { + if (!isNumberEqual(b, 0)) { + t1 = -c / b; + if (t1 >= 0 && t1 <= 1) { + extremas.push(t1); + } + } + } else { + var disc = b * b - 4 * a * c; + if (isNumberEqual(disc, 0)) { + extremas.push(-b / (2 * a)); + } else if (disc > 0) { + discSqrt = Math.sqrt(disc); + t1 = (-b + discSqrt) / (2 * a); + t2 = (-b - discSqrt) / (2 * a); + if (t1 >= 0 && t1 <= 1) { + extremas.push(t1); + } + if (t2 >= 0 && t2 <= 1) { + extremas.push(t2); + } + } + } + return extremas; + } + function box$3(x1, y1, x2, y2, x3, y3, x4, y4) { + var xArr = [x1, x4]; + var yArr = [y1, y4]; + var xExtrema = extrema$1(x1, x2, x3, x4); + var yExtrema = extrema$1(y1, y2, y3, y4); + for (var i = 0; i < xExtrema.length; i++) { + xArr.push(cubicAt(x1, x2, x3, x4, xExtrema[i])); + } + for (var i = 0; i < yExtrema.length; i++) { + yArr.push(cubicAt(y1, y2, y3, y4, yExtrema[i])); + } + return getBBoxByArray(xArr, yArr); + } + function lengthOfSegment(points) { + if (points.length < 2) { + return 0; + } + var totalLength = 0; + for (var i = 0; i < points.length - 1; i++) { + var from = points[i]; + var to = points[i + 1]; + totalLength += distance$1(from[0], from[1], to[0], to[1]); + } + return totalLength; + } + function length$2(points) { + return lengthOfSegment(points); + } + + // 差值公式 + function quadraticAt(p0, p1, p2, t) { + var onet = 1 - t; + return onet * onet * p0 + 2 * t * onet * p1 + t * t * p2; + } + // 求极值 + function extrema(p0, p1, p2) { + var a = p0 + p2 - 2 * p1; + if (isNumberEqual(a, 0)) { + return [0.5]; + } + var rst = (p0 - p1) / a; + if (rst <= 1 && rst >= 0) { + return [rst]; + } + return []; + } + function box(x1, y1, x2, y2, x3, y3) { + var xExtrema = extrema(x1, x2, x3)[0]; + var yExtrema = extrema(y1, y2, y3)[0]; + // 控制点不加入 box 的计算 + var xArr = [x1, x3]; + var yArr = [y1, y3]; + if (xExtrema !== undefined) { + xArr.push(quadraticAt(x1, x2, x3, xExtrema)); + } + if (yExtrema !== undefined) { + yArr.push(quadraticAt(y1, y2, y3, yExtrema)); + } + return getBBoxByArray(xArr, yArr); + } + + var commonjsGlobal = + typeof globalThis !== 'undefined' + ? globalThis + : typeof window !== 'undefined' + ? window + : typeof global !== 'undefined' + ? global + : typeof self !== 'undefined' + ? self + : {}; + + var rbush = { exports: {} }; + + (function (module, exports) { + (function (global, factory) { + module.exports = factory(); + })(commonjsGlobal, function () { + function quickselect(arr, k, left, right, compare) { + quickselectStep(arr, k, left || 0, right || arr.length - 1, compare || defaultCompare); + } + + function quickselectStep(arr, k, left, right, compare) { + while (right > left) { + if (right - left > 600) { + var n = right - left + 1; + var m = k - left + 1; + var z = Math.log(n); + var s = 0.5 * Math.exp((2 * z) / 3); + var sd = 0.5 * Math.sqrt((z * s * (n - s)) / n) * (m - n / 2 < 0 ? -1 : 1); + var newLeft = Math.max(left, Math.floor(k - (m * s) / n + sd)); + var newRight = Math.min(right, Math.floor(k + ((n - m) * s) / n + sd)); + quickselectStep(arr, k, newLeft, newRight, compare); + } + + var t = arr[k]; + var i = left; + var j = right; + + swap(arr, left, k); + if (compare(arr[right], t) > 0) { + swap(arr, left, right); + } + + while (i < j) { + swap(arr, i, j); + i++; + j--; + while (compare(arr[i], t) < 0) { + i++; + } + while (compare(arr[j], t) > 0) { + j--; + } + } + + if (compare(arr[left], t) === 0) { + swap(arr, left, j); + } else { + j++; + swap(arr, j, right); + } + + if (j <= k) { + left = j + 1; + } + if (k <= j) { + right = j - 1; + } + } + } + + function swap(arr, i, j) { + var tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; + } + + function defaultCompare(a, b) { + return a < b ? -1 : a > b ? 1 : 0; + } + + var RBush = function RBush(maxEntries) { + if (maxEntries === void 0) maxEntries = 9; + + // max entries in a node is 9 by default; min node fill is 40% for best performance + this._maxEntries = Math.max(4, maxEntries); + this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4)); + this.clear(); + }; + + RBush.prototype.all = function all() { + return this._all(this.data, []); + }; + + RBush.prototype.search = function search(bbox) { + var node = this.data; + var result = []; + + if (!intersects(bbox, node)) { + return result; + } + + var toBBox = this.toBBox; + var nodesToSearch = []; + + while (node) { + for (var i = 0; i < node.children.length; i++) { + var child = node.children[i]; + var childBBox = node.leaf ? toBBox(child) : child; + + if (intersects(bbox, childBBox)) { + if (node.leaf) { + result.push(child); + } else if (contains(bbox, childBBox)) { + this._all(child, result); + } else { + nodesToSearch.push(child); + } + } + } + node = nodesToSearch.pop(); + } + + return result; + }; + + RBush.prototype.collides = function collides(bbox) { + var node = this.data; + + if (!intersects(bbox, node)) { + return false; + } + + var nodesToSearch = []; + while (node) { + for (var i = 0; i < node.children.length; i++) { + var child = node.children[i]; + var childBBox = node.leaf ? this.toBBox(child) : child; + + if (intersects(bbox, childBBox)) { + if (node.leaf || contains(bbox, childBBox)) { + return true; + } + nodesToSearch.push(child); + } + } + node = nodesToSearch.pop(); + } + + return false; + }; + + RBush.prototype.load = function load(data) { + if (!(data && data.length)) { + return this; + } + + if (data.length < this._minEntries) { + for (var i = 0; i < data.length; i++) { + this.insert(data[i]); + } + return this; + } + + // recursively build the tree with the given data from scratch using OMT algorithm + var node = this._build(data.slice(), 0, data.length - 1, 0); + + if (!this.data.children.length) { + // save as is if tree is empty + this.data = node; + } else if (this.data.height === node.height) { + // split root if trees have the same height + this._splitRoot(this.data, node); + } else { + if (this.data.height < node.height) { + // swap trees if inserted one is bigger + var tmpNode = this.data; + this.data = node; + node = tmpNode; + } + + // insert the small tree into the large tree at appropriate level + this._insert(node, this.data.height - node.height - 1, true); + } + + return this; + }; + + RBush.prototype.insert = function insert(item) { + if (item) { + this._insert(item, this.data.height - 1); + } + return this; + }; + + RBush.prototype.clear = function clear() { + this.data = createNode([]); + return this; + }; + + RBush.prototype.remove = function remove(item, equalsFn) { + if (!item) { + return this; + } + + var node = this.data; + var bbox = this.toBBox(item); + var path = []; + var indexes = []; + var i, parent, goingUp; + + // depth-first iterative tree traversal + while (node || path.length) { + if (!node) { + // go up + node = path.pop(); + parent = path[path.length - 1]; + i = indexes.pop(); + goingUp = true; + } + + if (node.leaf) { + // check current node + var index = findItem(item, node.children, equalsFn); + + if (index !== -1) { + // item found, remove the item and condense tree upwards + node.children.splice(index, 1); + path.push(node); + this._condense(path); + return this; + } + } + + if (!goingUp && !node.leaf && contains(node, bbox)) { + // go down + path.push(node); + indexes.push(i); + i = 0; + parent = node; + node = node.children[0]; + } else if (parent) { + // go right + i++; + node = parent.children[i]; + goingUp = false; + } else { + node = null; + } // nothing found + } + + return this; + }; + + RBush.prototype.toBBox = function toBBox(item) { + return item; + }; + + RBush.prototype.compareMinX = function compareMinX(a, b) { + return a.minX - b.minX; + }; + RBush.prototype.compareMinY = function compareMinY(a, b) { + return a.minY - b.minY; + }; + + RBush.prototype.toJSON = function toJSON() { + return this.data; + }; + + RBush.prototype.fromJSON = function fromJSON(data) { + this.data = data; + return this; + }; + + RBush.prototype._all = function _all(node, result) { + var nodesToSearch = []; + while (node) { + if (node.leaf) { + result.push.apply(result, node.children); + } else { + nodesToSearch.push.apply(nodesToSearch, node.children); + } + + node = nodesToSearch.pop(); + } + return result; + }; + + RBush.prototype._build = function _build(items, left, right, height) { + var N = right - left + 1; + var M = this._maxEntries; + var node; + + if (N <= M) { + // reached leaf level; return leaf + node = createNode(items.slice(left, right + 1)); + calcBBox(node, this.toBBox); + return node; + } + + if (!height) { + // target height of the bulk-loaded tree + height = Math.ceil(Math.log(N) / Math.log(M)); + + // target number of root entries to maximize storage utilization + M = Math.ceil(N / Math.pow(M, height - 1)); + } + + node = createNode([]); + node.leaf = false; + node.height = height; + + // split the items into M mostly square tiles + + var N2 = Math.ceil(N / M); + var N1 = N2 * Math.ceil(Math.sqrt(M)); + + multiSelect(items, left, right, N1, this.compareMinX); + + for (var i = left; i <= right; i += N1) { + var right2 = Math.min(i + N1 - 1, right); + + multiSelect(items, i, right2, N2, this.compareMinY); + + for (var j = i; j <= right2; j += N2) { + var right3 = Math.min(j + N2 - 1, right2); + + // pack each entry recursively + node.children.push(this._build(items, j, right3, height - 1)); + } + } + + calcBBox(node, this.toBBox); + + return node; + }; + + RBush.prototype._chooseSubtree = function _chooseSubtree(bbox, node, level, path) { + while (true) { + path.push(node); + + if (node.leaf || path.length - 1 === level) { + break; + } + + var minArea = Infinity; + var minEnlargement = Infinity; + var targetNode = void 0; + + for (var i = 0; i < node.children.length; i++) { + var child = node.children[i]; + var area = bboxArea(child); + var enlargement = enlargedArea(bbox, child) - area; + + // choose entry with the least area enlargement + if (enlargement < minEnlargement) { + minEnlargement = enlargement; + minArea = area < minArea ? area : minArea; + targetNode = child; + } else if (enlargement === minEnlargement) { + // otherwise choose one with the smallest area + if (area < minArea) { + minArea = area; + targetNode = child; + } + } + } + + node = targetNode || node.children[0]; + } + + return node; + }; + + RBush.prototype._insert = function _insert(item, level, isNode) { + var bbox = isNode ? item : this.toBBox(item); + var insertPath = []; + + // find the best node for accommodating the item, saving all nodes along the path too + var node = this._chooseSubtree(bbox, this.data, level, insertPath); + + // put the item into the node + node.children.push(item); + extend(node, bbox); + + // split on node overflow; propagate upwards if necessary + while (level >= 0) { + if (insertPath[level].children.length > this._maxEntries) { + this._split(insertPath, level); + level--; + } else { + break; + } + } + + // adjust bboxes along the insertion path + this._adjustParentBBoxes(bbox, insertPath, level); + }; + + // split overflowed node into two + RBush.prototype._split = function _split(insertPath, level) { + var node = insertPath[level]; + var M = node.children.length; + var m = this._minEntries; + + this._chooseSplitAxis(node, m, M); + + var splitIndex = this._chooseSplitIndex(node, m, M); + + var newNode = createNode( + node.children.splice(splitIndex, node.children.length - splitIndex) + ); + newNode.height = node.height; + newNode.leaf = node.leaf; + + calcBBox(node, this.toBBox); + calcBBox(newNode, this.toBBox); + + if (level) { + insertPath[level - 1].children.push(newNode); + } else { + this._splitRoot(node, newNode); + } + }; + + RBush.prototype._splitRoot = function _splitRoot(node, newNode) { + // split root node + this.data = createNode([node, newNode]); + this.data.height = node.height + 1; + this.data.leaf = false; + calcBBox(this.data, this.toBBox); + }; + + RBush.prototype._chooseSplitIndex = function _chooseSplitIndex(node, m, M) { + var index; + var minOverlap = Infinity; + var minArea = Infinity; + + for (var i = m; i <= M - m; i++) { + var bbox1 = distBBox(node, 0, i, this.toBBox); + var bbox2 = distBBox(node, i, M, this.toBBox); + + var overlap = intersectionArea(bbox1, bbox2); + var area = bboxArea(bbox1) + bboxArea(bbox2); + + // choose distribution with minimum overlap + if (overlap < minOverlap) { + minOverlap = overlap; + index = i; + + minArea = area < minArea ? area : minArea; + } else if (overlap === minOverlap) { + // otherwise choose distribution with minimum area + if (area < minArea) { + minArea = area; + index = i; + } + } + } + + return index || M - m; + }; + + // sorts node children by the best axis for split + RBush.prototype._chooseSplitAxis = function _chooseSplitAxis(node, m, M) { + var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX; + var compareMinY = node.leaf ? this.compareMinY : compareNodeMinY; + var xMargin = this._allDistMargin(node, m, M, compareMinX); + var yMargin = this._allDistMargin(node, m, M, compareMinY); + + // if total distributions margin value is minimal for x, sort by minX, + // otherwise it's already sorted by minY + if (xMargin < yMargin) { + node.children.sort(compareMinX); + } + }; + + // total margin of all possible split distributions where each node is at least m full + RBush.prototype._allDistMargin = function _allDistMargin(node, m, M, compare) { + node.children.sort(compare); + + var toBBox = this.toBBox; + var leftBBox = distBBox(node, 0, m, toBBox); + var rightBBox = distBBox(node, M - m, M, toBBox); + var margin = bboxMargin(leftBBox) + bboxMargin(rightBBox); + + for (var i = m; i < M - m; i++) { + var child = node.children[i]; + extend(leftBBox, node.leaf ? toBBox(child) : child); + margin += bboxMargin(leftBBox); + } + + for (var i$1 = M - m - 1; i$1 >= m; i$1--) { + var child$1 = node.children[i$1]; + extend(rightBBox, node.leaf ? toBBox(child$1) : child$1); + margin += bboxMargin(rightBBox); + } + + return margin; + }; + + RBush.prototype._adjustParentBBoxes = function _adjustParentBBoxes(bbox, path, level) { + // adjust bboxes along the given tree path + for (var i = level; i >= 0; i--) { + extend(path[i], bbox); + } + }; + + RBush.prototype._condense = function _condense(path) { + // go through the path, removing empty nodes and updating bboxes + for (var i = path.length - 1, siblings = void 0; i >= 0; i--) { + if (path[i].children.length === 0) { + if (i > 0) { + siblings = path[i - 1].children; + siblings.splice(siblings.indexOf(path[i]), 1); + } else { + this.clear(); + } + } else { + calcBBox(path[i], this.toBBox); + } + } + }; + + function findItem(item, items, equalsFn) { + if (!equalsFn) { + return items.indexOf(item); + } + + for (var i = 0; i < items.length; i++) { + if (equalsFn(item, items[i])) { + return i; + } + } + return -1; + } + + // calculate node's bbox from bboxes of its children + function calcBBox(node, toBBox) { + distBBox(node, 0, node.children.length, toBBox, node); + } + + // min bounding rectangle of node children from k to p-1 + function distBBox(node, k, p, toBBox, destNode) { + if (!destNode) { + destNode = createNode(null); + } + destNode.minX = Infinity; + destNode.minY = Infinity; + destNode.maxX = -Infinity; + destNode.maxY = -Infinity; + + for (var i = k; i < p; i++) { + var child = node.children[i]; + extend(destNode, node.leaf ? toBBox(child) : child); + } + + return destNode; + } + + function extend(a, b) { + a.minX = Math.min(a.minX, b.minX); + a.minY = Math.min(a.minY, b.minY); + a.maxX = Math.max(a.maxX, b.maxX); + a.maxY = Math.max(a.maxY, b.maxY); + return a; + } + + function compareNodeMinX(a, b) { + return a.minX - b.minX; + } + function compareNodeMinY(a, b) { + return a.minY - b.minY; + } + + function bboxArea(a) { + return (a.maxX - a.minX) * (a.maxY - a.minY); + } + function bboxMargin(a) { + return a.maxX - a.minX + (a.maxY - a.minY); + } + + function enlargedArea(a, b) { + return ( + (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) * + (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY)) + ); + } + + function intersectionArea(a, b) { + var minX = Math.max(a.minX, b.minX); + var minY = Math.max(a.minY, b.minY); + var maxX = Math.min(a.maxX, b.maxX); + var maxY = Math.min(a.maxY, b.maxY); + + return Math.max(0, maxX - minX) * Math.max(0, maxY - minY); + } + + function contains(a, b) { + return a.minX <= b.minX && a.minY <= b.minY && b.maxX <= a.maxX && b.maxY <= a.maxY; + } + + function intersects(a, b) { + return b.minX <= a.maxX && b.minY <= a.maxY && b.maxX >= a.minX && b.maxY >= a.minY; + } + + function createNode(children) { + return { + children: children, + height: 1, + leaf: true, + minX: Infinity, + minY: Infinity, + maxX: -Infinity, + maxY: -Infinity, + }; + } + + // sort an array so that items come in groups of n unsorted items, with groups sorted between each other; + // combines selection algorithm with binary divide & conquer approach + + function multiSelect(arr, left, right, n, compare) { + var stack = [left, right]; + + while (stack.length) { + right = stack.pop(); + left = stack.pop(); + + if (right - left <= n) { + continue; + } + + var mid = left + Math.ceil((right - left) / n / 2) * n; + quickselect(arr, mid, left, right, compare); + + stack.push(left, mid, mid, right); + } + } + + return RBush; + }); + })(rbush); + + var RBush = rbush.exports; + + var Shape; + (function (Shape) { + Shape['GROUP'] = 'g'; + Shape['CIRCLE'] = 'circle'; + Shape['ELLIPSE'] = 'ellipse'; + Shape['IMAGE'] = 'image'; + Shape['RECT'] = 'rect'; + Shape['LINE'] = 'line'; + Shape['POLYLINE'] = 'polyline'; + Shape['POLYGON'] = 'polygon'; + Shape['TEXT'] = 'text'; + Shape['PATH'] = 'path'; + Shape['HTML'] = 'html'; + Shape['MESH'] = 'mesh'; + })(Shape || (Shape = {})); + var ClipSpaceNearZ; + (function (ClipSpaceNearZ) { + ClipSpaceNearZ[(ClipSpaceNearZ['ZERO'] = 0)] = 'ZERO'; + ClipSpaceNearZ[(ClipSpaceNearZ['NEGATIVE_ONE'] = 1)] = 'NEGATIVE_ONE'; + })(ClipSpaceNearZ || (ClipSpaceNearZ = {})); + + var AbstractRendererPlugin = /** @class */ (function () { + function AbstractRendererPlugin() { + this.plugins = []; + } + AbstractRendererPlugin.prototype.addRenderingPlugin = function (plugin) { + this.plugins.push(plugin); + this.context.renderingPlugins.push(plugin); + }; + AbstractRendererPlugin.prototype.removeAllRenderingPlugins = function () { + var _this = this; + this.plugins.forEach(function (plugin) { + var index = _this.context.renderingPlugins.indexOf(plugin); + if (index >= 0) { + _this.context.renderingPlugins.splice(index, 1); + } + }); + }; + return AbstractRendererPlugin; + })(); + var AbstractRenderer = /** @class */ (function () { + function AbstractRenderer(config) { + this.clipSpaceNearZ = ClipSpaceNearZ.NEGATIVE_ONE; + this.plugins = []; + this.config = __assign( + { + /** + * only dirty object will cause re-render + */ + enableDirtyCheck: true, + enableCulling: false, + /** + * enable auto rendering by default + */ + enableAutoRendering: true, + /** + * enable dirty rectangle rendering by default + */ + enableDirtyRectangleRendering: true, + enableDirtyRectangleRenderingDebug: false, + enableSizeAttenuation: true, + }, + config + ); + } + AbstractRenderer.prototype.registerPlugin = function (plugin) { + var index = this.plugins.findIndex(function (p) { + return p === plugin; + }); + if (index === -1) { + this.plugins.push(plugin); + } + }; + AbstractRenderer.prototype.unregisterPlugin = function (plugin) { + var index = this.plugins.findIndex(function (p) { + return p === plugin; + }); + if (index > -1) { + this.plugins.splice(index, 1); + } + }; + AbstractRenderer.prototype.getPlugins = function () { + return this.plugins; + }; + AbstractRenderer.prototype.getPlugin = function (name) { + return this.plugins.find(function (plugin) { + return plugin.name === name; + }); + }; + AbstractRenderer.prototype.getConfig = function () { + return this.config; + }; + AbstractRenderer.prototype.setConfig = function (config) { + Object.assign(this.config, config); + }; + return AbstractRenderer; + })(); + + function copyVec3(a, b) { + a[0] = b[0]; + a[1] = b[1]; + a[2] = b[2]; + return a; + } + function subVec3(o, a, b) { + o[0] = a[0] - b[0]; + o[1] = a[1] - b[1]; + o[2] = a[2] - b[2]; + return o; + } + function addVec3(o, a, b) { + o[0] = a[0] + b[0]; + o[1] = a[1] + b[1]; + o[2] = a[2] + b[2]; + return o; + } + function scaleVec3(o, a, b) { + o[0] = a[0] * b; + o[1] = a[1] * b; + o[2] = a[2] * b; + return o; + } + function maxVec3(o, a, b) { + o[0] = Math.max(a[0], b[0]); + o[1] = Math.max(a[1], b[1]); + o[2] = Math.max(a[2], b[2]); + return o; + } + function minVec3(o, a, b) { + o[0] = Math.min(a[0], b[0]); + o[1] = Math.min(a[1], b[1]); + o[2] = Math.min(a[2], b[2]); + return o; + } + function getAngle(angle) { + if (angle === undefined) { + return 0; + } else if (angle > 360 || angle < -360) { + return angle % 360; + } + return angle; + } + function createVec3(x, y, z) { + if (y === void 0) { + y = 0; + } + if (z === void 0) { + z = 0; + } + if (Array.isArray(x) && x.length === 3) { + return clone$1(x); + } + if (isNumber(x)) { + return fromValues$2(x, y, z); + } + return fromValues$2(x[0], x[1] || y, x[2] || z); + } + function deg2rad(deg) { + return deg * (Math.PI / 180); + } + function rad2deg(rad) { + return rad * (180 / Math.PI); + } + function turn2deg(turn) { + return 360 * turn; + } + function getEulerFromQuat(out, quat) { + var x = quat[0]; + var y = quat[1]; + var z = quat[2]; + var w = quat[3]; + var x2 = x * x; + var y2 = y * y; + var z2 = z * z; + var w2 = w * w; + var unit = x2 + y2 + z2 + w2; + var test = x * w - y * z; + if (test > 0.499995 * unit) { + // TODO: Use glmatrix.EPSILON + // singularity at the north pole + out[0] = Math.PI / 2; + out[1] = 2 * Math.atan2(y, x); + out[2] = 0; + } else if (test < -0.499995 * unit) { + //TODO: Use glmatrix.EPSILON + // singularity at the south pole + out[0] = -Math.PI / 2; + out[1] = 2 * Math.atan2(y, x); + out[2] = 0; + } else { + out[0] = Math.asin(2 * (x * z - w * y)); + out[1] = Math.atan2(2 * (x * w + y * z), 1 - 2 * (z2 + w2)); + out[2] = Math.atan2(2 * (x * y + z * w), 1 - 2 * (y2 + z2)); + } + // TODO: Return them as degrees and not as radians + return out; + } + function getEulerFromMat4(out, m) { + var x; + var z; + var halfPi = Math.PI * 0.5; + var _a = __read(getScaling(create$2(), m), 3), + sx = _a[0], + sy = _a[1], + sz = _a[2]; + var y = Math.asin(-m[2] / sx); + if (y < halfPi) { + if (y > -halfPi) { + x = Math.atan2(m[6] / sy, m[10] / sz); + z = Math.atan2(m[1] / sx, m[0] / sx); + } else { + // Not a unique solution + z = 0; + x = -Math.atan2(m[4] / sy, m[5] / sy); + } + } else { + // Not a unique solution + z = 0; + x = Math.atan2(m[4] / sy, m[5] / sy); + } + out[0] = x; + out[1] = y; + out[2] = z; + return out; + } + /** + * @see https://github.com/toji/gl-matrix/issues/329 + * @see https://doc.babylonjs.com/divingDeeper/mesh/transforms/center_origin/rotation_conventions + */ + function getEuler(out, quat) { + if (quat.length === 16) { + return getEulerFromMat4(out, quat); + } else { + return getEulerFromQuat(out, quat); + } + } + function fromRotationTranslationScale$1(rotation, x, y, scaleX, scaleY) { + var cos = Math.cos(rotation); + var sin = Math.sin(rotation); + return fromValues(scaleX * cos, scaleY * sin, 0, -scaleX * sin, scaleY * cos, 0, x, y, 1); + } + function makePerspective(out, left, right, top, bottom, near, far, zero) { + if (zero === void 0) { + zero = false; + } + var x = (2 * near) / (right - left); + var y = (2 * near) / (top - bottom); + var a = (right + left) / (right - left); + var b = (top + bottom) / (top - bottom); + var c; + var d; + if (zero) { + c = -far / (far - near); + d = (-far * near) / (far - near); + } else { + c = -(far + near) / (far - near); + d = (-2 * far * near) / (far - near); + } + out[0] = x; + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + out[5] = y; + out[6] = 0; + out[7] = 0; + out[8] = a; + out[9] = b; + out[10] = c; + out[11] = -1; + out[12] = 0; + out[13] = 0; + out[14] = d; + out[15] = 0; + return out; + } + function decompose(mat) { + var row0x = mat[0]; + var row0y = mat[1]; + var row1x = mat[3]; + var row1y = mat[4]; + // decompose 3x3 matrix + // @see https://www.w3.org/TR/css-transforms-1/#decomposing-a-2d-matrix + var scalingX = Math.sqrt(row0x * row0x + row0y * row0y); + var scalingY = Math.sqrt(row1x * row1x + row1y * row1y); + // If determinant is negative, one axis was flipped. + var determinant = row0x * row1y - row0y * row1x; + if (determinant < 0) { + // Flip axis with minimum unit vector dot product. + if (row0x < row1y) { + scalingX = -scalingX; + } else { + scalingY = -scalingY; + } + } + // Renormalize matrix to remove scale. + if (scalingX) { + row0x *= 1 / scalingX; + row0y *= 1 / scalingX; + } + if (scalingY) { + row1x *= 1 / scalingY; + row1y *= 1 / scalingY; + } + // Compute rotation and renormalize matrix. + var rotation = Math.atan2(row0y, row0x); + var angle = rad2deg(rotation); + return [mat[6], mat[7], scalingX, scalingY, angle]; + } + var tmp = create$1(); + var perspectiveMatrix = create$1(); + var tmpVec4 = create$3(); + var row = [create$2(), create$2(), create$2()]; + var pdum3 = create$2(); + /* + Input: matrix ; a 4x4 matrix + Output: translation ; a 3 component vector + scale ; a 3 component vector + skew ; skew factors XY,XZ,YZ represented as a 3 component vector + perspective ; a 4 component vector + quaternion ; a 4 component vector + Returns false if the matrix cannot be decomposed, true if it can + + + References: + https://github.com/kamicane/matrix3d/blob/master/lib/Matrix3d.js + https://github.com/ChromiumWebApps/chromium/blob/master/ui/gfx/transform_util.cc + http://www.w3.org/TR/css3-transforms/#decomposing-a-3d-matrix + */ + function decomposeMat4(matrix, translation, scale, skew, perspective, quaternion) { + //normalize, if not possible then bail out early + if (!normalize$4(tmp, matrix)) return false; + // perspectiveMatrix is used to solve for perspective, but it also provides + // an easy way to test for singularity of the upper 3x3 component. + copy(perspectiveMatrix, tmp); + perspectiveMatrix[3] = 0; + perspectiveMatrix[7] = 0; + perspectiveMatrix[11] = 0; + perspectiveMatrix[15] = 1; + // If the perspectiveMatrix is not invertible, we are also unable to + // decompose, so we'll bail early. Constant taken from SkMatrix44::invert. + if (Math.abs(determinant(perspectiveMatrix)) < 1e-8) return false; + var a03 = tmp[3], + a13 = tmp[7], + a23 = tmp[11], + a30 = tmp[12], + a31 = tmp[13], + a32 = tmp[14], + a33 = tmp[15]; + // First, isolate perspective. + if (a03 !== 0 || a13 !== 0 || a23 !== 0) { + tmpVec4[0] = a03; + tmpVec4[1] = a13; + tmpVec4[2] = a23; + tmpVec4[3] = a33; + // Solve the equation by inverting perspectiveMatrix and multiplying + // rightHandSide by the inverse. + // resuing the perspectiveMatrix here since it's no longer needed + var ret = invert(perspectiveMatrix, perspectiveMatrix); + if (!ret) return false; + transpose(perspectiveMatrix, perspectiveMatrix); + //multiply by transposed inverse perspective matrix, into perspective vec4 + transformMat4$1(perspective, tmpVec4, perspectiveMatrix); + } else { + //no perspective + perspective[0] = perspective[1] = perspective[2] = 0; + perspective[3] = 1; + } + // Next take care of translation + translation[0] = a30; + translation[1] = a31; + translation[2] = a32; + // Now get scale and shear. 'row' is a 3 element array of 3 component vectors + mat3from4(row, tmp); + // Compute X scale factor and normalize first row. + scale[0] = length(row[0]); + normalize(row[0], row[0]); + // Compute XY shear factor and make 2nd row orthogonal to 1st. + skew[0] = dot(row[0], row[1]); + combine(row[1], row[1], row[0], 1.0, -skew[0]); + // Now, compute Y scale and normalize 2nd row. + scale[1] = length(row[1]); + normalize(row[1], row[1]); + skew[0] /= scale[1]; + // Compute XZ and YZ shears, orthogonalize 3rd row + skew[1] = dot(row[0], row[2]); + combine(row[2], row[2], row[0], 1.0, -skew[1]); + skew[2] = dot(row[1], row[2]); + combine(row[2], row[2], row[1], 1.0, -skew[2]); + // Next, get Z scale and normalize 3rd row. + scale[2] = length(row[2]); + normalize(row[2], row[2]); + skew[1] /= scale[2]; + skew[2] /= scale[2]; + // At this point, the matrix (in rows) is orthonormal. + // Check for a coordinate system flip. If the determinant + // is -1, then negate the matrix and the scaling factors. + cross(pdum3, row[1], row[2]); + if (dot(row[0], pdum3) < 0) { + for (var i = 0; i < 3; i++) { + scale[i] *= -1; + row[i][0] *= -1; + row[i][1] *= -1; + row[i][2] *= -1; + } + } + // Now, get the rotations out + quaternion[0] = 0.5 * Math.sqrt(Math.max(1 + row[0][0] - row[1][1] - row[2][2], 0)); + quaternion[1] = 0.5 * Math.sqrt(Math.max(1 - row[0][0] + row[1][1] - row[2][2], 0)); + quaternion[2] = 0.5 * Math.sqrt(Math.max(1 - row[0][0] - row[1][1] + row[2][2], 0)); + quaternion[3] = 0.5 * Math.sqrt(Math.max(1 + row[0][0] + row[1][1] + row[2][2], 0)); + if (row[2][1] > row[1][2]) quaternion[0] = -quaternion[0]; + if (row[0][2] > row[2][0]) quaternion[1] = -quaternion[1]; + if (row[1][0] > row[0][1]) quaternion[2] = -quaternion[2]; + return true; + } + function normalize$4(out, mat) { + var m44 = mat[15]; + // Cannot normalize. + if (m44 === 0) return false; + var scale = 1 / m44; + for (var i = 0; i < 16; i++) out[i] = mat[i] * scale; + return true; + } + //gets upper-left of a 4x4 matrix into a 3x3 of vectors + function mat3from4(out, mat4x4) { + out[0][0] = mat4x4[0]; + out[0][1] = mat4x4[1]; + out[0][2] = mat4x4[2]; + out[1][0] = mat4x4[4]; + out[1][1] = mat4x4[5]; + out[1][2] = mat4x4[6]; + out[2][0] = mat4x4[8]; + out[2][1] = mat4x4[9]; + out[2][2] = mat4x4[10]; + } + function combine(out, a, b, scale1, scale2) { + out[0] = a[0] * scale1 + b[0] * scale2; + out[1] = a[1] * scale1 + b[1] * scale2; + out[2] = a[2] * scale1 + b[2] * scale2; + } + + /** + * Axis-Aligned Bounding Box + * 为了便于后续 Frustum Culling,通过查找表定义 p-vertex 和 n-vertex + * @see https://github.com/antvis/GWebGPUEngine/issues/3 + */ + var AABB = /** @class */ (function () { + function AABB() { + this.center = [0, 0, 0]; + this.halfExtents = [0, 0, 0]; + this.min = [0, 0, 0]; + this.max = [0, 0, 0]; + } + AABB.isEmpty = function (aabb) { + return ( + !aabb || + (aabb.halfExtents[0] === 0 && aabb.halfExtents[1] === 0 && aabb.halfExtents[2] === 0) + ); + }; + // center: vec3 = vec3.create(); + // halfExtents: vec3 = vec3.create(); + // min: vec3 = vec3.create(); + // max: vec3 = vec3.create(); + AABB.prototype.update = function (center, halfExtents) { + copyVec3(this.center, center); + copyVec3(this.halfExtents, halfExtents); + subVec3(this.min, this.center, this.halfExtents); + addVec3(this.max, this.center, this.halfExtents); + // vec3.copy(this.center, center); + // vec3.copy(this.halfExtents, halfExtents); + // vec3.sub(this.min, this.center, this.halfExtents); + // vec3.add(this.max, this.center, this.halfExtents); + }; + AABB.prototype.setMinMax = function (min, max) { + // vec3.add(this.center, max, min); + // vec3.scale(this.center, this.center, 0.5); + // vec3.sub(this.halfExtents, max, min); + // vec3.scale(this.halfExtents, this.halfExtents, 0.5); + // vec3.copy(this.min, min); + // vec3.copy(this.max, max); + addVec3(this.center, max, min); + scaleVec3(this.center, this.center, 0.5); + subVec3(this.halfExtents, max, min); + scaleVec3(this.halfExtents, this.halfExtents, 0.5); + copyVec3(this.min, min); + copyVec3(this.max, max); + }; + AABB.prototype.getMin = function () { + return this.min; + }; + AABB.prototype.getMax = function () { + return this.max; + }; + AABB.prototype.add = function (aabb) { + if (AABB.isEmpty(aabb)) { + return; + } + if (AABB.isEmpty(this)) { + this.setMinMax(aabb.getMin(), aabb.getMax()); + return; + } + var tc = this.center; + var tcx = tc[0]; + var tcy = tc[1]; + var tcz = tc[2]; + var th = this.halfExtents; + var thx = th[0]; + var thy = th[1]; + var thz = th[2]; + var tminx = tcx - thx; + var tmaxx = tcx + thx; + var tminy = tcy - thy; + var tmaxy = tcy + thy; + var tminz = tcz - thz; + var tmaxz = tcz + thz; + var oc = aabb.center; + var ocx = oc[0]; + var ocy = oc[1]; + var ocz = oc[2]; + var oh = aabb.halfExtents; + var ohx = oh[0]; + var ohy = oh[1]; + var ohz = oh[2]; + var ominx = ocx - ohx; + var omaxx = ocx + ohx; + var ominy = ocy - ohy; + var omaxy = ocy + ohy; + var ominz = ocz - ohz; + var omaxz = ocz + ohz; + if (ominx < tminx) { + tminx = ominx; + } + if (omaxx > tmaxx) { + tmaxx = omaxx; + } + if (ominy < tminy) { + tminy = ominy; + } + if (omaxy > tmaxy) { + tmaxy = omaxy; + } + if (ominz < tminz) { + tminz = ominz; + } + if (omaxz > tmaxz) { + tmaxz = omaxz; + } + tc[0] = (tminx + tmaxx) * 0.5; + tc[1] = (tminy + tmaxy) * 0.5; + tc[2] = (tminz + tmaxz) * 0.5; + th[0] = (tmaxx - tminx) * 0.5; + th[1] = (tmaxy - tminy) * 0.5; + th[2] = (tmaxz - tminz) * 0.5; + this.min[0] = tminx; + this.min[1] = tminy; + this.min[2] = tminz; + this.max[0] = tmaxx; + this.max[1] = tmaxy; + this.max[2] = tmaxz; + }; + AABB.prototype.setFromTransformedAABB = function (aabb, m) { + var bc = this.center; + var br = this.halfExtents; + var ac = aabb.center; + var ar = aabb.halfExtents; + var mx0 = m[0]; + var mx1 = m[4]; + var mx2 = m[8]; + var my0 = m[1]; + var my1 = m[5]; + var my2 = m[9]; + var mz0 = m[2]; + var mz1 = m[6]; + var mz2 = m[10]; + var mx0a = Math.abs(mx0); + var mx1a = Math.abs(mx1); + var mx2a = Math.abs(mx2); + var my0a = Math.abs(my0); + var my1a = Math.abs(my1); + var my2a = Math.abs(my2); + var mz0a = Math.abs(mz0); + var mz1a = Math.abs(mz1); + var mz2a = Math.abs(mz2); + bc[0] = m[12] + mx0 * ac[0] + mx1 * ac[1] + mx2 * ac[2]; + bc[1] = m[13] + my0 * ac[0] + my1 * ac[1] + my2 * ac[2]; + bc[2] = m[14] + mz0 * ac[0] + mz1 * ac[1] + mz2 * ac[2]; + // vec3.set( + // bc, + // m[12] + mx0 * ac[0] + mx1 * ac[1] + mx2 * ac[2], + // m[13] + my0 * ac[0] + my1 * ac[1] + my2 * ac[2], + // m[14] + mz0 * ac[0] + mz1 * ac[1] + mz2 * ac[2], + // ); + br[0] = mx0a * ar[0] + mx1a * ar[1] + mx2a * ar[2]; + br[1] = my0a * ar[0] + my1a * ar[1] + my2a * ar[2]; + br[2] = mz0a * ar[0] + mz1a * ar[1] + mz2a * ar[2]; + // vec3.set( + // br, + // mx0a * ar[0] + mx1a * ar[1] + mx2a * ar[2], + // my0a * ar[0] + my1a * ar[1] + my2a * ar[2], + // mz0a * ar[0] + mz1a * ar[1] + mz2a * ar[2], + // ); + // this.min = vec3.sub(this.min, bc, br); + // this.max = vec3.add(this.max, bc, br); + subVec3(this.min, bc, br); + addVec3(this.max, bc, br); + }; + AABB.prototype.intersects = function (aabb) { + var aMax = this.getMax(); + var aMin = this.getMin(); + var bMax = aabb.getMax(); + var bMin = aabb.getMin(); + return ( + aMin[0] <= bMax[0] && + aMax[0] >= bMin[0] && + aMin[1] <= bMax[1] && + aMax[1] >= bMin[1] && + aMin[2] <= bMax[2] && + aMax[2] >= bMin[2] + ); + }; + AABB.prototype.intersection = function (aabb) { + if (!this.intersects(aabb)) { + return null; + } + var intersection = new AABB(); + // const min = vec3.max(vec3.create(), this.getMin(), aabb.getMin()); + // const max = vec3.min(vec3.create(), this.getMax(), aabb.getMax()); + var min = maxVec3([0, 0, 0], this.getMin(), aabb.getMin()); + var max = minVec3([0, 0, 0], this.getMax(), aabb.getMax()); + intersection.setMinMax(min, max); + return intersection; + }; + // containsPoint(point: vec3) { + // const min = this.getMin(); + // const max = this.getMax(); + // return !( + // point[0] < min[0] || + // point[0] > max[0] || + // point[1] < min[1] || + // point[1] > max[1] || + // point[2] < min[2] || + // point[2] > max[2] + // ); + // } + /** + * get n-vertex + * @param plane plane of CullingVolume + */ + AABB.prototype.getNegativeFarPoint = function (plane) { + if (plane.pnVertexFlag === 0x111) { + return copyVec3([0, 0, 0], this.min); + // return vec3.copy(vec3.create(), this.min); + } else if (plane.pnVertexFlag === 0x110) { + return [this.min[0], this.min[1], this.max[2]]; + // return vec3.fromValues(this.min[0], this.min[1], this.max[2]); + } else if (plane.pnVertexFlag === 0x101) { + return [this.min[0], this.max[1], this.min[2]]; + // return vec3.fromValues(this.min[0], this.max[1], this.min[2]); + } else if (plane.pnVertexFlag === 0x100) { + return [this.min[0], this.max[1], this.max[2]]; + // return vec3.fromValues(this.min[0], this.max[1], this.max[2]); + } else if (plane.pnVertexFlag === 0x011) { + return [this.max[0], this.min[1], this.min[2]]; + // return vec3.fromValues(this.max[0], this.min[1], this.min[2]); + } else if (plane.pnVertexFlag === 0x010) { + return [this.max[0], this.min[1], this.max[2]]; + // return vec3.fromValues(this.max[0], this.min[1], this.max[2]); + } else if (plane.pnVertexFlag === 0x001) { + return [this.max[0], this.max[1], this.min[2]]; + // return vec3.fromValues(this.max[0], this.max[1], this.min[2]); + } else { + return [this.max[0], this.max[1], this.max[2]]; + // return vec3.fromValues(this.max[0], this.max[1], this.max[2]); + } + }; + /** + * get p-vertex + * @param plane plane of CullingVolume + */ + AABB.prototype.getPositiveFarPoint = function (plane) { + if (plane.pnVertexFlag === 0x111) { + return copyVec3([0, 0, 0], this.max); + // return vec3.copy(vec3.create(), this.max); + } else if (plane.pnVertexFlag === 0x110) { + return [this.max[0], this.max[1], this.min[2]]; + // return vec3.fromValues(this.max[0], this.max[1], this.min[2]); + } else if (plane.pnVertexFlag === 0x101) { + return [this.max[0], this.min[1], this.max[2]]; + // return vec3.fromValues(this.max[0], this.min[1], this.max[2]); + } else if (plane.pnVertexFlag === 0x100) { + return [this.max[0], this.min[1], this.min[2]]; + // return vec3.fromValues(this.max[0], this.min[1], this.min[2]); + } else if (plane.pnVertexFlag === 0x011) { + return [this.min[0], this.max[1], this.max[2]]; + // return vec3.fromValues(this.min[0], this.max[1], this.max[2]); + } else if (plane.pnVertexFlag === 0x010) { + return [this.min[0], this.max[1], this.min[2]]; + // return vec3.fromValues(this.min[0], this.max[1], this.min[2]); + } else if (plane.pnVertexFlag === 0x001) { + return [this.min[0], this.min[1], this.max[2]]; + // return vec3.fromValues(this.min[0], this.min[1], this.max[2]); + } else { + return [this.min[0], this.min[1], this.min[2]]; + // return vec3.fromValues(this.min[0], this.min[1], this.min[2]); + } + }; + return AABB; + })(); + + var Plane = /** @class */ (function () { + function Plane(distance, normal) { + this.distance = distance || 0; + this.normal = normal || fromValues$2(0, 1, 0); + this.updatePNVertexFlag(); + } + Plane.prototype.updatePNVertexFlag = function () { + this.pnVertexFlag = + (Number(this.normal[0] >= 0) << 8) + + (Number(this.normal[1] >= 0) << 4) + + Number(this.normal[2] >= 0); + }; + Plane.prototype.distanceToPoint = function (point) { + return dot(point, this.normal) - this.distance; + }; + Plane.prototype.normalize = function () { + var invLen = 1 / len(this.normal); + scale$1(this.normal, this.normal, invLen); + this.distance *= invLen; + }; + Plane.prototype.intersectsLine = function (start, end, point) { + var d0 = this.distanceToPoint(start); + var d1 = this.distanceToPoint(end); + var t = d0 / (d0 - d1); + var intersects = t >= 0 && t <= 1; + if (intersects && point) { + lerp(point, start, end, t); + } + return intersects; + }; + return Plane; + })(); + + var Mask; + (function (Mask) { + Mask[(Mask['OUTSIDE'] = 4294967295)] = 'OUTSIDE'; + Mask[(Mask['INSIDE'] = 0)] = 'INSIDE'; + Mask[(Mask['INDETERMINATE'] = 2147483647)] = 'INDETERMINATE'; + })(Mask || (Mask = {})); + var Frustum = /** @class */ (function () { + function Frustum(planes) { + this.planes = []; + if (planes) { + this.planes = planes; + } else { + for (var i = 0; i < 6; i++) { + this.planes.push(new Plane()); + } + } + } + /** + * extract 6 planes from projectionMatrix + * @see http://www8.cs.umu.se/kurser/5DV051/HT12/lab/plane_extraction.pdf + */ + Frustum.prototype.extractFromVPMatrix = function (projectionMatrix) { + // @ts-ignore + var _a = __read(projectionMatrix, 16), + m0 = _a[0], + m1 = _a[1], + m2 = _a[2], + m3 = _a[3], + m4 = _a[4], + m5 = _a[5], + m6 = _a[6], + m7 = _a[7], + m8 = _a[8], + m9 = _a[9], + m10 = _a[10], + m11 = _a[11], + m12 = _a[12], + m13 = _a[13], + m14 = _a[14], + m15 = _a[15]; + // right + set$1(this.planes[0].normal, m3 - m0, m7 - m4, m11 - m8); + this.planes[0].distance = m15 - m12; + // left + set$1(this.planes[1].normal, m3 + m0, m7 + m4, m11 + m8); + this.planes[1].distance = m15 + m12; + // bottom + set$1(this.planes[2].normal, m3 + m1, m7 + m5, m11 + m9); + this.planes[2].distance = m15 + m13; + // top + set$1(this.planes[3].normal, m3 - m1, m7 - m5, m11 - m9); + this.planes[3].distance = m15 - m13; + // far + set$1(this.planes[4].normal, m3 - m2, m7 - m6, m11 - m10); + this.planes[4].distance = m15 - m14; + // near + set$1(this.planes[5].normal, m3 + m2, m7 + m6, m11 + m10); + this.planes[5].distance = m15 + m14; + this.planes.forEach(function (plane) { + plane.normalize(); + plane.updatePNVertexFlag(); + }); + }; + return Frustum; + })(); + + var Point = /** @class */ (function () { + function Point(x, y) { + if (x === void 0) { + x = 0; + } + if (y === void 0) { + y = 0; + } + this.x = 0; + this.y = 0; + this.x = x; + this.y = y; + } + Point.prototype.clone = function () { + return new Point(this.x, this.y); + }; + Point.prototype.copyFrom = function (p) { + this.x = p.x; + this.y = p.y; + }; + return Point; + })(); + + var Rectangle = /** @class */ (function () { + function Rectangle(x, y, width, height) { + this.x = x; + this.y = y; + this.width = width; + this.height = height; + this.left = x; + this.right = x + width; + this.top = y; + this.bottom = y + height; + } + Rectangle.prototype.toJSON = function () {}; + return Rectangle; + })(); + + var ERROR_MSG_METHOD_NOT_IMPLEMENTED = 'Method not implemented.'; + var ERROR_MSG_USE_DOCUMENT_ELEMENT = 'Use document.documentElement instead.'; + var ERROR_MSG_APPEND_DESTROYED_ELEMENT = 'Cannot append a destroyed element.'; + + /** + * Different type of cameras, eg. simple camera used in 2D scene or + * advanced camera which can do actions & switch between landmarks. + */ + var CameraType; + (function (CameraType) { + /** + * Performs all the rotational operations with the focal point instead of the camera position. + * This type of camera is useful in applications(like CAD) where 3D objects are being designed or explored. + * Camera cannot orbits over the north & south poles. + * @see http://voxelent.com/tutorial-cameras/ + * + * In Three.js it's used in OrbitControls. + * @see https://threejs.org/docs/#examples/zh/controls/OrbitControls + */ + CameraType[(CameraType['ORBITING'] = 0)] = 'ORBITING'; + /** + * It's similar to the ORBITING camera, but it allows the camera to orbit over the north or south poles. + * + * In Three.js it's used in OrbitControls. + * @see https://threejs.org/docs/#examples/en/controls/TrackballControls + */ + CameraType[(CameraType['EXPLORING'] = 1)] = 'EXPLORING'; + /** + * Performs all the rotational operations with the camera position. + * It's useful in first person shooting games. + * Camera cannot orbits over the north & south poles. + * + * In Three.js it's used in FirstPersonControls. + * @see https://threejs.org/docs/#examples/en/controls/FirstPersonControls + */ + CameraType[(CameraType['TRACKING'] = 2)] = 'TRACKING'; + })(CameraType || (CameraType = {})); + /** + * CameraType must be TRACKING + */ + var CameraTrackingMode; + (function (CameraTrackingMode) { + CameraTrackingMode[(CameraTrackingMode['DEFAULT'] = 0)] = 'DEFAULT'; + CameraTrackingMode[(CameraTrackingMode['ROTATIONAL'] = 1)] = 'ROTATIONAL'; + CameraTrackingMode[(CameraTrackingMode['TRANSLATIONAL'] = 2)] = 'TRANSLATIONAL'; + CameraTrackingMode[(CameraTrackingMode['CINEMATIC'] = 3)] = 'CINEMATIC'; + })(CameraTrackingMode || (CameraTrackingMode = {})); + var CameraProjectionMode; + (function (CameraProjectionMode) { + CameraProjectionMode[(CameraProjectionMode['ORTHOGRAPHIC'] = 0)] = 'ORTHOGRAPHIC'; + CameraProjectionMode[(CameraProjectionMode['PERSPECTIVE'] = 1)] = 'PERSPECTIVE'; + })(CameraProjectionMode || (CameraProjectionMode = {})); + var CameraEvent = { + UPDATED: 'updated', + }; + + var MIN_DISTANCE = 0.0002; + /** + * 参考「WebGL Insights - 23.Designing Cameras for WebGL Applications」,基于 Responsible Camera 思路设计 + * @see https://github.com/d13g0/nucleo.js/blob/master/source/camera/Camera.js + * + * 保存相机参数,定义相机动作: + * 1. dolly 沿 n 轴移动 + * 2. pan 沿 u v 轴移动 + * 3. rotate 以方位角旋转 + * 4. 移动到 Landmark,具有平滑的动画效果,其间禁止其他用户交互 + */ + var Camera = /** @class */ (function () { + function Camera() { + /** + * Clip space near Z, default to range `[-1, 1]` + */ + this.clipSpaceNearZ = ClipSpaceNearZ.NEGATIVE_ONE; + this.eventEmitter = new eventemitter3(); + /** + * Matrix of camera + */ + this.matrix = create$1(); + /** + * u axis +X is right + * @see http://learnwebgl.brown37.net/07_cameras/camera_introduction.html#a-camera-definition + */ + this.right = fromValues$2(1, 0, 0); + /** + * v axis +Y is up + */ + this.up = fromValues$2(0, 1, 0); + /** + * n axis +Z is inside + */ + this.forward = fromValues$2(0, 0, 1); + /** + * Position of camera. + */ + this.position = fromValues$2(0, 0, 1); + /** + * Position of focal point. + */ + this.focalPoint = fromValues$2(0, 0, 0); + /** + * vector from focalPoint to position + */ + this.distanceVector = fromValues$2(0, 0, -1); + /** + * length(focalPoint - position) + */ + this.distance = 1; + /** + * @see https://en.wikipedia.org/wiki/Azimuth + */ + this.azimuth = 0; + this.elevation = 0; + this.roll = 0; + this.relAzimuth = 0; + this.relElevation = 0; + this.relRoll = 0; + /** + * 沿 n 轴移动时,保证移动速度从快到慢 + */ + this.dollyingStep = 0; + this.maxDistance = Infinity; + this.minDistance = -Infinity; + /** + * zoom factor of the camera, default is 1 + * eg. https://threejs.org/docs/#api/en/cameras/OrthographicCamera.zoom + */ + this.zoom = 1; + /** + * invert the horizontal coordinate system HCS + */ + this.rotateWorld = false; + /** + * 投影矩阵参数 + */ + /** + * field of view [0-360] + * @see http://en.wikipedia.org/wiki/Angle_of_view + */ + this.fov = 30; + this.near = 0.1; + this.far = 1000; + this.aspect = 1; + this.projectionMatrix = create$1(); + this.projectionMatrixInverse = create$1(); + this.jitteredProjectionMatrix = undefined; + this.enableUpdate = true; + // protected following = undefined; + this.type = CameraType.EXPLORING; + this.trackingMode = CameraTrackingMode.DEFAULT; + this.projectionMode = CameraProjectionMode.PERSPECTIVE; + /** + * for culling use + */ + this.frustum = new Frustum(); + /** + * ortho matrix for Canvas2D & SVG + */ + this.orthoMatrix = create$1(); + } + // constructor(type = CameraType.EXPLORING, trackingMode = CameraTrackingMode.DEFAULT) { + // this.setType(type, trackingMode); + // } + Camera.prototype.isOrtho = function () { + return this.projectionMode === CameraProjectionMode.ORTHOGRAPHIC; + }; + Camera.prototype.getProjectionMode = function () { + return this.projectionMode; + }; + Camera.prototype.getPerspective = function () { + // account for TAA + return this.jitteredProjectionMatrix || this.projectionMatrix; + }; + Camera.prototype.getPerspectiveInverse = function () { + return this.projectionMatrixInverse; + }; + Camera.prototype.getFrustum = function () { + return this.frustum; + }; + Camera.prototype.getPosition = function () { + return this.position; + }; + Camera.prototype.getFocalPoint = function () { + return this.focalPoint; + }; + Camera.prototype.getDollyingStep = function () { + return this.dollyingStep; + }; + Camera.prototype.getNear = function () { + return this.near; + }; + Camera.prototype.getFar = function () { + return this.far; + }; + Camera.prototype.getZoom = function () { + return this.zoom; + }; + Camera.prototype.getOrthoMatrix = function () { + return this.orthoMatrix; + }; + Camera.prototype.getView = function () { + return this.view; + }; + Camera.prototype.setEnableUpdate = function (enabled) { + this.enableUpdate = enabled; + }; + Camera.prototype.setType = function (type, trackingMode) { + this.type = type; + if (this.type === CameraType.EXPLORING) { + this.setWorldRotation(true); + } else { + this.setWorldRotation(false); + } + this._getAngles(); + if (this.type === CameraType.TRACKING && trackingMode !== undefined) { + this.setTrackingMode(trackingMode); + } + return this; + }; + Camera.prototype.setProjectionMode = function (projectionMode) { + this.projectionMode = projectionMode; + return this; + }; + Camera.prototype.setTrackingMode = function (trackingMode) { + if (this.type !== CameraType.TRACKING) { + throw new Error('Impossible to set a tracking mode if the camera is not of tracking type'); + } + this.trackingMode = trackingMode; + return this; + }; + /** + * If flag is true, it reverses the azimuth and elevation angles. + * Subsequent calls to rotate, setAzimuth, setElevation, + * changeAzimuth or changeElevation will cause the inverted effect. + * setRoll or changeRoll is not affected by this method. + * + * This inversion is useful when one wants to simulate that the world + * is moving, instead of the camera. + * + * By default the camera angles are not reversed. + * @param {Boolean} flag the boolean flag to reverse the angles. + */ + Camera.prototype.setWorldRotation = function (flag) { + this.rotateWorld = flag; + this._getAngles(); + return this; + }; + /** + * 计算 MV 矩阵,为相机矩阵的逆矩阵 + */ + Camera.prototype.getViewTransform = function () { + return invert(create$1(), this.matrix); + }; + Camera.prototype.getWorldTransform = function () { + return this.matrix; + }; + Camera.prototype.jitterProjectionMatrix = function (x, y) { + var translation = fromTranslation(create$1(), [x, y, 0]); + this.jitteredProjectionMatrix = multiply(create$1(), translation, this.projectionMatrix); + }; + Camera.prototype.clearJitterProjectionMatrix = function () { + this.jitteredProjectionMatrix = undefined; + }; + /** + * 设置相机矩阵 + */ + Camera.prototype.setMatrix = function (matrix) { + this.matrix = matrix; + this._update(); + return this; + }; + /** + * Set projection matrix manually. + */ + Camera.prototype.setProjectionMatrix = function (matrix) { + this.projectionMatrix = matrix; + }; + Camera.prototype.setFov = function (fov) { + this.setPerspective(this.near, this.far, fov, this.aspect); + return this; + }; + Camera.prototype.setAspect = function (aspect) { + this.setPerspective(this.near, this.far, this.fov, aspect); + return this; + }; + Camera.prototype.setNear = function (near) { + if (this.projectionMode === CameraProjectionMode.PERSPECTIVE) { + this.setPerspective(near, this.far, this.fov, this.aspect); + } else { + this.setOrthographic(this.left, this.rright, this.top, this.bottom, near, this.far); + } + return this; + }; + Camera.prototype.setFar = function (far) { + if (this.projectionMode === CameraProjectionMode.PERSPECTIVE) { + this.setPerspective(this.near, far, this.fov, this.aspect); + } else { + this.setOrthographic(this.left, this.rright, this.top, this.bottom, this.near, far); + } + return this; + }; + /** + * Sets an offset in a larger frustum, used in PixelPicking + */ + Camera.prototype.setViewOffset = function (fullWidth, fullHeight, x, y, width, height) { + this.aspect = fullWidth / fullHeight; + if (this.view === undefined) { + this.view = { + enabled: true, + fullWidth: 1, + fullHeight: 1, + offsetX: 0, + offsetY: 0, + width: 1, + height: 1, + }; + } + this.view.enabled = true; + this.view.fullWidth = fullWidth; + this.view.fullHeight = fullHeight; + this.view.offsetX = x; + this.view.offsetY = y; + this.view.width = width; + this.view.height = height; + if (this.projectionMode === CameraProjectionMode.PERSPECTIVE) { + this.setPerspective(this.near, this.far, this.fov, this.aspect); + } else { + this.setOrthographic(this.left, this.rright, this.top, this.bottom, this.near, this.far); + } + return this; + }; + Camera.prototype.clearViewOffset = function () { + if (this.view !== undefined) { + this.view.enabled = false; + } + if (this.projectionMode === CameraProjectionMode.PERSPECTIVE) { + this.setPerspective(this.near, this.far, this.fov, this.aspect); + } else { + this.setOrthographic(this.left, this.rright, this.top, this.bottom, this.near, this.far); + } + return this; + }; + Camera.prototype.setZoom = function (zoom) { + this.zoom = zoom; + if (this.projectionMode === CameraProjectionMode.ORTHOGRAPHIC) { + this.setOrthographic(this.left, this.rright, this.top, this.bottom, this.near, this.far); + } else if (this.projectionMode === CameraProjectionMode.PERSPECTIVE) { + this.setPerspective(this.near, this.far, this.fov, this.aspect); + } + return this; + }; + /** + * Zoom by specified point in viewport coordinates. + */ + Camera.prototype.setZoomByViewportPoint = function (zoom, viewportPoint) { + var _a = this.canvas.viewport2Canvas({ + x: viewportPoint[0], + y: viewportPoint[1], + }), + ox = _a.x, + oy = _a.y; + var roll = this.roll; + this.rotate(0, 0, -roll); + this.setPosition(ox, oy); + this.setFocalPoint(ox, oy); + this.setZoom(zoom); + this.rotate(0, 0, roll); + var _b = this.canvas.viewport2Canvas({ + x: viewportPoint[0], + y: viewportPoint[1], + }), + cx = _b.x, + cy = _b.y; + // project to rotated axis + var dvec = fromValues$2(cx - ox, cy - oy, 0); + var dx = dot(dvec, this.right) / length(this.right); + var dy = dot(dvec, this.up) / length(this.up); + this.pan(-dx, -dy); + return this; + }; + Camera.prototype.setPerspective = function (near, far, fov, aspect) { + var _a; + this.projectionMode = CameraProjectionMode.PERSPECTIVE; + this.fov = fov; + this.near = near; + this.far = far; + this.aspect = aspect; + var top = (this.near * Math.tan(deg2rad(0.5 * this.fov))) / this.zoom; + var height = 2 * top; + var width = this.aspect * height; + var left = -0.5 * width; + if ((_a = this.view) === null || _a === void 0 ? void 0 : _a.enabled) { + var fullWidth = this.view.fullWidth; + var fullHeight = this.view.fullHeight; + left += (this.view.offsetX * width) / fullWidth; + top -= (this.view.offsetY * height) / fullHeight; + width *= this.view.width / fullWidth; + height *= this.view.height / fullHeight; + } + makePerspective( + this.projectionMatrix, + left, + left + width, + top, + top - height, + near, + this.far, + this.clipSpaceNearZ === ClipSpaceNearZ.ZERO + ); + // flipY since the origin of OpenGL/WebGL is bottom-left compared with top-left in Canvas2D + scale(this.projectionMatrix, this.projectionMatrix, fromValues$2(1, -1, 1)); + invert(this.projectionMatrixInverse, this.projectionMatrix); + this.triggerUpdate(); + return this; + }; + Camera.prototype.setOrthographic = function (l, r, t, b, near, far) { + var _a; + this.projectionMode = CameraProjectionMode.ORTHOGRAPHIC; + this.rright = r; + this.left = l; + this.top = t; + this.bottom = b; + this.near = near; + this.far = far; + var dx = (this.rright - this.left) / (2 * this.zoom); + var dy = (this.top - this.bottom) / (2 * this.zoom); + var cx = (this.rright + this.left) / 2; + var cy = (this.top + this.bottom) / 2; + var left = cx - dx; + var right = cx + dx; + var top = cy + dy; + var bottom = cy - dy; + if ((_a = this.view) === null || _a === void 0 ? void 0 : _a.enabled) { + var scaleW = (this.rright - this.left) / this.view.fullWidth / this.zoom; + var scaleH = (this.top - this.bottom) / this.view.fullHeight / this.zoom; + left += scaleW * this.view.offsetX; + right = left + scaleW * this.view.width; + top -= scaleH * this.view.offsetY; + bottom = top - scaleH * this.view.height; + } + if (this.clipSpaceNearZ === ClipSpaceNearZ.NEGATIVE_ONE) { + ortho(this.projectionMatrix, left, right, bottom, top, near, far); + } else { + orthoZO(this.projectionMatrix, left, right, bottom, top, near, far); + } + // flipY since the origin of OpenGL/WebGL is bottom-left compared with top-left in Canvas2D + scale(this.projectionMatrix, this.projectionMatrix, fromValues$2(1, -1, 1)); + invert(this.projectionMatrixInverse, this.projectionMatrix); + this._getOrthoMatrix(); + this.triggerUpdate(); + return this; + }; + /** + * Move the camera in world coordinates. + * It will keep looking at the current focal point. + * + * support scalars or vectors. + * @example + * setPosition(1, 2, 3); + * setPosition([1, 2, 3]); + */ + Camera.prototype.setPosition = function (x, y, z) { + if (y === void 0) { + y = this.position[1]; + } + if (z === void 0) { + z = this.position[2]; + } + var position = createVec3(x, y, z); + this._setPosition(position); + this.setFocalPoint(this.focalPoint); + this.triggerUpdate(); + return this; + }; + /** + * Sets the focal point of this camera in world coordinates. + * + * support scalars or vectors. + * @example + * setFocalPoint(1, 2, 3); + * setFocalPoint([1, 2, 3]); + */ + Camera.prototype.setFocalPoint = function (x, y, z) { + if (y === void 0) { + y = this.focalPoint[1]; + } + if (z === void 0) { + z = this.focalPoint[2]; + } + var up = fromValues$2(0, 1, 0); + this.focalPoint = createVec3(x, y, z); + if (this.trackingMode === CameraTrackingMode.CINEMATIC) { + var d = subtract$1(create$2(), this.focalPoint, this.position); + x = d[0]; + y = d[1]; + z = d[2]; + var r = length(d); + var el = rad2deg(Math.asin(y / r)); + var az = 90 + rad2deg(Math.atan2(z, x)); + var m = create$1(); + rotateY(m, m, deg2rad(az)); + rotateX(m, m, deg2rad(el)); + up = transformMat4(create$2(), [0, 1, 0], m); + } + invert(this.matrix, lookAt(create$1(), this.position, this.focalPoint, up)); + this._getAxes(); + this._getDistance(); + this._getAngles(); + this.triggerUpdate(); + return this; + }; + Camera.prototype.getDistance = function () { + return this.distance; + }; + Camera.prototype.getDistanceVector = function () { + return this.distanceVector; + }; + /** + * Moves the camera towards/from the focal point. + */ + Camera.prototype.setDistance = function (d) { + if (this.distance === d || d < 0) { + return this; + } + this.distance = d; + if (this.distance < MIN_DISTANCE) { + this.distance = MIN_DISTANCE; + } + this.dollyingStep = this.distance / 100; + var pos = create$2(); + d = this.distance; + var n = this.forward; + var f = this.focalPoint; + pos[0] = d * n[0] + f[0]; + pos[1] = d * n[1] + f[1]; + pos[2] = d * n[2] + f[2]; + this._setPosition(pos); + this.triggerUpdate(); + return this; + }; + Camera.prototype.setMaxDistance = function (d) { + this.maxDistance = d; + return this; + }; + Camera.prototype.setMinDistance = function (d) { + this.minDistance = d; + return this; + }; + /** + * 设置相机方位角,不同相机模式下需要重新计算相机位置或者是视点位置 + * the azimuth in degrees + */ + Camera.prototype.setAzimuth = function (az) { + this.azimuth = getAngle(az); + this.computeMatrix(); + this._getAxes(); + if (this.type === CameraType.ORBITING || this.type === CameraType.EXPLORING) { + this._getPosition(); + } else if (this.type === CameraType.TRACKING) { + this._getFocalPoint(); + } + this.triggerUpdate(); + return this; + }; + Camera.prototype.getAzimuth = function () { + return this.azimuth; + }; + /** + * 设置相机方位角,不同相机模式下需要重新计算相机位置或者是视点位置 + */ + Camera.prototype.setElevation = function (el) { + this.elevation = getAngle(el); + this.computeMatrix(); + this._getAxes(); + if (this.type === CameraType.ORBITING || this.type === CameraType.EXPLORING) { + this._getPosition(); + } else if (this.type === CameraType.TRACKING) { + this._getFocalPoint(); + } + this.triggerUpdate(); + return this; + }; + Camera.prototype.getElevation = function () { + return this.elevation; + }; + /** + * 设置相机方位角,不同相机模式下需要重新计算相机位置或者是视点位置 + */ + Camera.prototype.setRoll = function (angle) { + this.roll = getAngle(angle); + this.computeMatrix(); + this._getAxes(); + if (this.type === CameraType.ORBITING || this.type === CameraType.EXPLORING) { + this._getPosition(); + } else if (this.type === CameraType.TRACKING) { + this._getFocalPoint(); + } + this.triggerUpdate(); + return this; + }; + Camera.prototype.getRoll = function () { + return this.roll; + }; + /** + * 根据相机矩阵重新计算各种相机参数 + */ + Camera.prototype._update = function () { + this._getAxes(); + this._getPosition(); + this._getDistance(); + this._getAngles(); + this._getOrthoMatrix(); + this.triggerUpdate(); + }; + /** + * 计算相机矩阵 + */ + Camera.prototype.computeMatrix = function () { + // 使用四元数描述 3D 旋转 + // @see https://xiaoiver.github.io/coding/2018/12/28/Camera-%E8%AE%BE%E8%AE%A1-%E4%B8%80.html + var rotZ = setAxisAngle(create$4(), [0, 0, 1], deg2rad(this.roll)); + identity(this.matrix); + // only consider HCS for EXPLORING and ORBITING cameras + var rotX = setAxisAngle( + create$4(), + [1, 0, 0], + deg2rad( + ((this.rotateWorld && this.type !== CameraType.TRACKING) || + this.type === CameraType.TRACKING + ? 1 + : -1) * this.elevation + ) + ); + var rotY = setAxisAngle( + create$4(), + [0, 1, 0], + deg2rad( + ((this.rotateWorld && this.type !== CameraType.TRACKING) || + this.type === CameraType.TRACKING + ? 1 + : -1) * this.azimuth + ) + ); + var rotQ = multiply$2(create$4(), rotY, rotX); + rotQ = multiply$2(create$4(), rotQ, rotZ); + var rotMatrix = fromQuat(create$1(), rotQ); + if (this.type === CameraType.ORBITING || this.type === CameraType.EXPLORING) { + translate(this.matrix, this.matrix, this.focalPoint); + multiply(this.matrix, this.matrix, rotMatrix); + translate(this.matrix, this.matrix, [0, 0, this.distance]); + } else if (this.type === CameraType.TRACKING) { + translate(this.matrix, this.matrix, this.position); + multiply(this.matrix, this.matrix, rotMatrix); + } + }; + /** + * Sets the camera position in the camera matrix + */ + Camera.prototype._setPosition = function (x, y, z) { + this.position = createVec3(x, y, z); + var m = this.matrix; + m[12] = this.position[0]; + m[13] = this.position[1]; + m[14] = this.position[2]; + m[15] = 1; + this._getOrthoMatrix(); + }; + /** + * Recalculates axes based on the current matrix + */ + Camera.prototype._getAxes = function () { + copy$1(this.right, createVec3(transformMat4$1(create$3(), [1, 0, 0, 0], this.matrix))); + copy$1(this.up, createVec3(transformMat4$1(create$3(), [0, 1, 0, 0], this.matrix))); + copy$1(this.forward, createVec3(transformMat4$1(create$3(), [0, 0, 1, 0], this.matrix))); + normalize(this.right, this.right); + normalize(this.up, this.up); + normalize(this.forward, this.forward); + }; + /** + * Recalculates euler angles based on the current state + */ + Camera.prototype._getAngles = function () { + // Recalculates angles + var x = this.distanceVector[0]; + var y = this.distanceVector[1]; + var z = this.distanceVector[2]; + var r = length(this.distanceVector); + // FAST FAIL: If there is no distance we cannot compute angles + if (r === 0) { + this.elevation = 0; + this.azimuth = 0; + return; + } + if (this.type === CameraType.TRACKING) { + this.elevation = rad2deg(Math.asin(y / r)); + this.azimuth = rad2deg(Math.atan2(-x, -z)); + } else { + if (this.rotateWorld) { + this.elevation = rad2deg(Math.asin(y / r)); + this.azimuth = rad2deg(Math.atan2(-x, -z)); + } else { + this.elevation = -rad2deg(Math.asin(y / r)); + this.azimuth = -rad2deg(Math.atan2(-x, -z)); + } + } + }; + /** + * 重新计算相机位置,只有 ORBITING 模式相机位置才会发生变化 + */ + Camera.prototype._getPosition = function () { + copy$1(this.position, createVec3(transformMat4$1(create$3(), [0, 0, 0, 1], this.matrix))); + // 相机位置变化,需要重新计算视距 + this._getDistance(); + }; + /** + * 重新计算视点,只有 TRACKING 模式视点才会发生变化 + */ + Camera.prototype._getFocalPoint = function () { + transformMat3(this.distanceVector, [0, 0, -this.distance], fromMat4(create(), this.matrix)); + add$1(this.focalPoint, this.position, this.distanceVector); + // 视点变化,需要重新计算视距 + this._getDistance(); + }; + /** + * 重新计算视距 + */ + Camera.prototype._getDistance = function () { + this.distanceVector = subtract$1(create$2(), this.focalPoint, this.position); + this.distance = length(this.distanceVector); + this.dollyingStep = this.distance / 100; + }; + Camera.prototype._getOrthoMatrix = function () { + if (this.projectionMode !== CameraProjectionMode.ORTHOGRAPHIC) { + return; + } + var position = this.position; + var rotZ = setAxisAngle(create$4(), [0, 0, 1], (-this.roll * Math.PI) / 180); + fromRotationTranslationScaleOrigin( + this.orthoMatrix, + rotZ, + fromValues$2( + (this.rright - this.left) / 2 - position[0], + (this.top - this.bottom) / 2 - position[1], + 0 + ), + fromValues$2(this.zoom, this.zoom, 1), + position + ); + }; + Camera.prototype.triggerUpdate = function () { + if (this.enableUpdate) { + // update frustum + var viewMatrix = this.getViewTransform(); + var vpMatrix = multiply(create$1(), this.getPerspective(), viewMatrix); + this.getFrustum().extractFromVPMatrix(vpMatrix); + this.eventEmitter.emit(CameraEvent.UPDATED); + } + }; + Camera.prototype.rotate = function (azimuth, elevation, roll) { + throw new Error(ERROR_MSG_METHOD_NOT_IMPLEMENTED); + }; + Camera.prototype.pan = function (tx, ty) { + throw new Error(ERROR_MSG_METHOD_NOT_IMPLEMENTED); + }; + Camera.prototype.dolly = function (value) { + throw new Error(ERROR_MSG_METHOD_NOT_IMPLEMENTED); + }; + Camera.prototype.createLandmark = function (name, params) { + throw new Error(ERROR_MSG_METHOD_NOT_IMPLEMENTED); + }; + Camera.prototype.gotoLandmark = function (name, options) { + throw new Error(ERROR_MSG_METHOD_NOT_IMPLEMENTED); + }; + Camera.prototype.cancelLandmarkAnimation = function () { + throw new Error(ERROR_MSG_METHOD_NOT_IMPLEMENTED); + }; + return Camera; + })(); + + function memoize(func, resolver) { + if (typeof func !== 'function' || (resolver != null && typeof resolver !== 'function')) { + throw new TypeError('Expected a function'); + } + var memoized = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var key = resolver ? resolver.apply(this, args) : args[0]; + var cache = memoized.cache; + if (cache.has(key)) { + return cache.get(key); + } + var result = func.apply(this, args); + memoized.cache = cache.set(key, result) || cache; + return result; + }; + memoized.cache = new (memoize.Cache || Map)(); + return memoized; + } + memoize.Cache = Map; + + // These units are iterated through, so be careful when adding or changing the + // order. + var UnitType; + (function (UnitType) { + UnitType[(UnitType['kUnknown'] = 0)] = 'kUnknown'; + UnitType[(UnitType['kNumber'] = 1)] = 'kNumber'; + UnitType[(UnitType['kPercentage'] = 2)] = 'kPercentage'; + // Length units + UnitType[(UnitType['kEms'] = 3)] = 'kEms'; + // kExs, + UnitType[(UnitType['kPixels'] = 4)] = 'kPixels'; + // kCentimeters, + // kMillimeters, + // kInches, + // kPoints, + // kPicas, + // kQuarterMillimeters, + // https://drafts.csswg.org/css-values-4/#viewport-relative-lengths + // + // See also IsViewportPercentageLength. + // kViewportWidth, + // kViewportHeight, + // kViewportInlineSize, + // kViewportBlockSize, + // kViewportMin, + // kViewportMax, + // kSmallViewportWidth, + // kSmallViewportHeight, + // kSmallViewportInlineSize, + // kSmallViewportBlockSize, + // kSmallViewportMin, + // kSmallViewportMax, + // kLargeViewportWidth, + // kLargeViewportHeight, + // kLargeViewportInlineSize, + // kLargeViewportBlockSize, + // kLargeViewportMin, + // kLargeViewportMax, + // kDynamicViewportWidth, + // kDynamicViewportHeight, + // kDynamicViewportInlineSize, + // kDynamicViewportBlockSize, + // kDynamicViewportMin, + // kDynamicViewportMax, + // https://drafts.csswg.org/css-contain-3/#container-lengths + // + // See also IsContainerPercentageLength. + // kContainerWidth, + // kContainerHeight, + // kContainerInlineSize, + // kContainerBlockSize, + // kContainerMin, + // kContainerMax, + UnitType[(UnitType['kRems'] = 5)] = 'kRems'; + // kChs, + // kUserUnits, // The SVG term for unitless lengths + // Angle units + UnitType[(UnitType['kDegrees'] = 6)] = 'kDegrees'; + UnitType[(UnitType['kRadians'] = 7)] = 'kRadians'; + UnitType[(UnitType['kGradians'] = 8)] = 'kGradians'; + UnitType[(UnitType['kTurns'] = 9)] = 'kTurns'; + // Time units + UnitType[(UnitType['kMilliseconds'] = 10)] = 'kMilliseconds'; + UnitType[(UnitType['kSeconds'] = 11)] = 'kSeconds'; + // kHertz, + // kKilohertz, + // Resolution + // kDotsPerPixel, + // kDotsPerInch, + // kDotsPerCentimeter, + // Other units + // kFraction, + UnitType[(UnitType['kInteger'] = 12)] = 'kInteger'; + // This value is used to handle quirky margins in reflow roots (body, td, + // and th) like WinIE. The basic idea is that a stylesheet can use the value + // __qem (for quirky em) instead of em. When the quirky value is used, if + // you're in quirks mode, the margin will collapse away inside a table cell. + // This quirk is specified in the HTML spec but our impl is different. + // TODO: Remove this. crbug.com/443952 + // kQuirkyEms, + })(UnitType || (UnitType = {})); + var UnitCategory; + (function (UnitCategory) { + UnitCategory[(UnitCategory['kUNumber'] = 0)] = 'kUNumber'; + UnitCategory[(UnitCategory['kUPercent'] = 1)] = 'kUPercent'; + UnitCategory[(UnitCategory['kULength'] = 2)] = 'kULength'; + UnitCategory[(UnitCategory['kUAngle'] = 3)] = 'kUAngle'; + UnitCategory[(UnitCategory['kUTime'] = 4)] = 'kUTime'; + // kUFrequency, + // kUResolution, + UnitCategory[(UnitCategory['kUOther'] = 5)] = 'kUOther'; + })(UnitCategory || (UnitCategory = {})); + var ValueRange; + (function (ValueRange) { + ValueRange[(ValueRange['kAll'] = 0)] = 'kAll'; + ValueRange[(ValueRange['kNonNegative'] = 1)] = 'kNonNegative'; + ValueRange[(ValueRange['kInteger'] = 2)] = 'kInteger'; + ValueRange[(ValueRange['kNonNegativeInteger'] = 3)] = 'kNonNegativeInteger'; + ValueRange[(ValueRange['kPositiveInteger'] = 4)] = 'kPositiveInteger'; + })(ValueRange || (ValueRange = {})); + var Nested; + (function (Nested) { + Nested[(Nested['kYes'] = 0)] = 'kYes'; + Nested[(Nested['kNo'] = 1)] = 'kNo'; + })(Nested || (Nested = {})); + var ParenLess; + (function (ParenLess) { + ParenLess[(ParenLess['kYes'] = 0)] = 'kYes'; + ParenLess[(ParenLess['kNo'] = 1)] = 'kNo'; + })(ParenLess || (ParenLess = {})); + + // This file specifies the unit strings used in CSSPrimitiveValues. + var data = [ + { + name: 'em', + unit_type: UnitType.kEms, + }, + // { + // name: 'ex', + // unit_type: UnitType.kExs, + // }, + { + name: 'px', + unit_type: UnitType.kPixels, + }, + // { + // name: "cm", + // unit_type: UnitType.kCentimeters, + // }, + // { + // name: "mm", + // unit_type: UnitType.kMillimeters, + // }, + // { + // name: "q", + // unit_type: UnitType.kQuarterMillimeters, + // }, + // { + // name: "in", + // unit_type: UnitType.kInches, + // }, + // { + // name: "pt", + // unit_type: UnitType.kPoints, + // }, + // { + // name: "pc", + // unit_type: UnitType.kPicas, + // }, + { + name: 'deg', + unit_type: UnitType.kDegrees, + }, + { + name: 'rad', + unit_type: UnitType.kRadians, + }, + { + name: 'grad', + unit_type: UnitType.kGradians, + }, + { + name: 'ms', + unit_type: UnitType.kMilliseconds, + }, + { + name: 's', + unit_type: UnitType.kSeconds, + }, + // { + // name: "hz", + // unit_type: UnitType.kHertz, + // }, + // { + // name: "khz", + // unit_type: UnitType.kKilohertz, + // }, + // { + // name: "dpi", + // unit_type: "kDotsPerInch", + // }, + // { + // name: "dpcm", + // unit_type: "kDotsPerCentimeter", + // }, + // { + // name: "dppx", + // unit_type: "kDotsPerPixel", + // }, + // { + // name: "x", + // unit_type: "kDotsPerPixel", + // }, + // { + // name: "vw", + // unit_type: "kViewportWidth", + // }, + // { + // name: "vh", + // unit_type: "kViewportHeight", + // }, + // { + // name: "vi", + // unit_type: "kViewportInlineSize", + // }, + // { + // name: "vb", + // unit_type: "kViewportBlockSize", + // }, + // { + // name: "vmin", + // unit_type: UnitType.kViewportMin, + // }, + // { + // name: "vmax", + // unit_type: UnitType.kViewportMax, + // }, + // { + // name: "svw", + // unit_type: "kSmallViewportWidth", + // }, + // { + // name: "svh", + // unit_type: "kSmallViewportHeight", + // }, + // { + // name: "svi", + // unit_type: "kSmallViewportInlineSize", + // }, + // { + // name: "svb", + // unit_type: "kSmallViewportBlockSize", + // }, + // { + // name: "svmin", + // unit_type: "kSmallViewportMin", + // }, + // { + // name: "svmax", + // unit_type: "kSmallViewportMax", + // }, + // { + // name: "lvw", + // unit_type: "kLargeViewportWidth", + // }, + // { + // name: "lvh", + // unit_type: "kLargeViewportHeight", + // }, + // { + // name: "lvi", + // unit_type: "kLargeViewportInlineSize", + // }, + // { + // name: "lvb", + // unit_type: "kLargeViewportBlockSize", + // }, + // { + // name: "lvmin", + // unit_type: UnitType.kLargeViewportMin, + // }, + // { + // name: "lvmax", + // unit_type: UnitType.kLargeViewportMax, + // }, + // { + // name: "dvw", + // unit_type: UnitType.kDynamicViewportWidth, + // }, + // { + // name: "dvh", + // unit_type: UnitType.kDynamicViewportHeight, + // }, + // { + // name: "dvi", + // unit_type: UnitType.kDynamicViewportInlineSize, + // }, + // { + // name: "dvb", + // unit_type: UnitType.kDynamicViewportBlockSize, + // }, + // { + // name: "dvmin", + // unit_type: UnitType.kDynamicViewportMin, + // }, + // { + // name: "dvmax", + // unit_type: UnitType.kDynamicViewportMax, + // }, + // { + // name: "cqw", + // unit_type: UnitType.kContainerWidth, + // }, + // { + // name: "cqh", + // unit_type: UnitType.kContainerHeight, + // }, + // { + // name: "cqi", + // unit_type: UnitType.kContainerInlineSize, + // }, + // { + // name: "cqb", + // unit_type: UnitType.kContainerBlockSize, + // }, + // { + // name: "cqmin", + // unit_type: UnitType.kContainerMin, + // }, + // { + // name: "cqmax", + // unit_type: UnitType.kContainerMax, + // }, + { + name: 'rem', + unit_type: UnitType.kRems, + }, + // { + // name: 'fr', + // unit_type: UnitType.kFraction, + // }, + { + name: 'turn', + unit_type: UnitType.kTurns, + }, + // { + // name: 'ch', + // unit_type: UnitType.kChs, + // }, + // { + // name: '__qem', + // unit_type: UnitType.kQuirkyEms, + // }, + ]; + var CSSStyleValueType; + (function (CSSStyleValueType) { + CSSStyleValueType[(CSSStyleValueType['kUnknownType'] = 0)] = 'kUnknownType'; + CSSStyleValueType[(CSSStyleValueType['kUnparsedType'] = 1)] = 'kUnparsedType'; + CSSStyleValueType[(CSSStyleValueType['kKeywordType'] = 2)] = 'kKeywordType'; + // Start of CSSNumericValue subclasses + CSSStyleValueType[(CSSStyleValueType['kUnitType'] = 3)] = 'kUnitType'; + CSSStyleValueType[(CSSStyleValueType['kSumType'] = 4)] = 'kSumType'; + CSSStyleValueType[(CSSStyleValueType['kProductType'] = 5)] = 'kProductType'; + CSSStyleValueType[(CSSStyleValueType['kNegateType'] = 6)] = 'kNegateType'; + CSSStyleValueType[(CSSStyleValueType['kInvertType'] = 7)] = 'kInvertType'; + CSSStyleValueType[(CSSStyleValueType['kMinType'] = 8)] = 'kMinType'; + CSSStyleValueType[(CSSStyleValueType['kMaxType'] = 9)] = 'kMaxType'; + CSSStyleValueType[(CSSStyleValueType['kClampType'] = 10)] = 'kClampType'; + // End of CSSNumericValue subclasses + CSSStyleValueType[(CSSStyleValueType['kTransformType'] = 11)] = 'kTransformType'; + CSSStyleValueType[(CSSStyleValueType['kPositionType'] = 12)] = 'kPositionType'; + CSSStyleValueType[(CSSStyleValueType['kURLImageType'] = 13)] = 'kURLImageType'; + CSSStyleValueType[(CSSStyleValueType['kColorType'] = 14)] = 'kColorType'; + CSSStyleValueType[(CSSStyleValueType['kUnsupportedColorType'] = 15)] = 'kUnsupportedColorType'; + })(CSSStyleValueType || (CSSStyleValueType = {})); + // function parseCSSStyleValue(propertyName: string, value: string): CSSStyleValue[] { + // // const propertyId = cssPropertyID(propertyName); + // // if (propertyId === CSSPropertyID.kInvalid) { + // // return []; + // // } + // // const customPropertyName = propertyId === CSSPropertyID.kVariable ? propertyName : null; + // // return fromString(propertyId, customPropertyName, value); + // return []; + // } + var stringToUnitType = function (name) { + return data.find(function (item) { + return item.name === name; + }).unit_type; + }; + var unitFromName = function (name) { + if (!name) { + return UnitType.kUnknown; + } + if (name === 'number') { + return UnitType.kNumber; + } + if (name === 'percent' || name === '%') { + return UnitType.kPercentage; + } + return stringToUnitType(name); + }; + var unitTypeToUnitCategory = function (type) { + switch (type) { + case UnitType.kNumber: + case UnitType.kInteger: + return UnitCategory.kUNumber; + case UnitType.kPercentage: + return UnitCategory.kUPercent; + case UnitType.kPixels: + // case UnitType.kCentimeters: + // case UnitType.kMillimeters: + // case UnitType.kQuarterMillimeters: + // case UnitType.kInches: + // case UnitType.kPoints: + // case UnitType.kPicas: + // case UnitType.kUserUnits: + return UnitCategory.kULength; + case UnitType.kMilliseconds: + case UnitType.kSeconds: + return UnitCategory.kUTime; + case UnitType.kDegrees: + case UnitType.kRadians: + case UnitType.kGradians: + case UnitType.kTurns: + return UnitCategory.kUAngle; + // case UnitType.kHertz: + // case UnitType.kKilohertz: + // return UnitCategory.kUFrequency; + // case UnitType.kDotsPerPixel: + // case UnitType.kDotsPerInch: + // case UnitType.kDotsPerCentimeter: + // return UnitCategory.kUResolution; + default: + return UnitCategory.kUOther; + } + }; + var canonicalUnitTypeForCategory = function (category) { + // The canonical unit type is chosen according to the way + // CSSPropertyParser.ValidUnit() chooses the default unit in each category + // (based on unitflags). + switch (category) { + case UnitCategory.kUNumber: + return UnitType.kNumber; + case UnitCategory.kULength: + return UnitType.kPixels; + case UnitCategory.kUPercent: + return UnitType.kPercentage; + // return UnitType.kUnknown; // Cannot convert between numbers and percent. + case UnitCategory.kUTime: + return UnitType.kSeconds; + case UnitCategory.kUAngle: + return UnitType.kDegrees; + // case UnitCategory.kUFrequency: + // return UnitType.kHertz; + // case UnitCategory.kUResolution: + // return UnitType.kDotsPerPixel; + default: + return UnitType.kUnknown; + } + }; + /** + * @see https://chromium.googlesource.com/chromium/src/+/refs/heads/main/third_party/blink/renderer/core/css/css_primitive_value.cc#353 + */ + var conversionToCanonicalUnitsScaleFactor = function (unit_type) { + var factor = 1.0; + // FIXME: the switch can be replaced by an array of scale factors. + switch (unit_type) { + // These are "canonical" units in their respective categories. + case UnitType.kPixels: + // case UnitType.kUserUnits: + case UnitType.kDegrees: + case UnitType.kSeconds: + // case UnitType.kHertz: + break; + case UnitType.kMilliseconds: + factor = 0.001; + break; + // case UnitType.kCentimeters: + // // factor = kCssPixelsPerCentimeter; + // break; + // case UnitType.kDotsPerCentimeter: + // // factor = 1 / kCssPixelsPerCentimeter; + // break; + // case UnitType.kMillimeters: + // // factor = kCssPixelsPerMillimeter; + // break; + // case UnitType.kQuarterMillimeters: + // // factor = kCssPixelsPerQuarterMillimeter; + // break; + // case UnitType.kInches: + // // factor = kCssPixelsPerInch; + // break; + // case UnitType.kDotsPerInch: + // // factor = 1 / kCssPixelsPerInch; + // break; + // case UnitType.kPoints: + // // factor = kCssPixelsPerPoint; + // break; + // case UnitType.kPicas: + // // factor = kCssPixelsPerPica; + // break; + case UnitType.kRadians: + factor = 180 / Math.PI; + break; + case UnitType.kGradians: + factor = 0.9; + break; + case UnitType.kTurns: + factor = 360; + break; + } + return factor; + }; + var unitTypeToString = function (type) { + switch (type) { + case UnitType.kNumber: + case UnitType.kInteger: + // case UnitType.kUserUnits: + return ''; + case UnitType.kPercentage: + return '%'; + case UnitType.kEms: + // case UnitType.kQuirkyEms: + return 'em'; + // case UnitType.kExs: + // return 'ex'; + case UnitType.kRems: + return 'rem'; + // case UnitType.kChs: + // return 'ch'; + case UnitType.kPixels: + return 'px'; + // case UnitType.kCentimeters: + // return 'cm'; + // case UnitType.kDotsPerPixel: + // return 'dppx'; + // case UnitType.kDotsPerInch: + // return 'dpi'; + // case UnitType.kDotsPerCentimeter: + // return 'dpcm'; + // case UnitType.kMillimeters: + // return 'mm'; + // case UnitType.kQuarterMillimeters: + // return 'q'; + // case UnitType.kInches: + // return 'in'; + // case UnitType.kPoints: + // return 'pt'; + // case UnitType.kPicas: + // return 'pc'; + case UnitType.kDegrees: + return 'deg'; + case UnitType.kRadians: + return 'rad'; + case UnitType.kGradians: + return 'grad'; + case UnitType.kMilliseconds: + return 'ms'; + case UnitType.kSeconds: + return 's'; + // case UnitType.kHertz: + // return 'hz'; + // case UnitType.kKilohertz: + // return 'khz'; + case UnitType.kTurns: + return 'turn'; + } + return ''; + }; + /** + * CSSStyleValue is the base class for all CSS values accessible from Typed OM. + * Values that are not yet supported as specific types are also returned as base CSSStyleValues. + * + * Spec @see https://drafts.css-houdini.org/css-typed-om/#stylevalue-objects + * Docs @see https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleValue + */ + var CSSStyleValue = /** @class */ (function () { + function CSSStyleValue() {} + // static parse(propertyName: string, value: string): CSSStyleValue { + // return parseCSSStyleValue(propertyName, value)[0]; + // } + // static parseAll(propertyName: string, value: string): CSSStyleValue[] { + // return parseCSSStyleValue(propertyName, value); + // } + CSSStyleValue.isAngle = function (unit) { + return ( + unit === UnitType.kDegrees || + unit === UnitType.kRadians || + unit === UnitType.kGradians || + unit === UnitType.kTurns + ); + }; + // static isViewportPercentageLength(type: UnitType) { + // return type >= UnitType.kViewportWidth && type <= UnitType.kDynamicViewportMax; + // } + // static isContainerPercentageLength(type: UnitType) { + // return type >= UnitType.kContainerWidth && type <= UnitType.kContainerMax; + // } + CSSStyleValue.isLength = function (type) { + // return (type >= UnitType.kEms && type <= UnitType.kUserUnits) || type == UnitType.kQuirkyEms; + return type >= UnitType.kEms && type < UnitType.kDegrees; + }; + CSSStyleValue.isRelativeUnit = function (type) { + return ( + type === UnitType.kPercentage || + type === UnitType.kEms || + // type === UnitType.kExs || + type === UnitType.kRems + // type === UnitType.kChs || + // this.isViewportPercentageLength(type) || + // this.isContainerPercentageLength(type) + ); + }; + CSSStyleValue.isTime = function (unit) { + return unit === UnitType.kSeconds || unit === UnitType.kMilliseconds; + }; + // protected abstract toCSSValue(): CSSValue; + CSSStyleValue.prototype.toString = function () { + return this.buildCSSText(Nested.kNo, ParenLess.kNo, ''); + }; + CSSStyleValue.prototype.isNumericValue = function () { + return ( + this.getType() >= CSSStyleValueType.kUnitType && + this.getType() <= CSSStyleValueType.kClampType + ); + }; + return CSSStyleValue; + })(); + + /** + * CSSColorValue is the base class used for the various CSS color interfaces. + * + * @see https://drafts.css-houdini.org/css-typed-om-1/#colorvalue-objects + */ + var CSSColorValue = /** @class */ (function (_super) { + __extends(CSSColorValue, _super); + function CSSColorValue(colorSpace) { + var _this = _super.call(this) || this; + _this.colorSpace = colorSpace; + return _this; + } + CSSColorValue.prototype.getType = function () { + return CSSStyleValueType.kColorType; + }; + // buildCSSText(n: Nested, p: ParenLess, result: string): string { + // let text = ''; + // if (this.colorSpace === 'rgb') { + // text = `rgba(${this.channels.join(',')},${this.alpha})`; + // } + // return (result += text); + // } + /** + * @see https://drafts.css-houdini.org/css-typed-om-1/#dom-csscolorvalue-to + */ + CSSColorValue.prototype.to = function (colorSpace) { + return this; + }; + return CSSColorValue; + })(CSSStyleValue); + + var GradientType; + (function (GradientType) { + GradientType[(GradientType['Constant'] = 0)] = 'Constant'; + GradientType[(GradientType['LinearGradient'] = 1)] = 'LinearGradient'; + GradientType[(GradientType['RadialGradient'] = 2)] = 'RadialGradient'; + })(GradientType || (GradientType = {})); + var CSSGradientValue = /** @class */ (function (_super) { + __extends(CSSGradientValue, _super); + function CSSGradientValue(type, value) { + var _this = _super.call(this) || this; + _this.type = type; + _this.value = value; + return _this; + } + CSSGradientValue.prototype.clone = function () { + return new CSSGradientValue(this.type, this.value); + }; + CSSGradientValue.prototype.buildCSSText = function (n, p, result) { + return result; + }; + CSSGradientValue.prototype.getType = function () { + return CSSStyleValueType.kColorType; + }; + return CSSGradientValue; + })(CSSStyleValue); + + /** + * CSSKeywordValue represents CSS Values that are specified as keywords + * eg. 'initial' + * @see https://developer.mozilla.org/en-US/docs/Web/API/CSSKeywordValue + * @see https://chromium.googlesource.com/chromium/src/+/refs/heads/main/third_party/blink/renderer/core/css/cssom/css_keyword_value.idl + */ + var CSSKeywordValue = /** @class */ (function (_super) { + __extends(CSSKeywordValue, _super); + function CSSKeywordValue(value) { + var _this = _super.call(this) || this; + _this.value = value; + return _this; + } + CSSKeywordValue.prototype.clone = function () { + return new CSSKeywordValue(this.value); + }; + CSSKeywordValue.prototype.getType = function () { + return CSSStyleValueType.kKeywordType; + }; + CSSKeywordValue.prototype.buildCSSText = function (n, p, result) { + return result + this.value; + }; + return CSSKeywordValue; + })(CSSStyleValue); + + var camelCase = memoize(function (str) { + if (str === void 0) { + str = ''; + } + return str.replace(/-([a-z])/g, function (g) { + return g[1].toUpperCase(); + }); + }); + var kebabize = function (str) { + return str + .split('') + .map(function (letter, idx) { + return letter.toUpperCase() === letter + ? ''.concat(idx !== 0 ? '-' : '').concat(letter.toLowerCase()) + : letter; + }) + .join(''); + }; + + function DCHECK(bool) { + if (!bool) { + throw new Error(); + } + } + function isFunction$1(func) { + return typeof func === 'function'; + } + function isSymbol(value) { + // @see https://github.com/lodash/lodash/blob/master/isSymbol.js + return typeof value === 'symbol'; + } + var FORMAT_ATTR_MAP = { + d: { + alias: 'path', + }, + strokeDasharray: { + alias: 'lineDash', + }, + strokeWidth: { + alias: 'lineWidth', + }, + textAnchor: { + alias: 'textAlign', + }, + src: { + alias: 'img', + }, + }; + var formatAttributeName = memoize(function (name) { + var attributeName = camelCase(name); + var map = FORMAT_ATTR_MAP[attributeName]; + attributeName = (map === null || map === void 0 ? void 0 : map.alias) || attributeName; + return attributeName; + }); + + // type CSSNumericBaseType = + // | 'length' + // | 'angle' + // | 'time' + // | 'frequency' + // | 'resolution' + // | 'flex' + // | 'percent'; + // https://drafts.css-houdini.org/css-typed-om/#dictdef-cssnumerictype + // interface CSSNumericType { + // length: number; + // angle: number; + // time: number; + // frequency: number; + // resolution: number; + // flex: number; + // percent: number; + // percentHint: CSSNumericBaseType; + // } + var formatInfinityOrNaN = function (number, suffix) { + if (suffix === void 0) { + suffix = ''; + } + var result = ''; + if (!Number.isFinite(number)) { + if (number > 0) result = 'infinity'; + else result = '-infinity'; + } else { + DCHECK(Number.isNaN(number)); + result = 'NaN'; + } + return (result += suffix); + }; + var toCanonicalUnit = function (unit) { + return canonicalUnitTypeForCategory(unitTypeToUnitCategory(unit)); + }; + /** + * CSSNumericValue is the base class for numeric and length typed CSS Values. + * @see https://drafts.css-houdini.org/css-typed-om/#numeric-objects + * @see https://developer.mozilla.org/en-US/docs/Web/API/CSSNumericValue + * @see https://chromium.googlesource.com/chromium/src/+/refs/heads/main/third_party/blink/renderer/core/css/cssom/css_numeric_value.idl + */ + /** + * Represents numeric values that can be expressed as a single number plus a + * unit (or a naked number or percentage). + * @see https://drafts.css-houdini.org/css-typed-om/#cssunitvalue + */ + var CSSUnitValue = /** @class */ (function (_super) { + __extends(CSSUnitValue, _super); + function CSSUnitValue(value, unitOrName) { + if (unitOrName === void 0) { + unitOrName = UnitType.kNumber; + } + var _this = _super.call(this) || this; + var unit; + if (typeof unitOrName === 'string') { + unit = unitFromName(unitOrName); + } else { + unit = unitOrName; + } + _this.unit = unit; + _this.value = value; + return _this; + } + CSSUnitValue.prototype.clone = function () { + return new CSSUnitValue(this.value, this.unit); + }; + CSSUnitValue.prototype.equals = function (other) { + var other_unit_value = other; + return this.value === other_unit_value.value && this.unit === other_unit_value.unit; + }; + CSSUnitValue.prototype.getType = function () { + return CSSStyleValueType.kUnitType; + }; + CSSUnitValue.prototype.convertTo = function (target_unit) { + if (this.unit === target_unit) { + return new CSSUnitValue(this.value, this.unit); + } + // Instead of defining the scale factors for every unit to every other unit, + // we simply convert to the canonical unit and back since we already have + // the scale factors for canonical units. + var canonical_unit = toCanonicalUnit(this.unit); + if (canonical_unit !== toCanonicalUnit(target_unit) || canonical_unit === UnitType.kUnknown) { + return null; + } + var scale_factor = + conversionToCanonicalUnitsScaleFactor(this.unit) / + conversionToCanonicalUnitsScaleFactor(target_unit); + return new CSSUnitValue(this.value * scale_factor, target_unit); + }; + CSSUnitValue.prototype.buildCSSText = function (n, p, result) { + var text; + switch (this.unit) { + case UnitType.kUnknown: + // FIXME + break; + case UnitType.kInteger: + text = Number(this.value).toFixed(0); + break; + case UnitType.kNumber: + case UnitType.kPercentage: + case UnitType.kEms: + // case UnitType.kQuirkyEms: + // case UnitType.kExs: + case UnitType.kRems: + // case UnitType.kChs: + case UnitType.kPixels: + // case UnitType.kCentimeters: + // case UnitType.kDotsPerPixel: + // case UnitType.kDotsPerInch: + // case UnitType.kDotsPerCentimeter: + // case UnitType.kMillimeters: + // case UnitType.kQuarterMillimeters: + // case UnitType.kInches: + // case UnitType.kPoints: + // case UnitType.kPicas: + // case UnitType.kUserUnits: + case UnitType.kDegrees: + case UnitType.kRadians: + case UnitType.kGradians: + case UnitType.kMilliseconds: + case UnitType.kSeconds: + // case UnitType.kHertz: + // case UnitType.kKilohertz: + case UnitType.kTurns: { + // case UnitType.kContainerMax: { // case UnitType.kContainerMin: // case UnitType.kContainerBlockSize: // case UnitType.kContainerInlineSize: // case UnitType.kContainerHeight: // case UnitType.kContainerWidth: // case UnitType.kDynamicViewportMax: // case UnitType.kDynamicViewportMin: // case UnitType.kDynamicViewportBlockSize: // case UnitType.kDynamicViewportInlineSize: // case UnitType.kDynamicViewportHeight: // case UnitType.kDynamicViewportWidth: // case UnitType.kLargeViewportMax: // case UnitType.kLargeViewportMin: // case UnitType.kLargeViewportBlockSize: // case UnitType.kLargeViewportInlineSize: // case UnitType.kLargeViewportHeight: // case UnitType.kLargeViewportWidth: // case UnitType.kSmallViewportMax: // case UnitType.kSmallViewportMin: // case UnitType.kSmallViewportBlockSize: // case UnitType.kSmallViewportInlineSize: // case UnitType.kSmallViewportHeight: // case UnitType.kSmallViewportWidth: // case UnitType.kViewportMax: // case UnitType.kViewportMin: // case UnitType.kViewportBlockSize: // case UnitType.kViewportInlineSize: // case UnitType.kViewportHeight: // case UnitType.kViewportWidth: // case UnitType.kFraction: + var kMinInteger = -999999; + var kMaxInteger = 999999; + var value = this.value; + var unit = unitTypeToString(this.unit); + if (value < kMinInteger || value > kMaxInteger) { + var unit_1 = unitTypeToString(this.unit); + if (!Number.isFinite(value) || Number.isNaN(value)) { + text = formatInfinityOrNaN(value, unit_1); + } else { + text = value + (unit_1 || ''); + } + } else { + text = ''.concat(value).concat(unit); + } + } + } + result += text; + return result; + }; + return CSSUnitValue; + })(CSSStyleValue); + var Opx = new CSSUnitValue(0, 'px'); + new CSSUnitValue(1, 'px'); + var Odeg = new CSSUnitValue(0, 'deg'); + + /** + * The CSSRGB class represents the CSS rgb()/rgba() functions. + * + * @see https://drafts.css-houdini.org/css-typed-om-1/#cssrgb + */ + var CSSRGB = /** @class */ (function (_super) { + __extends(CSSRGB, _super); + function CSSRGB( + r, + g, + b, + alpha, + /** + * 'transparent' & 'none' has the same rgba data + */ + isNone + ) { + if (alpha === void 0) { + alpha = 1; + } + if (isNone === void 0) { + isNone = false; + } + var _this = _super.call(this, 'rgb') || this; + _this.r = r; + _this.g = g; + _this.b = b; + _this.alpha = alpha; + _this.isNone = isNone; + return _this; + } + CSSRGB.prototype.clone = function () { + return new CSSRGB(this.r, this.g, this.b, this.alpha); + }; + CSSRGB.prototype.buildCSSText = function (n, p, result) { + return ( + result + + 'rgba('.concat(this.r, ',').concat(this.g, ',').concat(this.b, ',').concat(this.alpha, ')') + ); + }; + return CSSRGB; + })(CSSColorValue); + + /** + * CSSKeywordValue + */ + var unsetKeywordValue = new CSSKeywordValue('unset'); + var initialKeywordValue = new CSSKeywordValue('initial'); + var inheritKeywordValue = new CSSKeywordValue('inherit'); + var keywordCache = { + '': unsetKeywordValue, + unset: unsetKeywordValue, + initial: initialKeywordValue, + inherit: inheritKeywordValue, + }; + var getOrCreateKeyword = function (name) { + if (!keywordCache[name]) { + keywordCache[name] = new CSSKeywordValue(name); + } + return keywordCache[name]; + }; + /** + * CSSColor + */ + var noneColor = new CSSRGB(0, 0, 0, 0, true); + var transparentColor = new CSSRGB(0, 0, 0, 0); + var getOrCreateRGBA = memoize( + function (r, g, b, a) { + return new CSSRGB(r, g, b, a); + }, + function (r, g, b, a) { + return 'rgba('.concat(r, ',').concat(g, ',').concat(b, ',').concat(a, ')'); + } + ); + // export const getOrCreateUnitValue = memoize( + // (value: number, unitOrName: UnitType | string = UnitType.kNumber) => { + // return new CSSUnitValue(value, unitOrName); + // }, + // (value: number, unitOrName: UnitType | string = UnitType.kNumber) => { + // return `${value}${unitOrName}`; + // }, + // ); + var getOrCreateUnitValue = function (value, unitOrName) { + if (unitOrName === void 0) { + unitOrName = UnitType.kNumber; + } + return new CSSUnitValue(value, unitOrName); + }; + new CSSUnitValue(50, '%'); + + /** + * @see https://doc.babylonjs.com/how_to/optimizing_your_scene#changing-mesh-culling-strategy + */ + var Strategy; + (function (Strategy) { + Strategy[(Strategy['Standard'] = 0)] = 'Standard'; + })(Strategy || (Strategy = {})); + + var SortReason; + (function (SortReason) { + SortReason[(SortReason['ADDED'] = 0)] = 'ADDED'; + SortReason[(SortReason['REMOVED'] = 1)] = 'REMOVED'; + SortReason[(SortReason['Z_INDEX_CHANGED'] = 2)] = 'Z_INDEX_CHANGED'; + })(SortReason || (SortReason = {})); + + var EMPTY_PARSED_PATH = { + absolutePath: [], + hasArc: false, + segments: [], + polygons: [], + polylines: [], + curve: null, + totalLength: 0, + rect: new Rectangle(0, 0, 0, 0), + }; + + /** + * @see https://developer.mozilla.org/en-US/docs/Web/SVG/Content_type + */ + var PropertySyntax; + (function (PropertySyntax) { + /** + * @see https://developer.mozilla.org/en-US/docs/Web/SVG/Content_type#coordinate + */ + PropertySyntax['COORDINATE'] = ''; + /** + * @see https://developer.mozilla.org/en-US/docs/Web/SVG/Content_type#color + */ + PropertySyntax['COLOR'] = ''; + /** + * @see https://developer.mozilla.org/en-US/docs/Web/SVG/Content_type#paint + */ + PropertySyntax['PAINT'] = ''; + /** + * @see https://developer.mozilla.org/en-US/docs/Web/SVG/Content_type#number + */ + PropertySyntax['NUMBER'] = ''; + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/CSS/angle + */ + PropertySyntax['ANGLE'] = ''; + /** + * with range 0..1 + * @see https://developer.mozilla.org/en-US/docs/Web/SVG/Content_type#opacity_value + */ + PropertySyntax['OPACITY_VALUE'] = ''; + /** + * with range 0..Infinity + */ + PropertySyntax['SHADOW_BLUR'] = ''; + /** + * @see https://developer.mozilla.org/en-US/docs/Web/SVG/Content_type#length + */ + PropertySyntax['LENGTH'] = ''; + /** + * @see https://developer.mozilla.org/en-US/docs/Web/SVG/Content_type#percentage + */ + PropertySyntax['PERCENTAGE'] = ''; + PropertySyntax['LENGTH_PERCENTAGE'] = ' | '; + PropertySyntax['LENGTH_PERCENTAGE_12'] = '[ | ]{1,2}'; + /** + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/margin#formal_syntax + */ + PropertySyntax['LENGTH_PERCENTAGE_14'] = '[ | ]{1,4}'; + /** + * @see https://developer.mozilla.org/en-US/docs/Web/SVG/Content_type#list-of-ts + */ + PropertySyntax['LIST_OF_POINTS'] = ''; + PropertySyntax['PATH'] = ''; + /** + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/filter#formal_syntax + */ + PropertySyntax['FILTER'] = ''; + PropertySyntax['Z_INDEX'] = ''; + PropertySyntax['OFFSET_DISTANCE'] = ''; + PropertySyntax['DEFINED_PATH'] = ''; + PropertySyntax['MARKER'] = ''; + PropertySyntax['TRANSFORM'] = ''; + PropertySyntax['TRANSFORM_ORIGIN'] = ''; + PropertySyntax['TEXT'] = ''; + PropertySyntax['TEXT_TRANSFORM'] = ''; + })(PropertySyntax || (PropertySyntax = {})); + + /** + * borrow from gradient-parser, but we delete some browser compatible prefix such as `-webkit-` + * @see https://github.com/rafaelcaricio/gradient-parser + */ + function colorStopToString(colorStop) { + var type = colorStop.type, + value = colorStop.value; + if (type === 'hex') { + return '#'.concat(value); + } else if (type === 'literal') { + return value; + } else if (type === 'rgb') { + return 'rgb('.concat(value.join(','), ')'); + } else { + return 'rgba('.concat(value.join(','), ')'); + } + } + var parseGradient$1 = (function () { + var tokens = { + linearGradient: /^(linear\-gradient)/i, + repeatingLinearGradient: /^(repeating\-linear\-gradient)/i, + radialGradient: /^(radial\-gradient)/i, + repeatingRadialGradient: /^(repeating\-radial\-gradient)/i, + /** + * @see https://projects.verou.me/conic-gradient/ + */ + conicGradient: /^(conic\-gradient)/i, + sideOrCorner: + /^to (left (top|bottom)|right (top|bottom)|top (left|right)|bottom (left|right)|left|right|top|bottom)/i, + extentKeywords: + /^(closest\-side|closest\-corner|farthest\-side|farthest\-corner|contain|cover)/, + positionKeywords: /^(left|center|right|top|bottom)/i, + pixelValue: /^(-?(([0-9]*\.[0-9]+)|([0-9]+\.?)))px/, + percentageValue: /^(-?(([0-9]*\.[0-9]+)|([0-9]+\.?)))\%/, + emValue: /^(-?(([0-9]*\.[0-9]+)|([0-9]+\.?)))em/, + angleValue: /^(-?(([0-9]*\.[0-9]+)|([0-9]+\.?)))deg/, + startCall: /^\(/, + endCall: /^\)/, + comma: /^,/, + hexColor: /^\#([0-9a-fA-F]+)/, + literalColor: /^([a-zA-Z]+)/, + rgbColor: /^rgb/i, + rgbaColor: /^rgba/i, + number: /^(([0-9]*\.[0-9]+)|([0-9]+\.?))/, + }; + var input = ''; + function error(msg) { + throw new Error(input + ': ' + msg); + } + function getAST() { + var ast = matchListDefinitions(); + if (input.length > 0) { + error('Invalid input not EOF'); + } + return ast; + } + function matchListDefinitions() { + return matchListing(matchDefinition); + } + function matchDefinition() { + return ( + matchGradient('linear-gradient', tokens.linearGradient, matchLinearOrientation) || + matchGradient( + 'repeating-linear-gradient', + tokens.repeatingLinearGradient, + matchLinearOrientation + ) || + matchGradient('radial-gradient', tokens.radialGradient, matchListRadialOrientations) || + matchGradient( + 'repeating-radial-gradient', + tokens.repeatingRadialGradient, + matchListRadialOrientations + ) || + matchGradient('conic-gradient', tokens.conicGradient, matchListRadialOrientations) + ); + } + function matchGradient(gradientType, pattern, orientationMatcher) { + return matchCall(pattern, function (captures) { + var orientation = orientationMatcher(); + if (orientation) { + if (!scan(tokens.comma)) { + error('Missing comma before color stops'); + } + } + return { + type: gradientType, + orientation: orientation, + colorStops: matchListing(matchColorStop), + }; + }); + } + function matchCall(pattern, callback) { + var captures = scan(pattern); + if (captures) { + if (!scan(tokens.startCall)) { + error('Missing ('); + } + var result = callback(captures); + if (!scan(tokens.endCall)) { + error('Missing )'); + } + return result; + } + } + function matchLinearOrientation() { + return matchSideOrCorner() || matchAngle(); + } + function matchSideOrCorner() { + return match('directional', tokens.sideOrCorner, 1); + } + function matchAngle() { + return match('angular', tokens.angleValue, 1); + } + function matchListRadialOrientations() { + var radialOrientations, + radialOrientation = matchRadialOrientation(), + lookaheadCache; + if (radialOrientation) { + radialOrientations = []; + radialOrientations.push(radialOrientation); + lookaheadCache = input; + if (scan(tokens.comma)) { + radialOrientation = matchRadialOrientation(); + if (radialOrientation) { + radialOrientations.push(radialOrientation); + } else { + input = lookaheadCache; + } + } + } + return radialOrientations; + } + function matchRadialOrientation() { + var radialType = matchCircle() || matchEllipse(); + if (radialType) { + // @ts-ignore + radialType.at = matchAtPosition(); + } else { + var extent = matchExtentKeyword(); + if (extent) { + radialType = extent; + var positionAt = matchAtPosition(); + if (positionAt) { + // @ts-ignore + radialType.at = positionAt; + } + } else { + var defaultPosition = matchPositioning(); + if (defaultPosition) { + radialType = { + type: 'default-radial', + // @ts-ignore + at: defaultPosition, + }; + } + } + } + return radialType; + } + function matchCircle() { + var circle = match('shape', /^(circle)/i, 0); + if (circle) { + // @ts-ignore + circle.style = matchLength() || matchExtentKeyword(); + } + return circle; + } + function matchEllipse() { + var ellipse = match('shape', /^(ellipse)/i, 0); + if (ellipse) { + // @ts-ignore + ellipse.style = matchDistance() || matchExtentKeyword(); + } + return ellipse; + } + function matchExtentKeyword() { + return match('extent-keyword', tokens.extentKeywords, 1); + } + function matchAtPosition() { + if (match('position', /^at/, 0)) { + var positioning = matchPositioning(); + if (!positioning) { + error('Missing positioning value'); + } + return positioning; + } + } + function matchPositioning() { + var location = matchCoordinates(); + if (location.x || location.y) { + return { + type: 'position', + value: location, + }; + } + } + function matchCoordinates() { + return { + x: matchDistance(), + y: matchDistance(), + }; + } + function matchListing(matcher) { + var captures = matcher(); + var result = []; + if (captures) { + result.push(captures); + while (scan(tokens.comma)) { + captures = matcher(); + if (captures) { + result.push(captures); + } else { + error('One extra comma'); + } + } + } + return result; + } + function matchColorStop() { + var color = matchColor(); + if (!color) { + error('Expected color definition'); + } + color.length = matchDistance(); + return color; + } + function matchColor() { + return matchHexColor() || matchRGBAColor() || matchRGBColor() || matchLiteralColor(); + } + function matchLiteralColor() { + return match('literal', tokens.literalColor, 0); + } + function matchHexColor() { + return match('hex', tokens.hexColor, 1); + } + function matchRGBColor() { + return matchCall(tokens.rgbColor, function () { + return { + type: 'rgb', + value: matchListing(matchNumber), + }; + }); + } + function matchRGBAColor() { + return matchCall(tokens.rgbaColor, function () { + return { + type: 'rgba', + value: matchListing(matchNumber), + }; + }); + } + function matchNumber() { + return scan(tokens.number)[1]; + } + function matchDistance() { + return match('%', tokens.percentageValue, 1) || matchPositionKeyword() || matchLength(); + } + function matchPositionKeyword() { + return match('position-keyword', tokens.positionKeywords, 1); + } + function matchLength() { + return match('px', tokens.pixelValue, 1) || match('em', tokens.emValue, 1); + } + function match(type, pattern, captureIndex) { + var captures = scan(pattern); + if (captures) { + return { + type: type, + value: captures[captureIndex], + }; + } + } + function scan(regexp) { + var blankCaptures = /^[\n\r\t\s]+/.exec(input); + if (blankCaptures) { + consume(blankCaptures[0].length); + } + var captures = regexp.exec(input); + if (captures) { + consume(captures[0].length); + } + return captures; + } + function consume(size) { + input = input.substring(size); + } + return function (code) { + input = code; + return getAST(); + }; + })(); + function computeLinearGradient(min, width, height, angle) { + var rad = deg2rad(angle.value); + var rx = 0; + var ry = 0; + var rcx = rx + width / 2; + var rcy = ry + height / 2; + // get the length of gradient line + // @see https://observablehq.com/@danburzo/css-gradient-line + var length = Math.abs(width * Math.cos(rad)) + Math.abs(height * Math.sin(rad)); + var x1 = min[0] + rcx - (Math.cos(rad) * length) / 2; + var y1 = min[1] + rcy - (Math.sin(rad) * length) / 2; + var x2 = min[0] + rcx + (Math.cos(rad) * length) / 2; + var y2 = min[1] + rcy + (Math.sin(rad) * length) / 2; + return { x1: x1, y1: y1, x2: x2, y2: y2 }; + } + function computeRadialGradient(min, width, height, cx, cy, size) { + // 'px' + var x = cx.value; + var y = cy.value; + // TODO: 'em' + // '%' + if (cx.unit === UnitType.kPercentage) { + x = (cx.value / 100) * width; + } + if (cy.unit === UnitType.kPercentage) { + y = (cy.value / 100) * height; + } + // default to farthest-side + var r = Math.max( + distanceSquareRoot([0, 0], [x, y]), + distanceSquareRoot([0, height], [x, y]), + distanceSquareRoot([width, height], [x, y]), + distanceSquareRoot([width, 0], [x, y]) + ); + if (size) { + if (size instanceof CSSUnitValue) { + r = size.value; + } else if (size instanceof CSSKeywordValue) { + // @see https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Images/Using_CSS_gradients#example_closest-side_for_circles + if (size.value === 'closest-side') { + r = Math.min(x, width - x, y, height - y); + } else if (size.value === 'farthest-side') { + r = Math.max(x, width - x, y, height - y); + } else if (size.value === 'closest-corner') { + r = Math.min( + distanceSquareRoot([0, 0], [x, y]), + distanceSquareRoot([0, height], [x, y]), + distanceSquareRoot([width, height], [x, y]), + distanceSquareRoot([width, 0], [x, y]) + ); + } + } + } + return { x: x + min[0], y: y + min[1], r: r }; + } + + var regexLG = /^l\s*\(\s*([\d.]+)\s*\)\s*(.*)/i; + var regexRG = /^r\s*\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*\)\s*(.*)/i; + var regexPR = /^p\s*\(\s*([axyn])\s*\)\s*(.*)/i; + var regexColorStop = /[\d.]+:(#[^\s]+|[^\)]+\))/gi; + function spaceColorStops(colorStops) { + var _a, _b, _c; + var length = colorStops.length; + colorStops[length - 1].length = + (_a = colorStops[length - 1].length) !== null && _a !== void 0 + ? _a + : { + type: '%', + value: '100', + }; + if (length > 1) { + colorStops[0].length = + (_b = colorStops[0].length) !== null && _b !== void 0 + ? _b + : { + type: '%', + value: '0', + }; + } + var previousIndex = 0; + var previousOffset = Number(colorStops[0].length.value); + for (var i = 1; i < length; i++) { + // support '%' & 'px' + var offset = (_c = colorStops[i].length) === null || _c === void 0 ? void 0 : _c.value; + if (!isNil(offset) && !isNil(previousOffset)) { + for (var j = 1; j < i - previousIndex; j++) + colorStops[previousIndex + j].length = { + type: '%', + value: ''.concat( + previousOffset + ((Number(offset) - previousOffset) * j) / (i - previousIndex) + ), + }; + previousIndex = i; + previousOffset = Number(offset); + } + } + } + // The position of the gradient line's starting point. + // different from CSS side(to top) @see https://developer.mozilla.org/en-US/docs/Web/CSS/gradient/linear-gradient#values + var SideOrCornerToDegMap = { + left: 270 - 90, + top: 0 - 90, + bottom: 180 - 90, + right: 90 - 90, + 'left top': 315 - 90, + 'top left': 315 - 90, + 'left bottom': 225 - 90, + 'bottom left': 225 - 90, + 'right top': 45 - 90, + 'top right': 45 - 90, + 'right bottom': 135 - 90, + 'bottom right': 135 - 90, + }; + var angleToDeg = memoize(function (orientation) { + var angle; + if (orientation.type === 'angular') { + angle = Number(orientation.value); + } else { + angle = SideOrCornerToDegMap[orientation.value] || 0; + } + return getOrCreateUnitValue(angle, 'deg'); + }); + var positonToCSSUnitValue = memoize(function (position) { + var cx = 50; + var cy = 50; + var unitX = '%'; + var unitY = '%'; + if ((position === null || position === void 0 ? void 0 : position.type) === 'position') { + var _a = position.value, + x = _a.x, + y = _a.y; + if ((x === null || x === void 0 ? void 0 : x.type) === 'position-keyword') { + if (x.value === 'left') { + cx = 0; + } else if (x.value === 'center') { + cx = 50; + } else if (x.value === 'right') { + cx = 100; + } else if (x.value === 'top') { + cy = 0; + } else if (x.value === 'bottom') { + cy = 100; + } + } + if ((y === null || y === void 0 ? void 0 : y.type) === 'position-keyword') { + if (y.value === 'left') { + cx = 0; + } else if (y.value === 'center') { + cy = 50; + } else if (y.value === 'right') { + cx = 100; + } else if (y.value === 'top') { + cy = 0; + } else if (y.value === 'bottom') { + cy = 100; + } + } + if ( + (x === null || x === void 0 ? void 0 : x.type) === 'px' || + (x === null || x === void 0 ? void 0 : x.type) === '%' || + (x === null || x === void 0 ? void 0 : x.type) === 'em' + ) { + unitX = x === null || x === void 0 ? void 0 : x.type; + cx = Number(x.value); + } + if ( + (y === null || y === void 0 ? void 0 : y.type) === 'px' || + (y === null || y === void 0 ? void 0 : y.type) === '%' || + (y === null || y === void 0 ? void 0 : y.type) === 'em' + ) { + unitY = y === null || y === void 0 ? void 0 : y.type; + cy = Number(y.value); + } + } + return { + cx: getOrCreateUnitValue(cx, unitX), + cy: getOrCreateUnitValue(cy, unitY), + }; + }); + var parseGradient = memoize(function (colorStr) { + var _a; + if (colorStr.indexOf('linear') > -1 || colorStr.indexOf('radial') > -1) { + var ast = parseGradient$1(colorStr); + return ast.map(function (_a) { + var type = _a.type, + orientation = _a.orientation, + colorStops = _a.colorStops; + spaceColorStops(colorStops); + var steps = colorStops.map(function (colorStop) { + // TODO: only support % for now, should calc percentage of axis length when using px/em + return { + offset: getOrCreateUnitValue(Number(colorStop.length.value), '%'), + color: colorStopToString(colorStop), + }; + }); + if (type === 'linear-gradient') { + return new CSSGradientValue(GradientType.LinearGradient, { + angle: orientation ? angleToDeg(orientation) : Odeg, + steps: steps, + }); + } else if (type === 'radial-gradient') { + if (!orientation) { + orientation = [ + { + type: 'shape', + value: 'circle', + }, + ]; + } + if (orientation[0].type === 'shape' && orientation[0].value === 'circle') { + var _b = positonToCSSUnitValue(orientation[0].at), + cx = _b.cx, + cy = _b.cy; + var size = void 0; + if (orientation[0].style) { + var _c = orientation[0].style, + type_1 = _c.type, + value = _c.value; + if (type_1 === 'extent-keyword') { + size = getOrCreateKeyword(value); + } else { + size = getOrCreateUnitValue(value, type_1); + } + } + return new CSSGradientValue(GradientType.RadialGradient, { + cx: cx, + cy: cy, + size: size, + steps: steps, + }); + } + // TODO: support ellipse shape + // TODO: repeating-linear-gradient & repeating-radial-gradient + // } else if (type === 'repeating-linear-gradient') { + // } else if (type === 'repeating-radial-gradient') { + } + }); + } + // legacy format, should be deprecated later + var type = colorStr[0]; + if (colorStr[1] === '(' || colorStr[2] === '(') { + if (type === 'l') { + var arr = regexLG.exec(colorStr); + if (arr) { + var steps = + ((_a = arr[2].match(regexColorStop)) === null || _a === void 0 + ? void 0 + : _a.map(function (stop) { + return stop.split(':'); + })) || []; + return [ + new CSSGradientValue(GradientType.LinearGradient, { + angle: getOrCreateUnitValue(parseFloat(arr[1]), 'deg'), + steps: steps.map(function (_a) { + var _b = __read(_a, 2), + offset = _b[0], + color = _b[1]; + return { + offset: getOrCreateUnitValue(Number(offset) * 100, '%'), + color: color, + }; + }), + }), + ]; + } + } else if (type === 'r') { + var parsedRadialGradient = parseRadialGradient(colorStr); + if (parsedRadialGradient) { + if (isString(parsedRadialGradient)) { + colorStr = parsedRadialGradient; + } else { + return [new CSSGradientValue(GradientType.RadialGradient, parsedRadialGradient)]; + } + } + } else if (type === 'p') { + return parsePattern(colorStr); + } + } + }); + function parseRadialGradient(gradientStr) { + var _a; + var arr = regexRG.exec(gradientStr); + if (arr) { + var steps = + ((_a = arr[4].match(regexColorStop)) === null || _a === void 0 + ? void 0 + : _a.map(function (stop) { + return stop.split(':'); + })) || []; + return { + cx: getOrCreateUnitValue(50, '%'), + cy: getOrCreateUnitValue(50, '%'), + steps: steps.map(function (_a) { + var _b = __read(_a, 2), + offset = _b[0], + color = _b[1]; + return { + offset: getOrCreateUnitValue(Number(offset) * 100, '%'), + color: color, + }; + }), + }; + } + return null; + } + function parsePattern(patternStr) { + var arr = regexPR.exec(patternStr); + if (arr) { + var repetition = arr[1]; + var src = arr[2]; + switch (repetition) { + case 'a': + repetition = 'repeat'; + break; + case 'x': + repetition = 'repeat-x'; + break; + case 'y': + repetition = 'repeat-y'; + break; + case 'n': + repetition = 'no-repeat'; + break; + default: + repetition = 'no-repeat'; + } + return { + image: src, + // @ts-ignore + repetition: repetition, + }; + } + return null; + } + function isPattern(object) { + return object && !!object.image; + } + function isCSSRGB(object) { + return object && !isNil(object.r) && !isNil(object.g) && !isNil(object.b); + } + /** + * @see https://github.com/WebKit/WebKit/blob/main/Source/WebCore/css/parser/CSSParser.cpp#L97 + */ + var parseColor = memoize(function (colorStr) { + if (isPattern(colorStr)) { + return __assign({ repetition: 'repeat' }, colorStr); + } + if (isNil(colorStr)) { + colorStr = ''; + } + if (colorStr === 'transparent') { + // transparent black + return transparentColor; + } else if (colorStr === 'currentColor') { + // @see https://github.com/adobe-webplatform/Snap.svg/issues/526 + colorStr = 'black'; + } else if (colorStr === 'none') { + return noneColor; + } + // support CSS gradient syntax + var g = parseGradient(colorStr); + if (g) { + return g; + } + // constants + var color$1 = color(colorStr); + var rgba = [0, 0, 0, 0]; + if (color$1 !== null) { + rgba[0] = color$1.r || 0; + rgba[1] = color$1.g || 0; + rgba[2] = color$1.b || 0; + rgba[3] = color$1.opacity; + } + // return new CSSRGB(...rgba); + return getOrCreateRGBA.apply(void 0, __spreadArray([], __read(rgba), false)); + }); + function mergeColors(left, right) { + // only support constant value, exclude gradient & pattern + if (!isCSSRGB(left) || !isCSSRGB(right)) { + return; + } + return [ + [Number(left.r), Number(left.g), Number(left.b), Number(left.alpha)], + [Number(right.r), Number(right.g), Number(right.b), Number(right.alpha)], + function (color) { + var rgba = color.slice(); + if (rgba[3]) { + for (var i = 0; i < 3; i++) rgba[i] = Math.round(clamp(rgba[i], 0, 255)); + } + rgba[3] = clamp(rgba[3], 0, 1); + return 'rgba('.concat(rgba.join(','), ')'); + }, + ]; + } + + function parseDimension(unitRegExp, string) { + if (isNil(string)) { + return getOrCreateUnitValue(0, 'px'); + } + string = ''.concat(string).trim().toLowerCase(); + if (isFinite(Number(string))) { + if ('px'.search(unitRegExp) >= 0) { + return getOrCreateUnitValue(Number(string), 'px'); + } else if ('deg'.search(unitRegExp) >= 0) { + return getOrCreateUnitValue(Number(string), 'deg'); + } + } + var matchedUnits = []; + string = string.replace(unitRegExp, function (match) { + matchedUnits.push(match); + return 'U' + match; + }); + var taggedUnitRegExp = 'U(' + unitRegExp.source + ')'; + return matchedUnits.map(function (unit) { + return getOrCreateUnitValue( + Number( + string + .replace(new RegExp('U' + unit, 'g'), '') + .replace(new RegExp(taggedUnitRegExp, 'g'), '*0') + ), + unit + ); + })[0]; + } + /** + * + * @see https://developer.mozilla.org/zh-CN/docs/Web/CSS/length + * length with only absolute unit, eg. 1px + */ + var parseLengthUnmemoize = function (css) { + return parseDimension(new RegExp('px', 'g'), css); + }; + var parseLength = memoize(parseLengthUnmemoize); + /** + * + * @see https://developer.mozilla.org/zh-CN/docs/Web/CSS/percentage + */ + var parserPercentageUnmemoize = function (css) { + return parseDimension(new RegExp('%', 'g'), css); + }; + memoize(parserPercentageUnmemoize); + /** + * length with absolute or relative unit, + * eg. 1px, 0.7em, 50%, calc(100% - 200px); + * + * @see https://developer.mozilla.org/zh-CN/docs/Web/CSS/length-percentage + */ + var parseLengthOrPercentageUnmemoize = function (css) { + if (isNumber(css) || isFinite(Number(css))) { + // Number(css) is NaN + return getOrCreateUnitValue(Number(css) || 0, 'px'); + // return Number(css); + } + return parseDimension(new RegExp('px|%|em|rem', 'g'), css); + }; + var parseLengthOrPercentage = memoize(parseLengthOrPercentageUnmemoize); + var parseAngleUnmemoize = function (css) { + return parseDimension(new RegExp('deg|rad|grad|turn', 'g'), css); + }; + var parseAngle = memoize(parseAngleUnmemoize); + /** + * merge CSSUnitValue + * + * @example + * 10px + 20px = 30px + * 10deg + 10rad + * 10% + 20% = 30% + */ + function mergeDimensions(left, right, target, nonNegative, index) { + if (index === void 0) { + index = 0; + } + var unit = ''; + var leftValue = left.value || 0; + var rightValue = right.value || 0; + var canonicalUnit = toCanonicalUnit(left.unit); + var leftCanonicalUnitValue = left.convertTo(canonicalUnit); + var rightCanonicalUnitValue = right.convertTo(canonicalUnit); + if (leftCanonicalUnitValue && rightCanonicalUnitValue) { + leftValue = leftCanonicalUnitValue.value; + rightValue = rightCanonicalUnitValue.value; + unit = unitTypeToString(left.unit); + } else { + // format '%' to 'px' + if (CSSUnitValue.isLength(left.unit) || CSSUnitValue.isLength(right.unit)) { + leftValue = convertPercentUnit(left, index, target); + rightValue = convertPercentUnit(right, index, target); + unit = 'px'; + } + } + // // format 'rad' 'turn' to 'deg' + // if (CSSUnitValue.isAngle(left.unit) || CSSUnitValue.isAngle(right.unit)) { + // leftValue = convertAngleUnit(left); + // rightValue = convertAngleUnit(right); + // unit = 'deg'; + // } + return [ + leftValue, + rightValue, + function (value) { + if (nonNegative) { + value = Math.max(value, 0); + } + return value + unit; + }, + ]; + } + function convertAngleUnit(value) { + var deg = 0; + if (value.unit === UnitType.kDegrees) { + deg = value.value; + } else if (value.unit === UnitType.kRadians) { + deg = rad2deg(Number(value.value)); + } else if (value.unit === UnitType.kTurns) { + deg = turn2deg(Number(value.value)); + } + return deg; + } + function parseDimensionArrayFormat(string, size) { + var parsed; + if (Array.isArray(string)) { + // [1, '2px', 3] + parsed = string.map(function (segment) { + return Number(segment); + }); + } else if (isString(string)) { + parsed = string.split(' ').map(function (segment) { + return Number(segment); + }); + } else if (isNumber(string)) { + parsed = [string]; + } + if (size === 2) { + if (parsed.length === 1) { + return [parsed[0], parsed[0]]; + } else { + return [parsed[0], parsed[1]]; + } + } else { + if (parsed.length === 1) { + return [parsed[0], parsed[0], parsed[0], parsed[0]]; + } else if (parsed.length === 2) { + return [parsed[0], parsed[1], parsed[0], parsed[1]]; + } else if (parsed.length === 3) { + return [parsed[0], parsed[1], parsed[2], parsed[1]]; + } else { + return [parsed[0], parsed[1], parsed[2], parsed[3]]; + } + } + } + function parseDimensionArray(string) { + if (isString(string)) { + // "1px 2px 3px" + return string.split(' ').map(function (segment) { + return parseLengthOrPercentage(segment); + }); + } else { + // [1, '2px', 3] + return string.map(function (segment) { + return parseLengthOrPercentage(segment.toString()); + }); + } + } + // export function mergeDimensionList( + // left: CSSUnitValue[], + // right: CSSUnitValue[], + // target: IElement | null, + // ): [number[], number[], (list: number[]) => string] | undefined { + // if (left.length !== right.length) { + // return; + // } + // const unit = left[0].unit; + // return [ + // left.map((l) => l.value), + // right.map((l) => l.value), + // (values: number[]) => { + // return values.map((n) => new CSSUnitValue(n, unit)).join(' '); + // }, + // ]; + // } + function convertPercentUnit(valueWithUnit, vec3Index, target, useMin) { + if (useMin === void 0) { + useMin = false; + } + if (valueWithUnit.unit === UnitType.kPixels) { + return Number(valueWithUnit.value); + } else if (valueWithUnit.unit === UnitType.kPercentage && target) { + var bounds = + target.nodeName === Shape.GROUP ? target.getLocalBounds() : target.getGeometryBounds(); + return ( + (useMin ? bounds.min[vec3Index] : 0) + + (valueWithUnit.value / 100) * bounds.halfExtents[vec3Index] * 2 + ); + } + return 0; + } + + var parseParam = function (css) { + return parseDimension(/deg|rad|grad|turn|px|%/g, css); + }; + var supportedFilters = [ + 'blur', + 'brightness', + 'drop-shadow', + 'contrast', + 'grayscale', + 'sepia', + 'saturate', + 'hue-rotate', + 'invert', + ]; + function parseFilter(filterStr) { + if (filterStr === void 0) { + filterStr = ''; + } + filterStr = filterStr.toLowerCase().trim(); + if (filterStr === 'none') { + return []; + } + var filterRegExp = /\s*([\w-]+)\(([^)]*)\)/g; + var result = []; + var match; + var prevLastIndex = 0; + while ((match = filterRegExp.exec(filterStr))) { + if (match.index !== prevLastIndex) { + return []; + } + prevLastIndex = match.index + match[0].length; + if (supportedFilters.indexOf(match[1]) > -1) { + result.push({ + name: match[1], + params: match[2].split(' ').map(function (p) { + return parseParam(p) || parseColor(p); + }), + }); + } + if (filterRegExp.lastIndex === filterStr.length) { + return result; + } + } + return []; + } + + function numberToString(x) { + // scale(0.00000001) -> scale(0) + // return x.toFixed(6).replace(/0+$/, '').replace(/\.$/, ''); + return x.toString(); + } + /** + * parse string or number to CSSUnitValue(numeric) + * + * eg. + * * 0 -> CSSUnitValue(0) + * * '2' -> CSSUnitValue(2) + */ + var parseNumberUnmemoize = function (string) { + if (typeof string === 'number') { + return getOrCreateUnitValue(string); + } + if (/^\s*[-+]?(\d*\.)?\d+\s*$/.test(string)) { + return getOrCreateUnitValue(Number(string)); + } else { + return getOrCreateUnitValue(0); + } + }; + var parseNumber = memoize(parseNumberUnmemoize); + memoize(function (string) { + if (isString(string)) { + return string.split(' ').map(parseNumber); + } else { + return string.map(parseNumber); + } + }); + function mergeNumbers(left, right) { + return [left, right, numberToString]; + } + function clampedMergeNumbers(min, max) { + return function (left, right) { + return [ + left, + right, + function (x) { + return numberToString(clamp(x, min, max)); + }, + ]; + }; + } + function mergeNumberLists(left, right) { + if (left.length !== right.length) { + return; + } + return [ + left, + right, + function (numberList) { + return numberList; + }, + ]; + } + + function getOrCalculatePathTotalLength(path) { + if (path.parsedStyle.d.totalLength === 0) { + path.parsedStyle.d.totalLength = getTotalLength(path.parsedStyle.d.absolutePath); + } + return path.parsedStyle.d.totalLength; + } + function getOrCalculatePolylineTotalLength(polyline) { + if (polyline.parsedStyle.points.totalLength === 0) { + polyline.parsedStyle.points.totalLength = length$2(polyline.parsedStyle.points.points); + } + return polyline.parsedStyle.points.totalLength; + } + function removeRedundantMCommand(path) { + for (var i = 0; i < path.length; i++) { + var prevSegment = path[i - 1]; + var segment = path[i]; + var cmd = segment[0]; + if (cmd === 'M') { + if (prevSegment) { + var prevCmd = prevSegment[0]; + var srcPoint = [segment[1], segment[2]]; + var destPoint = void 0; + if (prevCmd === 'L' || prevCmd === 'M') { + destPoint = [prevSegment[1], prevSegment[2]]; + } else if (prevCmd === 'C' || prevCmd === 'A' || prevCmd === 'Q') { + destPoint = [prevSegment[prevSegment.length - 2], prevSegment[prevSegment.length - 1]]; + } + if (destPoint && isSamePoint(srcPoint, destPoint)) { + path.splice(i, 1); + i--; + } + } + } + } + } + function hasArcOrBezier(path) { + var hasArc = false; + var count = path.length; + for (var i = 0; i < count; i++) { + var params = path[i]; + var cmd = params[0]; + if (cmd === 'C' || cmd === 'A' || cmd === 'Q') { + hasArc = true; + break; + } + } + return hasArc; + } + function extractPolygons(pathArray) { + var polygons = []; + var polylines = []; + var points = []; // 防止第一个命令不是 'M' + for (var i = 0; i < pathArray.length; i++) { + var params = pathArray[i]; + var cmd = params[0]; + if (cmd === 'M') { + // 遇到 'M' 判定是否是新数组,新数组中没有点 + if (points.length) { + // 如果存在点,则说明没有遇到 'Z',开始了一个新的多边形 + polylines.push(points); + points = []; // 创建新的点 + } + points.push([params[1], params[2]]); + } else if (cmd === 'Z') { + if (points.length) { + // 存在点 + polygons.push(points); + points = []; // 开始新的点集合 + } + // 如果不存在点,同时 'Z',则说明是错误,不处理 + } else { + points.push([params[1], params[2]]); + } + } + // 说明 points 未放入 polygons 或者 polyline + // 仅当只有一个 M,没有 Z 时会发生这种情况 + if (points.length > 0) { + polylines.push(points); + } + return { + polygons: polygons, + polylines: polylines, + }; + } + function isSamePoint(point1, point2) { + return point1[0] === point2[0] && point1[1] === point2[1]; + } + function getPathBBox(segments, lineWidth) { + var xArr = []; + var yArr = []; + var segmentsWithAngle = []; + for (var i = 0; i < segments.length; i++) { + var segment = segments[i]; + var currentPoint = segment.currentPoint, + params = segment.params, + prePoint = segment.prePoint; + var box$1 = void 0; + switch (segment.command) { + case 'Q': + box$1 = box(prePoint[0], prePoint[1], params[1], params[2], params[3], params[4]); + break; + case 'C': + box$1 = box$3( + prePoint[0], + prePoint[1], + params[1], + params[2], + params[3], + params[4], + params[5], + params[6] + ); + break; + case 'A': + var arcParams = segment.arcParams; + box$1 = box$5( + arcParams.cx, + arcParams.cy, + arcParams.rx, + arcParams.ry, + arcParams.xRotation, + arcParams.startAngle, + arcParams.endAngle + ); + break; + default: + xArr.push(currentPoint[0]); + yArr.push(currentPoint[1]); + break; + } + if (box$1) { + segment.box = box$1; + xArr.push(box$1.x, box$1.x + box$1.width); + yArr.push(box$1.y, box$1.y + box$1.height); + } + if ( + lineWidth && + (segment.command === 'L' || segment.command === 'M') && + segment.prePoint && + segment.nextPoint + ) { + segmentsWithAngle.push(segment); + } + } + // bbox calculation should ignore NaN for path attribute + // ref: https://github.com/antvis/g/issues/210 + // ref: https://github.com/antvis/G2/issues/3109 + xArr = xArr.filter(function (item) { + return !Number.isNaN(item) && item !== Infinity && item !== -Infinity; + }); + yArr = yArr.filter(function (item) { + return !Number.isNaN(item) && item !== Infinity && item !== -Infinity; + }); + var minX = min(xArr); + var minY = min(yArr); + var maxX = max(xArr); + var maxY = max(yArr); + if (segmentsWithAngle.length === 0) { + return { + x: minX, + y: minY, + width: maxX - minX, + height: maxY - minY, + }; + } + for (var i = 0; i < segmentsWithAngle.length; i++) { + var segment = segmentsWithAngle[i]; + var currentPoint = segment.currentPoint; + var extra = void 0; + if (currentPoint[0] === minX) { + extra = getExtraFromSegmentWithAngle(segment, lineWidth); + minX = minX - extra.xExtra; + } else if (currentPoint[0] === maxX) { + extra = getExtraFromSegmentWithAngle(segment, lineWidth); + maxX = maxX + extra.xExtra; + } + if (currentPoint[1] === minY) { + extra = getExtraFromSegmentWithAngle(segment, lineWidth); + minY = minY - extra.yExtra; + } else if (currentPoint[1] === maxY) { + extra = getExtraFromSegmentWithAngle(segment, lineWidth); + maxY = maxY + extra.yExtra; + } + } + return { + x: minX, + y: minY, + width: maxX - minX, + height: maxY - minY, + }; + } + function getExtraFromSegmentWithAngle(segment, lineWidth) { + var prePoint = segment.prePoint, + currentPoint = segment.currentPoint, + nextPoint = segment.nextPoint; + var currentAndPre = + Math.pow(currentPoint[0] - prePoint[0], 2) + Math.pow(currentPoint[1] - prePoint[1], 2); + var currentAndNext = + Math.pow(currentPoint[0] - nextPoint[0], 2) + Math.pow(currentPoint[1] - nextPoint[1], 2); + var preAndNext = + Math.pow(prePoint[0] - nextPoint[0], 2) + Math.pow(prePoint[1] - nextPoint[1], 2); + // 以 currentPoint 为顶点的夹角 + var currentAngle = Math.acos( + (currentAndPre + currentAndNext - preAndNext) / + (2 * Math.sqrt(currentAndPre) * Math.sqrt(currentAndNext)) + ); + // 夹角为空、 0 或 PI 时,不需要计算夹角处的额外宽度 + // 注意: 由于计算精度问题,夹角为 0 的情况计算出来的角度可能是一个很小的值,还需要判断其与 0 是否近似相等 + if (!currentAngle || Math.sin(currentAngle) === 0 || isNumberEqual(currentAngle, 0)) { + return { + xExtra: 0, + yExtra: 0, + }; + } + var xAngle = Math.abs( + Math.atan2(nextPoint[1] - currentPoint[1], nextPoint[0] - currentPoint[0]) + ); + var yAngle = Math.abs( + Math.atan2(nextPoint[0] - currentPoint[0], nextPoint[1] - currentPoint[1]) + ); + // 将夹角转为锐角 + xAngle = xAngle > Math.PI / 2 ? Math.PI - xAngle : xAngle; + yAngle = yAngle > Math.PI / 2 ? Math.PI - yAngle : yAngle; + // 这里不考虑在水平和垂直方向的投影,直接使用最大差值 + // 由于上层统一加减了二分之一线宽,这里需要进行弥补 + var extra = { + // 水平方向投影 + xExtra: + Math.cos(currentAngle / 2 - xAngle) * ((lineWidth / 2) * (1 / Math.sin(currentAngle / 2))) - + lineWidth / 2 || 0, + // 垂直方向投影 + yExtra: + Math.cos(yAngle - currentAngle / 2) * ((lineWidth / 2) * (1 / Math.sin(currentAngle / 2))) - + lineWidth / 2 || 0, + }; + return extra; + } + // 点对称 + function toSymmetry(point, center) { + return [center[0] + (center[0] - point[0]), center[1] + (center[1] - point[1])]; + } + var angleBetween$1 = function (v0, v1) { + var p = v0.x * v1.x + v0.y * v1.y; + var n = Math.sqrt( + (Math.pow(v0.x, 2) + Math.pow(v0.y, 2)) * (Math.pow(v1.x, 2) + Math.pow(v1.y, 2)) + ); + var sign = v0.x * v1.y - v0.y * v1.x < 0 ? -1 : 1; + var angle = sign * Math.acos(p / n); + return angle; + }; + /** + * @see https://github.com/rveciana/svg-path-properties/blob/b6bd9a322966f6ef7a311872d80c56e3718de861/src/arc.ts#L121 + */ + var pointOnEllipticalArc = function (p0, rx, ry, xAxisRotation, largeArcFlag, sweepFlag, p1, t) { + // In accordance to: http://www.w3.org/TR/SVG/implnote.html#ArcOutOfRangeParameters + rx = Math.abs(rx); + ry = Math.abs(ry); + xAxisRotation = mod(xAxisRotation, 360); + var xAxisRotationRadians = deg2rad(xAxisRotation); + // If the endpoints are identical, then this is equivalent to omitting the elliptical arc segment entirely. + if (p0.x === p1.x && p0.y === p1.y) { + return { x: p0.x, y: p0.y, ellipticalArcAngle: 0 }; // Check if angle is correct + } + // If rx = 0 or ry = 0 then this arc is treated as a straight line segment joining the endpoints. + if (rx === 0 || ry === 0) { + //return this.pointOnLine(p0, p1, t); + return { x: 0, y: 0, ellipticalArcAngle: 0 }; // Check if angle is correct + } + // Following "Conversion from endpoint to center parameterization" + // http://www.w3.org/TR/SVG/implnote.html#ArcConversionEndpointToCenter + // Step #1: Compute transformedPoint + var dx = (p0.x - p1.x) / 2; + var dy = (p0.y - p1.y) / 2; + var transformedPoint = { + x: Math.cos(xAxisRotationRadians) * dx + Math.sin(xAxisRotationRadians) * dy, + y: -Math.sin(xAxisRotationRadians) * dx + Math.cos(xAxisRotationRadians) * dy, + }; + // Ensure radii are large enough + var radiiCheck = + Math.pow(transformedPoint.x, 2) / Math.pow(rx, 2) + + Math.pow(transformedPoint.y, 2) / Math.pow(ry, 2); + if (radiiCheck > 1) { + rx = Math.sqrt(radiiCheck) * rx; + ry = Math.sqrt(radiiCheck) * ry; + } + // Step #2: Compute transformedCenter + var cSquareNumerator = + Math.pow(rx, 2) * Math.pow(ry, 2) - + Math.pow(rx, 2) * Math.pow(transformedPoint.y, 2) - + Math.pow(ry, 2) * Math.pow(transformedPoint.x, 2); + var cSquareRootDenom = + Math.pow(rx, 2) * Math.pow(transformedPoint.y, 2) + + Math.pow(ry, 2) * Math.pow(transformedPoint.x, 2); + var cRadicand = cSquareNumerator / cSquareRootDenom; + // Make sure this never drops below zero because of precision + cRadicand = cRadicand < 0 ? 0 : cRadicand; + var cCoef = (largeArcFlag !== sweepFlag ? 1 : -1) * Math.sqrt(cRadicand); + var transformedCenter = { + x: cCoef * ((rx * transformedPoint.y) / ry), + y: cCoef * (-(ry * transformedPoint.x) / rx), + }; + // Step #3: Compute center + var center = { + x: + Math.cos(xAxisRotationRadians) * transformedCenter.x - + Math.sin(xAxisRotationRadians) * transformedCenter.y + + (p0.x + p1.x) / 2, + y: + Math.sin(xAxisRotationRadians) * transformedCenter.x + + Math.cos(xAxisRotationRadians) * transformedCenter.y + + (p0.y + p1.y) / 2, + }; + // Step #4: Compute start/sweep angles + // Start angle of the elliptical arc prior to the stretch and rotate operations. + // Difference between the start and end angles + var startVector = { + x: (transformedPoint.x - transformedCenter.x) / rx, + y: (transformedPoint.y - transformedCenter.y) / ry, + }; + var startAngle = angleBetween$1( + { + x: 1, + y: 0, + }, + startVector + ); + var endVector = { + x: (-transformedPoint.x - transformedCenter.x) / rx, + y: (-transformedPoint.y - transformedCenter.y) / ry, + }; + var sweepAngle = angleBetween$1(startVector, endVector); + if (!sweepFlag && sweepAngle > 0) { + sweepAngle -= 2 * Math.PI; + } else if (sweepFlag && sweepAngle < 0) { + sweepAngle += 2 * Math.PI; + } + // We use % instead of `mod(..)` because we want it to be -360deg to 360deg(but actually in radians) + sweepAngle %= 2 * Math.PI; + // From http://www.w3.org/TR/SVG/implnote.html#ArcParameterizationAlternatives + var angle = startAngle + sweepAngle * t; + var ellipseComponentX = rx * Math.cos(angle); + var ellipseComponentY = ry * Math.sin(angle); + var point = { + x: + Math.cos(xAxisRotationRadians) * ellipseComponentX - + Math.sin(xAxisRotationRadians) * ellipseComponentY + + center.x, + y: + Math.sin(xAxisRotationRadians) * ellipseComponentX + + Math.cos(xAxisRotationRadians) * ellipseComponentY + + center.y, + ellipticalArcStartAngle: startAngle, + ellipticalArcEndAngle: startAngle + sweepAngle, + ellipticalArcAngle: angle, + ellipticalArcCenter: center, + resultantRx: rx, + resultantRy: ry, + }; + return point; + }; + function path2Segments(path) { + var segments = []; + var currentPoint = null; // 当前图形 + var nextParams = null; // 下一节点的 path 参数 + var startMovePoint = null; // 开始 M 的点,可能会有多个 + var lastStartMovePointIndex = 0; // 最近一个开始点 M 的索引 + var count = path.length; + for (var i = 0; i < count; i++) { + var params = path[i]; + nextParams = path[i + 1]; + var command = params[0]; + // 数学定义上的参数,便于后面的计算 + var segment = { + command: command, + prePoint: currentPoint, + params: params, + startTangent: null, + endTangent: null, + currentPoint: null, + nextPoint: null, + arcParams: null, + box: null, + cubicParams: null, + }; + switch (command) { + case 'M': + startMovePoint = [params[1], params[2]]; + lastStartMovePointIndex = i; + break; + case 'A': + var arcParams = getArcParams(currentPoint, params); + segment.arcParams = arcParams; + break; + } + if (command === 'Z') { + // 有了 Z 后,当前节点从开始 M 的点开始 + currentPoint = startMovePoint; + // 如果当前点的命令为 Z,相当于当前点为最近一个 M 点,则下一个点直接指向最近一个 M 点的下一个点 + nextParams = path[lastStartMovePointIndex + 1]; + } else { + var len = params.length; + currentPoint = [params[len - 2], params[len - 1]]; + } + if (nextParams && nextParams[0] === 'Z') { + // 如果下一个点的命令为 Z,则下一个点直接指向最近一个 M 点 + nextParams = path[lastStartMovePointIndex]; + if (segments[lastStartMovePointIndex]) { + // 如果下一个点的命令为 Z,则最近一个 M 点的前一个点为当前点 + segments[lastStartMovePointIndex].prePoint = currentPoint; + } + } + segment.currentPoint = currentPoint; + // 如果当前点与最近一个 M 点相同,则最近一个 M 点的前一个点为当前点的前一个点 + if ( + segments[lastStartMovePointIndex] && + isSamePoint(currentPoint, segments[lastStartMovePointIndex].currentPoint) + ) { + segments[lastStartMovePointIndex].prePoint = segment.prePoint; + } + var nextPoint = nextParams + ? [nextParams[nextParams.length - 2], nextParams[nextParams.length - 1]] + : null; + segment.nextPoint = nextPoint; + // Add startTangent and endTangent + var prePoint = segment.prePoint; + if (['L', 'H', 'V'].includes(command)) { + segment.startTangent = [prePoint[0] - currentPoint[0], prePoint[1] - currentPoint[1]]; + segment.endTangent = [currentPoint[0] - prePoint[0], currentPoint[1] - prePoint[1]]; + } else if (command === 'Q') { + // 二次贝塞尔曲线只有一个控制点 + var cp = [params[1], params[2]]; + // 二次贝塞尔曲线的终点为 currentPoint + segment.startTangent = [prePoint[0] - cp[0], prePoint[1] - cp[1]]; + segment.endTangent = [currentPoint[0] - cp[0], currentPoint[1] - cp[1]]; + } else if (command === 'T') { + var preSegment = segments[i - 1]; + var cp = toSymmetry(preSegment.currentPoint, prePoint); + if (preSegment.command === 'Q') { + segment.command = 'Q'; + segment.startTangent = [prePoint[0] - cp[0], prePoint[1] - cp[1]]; + segment.endTangent = [currentPoint[0] - cp[0], currentPoint[1] - cp[1]]; + } else { + // @ts-ignore + segment.command = 'TL'; + segment.startTangent = [prePoint[0] - currentPoint[0], prePoint[1] - currentPoint[1]]; + segment.endTangent = [currentPoint[0] - prePoint[0], currentPoint[1] - prePoint[1]]; + } + } else if (command === 'C') { + // 三次贝塞尔曲线有两个控制点 + var cp1 = [params[1], params[2]]; + var cp2 = [params[3], params[4]]; + segment.startTangent = [prePoint[0] - cp1[0], prePoint[1] - cp1[1]]; + segment.endTangent = [currentPoint[0] - cp2[0], currentPoint[1] - cp2[1]]; + // horizontal line, eg. ['C', 100, 100, 100, 100, 200, 200] + if (segment.startTangent[0] === 0 && segment.startTangent[1] === 0) { + segment.startTangent = [cp1[0] - cp2[0], cp1[1] - cp2[1]]; + } + if (segment.endTangent[0] === 0 && segment.endTangent[1] === 0) { + segment.endTangent = [cp2[0] - cp1[0], cp2[1] - cp1[1]]; + } + } else if (command === 'S') { + var preSegment = segments[i - 1]; + var cp1 = toSymmetry(preSegment.currentPoint, prePoint); + var cp2 = [params[1], params[2]]; + if (preSegment.command === 'C') { + segment.command = 'C'; // 将 S 命令变换为 C 命令 + segment.startTangent = [prePoint[0] - cp1[0], prePoint[1] - cp1[1]]; + segment.endTangent = [currentPoint[0] - cp2[0], currentPoint[1] - cp2[1]]; + } else { + // @ts-ignore + segment.command = 'SQ'; // 将 S 命令变换为 SQ 命令 + segment.startTangent = [prePoint[0] - cp2[0], prePoint[1] - cp2[1]]; + segment.endTangent = [currentPoint[0] - cp2[0], currentPoint[1] - cp2[1]]; + } + } else if (command === 'A') { + var _a = getTangentAtRatio(segment, 0), + dx1 = _a.x, + dy1 = _a.y; + var _b = getTangentAtRatio(segment, 1, false), + dx2 = _b.x, + dy2 = _b.y; + segment.startTangent = [dx1, dy1]; + segment.endTangent = [dx2, dy2]; + } + segments.push(segment); + } + return segments; + } + /** + * Use length instead of ratio + */ + function getTangentAtRatio(segment, ratio, sign) { + if (sign === void 0) { + sign = true; + } + var _a = segment.arcParams, + _b = _a.rx, + rx = _b === void 0 ? 0 : _b, + _c = _a.ry, + ry = _c === void 0 ? 0 : _c, + xRotation = _a.xRotation, + arcFlag = _a.arcFlag, + sweepFlag = _a.sweepFlag; + var p1 = pointOnEllipticalArc( + { x: segment.prePoint[0], y: segment.prePoint[1] }, + rx, + ry, + xRotation, + !!arcFlag, + !!sweepFlag, + { x: segment.currentPoint[0], y: segment.currentPoint[1] }, + ratio + ); + var p2 = pointOnEllipticalArc( + { x: segment.prePoint[0], y: segment.prePoint[1] }, + rx, + ry, + xRotation, + !!arcFlag, + !!sweepFlag, + { x: segment.currentPoint[0], y: segment.currentPoint[1] }, + sign ? ratio + 0.005 : ratio - 0.005 + ); + var xDist = p2.x - p1.x; + var yDist = p2.y - p1.y; + var dist = Math.sqrt(xDist * xDist + yDist * yDist); + return { x: -xDist / dist, y: -yDist / dist }; + } + // 向量长度 + function vMag(v) { + return Math.sqrt(v[0] * v[0] + v[1] * v[1]); + } + // u.v/|u||v|,计算夹角的余弦值 + function vRatio(u, v) { + // 当存在一个向量的长度为 0 时,夹角也为 0,即夹角的余弦值为 1 + return vMag(u) * vMag(v) ? (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v)) : 1; + } + // 向量角度 + function vAngle(u, v) { + return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) * Math.acos(vRatio(u, v)); + } + function getArcParams(startPoint, params) { + var rx = params[1]; + var ry = params[2]; + var xRotation = mod(deg2rad(params[3]), Math.PI * 2); + var arcFlag = params[4]; + var sweepFlag = params[5]; + // 弧形起点坐标 + var x1 = startPoint[0]; + var y1 = startPoint[1]; + // 弧形终点坐标 + var x2 = params[6]; + var y2 = params[7]; + var xp = (Math.cos(xRotation) * (x1 - x2)) / 2.0 + (Math.sin(xRotation) * (y1 - y2)) / 2.0; + var yp = (-1 * Math.sin(xRotation) * (x1 - x2)) / 2.0 + (Math.cos(xRotation) * (y1 - y2)) / 2.0; + var lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry); + if (lambda > 1) { + rx *= Math.sqrt(lambda); + ry *= Math.sqrt(lambda); + } + var diff = rx * rx * (yp * yp) + ry * ry * (xp * xp); + var f = diff ? Math.sqrt((rx * rx * (ry * ry) - diff) / diff) : 1; + if (arcFlag === sweepFlag) { + f *= -1; + } + if (isNaN(f)) { + f = 0; + } + // 旋转前的起点坐标,且当长半轴和短半轴的长度为 0 时,坐标按 (0, 0) 处理 + var cxp = ry ? (f * rx * yp) / ry : 0; + var cyp = rx ? (f * -ry * xp) / rx : 0; + // 椭圆圆心坐标 + var cx = (x1 + x2) / 2.0 + Math.cos(xRotation) * cxp - Math.sin(xRotation) * cyp; + var cy = (y1 + y2) / 2.0 + Math.sin(xRotation) * cxp + Math.cos(xRotation) * cyp; + // 起始点的单位向量 + var u = [(xp - cxp) / rx, (yp - cyp) / ry]; + // 终止点的单位向量 + var v = [(-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry]; + // 计算起始点和圆心的连线,与 x 轴正方向的夹角 + var theta = vAngle([1, 0], u); + // 计算圆弧起始点和终止点与椭圆圆心连线的夹角 + var dTheta = vAngle(u, v); + if (vRatio(u, v) <= -1) { + dTheta = Math.PI; + } + if (vRatio(u, v) >= 1) { + dTheta = 0; + } + if (sweepFlag === 0 && dTheta > 0) { + dTheta = dTheta - 2 * Math.PI; + } + if (sweepFlag === 1 && dTheta < 0) { + dTheta = dTheta + 2 * Math.PI; + } + return { + cx: cx, + cy: cy, + // 弧形的起点和终点相同时,长轴和短轴的长度按 0 处理 + rx: isSamePoint(startPoint, [x2, y2]) ? 0 : rx, + ry: isSamePoint(startPoint, [x2, y2]) ? 0 : ry, + startAngle: theta, + endAngle: theta + dTheta, + xRotation: xRotation, + arcFlag: arcFlag, + sweepFlag: sweepFlag, + }; + } + function commandsToPathString(commands, object, transform) { + return commands.reduce(function (prev, cur) { + var path = ''; + if (cur[0] === 'M' || cur[0] === 'L') { + var p = fromValues$2(cur[1], cur[2], 0); + if (transform) { + transformMat4(p, p, transform); + } + path = ''.concat(cur[0]).concat(p[0], ',').concat(p[1]); + } else if (cur[0] === 'Z') { + path = cur[0]; + } else if (cur[0] === 'C') { + var p1 = fromValues$2(cur[1], cur[2], 0); + var p2 = fromValues$2(cur[3], cur[4], 0); + var p3 = fromValues$2(cur[5], cur[6], 0); + if (transform) { + transformMat4(p1, p1, transform); + transformMat4(p2, p2, transform); + transformMat4(p3, p3, transform); + } + path = '' + .concat(cur[0]) + .concat(p1[0], ',') + .concat(p1[1], ',') + .concat(p2[0], ',') + .concat(p2[1], ',') + .concat(p3[0], ',') + .concat(p3[1]); + } else if (cur[0] === 'A') { + var c = fromValues$2(cur[6], cur[7], 0); + if (transform) { + transformMat4(c, c, transform); + } + path = '' + .concat(cur[0]) + .concat(cur[1], ',') + .concat(cur[2], ',') + .concat(cur[3], ',') + .concat(cur[4], ',') + .concat(cur[5], ',') + .concat(c[0], ',') + .concat(c[1]); + } else if (cur[0] === 'Q') { + var p1 = fromValues$2(cur[1], cur[2], 0); + var p2 = fromValues$2(cur[3], cur[4], 0); + if (transform) { + transformMat4(p1, p1, transform); + transformMat4(p2, p2, transform); + } + path = '' + .concat(cur[0]) + .concat(cur[1], ',') + .concat(cur[2], ',') + .concat(cur[3], ',') + .concat(cur[4], '}'); + } + return (prev += path); + }, ''); + } + function lineToCommands(x1, y1, x2, y2) { + return [ + ['M', x1, y1], + ['L', x2, y2], + ]; + } + function ellipseToCommands(rx, ry, cx, cy) { + var factor = ((-1 + Math.sqrt(2)) / 3) * 4; + var dx = rx * factor; + var dy = ry * factor; + var left = cx - rx; + var right = cx + rx; + var top = cy - ry; + var bottom = cy + ry; + return [ + ['M', left, cy], + ['C', left, cy - dy, cx - dx, top, cx, top], + ['C', cx + dx, top, right, cy - dy, right, cy], + ['C', right, cy + dy, cx + dx, bottom, cx, bottom], + ['C', cx - dx, bottom, left, cy + dy, left, cy], + ['Z'], + ]; + } + function polygonToCommands(points, closed) { + var result = points.map(function (point, i) { + return [i === 0 ? 'M' : 'L', point[0], point[1]]; + }); + if (closed) { + result.push(['Z']); + } + return result; + } + function rectToCommands(width, height, x, y, radius) { + // @see https://gist.github.com/danielpquinn/dd966af424030d47e476 + if (radius) { + var _a = __read(radius, 4), + tlr = _a[0], + trr = _a[1], + brr = _a[2], + blr = _a[3]; + var signX = width > 0 ? 1 : -1; + var signY = height > 0 ? 1 : -1; + // sweep-flag @see https://developer.mozilla.org/zh-CN/docs/Web/SVG/Tutorial/Paths#arcs + var sweepFlag = signX + signY !== 0 ? 1 : 0; + return [ + ['M', signX * tlr + x, y], + ['L', width - signX * trr + x, y], + trr ? ['A', trr, trr, 0, 0, sweepFlag, width + x, signY * trr + y] : null, + ['L', width + x, height - signY * brr + y], + brr ? ['A', brr, brr, 0, 0, sweepFlag, width + x - signX * brr, height + y] : null, + ['L', x + signX * blr, height + y], + blr ? ['A', blr, blr, 0, 0, sweepFlag, x, height + y - signY * blr] : null, + ['L', x, signY * tlr + y], + tlr ? ['A', tlr, tlr, 0, 0, sweepFlag, signX * tlr + x, y] : null, + ['Z'], + ].filter(function (command) { + return command; + }); + } + return [ + ['M', x, y], + ['L', x + width, y], + ['L', x + width, y + height], + ['L', x, y + height], + ['Z'], + ]; + } + /** + * convert object to path, should account for: + * * transform & origin + * * lineWidth + */ + function convertToPath(object, transform) { + if (transform === void 0) { + transform = object.getLocalTransform(); + } + var commands = []; + switch (object.nodeName) { + case Shape.LINE: + var _a = object.parsedStyle, + _b = _a.x1, + x1 = _b === void 0 ? 0 : _b, + _c = _a.y1, + y1 = _c === void 0 ? 0 : _c, + _d = _a.x2, + x2 = _d === void 0 ? 0 : _d, + _e = _a.y2, + y2 = _e === void 0 ? 0 : _e; + commands = lineToCommands(x1, y1, x2, y2); + break; + case Shape.CIRCLE: { + var _f = object.parsedStyle, + _g = _f.r, + r = _g === void 0 ? 0 : _g, + _h = _f.cx, + cx = _h === void 0 ? 0 : _h, + _j = _f.cy, + cy = _j === void 0 ? 0 : _j; + commands = ellipseToCommands(r, r, cx, cy); + break; + } + case Shape.ELLIPSE: { + var _k = object.parsedStyle, + _l = _k.rx, + rx = _l === void 0 ? 0 : _l, + _m = _k.ry, + ry = _m === void 0 ? 0 : _m, + _o = _k.cx, + cx = _o === void 0 ? 0 : _o, + _p = _k.cy, + cy = _p === void 0 ? 0 : _p; + commands = ellipseToCommands(rx, ry, cx, cy); + break; + } + case Shape.POLYLINE: + case Shape.POLYGON: + var points = object.parsedStyle.points; + commands = polygonToCommands(points.points, object.nodeName === Shape.POLYGON); + break; + case Shape.RECT: + var _q = object.parsedStyle, + _r = _q.width, + width_1 = _r === void 0 ? 0 : _r, + _s = _q.height, + height_1 = _s === void 0 ? 0 : _s, + _t = _q.x, + x = _t === void 0 ? 0 : _t, + _u = _q.y, + y = _u === void 0 ? 0 : _u, + radius = _q.radius; + var hasRadius = + radius && + radius.some(function (r) { + return r !== 0; + }); + commands = rectToCommands( + width_1, + height_1, + x, + y, + hasRadius && + radius.map(function (r) { + return clamp(r, 0, Math.min(Math.abs(width_1) / 2, Math.abs(height_1) / 2)); + }) + ); + break; + case Shape.PATH: + var absolutePath = object.parsedStyle.d.absolutePath; + commands = __spreadArray([], __read(absolutePath), false); + break; + } + if (commands.length) { + return commandsToPathString(commands, object, transform); + } + } + + var internalParsePath = function (path) { + // empty path + if (path === '' || (Array.isArray(path) && path.length === 0)) { + return { + absolutePath: [], + hasArc: false, + segments: [], + polygons: [], + polylines: [], + curve: null, + totalLength: 0, + rect: { + x: 0, + y: 0, + width: 0, + height: 0, + }, + }; + } + var absolutePath; + try { + absolutePath = normalizePath(path); + } catch (e) { + absolutePath = normalizePath(''); + console.error('[g]: Invalid SVG Path definition: '.concat(path)); + } + removeRedundantMCommand(absolutePath); + var hasArc = hasArcOrBezier(absolutePath); + var _a = extractPolygons(absolutePath), + polygons = _a.polygons, + polylines = _a.polylines; + // for later use + var segments = path2Segments(absolutePath); + // Only calculate bbox here since we don't need length now. + var _b = getPathBBox(segments, 0), + x = _b.x, + y = _b.y, + width = _b.width, + height = _b.height; + return { + absolutePath: absolutePath, + hasArc: hasArc, + segments: segments, + polygons: polygons, + polylines: polylines, + // curve, + // Delay the calculation of length. + totalLength: 0, + rect: { + x: Number.isFinite(x) ? x : 0, + y: Number.isFinite(y) ? y : 0, + width: Number.isFinite(width) ? width : 0, + height: Number.isFinite(height) ? height : 0, + }, + }; + }; + var memoizedParsePath = memoize(internalParsePath); + function parsePath(path) { + return isString(path) ? memoizedParsePath(path) : internalParsePath(path); + } + function mergePaths(left, right, object) { + var curve1 = left.curve; + var curve2 = right.curve; + if (!curve1 || curve1.length === 0) { + // convert to curves to do morphing & picking later + // @see http://thednp.github.io/kute.js/svgCubicMorph.html + curve1 = path2Curve(left.absolutePath, false); + left.curve = curve1; + } + if (!curve2 || curve2.length === 0) { + curve2 = path2Curve(right.absolutePath, false); + right.curve = curve2; + } + var curves = [curve1, curve2]; + if (curve1.length !== curve2.length) { + curves = equalizeSegments(curve1, curve2); + } + var curve0 = + getDrawDirection(curves[0]) !== getDrawDirection(curves[1]) + ? reverseCurve(curves[0]) + : clonePath(curves[0]); + return [ + curve0, + getRotatedCurve(curves[1], curve0), + function (pathArray) { + // need converting to path string? + return pathArray; + }, + ]; + } + + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/SVG/Attribute/points + * + * @example + * points="100,10 250,150 200,110" + */ + function parsePoints(pointsOrStr, object) { + var points; + if (isString(pointsOrStr)) { + points = pointsOrStr.split(' ').map(function (pointStr) { + var _a = __read(pointStr.split(','), 2), + x = _a[0], + y = _a[1]; + return [Number(x), Number(y)]; + }); + } else { + points = pointsOrStr; + } + return { + points: points, + totalLength: 0, + segments: [], + }; + } + function mergePoints(left, right) { + return [ + left.points, + right.points, + function (points) { + return points; + }, + ]; + } + + var _ = null; + function cast(pattern) { + return function (contents) { + var i = 0; + return pattern.map(function (x) { + return x === _ ? contents[i++] : x; + }); + }; + } + function id(x) { + return x; + } + // type: [argTypes, convertTo3D, convertTo2D] + // In the argument types string, lowercase characters represent optional arguments + var transformFunctions = { + // @ts-ignore + matrix: ['NNNNNN', [_, _, 0, 0, _, _, 0, 0, 0, 0, 1, 0, _, _, 0, 1], id], + matrix3d: ['NNNNNNNNNNNNNNNN', id], + rotate: ['A'], + rotatex: ['A'], + rotatey: ['A'], + rotatez: ['A'], + rotate3d: ['NNNA'], + perspective: ['L'], + scale: ['Nn', cast([_, _, new CSSUnitValue(1)]), id], + scalex: [ + 'N', + cast([_, new CSSUnitValue(1), new CSSUnitValue(1)]), + cast([_, new CSSUnitValue(1)]), + ], + scaley: [ + 'N', + cast([new CSSUnitValue(1), _, new CSSUnitValue(1)]), + cast([new CSSUnitValue(1), _]), + ], + scalez: ['N', cast([new CSSUnitValue(1), new CSSUnitValue(1), _])], + scale3d: ['NNN', id], + skew: ['Aa', null, id], + skewx: ['A', null, cast([_, Odeg])], + skewy: ['A', null, cast([Odeg, _])], + translate: ['Tt', cast([_, _, Opx]), id], + translatex: ['T', cast([_, Opx, Opx]), cast([_, Opx])], + translatey: ['T', cast([Opx, _, Opx]), cast([Opx, _])], + translatez: ['L', cast([Opx, Opx, _])], + translate3d: ['TTL', id], + }; + /** + * none + * scale(1) scale(1, 2) + * scaleX(1) + */ + function parseTransform(string) { + string = (string || 'none').toLowerCase().trim(); + if (string === 'none') { + return []; + } + var transformRegExp = /\s*(\w+)\(([^)]*)\)/g; + var result = []; + var match; + var prevLastIndex = 0; + while ((match = transformRegExp.exec(string))) { + if (match.index !== prevLastIndex) { + return []; + } + prevLastIndex = match.index + match[0].length; + var functionName = match[1]; // scale + var functionData = transformFunctions[functionName]; // scale(1, 2) + if (!functionData) { + // invalid, eg. scale() + return []; + } + var args = match[2].split(','); // 1,2 + var argTypes = functionData[0]; // Nn + if (argTypes.length < args.length) { + // scale(N, n) + return []; + } + var parsedArgs = []; + for (var i = 0; i < argTypes.length; i++) { + var arg = args[i]; + var type = argTypes[i]; + var parsedArg = void 0; + if (!arg) { + // @ts-ignore + parsedArg = { + a: Odeg, + n: parsedArgs[0], + t: Opx, + }[type]; + } else { + // @ts-ignore + parsedArg = { + A: function (s) { + return s.trim() === '0' ? Odeg : parseAngle(s); + }, + N: parseNumber, + T: parseLengthOrPercentage, + L: parseLength, + }[type.toUpperCase()](arg); + } + if (parsedArg === undefined) { + return []; + } + parsedArgs.push(parsedArg); + } + result.push({ t: functionName, d: parsedArgs }); // { t: scale, d: [1, 2] } + if (transformRegExp.lastIndex === string.length) { + return result; + } + } + return []; + } + function parseTransformUnmemoize(string) { + string = (string || 'none').toLowerCase().trim(); + if (string === 'none') { + return []; + } + var transformRegExp = /\s*(\w+)\(([^)]*)\)/g; + var result = []; + var match; + var prevLastIndex = 0; + while ((match = transformRegExp.exec(string))) { + if (match.index !== prevLastIndex) { + return []; + } + prevLastIndex = match.index + match[0].length; + var functionName = match[1]; // scale + var functionData = transformFunctions[functionName]; // scale(1, 2) + if (!functionData) { + // invalid, eg. scale() + return []; + } + var args = match[2].split(','); // 1,2 + var argTypes = functionData[0]; // Nn + if (argTypes.length < args.length) { + // scale(N, n) + return []; + } + var parsedArgs = []; + for (var i = 0; i < argTypes.length; i++) { + var arg = args[i]; + var type = argTypes[i]; + var parsedArg = void 0; + if (!arg) { + // @ts-ignore + parsedArg = { + a: Odeg, + n: parsedArgs[0], + t: Opx, + }[type]; + } else { + // @ts-ignore + parsedArg = { + A: function (s) { + return s.trim() === '0' ? Odeg : parseAngleUnmemoize(s); + }, + N: parseNumberUnmemoize, + T: parseLengthOrPercentageUnmemoize, + L: parseLengthUnmemoize, + }[type.toUpperCase()](arg); + } + if (parsedArg === undefined) { + return []; + } + parsedArgs.push(parsedArg); + } + result.push({ t: functionName, d: parsedArgs }); // { t: scale, d: [1, 2] } + if (transformRegExp.lastIndex === string.length) { + return result; + } + } + return []; + } + function convertItemToMatrix(item) { + var x; + var y; + var z; + var angle; + switch (item.t) { + case 'rotatex': + angle = deg2rad(convertAngleUnit(item.d[0])); + return [ + 1, + 0, + 0, + 0, + 0, + Math.cos(angle), + Math.sin(angle), + 0, + 0, + -Math.sin(angle), + Math.cos(angle), + 0, + 0, + 0, + 0, + 1, + ]; + case 'rotatey': + angle = deg2rad(convertAngleUnit(item.d[0])); + return [ + Math.cos(angle), + 0, + -Math.sin(angle), + 0, + 0, + 1, + 0, + 0, + Math.sin(angle), + 0, + Math.cos(angle), + 0, + 0, + 0, + 0, + 1, + ]; + case 'rotate': + case 'rotatez': + angle = deg2rad(convertAngleUnit(item.d[0])); + return [ + Math.cos(angle), + Math.sin(angle), + 0, + 0, + -Math.sin(angle), + Math.cos(angle), + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + ]; + case 'rotate3d': + x = item.d[0].value; + y = item.d[1].value; + z = item.d[2].value; + angle = deg2rad(convertAngleUnit(item.d[3])); + var sqrLength = x * x + y * y + z * z; + if (sqrLength === 0) { + x = 1; + y = 0; + z = 0; + } else if (sqrLength !== 1) { + var length_1 = Math.sqrt(sqrLength); + x /= length_1; + y /= length_1; + z /= length_1; + } + var s = Math.sin(angle / 2); + var sc = s * Math.cos(angle / 2); + var sq = s * s; + return [ + 1 - 2 * (y * y + z * z) * sq, + 2 * (x * y * sq + z * sc), + 2 * (x * z * sq - y * sc), + 0, + 2 * (x * y * sq - z * sc), + 1 - 2 * (x * x + z * z) * sq, + 2 * (y * z * sq + x * sc), + 0, + 2 * (x * z * sq + y * sc), + 2 * (y * z * sq - x * sc), + 1 - 2 * (x * x + y * y) * sq, + 0, + 0, + 0, + 0, + 1, + ]; + case 'scale': + return [item.d[0].value, 0, 0, 0, 0, item.d[1].value, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; + case 'scalex': + return [item.d[0].value, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; + case 'scaley': + return [1, 0, 0, 0, 0, item.d[0].value, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; + case 'scalez': + return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, item.d[0].value, 0, 0, 0, 0, 1]; + case 'scale3d': + return [ + item.d[0].value, + 0, + 0, + 0, + 0, + item.d[1].value, + 0, + 0, + 0, + 0, + item.d[2].value, + 0, + 0, + 0, + 0, + 1, + ]; + case 'skew': + var xAngle = deg2rad(convertAngleUnit(item.d[0])); + var yAngle = deg2rad(convertAngleUnit(item.d[1])); + return [1, Math.tan(yAngle), 0, 0, Math.tan(xAngle), 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; + case 'skewx': + angle = deg2rad(convertAngleUnit(item.d[0])); + return [1, 0, 0, 0, Math.tan(angle), 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; + case 'skewy': + angle = deg2rad(convertAngleUnit(item.d[0])); + return [1, Math.tan(angle), 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; + case 'translate': + // TODO: pass target + x = convertPercentUnit(item.d[0], 0, null) || 0; + y = convertPercentUnit(item.d[1], 0, null) || 0; + return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, 0, 1]; + case 'translatex': + x = convertPercentUnit(item.d[0], 0, null) || 0; + return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, 0, 0, 1]; + case 'translatey': + y = convertPercentUnit(item.d[0], 0, null) || 0; + return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, y, 0, 1]; + case 'translatez': + z = convertPercentUnit(item.d[0], 0, null) || 0; + return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, z, 1]; + case 'translate3d': + x = convertPercentUnit(item.d[0], 0, null) || 0; + y = convertPercentUnit(item.d[1], 0, null) || 0; + z = convertPercentUnit(item.d[2], 0, null) || 0; + return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1]; + case 'perspective': + var t = convertPercentUnit(item.d[0], 0, null) || 0; + var p = t ? -1 / t : 0; + return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, p, 0, 0, 0, 1]; + case 'matrix': + return [ + item.d[0].value, + item.d[1].value, + 0, + 0, + item.d[2].value, + item.d[3].value, + 0, + 0, + 0, + 0, + 1, + 0, + item.d[4].value, + item.d[5].value, + 0, + 1, + ]; + case 'matrix3d': + return item.d.map(function (d) { + return d.value; + }); + } + } + function multiplyMatrices(a, b) { + return [ + a[0] * b[0] + a[4] * b[1] + a[8] * b[2] + a[12] * b[3], + a[1] * b[0] + a[5] * b[1] + a[9] * b[2] + a[13] * b[3], + a[2] * b[0] + a[6] * b[1] + a[10] * b[2] + a[14] * b[3], + a[3] * b[0] + a[7] * b[1] + a[11] * b[2] + a[15] * b[3], + a[0] * b[4] + a[4] * b[5] + a[8] * b[6] + a[12] * b[7], + a[1] * b[4] + a[5] * b[5] + a[9] * b[6] + a[13] * b[7], + a[2] * b[4] + a[6] * b[5] + a[10] * b[6] + a[14] * b[7], + a[3] * b[4] + a[7] * b[5] + a[11] * b[6] + a[15] * b[7], + a[0] * b[8] + a[4] * b[9] + a[8] * b[10] + a[12] * b[11], + a[1] * b[8] + a[5] * b[9] + a[9] * b[10] + a[13] * b[11], + a[2] * b[8] + a[6] * b[9] + a[10] * b[10] + a[14] * b[11], + a[3] * b[8] + a[7] * b[9] + a[11] * b[10] + a[15] * b[11], + a[0] * b[12] + a[4] * b[13] + a[8] * b[14] + a[12] * b[15], + a[1] * b[12] + a[5] * b[13] + a[9] * b[14] + a[13] * b[15], + a[2] * b[12] + a[6] * b[13] + a[10] * b[14] + a[14] * b[15], + a[3] * b[12] + a[7] * b[13] + a[11] * b[14] + a[15] * b[15], + ]; + } + function convertToMatrix(transformList) { + if (transformList.length === 0) { + return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; + } + return transformList.map(convertItemToMatrix).reduce(multiplyMatrices); + } + function makeMatrixDecomposition(transformList) { + var translate = [0, 0, 0]; + var scale = [1, 1, 1]; + var skew = [0, 0, 0]; + var perspective = [0, 0, 0, 1]; + var quaternion = [0, 0, 0, 1]; + decomposeMat4( + // @ts-ignore + convertToMatrix(transformList), + translate, + scale, + skew, + perspective, + quaternion + ); + return [[translate, scale, skew, quaternion, perspective]]; + } + var composeMatrix = (function () { + function multiply(a, b) { + var result = [ + [0, 0, 0, 0], + [0, 0, 0, 0], + [0, 0, 0, 0], + [0, 0, 0, 0], + ]; + for (var i = 0; i < 4; i++) { + for (var j = 0; j < 4; j++) { + for (var k = 0; k < 4; k++) { + result[i][j] += b[i][k] * a[k][j]; + } + } + } + return result; + } + function is2D(m) { + return ( + m[0][2] == 0 && + m[0][3] == 0 && + m[1][2] == 0 && + m[1][3] == 0 && + m[2][0] == 0 && + m[2][1] == 0 && + m[2][2] == 1 && + m[2][3] == 0 && + m[3][2] == 0 && + m[3][3] == 1 + ); + } + function composeMatrix(translate, scale, skew, quat, perspective) { + var matrix = [ + [1, 0, 0, 0], + [0, 1, 0, 0], + [0, 0, 1, 0], + [0, 0, 0, 1], + ]; + for (var i = 0; i < 4; i++) { + matrix[i][3] = perspective[i]; + } + for (var i = 0; i < 3; i++) { + for (var j = 0; j < 3; j++) { + matrix[3][i] += translate[j] * matrix[j][i]; + } + } + var x = quat[0], + y = quat[1], + z = quat[2], + w = quat[3]; + var rotMatrix = [ + [1, 0, 0, 0], + [0, 1, 0, 0], + [0, 0, 1, 0], + [0, 0, 0, 1], + ]; + rotMatrix[0][0] = 1 - 2 * (y * y + z * z); + rotMatrix[0][1] = 2 * (x * y - z * w); + rotMatrix[0][2] = 2 * (x * z + y * w); + rotMatrix[1][0] = 2 * (x * y + z * w); + rotMatrix[1][1] = 1 - 2 * (x * x + z * z); + rotMatrix[1][2] = 2 * (y * z - x * w); + rotMatrix[2][0] = 2 * (x * z - y * w); + rotMatrix[2][1] = 2 * (y * z + x * w); + rotMatrix[2][2] = 1 - 2 * (x * x + y * y); + matrix = multiply(matrix, rotMatrix); + var temp = [ + [1, 0, 0, 0], + [0, 1, 0, 0], + [0, 0, 1, 0], + [0, 0, 0, 1], + ]; + if (skew[2]) { + temp[2][1] = skew[2]; + matrix = multiply(matrix, temp); + } + if (skew[1]) { + temp[2][1] = 0; + temp[2][0] = skew[0]; + matrix = multiply(matrix, temp); + } + if (skew[0]) { + temp[2][0] = 0; + temp[1][0] = skew[0]; + matrix = multiply(matrix, temp); + } + for (var i = 0; i < 3; i++) { + for (var j = 0; j < 3; j++) { + matrix[i][j] *= scale[i]; + } + } + if (is2D(matrix)) { + return [matrix[0][0], matrix[0][1], matrix[1][0], matrix[1][1], matrix[3][0], matrix[3][1]]; + } + return matrix[0].concat(matrix[1], matrix[2], matrix[3]); + } + return composeMatrix; + })(); + function numberToLongString(x) { + return x.toFixed(6).replace('.000000', ''); + } + function mergeMatrices(left, right) { + var leftArgs; + var rightArgs; + // @ts-ignore + if (left.decompositionPair !== right) { + // @ts-ignore + left.decompositionPair = right; + // @ts-ignore + leftArgs = makeMatrixDecomposition(left); + } + // @ts-ignore + if (right.decompositionPair !== left) { + // @ts-ignore + right.decompositionPair = left; + // @ts-ignore + rightArgs = makeMatrixDecomposition(right); + } + if (leftArgs[0] === null || rightArgs[0] === null) + return [ + // @ts-ignore + [false], + // @ts-ignore + [true], + // @ts-ignore + function (x) { + return x ? right[0].d : left[0].d; + }, + ]; + leftArgs[0].push(0); + rightArgs[0].push(1); + return [ + leftArgs, + rightArgs, + // @ts-ignore + function (list) { + // @ts-ignore + var q = quat(leftArgs[0][3], rightArgs[0][3], list[5]); + var mat = composeMatrix(list[0], list[1], list[2], q, list[4]); + var stringifiedArgs = mat.map(numberToLongString).join(','); + return stringifiedArgs; + }, + ]; + } + function dot$2(v1, v2) { + var result = 0; + for (var i = 0; i < v1.length; i++) { + result += v1[i] * v2[i]; + } + return result; + } + function quat(fromQ, toQ, f) { + var product = dot$2(fromQ, toQ); + product = clamp(product, -1.0, 1.0); + var quat = []; + if (product === 1.0) { + quat = fromQ; + } else { + var theta = Math.acos(product); + var w = (Math.sin(f * theta) * 1) / Math.sqrt(1 - product * product); + for (var i = 0; i < 4; i++) { + quat.push(fromQ[i] * (Math.cos(f * theta) - product * w) + toQ[i] * w); + } + } + return quat; + } + // scalex/y/z -> scale + function typeTo2D(type) { + return type.replace(/[xy]/, ''); + } + // scalex/y/z -> scale3d + function typeTo3D(type) { + return type.replace(/(x|y|z|3d)?$/, '3d'); + } + var isMatrixOrPerspective = function (lt, rt) { + return ( + (lt === 'perspective' && rt === 'perspective') || + ((lt === 'matrix' || lt === 'matrix3d') && (rt === 'matrix' || rt === 'matrix3d')) + ); + }; + function mergeTransforms(left, right, target) { + var flipResults = false; + // padding empty transform, eg. merge 'scale(10)' with 'none' -> scale(1) + if (!left.length || !right.length) { + if (!left.length) { + flipResults = true; + left = right; + right = []; + } + var _loop_1 = function (i) { + var _a = left[i], + type = _a.t, + args = _a.d; + // none -> scale(1)/translateX(0) + var defaultValue = type.substring(0, 5) === 'scale' ? 1 : 0; + right.push({ + t: type, + d: args.map(function (arg) { + if (typeof arg === 'number') { + return getOrCreateUnitValue(defaultValue); + } + return getOrCreateUnitValue(defaultValue, arg.unit); + // { + // unit: arg.unit, + // value: defaultValue, + // }; + }), + }); + }; + for (var i = 0; i < left.length; i++) { + _loop_1(i); + } + } + var leftResult = []; + var rightResult = []; + var types = []; + // merge matrix() with matrix3d() + if (left.length !== right.length) { + var merged = mergeMatrices(left, right); + // @ts-ignore + leftResult = [merged[0]]; + // @ts-ignore + rightResult = [merged[1]]; + types = [['matrix', [merged[2]]]]; + } else { + for (var i = 0; i < left.length; i++) { + var leftType = left[i].t; + var rightType = right[i].t; + var leftArgs = left[i].d; + var rightArgs = right[i].d; + var leftFunctionData = transformFunctions[leftType]; + var rightFunctionData = transformFunctions[rightType]; + var type = void 0; + if (isMatrixOrPerspective(leftType, rightType)) { + var merged = mergeMatrices([left[i]], [right[i]]); + // @ts-ignore + leftResult.push(merged[0]); + // @ts-ignore + rightResult.push(merged[1]); + types.push(['matrix', [merged[2]]]); + continue; + } else if (leftType === rightType) { + type = leftType; + } else if ( + leftFunctionData[2] && + rightFunctionData[2] && + typeTo2D(leftType) === typeTo2D(rightType) + ) { + type = typeTo2D(leftType); + // @ts-ignore + leftArgs = leftFunctionData[2](leftArgs); + // @ts-ignore + rightArgs = rightFunctionData[2](rightArgs); + } else if ( + leftFunctionData[1] && + rightFunctionData[1] && + typeTo3D(leftType) === typeTo3D(rightType) + ) { + type = typeTo3D(leftType); + // @ts-ignore + leftArgs = leftFunctionData[1](leftArgs); + // @ts-ignore + rightArgs = rightFunctionData[1](rightArgs); + } else { + var merged = mergeMatrices(left, right); + // @ts-ignore + leftResult = [merged[0]]; + // @ts-ignore + rightResult = [merged[1]]; + types = [['matrix', [merged[2]]]]; + break; + } + var leftArgsCopy = []; + var rightArgsCopy = []; + var stringConversions = []; + for (var j = 0; j < leftArgs.length; j++) { + // const merge = leftArgs[j].unit === UnitType.kNumber ? mergeDimensions : mergeDimensions; + var merged = mergeDimensions(leftArgs[j], rightArgs[j], target, false, j); + leftArgsCopy[j] = merged[0]; + rightArgsCopy[j] = merged[1]; + stringConversions.push(merged[2]); + } + leftResult.push(leftArgsCopy); + rightResult.push(rightArgsCopy); + types.push([type, stringConversions]); + } + } + if (flipResults) { + var tmp = leftResult; + leftResult = rightResult; + rightResult = tmp; + } + return [ + leftResult, + rightResult, + function (list) { + return list + .map(function (args, i) { + var stringifiedArgs = args + .map(function (arg, j) { + return types[i][1][j](arg); + }) + .join(','); + if (types[i][0] === 'matrix' && stringifiedArgs.split(',').length === 16) { + types[i][0] = 'matrix3d'; + } + if (types[i][0] === 'matrix3d' && stringifiedArgs.split(',').length === 6) { + types[i][0] = 'matrix'; + } + return types[i][0] + '(' + stringifiedArgs + ')'; + }) + .join(' '); + }, + ]; + } + + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/CSS/transform-origin + * eg. 'center' 'top left' '50px 50px' + */ + var parseTransformOrigin = memoize(function (value) { + if (isString(value)) { + if (value === 'text-anchor') { + return [getOrCreateUnitValue(0, 'px'), getOrCreateUnitValue(0, 'px')]; + } + var values = value.split(' '); + if (values.length === 1) { + if (values[0] === 'top' || values[0] === 'bottom') { + // 'top' -> 'center top' + values[1] = values[0]; + values[0] = 'center'; + } else { + // '50px' -> '50px center' + values[1] = 'center'; + } + } + if (values.length !== 2) { + return null; + } + // eg. center bottom + return [ + parseLengthOrPercentage(convertKeyword2Percent(values[0])), + parseLengthOrPercentage(convertKeyword2Percent(values[1])), + ]; + } else { + return [getOrCreateUnitValue(value[0] || 0, 'px'), getOrCreateUnitValue(value[1] || 0, 'px')]; + } + }); + var parseTransformOriginUnmemoize = function (value) { + if (isString(value)) { + if (value === 'text-anchor') { + return [getOrCreateUnitValue(0, 'px'), getOrCreateUnitValue(0, 'px')]; + } + var values = value.split(' '); + if (values.length === 1) { + if (values[0] === 'top' || values[0] === 'bottom') { + // 'top' -> 'center top' + values[1] = values[0]; + values[0] = 'center'; + } else { + // '50px' -> '50px center' + values[1] = 'center'; + } + } + if (values.length !== 2) { + return null; + } + // eg. center bottom + return [ + parseLengthOrPercentageUnmemoize(convertKeyword2Percent(values[0])), + parseLengthOrPercentageUnmemoize(convertKeyword2Percent(values[1])), + ]; + } else { + return [getOrCreateUnitValue(value[0] || 0, 'px'), getOrCreateUnitValue(value[1] || 0, 'px')]; + } + }; + function convertKeyword2Percent(keyword) { + if (keyword === 'center') { + return '50%'; + } else if (keyword === 'left' || keyword === 'top') { + return '0%'; + } else if (keyword === 'right' || keyword === 'bottom') { + return '100%'; + } + return keyword; + } + + /** + * Blink used them in code generation(css_properties.json5) + */ + var BUILT_IN_PROPERTIES = [ + { + /** + * used in CSS Layout API + * eg. `display: 'flex'` + */ + n: 'display', + k: ['none'], + }, + { + /** + * range [0.0, 1.0] + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/opacity + */ + n: 'opacity', + int: true, + inh: true, + d: '1', + syntax: PropertySyntax.OPACITY_VALUE, + }, + { + /** + * inheritable, range [0.0, 1.0] + * @see https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/fill-opacity + * @see https://svgwg.org/svg2-draft/painting.html#FillOpacity + */ + n: 'fillOpacity', + int: true, + inh: true, + d: '1', + syntax: PropertySyntax.OPACITY_VALUE, + }, + { + /** + * inheritable, range [0.0, 1.0] + * @see https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-opacity + * @see https://svgwg.org/svg2-draft/painting.html#StrokeOpacity + */ + n: 'strokeOpacity', + int: true, + inh: true, + d: '1', + syntax: PropertySyntax.OPACITY_VALUE, + }, + { + /** + * background-color is not inheritable + * @see https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Fills_and_Strokes + */ + n: 'fill', + int: true, + k: ['none'], + d: 'none', + syntax: PropertySyntax.PAINT, + }, + { + n: 'fillRule', + k: ['nonzero', 'evenodd'], + d: 'nonzero', + }, + /** + * default to none + * @see https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke#usage_notes + */ + { + n: 'stroke', + int: true, + k: ['none'], + d: 'none', + syntax: PropertySyntax.PAINT, + /** + * Stroke 'none' won't affect geometry but others will. + */ + l: true, + }, + { + n: 'shadowType', + k: ['inner', 'outer', 'both'], + d: 'outer', + l: true, + }, + { + n: 'shadowColor', + int: true, + syntax: PropertySyntax.COLOR, + }, + { + n: 'shadowOffsetX', + int: true, + l: true, + d: '0', + syntax: PropertySyntax.LENGTH_PERCENTAGE, + }, + { + n: 'shadowOffsetY', + int: true, + l: true, + d: '0', + syntax: PropertySyntax.LENGTH_PERCENTAGE, + }, + { + n: 'shadowBlur', + int: true, + l: true, + d: '0', + syntax: PropertySyntax.SHADOW_BLUR, + }, + { + /** + * @see https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-width + */ + n: 'lineWidth', + int: true, + inh: true, + d: '1', + l: true, + a: ['strokeWidth'], + syntax: PropertySyntax.LENGTH_PERCENTAGE, + }, + { + n: 'increasedLineWidthForHitTesting', + inh: true, + d: '0', + l: true, + syntax: PropertySyntax.LENGTH_PERCENTAGE, + }, + { + n: 'lineJoin', + inh: true, + l: true, + a: ['strokeLinejoin'], + k: ['miter', 'bevel', 'round'], + d: 'miter', + }, + { + n: 'lineCap', + inh: true, + l: true, + a: ['strokeLinecap'], + k: ['butt', 'round', 'square'], + d: 'butt', + }, + { + n: 'lineDash', + int: true, + inh: true, + k: ['none'], + a: ['strokeDasharray'], + syntax: PropertySyntax.LENGTH_PERCENTAGE_12, + }, + { + n: 'lineDashOffset', + int: true, + inh: true, + d: '0', + a: ['strokeDashoffset'], + syntax: PropertySyntax.LENGTH_PERCENTAGE, + }, + { + n: 'offsetPath', + syntax: PropertySyntax.DEFINED_PATH, + }, + { + n: 'offsetDistance', + int: true, + syntax: PropertySyntax.OFFSET_DISTANCE, + }, + { + n: 'dx', + int: true, + l: true, + d: '0', + syntax: PropertySyntax.LENGTH_PERCENTAGE, + }, + { + n: 'dy', + int: true, + l: true, + d: '0', + syntax: PropertySyntax.LENGTH_PERCENTAGE, + }, + { + n: 'zIndex', + ind: true, + int: true, + d: '0', + k: ['auto'], + syntax: PropertySyntax.Z_INDEX, + }, + { + n: 'visibility', + k: ['visible', 'hidden'], + ind: true, + inh: true, + /** + * support interpolation + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/visibility#interpolation + */ + int: true, + d: 'visible', + }, + { + n: 'pointerEvents', + inh: true, + k: [ + 'none', + 'auto', + 'stroke', + 'fill', + 'painted', + 'visible', + 'visiblestroke', + 'visiblefill', + 'visiblepainted', + // 'bounding-box', + 'all', + ], + d: 'auto', + }, + { + n: 'filter', + ind: true, + l: true, + k: ['none'], + d: 'none', + syntax: PropertySyntax.FILTER, + }, + { + n: 'clipPath', + syntax: PropertySyntax.DEFINED_PATH, + }, + { + n: 'textPath', + syntax: PropertySyntax.DEFINED_PATH, + }, + { + n: 'textPathSide', + k: ['left', 'right'], + d: 'left', + }, + { + n: 'textPathStartOffset', + l: true, + d: '0', + syntax: PropertySyntax.LENGTH_PERCENTAGE, + }, + { + n: 'transform', + p: 100, + int: true, + k: ['none'], + d: 'none', + syntax: PropertySyntax.TRANSFORM, + }, + { + n: 'transformOrigin', + p: 100, + d: '0 0', + // // int: true, + // d: (nodeName: string) => { + // if (nodeName === Shape.CIRCLE || nodeName === Shape.ELLIPSE) { + // return 'center'; + // } + // if (nodeName === Shape.TEXT) { + // return 'text-anchor'; + // } + // return 'left top'; + // }, + l: true, + syntax: PropertySyntax.TRANSFORM_ORIGIN, + }, + { + n: 'cx', + int: true, + l: true, + d: '0', + syntax: PropertySyntax.COORDINATE, + }, + { + n: 'cy', + int: true, + l: true, + d: '0', + syntax: PropertySyntax.COORDINATE, + }, + { + n: 'cz', + int: true, + l: true, + d: '0', + syntax: PropertySyntax.COORDINATE, + }, + { + n: 'r', + int: true, + l: true, + d: '0', + syntax: PropertySyntax.LENGTH_PERCENTAGE, + }, + { + n: 'rx', + int: true, + l: true, + d: '0', + syntax: PropertySyntax.LENGTH_PERCENTAGE, + }, + { + n: 'ry', + int: true, + l: true, + d: '0', + syntax: PropertySyntax.LENGTH_PERCENTAGE, + }, + // Rect Image Group + { + // x in local space + n: 'x', + int: true, + l: true, + d: '0', + syntax: PropertySyntax.COORDINATE, + }, + { + // y in local space + n: 'y', + int: true, + l: true, + d: '0', + syntax: PropertySyntax.COORDINATE, + }, + { + // z in local space + n: 'z', + int: true, + l: true, + d: '0', + syntax: PropertySyntax.COORDINATE, + }, + { + n: 'width', + int: true, + l: true, + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/CSS/width + */ + k: ['auto', 'fit-content', 'min-content', 'max-content'], + d: '0', + syntax: PropertySyntax.LENGTH_PERCENTAGE, + }, + { + n: 'height', + int: true, + l: true, + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/CSS/height + */ + k: ['auto', 'fit-content', 'min-content', 'max-content'], + d: '0', + syntax: PropertySyntax.LENGTH_PERCENTAGE, + }, + { + n: 'radius', + int: true, + l: true, + d: '0', + syntax: PropertySyntax.LENGTH_PERCENTAGE_14, + }, + // Line + { + n: 'x1', + int: true, + l: true, + syntax: PropertySyntax.COORDINATE, + }, + { + n: 'y1', + int: true, + l: true, + syntax: PropertySyntax.COORDINATE, + }, + { + n: 'z1', + int: true, + l: true, + syntax: PropertySyntax.COORDINATE, + }, + { + n: 'x2', + int: true, + l: true, + syntax: PropertySyntax.COORDINATE, + }, + { + n: 'y2', + int: true, + l: true, + syntax: PropertySyntax.COORDINATE, + }, + { + n: 'z2', + int: true, + l: true, + syntax: PropertySyntax.COORDINATE, + }, + // Path + { + n: 'd', + int: true, + l: true, + d: '', + syntax: PropertySyntax.PATH, + p: 50, + }, + // Polyline & Polygon + { + n: 'points', + /** + * support interpolation + */ + int: true, + l: true, + syntax: PropertySyntax.LIST_OF_POINTS, + p: 50, + }, + // Text + { + n: 'text', + l: true, + d: '', + syntax: PropertySyntax.TEXT, + p: 50, + }, + { + n: 'textTransform', + l: true, + inh: true, + k: ['capitalize', 'uppercase', 'lowercase', 'none'], + d: 'none', + syntax: PropertySyntax.TEXT_TRANSFORM, + p: 51, // it must get parsed after text + }, + { + n: 'font', + l: true, + }, + { + n: 'fontSize', + int: true, + inh: true, + /** + * @see https://www.w3schools.com/css/css_font_size.asp + */ + d: '16px', + l: true, + syntax: PropertySyntax.LENGTH_PERCENTAGE, + }, + { + n: 'fontFamily', + l: true, + inh: true, + d: 'sans-serif', + }, + { + n: 'fontStyle', + l: true, + inh: true, + k: ['normal', 'italic', 'oblique'], + d: 'normal', + }, + { + n: 'fontWeight', + l: true, + inh: true, + k: ['normal', 'bold', 'bolder', 'lighter'], + d: 'normal', + }, + { + n: 'fontVariant', + l: true, + inh: true, + k: ['normal', 'small-caps'], + d: 'normal', + }, + { + n: 'lineHeight', + l: true, + syntax: PropertySyntax.LENGTH, + int: true, + d: '0', + }, + { + n: 'letterSpacing', + l: true, + syntax: PropertySyntax.LENGTH, + int: true, + d: '0', + }, + { + n: 'miterLimit', + l: true, + syntax: PropertySyntax.NUMBER, + d: function (nodeName) { + if (nodeName === Shape.PATH || nodeName === Shape.POLYGON || nodeName === Shape.POLYLINE) { + return '4'; + } + return '10'; + }, + }, + { + n: 'wordWrap', + l: true, + }, + { + n: 'wordWrapWidth', + l: true, + }, + { + n: 'maxLines', + l: true, + }, + { + n: 'textOverflow', + l: true, + d: 'clip', + }, + { + n: 'leading', + l: true, + }, + { + n: 'textBaseline', + l: true, + inh: true, + k: ['top', 'hanging', 'middle', 'alphabetic', 'ideographic', 'bottom'], + d: 'alphabetic', + }, + { + n: 'textAlign', + l: true, + inh: true, + k: ['start', 'center', 'middle', 'end', 'left', 'right'], + d: 'start', + }, + // { + // n: 'whiteSpace', + // l: true, + // }, + { + n: 'markerStart', + syntax: PropertySyntax.MARKER, + }, + { + n: 'markerEnd', + syntax: PropertySyntax.MARKER, + }, + { + n: 'markerMid', + syntax: PropertySyntax.MARKER, + }, + { + n: 'markerStartOffset', + syntax: PropertySyntax.LENGTH, + l: true, + int: true, + d: '0', + }, + { + n: 'markerEndOffset', + syntax: PropertySyntax.LENGTH, + l: true, + int: true, + d: '0', + }, + ]; + var GEOMETRY_ATTRIBUTE_NAMES = BUILT_IN_PROPERTIES.filter(function (n) { + return !!n.l; + }).map(function (n) { + return n.n; + }); + var propertyMetadataCache = {}; + var unresolvedProperties = new WeakMap(); + // const uniqueAttributeSet = new Set(); + // const tmpVec3a = vec3.create(); + // const tmpVec3b = vec3.create(); + // const tmpVec3c = vec3.create(); + var isPropertyResolved = function (object, name) { + var properties = unresolvedProperties.get(object); + if (!properties || properties.length === 0) { + return true; + } + return properties.includes(name); + }; + var DefaultStyleValueRegistry = /** @class */ (function () { + /** + * need recalc later + */ + // dirty = false; + function DefaultStyleValueRegistry(runtime) { + var _this = this; + this.runtime = runtime; + BUILT_IN_PROPERTIES.forEach(function (property) { + _this.registerMetadata(property); + }); + } + DefaultStyleValueRegistry.prototype.registerMetadata = function (metadata) { + __spreadArray([metadata.n], __read(metadata.a || []), false).forEach(function (name) { + propertyMetadataCache[name] = metadata; + }); + }; + DefaultStyleValueRegistry.prototype.unregisterMetadata = function (name) { + delete propertyMetadataCache[name]; + }; + DefaultStyleValueRegistry.prototype.getPropertySyntax = function (syntax) { + return this.runtime.CSSPropertySyntaxFactory[syntax]; + }; + /** + * * parse value, eg. + * fill: 'red' => CSSRGB + * translateX: '10px' => CSSUnitValue { unit: 'px', value: 10 } + * fontSize: '2em' => { unit: 'px', value: 32 } + * + * * calculate used value + * * post process + */ + DefaultStyleValueRegistry.prototype.processProperties = function (object, attributes, options) { + var _this = this; + if (options === void 0) { + options = { + skipUpdateAttribute: false, + skipParse: false, + forceUpdateGeometry: false, + usedAttributes: [], + memoize: true, + }; + } + if (!this.runtime.enableCSSParsing) { + Object.assign(object.attributes, attributes); + var attributeNames = Object.keys(attributes); + // clipPath + var oldClipPath = object.parsedStyle.clipPath; + var oldOffsetPath = object.parsedStyle.offsetPath; + object.parsedStyle = Object.assign(object.parsedStyle, attributes); + var needUpdateGeometry = !!options.forceUpdateGeometry; + if (!needUpdateGeometry) { + for (var i = 0; i < GEOMETRY_ATTRIBUTE_NAMES.length; i++) { + if (GEOMETRY_ATTRIBUTE_NAMES[i] in attributes) { + needUpdateGeometry = true; + break; + } + } + } + if (attributes.fill) { + object.parsedStyle.fill = parseColor(attributes.fill); + } + if (attributes.stroke) { + object.parsedStyle.stroke = parseColor(attributes.stroke); + } + if (attributes.shadowColor) { + object.parsedStyle.shadowColor = parseColor(attributes.shadowColor); + } + if (attributes.filter) { + object.parsedStyle.filter = parseFilter(attributes.filter); + } + // Rect + // @ts-ignore + if (!isNil(attributes.radius)) { + // @ts-ignore + object.parsedStyle.radius = parseDimensionArrayFormat( + // @ts-ignore + attributes.radius, + 4 + ); + } + // Polyline + if (!isNil(attributes.lineDash)) { + object.parsedStyle.lineDash = parseDimensionArrayFormat(attributes.lineDash, 2); + } + // @ts-ignore + if (attributes.points) { + // @ts-ignore + object.parsedStyle.points = parsePoints(attributes.points); + } + // Path + // @ts-ignore + if (attributes.d === '') { + object.parsedStyle.d = __assign({}, EMPTY_PARSED_PATH); + } + // @ts-ignore + if (attributes.d) { + object.parsedStyle.d = parsePath( + // @ts-ignore + attributes.d + ); + } + // Text + if (attributes.textTransform) { + this.runtime.CSSPropertySyntaxFactory[''].calculator( + null, + null, + { value: attributes.textTransform }, + object, + null + ); + } + if (!isUndefined(attributes.clipPath)) { + this.runtime.CSSPropertySyntaxFactory[''].calculator( + 'clipPath', + oldClipPath, + attributes.clipPath, + object, + this.runtime + ); + } + if (attributes.offsetPath) { + this.runtime.CSSPropertySyntaxFactory[''].calculator( + 'offsetPath', + oldOffsetPath, + attributes.offsetPath, + object, + this.runtime + ); + } + if (attributes.transform) { + object.parsedStyle.transform = parseTransform(attributes.transform); + } + if (attributes.transformOrigin) { + object.parsedStyle.transformOrigin = parseTransformOrigin(attributes.transformOrigin); + } + // Marker + // @ts-ignore + if (attributes.markerStart) { + object.parsedStyle.markerStart = this.runtime.CSSPropertySyntaxFactory[ + '' + ].calculator( + null, + // @ts-ignore + attributes.markerStart, + // @ts-ignore + attributes.markerStart, + null, + null + ); + } + // @ts-ignore + if (attributes.markerEnd) { + object.parsedStyle.markerEnd = this.runtime.CSSPropertySyntaxFactory[ + '' + ].calculator( + null, + // @ts-ignore + attributes.markerEnd, + // @ts-ignore + attributes.markerEnd, + null, + null + ); + } + // @ts-ignore + if (attributes.markerMid) { + object.parsedStyle.markerMid = this.runtime.CSSPropertySyntaxFactory[ + '' + ].calculator( + '', + // @ts-ignore + attributes.markerMid, + // @ts-ignore + attributes.markerMid, + null, + null + ); + } + if (!isNil(attributes.zIndex)) { + this.runtime.CSSPropertySyntaxFactory[''].postProcessor(object, attributeNames); + } + if (!isNil(attributes.offsetDistance)) { + this.runtime.CSSPropertySyntaxFactory[''].postProcessor( + object, + attributeNames + ); + } + if (attributes.transform) { + this.runtime.CSSPropertySyntaxFactory[''].postProcessor( + object, + attributeNames + ); + } + if (attributes.transformOrigin) { + this.runtime.CSSPropertySyntaxFactory[''].postProcessor( + object, + attributeNames + ); + } + if (needUpdateGeometry) { + object.geometry.dirty = true; + object.renderable.boundsDirty = true; + object.renderable.renderBoundsDirty = true; + if (!options.forceUpdateGeometry) { + this.runtime.sceneGraphService.dirtifyToRoot(object); + } + } + } else { + var skipUpdateAttribute_1 = options.skipUpdateAttribute, + skipParse = options.skipParse, + forceUpdateGeometry = options.forceUpdateGeometry, + usedAttributes = options.usedAttributes, + memoize_1 = options.memoize; + var needUpdateGeometry_1 = forceUpdateGeometry; + var attributeNames_1 = Object.keys(attributes); + attributeNames_1.forEach(function (attributeName) { + var _a; + if (!skipUpdateAttribute_1) { + object.attributes[attributeName] = attributes[attributeName]; + } + if ( + !needUpdateGeometry_1 && + ((_a = propertyMetadataCache[attributeName]) === null || _a === void 0 ? void 0 : _a.l) + ) { + needUpdateGeometry_1 = true; + } + }); + if (!skipParse) { + attributeNames_1.forEach(function (name) { + object.computedStyle[name] = _this.parseProperty( + name, + object.attributes[name], + object, + memoize_1 + ); + }); + } + // let hasUnresolvedProperties = false; + // parse according to priority + // path 50 + // points 50 + // text 50 + // textTransform 51 + // transform 100 + // transformOrigin 100 + if (usedAttributes === null || usedAttributes === void 0 ? void 0 : usedAttributes.length) { + // uniqueAttributeSet.clear(); + attributeNames_1 = Array.from(new Set(attributeNames_1.concat(usedAttributes))); + } + // [ + // 'path', + // 'points', + // 'text', + // 'textTransform', + // 'transform', + // 'transformOrigin', + // ].forEach((name) => { + // const index = attributeNames.indexOf(name); + // if (index > -1) { + // attributeNames.splice(index, 1); + // attributeNames.push(name); + // } + // }); + attributeNames_1.forEach(function (name) { + // some style props maybe deleted after parsing such as `anchor` in Text + if (name in object.computedStyle) { + object.parsedStyle[name] = _this.computeProperty( + name, + object.computedStyle[name], + object, + memoize_1 + ); + } + }); + // if (hasUnresolvedProperties) { + // this.dirty = true; + // return; + // } + // update geometry + if (needUpdateGeometry_1) { + object.geometry.dirty = true; + object.renderable.boundsDirty = true; + object.renderable.renderBoundsDirty = true; + if (!options.forceUpdateGeometry) { + this.runtime.sceneGraphService.dirtifyToRoot(object); + } + } + attributeNames_1.forEach(function (name) { + if (name in object.parsedStyle) { + _this.postProcessProperty(name, object, attributeNames_1); + } + }); + if (this.runtime.enableCSSParsing && object.children.length) { + attributeNames_1.forEach(function (name) { + if (name in object.parsedStyle && _this.isPropertyInheritable(name)) { + // update children's inheritable + object.children.forEach(function (child) { + child.internalSetAttribute(name, null, { + skipUpdateAttribute: true, + skipParse: true, + }); + }); + } + }); + } + } + }; + /** + * string -> parsed value + */ + DefaultStyleValueRegistry.prototype.parseProperty = function (name, value, object, memoized) { + var metadata = propertyMetadataCache[name]; + var computed = value; + if (value === '' || isNil(value)) { + value = 'unset'; + } + if (value === 'unset' || value === 'initial' || value === 'inherit') { + // computed = new CSSKeywordValue(value); + computed = getOrCreateKeyword(value); + } else { + if (metadata) { + var keywords = metadata.k, + syntax = metadata.syntax; + var handler = syntax && this.getPropertySyntax(syntax); + // use keywords + if (keywords && keywords.indexOf(value) > -1) { + // computed = new CSSKeywordValue(value); + computed = getOrCreateKeyword(value); + } else if (handler) { + if (!memoized && handler.parserUnmemoize) { + computed = handler.parserUnmemoize(value, object); + } else if (handler.parser) { + // try to parse it to CSSStyleValue, eg. '10px' -> CSS.px(10) + computed = handler.parser(value, object); + } + } + } + } + return computed; + }; + /** + * computed value -> used value + */ + DefaultStyleValueRegistry.prototype.computeProperty = function ( + name, + computed, + object, + memoized + ) { + var metadata = propertyMetadataCache[name]; + var isDocumentElement = object.id === 'g-root'; + // let used: CSSStyleValue = computed instanceof CSSStyleValue ? computed.clone() : computed; + var used = computed; + if (metadata) { + var syntax = metadata.syntax, + inherited = metadata.inh, + defaultValue = metadata.d; + if (computed instanceof CSSKeywordValue) { + var value = computed.value; + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/CSS/unset + */ + if (value === 'unset') { + if (inherited && !isDocumentElement) { + value = 'inherit'; + } else { + value = 'initial'; + } + } + if (value === 'initial') { + // @see https://developer.mozilla.org/en-US/docs/Web/CSS/initial + if (!isNil(defaultValue)) { + computed = this.parseProperty( + name, + isFunction$1(defaultValue) ? defaultValue(object.nodeName) : defaultValue, + object, + memoized + ); + } + } else if (value === 'inherit') { + // @see https://developer.mozilla.org/en-US/docs/Web/CSS/inherit + // behave like `inherit` + var resolved = this.tryToResolveProperty(object, name, { + inherited: true, + }); + if (!isNil(resolved)) { + // object.parsedStyle[name] = resolved; + // return false; + return resolved; + } else { + this.addUnresolveProperty(object, name); + return; + } + } + } + var handler = syntax && this.getPropertySyntax(syntax); + if (handler && handler.calculator) { + // convert computed value to used value + var oldParsedValue = object.parsedStyle[name]; + used = handler.calculator(name, oldParsedValue, computed, object, this.runtime); + } else if (computed instanceof CSSKeywordValue) { + used = computed.value; + } else { + used = computed; + } + } + // object.parsedStyle[name] = used; + // return false; + return used; + }; + DefaultStyleValueRegistry.prototype.postProcessProperty = function (name, object, attributes) { + var metadata = propertyMetadataCache[name]; + if (metadata && metadata.syntax) { + var handler = metadata.syntax && this.getPropertySyntax(metadata.syntax); + var propertyHandler = handler; + if (propertyHandler && propertyHandler.postProcessor) { + propertyHandler.postProcessor(object, attributes); + } + } + }; + /** + * resolve later + */ + DefaultStyleValueRegistry.prototype.addUnresolveProperty = function (object, name) { + var properties = unresolvedProperties.get(object); + if (!properties) { + unresolvedProperties.set(object, []); + properties = unresolvedProperties.get(object); + } + if (properties.indexOf(name) === -1) { + properties.push(name); + } + }; + DefaultStyleValueRegistry.prototype.tryToResolveProperty = function (object, name, options) { + if (options === void 0) { + options = {}; + } + var inherited = options.inherited; + if (inherited) { + if (object.parentElement && isPropertyResolved(object.parentElement, name)) { + // const computedValue = object.parentElement.computedStyle[name]; + var usedValue = object.parentElement.parsedStyle[name]; + if ( + // usedValue instanceof CSSKeywordValue && + usedValue === 'unset' || + usedValue === 'initial' || + usedValue === 'inherit' + ) { + return; + } + // else if ( + // usedValue instanceof CSSUnitValue && + // CSSUnitValue.isRelativeUnit(usedValue.unit) + // ) { + // return false; + // } + return usedValue; + } + } + return; + }; + DefaultStyleValueRegistry.prototype.recalc = function (object) { + var properties = unresolvedProperties.get(object); + if (properties && properties.length) { + var attributes_1 = {}; + properties.forEach(function (property) { + attributes_1[property] = object.attributes[property]; + }); + this.processProperties(object, attributes_1); + unresolvedProperties.delete(object); + } + }; + /** + * update geometry when relative props changed, + * eg. r of Circle, width/height of Rect + */ + DefaultStyleValueRegistry.prototype.updateGeometry = function (object) { + var nodeName = object.nodeName; + var geometryUpdater = this.runtime.geometryUpdaterFactory[nodeName]; + if (geometryUpdater) { + var geometry_1 = object.geometry; + if (!geometry_1.contentBounds) { + geometry_1.contentBounds = new AABB(); + } + if (!geometry_1.renderBounds) { + geometry_1.renderBounds = new AABB(); + } + var parsedStyle = object.parsedStyle; + var _a = geometryUpdater.update(parsedStyle, object), + _b = _a.cx, + cx = _b === void 0 ? 0 : _b, + _c = _a.cy, + cy = _c === void 0 ? 0 : _c, + _d = _a.cz, + cz = _d === void 0 ? 0 : _d, + _e = _a.hwidth, + hwidth = _e === void 0 ? 0 : _e, + _f = _a.hheight, + hheight = _f === void 0 ? 0 : _f, + _g = _a.hdepth, + hdepth = _g === void 0 ? 0 : _g; + // init with content box + var halfExtents = [Math.abs(hwidth), Math.abs(hheight), hdepth]; + // const halfExtents = vec3.set( + // tmpVec3a, + // Math.abs(width) / 2, + // Math.abs(height) / 2, + // depth / 2, + // ); + // anchor is center by default, don't account for lineWidth here + var _h = parsedStyle, + stroke = _h.stroke, + _j = _h.lineWidth, + lineWidth = _j === void 0 ? 1 : _j, + // lineCap, + // lineJoin, + // miterLimit, + _k = _h.increasedLineWidthForHitTesting, + // lineCap, + // lineJoin, + // miterLimit, + increasedLineWidthForHitTesting = _k === void 0 ? 0 : _k, + _l = _h.shadowType, + shadowType = _l === void 0 ? 'outer' : _l, + shadowColor = _h.shadowColor, + _m = _h.filter, + filter = _m === void 0 ? [] : _m, + transformOrigin = _h.transformOrigin; + var center = [cx, cy, cz]; + // update geometry's AABB + geometry_1.contentBounds.update(center, halfExtents); + // @see https://github.molgen.mpg.de/git-mirror/cairo/blob/master/src/cairo-stroke-style.c#L97..L128 + var expansion = + nodeName === Shape.POLYLINE || nodeName === Shape.POLYGON || nodeName === Shape.PATH + ? Math.SQRT2 + : 0.5; + // if (lineCap?.value === 'square') { + // expansion = Math.SQRT1_2; + // } + // if (lineJoin?.value === 'miter' && expansion < Math.SQRT2 * miterLimit) { + // expansion = Math.SQRT1_2 * miterLimit; + // } + // append border only if stroke existed + var hasStroke = stroke && !stroke.isNone; + if (hasStroke) { + var halfLineWidth = + ((lineWidth || 0) + (increasedLineWidthForHitTesting || 0)) * expansion; + // halfExtents[0] += halfLineWidth[0]; + // halfExtents[1] += halfLineWidth[1]; + halfExtents[0] += halfLineWidth; + halfExtents[1] += halfLineWidth; + // vec3.add( + // halfExtents, + // halfExtents, + // vec3.set(tmpVec3c, halfLineWidth, halfLineWidth, 0), + // ); + } + geometry_1.renderBounds.update(center, halfExtents); + // account for shadow, only support constant value now + if (shadowColor && shadowType && shadowType !== 'inner') { + var _o = geometry_1.renderBounds, + min = _o.min, + max = _o.max; + var _p = parsedStyle, + shadowBlur = _p.shadowBlur, + shadowOffsetX = _p.shadowOffsetX, + shadowOffsetY = _p.shadowOffsetY; + var shadowBlurInPixels = shadowBlur || 0; + var shadowOffsetXInPixels = shadowOffsetX || 0; + var shadowOffsetYInPixels = shadowOffsetY || 0; + var shadowLeft = min[0] - shadowBlurInPixels + shadowOffsetXInPixels; + var shadowRight = max[0] + shadowBlurInPixels + shadowOffsetXInPixels; + var shadowTop = min[1] - shadowBlurInPixels + shadowOffsetYInPixels; + var shadowBottom = max[1] + shadowBlurInPixels + shadowOffsetYInPixels; + min[0] = Math.min(min[0], shadowLeft); + max[0] = Math.max(max[0], shadowRight); + min[1] = Math.min(min[1], shadowTop); + max[1] = Math.max(max[1], shadowBottom); + geometry_1.renderBounds.setMinMax(min, max); + } + // account for filter, eg. blur(5px), drop-shadow() + filter.forEach(function (_a) { + var name = _a.name, + params = _a.params; + if (name === 'blur') { + var blurRadius = params[0].value; + geometry_1.renderBounds.update( + geometry_1.renderBounds.center, + addVec3(geometry_1.renderBounds.halfExtents, geometry_1.renderBounds.halfExtents, [ + blurRadius, + blurRadius, + 0, + ]) + ); + } else if (name === 'drop-shadow') { + var shadowOffsetX = params[0].value; + var shadowOffsetY = params[1].value; + var shadowBlur = params[2].value; + var _b = geometry_1.renderBounds, + min = _b.min, + max = _b.max; + var shadowLeft = min[0] - shadowBlur + shadowOffsetX; + var shadowRight = max[0] + shadowBlur + shadowOffsetX; + var shadowTop = min[1] - shadowBlur + shadowOffsetY; + var shadowBottom = max[1] + shadowBlur + shadowOffsetY; + min[0] = Math.min(min[0], shadowLeft); + max[0] = Math.max(max[0], shadowRight); + min[1] = Math.min(min[1], shadowTop); + max[1] = Math.max(max[1], shadowBottom); + geometry_1.renderBounds.setMinMax(min, max); + } + }); + object.geometry.dirty = false; + // @see https://github.com/antvis/g/issues/957 + var flipY = hwidth < 0; + var flipX = hheight < 0; + // set transform origin + var usedOriginXValue = + (flipY ? -1 : 1) * + (transformOrigin ? convertPercentUnit(transformOrigin[0], 0, object, true) : 0); + var usedOriginYValue = + (flipX ? -1 : 1) * + (transformOrigin ? convertPercentUnit(transformOrigin[1], 1, object, true) : 0); + if (usedOriginXValue || usedOriginYValue) { + object.setOrigin(usedOriginXValue, usedOriginYValue); + } + } + }; + DefaultStyleValueRegistry.prototype.updateSizeAttenuation = function (node, zoom) { + if (node.style.isSizeAttenuation) { + if (!node.style.rawLineWidth) { + node.style.rawLineWidth = node.style.lineWidth; + } + node.style.lineWidth = (node.style.rawLineWidth || 1) / zoom; + if (node.nodeName === Shape.CIRCLE) { + if (!node.style.rawR) { + node.style.rawR = node.style.r; + } + node.style.r = (node.style.rawR || 1) / zoom; + } + } else { + if (node.style.rawLineWidth) { + node.style.lineWidth = node.style.rawLineWidth; + delete node.style.rawLineWidth; + } + if (node.nodeName === Shape.CIRCLE) { + if (node.style.rawR) { + node.style.r = node.style.rawR; + delete node.style.rawR; + } + } + } + }; + DefaultStyleValueRegistry.prototype.isPropertyInheritable = function (name) { + var metadata = propertyMetadataCache[name]; + if (!metadata) { + return false; + } + return metadata.inh; + }; + return DefaultStyleValueRegistry; + })(); + + var CSSPropertyAngle = /** @class */ (function () { + function CSSPropertyAngle() { + this.parser = parseAngle; + this.parserUnmemoize = parseAngleUnmemoize; + this.parserWithCSSDisabled = null; + this.mixer = mergeNumbers; + } + CSSPropertyAngle.prototype.calculator = function (name, oldParsed, parsed, object) { + return convertAngleUnit(parsed); + }; + return CSSPropertyAngle; + })(); + + /** + * clipPath / textPath / offsetPath + */ + var CSSPropertyClipPath = /** @class */ (function () { + function CSSPropertyClipPath() {} + CSSPropertyClipPath.prototype.calculator = function (name, oldPath, newPath, object, runtime) { + // unset + if (newPath instanceof CSSKeywordValue) { + newPath = null; + } + runtime.sceneGraphService.updateDisplayObjectDependency(name, oldPath, newPath, object); + if (name === 'clipPath') { + // should affect children + object.forEach(function (leaf) { + if (leaf.childNodes.length === 0) { + runtime.sceneGraphService.dirtifyToRoot(leaf); + } + }); + } + return newPath; + }; + return CSSPropertyClipPath; + })(); + + var CSSPropertyColor = /** @class */ (function () { + function CSSPropertyColor() { + this.parser = parseColor; + this.parserWithCSSDisabled = parseColor; + this.mixer = mergeColors; + } + CSSPropertyColor.prototype.calculator = function (name, oldParsed, parsed, object) { + if (parsed instanceof CSSKeywordValue) { + // 'unset' 'none' + return parsed.value === 'none' ? noneColor : transparentColor; + } + return parsed; + }; + return CSSPropertyColor; + })(); + + var CSSPropertyFilter = /** @class */ (function () { + function CSSPropertyFilter() { + this.parser = parseFilter; + } + CSSPropertyFilter.prototype.calculator = function (name, oldParsed, parsed) { + // unset or none + if (parsed instanceof CSSKeywordValue) { + return []; + } + return parsed; + }; + return CSSPropertyFilter; + })(); + + function getFontSize(object) { + var fontSize = object.parsedStyle.fontSize; + return isNil(fontSize) ? null : fontSize; + } + /** + * & + */ + var CSSPropertyLengthOrPercentage = /** @class */ (function () { + function CSSPropertyLengthOrPercentage() { + this.parser = parseLengthOrPercentage; + this.parserUnmemoize = parseLengthOrPercentageUnmemoize; + this.parserWithCSSDisabled = null; + this.mixer = mergeNumbers; + } + /** + * according to parent's bounds + * + * @example + * CSS.percent(50) -> CSS.px(0.5 * parent.width) + */ + CSSPropertyLengthOrPercentage.prototype.calculator = function ( + name, + oldParsed, + computed, + object, + runtime + ) { + var _a; + if (isNumber(computed)) { + return computed; + } + if (CSSUnitValue.isRelativeUnit(computed.unit)) { + var registry = runtime.styleValueRegistry; + if (computed.unit === UnitType.kPercentage) { + // TODO: merge dimensions + return 0; + } else if (computed.unit === UnitType.kEms) { + if (object.parentNode) { + var fontSize = getFontSize(object.parentNode); + if (fontSize) { + fontSize *= computed.value; + return fontSize; + } else { + registry.addUnresolveProperty(object, name); + } + } else { + registry.addUnresolveProperty(object, name); + } + return 0; + } else if (computed.unit === UnitType.kRems) { + if ( + (_a = object === null || object === void 0 ? void 0 : object.ownerDocument) === null || + _a === void 0 + ? void 0 + : _a.documentElement + ) { + var fontSize = getFontSize(object.ownerDocument.documentElement); + if (fontSize) { + fontSize *= computed.value; + return fontSize; + } else { + registry.addUnresolveProperty(object, name); + } + } else { + registry.addUnresolveProperty(object, name); + } + return 0; + } + } else { + // remove listener if exists + // registry.unregisterParentGeometryBoundsChangedHandler(object, name); + // return absolute value + return computed.value; + } + }; + return CSSPropertyLengthOrPercentage; + })(); + + /** + * format to Tuple2 + * + * @example + * rect.style.lineDash = 10; + * rect.style.lineDash = [10, 10]; + * rect.style.lineDash = '10 10'; + */ + var CSSPropertyLengthOrPercentage12 = /** @class */ (function () { + function CSSPropertyLengthOrPercentage12() { + this.mixer = mergeNumberLists; + } + CSSPropertyLengthOrPercentage12.prototype.parser = function (radius) { + var parsed = parseDimensionArray(isNumber(radius) ? [radius] : radius); + var formatted; + if (parsed.length === 1) { + formatted = [parsed[0], parsed[0]]; + } else { + formatted = [parsed[0], parsed[1]]; + } + return formatted; + }; + CSSPropertyLengthOrPercentage12.prototype.calculator = function (name, oldParsed, computed) { + return computed.map(function (c) { + return c.value; + }); + }; + return CSSPropertyLengthOrPercentage12; + })(); + + /** + * used in rounded rect + * + * @example + * rect.style.radius = 10; + * rect.style.radius = '10 10'; + * rect.style.radius = '10 10 10 10'; + */ + var CSSPropertyLengthOrPercentage14 = /** @class */ (function () { + function CSSPropertyLengthOrPercentage14() { + this.mixer = mergeNumberLists; + } + CSSPropertyLengthOrPercentage14.prototype.parser = function (radius) { + var parsed = parseDimensionArray(isNumber(radius) ? [radius] : radius); + var formatted; + // format to Tuple + if (parsed.length === 1) { + formatted = [parsed[0], parsed[0], parsed[0], parsed[0]]; + } else if (parsed.length === 2) { + formatted = [parsed[0], parsed[1], parsed[0], parsed[1]]; + } else if (parsed.length === 3) { + formatted = [parsed[0], parsed[1], parsed[2], parsed[1]]; + } else { + formatted = [parsed[0], parsed[1], parsed[2], parsed[3]]; + } + return formatted; + }; + CSSPropertyLengthOrPercentage14.prototype.calculator = function (name, oldParsed, computed) { + return computed.map(function (c) { + return c.value; + }); + }; + return CSSPropertyLengthOrPercentage14; + })(); + + var CSSPropertyMarker = /** @class */ (function () { + function CSSPropertyMarker() {} + CSSPropertyMarker.prototype.calculator = function (name, oldMarker, newMarker, object) { + // unset + if (newMarker instanceof CSSKeywordValue) { + newMarker = null; + } + var cloned = newMarker === null || newMarker === void 0 ? void 0 : newMarker.cloneNode(true); + if (cloned) { + // FIXME: SVG should not inherit parent's style, add a flag here + cloned.style.isMarker = true; + } + return cloned; + }; + return CSSPropertyMarker; + })(); + + var CSSPropertyNumber = /** @class */ (function () { + function CSSPropertyNumber() { + this.mixer = mergeNumbers; + this.parser = parseNumber; + this.parserUnmemoize = parseNumberUnmemoize; + this.parserWithCSSDisabled = null; + } + CSSPropertyNumber.prototype.calculator = function (name, oldParsed, computed) { + return computed.value; + }; + return CSSPropertyNumber; + })(); + + var CSSPropertyOffsetDistance = /** @class */ (function () { + function CSSPropertyOffsetDistance() { + this.parser = parseNumber; + this.parserUnmemoize = parseNumberUnmemoize; + this.parserWithCSSDisabled = null; + this.mixer = clampedMergeNumbers(0, 1); + } + CSSPropertyOffsetDistance.prototype.calculator = function (name, oldParsed, computed) { + return computed.value; + }; + CSSPropertyOffsetDistance.prototype.postProcessor = function (object) { + var _a = object.parsedStyle, + offsetPath = _a.offsetPath, + offsetDistance = _a.offsetDistance; + if (!offsetPath) { + return; + } + var nodeName = offsetPath.nodeName; + if (nodeName === Shape.LINE || nodeName === Shape.PATH || nodeName === Shape.POLYLINE) { + // set position in world space + var point = offsetPath.getPoint(offsetDistance); + if (point) { + object.setLocalPosition(point.x, point.y); + } + } + }; + return CSSPropertyOffsetDistance; + })(); + + /** + * opacity + */ + var CSSPropertyOpacity = /** @class */ (function () { + function CSSPropertyOpacity() { + this.parser = parseNumber; + this.parserUnmemoize = parseNumberUnmemoize; + this.parserWithCSSDisabled = null; + this.mixer = clampedMergeNumbers(0, 1); + } + CSSPropertyOpacity.prototype.calculator = function (name, oldParsed, computed) { + return computed.value; + }; + return CSSPropertyOpacity; + })(); + + var CSSPropertyPath = /** @class */ (function () { + function CSSPropertyPath() { + /** + * path2Curve + */ + this.parser = parsePath; + this.parserWithCSSDisabled = parsePath; + this.mixer = mergePaths; + } + CSSPropertyPath.prototype.calculator = function (name, oldParsed, parsed) { + // unset + if (parsed instanceof CSSKeywordValue && parsed.value === 'unset') { + return { + absolutePath: [], + hasArc: false, + segments: [], + polygons: [], + polylines: [], + curve: null, + totalLength: 0, + rect: new Rectangle(0, 0, 0, 0), + }; + } + return parsed; + }; + return CSSPropertyPath; + })(); + + var CSSPropertyPoints = /** @class */ (function () { + function CSSPropertyPoints() { + this.parser = parsePoints; + this.mixer = mergePoints; + } + return CSSPropertyPoints; + })(); + + var CSSPropertyShadowBlur = /** @class */ (function (_super) { + __extends(CSSPropertyShadowBlur, _super); + function CSSPropertyShadowBlur() { + var _this = _super.apply(this, __spreadArray([], __read(arguments), false)) || this; + _this.mixer = clampedMergeNumbers(0, Infinity); + return _this; + } + return CSSPropertyShadowBlur; + })(CSSPropertyLengthOrPercentage); + + var CSSPropertyText = /** @class */ (function () { + function CSSPropertyText() {} + CSSPropertyText.prototype.calculator = function (name, oldParsed, parsed, object) { + if (parsed instanceof CSSKeywordValue) { + if (parsed.value === 'unset') { + return ''; + } else { + return parsed.value; + } + } + // allow number as valid text content + return ''.concat(parsed); + }; + CSSPropertyText.prototype.postProcessor = function (object) { + object.nodeValue = ''.concat(object.parsedStyle.text) || ''; + }; + return CSSPropertyText; + })(); + + /** + * it must transform after text get parsed + * @see https://developer.mozilla.org/zh-CN/docs/Web/CSS/text-transform + */ + var CSSPropertyTextTransform = /** @class */ (function () { + function CSSPropertyTextTransform() {} + CSSPropertyTextTransform.prototype.calculator = function (name, oldParsed, parsed, object) { + var rawText = object.getAttribute('text'); + if (rawText) { + var transformedText = rawText; + if (parsed.value === 'capitalize') { + transformedText = rawText.charAt(0).toUpperCase() + rawText.slice(1); + } else if (parsed.value === 'lowercase') { + transformedText = rawText.toLowerCase(); + } else if (parsed.value === 'uppercase') { + transformedText = rawText.toUpperCase(); + } + object.parsedStyle.text = transformedText; + } + return parsed.value; + }; + return CSSPropertyTextTransform; + })(); + + var canvasMap = {}; + var defaultCanvasIdCounter = 0; + /** + * destroy existed canvas with the same id + */ + function cleanExistedCanvas(container, canvas) { + if (container) { + var id = typeof container === 'string' ? container : container.id || defaultCanvasIdCounter++; + if (canvasMap[id]) { + canvasMap[id].destroy(); + } + canvasMap[id] = canvas; + } + } + var isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined'; + + function isElement(target) { + return !!target.getAttribute; + } + function sortedIndex(array, value) { + var low = 0; + var high = array.length; + while (low < high) { + var mid = (low + high) >>> 1; + if (sortByZIndex(array[mid], value) < 0) { + low = mid + 1; + } else { + high = mid; + } + } + return low; + } + function sortByZIndex(o1, o2) { + var zIndex1 = Number(o1.parsedStyle.zIndex || 0); + var zIndex2 = Number(o2.parsedStyle.zIndex || 0); + if (zIndex1 === zIndex2) { + var parent_1 = o1.parentNode; + if (parent_1) { + var children = parent_1.childNodes || []; + return children.indexOf(o1) - children.indexOf(o2); + } + } + return zIndex1 - zIndex2; + } + function findClosestClipPathTarget(object) { + var _a; + var el = object; + do { + var clipPath = (_a = el.parsedStyle) === null || _a === void 0 ? void 0 : _a.clipPath; + if (clipPath) return el; + el = el.parentElement; + } while (el !== null); + return null; + } + function getStyle($el, property) { + if (isBrowser) { + return document.defaultView.getComputedStyle($el, null).getPropertyValue(property); + } + } + function getWidth($el) { + var width = getStyle($el, 'width'); + if (width === 'auto') { + return $el.offsetWidth; + } + return parseFloat(width); + } + function getHeight($el) { + var height = getStyle($el, 'height'); + if (height === 'auto') { + return $el.offsetHeight; + } + return parseFloat(height); + } + + // borrow from hammer.js + var MOUSE_POINTER_ID = 1; + var TOUCH_TO_POINTER = { + touchstart: 'pointerdown', + touchend: 'pointerup', + touchendoutside: 'pointerupoutside', + touchmove: 'pointermove', + touchcancel: 'pointercancel', + }; + var clock = typeof performance === 'object' && performance.now ? performance : Date; + + function isFillOrStrokeAffected(pointerEvents, fill, stroke) { + // account for pointerEvents + // @see https://developer.mozilla.org/en-US/docs/Web/CSS/pointer-events + if (pointerEvents === void 0) { + pointerEvents = 'auto'; + } + var hasFill = false; + var hasStroke = false; + var isFillOtherThanNone = !!fill && !fill.isNone; + var isStrokeOtherThanNone = !!stroke && !stroke.isNone; + if ( + pointerEvents === 'visiblepainted' || + pointerEvents === 'painted' || + pointerEvents === 'auto' + ) { + hasFill = isFillOtherThanNone; + hasStroke = isStrokeOtherThanNone; + } else if (pointerEvents === 'visiblefill' || pointerEvents === 'fill') { + hasFill = true; + } else if (pointerEvents === 'visiblestroke' || pointerEvents === 'stroke') { + hasStroke = true; + } else if (pointerEvents === 'visible' || pointerEvents === 'all') { + // The values of the fill and stroke do not affect event processing. + hasFill = true; + hasStroke = true; + } + return [hasFill, hasStroke]; + } + + /** + * Thanks for following contributor of codes + * https://gist.github.com/1866474 + * http://paulirish.com/2011/requestanimationframe-for-smart-animating/ + * http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating + * https://github.com/Financial-Times/polyfill-library/blob/master/polyfills/requestAnimationFrame/polyfill.js + **/ + var uId = 1; + var uniqueId = function () { + return uId++; + }; + // We use `self` instead of `window` for `WebWorker` support. + var root = + typeof self === 'object' && self.self == self + ? self + : // @ts-ignore + typeof global === 'object' && global.global == global + ? // @ts-ignore + global + : {}; + var nowOffset = Date.now(); + // use performance api if exist, otherwise use Date.now. + // Date.now polyfill required. + var pnow = function () { + if (root.performance && typeof root.performance.now === 'function') { + return root.performance.now(); + } + // fallback + return Date.now() - nowOffset; + }; + var reservedCBs = {}; + var lastTime = Date.now(); + var polyfillRaf = function (callback) { + if (typeof callback !== 'function') { + throw new TypeError(callback + ' is not a function'); + } + var currentTime = Date.now(); + var gap = currentTime - lastTime; + var delay = gap > 16 ? 0 : 16 - gap; + var id = uniqueId(); + reservedCBs[id] = callback; + // keys(reservedCBs).length > 1 의미는 이미 setTimeout 이 걸려있는 경우. + // 함께 callback 이 실행될 수 있게 reservedCBs 에만 추가해주고 return + if (Object.keys(reservedCBs).length > 1) return id; + setTimeout(function () { + lastTime = currentTime; + var copied = reservedCBs; + reservedCBs = {}; + Object.keys(copied).forEach(function (key) { + return copied[key](pnow()); + }); + }, delay); + return id; + }; + var polyfillCaf = function (id) { + delete reservedCBs[id]; + }; + var vendorPrefixes = ['', 'webkit', 'moz', 'ms', 'o']; + var getRequestAnimationFrame = function (vp) { + if (typeof vp !== 'string') return polyfillRaf; + if (vp === '') return root['requestAnimationFrame']; + return root[vp + 'RequestAnimationFrame']; + }; + var getCancelAnimationFrame = function (vp) { + if (typeof vp !== 'string') return polyfillCaf; + if (vp === '') return root['cancelAnimationFrame']; + return root[vp + 'CancelAnimationFrame'] || root[vp + 'CancelRequestAnimationFrame']; + }; + var find = function (arr, predicate) { + var i = 0; + while (arr[i] !== void 0) { + if (predicate(arr[i])) return arr[i]; + i = i + 1; + } + }; + var vp = find(vendorPrefixes, function (vp) { + return !!getRequestAnimationFrame(vp); + }); + var raf = getRequestAnimationFrame(vp); + var caf = getCancelAnimationFrame(vp); + root.requestAnimationFrame = raf; + root.cancelAnimationFrame = caf; + + var AsyncParallelHook = /** @class */ (function () { + function AsyncParallelHook() { + this.callbacks = []; + } + AsyncParallelHook.prototype.getCallbacksNum = function () { + return this.callbacks.length; + }; + AsyncParallelHook.prototype.tapPromise = function (options, fn) { + this.callbacks.push(fn); + }; + AsyncParallelHook.prototype.promise = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return Promise.all( + this.callbacks.map(function (callback) { + return callback.apply(void 0, __spreadArray([], __read(args), false)); + }) + ); + }; + return AsyncParallelHook; + })(); + + var AsyncSeriesWaterfallHook = /** @class */ (function () { + function AsyncSeriesWaterfallHook() { + this.callbacks = []; + } + AsyncSeriesWaterfallHook.prototype.tapPromise = function (options, fn) { + this.callbacks.push(fn); + }; + AsyncSeriesWaterfallHook.prototype.promise = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return __awaiter(this, void 0, void 0, function () { + var result, i, callback; + var _a; + return __generator(this, function (_b) { + switch (_b.label) { + case 0: + if (!this.callbacks.length) return [3 /*break*/, 6]; + return [ + 4 /*yield*/, + (_a = this.callbacks)[0].apply(_a, __spreadArray([], __read(args), false)), + ]; + case 1: + result = _b.sent(); + i = 0; + _b.label = 2; + case 2: + if (!(i < this.callbacks.length - 1)) return [3 /*break*/, 5]; + callback = this.callbacks[i]; + return [4 /*yield*/, callback(result)]; + case 3: + // @ts-ignore + result = _b.sent(); + _b.label = 4; + case 4: + i++; + return [3 /*break*/, 2]; + case 5: + return [2 /*return*/, result]; + case 6: + return [2 /*return*/, null]; + } + }); + }); + }; + return AsyncSeriesWaterfallHook; + })(); + + var SyncHook = /** @class */ (function () { + function SyncHook() { + this.callbacks = []; + } + SyncHook.prototype.tap = function (options, fn) { + this.callbacks.push(fn); + }; + SyncHook.prototype.call = function () { + /* eslint-disable-next-line prefer-rest-params */ + var argsArr = arguments; + this.callbacks.forEach(function (callback) { + /* eslint-disable-next-line prefer-spread */ + callback.apply(void 0, argsArr); + }); + }; + return SyncHook; + })(); + + var SyncWaterfallHook = /** @class */ (function () { + function SyncWaterfallHook() { + this.callbacks = []; + } + SyncWaterfallHook.prototype.tap = function (options, fn) { + this.callbacks.push(fn); + }; + SyncWaterfallHook.prototype.call = function () { + if (this.callbacks.length) { + /* eslint-disable-next-line prefer-rest-params */ + var argsArr = arguments; + /* eslint-disable-next-line prefer-spread */ + var result = this.callbacks[0].apply(void 0, argsArr); + for (var i = 0; i < this.callbacks.length - 1; i++) { + var callback = this.callbacks[i]; + // @ts-ignore + result = callback(result); + } + return result; + } + return null; + }; + return SyncWaterfallHook; + })(); + + var genericFontFamilies = ['serif', 'sans-serif', 'monospace', 'cursive', 'fantasy', 'system-ui']; + var stringRegExp = /([\"\'])[^\'\"]+\1/; + function toFontString(attributes) { + var _a = attributes.fontSize, + fontSize = _a === void 0 ? 16 : _a, + _b = attributes.fontFamily, + fontFamily = _b === void 0 ? 'sans-serif' : _b, + _c = attributes.fontStyle, + fontStyle = _c === void 0 ? 'normal' : _c, + _d = attributes.fontVariant, + fontVariant = _d === void 0 ? 'normal' : _d, + _e = attributes.fontWeight, + fontWeight = _e === void 0 ? 'normal' : _e; + // build canvas api font setting from individual components. Convert a numeric this.fontSize to px + // const fontSizeString: string = isNumber(fontSize) ? `${fontSize}px` : fontSize.toString(); + var fontSizeString = (isNumber(fontSize) && ''.concat(fontSize, 'px')) || '16px'; + // Clean-up fontFamily property by quoting each font name + // this will support font names with spaces + var fontFamilies = fontFamily.split(','); + for (var i = fontFamilies.length - 1; i >= 0; i--) { + // Trim any extra white-space + var fontFamily_1 = fontFamilies[i].trim(); + // Check if font already contains strings + if (!stringRegExp.test(fontFamily_1) && genericFontFamilies.indexOf(fontFamily_1) < 0) { + fontFamily_1 = '"'.concat(fontFamily_1, '"'); + } + fontFamilies[i] = fontFamily_1; + } + return '' + .concat(fontStyle, ' ') + .concat(fontVariant, ' ') + .concat(fontWeight, ' ') + .concat(fontSizeString, ' ') + .concat(fontFamilies.join(',')); + } + + function createSkewMatrix(skewMatrix, skewX, skewY) { + // Create an identity matrix + identity(skewMatrix); + // Apply skew to the matrix + skewMatrix[4] = Math.tan(skewX); // Skew Y axis in X direction + skewMatrix[1] = Math.tan(skewY); // Skew X axis in Y direction + return skewMatrix; + } + var SCALE_EPSILON = 0.00001; + var tmpMat1 = create$1(); + var tmpMat2 = create$1(); + function parsedTransformToMat4(transform, object) { + if (transform.length) { + var m_1 = identity(tmpMat1); + transform.forEach(function (parsed) { + var t = parsed.t, + d = parsed.d; + if (t === 'scale') { + // scale(1) scale(1, 1) + var newScale = (d === null || d === void 0 + ? void 0 + : d.map(function (s) { + return Math.max(s.value, SCALE_EPSILON); + })) || [1, 1]; + fromScaling(tmpMat2, [newScale[0], newScale[1], 1]); + } else if (t === 'scalex') { + var newScale = (d === null || d === void 0 + ? void 0 + : d.map(function (s) { + return Math.max(s.value, SCALE_EPSILON); + })) || [1]; + fromScaling(tmpMat2, [newScale[0], 1, 1]); + } else if (t === 'scaley') { + var newScale = (d === null || d === void 0 + ? void 0 + : d.map(function (s) { + return Math.max(s.value, SCALE_EPSILON); + })) || [1]; + fromScaling(tmpMat2, [1, newScale[0], 1]); + } else if (t === 'scalez') { + var newScale = (d === null || d === void 0 + ? void 0 + : d.map(function (s) { + return Math.max(s.value, SCALE_EPSILON); + })) || [1]; + fromScaling(tmpMat2, [1, 1, newScale[0]]); + } else if (t === 'scale3d') { + var newScale = (d === null || d === void 0 + ? void 0 + : d.map(function (s) { + return Math.max(s.value, SCALE_EPSILON); + })) || [1, 1, 1]; + fromScaling(tmpMat2, [newScale[0], newScale[1], newScale[2]]); + } else if (t === 'translate') { + var newTranslation = d || [Opx, Opx]; + fromTranslation(tmpMat2, [newTranslation[0].value, newTranslation[1].value, 0]); + } else if (t === 'translatex') { + var newTranslation = d || [Opx]; + fromTranslation(tmpMat2, [newTranslation[0].value, 0, 0]); + } else if (t === 'translatey') { + var newTranslation = d || [Opx]; + fromTranslation(tmpMat2, [0, newTranslation[0].value, 0]); + } else if (t === 'translatez') { + var newTranslation = d || [Opx]; + fromTranslation(tmpMat2, [0, 0, newTranslation[0].value]); + } else if (t === 'translate3d') { + var newTranslation = d || [Opx, Opx, Opx]; + fromTranslation(tmpMat2, [ + newTranslation[0].value, + newTranslation[1].value, + newTranslation[2].value, + ]); + } else if (t === 'rotate') { + var newAngles = d || [Odeg]; + fromZRotation(tmpMat2, deg2rad(convertAngleUnit(newAngles[0]))); + } else if (t === 'rotatex') { + var newAngles = d || [Odeg]; + fromXRotation(tmpMat2, deg2rad(convertAngleUnit(newAngles[0]))); + } else if (t === 'rotatey') { + var newAngles = d || [Odeg]; + fromYRotation(tmpMat2, deg2rad(convertAngleUnit(newAngles[0]))); + } else if (t === 'rotatez') { + var newAngles = d || [Odeg]; + fromZRotation(tmpMat2, deg2rad(convertAngleUnit(newAngles[0]))); + } else if (t === 'rotate3d') { + var newAngles = d || [Opx, Opx, Opx, Odeg]; + fromRotation(tmpMat2, deg2rad(convertAngleUnit(newAngles[3])), [ + newAngles[0].value, + newAngles[1].value, + newAngles[2].value, + ]); + } else if (t === 'skew') { + var newSkew = (d === null || d === void 0 + ? void 0 + : d.map(function (s) { + return s.value; + })) || [0, 0]; + createSkewMatrix(tmpMat2, deg2rad(newSkew[0]), deg2rad(newSkew[1])); + } else if (t === 'skewx') { + var newSkew = (d === null || d === void 0 + ? void 0 + : d.map(function (s) { + return s.value; + })) || [0]; + createSkewMatrix(tmpMat2, deg2rad(newSkew[0]), 0); + } else if (t === 'skewy') { + var newSkew = (d === null || d === void 0 + ? void 0 + : d.map(function (s) { + return s.value; + })) || [0]; + createSkewMatrix(tmpMat2, 0, deg2rad(newSkew[0])); + } else if (t === 'matrix') { + var _a = __read( + d.map(function (s) { + return s.value; + }), + 6 + ), + a = _a[0], + b = _a[1], + c = _a[2], + dd = _a[3], + tx = _a[4], + ty = _a[5]; + set(tmpMat2, a, b, 0, 0, c, dd, 0, 0, 0, 0, 1, 0, tx, ty, 0, 1); + } else if (t === 'matrix3d') { + // @ts-ignore + set.apply( + mat4, + __spreadArray( + [tmpMat2], + __read( + d.map(function (s) { + return s.value; + }) + ), + false + ) + ); + } + mul(m_1, m_1, tmpMat2); + }); + object.setLocalTransform(m_1); + } else { + object.resetLocalTransform(); + } + return object.getLocalTransform(); + } + + /** + * @see /zh/docs/api/animation#支持变换的属性 + * + * support the following formats like CSS Transform: + * + * scale + * * scale(x, y) + * * scaleX(x) + * * scaleY(x) + * * scaleZ(z) + * * scale3d(x, y, z) + * + * translate (unit: none, px, %(relative to its bounds)) + * * translate(x, y) eg. translate(0, 0) translate(0, 30px) translate(100%, 100%) + * * translateX(0) + * * translateY(0) + * * translateZ(0) + * * translate3d(0, 0, 0) + * + * rotate (unit: deg rad turn) + * * rotate(0.5turn) rotate(30deg) rotate(1rad) + * + * none + * + * unsupported for now: + * * calc() eg. translate(calc(100% + 10px)) + * * matrix/matrix3d() + * * skew/skewX/skewY + * * perspective + */ + var CSSPropertyTransform = /** @class */ (function () { + function CSSPropertyTransform() { + this.parser = parseTransform; + this.parserUnmemoize = parseTransformUnmemoize; + this.parserWithCSSDisabled = parseTransformUnmemoize; + this.mixer = mergeTransforms; + } + CSSPropertyTransform.prototype.calculator = function (name, oldParsed, parsed, object) { + // 'none' + if (parsed instanceof CSSKeywordValue) { + return []; + } + return parsed; + }; + CSSPropertyTransform.prototype.postProcessor = function (object) { + var transform = object.parsedStyle.transform; + parsedTransformToMat4(transform, object); + }; + return CSSPropertyTransform; + })(); + + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/CSS/transform-origin + * @example + * [10px, 10px] [10%, 10%] + */ + var CSSPropertyTransformOrigin = /** @class */ (function () { + function CSSPropertyTransformOrigin() { + this.parser = parseTransformOrigin; + this.parserUnmemoize = parseTransformOriginUnmemoize; + } + CSSPropertyTransformOrigin.prototype.postProcessor = function (object) { + var transformOrigin = object.parsedStyle.transformOrigin; + if ( + transformOrigin[0].unit === UnitType.kPixels && + transformOrigin[1].unit === UnitType.kPixels + ) { + object.setOrigin(transformOrigin[0].value, transformOrigin[1].value); + } else { + // Relative to geometry bounds, calculate later. + object.getGeometryBounds(); + } + }; + return CSSPropertyTransformOrigin; + })(); + + var CSSPropertyZIndex = /** @class */ (function () { + function CSSPropertyZIndex() { + this.parser = parseNumber; + this.parserUnmemoize = parseNumberUnmemoize; + } + CSSPropertyZIndex.prototype.calculator = function (name, oldParsed, computed, object) { + return computed.value; + }; + CSSPropertyZIndex.prototype.postProcessor = function (object) { + if (object.parentNode) { + var parentEntity = object.parentNode; + var parentRenderable = parentEntity.renderable; + var parentSortable = parentEntity.sortable; + if (parentRenderable) { + parentRenderable.dirty = true; + } + // need re-sort on parent + if (parentSortable) { + parentSortable.dirty = true; + parentSortable.dirtyReason = SortReason.Z_INDEX_CHANGED; + } + } + }; + return CSSPropertyZIndex; + })(); + + var CircleUpdater = /** @class */ (function () { + function CircleUpdater() {} + CircleUpdater.prototype.update = function (parsedStyle, object) { + var _a = parsedStyle.cx, + cx = _a === void 0 ? 0 : _a, + _b = parsedStyle.cy, + cy = _b === void 0 ? 0 : _b, + _c = parsedStyle.r, + r = _c === void 0 ? 0 : _c; + return { + cx: cx, + cy: cy, + hwidth: r, + hheight: r, + }; + }; + return CircleUpdater; + })(); + + var EllipseUpdater = /** @class */ (function () { + function EllipseUpdater() {} + EllipseUpdater.prototype.update = function (parsedStyle, object) { + var _a = parsedStyle.cx, + cx = _a === void 0 ? 0 : _a, + _b = parsedStyle.cy, + cy = _b === void 0 ? 0 : _b, + _c = parsedStyle.rx, + rx = _c === void 0 ? 0 : _c, + _d = parsedStyle.ry, + ry = _d === void 0 ? 0 : _d; + return { + cx: cx, + cy: cy, + hwidth: rx, + hheight: ry, + }; + }; + return EllipseUpdater; + })(); + + var LineUpdater = /** @class */ (function () { + function LineUpdater() {} + LineUpdater.prototype.update = function (parsedStyle) { + var x1 = parsedStyle.x1, + y1 = parsedStyle.y1, + x2 = parsedStyle.x2, + y2 = parsedStyle.y2; + var minX = Math.min(x1, x2); + var maxX = Math.max(x1, x2); + var minY = Math.min(y1, y2); + var maxY = Math.max(y1, y2); + var width = maxX - minX; + var height = maxY - minY; + var hwidth = width / 2; + var hheight = height / 2; + return { + cx: minX + hwidth, + cy: minY + hheight, + hwidth: hwidth, + hheight: hheight, + }; + }; + return LineUpdater; + })(); + + var PathUpdater = /** @class */ (function () { + function PathUpdater() {} + PathUpdater.prototype.update = function (parsedStyle) { + var d = parsedStyle.d; + var _a = d.rect, + x = _a.x, + y = _a.y, + width = _a.width, + height = _a.height; + var hwidth = width / 2; + var hheight = height / 2; + return { + cx: x + hwidth, + cy: y + hheight, + hwidth: hwidth, + hheight: hheight, + }; + }; + return PathUpdater; + })(); + + var PolylineUpdater = /** @class */ (function () { + function PolylineUpdater() {} + PolylineUpdater.prototype.update = function (parsedStyle) { + if (parsedStyle.points && isArray(parsedStyle.points.points)) { + var points = parsedStyle.points.points; + // FIXME: account for miter lineJoin + var minX = Math.min.apply( + Math, + __spreadArray( + [], + __read( + points.map(function (point) { + return point[0]; + }) + ), + false + ) + ); + var maxX = Math.max.apply( + Math, + __spreadArray( + [], + __read( + points.map(function (point) { + return point[0]; + }) + ), + false + ) + ); + var minY = Math.min.apply( + Math, + __spreadArray( + [], + __read( + points.map(function (point) { + return point[1]; + }) + ), + false + ) + ); + var maxY = Math.max.apply( + Math, + __spreadArray( + [], + __read( + points.map(function (point) { + return point[1]; + }) + ), + false + ) + ); + var width = maxX - minX; + var height = maxY - minY; + var hwidth = width / 2; + var hheight = height / 2; + return { + cx: minX + hwidth, + cy: minY + hheight, + hwidth: hwidth, + hheight: hheight, + }; + } + return { + cx: 0, + cy: 0, + hwidth: 0, + hheight: 0, + }; + }; + return PolylineUpdater; + })(); + + var RectUpdater = /** @class */ (function () { + function RectUpdater() {} + RectUpdater.prototype.update = function (parsedStyle, object) { + var _a = parsedStyle.x, + x = _a === void 0 ? 0 : _a, + _b = parsedStyle.y, + y = _b === void 0 ? 0 : _b, + src = parsedStyle.src, + _c = parsedStyle.width, + width = _c === void 0 ? 0 : _c, + _d = parsedStyle.height, + height = _d === void 0 ? 0 : _d; + var contentWidth = width; + var contentHeight = height; + // resize with HTMLImageElement's size + if (src && !isString(src)) { + if (!contentWidth) { + contentWidth = src.width; + parsedStyle.width = contentWidth; + } + if (!contentHeight) { + contentHeight = src.height; + parsedStyle.height = contentHeight; + } + } + return { + cx: x + contentWidth / 2, + cy: y + contentHeight / 2, + hwidth: contentWidth / 2, + hheight: contentHeight / 2, + }; + }; + return RectUpdater; + })(); + + var TextUpdater = /** @class */ (function () { + function TextUpdater(globalRuntime) { + this.globalRuntime = globalRuntime; + } + TextUpdater.prototype.isReadyToMeasure = function (parsedStyle, object) { + var text = parsedStyle.text, + textAlign = parsedStyle.textAlign, + textBaseline = parsedStyle.textBaseline, + fontSize = parsedStyle.fontSize, + fontStyle = parsedStyle.fontStyle, + fontWeight = parsedStyle.fontWeight, + fontVariant = parsedStyle.fontVariant, + lineWidth = parsedStyle.lineWidth; + return runtime.enableCSSParsing + ? text && + fontSize && + fontStyle && + fontWeight && + fontVariant && + textAlign && + textBaseline && + !isNil(lineWidth) + : text; + }; + TextUpdater.prototype.update = function (parsedStyle, object) { + var _a, _b; + var text = parsedStyle.text, + _c = parsedStyle.textAlign, + textAlign = _c === void 0 ? 'start' : _c, + _d = parsedStyle.lineWidth, + lineWidth = _d === void 0 ? 1 : _d, + _e = parsedStyle.textBaseline, + textBaseline = _e === void 0 ? 'alphabetic' : _e, + _f = parsedStyle.dx, + dx = _f === void 0 ? 0 : _f, + _g = parsedStyle.dy, + dy = _g === void 0 ? 0 : _g, + _h = parsedStyle.x, + x = _h === void 0 ? 0 : _h, + _j = parsedStyle.y, + y = _j === void 0 ? 0 : _j; + if (!this.isReadyToMeasure(parsedStyle, object)) { + parsedStyle.metrics = { + font: '', + width: 0, + height: 0, + lines: [], + lineWidths: [], + lineHeight: 0, + maxLineWidth: 0, + fontProperties: { + ascent: 0, + descent: 0, + fontSize: 0, + }, + lineMetrics: [], + }; + return { + hwidth: 0, + hheight: 0, + cx: 0, + cy: 0, + }; + } + var offscreenCanvas = ( + ((_b = + (_a = object === null || object === void 0 ? void 0 : object.ownerDocument) === null || + _a === void 0 + ? void 0 + : _a.defaultView) === null || _b === void 0 + ? void 0 + : _b.getConfig()) || {} + ).offscreenCanvas; + var metrics = this.globalRuntime.textService.measureText(text, parsedStyle, offscreenCanvas); + parsedStyle.metrics = metrics; + var width = metrics.width, + height = metrics.height, + lineHeight = metrics.lineHeight, + fontProperties = metrics.fontProperties; + var hwidth = width / 2; + var hheight = height / 2; + // default 'left' + var lineXOffset = x + hwidth; + if (textAlign === 'center' || textAlign === 'middle') { + lineXOffset += lineWidth / 2 - hwidth; + } else if (textAlign === 'right' || textAlign === 'end') { + lineXOffset += lineWidth - hwidth * 2; + } + var lineYOffset = y - hheight; + if (textBaseline === 'middle') { + // eslint-disable-next-line prefer-destructuring + lineYOffset += hheight; + } else if (textBaseline === 'top' || textBaseline === 'hanging') { + lineYOffset += hheight * 2; + } else if (textBaseline === 'alphabetic') { + // prevent calling getImageData for ascent metrics + lineYOffset += this.globalRuntime.enableCSSParsing ? lineHeight - fontProperties.ascent : 0; + } else if (textBaseline === 'bottom' || textBaseline === 'ideographic') { + lineYOffset += 0; + } + // TODO: ideographic & bottom + if (dx) { + lineXOffset += dx; + } + if (dy) { + lineYOffset += dy; + } + return { + cx: lineXOffset, + cy: lineYOffset, + hwidth: hwidth, + hheight: hheight, + }; + }; + return TextUpdater; + })(); + + var GroupUpdater = /** @class */ (function () { + function GroupUpdater() {} + GroupUpdater.prototype.update = function (parsedStyle, object) { + return { + cx: 0, + cy: 0, + hwidth: 0, + hheight: 0, + }; + }; + return GroupUpdater; + })(); + + function isFederatedEvent(value) { + return !!value.type; + } + /** + * An DOM-compatible synthetic event implementation that is "forwarded" on behalf of an original + * FederatedEvent or native Event. + */ + var FederatedEvent = /** @class */ (function () { + /** + * The event boundary which manages this event. Propagation can only occur + * within the boundary's jurisdiction. + */ + function FederatedEvent(manager) { + /** + * The propagation phase. + * @see https://developer.mozilla.org/en-US/docs/Web/API/Event/eventPhase + */ + this.eventPhase = FederatedEvent.prototype.NONE; + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Event/bubbles + */ + this.bubbles = true; + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Event/cancelBubble + */ + this.cancelBubble = true; + /** + * @see https://developer.mozilla.org/en-US/docs/Web/API/Event/cancelable + */ + this.cancelable = false; + /** Flags whether the default response of the user agent was prevent through this event. */ + this.defaultPrevented = false; + /** Flags whether propagation was stopped. */ + this.propagationStopped = false; + /** Flags whether propagation was immediately stopped. */ + this.propagationImmediatelyStopped = false; + /** + * The coordinates of the evnet relative to the nearest DOM layer. + * This is a non-standard property. + */ + this.layer = new Point(); + /** + * The coordinates of the event relative to the DOM document. + * This is a non-standard property. + * relative to the DOM document. + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/MouseEvent/pageX + */ + this.page = new Point(); + /** + * relative to Canvas, origin is left-top + */ + this.canvas = new Point(); + /** + * relative to Viewport, account for Camera + */ + this.viewport = new Point(); + this.composed = false; + this.NONE = 0; + this.CAPTURING_PHASE = 1; + this.AT_TARGET = 2; + this.BUBBLING_PHASE = 3; + this.manager = manager; + } + Object.defineProperty(FederatedEvent.prototype, 'name', { + /** + * @deprecated + */ + get: function () { + return this.type; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(FederatedEvent.prototype, 'layerX', { + get: function () { + return this.layer.x; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(FederatedEvent.prototype, 'layerY', { + get: function () { + return this.layer.y; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(FederatedEvent.prototype, 'pageX', { + get: function () { + return this.page.x; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(FederatedEvent.prototype, 'pageY', { + get: function () { + return this.page.y; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(FederatedEvent.prototype, 'x', { + get: function () { + return this.canvas.x; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(FederatedEvent.prototype, 'y', { + get: function () { + return this.canvas.y; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(FederatedEvent.prototype, 'canvasX', { + get: function () { + return this.canvas.x; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(FederatedEvent.prototype, 'canvasY', { + get: function () { + return this.canvas.y; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(FederatedEvent.prototype, 'viewportX', { + get: function () { + return this.viewport.x; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(FederatedEvent.prototype, 'viewportY', { + get: function () { + return this.viewport.y; + }, + enumerable: false, + configurable: true, + }); + /** + * The propagation path for this event + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Event/composedPath + * + * So composedPath()[0] represents the original target. + * @see https://polymer-library.polymer-project.org/3.0/docs/devguide/events#retargeting + */ + FederatedEvent.prototype.composedPath = function () { + if (this.manager && (!this.path || this.path[0] !== this.target)) { + this.path = this.target ? this.manager.propagationPath(this.target) : []; + } + return this.path; + }; + Object.defineProperty(FederatedEvent.prototype, 'propagationPath', { + /** + * @deprecated + */ + get: function () { + return this.composedPath(); + }, + enumerable: false, + configurable: true, + }); + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Event/preventDefault + */ + FederatedEvent.prototype.preventDefault = function () { + if (this.nativeEvent instanceof Event && this.nativeEvent.cancelable) { + this.nativeEvent.preventDefault(); + } + this.defaultPrevented = true; + }; + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Event/stopImmediatePropagation + */ + FederatedEvent.prototype.stopImmediatePropagation = function () { + this.propagationImmediatelyStopped = true; + }; + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Event/stopPropagation + */ + FederatedEvent.prototype.stopPropagation = function () { + this.propagationStopped = true; + }; + /** + * added for compatibility with DOM Event, + * deprecated props and methods + */ + FederatedEvent.prototype.initEvent = function () {}; + FederatedEvent.prototype.initUIEvent = function () {}; + FederatedEvent.prototype.clone = function () { + throw new Error(ERROR_MSG_METHOD_NOT_IMPLEMENTED); + }; + return FederatedEvent; + })(); + + var FederatedMouseEvent = /** @class */ (function (_super) { + __extends(FederatedMouseEvent, _super); + function FederatedMouseEvent() { + var _this = _super.apply(this, __spreadArray([], __read(arguments), false)) || this; + /** + * The coordinates of the mouse event relative to the canvas. + */ + _this.client = new Point(); + /** + * The movement in this pointer relative to the last `mousemove` event. + */ + _this.movement = new Point(); + /** + * The offset of the pointer coordinates w.r.t. target DisplayObject in world space. This is + * not supported at the moment. + */ + _this.offset = new Point(); + /** + * The pointer coordinates in world space. + */ + _this.global = new Point(); + /** + * The pointer coordinates in sceen space. + */ + _this.screen = new Point(); + return _this; + } + Object.defineProperty(FederatedMouseEvent.prototype, 'clientX', { + get: function () { + return this.client.x; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(FederatedMouseEvent.prototype, 'clientY', { + get: function () { + return this.client.y; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(FederatedMouseEvent.prototype, 'movementX', { + get: function () { + return this.movement.x; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(FederatedMouseEvent.prototype, 'movementY', { + get: function () { + return this.movement.y; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(FederatedMouseEvent.prototype, 'offsetX', { + get: function () { + return this.offset.x; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(FederatedMouseEvent.prototype, 'offsetY', { + get: function () { + return this.offset.y; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(FederatedMouseEvent.prototype, 'globalX', { + get: function () { + return this.global.x; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(FederatedMouseEvent.prototype, 'globalY', { + get: function () { + return this.global.y; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(FederatedMouseEvent.prototype, 'screenX', { + get: function () { + return this.screen.x; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(FederatedMouseEvent.prototype, 'screenY', { + get: function () { + return this.screen.y; + }, + enumerable: false, + configurable: true, + }); + FederatedMouseEvent.prototype.getModifierState = function (key) { + return 'getModifierState' in this.nativeEvent && this.nativeEvent.getModifierState(key); + }; + FederatedMouseEvent.prototype.initMouseEvent = function () { + throw new Error(ERROR_MSG_METHOD_NOT_IMPLEMENTED); + }; + return FederatedMouseEvent; + })(FederatedEvent); + + // @ts-ignore + var FederatedPointerEvent = /** @class */ (function (_super) { + __extends(FederatedPointerEvent, _super); + function FederatedPointerEvent() { + var _this = _super.apply(this, __spreadArray([], __read(arguments), false)) || this; + /** + * The width of the pointer's contact along the x-axis, measured in CSS pixels. + * radiusX of TouchEvents will be represented by this value. + * + * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/width + */ + _this.width = 0; + /** + * The height of the pointer's contact along the y-axis, measured in CSS pixels. + * radiusY of TouchEvents will be represented by this value. + * + * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/height + */ + _this.height = 0; + /** + * Indicates whether or not the pointer device that created the event is the primary pointer. + * + * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/isPrimary + */ + _this.isPrimary = false; + return _this; + } + /** + * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/getCoalescedEvents + */ + FederatedPointerEvent.prototype.getCoalescedEvents = function () { + if (this.type === 'pointermove' || this.type === 'mousemove' || this.type === 'touchmove') { + // @ts-ignore + return [this]; + } + return []; + }; + /** + * @see https://chromestatus.com/feature/5765569655603200 + */ + FederatedPointerEvent.prototype.getPredictedEvents = function () { + throw new Error('getPredictedEvents is not supported!'); + }; + /** + * @see https://github.com/antvis/G/issues/1115 + * We currently reuses event objects in the event system, + * avoiding the creation of a large number of event objects. + * Reused objects are only used to carry different data, + * such as coordinate information, native event objects, + * and therefore the lifecycle is limited to the event handler, + * which can lead to unintended consequences if an attempt is made to cache the entire event object. + * + * Therefore, while keeping the above performance considerations in mind, it is possible to provide a clone method that creates a new object when the user really wants to cache it, e.g. + */ + FederatedPointerEvent.prototype.clone = function () { + return this.manager.clonePointerEvent(this); + }; + return FederatedPointerEvent; + })(FederatedMouseEvent); + + // @ts-ignore + var FederatedWheelEvent = /** @class */ (function (_super) { + __extends(FederatedWheelEvent, _super); + function FederatedWheelEvent() { + return (_super !== null && _super.apply(this, arguments)) || this; + } + FederatedWheelEvent.prototype.clone = function () { + return this.manager.cloneWheelEvent(this); + }; + return FederatedWheelEvent; + })(FederatedMouseEvent); + + /** + * @see https://developer.mozilla.org/en-US/docs/Web/Events/Creating_and_triggering_events + * + * @example + const event = new CustomEvent('build', { detail: { prop1: 'xx' } }); + circle.addEventListener('build', (e) => { + e.target; // circle + e.detail; // { prop1: 'xx' } + }); + + circle.dispatchEvent(event); + */ + var CustomEvent = /** @class */ (function (_super) { + __extends(CustomEvent, _super); + // eslint-disable-next-line @typescript-eslint/ban-types + function CustomEvent(eventName, object) { + var _this = _super.call(this, null) || this; + _this.type = eventName; + _this.detail = object; + // compatible with G 3.0 + Object.assign(_this, object); + return _this; + } + return CustomEvent; + })(FederatedEvent); + + var DELEGATION_SPLITTER = ':'; + /** + * Objects that can receive events and may have listeners for them. + * eg. Element, Canvas, DisplayObject + * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget + */ + var EventTarget = /** @class */ (function () { + function EventTarget() { + /** + * event emitter + */ + this.emitter = new eventemitter3(); + } + /** + * @deprecated + * @alias addEventListener + */ + EventTarget.prototype.on = function (type, listener, options) { + this.addEventListener(type, listener, options); + return this; + }; + /** + * support `capture` & `once` in options + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/EventTarget/addEventListener + */ + EventTarget.prototype.addEventListener = function (type, listener, options) { + var capture = (isBoolean(options) && options) || (isObject(options) && options.capture); + var once = isObject(options) && options.once; + var context = isFunction$1(listener) ? undefined : listener; + // compatible with G 3.0 + // support using delegate name in event type, eg. 'node:click' + var useDelegatedName = false; + var delegatedName = ''; + if (type.indexOf(DELEGATION_SPLITTER) > -1) { + var _a = __read(type.split(DELEGATION_SPLITTER), 2), + name_1 = _a[0], + eventType = _a[1]; + type = eventType; + delegatedName = name_1; + useDelegatedName = true; + } + type = capture ? ''.concat(type, 'capture') : type; + listener = isFunction$1(listener) ? listener : listener.handleEvent; + // compatible with G 3.0 + if (useDelegatedName) { + var originListener_1 = listener; + listener = function () { + var _a; + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if ( + ((_a = args[0].target) === null || _a === void 0 ? void 0 : _a.name) !== delegatedName + ) { + return; + } + // @ts-ignore + originListener_1.apply(void 0, __spreadArray([], __read(args), false)); + }; + } + if (once) { + this.emitter.once(type, listener, context); + } else { + this.emitter.on(type, listener, context); + } + return this; + }; + /** + * @deprecated + * @alias removeEventListener + */ + EventTarget.prototype.off = function (type, listener, options) { + if (type) { + this.removeEventListener(type, listener, options); + } else { + // remove all listeners + this.removeAllEventListeners(); + } + return this; + }; + EventTarget.prototype.removeAllEventListeners = function () { + this.emitter.removeAllListeners(); + }; + EventTarget.prototype.removeEventListener = function (type, listener, options) { + var capture = (isBoolean(options) && options) || (isObject(options) && options.capture); + var context = isFunction$1(listener) ? undefined : listener; + type = capture ? ''.concat(type, 'capture') : type; + listener = isFunction$1(listener) + ? listener + : listener === null || listener === void 0 + ? void 0 + : listener.handleEvent; + this.emitter.off(type, listener, context); + return this; + }; + /** + * @deprecated + * @alias dispatchEvent + */ + // eslint-disable-next-line @typescript-eslint/ban-types + EventTarget.prototype.emit = function (eventName, object) { + this.dispatchEvent(new CustomEvent(eventName, object)); + }; + /** + * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent + */ + EventTarget.prototype.dispatchEvent = function (e, skipPropagate) { + var _a, _b; + if (skipPropagate === void 0) { + skipPropagate = false; + } + if (!isFederatedEvent(e)) { + throw new Error( + 'DisplayObject cannot propagate events outside of the Federated Events API' + ); + } + // should account for Element / Document / Canvas + var canvas; + // @ts-ignore + if (this.document) { + canvas = this; + // @ts-ignore + } else if (this.defaultView) { + canvas = this.defaultView; + } else { + canvas = (_a = this.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView; + } + // assign event manager + if (canvas) { + e.manager = canvas.getEventService() || null; + if (!e.manager) { + return false; + } + e.defaultPrevented = false; + e.path = []; + if (!skipPropagate) { + e.target = this; + } + (_b = e.manager) === null || _b === void 0 + ? void 0 + : _b.dispatchEvent(e, e.type, skipPropagate); + } + return !e.defaultPrevented; + }; + return EventTarget; + })(); + + /** + * @see https://developer.mozilla.org/en-US/docs/Web/API/Node + */ + var Node = /** @class */ (function (_super) { + __extends(Node, _super); + function Node() { + var _this = _super.call(this) || this; + _this.shadow = false; + /** + * points to canvas.document + * @see https://developer.mozilla.org/en-US/docs/Web/API/Node/ownerDocument + */ + _this.ownerDocument = null; + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Node/isConnected + * @example + circle.isConnected; // false + canvas.appendChild(circle); + circle.isConnected; // true + */ + _this.isConnected = false; + /** + * Returns node's node document's document base URL. + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Node + */ + _this.baseURI = ''; + /** + * Returns the children. + * @see https://developer.mozilla.org/en-US/docs/Web/API/Node/childNodes + */ + _this.childNodes = []; + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Node/nodeType + */ + _this.nodeType = 0; + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Node/nodeName + */ + _this.nodeName = ''; + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Node/nodeValue + */ + _this.nodeValue = null; + /** + * @see https://developer.mozilla.org/en-US/docs/Web/API/ParentNode + */ + _this.parentNode = null; + return _this; + } + Node.isNode = function (target) { + return !!target.childNodes; + }; + Object.defineProperty(Node.prototype, 'textContent', { + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Node/textContent + */ + get: function () { + var e_1, _a; + var out = ''; + if (this.nodeName === Shape.TEXT) { + // @ts-ignore + out += this.style.text; + } + try { + for (var _b = __values(this.childNodes), _c = _b.next(); !_c.done; _c = _b.next()) { + var child = _c.value; + if (child.nodeName === Shape.TEXT) { + out += child.nodeValue; + } else { + out += child.textContent; + } + } + } catch (e_1_1) { + e_1 = { error: e_1_1 }; + } finally { + try { + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } finally { + if (e_1) throw e_1.error; + } + } + return out; + }, + set: function (content) { + var _this = this; + // remove all children + this.childNodes.slice().forEach(function (child) { + _this.removeChild(child); + }); + if (this.nodeName === Shape.TEXT) { + // @ts-ignore + this.style.text = ''.concat(content); + } + }, + enumerable: false, + configurable: true, + }); + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Node/getRootNode + */ + Node.prototype.getRootNode = function (opts) { + if (opts === void 0) { + opts = {}; + } + if (this.parentNode) { + return this.parentNode.getRootNode(opts); + } + if (opts.composed && this.host) { + return this.host.getRootNode(opts); + } + return this; + }; + Node.prototype.hasChildNodes = function () { + return this.childNodes.length > 0; + }; + Node.prototype.isDefaultNamespace = function (namespace) { + throw new Error(ERROR_MSG_METHOD_NOT_IMPLEMENTED); + }; + Node.prototype.lookupNamespaceURI = function (prefix) { + throw new Error(ERROR_MSG_METHOD_NOT_IMPLEMENTED); + }; + Node.prototype.lookupPrefix = function (namespace) { + throw new Error(ERROR_MSG_METHOD_NOT_IMPLEMENTED); + }; + Node.prototype.normalize = function () { + throw new Error(ERROR_MSG_METHOD_NOT_IMPLEMENTED); + }; + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Node/isEqualNode + */ + Node.prototype.isEqualNode = function (otherNode) { + // TODO: compare 2 nodes, not sameness + return this === otherNode; + }; + Node.prototype.isSameNode = function (otherNode) { + return this.isEqualNode(otherNode); + }; + Object.defineProperty(Node.prototype, 'parent', { + /** + * @deprecated + * @alias parentNode + */ + get: function () { + return this.parentNode; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(Node.prototype, 'parentElement', { + get: function () { + return null; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(Node.prototype, 'nextSibling', { + get: function () { + return null; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(Node.prototype, 'previousSibling', { + get: function () { + return null; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(Node.prototype, 'firstChild', { + get: function () { + return this.childNodes.length > 0 ? this.childNodes[0] : null; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(Node.prototype, 'lastChild', { + get: function () { + return this.childNodes.length > 0 ? this.childNodes[this.childNodes.length - 1] : null; + }, + enumerable: false, + configurable: true, + }); + /** + * @see https://developer.mozilla.org/en-US/docs/Web/API/Node/compareDocumentPosition + * @see https://github.com/b-fuze/deno-dom/blob/master/src/dom/node.ts#L338 + */ + Node.prototype.compareDocumentPosition = function (other) { + var _a; + if (other === this) { + // same node + return 0; + } + // if (!(other instanceof Node)) { + // throw new TypeError( + // 'Node.compareDocumentPosition: Argument 1 does not implement interface Node.', + // ); + // } + var node1Root = other; + // eslint-disable-next-line @typescript-eslint/no-this-alias + var node2Root = this; + var node1Hierarchy = [node1Root]; + var node2Hierarchy = [node2Root]; + while ((_a = node1Root.parentNode) !== null && _a !== void 0 ? _a : node2Root.parentNode) { + node1Root = node1Root.parentNode + ? (node1Hierarchy.push(node1Root.parentNode), node1Root.parentNode) + : node1Root; + node2Root = node2Root.parentNode + ? (node2Hierarchy.push(node2Root.parentNode), node2Root.parentNode) + : node2Root; + } + // Check if they don't share the same root node + if (node1Root !== node2Root) { + return ( + Node.DOCUMENT_POSITION_DISCONNECTED | + Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | + Node.DOCUMENT_POSITION_PRECEDING + ); + } + var longerHierarchy = + node1Hierarchy.length > node2Hierarchy.length ? node1Hierarchy : node2Hierarchy; + var shorterHierarchy = longerHierarchy === node1Hierarchy ? node2Hierarchy : node1Hierarchy; + // Check if either is a container of the other + if ( + longerHierarchy[longerHierarchy.length - shorterHierarchy.length] === shorterHierarchy[0] + ) { + return longerHierarchy === node1Hierarchy + ? // other is a child of this + Node.DOCUMENT_POSITION_CONTAINED_BY | Node.DOCUMENT_POSITION_FOLLOWING + : // this is a child of other + Node.DOCUMENT_POSITION_CONTAINS | Node.DOCUMENT_POSITION_PRECEDING; + } + // Find their first common ancestor and see whether they + // are preceding or following + var longerStart = longerHierarchy.length - shorterHierarchy.length; + for (var i = shorterHierarchy.length - 1; i >= 0; i--) { + var shorterHierarchyNode = shorterHierarchy[i]; + var longerHierarchyNode = longerHierarchy[longerStart + i]; + // We found the first common ancestor + if (longerHierarchyNode !== shorterHierarchyNode) { + var siblings = shorterHierarchyNode.parentNode.childNodes; + if (siblings.indexOf(shorterHierarchyNode) < siblings.indexOf(longerHierarchyNode)) { + // Shorter is before longer + if (shorterHierarchy === node1Hierarchy) { + // Other is before this + return Node.DOCUMENT_POSITION_PRECEDING; + } else { + // This is before other + return Node.DOCUMENT_POSITION_FOLLOWING; + } + } else { + // Longer is before shorter + if (longerHierarchy === node1Hierarchy) { + // Other is before this + return Node.DOCUMENT_POSITION_PRECEDING; + } else { + // Other is after this + return Node.DOCUMENT_POSITION_FOLLOWING; + } + } + } + } + return Node.DOCUMENT_POSITION_FOLLOWING; + }; + /** + * @deprecated + * @alias contains + */ + Node.prototype.contain = function (other) { + return this.contains(other); + }; + Node.prototype.contains = function (other) { + // the node itself, one of its direct children + var tmp = other; + // @see https://developer.mozilla.org/en-US/docs/Web/API/Node/contains + while (tmp && this !== tmp) { + tmp = tmp.parentNode; + } + return !!tmp; + }; + Node.prototype.getAncestor = function (n) { + // eslint-disable-next-line @typescript-eslint/no-this-alias + var temp = this; + while (n > 0 && temp) { + temp = temp.parentNode; + n--; + } + return temp; + }; + Node.prototype.forEach = function (callback, assigned) { + if (assigned === void 0) { + assigned = false; + } + if (!callback(this)) { + (assigned ? this.childNodes.slice() : this.childNodes).forEach(function (child) { + child.forEach(callback); + }); + } + }; + /** + * Both nodes are in different documents or different trees in the same document. + */ + Node.DOCUMENT_POSITION_DISCONNECTED = 1; + /** + * otherNode precedes the node in either a pre-order depth-first traversal + * of a tree containing both (e.g., as an ancestor or previous sibling or a descendant of a previous sibling or previous sibling of an ancestor) or (if they are disconnected) in an arbitrary but consistent ordering. + */ + Node.DOCUMENT_POSITION_PRECEDING = 2; + /** + * otherNode follows the node in either a pre-order depth-first traversal of a tree containing both (e.g., as a descendant or following sibling or a descendant of a following sibling or following sibling of an ancestor) or (if they are disconnected) in an arbitrary but consistent ordering. + */ + Node.DOCUMENT_POSITION_FOLLOWING = 4; + /** + * otherNode is an ancestor of the node. + */ + Node.DOCUMENT_POSITION_CONTAINS = 8; + /** + * otherNode is a descendant of the node. + */ + Node.DOCUMENT_POSITION_CONTAINED_BY = 16; + /** + * The result relies upon arbitrary and/or implementation-specific behavior and is not guaranteed to be portable. + */ + Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 32; + return Node; + })(EventTarget); + + var PROPAGATION_LIMIT = 2048; + var EventService = /** @class */ (function () { + function EventService(globalRuntime, context) { + var _this = this; + this.globalRuntime = globalRuntime; + this.context = context; + this.emitter = new eventemitter3(); + /** + * Store HTML elements in current canvas. + */ + this.nativeHTMLMap = new WeakMap(); + this.cursor = 'default'; + this.mappingTable = {}; + this.mappingState = { + trackingData: {}, + }; + this.eventPool = new Map(); + this.tmpMatrix = create$1(); + this.tmpVec3 = create$2(); + this.onPointerDown = function (from) { + var e = _this.createPointerEvent(from); + _this.dispatchEvent(e, 'pointerdown'); + if (e.pointerType === 'touch') { + _this.dispatchEvent(e, 'touchstart'); + } else if (e.pointerType === 'mouse' || e.pointerType === 'pen') { + var isRightButton = e.button === 2; + _this.dispatchEvent(e, isRightButton ? 'rightdown' : 'mousedown'); + } + var trackingData = _this.trackingData(from.pointerId); + trackingData.pressTargetsByButton[from.button] = e.composedPath(); + _this.freeEvent(e); + }; + this.onPointerUp = function (from) { + var _a; + var now = clock.now(); + var e = _this.createPointerEvent( + from, + undefined, + undefined, + _this.context.config.alwaysTriggerPointerEventOnCanvas ? _this.rootTarget : undefined + ); + _this.dispatchEvent(e, 'pointerup'); + if (e.pointerType === 'touch') { + _this.dispatchEvent(e, 'touchend'); + } else if (e.pointerType === 'mouse' || e.pointerType === 'pen') { + var isRightButton = e.button === 2; + _this.dispatchEvent(e, isRightButton ? 'rightup' : 'mouseup'); + } + var trackingData = _this.trackingData(from.pointerId); + var pressTarget = _this.findMountedTarget(trackingData.pressTargetsByButton[from.button]); + var clickTarget = pressTarget; + // pointerupoutside only bubbles. It only bubbles upto the parent that doesn't contain + // the pointerup location. + if (pressTarget && !e.composedPath().includes(pressTarget)) { + var currentTarget = pressTarget; + while (currentTarget && !e.composedPath().includes(currentTarget)) { + e.currentTarget = currentTarget; + _this.notifyTarget(e, 'pointerupoutside'); + if (e.pointerType === 'touch') { + _this.notifyTarget(e, 'touchendoutside'); + } else if (e.pointerType === 'mouse' || e.pointerType === 'pen') { + var isRightButton = e.button === 2; + _this.notifyTarget(e, isRightButton ? 'rightupoutside' : 'mouseupoutside'); + } + if (Node.isNode(currentTarget)) { + currentTarget = currentTarget.parentNode; + } + } + delete trackingData.pressTargetsByButton[from.button]; + // currentTarget is the most specific ancestor holding both the pointerdown and pointerup + // targets. That is - it's our click target! + clickTarget = currentTarget; + } + if (clickTarget) { + var clickEvent = _this.clonePointerEvent(e, 'click'); + clickEvent.target = clickTarget; + clickEvent.path = []; + if (!trackingData.clicksByButton[from.button]) { + trackingData.clicksByButton[from.button] = { + clickCount: 0, + target: clickEvent.target, + timeStamp: now, + }; + } + var clickHistory = trackingData.clicksByButton[from.button]; + if (clickHistory.target === clickEvent.target && now - clickHistory.timeStamp < 200) { + ++clickHistory.clickCount; + } else { + clickHistory.clickCount = 1; + } + clickHistory.target = clickEvent.target; + clickHistory.timeStamp = now; + clickEvent.detail = clickHistory.clickCount; + // @see https://github.com/antvis/G/issues/1091 + if (!((_a = e.detail) === null || _a === void 0 ? void 0 : _a.preventClick)) { + if ( + !_this.context.config.useNativeClickEvent && + (clickEvent.pointerType === 'mouse' || clickEvent.pointerType === 'touch') + ) { + _this.dispatchEvent(clickEvent, 'click'); + } + _this.dispatchEvent(clickEvent, 'pointertap'); + } + _this.freeEvent(clickEvent); + } + _this.freeEvent(e); + }; + this.onPointerMove = function (from) { + var e = _this.createPointerEvent( + from, + undefined, + undefined, + _this.context.config.alwaysTriggerPointerEventOnCanvas ? _this.rootTarget : undefined + ); + var isMouse = e.pointerType === 'mouse' || e.pointerType === 'pen'; + var trackingData = _this.trackingData(from.pointerId); + var outTarget = _this.findMountedTarget(trackingData.overTargets); + // First pointerout/pointerleave + if (trackingData.overTargets && outTarget !== e.target) { + // pointerout always occurs on the overTarget when the pointer hovers over another element. + var outType = from.type === 'mousemove' ? 'mouseout' : 'pointerout'; + var outEvent = _this.createPointerEvent(from, outType, outTarget || undefined); + _this.dispatchEvent(outEvent, 'pointerout'); + if (isMouse) _this.dispatchEvent(outEvent, 'mouseout'); + // If the pointer exits overTarget and its descendants, then a pointerleave event is also fired. This event + // is dispatched to all ancestors that no longer capture the pointer. + if (!e.composedPath().includes(outTarget)) { + var leaveEvent = _this.createPointerEvent(from, 'pointerleave', outTarget || undefined); + leaveEvent.eventPhase = leaveEvent.AT_TARGET; + while (leaveEvent.target && !e.composedPath().includes(leaveEvent.target)) { + leaveEvent.currentTarget = leaveEvent.target; + _this.notifyTarget(leaveEvent); + if (isMouse) { + _this.notifyTarget(leaveEvent, 'mouseleave'); + } + if (Node.isNode(leaveEvent.target)) { + leaveEvent.target = leaveEvent.target.parentNode; + } + } + _this.freeEvent(leaveEvent); + } + _this.freeEvent(outEvent); + } + // Then pointerover + if (outTarget !== e.target) { + // pointerover always occurs on the new overTarget + var overType = from.type === 'mousemove' ? 'mouseover' : 'pointerover'; + var overEvent = _this.clonePointerEvent(e, overType); // clone faster + _this.dispatchEvent(overEvent, 'pointerover'); + if (isMouse) _this.dispatchEvent(overEvent, 'mouseover'); + // Probe whether the newly hovered Node is an ancestor of the original overTarget. + var overTargetAncestor = outTarget && Node.isNode(outTarget) && outTarget.parentNode; + while ( + overTargetAncestor && + overTargetAncestor !== (Node.isNode(_this.rootTarget) && _this.rootTarget.parentNode) + ) { + if (overTargetAncestor === e.target) break; + overTargetAncestor = overTargetAncestor.parentNode; + } + // The pointer has entered a non-ancestor of the original overTarget. This means we need a pointerentered + // event. + var didPointerEnter = + !overTargetAncestor || + overTargetAncestor === (Node.isNode(_this.rootTarget) && _this.rootTarget.parentNode); + if (didPointerEnter) { + var enterEvent = _this.clonePointerEvent(e, 'pointerenter'); + enterEvent.eventPhase = enterEvent.AT_TARGET; + while ( + enterEvent.target && + enterEvent.target !== outTarget && + enterEvent.target !== (Node.isNode(_this.rootTarget) && _this.rootTarget.parentNode) + ) { + enterEvent.currentTarget = enterEvent.target; + _this.notifyTarget(enterEvent); + if (isMouse) _this.notifyTarget(enterEvent, 'mouseenter'); + if (Node.isNode(enterEvent.target)) { + enterEvent.target = enterEvent.target.parentNode; + } + } + _this.freeEvent(enterEvent); + } + _this.freeEvent(overEvent); + } + // Then pointermove + _this.dispatchEvent(e, 'pointermove'); + if (e.pointerType === 'touch') _this.dispatchEvent(e, 'touchmove'); + if (isMouse) { + _this.dispatchEvent(e, 'mousemove'); + _this.cursor = _this.getCursor(e.target); + } + trackingData.overTargets = e.composedPath(); + _this.freeEvent(e); + }; + this.onPointerOut = function (from) { + var trackingData = _this.trackingData(from.pointerId); + if (trackingData.overTargets) { + var isMouse = from.pointerType === 'mouse' || from.pointerType === 'pen'; + var outTarget = _this.findMountedTarget(trackingData.overTargets); + // pointerout first + var outEvent = _this.createPointerEvent(from, 'pointerout', outTarget || undefined); + _this.dispatchEvent(outEvent); + if (isMouse) _this.dispatchEvent(outEvent, 'mouseout'); + // pointerleave(s) are also dispatched b/c the pointer must've left rootTarget and its descendants to + // get an upstream pointerout event (upstream events do not know rootTarget has descendants). + var leaveEvent = _this.createPointerEvent(from, 'pointerleave', outTarget || undefined); + leaveEvent.eventPhase = leaveEvent.AT_TARGET; + while ( + leaveEvent.target && + leaveEvent.target !== (Node.isNode(_this.rootTarget) && _this.rootTarget.parentNode) + ) { + leaveEvent.currentTarget = leaveEvent.target; + _this.notifyTarget(leaveEvent); + if (isMouse) { + _this.notifyTarget(leaveEvent, 'mouseleave'); + } + if (Node.isNode(leaveEvent.target)) { + leaveEvent.target = leaveEvent.target.parentNode; + } + } + trackingData.overTargets = null; + _this.freeEvent(outEvent); + _this.freeEvent(leaveEvent); + } + _this.cursor = null; + }; + this.onPointerOver = function (from) { + var trackingData = _this.trackingData(from.pointerId); + var e = _this.createPointerEvent(from); + var isMouse = e.pointerType === 'mouse' || e.pointerType === 'pen'; + _this.dispatchEvent(e, 'pointerover'); + if (isMouse) _this.dispatchEvent(e, 'mouseover'); + if (e.pointerType === 'mouse') _this.cursor = _this.getCursor(e.target); + // pointerenter events must be fired since the pointer entered from upstream. + var enterEvent = _this.clonePointerEvent(e, 'pointerenter'); + enterEvent.eventPhase = enterEvent.AT_TARGET; + while ( + enterEvent.target && + enterEvent.target !== (Node.isNode(_this.rootTarget) && _this.rootTarget.parentNode) + ) { + enterEvent.currentTarget = enterEvent.target; + _this.notifyTarget(enterEvent); + if (isMouse) { + // mouseenter should not bubble + // @see https://developer.mozilla.org/en-US/docs/Web/API/Element/mouseenter_event#usage_notes + _this.notifyTarget(enterEvent, 'mouseenter'); + } + if (Node.isNode(enterEvent.target)) { + enterEvent.target = enterEvent.target.parentNode; + } + } + trackingData.overTargets = e.composedPath(); + _this.freeEvent(e); + _this.freeEvent(enterEvent); + }; + this.onPointerUpOutside = function (from) { + var trackingData = _this.trackingData(from.pointerId); + var pressTarget = _this.findMountedTarget(trackingData.pressTargetsByButton[from.button]); + var e = _this.createPointerEvent(from); + if (pressTarget) { + var currentTarget = pressTarget; + while (currentTarget) { + e.currentTarget = currentTarget; + _this.notifyTarget(e, 'pointerupoutside'); + if (e.pointerType === 'touch'); + else if (e.pointerType === 'mouse' || e.pointerType === 'pen') { + _this.notifyTarget(e, e.button === 2 ? 'rightupoutside' : 'mouseupoutside'); + } + if (Node.isNode(currentTarget)) { + currentTarget = currentTarget.parentNode; + } + } + delete trackingData.pressTargetsByButton[from.button]; + } + _this.freeEvent(e); + }; + this.onWheel = function (from) { + var wheelEvent = _this.createWheelEvent(from); + _this.dispatchEvent(wheelEvent); + _this.freeEvent(wheelEvent); + }; + this.onClick = function (from) { + if (_this.context.config.useNativeClickEvent) { + var e = _this.createPointerEvent(from); + _this.dispatchEvent(e); + _this.freeEvent(e); + } + }; + this.onPointerCancel = function (from) { + var e = _this.createPointerEvent( + from, + undefined, + undefined, + _this.context.config.alwaysTriggerPointerEventOnCanvas ? _this.rootTarget : undefined + ); + _this.dispatchEvent(e); + _this.freeEvent(e); + }; + } + EventService.prototype.init = function () { + this.rootTarget = this.context.renderingContext.root.parentNode; // document + this.addEventMapping('pointerdown', this.onPointerDown); + this.addEventMapping('pointerup', this.onPointerUp); + this.addEventMapping('pointermove', this.onPointerMove); + this.addEventMapping('pointerout', this.onPointerOut); + this.addEventMapping('pointerleave', this.onPointerOut); + this.addEventMapping('pointercancel', this.onPointerCancel); + this.addEventMapping('pointerover', this.onPointerOver); + this.addEventMapping('pointerupoutside', this.onPointerUpOutside); + this.addEventMapping('wheel', this.onWheel); + this.addEventMapping('click', this.onClick); + }; + EventService.prototype.destroy = function () { + this.emitter.removeAllListeners(); + this.mappingTable = {}; + this.mappingState = {}; + this.eventPool.clear(); + }; + EventService.prototype.getScale = function () { + var bbox = this.context.contextService.getBoundingClientRect(); + var scaleX = 1; + var scaleY = 1; + var $el = this.context.contextService.getDomElement(); + if ($el && bbox) { + var offsetWidth = $el.offsetWidth, + offsetHeight = $el.offsetHeight; + if (offsetWidth && offsetHeight) { + scaleX = bbox.width / offsetWidth; + scaleY = bbox.height / offsetHeight; + } + } + return { + scaleX: scaleX, + scaleY: scaleY, + bbox: bbox, + }; + }; + /** + * Should account for CSS Transform applied on container. + * @see https://github.com/antvis/G/issues/1161 + * @see https://github.com/antvis/G/issues/1677 + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/MouseEvent/offsetX + */ + EventService.prototype.client2Viewport = function (client) { + var _a = this.getScale(), + scaleX = _a.scaleX, + scaleY = _a.scaleY, + bbox = _a.bbox; + return new Point( + (client.x - ((bbox === null || bbox === void 0 ? void 0 : bbox.left) || 0)) / scaleX, + (client.y - ((bbox === null || bbox === void 0 ? void 0 : bbox.top) || 0)) / scaleY + ); + }; + EventService.prototype.viewport2Client = function (canvas) { + var _a = this.getScale(), + scaleX = _a.scaleX, + scaleY = _a.scaleY, + bbox = _a.bbox; + return new Point( + (canvas.x + ((bbox === null || bbox === void 0 ? void 0 : bbox.left) || 0)) * scaleX, + (canvas.y + ((bbox === null || bbox === void 0 ? void 0 : bbox.top) || 0)) * scaleY + ); + }; + EventService.prototype.viewport2Canvas = function (_a) { + var x = _a.x, + y = _a.y; + var canvas = this.rootTarget.defaultView; + var camera = canvas.getCamera(); + var _b = this.context.config, + width = _b.width, + height = _b.height; + var projectionMatrixInverse = camera.getPerspectiveInverse(); + var worldMatrix = camera.getWorldTransform(); + var vpMatrix = multiply(this.tmpMatrix, worldMatrix, projectionMatrixInverse); + var viewport = set$1(this.tmpVec3, (x / width) * 2 - 1, (1 - y / height) * 2 - 1, 0); + transformMat4(viewport, viewport, vpMatrix); + return new Point(viewport[0], viewport[1]); + }; + EventService.prototype.canvas2Viewport = function (canvasP) { + var canvas = this.rootTarget.defaultView; + var camera = canvas.getCamera(); + // World -> Clip + var projectionMatrix = camera.getPerspective(); + var viewMatrix = camera.getViewTransform(); + var vpMatrix = multiply(this.tmpMatrix, projectionMatrix, viewMatrix); + var clip = set$1(this.tmpVec3, canvasP.x, canvasP.y, 0); + transformMat4(this.tmpVec3, this.tmpVec3, vpMatrix); + // Clip -> NDC -> Viewport, flip Y + var _a = this.context.config, + width = _a.width, + height = _a.height; + return new Point(((clip[0] + 1) / 2) * width, (1 - (clip[1] + 1) / 2) * height); + }; + EventService.prototype.setPickHandler = function (pickHandler) { + this.pickHandler = pickHandler; + }; + EventService.prototype.addEventMapping = function (type, fn) { + if (!this.mappingTable[type]) { + this.mappingTable[type] = []; + } + this.mappingTable[type].push({ + fn: fn, + priority: 0, + }); + this.mappingTable[type].sort(function (a, b) { + return a.priority - b.priority; + }); + }; + EventService.prototype.mapEvent = function (e) { + if (!this.rootTarget) { + return; + } + var mappers = this.mappingTable[e.type]; + if (mappers) { + for (var i = 0, j = mappers.length; i < j; i++) { + mappers[i].fn(e); + } + } else { + console.warn('[EventService]: Event mapping not defined for '.concat(e.type)); + } + }; + EventService.prototype.dispatchEvent = function (e, type, skipPropagate) { + // Canvas should skip + if (!skipPropagate) { + e.propagationStopped = false; + e.propagationImmediatelyStopped = false; + this.propagate(e, type); + } else { + // target phase + e.eventPhase = e.AT_TARGET; + var canvas = this.rootTarget.defaultView || null; + e.currentTarget = canvas; + this.notifyListeners(e, type); + } + this.emitter.emit(type || e.type, e); + }; + EventService.prototype.propagate = function (e, type) { + if (!e.target) { + return; + } + // [target, parent, root, Canvas] + var composedPath = e.composedPath(); + // event flow: capture -> target -> bubbling + // capture phase + e.eventPhase = e.CAPTURING_PHASE; + for (var i = composedPath.length - 1; i >= 1; i--) { + e.currentTarget = composedPath[i]; + this.notifyTarget(e, type); + if (e.propagationStopped || e.propagationImmediatelyStopped) return; + } + // target phase + e.eventPhase = e.AT_TARGET; + e.currentTarget = e.target; + this.notifyTarget(e, type); + if (e.propagationStopped || e.propagationImmediatelyStopped) return; + // find current target in composed path + var index = composedPath.indexOf(e.currentTarget); + // bubbling phase + e.eventPhase = e.BUBBLING_PHASE; + for (var i = index + 1; i < composedPath.length; i++) { + e.currentTarget = composedPath[i]; + this.notifyTarget(e, type); + if (e.propagationStopped || e.propagationImmediatelyStopped) return; + } + }; + EventService.prototype.propagationPath = function (target) { + var propagationPath = [target]; + var canvas = this.rootTarget.defaultView || null; + if (canvas && canvas === target) { + propagationPath.unshift(canvas.document); + return propagationPath; + } + for (var i = 0; i < PROPAGATION_LIMIT && target !== this.rootTarget; i++) { + // if (Node.isNode(target) && !target.parentNode) { + // throw new Error('Cannot find propagation path to disconnected target'); + // } + if (Node.isNode(target) && target.parentNode) { + // [target, parent, parent, root] + propagationPath.push(target.parentNode); + target = target.parentNode; + } + } + if (canvas) { + // @ts-ignore + propagationPath.push(canvas); + } + return propagationPath; + }; + EventService.prototype.hitTest = function (position) { + var viewportX = position.viewportX, + viewportY = position.viewportY; + var _a = this.context.config, + width = _a.width, + height = _a.height, + disableHitTesting = _a.disableHitTesting; + // outside canvas + if (viewportX < 0 || viewportY < 0 || viewportX > width || viewportY > height) { + return null; + } + return ( + (!disableHitTesting && this.pickHandler(position)) || + this.rootTarget || // return Document + null + ); + }; + /** + * whether the native event trigger came from Canvas, + * should account for HTML shape + */ + EventService.prototype.isNativeEventFromCanvas = function ($el, nativeEvent) { + var target = nativeEvent === null || nativeEvent === void 0 ? void 0 : nativeEvent.target; + // Get event target inside a web component. + // @see https://stackoverflow.com/questions/57963312/get-event-target-inside-a-web-component + if (target === null || target === void 0 ? void 0 : target.shadowRoot) { + target = nativeEvent.composedPath()[0]; + } + if (target) { + // from + if (target === $el) { + return true; + } + // from + if ($el && $el.contains) { + return $el.contains(target); + } + } + if (nativeEvent === null || nativeEvent === void 0 ? void 0 : nativeEvent.composedPath) { + return nativeEvent.composedPath().indexOf($el) > -1; + } + // account for Touch + return false; + }; + /** + * Find HTML from composed path in native UI event. + */ + EventService.prototype.getExistedHTML = function (event) { + var e_1, _a; + if (event.nativeEvent.composedPath) { + try { + for ( + var _b = __values(event.nativeEvent.composedPath()), _c = _b.next(); + !_c.done; + _c = _b.next() + ) { + var eventTarget = _c.value; + var existed = this.nativeHTMLMap.get(eventTarget); + if (existed) { + return existed; + } + } + } catch (e_1_1) { + e_1 = { error: e_1_1 }; + } finally { + try { + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } finally { + if (e_1) throw e_1.error; + } + } + } + return null; + }; + EventService.prototype.pickTarget = function (event) { + return this.hitTest({ + clientX: event.clientX, + clientY: event.clientY, + viewportX: event.viewportX, + viewportY: event.viewportY, + x: event.canvasX, + y: event.canvasY, + }); + }; + EventService.prototype.createPointerEvent = function (from, type, target, fallbackTarget) { + var event = this.allocateEvent(FederatedPointerEvent); + this.copyPointerData(from, event); + this.copyMouseData(from, event); + this.copyData(from, event); + event.nativeEvent = from.nativeEvent; + event.originalEvent = from; + var existedHTML = this.getExistedHTML(event); + var $el = this.context.contextService.getDomElement(); + event.target = + target !== null && target !== void 0 + ? target + : existedHTML || + (this.isNativeEventFromCanvas($el, event.nativeEvent) && this.pickTarget(event)) || + fallbackTarget; + if (typeof type === 'string') { + event.type = type; + } + return event; + }; + EventService.prototype.createWheelEvent = function (from) { + var event = this.allocateEvent(FederatedWheelEvent); + this.copyWheelData(from, event); + this.copyMouseData(from, event); + this.copyData(from, event); + event.nativeEvent = from.nativeEvent; + event.originalEvent = from; + var existedHTML = this.getExistedHTML(event); + var $el = this.context.contextService.getDomElement(); + event.target = + existedHTML || + (this.isNativeEventFromCanvas($el, event.nativeEvent) && this.pickTarget(event)); + return event; + }; + EventService.prototype.trackingData = function (id) { + if (!this.mappingState.trackingData[id]) { + this.mappingState.trackingData[id] = { + pressTargetsByButton: {}, + clicksByButton: {}, + overTarget: null, + }; + } + return this.mappingState.trackingData[id]; + }; + EventService.prototype.cloneWheelEvent = function (from) { + var event = this.allocateEvent(FederatedWheelEvent); + event.nativeEvent = from.nativeEvent; + event.originalEvent = from.originalEvent; + this.copyWheelData(from, event); + this.copyMouseData(from, event); + this.copyData(from, event); + event.target = from.target; + event.path = from.composedPath().slice(); + event.type = from.type; + return event; + }; + EventService.prototype.clonePointerEvent = function (from, type) { + var event = this.allocateEvent(FederatedPointerEvent); + event.nativeEvent = from.nativeEvent; + event.originalEvent = from.originalEvent; + this.copyPointerData(from, event); + this.copyMouseData(from, event); + this.copyData(from, event); + event.target = from.target; + event.path = from.composedPath().slice(); + event.type = type !== null && type !== void 0 ? type : event.type; + return event; + }; + EventService.prototype.copyPointerData = function (from, to) { + // if ( + // !( + // from instanceof FederatedPointerEvent && + // to instanceof FederatedPointerEvent + // ) + // ) + // return; + to.pointerId = from.pointerId; + to.width = from.width; + to.height = from.height; + to.isPrimary = from.isPrimary; + to.pointerType = from.pointerType; + to.pressure = from.pressure; + to.tangentialPressure = from.tangentialPressure; + to.tiltX = from.tiltX; + to.tiltY = from.tiltY; + to.twist = from.twist; + }; + EventService.prototype.copyMouseData = function (from, to) { + // if ( + // !( + // from instanceof FederatedMouseEvent && to instanceof FederatedMouseEvent + // ) + // ) + // return; + to.altKey = from.altKey; + to.button = from.button; + to.buttons = from.buttons; + to.ctrlKey = from.ctrlKey; + to.metaKey = from.metaKey; + to.shiftKey = from.shiftKey; + to.client.copyFrom(from.client); + to.movement.copyFrom(from.movement); + to.canvas.copyFrom(from.canvas); + to.screen.copyFrom(from.screen); + to.global.copyFrom(from.global); + to.offset.copyFrom(from.offset); + }; + EventService.prototype.copyWheelData = function (from, to) { + to.deltaMode = from.deltaMode; + to.deltaX = from.deltaX; + to.deltaY = from.deltaY; + to.deltaZ = from.deltaZ; + }; + EventService.prototype.copyData = function (from, to) { + to.isTrusted = from.isTrusted; + to.timeStamp = clock.now(); + to.type = from.type; + to.detail = from.detail; + to.view = from.view; + to.page.copyFrom(from.page); + to.viewport.copyFrom(from.viewport); + }; + EventService.prototype.allocateEvent = function (constructor) { + if (!this.eventPool.has(constructor)) { + this.eventPool.set(constructor, []); + } + // @ts-ignore + var event = this.eventPool.get(constructor).pop() || new constructor(this); + event.eventPhase = event.NONE; + event.currentTarget = null; + event.path = []; + event.target = null; + return event; + }; + EventService.prototype.freeEvent = function (event) { + if (event.manager !== this) + throw new Error('It is illegal to free an event not managed by this EventBoundary!'); + var constructor = event.constructor; + if (!this.eventPool.has(constructor)) { + this.eventPool.set(constructor, []); + } + // @ts-ignore + this.eventPool.get(constructor).push(event); + }; + EventService.prototype.notifyTarget = function (e, type) { + type = type !== null && type !== void 0 ? type : e.type; + var key = + e.eventPhase === e.CAPTURING_PHASE || e.eventPhase === e.AT_TARGET + ? ''.concat(type, 'capture') + : type; + this.notifyListeners(e, key); + if (e.eventPhase === e.AT_TARGET) { + this.notifyListeners(e, type); + } + }; + EventService.prototype.notifyListeners = function (e, type) { + // hack EventEmitter, stops if the `propagationImmediatelyStopped` flag is set + // @ts-ignore + var emitter = e.currentTarget.emitter; + // @ts-ignore + var listeners = emitter._events[type]; + if (!listeners) return; + if ('fn' in listeners) { + if (listeners.once) { + emitter.removeListener(type, listeners.fn, undefined, true); + } + listeners.fn.call(e.currentTarget || listeners.context, e); + // listeners.fn.call(listeners.context, e); + } else { + for (var i = 0; i < listeners.length && !e.propagationImmediatelyStopped; i++) { + if (listeners[i].once) { + emitter.removeListener(type, listeners[i].fn, undefined, true); + } + listeners[i].fn.call(e.currentTarget || listeners[i].context, e); + // listeners[i].fn.call(listeners[i].context, e); + } + } + }; + /** + * some detached nodes may exist in propagation path, need to skip them + */ + EventService.prototype.findMountedTarget = function (propagationPath) { + if (!propagationPath) { + return null; + } + var currentTarget = propagationPath[propagationPath.length - 1]; + for (var i = propagationPath.length - 2; i >= 0; i--) { + var target = propagationPath[i]; + if ( + target === this.rootTarget || + (Node.isNode(target) && target.parentNode === currentTarget) + ) { + currentTarget = propagationPath[i]; + } else { + break; + } + } + return currentTarget; + }; + EventService.prototype.getCursor = function (target) { + var tmp = target; + while (tmp) { + var cursor = isElement(tmp) && tmp.getAttribute('cursor'); + if (cursor) { + return cursor; + } + tmp = Node.isNode(tmp) && tmp.parentNode; + } + }; + return EventService; + })(); + + /** + * used in following scenes: + * - g `ctx.measureText` + * - g-plugin-canvas-picker `ctx.isPointInPath` + * - g-plugin-device-renderer `ctx.createLinearGradient` and generate texture + * + * @see https://blog.scottlogic.com/2020/03/19/offscreen-canvas.html + */ + var OffscreenCanvasCreator = /** @class */ (function () { + function OffscreenCanvasCreator() {} + OffscreenCanvasCreator.prototype.getOrCreateCanvas = function ( + offscreenCanvas, + contextAttributes + ) { + if (this.canvas) { + return this.canvas; + } + // user-defined offscreen canvas + if (offscreenCanvas || runtime.offscreenCanvas) { + this.canvas = offscreenCanvas || runtime.offscreenCanvas; + this.context = this.canvas.getContext( + '2d', + __assign({ willReadFrequently: true }, contextAttributes) + ); + } else { + try { + // OffscreenCanvas2D measureText can be up to 40% faster. + this.canvas = new window.OffscreenCanvas(0, 0); + this.context = this.canvas.getContext( + '2d', + __assign({ willReadFrequently: true }, contextAttributes) + ); + if (!this.context || !this.context.measureText) { + this.canvas = document.createElement('canvas'); + this.context = this.canvas.getContext('2d'); + } + } catch (ex) { + this.canvas = document.createElement('canvas'); + this.context = this.canvas.getContext( + '2d', + __assign({ willReadFrequently: true }, contextAttributes) + ); + } + } + this.canvas.width = 10; + this.canvas.height = 10; + return this.canvas; + }; + OffscreenCanvasCreator.prototype.getOrCreateContext = function ( + offscreenCanvas, + contextAttributes + ) { + if (this.context) { + return this.context; + } + this.getOrCreateCanvas(offscreenCanvas, contextAttributes); + return this.context; + }; + return OffscreenCanvasCreator; + })(); + + /** + * why we need re-render + */ + var RenderReason; + (function (RenderReason) { + RenderReason[(RenderReason['CAMERA_CHANGED'] = 0)] = 'CAMERA_CHANGED'; + RenderReason[(RenderReason['DISPLAY_OBJECT_CHANGED'] = 1)] = 'DISPLAY_OBJECT_CHANGED'; + RenderReason[(RenderReason['NONE'] = 2)] = 'NONE'; + })(RenderReason || (RenderReason = {})); + + /** + * Use frame renderer implemented by `g-canvas/svg/webgl`, in every frame we do followings: + * * update & merge dirty rectangles + * * begin frame + * * filter by visible + * * sort by z-index in scene graph + * * culling with strategies registered in `g-canvas/webgl` + * * end frame + */ + var RenderingService = /** @class */ (function () { + function RenderingService(globalRuntime, context) { + this.globalRuntime = globalRuntime; + this.context = context; + this.inited = false; + this.stats = { + /** + * total display objects in scenegraph + */ + total: 0, + /** + * number of display objects need to render in current frame + */ + rendered: 0, + }; + this.zIndexCounter = 0; + this.hooks = { + /** + * called before any frame rendered + */ + init: new SyncHook(), + initAsync: new AsyncParallelHook(), + /** + * only dirty object which has sth changed will be rendered + */ + dirtycheck: new SyncWaterfallHook(), + /** + * do culling + */ + cull: new SyncWaterfallHook(), + /** + * called at beginning of each frame, won't get called if nothing to re-render + */ + beginFrame: new SyncHook(), + /** + * called before every dirty object get rendered + */ + beforeRender: new SyncHook(), + /** + * called when every dirty object rendering even it's culled + */ + render: new SyncHook(), + /** + * called after every dirty object get rendered + */ + afterRender: new SyncHook(), + endFrame: new SyncHook(), + destroy: new SyncHook(), + /** + * use async but faster method such as GPU-based picking in `g-plugin-device-renderer` + */ + pick: new AsyncSeriesWaterfallHook(), + /** + * Unsafe but sync version of pick. + */ + pickSync: new SyncWaterfallHook(), + /** + * used in event system + */ + pointerDown: new SyncHook(), + pointerUp: new SyncHook(), + pointerMove: new SyncHook(), + pointerOut: new SyncHook(), + pointerOver: new SyncHook(), + pointerWheel: new SyncHook(), + pointerCancel: new SyncHook(), + click: new SyncHook(), + }; + } + RenderingService.prototype.init = function (callback) { + var _this = this; + var context = __assign(__assign({}, this.globalRuntime), this.context); + // register rendering plugins + this.context.renderingPlugins.forEach(function (plugin) { + plugin.apply(context, _this.globalRuntime); + }); + this.hooks.init.call(); + if (this.hooks.initAsync.getCallbacksNum() === 0) { + this.inited = true; + callback(); + } else { + this.hooks.initAsync.promise().then(function () { + _this.inited = true; + callback(); + }); + } + }; + RenderingService.prototype.getStats = function () { + return this.stats; + }; + /** + * Meet the following conditions: + * * disable DirtyRectangleRendering + * * camera changed + */ + RenderingService.prototype.disableDirtyRectangleRendering = function () { + var renderer = this.context.config.renderer; + var enableDirtyRectangleRendering = renderer.getConfig().enableDirtyRectangleRendering; + return ( + !enableDirtyRectangleRendering || + this.context.renderingContext.renderReasons.has(RenderReason.CAMERA_CHANGED) + ); + }; + RenderingService.prototype.render = function (canvasConfig, frame, rerenderCallback) { + var _this = this; + this.stats.total = 0; + this.stats.rendered = 0; + this.zIndexCounter = 0; + var renderingContext = this.context.renderingContext; + this.globalRuntime.sceneGraphService.syncHierarchy(renderingContext.root); + this.globalRuntime.sceneGraphService.triggerPendingEvents(); + if (renderingContext.renderReasons.size && this.inited) { + // @ts-ignore + renderingContext.dirtyRectangleRenderingDisabled = this.disableDirtyRectangleRendering(); + var onlyCameraChanged = + renderingContext.renderReasons.size === 1 && + renderingContext.renderReasons.has(RenderReason.CAMERA_CHANGED); + var shouldTriggerRenderHooks = + !canvasConfig.disableRenderHooks || + !(canvasConfig.disableRenderHooks && onlyCameraChanged); + if (shouldTriggerRenderHooks) { + this.renderDisplayObject(renderingContext.root, canvasConfig, renderingContext); + } + this.hooks.beginFrame.call(frame); + if (shouldTriggerRenderHooks) { + renderingContext.renderListCurrentFrame.forEach(function (object) { + _this.hooks.beforeRender.call(object); + _this.hooks.render.call(object); + _this.hooks.afterRender.call(object); + }); + } + this.hooks.endFrame.call(frame); + renderingContext.renderListCurrentFrame = []; + renderingContext.renderReasons.clear(); + rerenderCallback(); + } + // console.log('stats', this.stats); + }; + RenderingService.prototype.renderDisplayObject = function ( + displayObject, + canvasConfig, + renderingContext + ) { + var _this = this; + var _a = canvasConfig.renderer.getConfig(), + enableDirtyCheck = _a.enableDirtyCheck, + enableCulling = _a.enableCulling; + // recalc style values + if (this.globalRuntime.enableCSSParsing) { + this.globalRuntime.styleValueRegistry.recalc(displayObject); + } + // TODO: relayout + // dirtycheck first + var renderable = displayObject.renderable; + var objectChanged = enableDirtyCheck + ? // @ts-ignore + renderable.dirty || renderingContext.dirtyRectangleRenderingDisabled + ? displayObject + : null + : displayObject; + if (objectChanged) { + var objectToRender = enableCulling + ? this.hooks.cull.call(objectChanged, this.context.camera) + : objectChanged; + if (objectToRender) { + this.stats.rendered++; + renderingContext.renderListCurrentFrame.push(objectToRender); + } + } + displayObject.renderable.dirty = false; + displayObject.sortable.renderOrder = this.zIndexCounter++; + this.stats.total++; + // sort is very expensive, use cached result if possible + var sortable = displayObject.sortable; + if (sortable.dirty) { + this.sort(displayObject, sortable); + sortable.dirty = false; + sortable.dirtyChildren = []; + sortable.dirtyReason = undefined; + } + // recursive rendering its children + (sortable.sorted || displayObject.childNodes).forEach(function (child) { + _this.renderDisplayObject(child, canvasConfig, renderingContext); + }); + }; + RenderingService.prototype.sort = function (displayObject, sortable) { + if (sortable.sorted && sortable.dirtyReason !== SortReason.Z_INDEX_CHANGED) { + // avoid re-sorting the whole children list + sortable.dirtyChildren.forEach(function (child) { + var index = displayObject.childNodes.indexOf(child); + if (index === -1) { + // remove from sorted list + var index_1 = sortable.sorted.indexOf(child); + if (index_1 >= 0) { + sortable.sorted.splice(index_1, 1); + } + } else { + if (sortable.sorted.length === 0) { + sortable.sorted.push(child); + } else { + var index_2 = sortedIndex(sortable.sorted, child); + sortable.sorted.splice(index_2, 0, child); + } + } + }); + } else { + sortable.sorted = displayObject.childNodes.slice().sort(sortByZIndex); + } + }; + RenderingService.prototype.destroy = function () { + this.inited = false; + this.hooks.destroy.call(); + this.globalRuntime.sceneGraphService.clearPendingEvents(); + }; + RenderingService.prototype.dirtify = function () { + // need re-render + this.context.renderingContext.renderReasons.add(RenderReason.DISPLAY_OBJECT_CHANGED); + }; + return RenderingService; + })(); + + var ATTRIBUTE_REGEXP = /\[\s*(.*)=(.*)\s*\]/; + /** + * support the following DOM API: + * * getElementById + * * getElementsByClassName + * * getElementsByName + * * getElementsByTag + * * querySelector + * * querySelectorAll + */ + var DefaultSceneGraphSelector = /** @class */ (function () { + function DefaultSceneGraphSelector() {} + DefaultSceneGraphSelector.prototype.selectOne = function (query, root) { + var _this = this; + if (query.startsWith('.')) { + return root.find(function (node) { + // return !node.shadow && node.id === query.substring(1); + return ( + ((node === null || node === void 0 ? void 0 : node.classList) || []).indexOf( + _this.getIdOrClassname(query) + ) > -1 + ); + }); + } else if (query.startsWith('#')) { + // getElementById('id') + return root.find(function (node) { + // return !node.shadow && node.id === query.substring(1); + return node.id === _this.getIdOrClassname(query); + }); + } else if (query.startsWith('[')) { + var _a = this.getAttribute(query), + name_1 = _a.name, + value_1 = _a.value; + if (name_1) { + // getElementByName(); + return root.find(function (node) { + return ( + root !== node && + (name_1 === 'name' + ? node.name === value_1 + : _this.attributeToString(node, name_1) === value_1) + ); + }); + } else { + return null; + } + } else { + // getElementsByTag('circle'); + return root.find(function (node) { + return root !== node && node.nodeName === query; + }); + } + }; + DefaultSceneGraphSelector.prototype.selectAll = function (query, root) { + var _this = this; + // only support `[name="${name}"]` `.className` `#id` + if (query.startsWith('.')) { + // getElementsByClassName('className'); + // should not include itself + return root.findAll(function (node) { + return ( + root !== node && + ((node === null || node === void 0 ? void 0 : node.classList) || []).indexOf( + _this.getIdOrClassname(query) + ) > -1 + ); + }); + } else if (query.startsWith('#')) { + return root.findAll(function (node) { + return root !== node && node.id === _this.getIdOrClassname(query); + }); + } else if (query.startsWith('[')) { + var _a = this.getAttribute(query), + name_2 = _a.name, + value_2 = _a.value; + if (name_2) { + // getElementsByName(); + return root.findAll(function (node) { + return ( + root !== node && + (name_2 === 'name' + ? node.name === value_2 + : _this.attributeToString(node, name_2) === value_2) + ); + }); + } else { + return []; + } + } else { + // getElementsByTag('circle'); + return root.findAll(function (node) { + return root !== node && node.nodeName === query; + }); + } + }; + DefaultSceneGraphSelector.prototype.is = function (query, node) { + // a simple `matches` implementation + if (query.startsWith('.')) { + return node.className === this.getIdOrClassname(query); + } else if (query.startsWith('#')) { + return node.id === this.getIdOrClassname(query); + } else if (query.startsWith('[')) { + var _a = this.getAttribute(query), + name_3 = _a.name, + value = _a.value; + return name_3 === 'name' + ? node.name === value + : this.attributeToString(node, name_3) === value; + } else { + return node.nodeName === query; + } + }; + DefaultSceneGraphSelector.prototype.getIdOrClassname = function (query) { + return query.substring(1); + }; + DefaultSceneGraphSelector.prototype.getAttribute = function (query) { + var matches = query.match(ATTRIBUTE_REGEXP); + var name = ''; + var value = ''; + if (matches && matches.length > 2) { + name = matches[1].replace(/"/g, ''); + value = matches[2].replace(/"/g, ''); + } + return { name: name, value: value }; + }; + DefaultSceneGraphSelector.prototype.attributeToString = function (node, name) { + if (!node.getAttribute) { + return ''; + } + var value = node.getAttribute(name); + if (isNil(value)) { + return ''; + } + if (value.toString) { + return value.toString(); + } + return ''; + }; + return DefaultSceneGraphSelector; + })(); + + var MutationEvent = /** @class */ (function (_super) { + __extends(MutationEvent, _super); + function MutationEvent( + typeArg, + relatedNode, + prevValue, + newValue, + attrName, + attrChange, + prevParsedValue, + newParsedValue + ) { + var _this = _super.call(this, null) || this; + _this.relatedNode = relatedNode; + _this.prevValue = prevValue; + _this.newValue = newValue; + _this.attrName = attrName; + _this.attrChange = attrChange; + _this.prevParsedValue = prevParsedValue; + _this.newParsedValue = newParsedValue; + _this.type = typeArg; + return _this; + } + MutationEvent.ADDITION = 2; + MutationEvent.MODIFICATION = 1; + MutationEvent.REMOVAL = 3; + return MutationEvent; + })(FederatedEvent); + + /** + * built-in events for element + * @see https://developer.mozilla.org/en-US/docs/Web/API/MutationEvent + * + * TODO: use MutationObserver instead + * @see https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver + */ + var ElementEvent; + (function (ElementEvent) { + ElementEvent['REPARENT'] = 'reparent'; + ElementEvent['DESTROY'] = 'destroy'; + /** + * @see https://www.w3.org/TR/DOM-Level-3-Events/#event-type-DOMAttrModified + */ + ElementEvent['ATTR_MODIFIED'] = 'DOMAttrModified'; + /** + * it has been inserted + * @see https://www.w3.org/TR/DOM-Level-3-Events/#event-type-DOMNodeInserted + */ + ElementEvent['INSERTED'] = 'DOMNodeInserted'; + /** + * it is being removed + * @see https://www.w3.org/TR/DOM-Level-3-Events/#event-type-DOMNodeRemoved + */ + ElementEvent['REMOVED'] = 'removed'; + /** + * @see https://www.w3.org/TR/DOM-Level-3-Events/#domnodeinsertedintodocument + */ + ElementEvent['MOUNTED'] = 'DOMNodeInsertedIntoDocument'; + /** + * @see https://www.w3.org/TR/DOM-Level-3-Events/#domnoderemovedfromdocument + */ + ElementEvent['UNMOUNTED'] = 'DOMNodeRemovedFromDocument'; + ElementEvent['BOUNDS_CHANGED'] = 'bounds-changed'; + ElementEvent['CULLED'] = 'culled'; + })(ElementEvent || (ElementEvent = {})); + + function markRenderableDirty(e) { + var renderable = e.renderable; + if (renderable) { + renderable.renderBoundsDirty = true; + renderable.boundsDirty = true; + } + } + var reparentEvent = new MutationEvent(ElementEvent.REPARENT, null, '', '', '', 0, '', ''); + /** + * update transform in scene graph + * + * @see https://community.khronos.org/t/scene-graphs/50542/7 + */ + var DefaultSceneGraphService = /** @class */ (function () { + function DefaultSceneGraphService(runtime) { + var _this = this; + this.runtime = runtime; + this.pendingEvents = []; + this.boundsChangedEvent = new CustomEvent(ElementEvent.BOUNDS_CHANGED); + /** + * rotate in world space + */ + this.rotate = (function () { + var parentInvertRotation = create$4(); + return function (element, degrees, y, z, dirtify) { + if (y === void 0) { + y = 0; + } + if (z === void 0) { + z = 0; + } + if (dirtify === void 0) { + dirtify = true; + } + if (typeof degrees === 'number') { + degrees = fromValues$2(degrees, y, z); + } + var transform = element.transformable; + if (element.parentNode === null || !element.parentNode.transformable) { + _this.rotateLocal(element, degrees); + } else { + var rotation = create$4(); + fromEuler(rotation, degrees[0], degrees[1], degrees[2]); + var rot = _this.getRotation(element); + var parentRot = _this.getRotation(element.parentNode); + copy$3(parentInvertRotation, parentRot); + invert$1(parentInvertRotation, parentInvertRotation); + multiply$2(rotation, parentInvertRotation, rotation); + multiply$2(transform.localRotation, rotation, rot); + normalize$2(transform.localRotation, transform.localRotation); + if (dirtify) { + _this.dirtifyLocal(element, transform); + } + } + }; + })(); + /** + * rotate in local space + * @see @see https://docs.microsoft.com/en-us/windows/win32/api/directxmath/nf-directxmath-xmquaternionrotationrollpitchyaw + */ + this.rotateLocal = (function () { + var rotation = create$4(); + return function (element, degrees, y, z, dirtify) { + if (y === void 0) { + y = 0; + } + if (z === void 0) { + z = 0; + } + if (dirtify === void 0) { + dirtify = true; + } + if (typeof degrees === 'number') { + degrees = fromValues$2(degrees, y, z); + } + var transform = element.transformable; + fromEuler(rotation, degrees[0], degrees[1], degrees[2]); + mul$1(transform.localRotation, transform.localRotation, rotation); + if (dirtify) { + _this.dirtifyLocal(element, transform); + } + }; + })(); + /** + * set euler angles(degrees) in world space + */ + this.setEulerAngles = (function () { + var invParentRot = create$4(); + return function (element, degrees, y, z, dirtify) { + if (y === void 0) { + y = 0; + } + if (z === void 0) { + z = 0; + } + if (dirtify === void 0) { + dirtify = true; + } + if (typeof degrees === 'number') { + degrees = fromValues$2(degrees, y, z); + } + var transform = element.transformable; + if (element.parentNode === null || !element.parentNode.transformable) { + _this.setLocalEulerAngles(element, degrees); + } else { + fromEuler(transform.localRotation, degrees[0], degrees[1], degrees[2]); + var parentRotation = _this.getRotation(element.parentNode); + copy$3(invParentRot, invert$1(create$4(), parentRotation)); + mul$1(transform.localRotation, transform.localRotation, invParentRot); + if (dirtify) { + _this.dirtifyLocal(element, transform); + } + } + }; + })(); + /** + * translate in local space + * + * @example + * ``` + * translateLocal(x, y, z) + * translateLocal(vec3(x, y, z)) + * ``` + */ + this.translateLocal = (function () { + return function (element, translation, y, z, dirtify) { + if (y === void 0) { + y = 0; + } + if (z === void 0) { + z = 0; + } + if (dirtify === void 0) { + dirtify = true; + } + if (typeof translation === 'number') { + translation = fromValues$2(translation, y, z); + } + var transform = element.transformable; + if (equals$1(translation, create$2())) { + return; + } + transformQuat(translation, translation, transform.localRotation); + add$1(transform.localPosition, transform.localPosition, translation); + if (dirtify) { + _this.dirtifyLocal(element, transform); + } + }; + })(); + /** + * move to position in world space + * + * 对应 g 原版的 move/moveTo + * @see https://github.com/antvis/g/blob/master/packages/g-base/src/abstract/element.ts#L684-L689 + */ + this.setPosition = (function () { + var parentInvertMatrix = create$1(); + var tmpPosition = create$2(); + return function (element, position, dirtify) { + if (dirtify === void 0) { + dirtify = true; + } + var transform = element.transformable; + tmpPosition[0] = position[0]; + tmpPosition[1] = position[1]; + tmpPosition[2] = position[2] || 0; + if (equals$1(_this.getPosition(element), tmpPosition)) { + return; + } + copy$1(transform.position, tmpPosition); + if (element.parentNode === null || !element.parentNode.transformable) { + copy$1(transform.localPosition, tmpPosition); + } else { + var parentTransform = element.parentNode.transformable; + copy(parentInvertMatrix, parentTransform.worldTransform); + invert(parentInvertMatrix, parentInvertMatrix); + transformMat4(transform.localPosition, tmpPosition, parentInvertMatrix); + } + if (dirtify) { + _this.dirtifyLocal(element, transform); + } + }; + })(); + /** + * move to position in local space + */ + this.setLocalPosition = (function () { + var tmpPosition = create$2(); + return function (element, position, dirtify) { + if (dirtify === void 0) { + dirtify = true; + } + var transform = element.transformable; + tmpPosition[0] = position[0]; + tmpPosition[1] = position[1]; + tmpPosition[2] = position[2] || 0; + if (equals$1(transform.localPosition, tmpPosition)) { + return; + } + copy$1(transform.localPosition, tmpPosition); + if (dirtify) { + _this.dirtifyLocal(element, transform); + } + }; + })(); + /** + * translate in world space + * + * @example + * ``` + * translate(x, y, z) + * translate(vec3(x, y, z)) + * ``` + * + * 对应 g 原版的 translate 2D + * @see https://github.com/antvis/g/blob/master/packages/g-base/src/abstract/element.ts#L665-L676 + */ + this.translate = (function () { + var zeroVec3 = create$2(); + var tmpVec3 = create$2(); + var tr = create$2(); + return function (element, translation, y, z, dirtify) { + if (y === void 0) { + y = 0; + } + if (z === void 0) { + z = 0; + } + if (dirtify === void 0) { + dirtify = true; + } + if (typeof translation === 'number') { + translation = set$1(tmpVec3, translation, y, z); + } + if (equals$1(translation, zeroVec3)) { + return; + } + add$1(tr, _this.getPosition(element), translation); + _this.setPosition(element, tr, dirtify); + }; + })(); + this.setRotation = function () { + var parentInvertRotation = create$4(); + return function (element, rotation, y, z, w, dirtify) { + if (dirtify === void 0) { + dirtify = true; + } + var transform = element.transformable; + if (typeof rotation === 'number') { + rotation = fromValues$4(rotation, y, z, w); + } + if (element.parentNode === null || !element.parentNode.transformable) { + _this.setLocalRotation(element, rotation); + } else { + var parentRot = _this.getRotation(element.parentNode); + copy$3(parentInvertRotation, parentRot); + invert$1(parentInvertRotation, parentInvertRotation); + multiply$2(transform.localRotation, parentInvertRotation, rotation); + normalize$2(transform.localRotation, transform.localRotation); + if (dirtify) { + _this.dirtifyLocal(element, transform); + } + } + }; + }; + this.displayObjectDependencyMap = new WeakMap(); + this.calcLocalTransform = (function () { + var tmpMat = create$1(); + var tmpPosition = create$2(); + var tmpQuat = fromValues$4(0, 0, 0, 1); + return function (transform) { + var hasSkew = transform.localSkew[0] !== 0 || transform.localSkew[1] !== 0; + if (hasSkew) { + fromRotationTranslationScaleOrigin( + transform.localTransform, + transform.localRotation, + transform.localPosition, + fromValues$2(1, 1, 1), + transform.origin + ); + // apply skew2D + if (transform.localSkew[0] !== 0 || transform.localSkew[1] !== 0) { + var tmpMat4 = identity(tmpMat); + tmpMat4[4] = Math.tan(transform.localSkew[0]); + tmpMat4[1] = Math.tan(transform.localSkew[1]); + multiply(transform.localTransform, transform.localTransform, tmpMat4); + } + var scaling = fromRotationTranslationScaleOrigin( + tmpMat, + tmpQuat, + tmpPosition, + transform.localScale, + transform.origin + ); + multiply(transform.localTransform, transform.localTransform, scaling); + } else { + // @see https://github.com/mattdesl/css-mat4/blob/master/index.js + fromRotationTranslationScaleOrigin( + transform.localTransform, + transform.localRotation, + transform.localPosition, + transform.localScale, + transform.origin + ); + } + }; + })(); + } + DefaultSceneGraphService.prototype.matches = function (query, root) { + return this.runtime.sceneGraphSelector.is(query, root); + }; + DefaultSceneGraphService.prototype.querySelector = function (query, root) { + return this.runtime.sceneGraphSelector.selectOne(query, root); + }; + DefaultSceneGraphService.prototype.querySelectorAll = function (query, root) { + return this.runtime.sceneGraphSelector.selectAll(query, root); + // .filter((node) => !node.shadow); + }; + DefaultSceneGraphService.prototype.attach = function (child, parent, index) { + var _a; + var detached = false; + if (child.parentNode) { + detached = child.parentNode !== parent; + this.detach(child); + } + child.parentNode = parent; + if (!isNil(index)) { + child.parentNode.childNodes.splice(index, 0, child); + } else { + child.parentNode.childNodes.push(child); + } + // parent needs re-sort + var sortable = parent.sortable; + if ( + ((_a = sortable === null || sortable === void 0 ? void 0 : sortable.sorted) === null || + _a === void 0 + ? void 0 + : _a.length) || + child.parsedStyle.zIndex + ) { + if (sortable.dirtyChildren.indexOf(child) === -1) { + sortable.dirtyChildren.push(child); + } + // if (sortable) { + // only child has z-Index + sortable.dirty = true; + sortable.dirtyReason = SortReason.ADDED; + } + // this.updateGraphDepth(child); + var transform = child.transformable; + if (transform) { + this.dirtifyWorld(child, transform); + } + if (transform.frozen) { + this.unfreezeParentToRoot(child); + } + if (detached) { + child.dispatchEvent(reparentEvent); + } + }; + DefaultSceneGraphService.prototype.detach = function (child) { + var _a, _b; + if (child.parentNode) { + var transform = child.transformable; + // if (transform) { + // const worldTransform = this.getWorldTransform(child, transform); + // mat4.getScaling(transform.localScale, worldTransform); + // mat4.getTranslation(transform.localPosition, worldTransform); + // mat4.getRotation(transform.localRotation, worldTransform); + // transform.localDirtyFlag = true; + // } + // parent needs re-sort + var sortable = child.parentNode.sortable; + // if (sortable) { + if ( + ((_a = sortable === null || sortable === void 0 ? void 0 : sortable.sorted) === null || + _a === void 0 + ? void 0 + : _a.length) || + ((_b = child.style) === null || _b === void 0 ? void 0 : _b.zIndex) + ) { + if (sortable.dirtyChildren.indexOf(child) === -1) { + sortable.dirtyChildren.push(child); + } + sortable.dirty = true; + sortable.dirtyReason = SortReason.REMOVED; + } + var index = child.parentNode.childNodes.indexOf(child); + if (index > -1) { + child.parentNode.childNodes.splice(index, 1); + } + if (transform) { + this.dirtifyWorld(child, transform); + } + child.parentNode = null; + } + }; + DefaultSceneGraphService.prototype.getOrigin = function (element) { + element.getGeometryBounds(); + return element.transformable.origin; + }; + /** + * same as pivot in Pixi.js + * + * @see https://stackoverflow.com/questions/40748452/how-to-change-css-transform-origin-but-preserve-transformation + */ + DefaultSceneGraphService.prototype.setOrigin = function (element, origin, y, z) { + if (y === void 0) { + y = 0; + } + if (z === void 0) { + z = 0; + } + if (typeof origin === 'number') { + origin = [origin, y, z]; + } + var transform = element.transformable; + if ( + origin[0] === transform.origin[0] && + origin[1] === transform.origin[1] && + origin[2] === transform.origin[2] + ) { + return; + } + var originVec = transform.origin; + // const delta = vec3.subtract(vec3.create(), origin, originVec); + // vec3.add(transform.localPosition, transform.localPosition, delta); + // update origin + originVec[0] = origin[0]; + originVec[1] = origin[1]; + originVec[2] = origin[2] || 0; + this.dirtifyLocal(element, transform); + }; + /** + * set euler angles(degrees) in local space + */ + DefaultSceneGraphService.prototype.setLocalEulerAngles = function ( + element, + degrees, + y, + z, + dirtify + ) { + if (y === void 0) { + y = 0; + } + if (z === void 0) { + z = 0; + } + if (dirtify === void 0) { + dirtify = true; + } + if (typeof degrees === 'number') { + degrees = fromValues$2(degrees, y, z); + } + var transform = element.transformable; + fromEuler(transform.localRotation, degrees[0], degrees[1], degrees[2]); + if (dirtify) { + this.dirtifyLocal(element, transform); + } + }; + /** + * scale in local space + */ + DefaultSceneGraphService.prototype.scaleLocal = function (element, scaling, dirtify) { + if (dirtify === void 0) { + dirtify = true; + } + var transform = element.transformable; + multiply$1( + transform.localScale, + transform.localScale, + fromValues$2(scaling[0], scaling[1], scaling[2] || 1) + ); + if (dirtify) { + this.dirtifyLocal(element, transform); + } + }; + DefaultSceneGraphService.prototype.setLocalScale = function (element, scaling, dirtify) { + if (dirtify === void 0) { + dirtify = true; + } + var transform = element.transformable; + var updatedScaling = fromValues$2( + scaling[0], + scaling[1], + scaling[2] || transform.localScale[2] + ); + if (equals$1(updatedScaling, transform.localScale)) { + return; + } + copy$1(transform.localScale, updatedScaling); + if (dirtify) { + this.dirtifyLocal(element, transform); + } + }; + DefaultSceneGraphService.prototype.setLocalRotation = function ( + element, + rotation, + y, + z, + w, + dirtify + ) { + if (dirtify === void 0) { + dirtify = true; + } + if (typeof rotation === 'number') { + rotation = fromValues$4(rotation, y, z, w); + } + var transform = element.transformable; + copy$3(transform.localRotation, rotation); + if (dirtify) { + this.dirtifyLocal(element, transform); + } + }; + DefaultSceneGraphService.prototype.setLocalSkew = function (element, skew, y) { + if (typeof skew === 'number') { + skew = fromValues$5(skew, y); + } + var transform = element.transformable; + copy$4(transform.localSkew, skew); + this.dirtifyLocal(element, transform); + }; + DefaultSceneGraphService.prototype.dirtifyLocal = function (element, transform) { + if (!transform.localDirtyFlag) { + transform.localDirtyFlag = true; + if (!transform.dirtyFlag) { + this.dirtifyWorld(element, transform); + } + } + }; + DefaultSceneGraphService.prototype.dirtifyWorld = function (element, transform) { + if (!transform.dirtyFlag) { + this.unfreezeParentToRoot(element); + } + this.dirtifyWorldInternal(element, transform); + this.dirtifyToRoot(element, true); + }; + DefaultSceneGraphService.prototype.triggerPendingEvents = function () { + var _this = this; + var set = new Set(); + var trigger = function (element, detail) { + if (element.isConnected && !set.has(element.entity)) { + _this.boundsChangedEvent.detail = detail; + _this.boundsChangedEvent.target = element; + if (element.isMutationObserved) { + element.dispatchEvent(_this.boundsChangedEvent); + } else { + element.ownerDocument.defaultView.dispatchEvent(_this.boundsChangedEvent, true); + } + set.add(element.entity); + } + }; + this.pendingEvents.forEach(function (_a) { + var _b = __read(_a, 2), + element = _b[0], + detail = _b[1]; + if (detail.affectChildren) { + element.forEach(function (e) { + trigger(e, detail); + }); + } else { + trigger(element, detail); + } + }); + this.clearPendingEvents(); + set.clear(); + }; + DefaultSceneGraphService.prototype.clearPendingEvents = function () { + this.pendingEvents = []; + }; + DefaultSceneGraphService.prototype.dirtifyToRoot = function (element, affectChildren) { + if (affectChildren === void 0) { + affectChildren = false; + } + var p = element; + // only need to re-render itself + if (p.renderable) { + p.renderable.dirty = true; + } + while (p) { + markRenderableDirty(p); + p = p.parentNode; + } + if (affectChildren) { + element.forEach(function (e) { + markRenderableDirty(e); + }); + } + // inform dependencies + this.informDependentDisplayObjects(element); + // reuse the same custom event + this.pendingEvents.push([element, { affectChildren: affectChildren }]); + }; + DefaultSceneGraphService.prototype.updateDisplayObjectDependency = function ( + name, + oldPath, + newPath, + object + ) { + // clear ref to old clip path + if (oldPath && oldPath !== newPath) { + var oldDependencyMap = this.displayObjectDependencyMap.get(oldPath); + if (oldDependencyMap && oldDependencyMap[name]) { + var index = oldDependencyMap[name].indexOf(object); + oldDependencyMap[name].splice(index, 1); + } + } + if (newPath) { + var newDependencyMap = this.displayObjectDependencyMap.get(newPath); + if (!newDependencyMap) { + this.displayObjectDependencyMap.set(newPath, {}); + newDependencyMap = this.displayObjectDependencyMap.get(newPath); + } + if (!newDependencyMap[name]) { + newDependencyMap[name] = []; + } + newDependencyMap[name].push(object); + } + }; + DefaultSceneGraphService.prototype.informDependentDisplayObjects = function (object) { + var _this = this; + var dependencyMap = this.displayObjectDependencyMap.get(object); + if (dependencyMap) { + Object.keys(dependencyMap).forEach(function (name) { + dependencyMap[name].forEach(function (target) { + _this.dirtifyToRoot(target, true); + target.dispatchEvent( + new MutationEvent( + ElementEvent.ATTR_MODIFIED, + target, + _this, + _this, + name, + MutationEvent.MODIFICATION, + _this, + _this + ) + ); + if (target.isCustomElement && target.isConnected) { + if (target.attributeChangedCallback) { + target.attributeChangedCallback(name, _this, _this); + } + } + }); + }); + } + }; + DefaultSceneGraphService.prototype.getPosition = function (element) { + var transform = element.transformable; + return getTranslation(transform.position, this.getWorldTransform(element, transform)); + }; + DefaultSceneGraphService.prototype.getRotation = function (element) { + var transform = element.transformable; + return getRotation(transform.rotation, this.getWorldTransform(element, transform)); + }; + DefaultSceneGraphService.prototype.getScale = function (element) { + var transform = element.transformable; + return getScaling(transform.scaling, this.getWorldTransform(element, transform)); + }; + DefaultSceneGraphService.prototype.getWorldTransform = function (element, transform) { + if (transform === void 0) { + transform = element.transformable; + } + if (!transform.localDirtyFlag && !transform.dirtyFlag) { + return transform.worldTransform; + } + if (element.parentNode && element.parentNode.transformable) { + this.getWorldTransform(element.parentNode); + } + this.sync(element, transform); + return transform.worldTransform; + }; + DefaultSceneGraphService.prototype.getLocalPosition = function (element) { + return element.transformable.localPosition; + }; + DefaultSceneGraphService.prototype.getLocalRotation = function (element) { + return element.transformable.localRotation; + }; + DefaultSceneGraphService.prototype.getLocalScale = function (element) { + return element.transformable.localScale; + }; + DefaultSceneGraphService.prototype.getLocalSkew = function (element) { + return element.transformable.localSkew; + }; + DefaultSceneGraphService.prototype.getLocalTransform = function (element) { + var transform = element.transformable; + if (transform.localDirtyFlag) { + this.calcLocalTransform(transform); + transform.localDirtyFlag = false; + } + return transform.localTransform; + }; + DefaultSceneGraphService.prototype.setLocalTransform = function (element, transform) { + var t = getTranslation(create$2(), transform); + var r = getRotation(create$4(), transform); + var s = getScaling(create$2(), transform); + this.setLocalScale(element, s, false); + this.setLocalPosition(element, t, false); + this.setLocalRotation(element, r, undefined, undefined, undefined, false); + this.dirtifyLocal(element, element.transformable); + }; + DefaultSceneGraphService.prototype.resetLocalTransform = function (element) { + this.setLocalScale(element, [1, 1, 1]); + this.setLocalPosition(element, [0, 0, 0]); + this.setLocalEulerAngles(element, [0, 0, 0]); + this.setLocalSkew(element, [0, 0]); + }; + DefaultSceneGraphService.prototype.getTransformedGeometryBounds = function ( + element, + render, + existedAABB + ) { + if (render === void 0) { + render = false; + } + var bounds = this.getGeometryBounds(element, render); + if (!AABB.isEmpty(bounds)) { + var aabb = existedAABB || new AABB(); + aabb.setFromTransformedAABB(bounds, this.getWorldTransform(element)); + return aabb; + } else { + return null; + } + }; + /** + * won't account for children + */ + DefaultSceneGraphService.prototype.getGeometryBounds = function (element, render) { + if (render === void 0) { + render = false; + } + var geometry = element.geometry; + if (geometry.dirty) { + runtime.styleValueRegistry.updateGeometry(element); + } + var bounds = render ? geometry.renderBounds : geometry.contentBounds || null; + // return (bounds && new AABB(bounds.center, bounds.halfExtents)) || new AABB(); + return bounds || new AABB(); + }; + /** + * account for children in world space + */ + DefaultSceneGraphService.prototype.getBounds = function (element, render) { + var _this = this; + if (render === void 0) { + render = false; + } + var renderable = element.renderable; + if (!renderable.boundsDirty && !render && renderable.bounds) { + return renderable.bounds; + } + if (!renderable.renderBoundsDirty && render && renderable.renderBounds) { + return renderable.renderBounds; + } + // reuse existed if possible + var existedAABB = render ? renderable.renderBounds : renderable.bounds; + // reset with geometry's aabb + var aabb = this.getTransformedGeometryBounds(element, render, existedAABB); + // merge children's aabbs + var children = element.childNodes; + children.forEach(function (child) { + var childBounds = _this.getBounds(child, render); + if (childBounds) { + if (!aabb) { + aabb = existedAABB || new AABB(); + aabb.update(childBounds.center, childBounds.halfExtents); + } else { + aabb.add(childBounds); + } + } + }); + if (!aabb) { + aabb = new AABB(); + } + if (render) { + // FIXME: account for clip path + var clipped = findClosestClipPathTarget(element); + if (clipped) { + // use bounds under world space + var clipPathBounds = clipped.parsedStyle.clipPath.getBounds(render); + if (!aabb) { + aabb.update(clipPathBounds.center, clipPathBounds.halfExtents); + } else if (clipPathBounds) { + aabb = clipPathBounds.intersection(aabb); + } + } + } + if (render) { + renderable.renderBounds = aabb; + renderable.renderBoundsDirty = false; + } else { + renderable.bounds = aabb; + renderable.boundsDirty = false; + } + return aabb; + }; + /** + * account for children in local space + */ + DefaultSceneGraphService.prototype.getLocalBounds = function (element) { + if (element.parentNode) { + var parentInvert = create$1(); + if (element.parentNode.transformable) { + parentInvert = invert(create$1(), this.getWorldTransform(element.parentNode)); + } + var bounds = this.getBounds(element); + if (!AABB.isEmpty(bounds)) { + var localBounds = new AABB(); + localBounds.setFromTransformedAABB(bounds, parentInvert); + return localBounds; + } + } + return this.getBounds(element); + }; + DefaultSceneGraphService.prototype.getBoundingClientRect = function (element) { + var _a, _b; + var aabb; + var bounds = this.getGeometryBounds(element); + if (!AABB.isEmpty(bounds)) { + aabb = new AABB(); + // apply transformation to aabb + aabb.setFromTransformedAABB(bounds, this.getWorldTransform(element)); + } + // calc context's offset + var bbox = + (_b = (_a = element.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView) === + null || _b === void 0 + ? void 0 + : _b.getContextService().getBoundingClientRect(); + if (aabb) { + var _c = __read(aabb.getMin(), 2), + left = _c[0], + top_1 = _c[1]; + var _d = __read(aabb.getMax(), 2), + right = _d[0], + bottom = _d[1]; + return new Rectangle( + left + ((bbox === null || bbox === void 0 ? void 0 : bbox.left) || 0), + top_1 + ((bbox === null || bbox === void 0 ? void 0 : bbox.top) || 0), + right - left, + bottom - top_1 + ); + } + return new Rectangle( + (bbox === null || bbox === void 0 ? void 0 : bbox.left) || 0, + (bbox === null || bbox === void 0 ? void 0 : bbox.top) || 0, + 0, + 0 + ); + }; + DefaultSceneGraphService.prototype.dirtifyWorldInternal = function (element, transform) { + var _this = this; + if (!transform.dirtyFlag) { + transform.dirtyFlag = true; + transform.frozen = false; + element.childNodes.forEach(function (child) { + var childTransform = child.transformable; + if (!childTransform.dirtyFlag) { + _this.dirtifyWorldInternal(child, childTransform); + } + }); + var renderable = element.renderable; + if (renderable) { + renderable.renderBoundsDirty = true; + renderable.boundsDirty = true; + renderable.dirty = true; + } + } + }; + DefaultSceneGraphService.prototype.syncHierarchy = function (element) { + var transform = element.transformable; + if (transform.frozen) { + return; + } + transform.frozen = true; + if (transform.localDirtyFlag || transform.dirtyFlag) { + this.sync(element, transform); + } + var children = element.childNodes; + for (var i = 0; i < children.length; i++) { + this.syncHierarchy(children[i]); + } + }; + DefaultSceneGraphService.prototype.sync = function (element, transform) { + if (transform.localDirtyFlag) { + this.calcLocalTransform(transform); + transform.localDirtyFlag = false; + } + if (transform.dirtyFlag) { + var parent_1 = element.parentNode; + var parentTransform = parent_1 && parent_1.transformable; + if (parent_1 === null || !parentTransform) { + copy(transform.worldTransform, transform.localTransform); + } else { + // TODO: should we support scale compensation? + // @see https://github.com/playcanvas/engine/issues/1077#issuecomment-359765557 + multiply( + transform.worldTransform, + parentTransform.worldTransform, + transform.localTransform + ); + } + transform.dirtyFlag = false; + } + }; + DefaultSceneGraphService.prototype.unfreezeParentToRoot = function (child) { + var p = child.parentNode; + while (p) { + var transform = p.transformable; + if (transform) { + transform.frozen = false; + } + p = p.parentNode; + } + }; + return DefaultSceneGraphService; + })(); + + var TEXT_METRICS = { + MetricsString: '|ÉqÅ', + BaselineSymbol: 'M', + BaselineMultiplier: 1.4, + HeightMultiplier: 2, + Newlines: [ + 0x000a, // line feed + 0x000d, // carriage return + ], + BreakingSpaces: [ + 0x0009, // character tabulation + 0x0020, // space + 0x2000, // en quad + 0x2001, // em quad + 0x2002, // en space + 0x2003, // em space + 0x2004, // three-per-em space + 0x2005, // four-per-em space + 0x2006, // six-per-em space + 0x2008, // punctuation space + 0x2009, // thin space + 0x200a, // hair space + 0x205f, // medium mathematical space + 0x3000, // ideographic space + ], + }; + var LATIN_REGEX = /[a-zA-Z0-9\u00C0-\u00D6\u00D8-\u00f6\u00f8-\u00ff!"#$%&'()*+,-./:;]/; + // Line breaking rules in CJK (Kinsoku Shori) + // Refer from https://en.wikipedia.org/wiki/Line_breaking_rules_in_East_Asian_languages + var regexCannotStartZhCn = + /[!%),.:;?\]}¢°·'""†‡›℃∶、。〃〆〕〗〞﹚﹜!"%'),.:;?!]}~]/; + var regexCannotEndZhCn = /[$(£¥·'"〈《「『【〔〖〝﹙﹛$(.[{£¥]/; + var regexCannotStartZhTw = + /[!),.:;?\]}¢·–—'"•"、。〆〞〕〉》」︰︱︲︳﹐﹑﹒﹓﹔﹕﹖﹘﹚﹜!),.:;?︶︸︺︼︾﹀﹂﹗]|}、]/; + var regexCannotEndZhTw = /[([{£¥'"‵〈《「『〔〝︴﹙﹛({︵︷︹︻︽︿﹁﹃﹏]/; + var regexCannotStartJaJp = + /[)\]}〕〉》」』】〙〗〟'"⦆»ヽヾーァィゥェォッャュョヮヵヶぁぃぅぇぉっゃゅょゎゕゖㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ々〻‐゠–〜?!‼⁇⁈⁉・、:;,。.]/; + var regexCannotEndJaJp = /[([{〔〈《「『【〘〖〝'"⦅«—...‥〳〴〵]/; + var regexCannotStartKoKr = /[!%),.:;?\]}¢°'"†‡℃〆〈《「『〕!%),.:;?]}]/; + var regexCannotEndKoKr = /[$([{£¥'"々〇〉》」〔$([{⦆¥₩#]/; + var regexCannotStart = new RegExp( + '' + .concat(regexCannotStartZhCn.source, '|') + .concat(regexCannotStartZhTw.source, '|') + .concat(regexCannotStartJaJp.source, '|') + .concat(regexCannotStartKoKr.source) + ); + var regexCannotEnd = new RegExp( + '' + .concat(regexCannotEndZhCn.source, '|') + .concat(regexCannotEndZhTw.source, '|') + .concat(regexCannotEndJaJp.source, '|') + .concat(regexCannotEndKoKr.source) + ); + /** + * Borrow from pixi/packages/text/src/TextMetrics.ts + */ + var TextService = /** @class */ (function () { + function TextService(runtime) { + var _this = this; + this.runtime = runtime; + /** + * font metrics cache + */ + this.fontMetricsCache = {}; + this.shouldBreakByKinsokuShorui = function (char, nextChar) { + if (_this.isBreakingSpace(nextChar)) return false; + if (char) { + // Line breaking rules in CJK (Kinsoku Shori) + if (regexCannotEnd.exec(nextChar) || regexCannotStart.exec(char)) { + return true; + } + } + return false; + }; + this.trimByKinsokuShorui = function (prev) { + var next = __spreadArray([], __read(prev), false); + var prevLine = next[next.length - 2]; + if (!prevLine) { + return prev; + } + var lastChar = prevLine[prevLine.length - 1]; + next[next.length - 2] = prevLine.slice(0, -1); + next[next.length - 1] = lastChar + next[next.length - 1]; + return next; + }; + } + /** + * Calculates the ascent, descent and fontSize of a given font-style. + */ + TextService.prototype.measureFont = function (font, offscreenCanvas) { + // as this method is used for preparing assets, don't recalculate things if we don't need to + if (this.fontMetricsCache[font]) { + return this.fontMetricsCache[font]; + } + var properties = { + ascent: 0, + descent: 0, + fontSize: 0, + }; + var canvas = this.runtime.offscreenCanvasCreator.getOrCreateCanvas(offscreenCanvas); + var context = this.runtime.offscreenCanvasCreator.getOrCreateContext(offscreenCanvas, { + willReadFrequently: true, + }); + context.font = font; + var metricsString = TEXT_METRICS.MetricsString + TEXT_METRICS.BaselineSymbol; + var width = Math.ceil(context.measureText(metricsString).width); + var baseline = Math.ceil(context.measureText(TEXT_METRICS.BaselineSymbol).width); + var height = TEXT_METRICS.HeightMultiplier * baseline; + baseline = (baseline * TEXT_METRICS.BaselineMultiplier) | 0; + // @ts-ignore + canvas.width = width; + // @ts-ignore + canvas.height = height; + context.fillStyle = '#f00'; + context.fillRect(0, 0, width, height); + context.font = font; + context.textBaseline = 'alphabetic'; + context.fillStyle = '#000'; + context.fillText(metricsString, 0, baseline); + var imagedata = context.getImageData(0, 0, width || 1, height || 1).data; + var pixels = imagedata.length; + var line = width * 4; + var i = 0; + var idx = 0; + var stop = false; + // ascent. scan from top to bottom until we find a non red pixel + for (i = 0; i < baseline; ++i) { + for (var j = 0; j < line; j += 4) { + if (imagedata[idx + j] !== 255) { + stop = true; + break; + } + } + if (!stop) { + idx += line; + } else { + break; + } + } + properties.ascent = baseline - i; + idx = pixels - line; + stop = false; + // descent. scan from bottom to top until we find a non red pixel + for (i = height; i > baseline; --i) { + for (var j = 0; j < line; j += 4) { + if (imagedata[idx + j] !== 255) { + stop = true; + break; + } + } + if (!stop) { + idx -= line; + } else { + break; + } + } + properties.descent = i - baseline; + properties.fontSize = properties.ascent + properties.descent; + this.fontMetricsCache[font] = properties; + return properties; + }; + TextService.prototype.measureText = function (text, parsedStyle, offscreenCanvas) { + var _a = parsedStyle.fontSize, + fontSize = _a === void 0 ? 16 : _a, + _b = parsedStyle.wordWrap, + wordWrap = _b === void 0 ? false : _b, + strokeHeight = parsedStyle.lineHeight, + _c = parsedStyle.lineWidth, + lineWidth = _c === void 0 ? 1 : _c, + _d = parsedStyle.textBaseline, + textBaseline = _d === void 0 ? 'alphabetic' : _d, + _e = parsedStyle.textAlign, + textAlign = _e === void 0 ? 'start' : _e, + _f = parsedStyle.letterSpacing, + letterSpacing = _f === void 0 ? 0 : _f, + textPath = parsedStyle.textPath; + parsedStyle.textPathSide; + parsedStyle.textPathStartOffset; + var // dropShadow = 0, + // dropShadowDistance = 0, + _g = parsedStyle.leading, + // dropShadow = 0, + // dropShadowDistance = 0, + leading = _g === void 0 ? 0 : _g; + var font = toFontString(parsedStyle); + // if (runtime.enableCSSParsing) { + var fontProperties = this.measureFont(font, offscreenCanvas); + // fallback in case UA disallow canvas data extraction + // (toDataURI, getImageData functions) + if (fontProperties.fontSize === 0) { + fontProperties.fontSize = fontSize; + fontProperties.ascent = fontSize; + } + // } else { + // fontProperties = { + // fontSize, + // }; + // } + var context = this.runtime.offscreenCanvasCreator.getOrCreateContext(offscreenCanvas); + context.font = font; + // no overflowing by default + parsedStyle.isOverflowing = false; + var outputText = wordWrap ? this.wordWrap(text, parsedStyle, offscreenCanvas) : text; + var lines = outputText.split(/(?:\r\n|\r|\n)/); + var lineWidths = new Array(lines.length); + var maxLineWidth = 0; + // account for textPath + if (textPath) { + textPath.getTotalLength(); + // const startingPoint = textPath.getPoint(0); + for (var i = 0; i < lines.length; i++) { + var width = context.measureText(lines[i]).width + (lines[i].length - 1) * letterSpacing; + // for ( + // let i = reverse ? lines[0].length - 1 : 0; + // reverse ? i >= 0 : i < lines[0].length; + // reverse ? i-- : i++ + // ) { + // graphemeInfo = lineBounds[i]; + // if (positionInPath > totalPathLength) { + // positionInPath %= totalPathLength; + // } else if (positionInPath < 0) { + // positionInPath += totalPathLength; + // } + // // it would probably much faster to send all the grapheme position for a line + // // and calculate path position/angle at once. + // this.setGraphemeOnPath( + // positionInPath, + // graphemeInfo, + // startingPoint + // ); + // positionInPath += graphemeInfo.kernedWidth; + // } + } + } else { + for (var i = 0; i < lines.length; i++) { + // char width + letterSpacing + var lineWidth_1 = + context.measureText(lines[i]).width + (lines[i].length - 1) * letterSpacing; + lineWidths[i] = lineWidth_1; + maxLineWidth = Math.max(maxLineWidth, lineWidth_1); + } + var width = maxLineWidth + lineWidth; + // if (dropShadow) { + // width += dropShadowDistance; + // } + var lineHeight_1 = strokeHeight || fontProperties.fontSize + lineWidth; + var height = + Math.max(lineHeight_1, fontProperties.fontSize + lineWidth) + + (lines.length - 1) * (lineHeight_1 + leading); + // if (dropShadow) { + // height += dropShadowDistance; + // } + lineHeight_1 += leading; + // handle vertical text baseline + var offsetY_1 = 0; + if (textBaseline === 'middle') { + offsetY_1 = -height / 2; + } else if ( + textBaseline === 'bottom' || + textBaseline === 'alphabetic' || + textBaseline === 'ideographic' + ) { + offsetY_1 = -height; + } else if (textBaseline === 'top' || textBaseline === 'hanging') { + offsetY_1 = 0; + } + return { + font: font, + width: width, + height: height, + lines: lines, + lineWidths: lineWidths, + lineHeight: lineHeight_1, + maxLineWidth: maxLineWidth, + fontProperties: fontProperties, + lineMetrics: lineWidths.map(function (width, i) { + var offsetX = 0; + // handle horizontal text align + if (textAlign === 'center' || textAlign === 'middle') { + offsetX -= width / 2; + } else if (textAlign === 'right' || textAlign === 'end') { + offsetX -= width; + } + return new Rectangle( + offsetX - lineWidth / 2, + offsetY_1 + i * lineHeight_1, + width + lineWidth, + lineHeight_1 + ); + }), + }; + } + }; + TextService.prototype.setGraphemeOnPath = function () {}; + TextService.prototype.wordWrap = function (text, parsedStyle, offscreenCanvas) { + var _this = this; + var _a = parsedStyle.wordWrapWidth, + wordWrapWidth = _a === void 0 ? 0 : _a, + _b = parsedStyle.letterSpacing, + letterSpacing = _b === void 0 ? 0 : _b, + _c = parsedStyle.maxLines, + maxLines = _c === void 0 ? Infinity : _c, + textOverflow = parsedStyle.textOverflow; + var context = this.runtime.offscreenCanvasCreator.getOrCreateContext(offscreenCanvas); + var maxWidth = wordWrapWidth + letterSpacing; + var ellipsis = ''; + if (textOverflow === 'ellipsis') { + ellipsis = '...'; + } else if (textOverflow && textOverflow !== 'clip') { + ellipsis = textOverflow; + } + var lines = []; + var currentIndex = 0; + var currentWidth = 0; + var cache = {}; + var calcWidth = function (char) { + return _this.getFromCache(char, letterSpacing, cache, context); + }; + var ellipsisWidth = Array.from(ellipsis).reduce(function (prev, cur) { + return prev + calcWidth(cur); + }, 0); + var chars = Array.from(text); + for (var i = 0; i < chars.length; i++) { + var char = chars[i]; + var prevChar = text[i - 1]; + var nextChar = text[i + 1]; + var charWidth = calcWidth(char); + if (this.isNewline(char)) { + currentIndex++; + // exceed maxLines, break immediately + if (currentIndex >= maxLines) { + parsedStyle.isOverflowing = true; + break; + } + currentWidth = 0; + lines[currentIndex] = ''; + continue; + } + if (currentWidth > 0 && currentWidth + charWidth > maxWidth) { + if (currentIndex + 1 >= maxLines) { + parsedStyle.isOverflowing = true; + // If there is not enough space to display the string itself, it is clipped. + // @see https://developer.mozilla.org/en-US/docs/Web/CSS/text-overflow#values + if (ellipsisWidth > 0 && ellipsisWidth <= maxWidth) { + // Backspace from line's end. + var currentLineLength = lines[currentIndex].length; + var lastLineWidth = 0; + var lastLineIndex = currentLineLength; + for (var i_1 = 0; i_1 < currentLineLength; i_1++) { + var width = calcWidth(lines[currentIndex][i_1]); + if (lastLineWidth + width + ellipsisWidth > maxWidth) { + lastLineIndex = i_1; + break; + } + lastLineWidth += width; + } + lines[currentIndex] = (lines[currentIndex] || '').slice(0, lastLineIndex) + ellipsis; + } + break; + } + currentIndex++; + currentWidth = 0; + lines[currentIndex] = ''; + if (this.isBreakingSpace(char)) { + continue; + } + if (!this.canBreakInLastChar(char)) { + lines = this.trimToBreakable(lines); + currentWidth = this.sumTextWidthByCache(lines[currentIndex] || '', cache); + } + if (this.shouldBreakByKinsokuShorui(char, nextChar)) { + lines = this.trimByKinsokuShorui(lines); + currentWidth += calcWidth(prevChar || ''); + } + } + currentWidth += charWidth; + lines[currentIndex] = (lines[currentIndex] || '') + char; + } + return lines.join('\n'); + }; + TextService.prototype.isBreakingSpace = function (char) { + if (typeof char !== 'string') { + return false; + } + return TEXT_METRICS.BreakingSpaces.indexOf(char.charCodeAt(0)) >= 0; + }; + TextService.prototype.isNewline = function (char) { + if (typeof char !== 'string') { + return false; + } + return TEXT_METRICS.Newlines.indexOf(char.charCodeAt(0)) >= 0; + }; + TextService.prototype.trimToBreakable = function (prev) { + var next = __spreadArray([], __read(prev), false); + var prevLine = next[next.length - 2]; + var index = this.findBreakableIndex(prevLine); + if (index === -1 || !prevLine) return next; + var trimmedChar = prevLine.slice(index, index + 1); + var isTrimmedWithSpace = this.isBreakingSpace(trimmedChar); + var trimFrom = index + 1; + var trimTo = index + (isTrimmedWithSpace ? 0 : 1); + next[next.length - 1] += prevLine.slice(trimFrom, prevLine.length); + next[next.length - 2] = prevLine.slice(0, trimTo); + return next; + }; + TextService.prototype.canBreakInLastChar = function (char) { + if (char && LATIN_REGEX.test(char)) return false; + return true; + }; + TextService.prototype.sumTextWidthByCache = function (text, cache) { + return text.split('').reduce(function (sum, c) { + if (!cache[c]) throw Error('cannot count the word without cache'); + return sum + cache[c]; + }, 0); + }; + TextService.prototype.findBreakableIndex = function (line) { + for (var i = line.length - 1; i >= 0; i--) { + if (!LATIN_REGEX.test(line[i])) return i; + } + return -1; + }; + TextService.prototype.getFromCache = function (key, letterSpacing, cache, context) { + var width = cache[key]; + if (typeof width !== 'number') { + var spacing = key.length * letterSpacing; + width = context.measureText(key).width + spacing; + cache[key] = width; + } + return width; + }; + return TextService; + })(); + + var runtime = {}; + /** + * Replace with IoC container + */ + var geometryUpdaterFactory = (function () { + var _a; + var rectUpdater = new RectUpdater(); + var polylineUpdater = new PolylineUpdater(); + return ( + (_a = {}), + (_a[Shape.CIRCLE] = new CircleUpdater()), + (_a[Shape.ELLIPSE] = new EllipseUpdater()), + (_a[Shape.RECT] = rectUpdater), + (_a[Shape.IMAGE] = rectUpdater), + (_a[Shape.GROUP] = new GroupUpdater()), + (_a[Shape.LINE] = new LineUpdater()), + (_a[Shape.TEXT] = new TextUpdater(runtime)), + (_a[Shape.POLYLINE] = polylineUpdater), + (_a[Shape.POLYGON] = polylineUpdater), + (_a[Shape.PATH] = new PathUpdater()), + (_a[Shape.HTML] = null), + (_a[Shape.MESH] = null), + _a + ); + })(); + var CSSPropertySyntaxFactory = (function () { + var _a; + var color = new CSSPropertyColor(); + var length = new CSSPropertyLengthOrPercentage(); + return ( + (_a = {}), + (_a[PropertySyntax.PERCENTAGE] = null), + (_a[PropertySyntax.NUMBER] = new CSSPropertyNumber()), + (_a[PropertySyntax.ANGLE] = new CSSPropertyAngle()), + (_a[PropertySyntax.DEFINED_PATH] = new CSSPropertyClipPath()), + (_a[PropertySyntax.PAINT] = color), + (_a[PropertySyntax.COLOR] = color), + (_a[PropertySyntax.FILTER] = new CSSPropertyFilter()), + (_a[PropertySyntax.LENGTH] = length), + (_a[PropertySyntax.LENGTH_PERCENTAGE] = length), + (_a[PropertySyntax.LENGTH_PERCENTAGE_12] = new CSSPropertyLengthOrPercentage12()), + (_a[PropertySyntax.LENGTH_PERCENTAGE_14] = new CSSPropertyLengthOrPercentage14()), + (_a[PropertySyntax.COORDINATE] = new CSSPropertyLengthOrPercentage()), + (_a[PropertySyntax.OFFSET_DISTANCE] = new CSSPropertyOffsetDistance()), + (_a[PropertySyntax.OPACITY_VALUE] = new CSSPropertyOpacity()), + (_a[PropertySyntax.PATH] = new CSSPropertyPath()), + (_a[PropertySyntax.LIST_OF_POINTS] = new CSSPropertyPoints()), + (_a[PropertySyntax.SHADOW_BLUR] = new CSSPropertyShadowBlur()), + (_a[PropertySyntax.TEXT] = new CSSPropertyText()), + (_a[PropertySyntax.TEXT_TRANSFORM] = new CSSPropertyTextTransform()), + (_a[PropertySyntax.TRANSFORM] = new CSSPropertyTransform()), + (_a[PropertySyntax.TRANSFORM_ORIGIN] = new CSSPropertyTransformOrigin()), + (_a[PropertySyntax.Z_INDEX] = new CSSPropertyZIndex()), + (_a[PropertySyntax.MARKER] = new CSSPropertyMarker()), + _a + ); + })(); + var getGlobalThis = function () { + if (typeof globalThis !== 'undefined') return globalThis; + if (typeof self !== 'undefined') return self; + if (typeof window !== 'undefined') return window; + // @ts-ignore + if (typeof global !== 'undefined') return global; + return {}; + // [!] Error: The 'this' keyword is equivalent to 'undefined' at the top level of an ES module, and has been rewritten + // @see https://rollupjs.org/troubleshooting/#error-this-is-undefined + // if (typeof this !== 'undefined') return this; + }; + /** + * Camera + * `g-camera-api` will provide an advanced implementation + */ + runtime.CameraContribution = Camera; + /** + * `g-web-animations-api` will provide an AnimationTimeline + */ + runtime.AnimationTimeline = null; + runtime.EasingFunction = null; + runtime.offscreenCanvasCreator = new OffscreenCanvasCreator(); + runtime.sceneGraphSelector = new DefaultSceneGraphSelector(); + runtime.sceneGraphService = new DefaultSceneGraphService(runtime); + runtime.textService = new TextService(runtime); + runtime.geometryUpdaterFactory = geometryUpdaterFactory; + runtime.CSSPropertySyntaxFactory = CSSPropertySyntaxFactory; + runtime.styleValueRegistry = new DefaultStyleValueRegistry(runtime); + runtime.layoutRegistry = null; + runtime.globalThis = getGlobalThis(); + runtime.enableCSSParsing = false; + runtime.enableDataset = false; + runtime.enableStyleSyntax = true; + runtime.enableAttributeDashCased = false; + runtime.enableSizeAttenuation = false; + + var entityCounter = 0; + var insertedEvent = new MutationEvent(ElementEvent.INSERTED, null, '', '', '', 0, '', ''); + var removedEvent = new MutationEvent(ElementEvent.REMOVED, null, '', '', '', 0, '', ''); + var destroyEvent = new CustomEvent(ElementEvent.DESTROY); + /** + * Has following capabilities: + * * Node insert/remove, eg. appendChild, removeChild, remove... + * * Query eg. querySelector getElementById... + * * Animation + */ + var Element = /** @class */ (function (_super) { + __extends(Element, _super); + function Element() { + var _this = _super.call(this) || this; + /** + * Unique id. + */ + _this.entity = entityCounter++; + _this.renderable = { + bounds: undefined, + boundsDirty: true, + renderBounds: undefined, + renderBoundsDirty: true, + dirtyRenderBounds: undefined, + dirty: false, + }; + _this.cullable = { + strategy: Strategy.Standard, + visibilityPlaneMask: -1, + visible: true, + enable: true, + }; + _this.transformable = { + dirtyFlag: false, + localDirtyFlag: false, + frozen: false, + localPosition: [0, 0, 0], + localRotation: [0, 0, 0, 1], + localScale: [1, 1, 1], + localTransform: [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], + localSkew: [0, 0], + position: [0, 0, 0], + rotation: [0, 0, 0, 1], + scaling: [1, 1, 1], + worldTransform: [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], + origin: [0, 0, 0], + }; + _this.sortable = { + dirty: false, + sorted: undefined, + renderOrder: 0, + dirtyChildren: [], + dirtyReason: undefined, + }; + _this.geometry = { + contentBounds: undefined, + renderBounds: undefined, + dirty: true, + }; + _this.rBushNode = { + aabb: undefined, + }; + /** + * https://developer.mozilla.org/zh-CN/docs/Web/API/Element/namespaceURI + */ + _this.namespaceURI = 'g'; + _this.scrollLeft = 0; + _this.scrollTop = 0; + /** + * We don't support border now + * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/clientTop + */ + _this.clientTop = 0; + _this.clientLeft = 0; + /** + * is destroyed or not + */ + _this.destroyed = false; + /** + * compatible with `style` + * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/style + */ + _this.style = {}; + _this.computedStyle = runtime.enableCSSParsing + ? { + opacity: unsetKeywordValue, + fillOpacity: unsetKeywordValue, + strokeOpacity: unsetKeywordValue, + fill: unsetKeywordValue, + stroke: unsetKeywordValue, + transform: unsetKeywordValue, + transformOrigin: unsetKeywordValue, + visibility: unsetKeywordValue, + pointerEvents: unsetKeywordValue, + lineWidth: unsetKeywordValue, + lineCap: unsetKeywordValue, + lineJoin: unsetKeywordValue, + increasedLineWidthForHitTesting: unsetKeywordValue, + fontSize: unsetKeywordValue, + fontFamily: unsetKeywordValue, + fontStyle: unsetKeywordValue, + fontWeight: unsetKeywordValue, + fontVariant: unsetKeywordValue, + textAlign: unsetKeywordValue, + textBaseline: unsetKeywordValue, + textTransform: unsetKeywordValue, + zIndex: unsetKeywordValue, + filter: unsetKeywordValue, + shadowType: unsetKeywordValue, + } + : null; + /** + * Renderers will use these used values. + */ + _this.parsedStyle = { + // opacity: '', + // fillOpacity: '', + // strokeOpacity: '', + // transformOrigin: '', + // visibility: '', + // pointerEvents: '', + // lineWidth: '', + // lineCap: '', + // lineJoin: '', + // increasedLineWidthForHitTesting: '', + // fontSize: '', + // fontFamily: '', + // fontStyle: '', + // fontWeight: '', + // fontVariant: '', + // textAlign: '', + // textBaseline: '', + // textTransform: '', + }; + /** + * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/attributes + */ + _this.attributes = {}; + return _this; + } + Object.defineProperty(Element.prototype, 'className', { + /** + * used in `getElementsByClassName` + * @see https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByClassName + */ + get: function () { + // @ts-ignore + return this.getAttribute('class') || ''; + }, + set: function (className) { + this.setAttribute('class', className); + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(Element.prototype, 'classList', { + /** + * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/classList + */ + get: function () { + return this.className.split(' ').filter(function (c) { + return c !== ''; + }); + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(Element.prototype, 'tagName', { + get: function () { + return this.nodeName; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(Element.prototype, 'children', { + get: function () { + return this.childNodes; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(Element.prototype, 'childElementCount', { + get: function () { + return this.childNodes.length; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(Element.prototype, 'firstElementChild', { + get: function () { + return this.firstChild; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(Element.prototype, 'lastElementChild', { + get: function () { + return this.lastChild; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(Element.prototype, 'parentElement', { + get: function () { + return this.parentNode; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(Element.prototype, 'nextSibling', { + get: function () { + if (this.parentNode) { + var index = this.parentNode.childNodes.indexOf(this); + return this.parentNode.childNodes[index + 1] || null; + } + return null; + }, + enumerable: false, + configurable: true, + }); + Object.defineProperty(Element.prototype, 'previousSibling', { + get: function () { + if (this.parentNode) { + var index = this.parentNode.childNodes.indexOf(this); + return this.parentNode.childNodes[index - 1] || null; + } + return null; + }, + enumerable: false, + configurable: true, + }); + Element.prototype.cloneNode = function (deep) { + throw new Error(ERROR_MSG_METHOD_NOT_IMPLEMENTED); + }; + Element.prototype.appendChild = function (child, index) { + var _a; + if (child.destroyed) { + throw new Error(ERROR_MSG_APPEND_DESTROYED_ELEMENT); + } + runtime.sceneGraphService.attach(child, this, index); + if ((_a = this.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView) { + this.ownerDocument.defaultView.mountChildren(child); + } + // @ts-ignore + if (this.isMutationObserved) { + insertedEvent.relatedNode = this; + child.dispatchEvent(insertedEvent); + } + return child; + }; + Element.prototype.insertBefore = function (newChild, refChild) { + if (!refChild) { + this.appendChild(newChild); + } else { + if (newChild.parentElement) { + newChild.parentElement.removeChild(newChild); + } + var index = this.childNodes.indexOf(refChild); + if (index === -1) { + this.appendChild(newChild); + } else { + this.appendChild(newChild, index); + } + } + return newChild; + }; + Element.prototype.replaceChild = function (newChild, oldChild) { + var index = this.childNodes.indexOf(oldChild); + this.removeChild(oldChild); + this.appendChild(newChild, index); + return oldChild; + }; + Element.prototype.removeChild = function (child) { + var _a; + // should emit on itself before detach + removedEvent.relatedNode = this; + child.dispatchEvent(removedEvent); + if ((_a = child.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView) { + child.ownerDocument.defaultView.unmountChildren(child); + } + // remove from scene graph + runtime.sceneGraphService.detach(child); + return child; + }; + /** + * Remove all children which can be appended to its original parent later again. + */ + Element.prototype.removeChildren = function () { + for (var i = this.childNodes.length - 1; i >= 0; i--) { + var child = this.childNodes[i]; + this.removeChild(child); + } + }; + /** + * Recursively destroy all children which can not be appended to its original parent later again. + */ + Element.prototype.destroyChildren = function () { + for (var i = this.childNodes.length - 1; i >= 0; i--) { + var child = this.childNodes[i]; + if (child.childNodes.length) { + child.destroyChildren(); + } + child.destroy(); + } + }; + /** + * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/matches + */ + Element.prototype.matches = function (selector) { + return runtime.sceneGraphService.matches(selector, this); + }; + Element.prototype.getElementById = function (id) { + return runtime.sceneGraphService.querySelector('#'.concat(id), this); + }; + Element.prototype.getElementsByName = function (name) { + return runtime.sceneGraphService.querySelectorAll('[name="'.concat(name, '"]'), this); + }; + Element.prototype.getElementsByClassName = function (className) { + return runtime.sceneGraphService.querySelectorAll('.'.concat(className), this); + }; + Element.prototype.getElementsByTagName = function (tagName) { + return runtime.sceneGraphService.querySelectorAll(tagName, this); + }; + Element.prototype.querySelector = function (selectors) { + return runtime.sceneGraphService.querySelector(selectors, this); + }; + Element.prototype.querySelectorAll = function (selectors) { + return runtime.sceneGraphService.querySelectorAll(selectors, this); + }; + /** + * should traverses the element and its parents (heading toward the document root) + * until it finds a node that matches the specified CSS selector. + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/closest + * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#polyfill + */ + Element.prototype.closest = function (selectors) { + var el = this; + do { + if (runtime.sceneGraphService.matches(selectors, el)) return el; + el = el.parentElement; + } while (el !== null); + return null; + }; + /** + * search in scene group, but should not include itself + */ + Element.prototype.find = function (filter) { + var _this = this; + var target = null; + this.forEach(function (object) { + if (object !== _this && filter(object)) { + target = object; + return true; + } + return false; + }); + return target; + }; + Element.prototype.findAll = function (filter) { + var _this = this; + var objects = []; + this.forEach(function (object) { + if (object !== _this && filter(object)) { + objects.push(object); + } + }); + return objects; + }; + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/after + */ + Element.prototype.after = function () { + var _this = this; + var nodes = []; + for (var _i = 0; _i < arguments.length; _i++) { + nodes[_i] = arguments[_i]; + } + if (this.parentNode) { + var index_1 = this.parentNode.childNodes.indexOf(this); + nodes.forEach(function (node, i) { + var _a; + return (_a = _this.parentNode) === null || _a === void 0 + ? void 0 + : _a.appendChild(node, index_1 + i + 1); + }); + } + }; + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/before + */ + Element.prototype.before = function () { + var _a; + var nodes = []; + for (var _i = 0; _i < arguments.length; _i++) { + nodes[_i] = arguments[_i]; + } + if (this.parentNode) { + var index = this.parentNode.childNodes.indexOf(this); + var _b = __read(nodes), + first = _b[0], + rest = _b.slice(1); + this.parentNode.appendChild(first, index); + (_a = first).after.apply(_a, __spreadArray([], __read(rest), false)); + } + }; + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/replaceWith + */ + Element.prototype.replaceWith = function () { + var nodes = []; + for (var _i = 0; _i < arguments.length; _i++) { + nodes[_i] = arguments[_i]; + } + this.after.apply(this, __spreadArray([], __read(nodes), false)); + this.remove(); + }; + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/append + */ + Element.prototype.append = function () { + var _this = this; + var nodes = []; + for (var _i = 0; _i < arguments.length; _i++) { + nodes[_i] = arguments[_i]; + } + nodes.forEach(function (node) { + return _this.appendChild(node); + }); + }; + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/prepend + */ + Element.prototype.prepend = function () { + var _this = this; + var nodes = []; + for (var _i = 0; _i < arguments.length; _i++) { + nodes[_i] = arguments[_i]; + } + nodes.forEach(function (node, i) { + return _this.appendChild(node, i); + }); + }; + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/replaceChildren + */ + Element.prototype.replaceChildren = function () { + var nodes = []; + for (var _i = 0; _i < arguments.length; _i++) { + nodes[_i] = arguments[_i]; + } + while (this.childNodes.length && this.firstChild) { + this.removeChild(this.firstChild); + } + this.append.apply(this, __spreadArray([], __read(nodes), false)); + }; + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/remove + */ + Element.prototype.remove = function () { + if (this.parentNode) { + return this.parentNode.removeChild(this); + } + return this; + }; + Element.prototype.destroy = function () { + // destroy itself before remove + this.dispatchEvent(destroyEvent); + // remove from scenegraph first + this.remove(); + // remove event listeners + this.emitter.removeAllListeners(); + this.destroyed = true; + }; + Element.prototype.getGeometryBounds = function () { + return runtime.sceneGraphService.getGeometryBounds(this); + }; + Element.prototype.getRenderBounds = function () { + return runtime.sceneGraphService.getBounds(this, true); + }; + /** + * get bounds in world space, account for children + */ + Element.prototype.getBounds = function () { + return runtime.sceneGraphService.getBounds(this); + }; + /** + * get bounds in local space, account for children + */ + Element.prototype.getLocalBounds = function () { + return runtime.sceneGraphService.getLocalBounds(this); + }; + /** + * account for context's bounds in client space, + * but not accounting for children + * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect + */ + Element.prototype.getBoundingClientRect = function () { + return runtime.sceneGraphService.getBoundingClientRect(this); + }; + /** + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/getClientRects + */ + Element.prototype.getClientRects = function () { + return [this.getBoundingClientRect()]; + }; + /** + * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/computedStyleMap + * eg. circle.computedStyleMap().get('fill'); + */ + Element.prototype.computedStyleMap = function () { + return new Map(Object.entries(this.computedStyle)); + }; + /** + * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttributeNames + */ + Element.prototype.getAttributeNames = function () { + return Object.keys(this.attributes); + }; + /** + * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttribute + */ + Element.prototype.getAttribute = function (name) { + // @see https://github.com/antvis/G/issues/1267 + if (isSymbol(name)) { + return runtime.enableCSSParsing ? null : undefined; + } + var value = this.attributes[name]; + if (value === undefined) { + if (runtime.enableAttributeDashCased) { + var attributeName = formatAttributeName(name); + value = this.attributes[attributeName]; + } + // if the given attribute does not exist, the value returned will either be null or "" + return runtime.enableCSSParsing ? (isNil(value) ? null : value) : value; + } else { + return value; + } + }; + /** + * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/hasAttribute + */ + Element.prototype.hasAttribute = function (qualifiedName) { + return this.getAttributeNames().includes(qualifiedName); + }; + /** + * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/hasAttributes + */ + Element.prototype.hasAttributes = function () { + return !!this.getAttributeNames().length; + }; + /** + * should use removeAttribute() instead of setting the attribute value to null either directly or using setAttribute(). Many attributes will not behave as expected if you set them to null. + * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/removeAttribute + */ + Element.prototype.removeAttribute = function (attributeName) { + this.setAttribute(attributeName, null); + delete this.attributes[attributeName]; + }; + /** + * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/setAttribute + */ + Element.prototype.setAttribute = function (attributeName, value, force, memoize) { + this.attributes[attributeName] = value; + }; + Element.prototype.getAttributeNS = function (namespace, localName) { + throw new Error(ERROR_MSG_METHOD_NOT_IMPLEMENTED); + }; + Element.prototype.getAttributeNode = function (qualifiedName) { + throw new Error(ERROR_MSG_METHOD_NOT_IMPLEMENTED); + }; + Element.prototype.getAttributeNodeNS = function (namespace, localName) { + throw new Error(ERROR_MSG_METHOD_NOT_IMPLEMENTED); + }; + Element.prototype.hasAttributeNS = function (namespace, localName) { + throw new Error(ERROR_MSG_METHOD_NOT_IMPLEMENTED); + }; + Element.prototype.removeAttributeNS = function (namespace, localName) { + throw new Error(ERROR_MSG_METHOD_NOT_IMPLEMENTED); + }; + Element.prototype.removeAttributeNode = function (attr) { + throw new Error(ERROR_MSG_METHOD_NOT_IMPLEMENTED); + }; + Element.prototype.setAttributeNS = function (namespace, qualifiedName, value) { + throw new Error(ERROR_MSG_METHOD_NOT_IMPLEMENTED); + }; + Element.prototype.setAttributeNode = function (attr) { + throw new Error(ERROR_MSG_METHOD_NOT_IMPLEMENTED); + }; + Element.prototype.setAttributeNodeNS = function (attr) { + throw new Error(ERROR_MSG_METHOD_NOT_IMPLEMENTED); + }; + Element.prototype.toggleAttribute = function (qualifiedName, force) { + throw new Error(ERROR_MSG_METHOD_NOT_IMPLEMENTED); + }; + return Element; + })(Node); + + function isDisplayObject(value) { + return !!(value === null || value === void 0 ? void 0 : value.nodeName); + } + var Proxy = runtime.globalThis.Proxy ? runtime.globalThis.Proxy : function () {}; + var mutationEvent = new MutationEvent( + ElementEvent.ATTR_MODIFIED, + null, + null, + null, + null, + MutationEvent.MODIFICATION, + null, + null + ); + var DEFAULT_STYLE_PROPS = { + opacity: '', + fillOpacity: '', + strokeOpacity: '', + fill: '', + stroke: '', + transform: '', + transformOrigin: '', + visibility: '', + pointerEvents: '', + lineWidth: '', + lineCap: '', + lineJoin: '', + increasedLineWidthForHitTesting: '', + fontSize: '', + fontFamily: '', + fontStyle: '', + fontWeight: '', + fontVariant: '', + textAlign: '', + textBaseline: '', + textTransform: '', + zIndex: '', + filter: '', + shadowType: '', + }; + var DEFAULT_PARSED_STYLE_PROPS = { + fill: noneColor, + stroke: noneColor, + transform: [], + zIndex: 0, + filter: [], + shadowType: 'outer', + miterLimit: 10, + }; + // const DEFAULT_PARSED_STYLE_PROPS_CSS_DISABLED = { + // ...DEFAULT_PARSED_STYLE_PROPS, + // opacity: 1, + // fillOpacity: 1, + // strokeOpacity: 1, + // visibility: 'visible', + // pointerEvents: 'auto', + // lineWidth: 1, + // lineCap: 'butt', + // lineJoin: 'miter', + // increasedLineWidthForHitTesting: 0, + // fillRule: 'nonzero', + // // TODO: transformOrigin + // }; + var INHERITABLE_BASE_STYLE_PROPS = [ + 'opacity', + 'fillOpacity', + 'strokeOpacity', + 'transformOrigin', + 'visibility', + 'pointerEvents', + 'lineWidth', + 'lineCap', + 'lineJoin', + 'increasedLineWidthForHitTesting', + ]; + var INHERITABLE_STYLE_PROPS = __spreadArray( + __spreadArray([], __read(INHERITABLE_BASE_STYLE_PROPS), false), + [ + 'fontSize', + 'fontFamily', + 'fontStyle', + 'fontWeight', + 'fontVariant', + 'textAlign', + 'textBaseline', + 'textTransform', + ], + false + ); + var DATASET_PREFIX = 'data-'; + /** + * prototype chains: DisplayObject -> Element -> Node -> EventTarget + * + * mixins: Animatable, Transformable, Visible + * @see https://github.com/tannerntannern/ts-mixer/blob/master/README.md#mixing-generic-classes + * + * Provide abilities in scene graph, such as: + * * transform `translate/rotate/scale` + * * add/remove child + * * visibility and z-index + * + * Those abilities are implemented with those components: `Transform/Sortable/Visible`. + * + * Emit following events: + * * init + * * destroy + * * attributeChanged + */ + var DisplayObject = /** @class */ (function (_super) { + __extends(DisplayObject, _super); + function DisplayObject(config) { + var _this = _super.call(this) || this; + _this.isCustomElement = false; + _this.isMutationObserved = false; + /** + * push to active animations after calling `animate()` + */ + _this.activeAnimations = []; + // assign name, id to config + // eg. group.get('name') + _this.config = config; + // init scene graph node + _this.id = _this.config.id || ''; + _this.name = _this.config.name || ''; + if (_this.config.className || _this.config.class) { + _this.className = _this.config.className || _this.config.class; + } + _this.nodeName = _this.config.type || Shape.GROUP; + if (runtime.enableCSSParsing) { + Object.assign(_this.attributes, DEFAULT_STYLE_PROPS); + Object.assign( + _this.parsedStyle, + DEFAULT_PARSED_STYLE_PROPS, + _this.config.initialParsedStyle + ); + } else if (_this.config.initialParsedStyle) { + Object.assign( + _this.parsedStyle, + // DEFAULT_PARSED_STYLE_PROPS_CSS_DISABLED, + _this.config.initialParsedStyle + ); + } + // start to process attributes + _this.initAttributes(_this.config.style); + if (runtime.enableDataset) { + _this.dataset = new Proxy( + {}, + { + get: function (target, name) { + var formattedName = ''.concat(DATASET_PREFIX).concat(kebabize(name)); + if (target[formattedName] !== undefined) { + return target[formattedName]; + } + return _this.getAttribute(formattedName); + }, + set: function (_, prop, value) { + _this.setAttribute(''.concat(DATASET_PREFIX).concat(kebabize(prop)), value); + return true; + }, + } + ); + } + if (runtime.enableStyleSyntax) { + _this.style = new Proxy( + // @ts-ignore + { + // ...this.attributes, + setProperty: function (propertyName, value) { + _this.setAttribute(propertyName, value); + }, + getPropertyValue: function (propertyName) { + return _this.getAttribute(propertyName); + }, + removeProperty: function (propertyName) { + _this.removeAttribute(propertyName); + }, + item: function () { + return ''; + }, + }, + { + get: function (target, name) { + if (target[name] !== undefined) { + // if (name in target) { + return target[name]; + } + return _this.getAttribute(name); + }, + set: function (_, prop, value) { + _this.setAttribute(prop, value); + return true; + }, + } + ); + } + return _this; + } + DisplayObject.prototype.destroy = function () { + _super.prototype.destroy.call(this); + // stop all active animations + this.getAnimations().forEach(function (animation) { + animation.cancel(); + }); + // FIXME + // this.renderable = null; + // this.cullable = null; + // this.transformable = null; + // this.rBushNode = null; + // this.geometry = null; + // this.sortable = null; + }; + DisplayObject.prototype.cloneNode = function (deep, customCloneFunc) { + var clonedStyle = __assign({}, this.attributes); + for (var attributeName in clonedStyle) { + var attribute = clonedStyle[attributeName]; + // @see https://github.com/antvis/G/issues/1095 + if ( + isDisplayObject(attribute) && + // share the same clipPath if possible + attributeName !== 'clipPath' && + attributeName !== 'offsetPath' && + attributeName !== 'textPath' + ) { + clonedStyle[attributeName] = attribute.cloneNode(deep); + } + // TODO: clone other type + if (customCloneFunc) { + clonedStyle[attributeName] = customCloneFunc(attributeName, attribute); + } + } + var cloned = new this.constructor({ + // copy id & name + // @see https://developer.mozilla.org/en-US/docs/Web/API/Node/cloneNode#notes + id: this.id, + name: this.name, + className: this.name, + interactive: this.interactive, + style: clonedStyle, + }); + // apply transform + cloned.setLocalTransform(this.getLocalTransform()); + if (deep) { + this.children.forEach(function (child) { + // skip marker + if (!child.style.isMarker) { + var clonedChild = child.cloneNode(deep); + cloned.appendChild(clonedChild); + } + }); + } + return cloned; + }; + DisplayObject.prototype.initAttributes = function (attributes) { + if (attributes === void 0) { + attributes = {}; + } + var renderable = this.renderable; + var options = { + forceUpdateGeometry: true, + // usedAttributes: + // // only Group / Text should account for text relative props + // this.tagName === Shape.GROUP || this.tagName === Shape.TEXT + // ? INHERITABLE_STYLE_PROPS + // : INHERITABLE_BASE_STYLE_PROPS, + }; + if (runtime.enableCSSParsing) { + // @ts-ignore + options.usedAttributes = INHERITABLE_STYLE_PROPS; + } + // account for FCP, process properties as less as possible + var formattedAttributes = attributes; + if (runtime.enableAttributeDashCased) { + // @ts-ignore + formattedAttributes = {}; + for (var name_1 in attributes) { + var attributeName = formatAttributeName(name_1); + formattedAttributes[attributeName] = attributes[name_1]; + } + } + runtime.styleValueRegistry.processProperties(this, formattedAttributes, options); + // redraw at next frame + renderable.dirty = true; + }; + DisplayObject.prototype.setAttribute = function (name, value, force, memoize) { + if (force === void 0) { + force = false; + } + if (memoize === void 0) { + memoize = true; + } + if (runtime.enableAttributeDashCased) { + name = formatAttributeName(name); + } + // ignore undefined value + if (isUndefined(value)) { + return; + } + if (force || value !== this.attributes[name]) { + this.internalSetAttribute(name, value, { memoize: memoize }); + _super.prototype.setAttribute.call(this, name, value); + } + }; + /** + * called when attributes get changed or initialized + */ + DisplayObject.prototype.internalSetAttribute = function (name, value, parseOptions) { + var _a; + if (parseOptions === void 0) { + parseOptions = {}; + } + var renderable = this.renderable; + var oldValue = this.attributes[name]; + var oldParsedValue = this.parsedStyle[name]; + runtime.styleValueRegistry.processProperties( + this, + ((_a = {}), (_a[name] = value), _a), + parseOptions + ); + // redraw at next frame + renderable.dirty = true; + var newParsedValue = this.parsedStyle[name]; + if (this.isConnected) { + mutationEvent.relatedNode = this; + mutationEvent.prevValue = oldValue; + mutationEvent.newValue = value; + mutationEvent.attrName = name; + mutationEvent.prevParsedValue = oldParsedValue; + mutationEvent.newParsedValue = newParsedValue; + if (this.isMutationObserved) { + this.dispatchEvent(mutationEvent); + } else { + mutationEvent.target = this; + this.ownerDocument.defaultView.dispatchEvent(mutationEvent, true); + } + } + if ( + ((this.isCustomElement && this.isConnected) || !this.isCustomElement) && + this.attributeChangedCallback + ) { + this.attributeChangedCallback(name, oldValue, value, oldParsedValue, newParsedValue); + } + }; + // #region transformable + /** + * returns different values than getBoundingClientRect(), as the latter returns value relative to the viewport + * @see https://developer.mozilla.org/en-US/docs/Web/API/SVGGraphicsElement/getBBox + * + * FIXME: It is worth noting that getBBox responds to original untransformed values of a drawn object. + * @see https://www.w3.org/Graphics/SVG/IG/resources/svgprimer.html#getBBox + */ + DisplayObject.prototype.getBBox = function () { + var aabb = this.getBounds(); + var _a = __read(aabb.getMin(), 2), + left = _a[0], + top = _a[1]; + var _b = __read(aabb.getMax(), 2), + right = _b[0], + bottom = _b[1]; + return new Rectangle(left, top, right - left, bottom - top); + }; + DisplayObject.prototype.setOrigin = function (position, y, z) { + if (y === void 0) { + y = 0; + } + if (z === void 0) { + z = 0; + } + runtime.sceneGraphService.setOrigin(this, createVec3(position, y, z)); + return this; + }; + DisplayObject.prototype.getOrigin = function () { + return runtime.sceneGraphService.getOrigin(this); + }; + /** + * set position in world space + */ + DisplayObject.prototype.setPosition = function (position, y, z) { + if (y === void 0) { + y = 0; + } + if (z === void 0) { + z = 0; + } + runtime.sceneGraphService.setPosition(this, createVec3(position, y, z)); + return this; + }; + /** + * set position in local space + */ + DisplayObject.prototype.setLocalPosition = function (position, y, z) { + if (y === void 0) { + y = 0; + } + if (z === void 0) { + z = 0; + } + runtime.sceneGraphService.setLocalPosition(this, createVec3(position, y, z)); + return this; + }; + /** + * translate in world space + */ + DisplayObject.prototype.translate = function (position, y, z) { + if (y === void 0) { + y = 0; + } + if (z === void 0) { + z = 0; + } + runtime.sceneGraphService.translate(this, createVec3(position, y, z)); + return this; + }; + /** + * translate in local space + */ + DisplayObject.prototype.translateLocal = function (position, y, z) { + if (y === void 0) { + y = 0; + } + if (z === void 0) { + z = 0; + } + runtime.sceneGraphService.translateLocal(this, createVec3(position, y, z)); + return this; + }; + DisplayObject.prototype.getPosition = function () { + return runtime.sceneGraphService.getPosition(this); + }; + DisplayObject.prototype.getLocalPosition = function () { + return runtime.sceneGraphService.getLocalPosition(this); + }; + /** + * compatible with G 3.0 + * + * scaling in local space + * scale(10) = scale(10, 10, 10) + * + * we can't set scale in world space + */ + DisplayObject.prototype.scale = function (scaling, y, z) { + return this.scaleLocal(scaling, y, z); + }; + DisplayObject.prototype.scaleLocal = function (scaling, y, z) { + if (typeof scaling === 'number') { + y = y || scaling; + z = z || scaling; + scaling = createVec3(scaling, y, z); + } + runtime.sceneGraphService.scaleLocal(this, scaling); + return this; + }; + /** + * set scaling in local space + */ + DisplayObject.prototype.setLocalScale = function (scaling, y, z) { + if (typeof scaling === 'number') { + y = y || scaling; + z = z || scaling; + scaling = createVec3(scaling, y, z); + } + runtime.sceneGraphService.setLocalScale(this, scaling); + return this; + }; + /** + * get scaling in local space + */ + DisplayObject.prototype.getLocalScale = function () { + return runtime.sceneGraphService.getLocalScale(this); + }; + /** + * get scaling in world space + */ + DisplayObject.prototype.getScale = function () { + return runtime.sceneGraphService.getScale(this); + }; + /** + * only return degrees of Z axis in world space + */ + DisplayObject.prototype.getEulerAngles = function () { + var _a = __read(getEuler(create$2(), runtime.sceneGraphService.getWorldTransform(this)), 3), + ez = _a[2]; + return rad2deg(ez); + }; + /** + * only return degrees of Z axis in local space + */ + DisplayObject.prototype.getLocalEulerAngles = function () { + var _a = __read(getEuler(create$2(), runtime.sceneGraphService.getLocalRotation(this)), 3), + ez = _a[2]; + return rad2deg(ez); + }; + /** + * set euler angles(degrees) in world space + */ + DisplayObject.prototype.setEulerAngles = function (z) { + runtime.sceneGraphService.setEulerAngles(this, 0, 0, z); + return this; + }; + /** + * set euler angles(degrees) in local space + */ + DisplayObject.prototype.setLocalEulerAngles = function (z) { + runtime.sceneGraphService.setLocalEulerAngles(this, 0, 0, z); + return this; + }; + DisplayObject.prototype.rotateLocal = function (x, y, z) { + if (isNil(y) && isNil(z)) { + runtime.sceneGraphService.rotateLocal(this, 0, 0, x); + } else { + runtime.sceneGraphService.rotateLocal(this, x, y, z); + } + return this; + }; + DisplayObject.prototype.rotate = function (x, y, z) { + if (isNil(y) && isNil(z)) { + runtime.sceneGraphService.rotate(this, 0, 0, x); + } else { + runtime.sceneGraphService.rotate(this, x, y, z); + } + return this; + }; + DisplayObject.prototype.setRotation = function (rotation, y, z, w) { + runtime.sceneGraphService.setRotation(this, rotation, y, z, w); + return this; + }; + DisplayObject.prototype.setLocalRotation = function (rotation, y, z, w) { + runtime.sceneGraphService.setLocalRotation(this, rotation, y, z, w); + return this; + }; + DisplayObject.prototype.setLocalSkew = function (skew, y) { + runtime.sceneGraphService.setLocalSkew(this, skew, y); + return this; + }; + DisplayObject.prototype.getRotation = function () { + return runtime.sceneGraphService.getRotation(this); + }; + DisplayObject.prototype.getLocalRotation = function () { + return runtime.sceneGraphService.getLocalRotation(this); + }; + DisplayObject.prototype.getLocalSkew = function () { + return runtime.sceneGraphService.getLocalSkew(this); + }; + DisplayObject.prototype.getLocalTransform = function () { + return runtime.sceneGraphService.getLocalTransform(this); + }; + DisplayObject.prototype.getWorldTransform = function () { + return runtime.sceneGraphService.getWorldTransform(this); + }; + DisplayObject.prototype.setLocalTransform = function (transform) { + runtime.sceneGraphService.setLocalTransform(this, transform); + return this; + }; + DisplayObject.prototype.resetLocalTransform = function () { + runtime.sceneGraphService.resetLocalTransform(this); + }; + // #endregion transformable + // #region animatable + /** + * returns an array of all Animation objects affecting this element + * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/getAnimations + */ + DisplayObject.prototype.getAnimations = function () { + return this.activeAnimations; + }; + /** + * create an animation with WAAPI + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/animate + */ + DisplayObject.prototype.animate = function (keyframes, options) { + var _a; + var timeline = (_a = this.ownerDocument) === null || _a === void 0 ? void 0 : _a.timeline; + if (timeline) { + return timeline.play(this, keyframes, options); + } + return null; + }; + // #endregion animatable + // #region visible + /** + * shortcut for Used value of `visibility` + */ + DisplayObject.prototype.isVisible = function () { + var _a, _b; + return runtime.enableCSSParsing + ? ((_a = this.parsedStyle) === null || _a === void 0 ? void 0 : _a.visibility) === 'visible' + : ((_b = this.parsedStyle) === null || _b === void 0 ? void 0 : _b.visibility) !== 'hidden'; + }; + Object.defineProperty(DisplayObject.prototype, 'interactive', { + get: function () { + return this.isInteractive(); + }, + set: function (b) { + this.style.pointerEvents = b ? 'auto' : 'none'; + }, + enumerable: false, + configurable: true, + }); + DisplayObject.prototype.isInteractive = function () { + var _a; + return ( + ((_a = this.parsedStyle) === null || _a === void 0 ? void 0 : _a.pointerEvents) !== 'none' + ); + }; + DisplayObject.prototype.isCulled = function () { + return !!(this.cullable && this.cullable.enable && !this.cullable.visible); + }; + /** + * bring to front in current group + */ + DisplayObject.prototype.toFront = function () { + if (this.parentNode) { + this.style.zIndex = + Math.max.apply( + Math, + __spreadArray( + [], + __read( + this.parentNode.children.map(function (child) { + return Number(child.style.zIndex); + }) + ), + false + ) + ) + 1; + } + return this; + }; + /** + * send to back in current group + */ + DisplayObject.prototype.toBack = function () { + if (this.parentNode) { + this.style.zIndex = + Math.min.apply( + Math, + __spreadArray( + [], + __read( + this.parentNode.children.map(function (child) { + return Number(child.style.zIndex); + }) + ), + false + ) + ) - 1; + } + return this; + }; + // #endregion visible + // #region deprecated + /** + * compatible with G 3.0 + * @alias object.config + * @deprecated + */ + DisplayObject.prototype.getConfig = function () { + return this.config; + }; + DisplayObject.prototype.attr = function () { + var _this = this; + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var _a = __read(args, 2), + name = _a[0], + value = _a[1]; + if (!name) { + return this.attributes; + } + if (isObject(name)) { + Object.keys(name).forEach(function (key) { + _this.setAttribute(key, name[key]); + }); + return this; + } + if (args.length === 2) { + this.setAttribute(name, value); + return this; + } + return this.attributes[name]; + }; + /** + * return 3x3 matrix in world space + * @deprecated + */ + DisplayObject.prototype.getMatrix = function (transformMat4) { + var transform = transformMat4 || this.getWorldTransform(); + var _a = __read(getTranslation(create$2(), transform), 2), + tx = _a[0], + ty = _a[1]; + var _b = __read(getScaling(create$2(), transform), 2), + sx = _b[0], + sy = _b[1]; + var rotation = getRotation(create$4(), transform); + var _c = __read(getEuler(create$2(), rotation), 3), + eux = _c[0], + euz = _c[2]; + // gimbal lock at 90 degrees + return fromRotationTranslationScale$1(eux || euz, tx, ty, sx, sy); + }; + /** + * return 3x3 matrix in local space + * @deprecated + */ + DisplayObject.prototype.getLocalMatrix = function () { + return this.getMatrix(this.getLocalTransform()); + }; + /** + * set 3x3 matrix in world space + * @deprecated + */ + DisplayObject.prototype.setMatrix = function (mat) { + var _a = __read(decompose(mat), 5), + tx = _a[0], + ty = _a[1], + scalingX = _a[2], + scalingY = _a[3], + angle = _a[4]; + this.setEulerAngles(angle).setPosition(tx, ty).setLocalScale(scalingX, scalingY); + }; + /** + * set 3x3 matrix in local space + * @deprecated + */ + DisplayObject.prototype.setLocalMatrix = function (mat) { + var _a = __read(decompose(mat), 5), + tx = _a[0], + ty = _a[1], + scalingX = _a[2], + scalingY = _a[3], + angle = _a[4]; + this.setLocalEulerAngles(angle).setLocalPosition(tx, ty).setLocalScale(scalingX, scalingY); + }; + /** + * Use `visibility: visible` instead. + * @deprecated + */ + DisplayObject.prototype.show = function () { + if (runtime.enableCSSParsing) { + this.style.visibility = 'visible'; + } else { + this.forEach(function (object) { + object.style.visibility = 'visible'; + }); + } + }; + /** + * Use `visibility: hidden` instead. + * @deprecated + */ + DisplayObject.prototype.hide = function () { + if (runtime.enableCSSParsing) { + this.style.visibility = 'hidden'; + } else { + this.forEach(function (object) { + object.style.visibility = 'hidden'; + }); + } + }; + /** + * Use `childElementCount` instead. + * @deprecated + */ + DisplayObject.prototype.getCount = function () { + return this.childElementCount; + }; + /** + * Use `parentElement` instead. + * @deprecated + */ + DisplayObject.prototype.getParent = function () { + return this.parentElement; + }; + /** + * Use `children` instead. + * @deprecated + */ + DisplayObject.prototype.getChildren = function () { + return this.children; + }; + /** + * Use `firstElementChild` instead. + * @deprecated + */ + DisplayObject.prototype.getFirst = function () { + return this.firstElementChild; + }; + /** + * Use `lastElementChild` instead. + * @deprecated + */ + DisplayObject.prototype.getLast = function () { + return this.lastElementChild; + }; + /** + * Use `this.children[index]` instead. + * @deprecated + */ + DisplayObject.prototype.getChildByIndex = function (index) { + return this.children[index] || null; + }; + /** + * Use `appendChild` instead. + * @deprecated + */ + DisplayObject.prototype.add = function (child, index) { + return this.appendChild(child, index); + }; + /** + * @deprecated + */ + DisplayObject.prototype.set = function (name, value) { + // @ts-ignore + this.config[name] = value; + }; + /** + * @deprecated + */ + DisplayObject.prototype.get = function (name) { + return this.config[name]; + }; + /** + * Use `setPosition` instead. + * @deprecated + */ + DisplayObject.prototype.moveTo = function (position, y, z) { + if (y === void 0) { + y = 0; + } + if (z === void 0) { + z = 0; + } + this.setPosition(position, y, z); + return this; + }; + /** + * Use `setPosition` instead. + * @deprecated + */ + DisplayObject.prototype.move = function (position, y, z) { + if (y === void 0) { + y = 0; + } + if (z === void 0) { + z = 0; + } + this.setPosition(position, y, z); + return this; + }; + /** + * Use `this.style.zIndex` instead. + * @deprecated + */ + DisplayObject.prototype.setZIndex = function (zIndex) { + this.style.zIndex = zIndex; + return this; + }; + return DisplayObject; + })(Element); + + var Circle = /** @class */ (function (_super) { + __extends(Circle, _super); + function Circle(options) { + if (options === void 0) { + options = {}; + } + return _super.call(this, __assign({ type: Shape.CIRCLE }, options)) || this; + } + return Circle; + })(DisplayObject); + + /** + * shadow root + * @see https://yuque.antfin-inc.com/antv/czqvg5/pgqipg + */ + var CustomElement = /** @class */ (function (_super) { + __extends(CustomElement, _super); + // private shadowNodes: DisplayObject[] = []; + function CustomElement(_a) { + if (_a === void 0) { + _a = {}; + } + var _this = this; + var style = _a.style, + rest = __rest(_a, ['style']); + _this = + _super.call( + this, + __assign( + { style: runtime.enableCSSParsing ? __assign({}, style) : __assign({}, style) }, + rest + ) + ) || this; + // static get observedAttributes(): string[] { + // return []; + // } + _this.isCustomElement = true; + return _this; + } + return CustomElement; + })(DisplayObject); + + var Ellipse = /** @class */ (function (_super) { + __extends(Ellipse, _super); + function Ellipse(options) { + if (options === void 0) { + options = {}; + } + return _super.call(this, __assign({ type: Shape.ELLIPSE }, options)) || this; + } + return Ellipse; + })(DisplayObject); + + /** + * its attributes are inherited by its children. + * @see https://developer.mozilla.org/zh-CN/docs/Web/SVG/Element/g + * + * @example + * + + + + */ + var Group = /** @class */ (function (_super) { + __extends(Group, _super); + function Group(options) { + if (options === void 0) { + options = {}; + } + return _super.call(this, __assign({ type: Shape.GROUP }, options)) || this; + } + return Group; + })(DisplayObject); + + /** + * HTML container + * @see https://github.com/pmndrs/drei#html + */ + var HTML = /** @class */ (function (_super) { + __extends(HTML, _super); + function HTML(_a) { + if (_a === void 0) { + _a = {}; + } + var _this = this; + var style = _a.style, + rest = __rest(_a, ['style']); + _this = + _super.call( + this, + __assign( + { + type: Shape.HTML, + style: runtime.enableCSSParsing + ? __assign({ x: '', y: '', width: 'auto', height: 'auto', innerHTML: '' }, style) + : __assign({}, style), + }, + rest + ) + ) || this; + _this.cullable.enable = false; + return _this; + } + /** + * return wrapper HTMLElement + * *

in g-webgl/canvas + * * in g-svg + */ + HTML.prototype.getDomElement = function () { + return this.parsedStyle.$el; + }; + /** + * override with $el.getBoundingClientRect + * @see https://developer.mozilla.org/zh-CN/docs/Web/API/Element/getBoundingClientRect + */ + HTML.prototype.getBoundingClientRect = function () { + if (this.parsedStyle.$el) { + return this.parsedStyle.$el.getBoundingClientRect(); + } else { + var _a = this.parsedStyle, + x = _a.x, + y = _a.y, + width = _a.width, + height = _a.height; + return new Rectangle(x, y, width, height); + } + }; + HTML.prototype.getClientRects = function () { + return [this.getBoundingClientRect()]; + }; + HTML.prototype.getBounds = function () { + var _a, _b; + var clientRect = this.getBoundingClientRect(); + // calc context's offset + // @ts-ignore + var canvasRect = + (_b = (_a = this.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView) === + null || _b === void 0 + ? void 0 + : _b.getContextService().getBoundingClientRect(); + var aabb = new AABB(); + var minX = + clientRect.left - + ((canvasRect === null || canvasRect === void 0 ? void 0 : canvasRect.left) || 0); + var minY = + clientRect.top - + ((canvasRect === null || canvasRect === void 0 ? void 0 : canvasRect.top) || 0); + aabb.setMinMax([minX, minY, 0], [minX + clientRect.width, minY + clientRect.height, 0]); + return aabb; + }; + HTML.prototype.getLocalBounds = function () { + if (this.parentNode) { + var parentInvert = invert(create$1(), this.parentNode.getWorldTransform()); + var bounds = this.getBounds(); + if (!AABB.isEmpty(bounds)) { + var localBounds = new AABB(); + localBounds.setFromTransformedAABB(bounds, parentInvert); + return localBounds; + } + } + return this.getBounds(); + }; + return HTML; + })(DisplayObject); + + var Image = /** @class */ (function (_super) { + __extends(Image, _super); + function Image(options) { + if (options === void 0) { + options = {}; + } + return _super.call(this, __assign({ type: Shape.IMAGE }, options)) || this; + } + return Image; + })(DisplayObject); + + /** + * Create a line connecting two points. + * @see https://developer.mozilla.org/en-US/docs/Web/SVG/Element/line + * + * Also support for using marker. + */ + var Line = /** @class */ (function (_super) { + __extends(Line, _super); + function Line(_a) { + if (_a === void 0) { + _a = {}; + } + var _this = this; + var style = _a.style, + rest = __rest(_a, ['style']); + _this = + _super.call( + this, + __assign( + { + type: Shape.LINE, + style: __assign({ x1: 0, y1: 0, x2: 0, y2: 0, z1: 0, z2: 0 }, style), + }, + rest + ) + ) || this; + _this.markerStartAngle = 0; + _this.markerEndAngle = 0; + var _b = _this.parsedStyle, + markerStart = _b.markerStart, + markerEnd = _b.markerEnd; + if (markerStart && isDisplayObject(markerStart)) { + _this.markerStartAngle = markerStart.getLocalEulerAngles(); + _this.appendChild(markerStart); + } + if (markerEnd && isDisplayObject(markerEnd)) { + _this.markerEndAngle = markerEnd.getLocalEulerAngles(); + _this.appendChild(markerEnd); + } + _this.transformMarker(true); + _this.transformMarker(false); + return _this; + } + Line.prototype.attributeChangedCallback = function ( + attrName, + oldValue, + newValue, + prevParsedValue, + newParsedValue + ) { + if ( + attrName === 'x1' || + attrName === 'y1' || + attrName === 'x2' || + attrName === 'y2' || + attrName === 'markerStartOffset' || + attrName === 'markerEndOffset' + ) { + this.transformMarker(true); + this.transformMarker(false); + } else if (attrName === 'markerStart') { + if (prevParsedValue && isDisplayObject(prevParsedValue)) { + this.markerStartAngle = 0; + prevParsedValue.remove(); + } + // CSSKeyword 'unset' + if (newParsedValue && isDisplayObject(newParsedValue)) { + this.markerStartAngle = newParsedValue.getLocalEulerAngles(); + this.appendChild(newParsedValue); + this.transformMarker(true); + } + } else if (attrName === 'markerEnd') { + if (prevParsedValue && isDisplayObject(prevParsedValue)) { + this.markerEndAngle = 0; + prevParsedValue.remove(); + } + if (newParsedValue && isDisplayObject(newParsedValue)) { + this.markerEndAngle = newParsedValue.getLocalEulerAngles(); + this.appendChild(newParsedValue); + this.transformMarker(false); + } + } + }; + Line.prototype.transformMarker = function (isStart) { + var _a = this.parsedStyle, + markerStart = _a.markerStart, + markerEnd = _a.markerEnd, + markerStartOffset = _a.markerStartOffset, + markerEndOffset = _a.markerEndOffset, + x1 = _a.x1, + x2 = _a.x2, + y1 = _a.y1, + y2 = _a.y2; + var marker = isStart ? markerStart : markerEnd; + if (!marker || !isDisplayObject(marker)) { + return; + } + var rad = 0; + var x; + var y; + var ox; + var oy; + var offset; + var originalAngle; + if (isStart) { + ox = x1; + oy = y1; + x = x2 - x1; + y = y2 - y1; + offset = markerStartOffset || 0; + originalAngle = this.markerStartAngle; + } else { + ox = x2; + oy = y2; + x = x1 - x2; + y = y1 - y2; + offset = markerEndOffset || 0; + originalAngle = this.markerEndAngle; + } + rad = Math.atan2(y, x); + // account for markerOffset + marker.setLocalEulerAngles((rad * 180) / Math.PI + originalAngle); + marker.setLocalPosition(ox + Math.cos(rad) * offset, oy + Math.sin(rad) * offset); + }; + Line.prototype.getPoint = function (ratio, inWorldSpace) { + if (inWorldSpace === void 0) { + inWorldSpace = false; + } + // TODO: account for z1/z2 in 3D line + var _a = this.parsedStyle, + x1 = _a.x1, + y1 = _a.y1, + x2 = _a.x2, + y2 = _a.y2; + var _b = pointAt$3(x1, y1, x2, y2, ratio), + x = _b.x, + y = _b.y; + var transformed = transformMat4( + create$2(), + fromValues$2(x, y, 0), + inWorldSpace ? this.getWorldTransform() : this.getLocalTransform() + ); + // apply local transformation + return new Point(transformed[0], transformed[1]); + }; + Line.prototype.getPointAtLength = function (distance, inWorldSpace) { + if (inWorldSpace === void 0) { + inWorldSpace = false; + } + return this.getPoint(distance / this.getTotalLength(), inWorldSpace); + }; + Line.prototype.getTotalLength = function () { + // TODO: account for z1/z2 in 3D line + var _a = this.parsedStyle, + x1 = _a.x1, + y1 = _a.y1, + x2 = _a.x2, + y2 = _a.y2; + return length$4(x1, y1, x2, y2); + }; + return Line; + })(DisplayObject); + + var Path = /** @class */ (function (_super) { + __extends(Path, _super); + function Path(_a) { + if (_a === void 0) { + _a = {}; + } + var _this = this; + var style = _a.style, + rest = __rest(_a, ['style']); + _this = + _super.call( + this, + __assign( + { + type: Shape.PATH, + style: runtime.enableCSSParsing + ? __assign({ d: '', miterLimit: '' }, style) + : __assign({}, style), + initialParsedStyle: runtime.enableCSSParsing + ? null + : { + miterLimit: 4, + d: __assign({}, EMPTY_PARSED_PATH), + }, + }, + rest + ) + ) || this; + _this.markerStartAngle = 0; + _this.markerEndAngle = 0; + /** + * markers placed at the mid + */ + _this.markerMidList = []; + var _b = _this.parsedStyle, + markerStart = _b.markerStart, + markerEnd = _b.markerEnd, + markerMid = _b.markerMid; + if (markerStart && isDisplayObject(markerStart)) { + _this.markerStartAngle = markerStart.getLocalEulerAngles(); + _this.appendChild(markerStart); + } + if (markerMid && isDisplayObject(markerMid)) { + _this.placeMarkerMid(markerMid); + } + if (markerEnd && isDisplayObject(markerEnd)) { + _this.markerEndAngle = markerEnd.getLocalEulerAngles(); + _this.appendChild(markerEnd); + } + _this.transformMarker(true); + _this.transformMarker(false); + return _this; + } + Path.prototype.attributeChangedCallback = function ( + attrName, + oldValue, + newValue, + prevParsedValue, + newParsedValue + ) { + if (attrName === 'd') { + // recalc markers + this.transformMarker(true); + this.transformMarker(false); + this.placeMarkerMid(this.parsedStyle.markerMid); + } else if (attrName === 'markerStartOffset' || attrName === 'markerEndOffset') { + this.transformMarker(true); + this.transformMarker(false); + } else if (attrName === 'markerStart') { + if (prevParsedValue && isDisplayObject(prevParsedValue)) { + this.markerStartAngle = 0; + prevParsedValue.remove(); + } + // CSSKeyword 'unset' + if (newParsedValue && isDisplayObject(newParsedValue)) { + this.markerStartAngle = newParsedValue.getLocalEulerAngles(); + this.appendChild(newParsedValue); + this.transformMarker(true); + } + } else if (attrName === 'markerEnd') { + if (prevParsedValue && isDisplayObject(prevParsedValue)) { + this.markerEndAngle = 0; + prevParsedValue.remove(); + } + if (newParsedValue && isDisplayObject(newParsedValue)) { + this.markerEndAngle = newParsedValue.getLocalEulerAngles(); + this.appendChild(newParsedValue); + this.transformMarker(false); + } + } else if (attrName === 'markerMid') { + this.placeMarkerMid(newParsedValue); + } + }; + Path.prototype.transformMarker = function (isStart) { + var _a = this.parsedStyle, + markerStart = _a.markerStart, + markerEnd = _a.markerEnd, + markerStartOffset = _a.markerStartOffset, + markerEndOffset = _a.markerEndOffset; + var marker = isStart ? markerStart : markerEnd; + if (!marker || !isDisplayObject(marker)) { + return; + } + var rad = 0; + var x; + var y; + var ox; + var oy; + var offset; + var originalAngle; + if (isStart) { + var _b = __read(this.getStartTangent(), 2), + p1 = _b[0], + p2 = _b[1]; + ox = p2[0]; + oy = p2[1]; + x = p1[0] - p2[0]; + y = p1[1] - p2[1]; + offset = markerStartOffset || 0; + originalAngle = this.markerStartAngle; + } else { + var _c = __read(this.getEndTangent(), 2), + p1 = _c[0], + p2 = _c[1]; + ox = p2[0]; + oy = p2[1]; + x = p1[0] - p2[0]; + y = p1[1] - p2[1]; + offset = markerEndOffset || 0; + originalAngle = this.markerEndAngle; + } + rad = Math.atan2(y, x); + // account for markerOffset + marker.setLocalEulerAngles((rad * 180) / Math.PI + originalAngle); + marker.setLocalPosition(ox + Math.cos(rad) * offset, oy + Math.sin(rad) * offset); + }; + Path.prototype.placeMarkerMid = function (marker) { + var segments = this.parsedStyle.d.segments; + // clear all existed markers + this.markerMidList.forEach(function (marker) { + marker.remove(); + }); + if (marker && isDisplayObject(marker)) { + for (var i = 1; i < segments.length - 1; i++) { + var _a = __read(segments[i].currentPoint, 2), + ox = _a[0], + oy = _a[1]; + var cloned = i === 1 ? marker : marker.cloneNode(true); + this.markerMidList.push(cloned); + this.appendChild(cloned); + cloned.setLocalPosition(ox, oy); + // TODO: orient of marker + } + } + }; + /** + * Returns the total length of the path. + * @see https://developer.mozilla.org/en-US/docs/Web/API/SVGGeometryElement/getTotalLength + */ + Path.prototype.getTotalLength = function () { + return getOrCalculatePathTotalLength(this); + }; + /** + * Returns the point at a given distance along the path. + * @see https://developer.mozilla.org/en-US/docs/Web/API/SVGGeometryElement/getPointAtLength + */ + Path.prototype.getPointAtLength = function (distance, inWorldSpace) { + if (inWorldSpace === void 0) { + inWorldSpace = false; + } + var absolutePath = this.parsedStyle.d.absolutePath; + var _a = getPointAtLength(absolutePath, distance), + x = _a.x, + y = _a.y; + var transformed = transformMat4( + create$2(), + fromValues$2(x, y, 0), + inWorldSpace ? this.getWorldTransform() : this.getLocalTransform() + ); + // apply local transformation + return new Point(transformed[0], transformed[1]); + }; + /** + * Returns the point at a given ratio of the total length in path. + */ + Path.prototype.getPoint = function (ratio, inWorldSpace) { + if (inWorldSpace === void 0) { + inWorldSpace = false; + } + return this.getPointAtLength(ratio * getOrCalculatePathTotalLength(this), inWorldSpace); + }; + /** + * Get start tangent vector + */ + Path.prototype.getStartTangent = function () { + var segments = this.parsedStyle.d.segments; + var result = []; + if (segments.length > 1) { + var startPoint = segments[0].currentPoint; + var endPoint = segments[1].currentPoint; + var tangent = segments[1].startTangent; + result = []; + if (tangent) { + result.push([startPoint[0] - tangent[0], startPoint[1] - tangent[1]]); + result.push([startPoint[0], startPoint[1]]); + } else { + result.push([endPoint[0], endPoint[1]]); + result.push([startPoint[0], startPoint[1]]); + } + } + return result; + }; + /** + * Get end tangent vector + */ + Path.prototype.getEndTangent = function () { + var segments = this.parsedStyle.d.segments; + var length = segments.length; + var result = []; + if (length > 1) { + var startPoint = segments[length - 2].currentPoint; + var endPoint = segments[length - 1].currentPoint; + var tangent = segments[length - 1].endTangent; + result = []; + if (tangent) { + result.push([endPoint[0] - tangent[0], endPoint[1] - tangent[1]]); + result.push([endPoint[0], endPoint[1]]); + } else { + result.push([startPoint[0], startPoint[1]]); + result.push([endPoint[0], endPoint[1]]); + } + } + return result; + }; + return Path; + })(DisplayObject); + + var Polygon = /** @class */ (function (_super) { + __extends(Polygon, _super); + function Polygon(_a) { + if (_a === void 0) { + _a = {}; + } + var _this = this; + var style = _a.style, + rest = __rest(_a, ['style']); + _this = + _super.call( + this, + __assign( + { + type: Shape.POLYGON, + style: runtime.enableCSSParsing + ? __assign({ points: '', miterLimit: '', isClosed: true }, style) + : __assign({}, style), + initialParsedStyle: runtime.enableCSSParsing + ? null + : { + points: { + points: [], + totalLength: 0, + segments: [], + }, + miterLimit: 4, + isClosed: true, + }, + }, + rest + ) + ) || this; + _this.markerStartAngle = 0; + _this.markerEndAngle = 0; + /** + * markers placed at the mid + */ + _this.markerMidList = []; + var _b = _this.parsedStyle, + markerStart = _b.markerStart, + markerEnd = _b.markerEnd, + markerMid = _b.markerMid; + if (markerStart && isDisplayObject(markerStart)) { + _this.markerStartAngle = markerStart.getLocalEulerAngles(); + _this.appendChild(markerStart); + } + if (markerMid && isDisplayObject(markerMid)) { + _this.placeMarkerMid(markerMid); + } + if (markerEnd && isDisplayObject(markerEnd)) { + _this.markerEndAngle = markerEnd.getLocalEulerAngles(); + _this.appendChild(markerEnd); + } + _this.transformMarker(true); + _this.transformMarker(false); + return _this; + } + Polygon.prototype.attributeChangedCallback = function ( + attrName, + oldValue, + newValue, + prevParsedValue, + newParsedValue + ) { + if (attrName === 'points') { + // recalc markers + this.transformMarker(true); + this.transformMarker(false); + this.placeMarkerMid(this.parsedStyle.markerMid); + } else if (attrName === 'markerStartOffset' || attrName === 'markerEndOffset') { + this.transformMarker(true); + this.transformMarker(false); + } else if (attrName === 'markerStart') { + if (prevParsedValue && isDisplayObject(prevParsedValue)) { + this.markerStartAngle = 0; + prevParsedValue.remove(); + } + // CSSKeyword 'unset' + if (newParsedValue && isDisplayObject(newParsedValue)) { + this.markerStartAngle = newParsedValue.getLocalEulerAngles(); + this.appendChild(newParsedValue); + this.transformMarker(true); + } + } else if (attrName === 'markerEnd') { + if (prevParsedValue && isDisplayObject(prevParsedValue)) { + this.markerEndAngle = 0; + prevParsedValue.remove(); + } + if (newParsedValue && isDisplayObject(newParsedValue)) { + this.markerEndAngle = newParsedValue.getLocalEulerAngles(); + this.appendChild(newParsedValue); + this.transformMarker(false); + } + } else if (attrName === 'markerMid') { + this.placeMarkerMid(newParsedValue); + } + }; + Polygon.prototype.transformMarker = function (isStart) { + var _a = this.parsedStyle, + markerStart = _a.markerStart, + markerEnd = _a.markerEnd, + markerStartOffset = _a.markerStartOffset, + markerEndOffset = _a.markerEndOffset, + P = _a.points; + var points = (P || {}).points; + var marker = isStart ? markerStart : markerEnd; + if (!marker || !isDisplayObject(marker) || !points) { + return; + } + var rad = 0; + var x; + var y; + var ox; + var oy; + var offset; + var originalAngle; + ox = points[0][0]; + oy = points[0][1]; + if (isStart) { + x = points[1][0] - points[0][0]; + y = points[1][1] - points[0][1]; + offset = markerStartOffset || 0; + originalAngle = this.markerStartAngle; + } else { + var length_1 = points.length; + if (!this.parsedStyle.isClosed) { + ox = points[length_1 - 1][0]; + oy = points[length_1 - 1][1]; + x = points[length_1 - 2][0] - points[length_1 - 1][0]; + y = points[length_1 - 2][1] - points[length_1 - 1][1]; + } else { + x = points[length_1 - 1][0] - points[0][0]; + y = points[length_1 - 1][1] - points[0][1]; + } + offset = markerEndOffset || 0; + originalAngle = this.markerEndAngle; + } + rad = Math.atan2(y, x); + // account for markerOffset + marker.setLocalEulerAngles((rad * 180) / Math.PI + originalAngle); + marker.setLocalPosition(ox + Math.cos(rad) * offset, oy + Math.sin(rad) * offset); + }; + Polygon.prototype.placeMarkerMid = function (marker) { + var P = this.parsedStyle.points; + var points = (P || {}).points; + // clear all existed markers + this.markerMidList.forEach(function (marker) { + marker.remove(); + }); + this.markerMidList = []; + if (marker && isDisplayObject(marker) && points) { + for (var i = 1; i < (this.parsedStyle.isClosed ? points.length : points.length - 1); i++) { + var ox = points[i][0]; + var oy = points[i][1]; + var cloned = i === 1 ? marker : marker.cloneNode(true); + this.markerMidList.push(cloned); + this.appendChild(cloned); + cloned.setLocalPosition(ox, oy); + // TODO: orient of marker + } + } + }; + return Polygon; + })(DisplayObject); + + /** + * Polyline inherits the marker-related capabilities of Polygon. + */ + var Polyline = /** @class */ (function (_super) { + __extends(Polyline, _super); + function Polyline(_a) { + if (_a === void 0) { + _a = {}; + } + var style = _a.style, + rest = __rest(_a, ['style']); + return ( + _super.call( + this, + __assign( + { + type: Shape.POLYLINE, + style: runtime.enableCSSParsing + ? __assign({ points: '', miterLimit: '', isClosed: false }, style) + : __assign({}, style), + initialParsedStyle: runtime.enableCSSParsing + ? null + : { + points: { + points: [], + totalLength: 0, + segments: [], + }, + miterLimit: 4, + isClosed: false, + }, + }, + rest + ) + ) || this + ); + } + Polyline.prototype.getTotalLength = function () { + return getOrCalculatePolylineTotalLength(this); + }; + Polyline.prototype.getPointAtLength = function (distance, inWorldSpace) { + if (inWorldSpace === void 0) { + inWorldSpace = false; + } + return this.getPoint(distance / this.getTotalLength(), inWorldSpace); + }; + Polyline.prototype.getPoint = function (ratio, inWorldSpace) { + if (inWorldSpace === void 0) { + inWorldSpace = false; + } + var points = this.parsedStyle.points.points; + if (this.parsedStyle.points.segments.length === 0) { + var segments_1 = []; + var tempLength_1 = 0; + var segmentT_1; + var segmentL_1; + var totalLength_1 = this.getTotalLength(); + points.forEach(function (p, i) { + if (points[i + 1]) { + segmentT_1 = [0, 0]; + segmentT_1[0] = tempLength_1 / totalLength_1; + segmentL_1 = length$4(p[0], p[1], points[i + 1][0], points[i + 1][1]); + tempLength_1 += segmentL_1; + segmentT_1[1] = tempLength_1 / totalLength_1; + segments_1.push(segmentT_1); + } + }); + this.parsedStyle.points.segments = segments_1; + } + var subt = 0; + var index = 0; + this.parsedStyle.points.segments.forEach(function (v, i) { + if (ratio >= v[0] && ratio <= v[1]) { + subt = (ratio - v[0]) / (v[1] - v[0]); + index = i; + } + }); + var _a = pointAt$3( + points[index][0], + points[index][1], + points[index + 1][0], + points[index + 1][1], + subt + ), + x = _a.x, + y = _a.y; + var transformed = transformMat4( + create$2(), + fromValues$2(x, y, 0), + inWorldSpace ? this.getWorldTransform() : this.getLocalTransform() + ); + // apply local transformation + return new Point(transformed[0], transformed[1]); + }; + Polyline.prototype.getStartTangent = function () { + var points = this.parsedStyle.points.points; + var result = []; + result.push([points[1][0], points[1][1]]); + result.push([points[0][0], points[0][1]]); + return result; + }; + Polyline.prototype.getEndTangent = function () { + var points = this.parsedStyle.points.points; + var l = points.length - 1; + var result = []; + result.push([points[l - 1][0], points[l - 1][1]]); + result.push([points[l][0], points[l][1]]); + return result; + }; + return Polyline; + })(Polygon); + + var Rect = /** @class */ (function (_super) { + __extends(Rect, _super); + function Rect(options) { + if (options === void 0) { + options = {}; + } + return _super.call(this, __assign({ type: Shape.RECT }, options)) || this; + } + return Rect; + })(DisplayObject); + + /** + * @see https://developer.mozilla.org/en-US/docs/Web/API/SVGTextElement + */ + var Text = /** @class */ (function (_super) { + __extends(Text, _super); + /** + * @see https://developer.mozilla.org/en-US/docs/Web/API/SVGTextContentElement#constants + */ + // LENGTHADJUST_SPACING: number = 1; + // LENGTHADJUST_SPACINGANDGLYPHS: number = 2; + // LENGTHADJUST_UNKNOWN: number = 0; + function Text(_a) { + if (_a === void 0) { + _a = {}; + } + var style = _a.style, + rest = __rest(_a, ['style']); + return ( + _super.call( + this, + __assign( + { + type: Shape.TEXT, + style: runtime.enableCSSParsing + ? __assign( + { + x: '', + y: '', + text: '', + fontSize: '', + fontFamily: '', + fontStyle: '', + fontWeight: '', + fontVariant: '', + textAlign: '', + textBaseline: '', + textTransform: '', + fill: 'black', + letterSpacing: '', + lineHeight: '', + miterLimit: '', + // whiteSpace: 'pre', + wordWrap: false, + wordWrapWidth: 0, + leading: 0, + dx: '', + dy: '', + }, + style + ) + : __assign({ fill: 'black' }, style), + }, + rest + ) + ) || this + ); + } + // lengthAdjust: SVGAnimatedEnumeration; + // textLength: SVGAnimatedLength; + // getCharNumAtPosition(point?: DOMPointInit): number { + // throw new Error('Method not implemented.'); + // } + /** + * @see https://developer.mozilla.org/en-US/docs/Web/API/SVGTextContentElement + */ + Text.prototype.getComputedTextLength = function () { + var _a; + this.getGeometryBounds(); + return ( + ((_a = this.parsedStyle.metrics) === null || _a === void 0 ? void 0 : _a.maxLineWidth) || 0 + ); + }; + // getEndPositionOfChar(charnum: number): DOMPoint { + // throw new Error('Method not implemented.'); + // } + // getExtentOfChar(charnum: number): DOMRect { + // throw new Error('Method not implemented.'); + // } + // getNumberOfChars(): number { + // throw new Error('Method not implemented.'); + // } + // getRotationOfChar(charnum: number): number { + // throw new Error('Method not implemented.'); + // } + // getStartPositionOfChar(charnum: number): DOMPoint { + // throw new Error('Method not implemented.'); + // } + // getSubStringLength(charnum: number, nchars: number): number { + // throw new Error('Method not implemented.'); + // } + // selectSubString(charnum: number, nchars: number): void { + // throw new Error('Method not implemented.'); + // } + Text.prototype.getLineBoundingRects = function () { + var _a; + this.getGeometryBounds(); + return ( + ((_a = this.parsedStyle.metrics) === null || _a === void 0 ? void 0 : _a.lineMetrics) || [] + ); + }; + Text.prototype.isOverflowing = function () { + this.getGeometryBounds(); + return !!this.parsedStyle.isOverflowing; + }; + return Text; + })(DisplayObject); + + /** + * canvas.customElements + * + * @see https://developer.mozilla.org/en-US/docs/Web/API/CustomElementRegistry + */ + var CustomElementRegistry = /** @class */ (function () { + function CustomElementRegistry() { + this.registry = {}; + this.define(Shape.CIRCLE, Circle); + this.define(Shape.ELLIPSE, Ellipse); + this.define(Shape.RECT, Rect); + this.define(Shape.IMAGE, Image); + this.define(Shape.LINE, Line); + this.define(Shape.GROUP, Group); + this.define(Shape.PATH, Path); + this.define(Shape.POLYGON, Polygon); + this.define(Shape.POLYLINE, Polyline); + this.define(Shape.TEXT, Text); + this.define(Shape.HTML, HTML); + } + CustomElementRegistry.prototype.define = function (name, constructor) { + this.registry[name] = constructor; + }; + /** + * @see https://developer.mozilla.org/en-US/docs/Web/API/CustomElementRegistry/get + */ + CustomElementRegistry.prototype.get = function (name) { + return this.registry[name]; + }; + return CustomElementRegistry; + })(); + + /** + * holds useful CSS-related methods. + * @see https://developer.mozilla.org/en-US/docs/Web/API/CSS + * + * * CSS Typed OM @see https://developer.mozilla.org/en-US/docs/Web/API/CSS/factory_functions + * * register property @see https://developer.mozilla.org/en-US/docs/Web/API/CSS/RegisterProperty + * * CSS Layout API + */ + var CSS = { + /** + * + * @see https://drafts.csswg.org/css-values-4/#number-value + */ + number: function (n) { + return new CSSUnitValue(n); + }, + /** + * + * @see https://drafts.csswg.org/css-values-4/#percentage-value + */ + percent: function (n) { + return new CSSUnitValue(n, '%'); + }, + /** + * + */ + px: function (n) { + return new CSSUnitValue(n, 'px'); + }, + /** + * + */ + em: function (n) { + return new CSSUnitValue(n, 'em'); + }, + rem: function (n) { + return new CSSUnitValue(n, 'rem'); + }, + /** + * + */ + deg: function (n) { + return new CSSUnitValue(n, 'deg'); + }, + /** + * + */ + grad: function (n) { + return new CSSUnitValue(n, 'grad'); + }, + /** + * + */ + rad: function (n) { + return new CSSUnitValue(n, 'rad'); + }, + /** + * + */ + turn: function (n) { + return new CSSUnitValue(n, 'turn'); + }, + /** + *