From cb48b3e825c36a3cee5cff48925c7ca3e64e6969 Mon Sep 17 00:00:00 2001 From: "lixuefei.1313" Date: Fri, 21 Nov 2025 16:28:03 +0800 Subject: [PATCH 1/2] feat: add node test --- .../__tests__/node/export-image/arc.png | Bin 0 -> 27825 bytes .../__tests__/node/export-image/arc3d.png | Bin 0 -> 1905 bytes .../__tests__/node/export-image/area.png | Bin 0 -> 3361 bytes .../__tests__/node/export-image/circle.png | Bin 0 -> 17427 bytes .../__tests__/node/export-image/glyph.png | Bin 0 -> 3869 bytes .../__tests__/node/export-image/group.png | Bin 0 -> 4825 bytes .../__tests__/node/export-image/image.png | Bin 0 -> 5928 bytes .../__tests__/node/export-image/line.png | Bin 0 -> 4591 bytes .../__tests__/node/export-image/path.png | Bin 0 -> 6868 bytes .../__tests__/node/export-image/polygon.png | Bin 0 -> 4192 bytes .../__tests__/node/export-image/pyramid3d.png | Bin 0 -> 1905 bytes .../__tests__/node/export-image/rect.png | Bin 0 -> 3916 bytes .../__tests__/node/export-image/rect3d.png | Bin 0 -> 1966 bytes .../__tests__/node/export-image/star.png | Bin 0 -> 13417 bytes .../__tests__/node/export-image/symbol.png | Bin 0 -> 4101 bytes .../__tests__/node/export-image/text.png | Bin 0 -> 10063 bytes .../__tests__/node/export-image/utils.js | 25 +++++++++ .../vrender/__tests__/node/graphic/arc.js | 27 ++++++++++ .../vrender/__tests__/node/graphic/arc3d.js | 23 +++++++++ .../vrender/__tests__/node/graphic/area.js | 39 ++++++++++++++ .../vrender/__tests__/node/graphic/circle.js | 27 ++++++++++ .../vrender/__tests__/node/graphic/glyph.js | 24 +++++++++ .../vrender/__tests__/node/graphic/group.js | 27 ++++++++++ .../vrender/__tests__/node/graphic/image.js | 32 ++++++++++++ .../vrender/__tests__/node/graphic/line.js | 48 ++++++++++++++++++ .../vrender/__tests__/node/graphic/path.js | 24 +++++++++ .../vrender/__tests__/node/graphic/polygon.js | 31 +++++++++++ .../__tests__/node/graphic/pyramid3d.js | 29 +++++++++++ .../vrender/__tests__/node/graphic/rect.js | 27 ++++++++++ .../vrender/__tests__/node/graphic/rect3d.js | 23 +++++++++ .../vrender/__tests__/node/graphic/star.js | 24 +++++++++ .../vrender/__tests__/node/graphic/symbol.js | 25 +++++++++ .../vrender/__tests__/node/graphic/text.js | 25 +++++++++ packages/vrender/__tests__/node/image.png | Bin 0 -> 652 bytes packages/vrender/__tests__/node/index.js | 31 +++++++++++ 35 files changed, 511 insertions(+) create mode 100644 packages/vrender/__tests__/node/export-image/arc.png create mode 100644 packages/vrender/__tests__/node/export-image/arc3d.png create mode 100644 packages/vrender/__tests__/node/export-image/area.png create mode 100644 packages/vrender/__tests__/node/export-image/circle.png create mode 100644 packages/vrender/__tests__/node/export-image/glyph.png create mode 100644 packages/vrender/__tests__/node/export-image/group.png create mode 100644 packages/vrender/__tests__/node/export-image/image.png create mode 100644 packages/vrender/__tests__/node/export-image/line.png create mode 100644 packages/vrender/__tests__/node/export-image/path.png create mode 100644 packages/vrender/__tests__/node/export-image/polygon.png create mode 100644 packages/vrender/__tests__/node/export-image/pyramid3d.png create mode 100644 packages/vrender/__tests__/node/export-image/rect.png create mode 100644 packages/vrender/__tests__/node/export-image/rect3d.png create mode 100644 packages/vrender/__tests__/node/export-image/star.png create mode 100644 packages/vrender/__tests__/node/export-image/symbol.png create mode 100644 packages/vrender/__tests__/node/export-image/text.png create mode 100644 packages/vrender/__tests__/node/export-image/utils.js create mode 100644 packages/vrender/__tests__/node/graphic/arc.js create mode 100644 packages/vrender/__tests__/node/graphic/arc3d.js create mode 100644 packages/vrender/__tests__/node/graphic/area.js create mode 100644 packages/vrender/__tests__/node/graphic/circle.js create mode 100644 packages/vrender/__tests__/node/graphic/glyph.js create mode 100644 packages/vrender/__tests__/node/graphic/group.js create mode 100644 packages/vrender/__tests__/node/graphic/image.js create mode 100644 packages/vrender/__tests__/node/graphic/line.js create mode 100644 packages/vrender/__tests__/node/graphic/path.js create mode 100644 packages/vrender/__tests__/node/graphic/polygon.js create mode 100644 packages/vrender/__tests__/node/graphic/pyramid3d.js create mode 100644 packages/vrender/__tests__/node/graphic/rect.js create mode 100644 packages/vrender/__tests__/node/graphic/rect3d.js create mode 100644 packages/vrender/__tests__/node/graphic/star.js create mode 100644 packages/vrender/__tests__/node/graphic/symbol.js create mode 100644 packages/vrender/__tests__/node/graphic/text.js create mode 100644 packages/vrender/__tests__/node/image.png create mode 100644 packages/vrender/__tests__/node/index.js diff --git a/packages/vrender/__tests__/node/export-image/arc.png b/packages/vrender/__tests__/node/export-image/arc.png new file mode 100644 index 0000000000000000000000000000000000000000..92f83bda5ce3b30cba443a2372490f5f7078cf7c GIT binary patch literal 27825 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%0A`7FRkes|ztMKuM*{BX-*&phgFFGFAhrw}i*s_Z$ z;+mS8-U2KvrQfY)Y6~hL0{aSV@r~&xugUYwm@7^=YL@`w)uAM&ze(k@+4z@_f zw2JZZwoSfIt-NpZ$oc8}?2~GI^F`0g|9*VCEw7xeu{{Mu5T-vUA0AY4Rs=#Ycp=Y3 zDM7AOXVOV3!%d{Q@nAs?%rm=VMMXud-GOpNxVlYF@n63%IG-#Mp!UvGr2-Giuc&yR z@M}e1{$?%%yA)JRKBW_ehPquC?yMCEWN0?1G0v32eXSZ2W!F_Pq(Gybyukd@d^iz@M;)eE=)2g?WDo{gKDV^?X3OZ78M2$kR?rcKORnt3d zk_=TP5i~b9ZziRqrInjvMLU&nR=K9uZN?;mq|RKT#Nz^!O^s>^bViw*c};;EokToq zdRt*lbO&$c%it+zV^cX?lazQ=v`bdK++FnF2Mzykw+Zz>ST~xQ5V(wV0~CK~>V$^D z!NJj3&OHvVX4dyvzWe;SVz@>%aryuMhz1$YE94t0sh!!6aJ@1{cljl~PP)=^Ot^@3 zW4!GH?g>uCWXcdk-V)E{=>PxDHN1USj+JkUspzijM#H7q8ta=XOnF(^(9S&3ul`aj zu!S>KjJ4i+^qfqj(2p%_bGfu!fpQGvk^3hKFtOvKcqbRXyEC+qt^6F}(1Q)Far-OuHdpEZR>XWAbz5R=3KLRr9Q=+4E@jHb) z!B5mS9jI7IuJnyBJ%U^4;?K$%#lokDfJO9Leg6v3Q8VfNB{%D-Cq%Apm#AFI1jT;O z6{cLPq2cOZ?B0-TG(nBEHRGjYzslDU9t9U5>_se14omEny1Jo6_o_AHLMR!?XyAede30he<0gS z1W-WQbGgI+r5W9xB%v6wT~oW9k;}hfJWETh`ALN)qPF^=LLx$PRWr5T+^twY+)5`~ z_C<%^(_9!i4VdeHX5L?P{`(2a~!cJ1^<;^cBvwS_J8&-m4s-dIJ4?D zLVviZT|az^UwzTgph0I(IzhGQTGX}k+xuz`w`&aY)mC?fwTZ9OAx`Po*wTzuQXic8@6Hus57@upR`pvs48w1 zQhP8^F_b7MRie>oHa|ev-tgDFT?vA@88G%tWbw_gTcAI!HdXnG=#hQ4eF0zR`bD|6 zz6?H;xoDqw0$JBN+AdT&_FXbz3kAiTp>)hjRO_x0>93?F=KQA3D!qyg%0D!YEb1_5 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 literal 0 HcmV?d00001 diff --git a/packages/vrender/__tests__/node/export-image/area.png b/packages/vrender/__tests__/node/export-image/area.png new file mode 100644 index 0000000000000000000000000000000000000000..4d2917e195dec30cfa49ae6f8f9dcdac99aaf8d7 GIT binary patch literal 3361 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 literal 0 HcmV?d00001 diff --git a/packages/vrender/__tests__/node/export-image/glyph.png b/packages/vrender/__tests__/node/export-image/glyph.png new file mode 100644 index 0000000000000000000000000000000000000000..42954ee83117044bcbd270835d1d2a2eb47def9e GIT binary patch literal 3869 zcmeHKX;72b8b0EJ8*nX36(l%1ReMpK zaPAD*zV*QA8zXAUmA6Jx`guqu*PJxbgY%i9G>>Lzv{bzM1PSy_yyRsoh$m?yoni39`x&0U=<@lG5X)OX z_?Q&~$?_72jS9vA=``S03boWQ>ahe#fRw2kFvs(=1-|M1dexPrz_j9X(oQv>m5Lz59#wLc%99#;c87z7PYTUNH=V3pNs=# zRw^M;l%ZuG{*&LgZJmd>QR-=_d?a-Q!eDrYGMQ2fVQh^RNpjvTfxMFq7qO=SYCSZk zHX(*i*>(PTvMh>u`bmN>ZaUB=k`_eO&`&8ZaW47EH@bp> zrU&Pp>G{0crGm=lBM^+%N-_O-K8bys~faa&@EbPZ&&_4vM&q75n*R=!E03Uc@+T^A_8m17H7m6kO{_M3^Pf@CSCWRI zIrHd8vj|60d`i>E-=ZaNURQgQWv`HmBmg`)-VQY! zWZV^&PfY%a%J*mzyVKW6%GdiR*fRG5!j3g+ijH)0b;-!F1Hp4zV<--ngiXTj6Xsb$R zf;G-17J5!8G?tp}#Dg0UlEwL5E^p3|EEQiNe$x{d5=E1q(beGV#-dV^(R_X8+ zGES+NErqnnkgw1bor#5ukC|an1W|r%W!4>&)Mp-d2FP1Q@`@rj1{EXxF`e#Nfh5jr zvG|tMqeT#D7Ee|{zfsasQ%i-n`Jv1g-(PY7>AQ7*#2grEm1L|u5yR!Ul<;c#>Z2nY#|eUTmT@HC5#)KG3QMxue&}t;s?XAU2kM#wlQg4U(`9Zh;USfMM(&_ks-O0<&!GsW+F`i00CylQFBkE`lD ztNODeMJIP8T%B)_2mWeQyf5B~7@UF?)>*R0Kew?1G6udYc@LE%dZslU=KykJ;g)l> zwu+xDkMfwjq(h^Z+A*x-EcK*Iv-5+OI!t`VwgffxEn<1hmBCX@)6dp)mEuTF%Q~Yz-7YP9g=h7-KeHk(tZ!*dmMkST-YfK~(K>>CHb6J^hiGR44_4nOaoC;z`Dnf}6Ul0U z2%BINafL<>jb;kD&$CrOxiyKO1%w2+Wk+`xr-(_~;^cG}G1b7H7W0LCs1C)SH__BA z5ee1>riKs*Mk61&7qOG9TH*RV#*VCDQ0S&s+MtS%f&XgX;Em0h+A+r|3g=O!^Mme= zxMmFFpin7lQ{@5RNDKY4Ws`44x9xz{B+%VwO}#3w!<#8O%^!oKjLZfozq*{;5Pf-_d9T;h1j?0@zRLmlS5fx&7YDA?O@^+( z3R{yB)*d-T7xVF7M_&^&LP(j&&lW@%FXC`wn(vzH>)87!-!#J4#Bt=q?YbA0Ob5g%}$$oxd+$NUg{^3(sNpStZJ Yd>r%W$Mg|A`rid1JN9mewk4kX7j&=uo&W#< literal 0 HcmV?d00001 diff --git a/packages/vrender/__tests__/node/export-image/group.png b/packages/vrender/__tests__/node/export-image/group.png new file mode 100644 index 0000000000000000000000000000000000000000..e4a20c69d7236a124a77d7a85fb086c5c2e0282c GIT binary patch literal 4825 zcmeHLXIN8d7QS>v5wi3eg;iRBVQ3--#({)I2bc&Lq$B}^&_XsMEtG&dV+hSrN(3ne zm8J+%2Lz&&EK*_wA{_+|iS) zt|SfsfP~#&Y%T(Tpeq0f+&&}SYbfnGI?4yo@dl zF)nvMUVoCFIGI5uL1y*45D?hY_Ujc-{IxH>escuY_qKQOeia3fu-4|S=0uG&v)8cf z`%x21_paP=oCv*lzG^5K3@)G)AqfD3?+(F$_$z`(faCX=g1}!+RRF-9!~er3J%pr! zgQ}`3!Vw7Xd+yss%LA6nJzj#)Tq@OdB`#ax26yTOB^Kv z_{W)i%lbh9A$LY|NPsbhte&lmMixf<8b@Pkv-7Fb%xNmMxH>u2Um2PK5krRULQslU z@KUiCR)KfVsJkI$8=>(sf=9xgLc4~Gt)gv@KEbG@Na(672`$C!H>1_JF^SWUXE2TX z%B6a!-0zIsj^#<$ShG`J|IN<&g-ZMb^$MK)0CqR*=-IH)e(a{NO;z)bSnyFBpRwn& z?sc$9&NG`ucoDJ-m1X;s-!^7t3bdZby>uvz;OlHd_x+5y2GEAP#`7p_D7OFIsQiE( z3o&oFR%p8Q@PP#sC=r%hD45Qy;p~r45))jkRJm)WT>dHY5`Vtf-a=#e%$~MR;e^qX z88O^Ul>CW>`0c6)8#bG*v|g`N{b4J*aHcnuu~*b6J_0aPA+E~~b4{E&9+a{1V2iUb z;mphSUneGyV?AYKyPBmqv%2JCz{rUTT(qdE?UKQCI}_TB<=r71JsTUu8;`Iv-Z7Jd zi^SKRsCZ8>jyAPn!zr>~%f*uNo_l_+xxm8H|t7!3bZ?ctB7juqd1VrXCufH4EzlJ}$`#}uB9`qG*q?n23@h^kELkS`f z2xoNFn+IS0oq=Dd-Ft+kg7_iWfEFC|aq4y(;FF={;pi%g56@~lgMkOq^Oy|YoM#Jd zJO2xejLc5JQ)DHgs&; z7FLD_fGeNB0D6QR$2@p9PxS5gGZ>mcdM1-moeiHa+kYjS8(t+YP>ulsyLiXcLms|86OI>5lMV-(lGKl9jhhw7lo0o^bqI zh->=A(5cr9&7(Qf9e8lR{(MF->0;ouEX@j~F$#<<_`~Nz;8Q>4OS(K}iB}X!xu!eq zmmv%kEcrP!%paqVrE6AX`_k;<;Wz&wgIbTychL{#JRcOLrpwIx5r=Z{rKNH!5e9&k zY63#r1!=ECepOMD3}gF<3_2YwapueN!4q?vpAVAzHmD;*^Nh~PgL!{pGSW-M)I51N zy`26T$Hk{j8jN8#Uh)GpA!YcXq)d}w!8KvIPtMA+1BWRX9_<7=H!|3U;Cw)WEe_?T zCzk61lJM^8^8Eu64xkRal`D@bk%jxrItQXGK5G0EY8RwK@^G|+9=YRoi9K9TM?+H% zE>w^%Ecb|ewf_^sQQ`Ziww~Vr{F7_C8@PXq9pkEqjIms{6RbUDJ!O7_Hd^T zC%k(Akp^g)Bp^NyoXVF0bwUp;sLa+q_0q+1jDUdx=Q)v3DVj*znIlr*l- ze)$2Lnia>@bqa?I7jKGyHBBIB!l(eKhjdM+CYW5&z~gROtcR4a@` zMV6H7vRnq&(9nBb4+VeErsb`cgUG9DI4q57VhSWH3_!Io1p#UMn-N8-Mq5)J?%No6 z*O3On$C!a;nFAe=a;<>t75cOV?5pV+>Fba?P2I+KIu#6eGQkA($l?Ie8u!woq!!`M zsxkEDzJgB%)Sn;OR3NQNaKcBe$UU-5wV!Y=j}?R2DMWptAiKO~Y;7LVCHi`)zd@Ug z0>#+cA9sO;`b>rxbDZ)0)r-}+yqaRwl`PKwU<=Y`?5&qMv4+3tZ!t~eZz;z&fufP? z9Asq}h>x>U3d%z6J0&rirxU1t@Qpubxb;8IlLPsL4A{LA#}PF^;dU8GOM@)3Y^(6r z{rUVf1=pt2O7mzNC=kx;~HiYfr<+{J$_Y}dDIVYIUEQC(v_*F8+q8#a_fr6)y|Wov9NdT z_wae5)GEW{X6l(W7xYiDay}i& ziSEQE6YeuCw6Dl9txLZV=GRR()L`zUhjfUr+%|lODucVOm5sT|586SscE&< z$)!wC_W7ixrVV67M8y5jUUSaG1QY_fkO@oNTAN{Q&E!MnJ^p&`iF=*CoSvIZSC&B< zF=k2`_4JZYJ581|Fi>NU8;ji-BfU8%*4};3$Y*Qy(@MXSBZ5dIcITKGtd9^|>gUTF zC!creCxIEB-d%3JHGNBfX=#TuTree$t0hO*%#?q&SqaydRP z>QqPzf1Uol?`!VVwTK9oz1f%ymOqD%_*^OYvjd0*y2M#s-5cciMo7y_hq6!Sos*Ci zx3h%dYVEkqR%i#rRt2nq(CO|WB{T$L(7fq=c7Jz`^x+rzV`q9lcHW)30o}#H+-rl2 z1m_2R(#Dj~M7j~)A!e%!JH8?&1}d}`vlvzA4MvePP==Ol;P;%U^6SYyz4T&DG`6X! zDfUfEV?zTN!`p{;BlinIL(Wu7PMt+>TcWg2-(&lgxw2;+bVHx;xkw;AD=h#w=%SNB zHwn6Qc9|(;!H*@HMy-AX;c1EEn{IeEhA(ojiN|hhXA{5no0l7b;nk(Gxr4BXLbdMKhjhhQ6=U>86C?0{K?k7jkGxIPVR&?rU9L z9jnv@R5$Zn55U9sTNf%g)5>JOz3s?H$x z^M#cyHpNmcX8Gl5KCjPbvMsR^jAE0&M1e+3#73xu4|e@F~ro>c< z9m$F-L+m)y>E2vrA69Bgdy+iMS`scZvA14#i-#9rHnYT1E*6^vaoY%WV{*Eeo=~%} zapoPVs>-*Zagp8GCb|w*e4amnkV2)-KWni}wcMVi!=u+tS&^%qnuS$WMwiMx6sI~; zl7_1AESBYZ<Y+KmJEgrQk8E;Ltx#dBD0?IZgoh zbD42Yj~_<^0M<`_yO#!!@twkQzz^RifYJVRFy#NH|0D5VSQC5DQafVin>eX6;D1$s N9m2t;{72mNzXKJTwDSM} literal 0 HcmV?d00001 diff --git a/packages/vrender/__tests__/node/export-image/image.png b/packages/vrender/__tests__/node/export-image/image.png new file mode 100644 index 0000000000000000000000000000000000000000..7aa13752a47aacd137e9cfb237788e4d2565329f GIT binary patch literal 5928 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 literal 0 HcmV?d00001 diff --git a/packages/vrender/__tests__/node/export-image/line.png b/packages/vrender/__tests__/node/export-image/line.png new file mode 100644 index 0000000000000000000000000000000000000000..e6ab61ad8457c973240b7a3106e632fea176edcf GIT binary patch literal 4591 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 literal 0 HcmV?d00001 diff --git a/packages/vrender/__tests__/node/export-image/path.png b/packages/vrender/__tests__/node/export-image/path.png new file mode 100644 index 0000000000000000000000000000000000000000..05827b245c977c24ccc81265dad1c7f250238ae3 GIT binary patch literal 6868 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 literal 0 HcmV?d00001 diff --git a/packages/vrender/__tests__/node/export-image/polygon.png b/packages/vrender/__tests__/node/export-image/polygon.png new file mode 100644 index 0000000000000000000000000000000000000000..5cf54cd3199810e137fa8fa0ea36a67946559b88 GIT binary patch literal 4192 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 literal 0 HcmV?d00001 diff --git a/packages/vrender/__tests__/node/export-image/pyramid3d.png b/packages/vrender/__tests__/node/export-image/pyramid3d.png new file mode 100644 index 0000000000000000000000000000000000000000..ee051fc6090b24d0dbb26d4e398cf1da67a5a0df GIT binary patch literal 1905 zcmeAS@N?(olHy`uVBq!ia0y~yV2WU1V4T3g1{5hWm74*i*pj^6T^Rm@;DWu&Co?dx zt9iOOhE&XXd+i`6gMz>TgVO(V&#Q7ZsR)0$X=}Whf#JlQ>x>Kx`wf9c88)*r2pEqt qMgw6qC5+~R(OfW^3r0*X*nMRmyUh0$Rl&eIl)=;0&t;ucLK6Vr$t&;x literal 0 HcmV?d00001 diff --git a/packages/vrender/__tests__/node/export-image/rect.png b/packages/vrender/__tests__/node/export-image/rect.png new file mode 100644 index 0000000000000000000000000000000000000000..6beba0ec211aa1dc669f5543398fcde4113ab63e GIT binary patch literal 3916 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 Qe~*F3m)<8Tz93xvJGme&kpKVy literal 0 HcmV?d00001 diff --git a/packages/vrender/__tests__/node/export-image/rect3d.png b/packages/vrender/__tests__/node/export-image/rect3d.png new file mode 100644 index 0000000000000000000000000000000000000000..764c571bb34827d49fbbff4cfa2c989e911d3bcf GIT binary patch literal 1966 zcmeAS@N?(olHy`uVBq!ia0y~yV2WU1V4T3g1{5hWm74*i*pj^6T^Rm@;DWu&Co?dx zCwsa$hE&XXd&9AiDNuy<;shy4M=q`iSI($_NupdztTlgTWV|wbBEwpKvy?x3?N>$y zhiAoA3=9W$3j$3yY-D8+5FTaFAP{aZV}En^XVv_92ZZnH9e>Hm@MZ!#H-m!O1_p*C zCMq(v`SLTw9smBgyo%}njq}$ttC&)3Mk5pwp&N6n4%~x;{(>;ffX==r>mdKI;Vst09n~p A(EtDd literal 0 HcmV?d00001 diff --git a/packages/vrender/__tests__/node/export-image/star.png b/packages/vrender/__tests__/node/export-image/star.png new file mode 100644 index 0000000000000000000000000000000000000000..0530c72c9141bc9024ccfedcb784e61effe55a61 GIT binary patch literal 13417 zcmeHu_dna;-#5Bc(Q2#IY*BmF9z{#-qP6!dwP)1FVYrzq1$@Nn5$UHK`|IpN=@R%kL2(LEy7r%!bKvNzEFmMJT(=cmIkRrYIB zQ*Woj?y)Q;pb**mGW8AGGYDiaqWbFMsKth)R{H!B1|!)^apOjnBV2FBxE{WrZ9Hup ztIy-DU^^gxkM}iia&XO${S#u<3&ee%8k9g@Ujj;k~>61VOAG;!Hc>`!CetW zQ2pl(|H~*zypE?AcU<}wub=*!cCiitqE}#a@5V?BHP3CbaL8u!YX6F-k=adaB345W zXPag%`hj5mbmBNen<|s*BCg}1BF>{L#J5(y}>=6Re@QGB{6B!sdJZ zldnA5BG!Yw=s{zjzrix2Uup$RRkgJwiY)3-_L#4DoO$|WC)o#5RHa2F3Z56pBIh2Du& zpn~0qwmaNeA-hPDDeji5rlzK=t6L-xdN@FK`K@uYXEAc+em_;!qKX7B-~58!tKp6( zef*(@1Lq5RQQK-y^R*Br5Ce1vrsFF%N9@b)!tv3ka!mI;QFcd(Mivfb;?}pcy|zE& zwsm~;=F+v4w6v1Oxd3&y*1fcFYL;m*@OSmCM$A$$y7v?hKW^Duzdo&0&9X4=|5nBr zgU;VVg%-)2eVE@ireB)~rpQ~9qigsq>vuALX<_`G{CyeRh(c1)jBAU=)YMe)d0J{} zah6+~(U_c4Q<%+t%bsYuN{ityXwS}GnN$5(AJGHle3pfSH*|B51qt8k9y##u0)c`^cr~4~WKl2L*EN^OlQSh;{yE z^d@nlN3*GM&C6&u2Q%+9 zYaH3rANMSKn)(q;t$#O1j>~dG8}+0q$z@ZByO83Het$-gFFI zg#FZcP2jt0qtjH4El1EvjqSk8#+hUNfGbC=mOWLumWJ2e{&EY(nOwN8!6R12(Gh<6 zLv4MFBAy|a5*N-Q&M0AM_G{snLl?fTIdH*~UB&sj+(}hHKmcSV)u0Rp`|~a_Ps+Qj z?Vv|se?yNHr`!=^B^Oew*g_vUU)9#g^$B{Wwng;A>Dpm^L#h0H>A6aal82Og)&3=^ zz0h?z)P?w&35J(!G-LDUXTC18O)r=dm9O35rN!a-%)c0xmX=O8c@&=QH?}KQ$#>I{ z=*LZefvQ&qN$fnJF+Z!)*xIt&HT_7HhI?g^bBEbai(ZQI>FFH}H*YcfZLl3?_Jhe3 zgX^PGz!r;S4lzuE><)_ah>QD<%xC4~z_VNts$=<7RhA=1AB>+~A<-w7s%y7Q{xI;w zaI9Z0068}Z|3jNmmg|Ey!RIq=Z$3BS^hqPx4krmH@P}^79=vYAyYDKq9PL$x!ee5{ zG(HMGnKbi7zi&T3TCbceQcbS&TGc%LE#4meI6O-6B8;}~Okl9gNw~4eOd;^O+_Z`u zSp-z(_Q=wp-jSR)^XCE%ADSBU%GO9b(gmfqMOokd{Big9gCJSBMZ0-Y9RxFG!$088 z;@W5uOCyj5v7d_A-}fmLWf7yQvi>10ExiYI`5kC{)>N+$3jZS#V%iO@DndL?51DMU zxOV--?0mdUj-UN!XOcM{iAlJyh4tMy)}vXAiJc5z3Ow2FMgIKx*{IeIlcdgnci%%6 z-#m<|8`n&pTt_Br$vS}ebDK!~IPI@4s245@A7*%7Dh02krWkCR~W4C-cg zt5Oamk=@w#wNIRf(zR=~oHA0Gv590hIs3$Wu{+g_7xwWdl9`rfLJrzp^l2igrW)Py z+K!Nw+&4(qN};)9ad(B4AYT}zeb(sb4Q`?TE_zX&`YPg zGnK6#5>bcM(m2|rxiY^HeK5*IM)*t_;ylL_#_4r@>GXU)>S7-MZlprwQ0zR%9{uv( zPe!_}XOawGw6BK?K$Q=NUcNDiGX(XJkk38T25}Oms$+EyJmYbqvKr)Q{WFnkvanm^=rK&#g=8){2 zu?+4w+g>v5mJ5uIlsAiD3)Rx1ZEj^B7Ho?_1{2cNq|p@#YA$3Q-bg2NmKcI#CFF(< zR1+yY{D`$B$7l8F(~cNVE7kdP@76i`mHIL}Elt$*-z(c+nJ*+T76tKsy34A)F%%+W zeoks`lhdc4ey7nqm4k6k@C@K?AIVsS!5J(s?>vA9Li%?E`S&F&q`)S>+XX;Hsap)iPB zg)U>3iyrEyznmQqXoqRZ9zK2W;6WxR8fxn5shMKi%|A&B`iIHxE!{O5|V}9xpE}RG_A&<`xhzu(d6=8_HI#s-@M~d;x2C z@G0*EiP$U64XQPQQnNW(-;rYgHz1+CtI`G|UBbyHJP?5FD-2+uf+2`^!^WcE_%=;$E*T+p?e0e)f6A2!W@ zY6fs8yTj{CiE=0%Etz7)*gJP6T_qS$XQ#*YHocU3`ub&GzLXL z%aSu23~^FZst<_!Au)}vVb#(%P+jzNdmWSC`iD%dCKli-kG79;@vf@Lpge&DDl02f zJKoV%yr<>u$tS5xbMpIh0`pg$~o409IC+5~5kP5y>q zK;BZCiR)%+&chaPk-$u_jLnIn-% z5RkD3mzlcYW1o%bdiDH~j;t)u-su_|`gJ=A@bjn5Y@p)B=Qt}T%TG>DRN6$yNr-vK z^u!PLW=qzlZf!KT*JE*9ecXM_M|W-t4&Q;&m@rs;nR|<(C&8|-KTrit*ewptiSFoI z-d``#;AAS`aJYaU?)rTS3W|WGcyZh}dN-Vm7$2WTPfrhs|K_#(<4`RFfB)vQzmamB zTwHxWA!tipGlXts`x!#a`RAv~kiBxLl@uLa9i4F+CSMR1K9h#;>x@n0iCw?et|fp- zWXc93G-VH8t}HJz;197_EL(IK^(9in7vGr4*YoGaxo^bf23{x0uVOlCHQ=eF=V^Q! z+k*7Fa`Sn18%9!6vSwz((b-v-^S0Ec=Vc5AlPMF}U^kqL#*4PkSAuRwPgfTw>T95@ z`?<8#p~F7C>(_H_?WE3MRc+hxZsh)Du53HIyWU+C;%nQz%#%63bETV`u9x0kpotsm z@5g45@bU5KIXIM(UAwm8*?jrbH2=AZd8Gje6==}dEiOmA4x_fs^>0x`QjGc<7{*Ul zzB)&hx#iM?#y3>6Ck3-cY3@sC7-~XwGBPqij)A%U$r559Pai-|CL%3@gHOXo>I3nv zhe5I{D=QcfVUbfI%{A~i;TEz>kDQ#u$Ez_imPG7KCql(P+r4@Q|VSS_=N0qVpZZdhwj^G2KuU8cd^&y46wU= zg*37_H58XH9kU}LMxwtMy^23slZC0cx1hOsc<2SEMKen@bINLJYNEn$fj{1%kFY7I8668sdM3GE(H?{>~JXNTig& zj_=6X{2+nTYK>&TdGVW+D%OG zzU#fAE~8BkH3xIEVYOt*-bX1fB^}-+at`q?s=CqMvy5lZc{ds!Mr{SpxgT7IAK^qw zBXh7(U6}d{e8jEOV-*H+4hA&?B}U0f-aapChPa=-@ZqLc%2Mi3dlYABB?w9&8&y@o zC1M^DAMv9-JXSNf3Tnc8(o_?h>1oN2no3rEM+?bR5x~3~Ai!0lG$$g*0<6 zdL_LTl9#xoS~!ioO4tULelx}XvP_NWzBSy=6=#{Da9tmA-;zS-{PNy)C&a|93lvy= zr~Po;^gd;4L#qO1%MsnmFqh_N5ii}!mDr%vs71Wl7R80uLIGOYfU1IP#7^(!tsGtj zC(cbxfq7TYd}88DKyrraTg43VKdKwL6Tj2jd)o>uGZhR5<84N}0x($yjzv{fSgkk% z8jW^zaY-Fm(YCWIL9RT$2-8BMsKG{^2>0D&Azq+<^eFnD^=_1mfN3>10 z-ECLP#lfLmUtjNNZ$AR644j{feUG`-x-k+guvGu+w6M8SSrN6pzB$)R1^z3;65cSS zL&9?Uyoia}MPDRm%l13Z7#*={3PW2#6@ofNPeV+4tRvHePF%js( z$QlZxqn)ytfL9-Wyd5+ko4_}x%(m7=CwWv^pw)R9R#mh@|0STX6Pim@s9RkyMf1lg z#aG(p=vk?aluO$71kAQZb!U0u^j6c_a@B)zn0Juf|m)$jQekR^vvqxj@tL z5Ze@cV>=>D)Dvf^nD>qnwB~~uccqq!x?5Cw5mT4?j;1s2>Ze;>UDR8Q#$R{bXJwF7 zsw&X>az2;)evth%Z@^PTjMZvp)LPRVp@26}V-0-69)B@->MDQRym!OET}iOSTAf#T zRn^pM)@RPMS!rTTlw_dj5;u$7^0<`l(^1kQyo*L0+Vl zELUy2*JY%vOeDqD!ueUbCoW6D`H2giLrK1@!oo#^a2ARjB&ZijW@5psF{b{r*_rkq zJP%}4yY*%g8wTd{4W{u%W|x(wcwCO_#+m1JUhyIYgW@a|IkdYUKKl-F#K_r#>y#!z z9u4fTgv)5P4V^OksmW_4Tnnyp!;o_aAzKa*=C(O6rH&Z>i?F2wu=)l=nvICKclhEd z48mSYBP$7))ev0vCwl7zIfI3FcB1+IzU4zj2}tW|oT5_UHR5%h*`17sQvUKuNLx0T z!_q9`Fi3woopR6Y^ow^R(ze5TxPB95-ad>KVtG?v6_LmUTYK7ZbX&7UV;=EH+2*F- z;Dhoa4rb%5AAQp=$<&P}bxU*Izhkv6ABIX4c@L(>^hV1E{QG^L60c`PA~#zfc^FVM zz8Pc>Uaw(Tfz~40*iPG8^_jiJP0TJAbf<0JaasEe+P3-Rps_lsse1O1^wmsx6=!)ab7OlMVlT{=NrSv_9P-CC6heNLI%FCjc0&(MMj^zWib!II-4reEapjY^3^q{{_I#Y>T z@2|hP#{b;QtM(4R>F2VtpSki0wncBLKEB6HpwsPQ{RAHk$o8@iodyF)A?L$Tg&^<# zEC*p2`Auv1-Uq*lHm66(%abdb_xa z3nv(ase|NL^s^7OBD(I&OzTpmn|!i_yn6t5DSK`pVeie=tEZz=c(}V-4p7o+wpRjE zz}o#zy^FXA*l^HqVK8yR!uf12S1gYzbqFokiG?#IVF)|%k^Z->tyl0CJ^HmeFu|s` zulY|4>c3%y5=ujxq>lg8UNxZl?b!@DKgF*DNRtlWJ^+}cMul-0SS2xjrcpfhM$g(0tPdLm9NVl zd`e0>C=?kBP_7vQL{{5-Ju^n>)`04SFk6+h-h8)eE*!LGs;EU^@P#YglRAUvR)pJ) z>U%C%H8+(&51S@nQ2~Ij4roUK zC4$P8354bLJle)r3VD~aBTz+bpRX%A9~fcrFM_H<=-zO%mLx%PmA!>K2R zTKOF;_}E?}ij5@AN{kVqK&hPR8xZ0AEN}m+y7315y&OXg;&ylGV+k1Yj)okwg!|*h z`H+_Vt@%no%s3#+^xl6*ajjjvkkDF7oIarR z2#^l|cmM93T*1gNYT~msGnFZ!?Bv&WZ1JOAHmmjy`y#eKr-VrDil%cA4{B9-dIv{K z`-}>AvRj>a39xUxL}R=#QC6)fhS#gZ$#UBu_r$4lnZ}wY9GLknZqeTUoX?Qd zpn84nJ+h^kN+|-|*SqM~5*%;G1M^KYWi&Dm*7YtC?F$a1~9X>s%o^))*QSimZrS4v=3Wjoi>goS)`&s zU+~b3;NSaO_iM#rX|M2i&h%{06~?0E`QkZPHX1hF#lR+$tut4R#x%sh=4qpgc zWdqv3-f6N7a0UN!n85h2bxoj9CE&gY2M9MO=g86CIv|Lgyp0~lYhg(5JtOaye8}2o zHz|5or_S>aLr!kCi??J{l}?h-p8FXCI@5?Z5pCrydEw=&S5APf=jP_t2H>4g;8FSw zVKJf`8ym)7{HhyV(P~XXQUA4ycJaO?Ytqde>+_ykD8pAZAQn{&%1MM+1p7ljcTl5E z2015CQ!ws@My81BOrzW6Vo&T< zqZcqhovEksj&kG$6>Kl{60+?b4^Ta+9)F|-L-iX3F0@dfs_Ds?6-rm-GO1IwSNIbAel}pwO|fo`uvF61K5CRMeBf6`dnvwp!vo z;9d7IE2+Gt7RuB6s{xS`g_YZ@0~9Ww86xGqZT_75-e$`d)5Fx*@AvD}E829yvha5&`N}Vkp&#Yz>O&Q_mjE>Afe_s=Be`rXvd_ax1^%r(4^t`2} zwzl4GkWM4_(G)oH0GIXeLGXtY+uZ8?RiI55MdnltLlYVimuX1%n<`qyi?Dw-$znOGR@FFLRFprftT1QXZk*9br_hf12@h`m z%?ephl~Y;A2FK-K2v*UYBpDTwA{p!8Z1{!=Czh`dFM9?#5tIXM;1g(&(_sKdcA;1kyz z1$47hhb*nosnPtjp^?w1^yNBCagXWC0!4qVtTr=z{=rHjZ&uOycj?r*Mw_4YPU)`g zr#}9z=7TxX283<~wDAbyj=IP9K7q_K0CK8DN=8O0*p8)ye!J%89dKi92j7{(m43kx z3}QL@?_uiwkEEcSikiI(Qjg@VFoiN^N8@67b7ecF1I&lk8)BH$;@Re#8YodcES|Am zKb>llUxTsol9A~`0<@q&{u&LxF6cjpq_-Z){O!2#4rT=q#SxIh;FA`iW`ODoz>O*c zvf0kt=xThJt)U>BS+k>7cY<53s_jxTB*Y@??HNPklP3Zv=b76d?|Mwp#V( z>=OfH&DpNpxen!(V|z*^&f8=7HoQ#h5w;xkKnfi~FreN$p|*rQVP7DTLwx&dUc%aX zDXT)BKfX@SEKgea9N>;9^Y+EFjBI|b?s6pfbyNI4HCWPb9VdV;j}_dqb1(<~W%)o9 z7eQ3nXq>MAz+MJ4#F=6)naBq{?+79kAl(f-J!_Z(|2*u}yKTjQs`@a;m!9@=(x`P1 zd#NuCo+ZpRP`o~Tw-EdvpJZsSo`u@Y|DF7_pxL=5B3Jt~57PLVwcFa3-R}=2U(uH1 zce@`S^Ou)j0!+pwkVw&gr5tYxn!{Ta1?0p7RlnYmHg=Uvfw6nIJe7@CKYViw^y#00l0FD{aF=)jRC-tKTq!$+?y!|n*#AtsjTKv z^-MR$XBrYxs=S&WFag*z3!Y%Y{%F|PlHHtE12l#}R*`g#y7%PQ>&w>@H|ZRO#Ki+HeT9GXJkC;LQ!tGNYy|=8;WL^k~#7`Vmqw?;7Hqg>%uIf2CC)<@cc)w(x^0#-B#&SnrKhC*N{5&W zLrRlH0S-`zR~((sY?=xMRg2@KAXCTF^ys(04etC0W8q*RA|>lii%vmwr){m%6aDBm zlk*S7GiwqqVxT|y{4=$ruR>SD$6t3*EqTChlBrz_XtBrxXH?`@aHW=z$z0y~+>ts>Q#N~9 zDWrzc)mC~|s@`JcYDCvG&Dz9VSD{%et3}|ctWBX;24$lwgO2^0eKg>ce-&QgkpiYI zav+v^d)a+pa-Nl4-qNU-7M;Spc)dQNGV#)&jLfXGzbbLl^&(}K22drve{3|`#tYom zb@`+tN}RWUB(1xIFCCjN`TZ&M`>=;cr;(^R_YRgqg-Lof%-0zHAR!`&l3nec zx`)N)SqZiAnr?X$%UwDFJ)00P`+i^J#tUC9!6v6}8Q1-zDZRM9ksr2y5L~v?=#Y3m za(fB7=R2r6B*oHX^)lc%@*@ia0&s5sP}sy06(+*5dmaY0NgLqpW4a4F_DMW?JryDv zp2gppkS`qV$Nmg0?fdE-&Ro}c2qwGYW&k`?jjw7L6SzRbx^oz`6D!8XJyA0?%C4ZHi6S$-vFEt{5g@mUK55koa(!%S&d}o;fG{bM-l%|};0;-hm2?%Hb zs%>v?k1U*}y-!k;;L@vl2F|{dkai&OE&H^<`8n(W2@h}*&kfSg0Bc}9?*aQ>hdjYVFi@aXI#KjLB21G<`6{9~RtNvRe0$R0Wckb#qP>*<#^VMn(YH1CJ z^_CPDmo_yS5_C^qUR@)jj1sN9ik%%#wC4cd5k@PtOduGe4%*-#HVflCz@5nK{t&L2 zat>Jjpe*9``x$a#!X99@;3rN1LIA!BNbJd=E1kf%wicQZ@F&t*xd#8_sSv+q4 zG7`{8qGDo>e|}aM?$CKS6Ef>Tg82oo1lW$(7YIV|{>IF){CA*@CmfzOH#Y<5tOG!) z1t}LVZ_1z@{okJiH;Y%^aW+AR1+ab%@Q_cI%?;&v3@UU1+Td@+X%FVgm?RxJZdA6l zokjg^`j@U;F7R$I{lkY*8m2&tKsPr7zzl^`yU2_{tdB`W&-k? zVALY_pMU{a1*Az}aM;Qsfx}?B%F4ZAz5kC$k2pU&_6CWS6~IM%Sqb=6)7H!?`_}jR z!H-?7!(w-I@DnhFrv#b=AhHBWZc$xe0GQmHw5SB&PkSI;V3J_zS#IjRNf}uWxSjAW zE3?qky{^opXR4~BKQe?xy?*~-O=t-{4Q(2^1*oTM89!`^zbGjMdUl(>g2uf*;Q2qb>r{Q~+n!czn@2k^1<{qzV_ zSOfZ3B5gi)ZEekIzY^RjXtb(VyZ;I*k`k$K3bdcp00brrl5)L=#)4r-cPW~Hs(368 zV<;IUJ^^%ee6&c@ZjU>NqJS+^g0~o$dW3`aYScF}&q406PYbfpL9CG_reSf=NfXD+ zT>TnsE)`C&vjC1r1XO=+0G5kU!oA~X^*R=d8_zq_O@iRjzM_73VPhvE6kkI(kAmKzr`u^qYM>+t(lD%2vdN| zR8P`}8Rmmd_C9kVC}4o}OJn0RZF&x9G9{;{&Mcrt-keTvKe0_sOTz-o#}Q!8#g?~1 ze`ma^1B(r)7EC`+W!yi0HD02}^0hM?2tfQlP$hhPWZhsKpog_Wc5bOgrrEj!^}Lj- zns7F#_`S;Zh~RHpAUO-YINI_V^Den5F`l=Hs#UlY#c{8$Ro) z2Ii91OUp}K0s@n6p~oi8ru>BJSor+D^;Hm1BGqJejWG~Dg0lp0zS)1bdGuk=0ScIG z+ZUz2eLGG*Jn8{RLL$nRjfNQl4g)Y(EA(tPFY&ku_-MhpyJ#yZMYuMvq`iRMsD1-x z*w5lacuY|-xFPi!v!68D@*AM>los0i`(d7UBcFplQ@#pE$BjMJ+wBSo4M5>CKPb=gt-~1o9JT8a; literal 0 HcmV?d00001 diff --git a/packages/vrender/__tests__/node/export-image/symbol.png b/packages/vrender/__tests__/node/export-image/symbol.png new file mode 100644 index 0000000000000000000000000000000000000000..164b01038cb22b608a6b5d5aa7d84c08a466ac77 GIT binary patch literal 4101 zcmeHKi8q^R7Z2Lfs?z$3s_2|C^gCUK&QK+Swn`Ubs*Oa5M42j4sudv!KE_PP*v8aW zQo2}zNNI$`)~c;lQ6y;)siic@XehCSG~XNZSM;1Y?|ILA&U5a2@9+1!_qoq~?*0UG z)7fRb3j_k`TsZII1p=ufK_InktsTJ1Z5z`9;Ire}B{vt4QuUO!R^);}y37kMr?18o z&kN9D!=${Xm+{KQDws7*sv^qa660mMQqPPf1< zl|RiyfCOtV-Uj1B@J}3x6F;M~ez-OJBms(l>)pmB&VrwLRP7<-%?_yweaho?hVY*pghQK(Xgz*7o5yHTq>Eh(z zS&8Ze=t<0^PK*`5mgWedE^}eFNxavmqw;{LgE+r-ThY~isETC@X`>2P-=5W$EkZEV zRrE=CJL$DMn#Or@HcePHMR5yKdlVF;A;Ed}a}Fio8)pp=_V*{-$%S=pdybFvI9gq? zMV}DxO=#W~>D8t=+yD4IC(gZd>T{@K5#1mY)wPU<_{mH#$SP08>uMRF1*mLyYeAdK zFYJc1OX?0)vJb_UXX&d&MLbr=kwWO7)_M@)qq<-T@h|D(2hA+b;V+XP?ArztmY)|A zDR?Ly zn&rG-HKooQh4MK?kC@yu$28TTP!hMCvZA49#xWBShUqd6+)wt~F>Ha2AyU^AS?Q)rXN)bq(@vKyJYV5fbHAkAsL50|Yd>J}F@MDpnwS=XYFJnUPZQti=m2)t@(+2&U~0 z{RfNnex!17Ii6>>EKqpT+g-WB(jFDJv~xcO(_qJHx%xt5@~RHGw#VPEM*mVZJ$4w$ zdsLir8j|}LIr!Z`aqGQ+yVa(_K&Zj~J={mX8i;4KT1?hwK8GeOZ71mec_J*56L?tL zDC*5NZmuQ0J&v=qtW|sO%K`3|O5fltXnO|8e-l&jcd)74i;27Awt)R)qmKmo2GcY^ z;NWxyXI^*jAM;QP+Vw2k&G(E=&kfyW)7hGZa}y6{cq9EWA8^Sy1Q9`?>~l6$&`8LD-N52y}8Hd=B=EwX?#f*O0Aq5BsP+rF%P#eWrE+BKqNq#!q=8NJQ?J-M?F=*ABpFoM@RioPTe$p+(%vJ7QzK&*2`lX}|eA0bFM+}6*LBhyMC zOn+M8^~w+Cl^l!QzB|2KU6NN_j%%sfpTJnuf!nsnF(oH%jFh_N0Y6^2Vpo5Y*s{`A zEdY~O{q5mn4jSo>#v>}Qw2;}|-t74}23LdKPk_2&#@h%uo>?&$#XjHa)6RB(GI#TN zX-OYoY84u)Sxpf$(Ybh!6apX3xKmH%^Cy@_?kV-TfSLguKP()s7}{XZ6H_anQslil zb9m?uvvP?lkQK0%R9&;G^F70l{)9@8JEzI~T?L+Hp#iu>L`-=5TKt+A>uX^A4nk1*&5}@6XXodNG2_pP(cFSNCS!Yl3?e^wj}Y*haa0&66ZN-_lYvnY-nta=n8>DJn9mhJ*|J^D$OyIrO+5 z7sVI0-{4ENgwcB{HqSzXNa+#xP3t_BD&b&c)c@@9q)vNKxg~ zF*~0J>*6pl1}TanAJ07~W;n)>1Rujsr;R`o2xU#`uFre7d$T=l@ys&viGz(^=>zNp4&lMez@ai%24kd{)7K%o#fikikX%y+;7yHXc?HZm&OA9KiEsJXUGE5C#eQdrdp`!fI zR0>d&=Z$^Q==rI5+u|IO6gltXILKpbVy$C8?gK_TuxiSKd}TA;S38XU3;gT7Nc@|- he{=WGJ@}ncLtc-5?E4b!23(s#7tX<4sAsVM`#()5cq;$^ literal 0 HcmV?d00001 diff --git a/packages/vrender/__tests__/node/export-image/text.png b/packages/vrender/__tests__/node/export-image/text.png new file mode 100644 index 0000000000000000000000000000000000000000..40020e62ccd4214af0f24c72f68de13888afe064 GIT binary patch literal 10063 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 literal 0 HcmV?d00001 diff --git a/packages/vrender/__tests__/node/export-image/utils.js b/packages/vrender/__tests__/node/export-image/utils.js new file mode 100644 index 000000000..25b856071 --- /dev/null +++ b/packages/vrender/__tests__/node/export-image/utils.js @@ -0,0 +1,25 @@ +const fs = require('fs'); + +/** + * 创建导出目录(若不存在则递归创建) + * @param {string} dir 目标目录路径 + */ +function ensureDir(dir) { + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }); + } +} + +/** + * 将 Stage 渲染并导出为 PNG 文件 + * @param {import('../../cjs/index.js').Stage} stage VRender Stage + * @param {string} filePath 输出文件完整路径 + */ +function renderAndExportPNG(stage, filePath) { + stage.render(); + const buffer = stage.window.getImageBuffer('image/png'); + fs.writeFileSync(filePath, buffer); + stage.release(); +} + +module.exports = { ensureDir, renderAndExportPNG }; \ No newline at end of file diff --git a/packages/vrender/__tests__/node/graphic/arc.js b/packages/vrender/__tests__/node/graphic/arc.js new file mode 100644 index 000000000..437341418 --- /dev/null +++ b/packages/vrender/__tests__/node/graphic/arc.js @@ -0,0 +1,27 @@ +const CanvasPkg = require('canvas'); +const path = require('path'); +const { vglobal, createStage, createArc } = require('../../../cjs/index.js'); +const { ensureDir, renderAndExportPNG } = require('../export-image/utils'); + +function main() { + vglobal.setEnv('node', CanvasPkg); + const outDir = path.resolve(__dirname, '../export-image'); + ensureDir(outDir); + + const stage = createStage({ width: 600, height: 400, autoRender: false }); + + const samples = [ + { x: 100, y: 100, innerRadius: 20, outerRadius: 40, startAngle: 0, endAngle: Math.PI, fill: '#4a90e2' }, + { x: 240, y: 100, innerRadius: 10, outerRadius: 50, startAngle: Math.PI / 4, endAngle: (3 * Math.PI) / 2, fill: '#50e3c2' }, + { x: 380, y: 100, innerRadius: 30, outerRadius: 60, startAngle: 0, endAngle: Math.PI * 2, stroke: '#333', lineWidth: 4 }, + { x: 100, y: 220, innerRadius: 30, outerRadius: 80, startAngle: 0, endAngle: Math.PI * 2, fill: '#f5a623' }, + { x: 260, y: 220, innerRadius: 40, outerRadius: 70, startAngle: 0, endAngle: Math.PI, stroke: '#d0021b', lineWidth: 6 }, + { x: 420, y: 220, innerRadius: 20, outerRadius: 80, startAngle: Math.PI / 2, endAngle: Math.PI * 2, fill: '#7ed321', stroke: '#000', lineWidth: 2 } + ]; + + samples.forEach(attrs => stage.defaultLayer.add(createArc(attrs))); + + renderAndExportPNG(stage, outDir + '/arc.png'); +} + +main(); \ No newline at end of file diff --git a/packages/vrender/__tests__/node/graphic/arc3d.js b/packages/vrender/__tests__/node/graphic/arc3d.js new file mode 100644 index 000000000..a56cf3f56 --- /dev/null +++ b/packages/vrender/__tests__/node/graphic/arc3d.js @@ -0,0 +1,23 @@ +const CanvasPkg = require('canvas'); +const path = require('path'); +const { vglobal, createStage, createArc3d } = require('../../../cjs/index.js'); +const { ensureDir, renderAndExportPNG } = require('../export-image/utils'); + +function main() { + vglobal.setEnv('node', CanvasPkg); + const outDir = path.resolve(__dirname, '../export-image'); + ensureDir(outDir); + + const stage = createStage({ width: 600, height: 400, autoRender: false }); + + const samples = [ + { x: 120, y: 140, innerRadius: 20, outerRadius: 60, startAngle: 0, endAngle: Math.PI, height: 20, fill: '#4a90e2' }, + { x: 320, y: 140, innerRadius: 10, outerRadius: 50, startAngle: Math.PI / 4, endAngle: (3 * Math.PI) / 2, height: 30, fill: '#50e3c2' } + ]; + + samples.forEach(attrs => stage.defaultLayer.add(createArc3d(attrs))); + + renderAndExportPNG(stage, outDir + '/arc3d.png'); +} + +main(); \ No newline at end of file diff --git a/packages/vrender/__tests__/node/graphic/area.js b/packages/vrender/__tests__/node/graphic/area.js new file mode 100644 index 000000000..cb8f121d0 --- /dev/null +++ b/packages/vrender/__tests__/node/graphic/area.js @@ -0,0 +1,39 @@ +const CanvasPkg = require('canvas'); +const path = require('path'); +const { vglobal, createStage, createArea } = require('../../../cjs/index.js'); +const { ensureDir, renderAndExportPNG } = require('../export-image/utils'); + +function main() { + vglobal.setEnv('node', CanvasPkg); + const outDir = path.resolve(__dirname, '../export-image'); + ensureDir(outDir); + + const stage = createStage({ width: 600, height: 400, autoRender: false }); + + const samples = [ + { + points: [ + { x: 40, y: 100, x1: 40, y1: 180 }, + { x: 120, y: 80, x1: 120, y1: 180 }, + { x: 180, y: 140, x1: 180, y1: 180 } + ], + fill: '#4a90e2' + }, + { + points: [ + { x: 260, y: 120, x1: 260, y1: 220 }, + { x: 320, y: 60, x1: 320, y1: 220 }, + { x: 380, y: 160, x1: 380, y1: 220 } + ], + fill: '#50e3c2', + stroke: '#333', + lineWidth: 2 + } + ]; + + samples.forEach(attrs => stage.defaultLayer.add(createArea(attrs))); + + renderAndExportPNG(stage, outDir + '/area.png'); +} + +main(); \ No newline at end of file diff --git a/packages/vrender/__tests__/node/graphic/circle.js b/packages/vrender/__tests__/node/graphic/circle.js new file mode 100644 index 000000000..963731404 --- /dev/null +++ b/packages/vrender/__tests__/node/graphic/circle.js @@ -0,0 +1,27 @@ +const CanvasPkg = require('canvas'); +const path = require('path'); +const { vglobal, createStage, createCircle } = require('../../../cjs/index.js'); +const { ensureDir, renderAndExportPNG } = require('../export-image/utils'); + +function main() { + vglobal.setEnv('node', CanvasPkg); + const outDir = path.resolve(__dirname, '../export-image'); + ensureDir(outDir); + + const stage = createStage({ width: 600, height: 400, autoRender: false }); + + const samples = [ + { x: 80, y: 80, radius: 40, startAngle: 0, endAngle: Math.PI * 2, fill: '#4a90e2' }, + { x: 200, y: 80, radius: 40, startAngle: 0, endAngle: Math.PI, fill: '#50e3c2' }, + { x: 320, y: 80, radius: 40, startAngle: Math.PI / 4, endAngle: (3 * Math.PI) / 2, stroke: '#333', lineWidth: 4 }, + { x: 80, y: 200, radius: 60, startAngle: 0, endAngle: Math.PI * 2, fill: '#f5a623' }, + { x: 220, y: 220, radius: 30, startAngle: 0, endAngle: Math.PI * 2, stroke: '#d0021b', lineWidth: 6 }, + { x: 340, y: 220, radius: 50, startAngle: 0, endAngle: Math.PI * 2, fill: '#7ed321', stroke: '#000', lineWidth: 2 } + ]; + + samples.forEach(attrs => stage.defaultLayer.add(createCircle(attrs))); + + renderAndExportPNG(stage, outDir + '/circle.png'); +} + +main(); \ No newline at end of file diff --git a/packages/vrender/__tests__/node/graphic/glyph.js b/packages/vrender/__tests__/node/graphic/glyph.js new file mode 100644 index 000000000..1be628553 --- /dev/null +++ b/packages/vrender/__tests__/node/graphic/glyph.js @@ -0,0 +1,24 @@ +const CanvasPkg = require('canvas'); +const path = require('path'); +const { vglobal, createStage, createGlyph, createRect, createCircle, createText } = require('../../../cjs/index.js'); +const { ensureDir, renderAndExportPNG } = require('../export-image/utils'); + +function main() { + vglobal.setEnv('node', CanvasPkg); + const outDir = path.resolve(__dirname, '../export-image'); + ensureDir(outDir); + + const stage = createStage({ width: 600, height: 400, autoRender: false }); + + const glyph = createGlyph({ x: 100, y: 100 }); + const rect = createRect({ x: 0, y: 0, width: 120, height: 80, fill: '#4a90e2' }); + const circle = createCircle({ x: 60, y: 40, radius: 20, startAngle: 0, endAngle: Math.PI * 2, fill: '#f5a623' }); + const label = createText({ x: 60, y: 70, text: 'Glyph', textAlign: 'center', textBaseline: 'top', fontSize: 14, fill: '#fff' }); + glyph.setSubGraphic([rect, circle, label]); + + stage.defaultLayer.add(glyph); + + renderAndExportPNG(stage, outDir + '/glyph.png'); +} + +main(); \ No newline at end of file diff --git a/packages/vrender/__tests__/node/graphic/group.js b/packages/vrender/__tests__/node/graphic/group.js new file mode 100644 index 000000000..6b23f9b93 --- /dev/null +++ b/packages/vrender/__tests__/node/graphic/group.js @@ -0,0 +1,27 @@ +const CanvasPkg = require('canvas'); +const path = require('path'); +const { vglobal, createStage, createGroup, createRect, createCircle, createText } = require('../../../cjs/index.js'); +const { ensureDir, renderAndExportPNG } = require('../export-image/utils'); + +function main() { + vglobal.setEnv('node', CanvasPkg); + const outDir = path.resolve(__dirname, '../export-image'); + ensureDir(outDir); + + const stage = createStage({ width: 600, height: 400, autoRender: false }); + + const group = createGroup({ x: 60, y: 60, width: 240, height: 180, stroke: '#333', lineWidth: 2 }); + const rect = createRect({ x: 20, y: 20, width: 100, height: 60, fill: '#4a90e2' }); + const circle = createCircle({ x: 160, y: 50, radius: 30, startAngle: 0, endAngle: Math.PI * 2, fill: '#f5a623' }); + const label = createText({ x: 120, y: 150, text: 'Group', textAlign: 'center', textBaseline: 'middle', fontSize: 16, fill: '#333' }); + + group.add(rect); + group.add(circle); + group.add(label); + + stage.defaultLayer.add(group); + + renderAndExportPNG(stage, outDir + '/group.png'); +} + +main(); \ No newline at end of file diff --git a/packages/vrender/__tests__/node/graphic/image.js b/packages/vrender/__tests__/node/graphic/image.js new file mode 100644 index 000000000..1decab5b2 --- /dev/null +++ b/packages/vrender/__tests__/node/graphic/image.js @@ -0,0 +1,32 @@ +const CanvasPkg = require('canvas'); +const path = require('path'); +const { vglobal, createStage, createImage } = require('../../../cjs/index.js'); +const { ensureDir, renderAndExportPNG } = require('../export-image/utils'); + +function main() { + vglobal.setEnv('node', CanvasPkg); + const outDir = path.resolve(__dirname, '../export-image'); + ensureDir(outDir); + + const stage = createStage({ width: 600, height: 400, autoRender: false }); + + const localImgPath = path.resolve(__dirname, '../../browser/src/node/image.png'); + + const img = createImage({ + x: 60, + y: 60, + width: 200, + height: 200, + image: localImgPath + }); + + img.successCallback = () => { + stage.render(); + renderAndExportPNG(stage, outDir + '/image.png'); + }; + + stage.defaultLayer.add(img); + stage.render(); +} + +main(); \ No newline at end of file diff --git a/packages/vrender/__tests__/node/graphic/line.js b/packages/vrender/__tests__/node/graphic/line.js new file mode 100644 index 000000000..e4f81efa4 --- /dev/null +++ b/packages/vrender/__tests__/node/graphic/line.js @@ -0,0 +1,48 @@ +const CanvasPkg = require('canvas'); +const path = require('path'); +const { vglobal, createStage, createLine } = require('../../../cjs/index.js'); +const { ensureDir, renderAndExportPNG } = require('../export-image/utils'); + +function main() { + vglobal.setEnv('node', CanvasPkg); + const outDir = path.resolve(__dirname, '../export-image'); + ensureDir(outDir); + + const stage = createStage({ width: 600, height: 400, autoRender: false }); + + const samples = [ + { + points: [ + { x: 40, y: 60 }, + { x: 120, y: 40 }, + { x: 180, y: 100 } + ], + stroke: '#4a90e2', + lineWidth: 3 + }, + { + points: [ + { x: 220, y: 60 }, + { x: 300, y: 40 }, + { x: 360, y: 100 }, + { x: 420, y: 60 } + ], + stroke: '#50e3c2', + lineWidth: 2 + }, + { + segments: [ + { points: [ { x: 40, y: 200 }, { x: 120, y: 220 }, { x: 180, y: 260 } ] }, + { points: [ { x: 40, y: 280 }, { x: 120, y: 300 }, { x: 180, y: 340 } ] } + ], + stroke: '#d0021b', + lineWidth: 4 + } + ]; + + samples.forEach(attrs => stage.defaultLayer.add(createLine(attrs))); + + renderAndExportPNG(stage, outDir + '/line.png'); +} + +main(); \ No newline at end of file diff --git a/packages/vrender/__tests__/node/graphic/path.js b/packages/vrender/__tests__/node/graphic/path.js new file mode 100644 index 000000000..a353cd111 --- /dev/null +++ b/packages/vrender/__tests__/node/graphic/path.js @@ -0,0 +1,24 @@ +const CanvasPkg = require('canvas'); +const path = require('path'); +const { vglobal, createStage, createPath } = require('../../../cjs/index.js'); +const { ensureDir, renderAndExportPNG } = require('../export-image/utils'); + +function main() { + vglobal.setEnv('node', CanvasPkg); + const outDir = path.resolve(__dirname, '../export-image'); + ensureDir(outDir); + + const stage = createStage({ width: 600, height: 400, autoRender: false }); + + const samples = [ + { x: 60, y: 60, path: 'M0,0 L100,0 L100,100 L0,100 Z', fill: '#4a90e2' }, + { x: 220, y: 60, path: 'M0,50 C40,-20 60,120 100,50', stroke: '#d0021b', lineWidth: 3 }, + { x: 380, y: 60, path: 'M0,0 A50,50 0 1,1 0,100 A50,50 0 1,1 0,0', fill: '#50e3c2', lineWidth: 2 } + ]; + + samples.forEach(attrs => stage.defaultLayer.add(createPath(attrs))); + + renderAndExportPNG(stage, outDir + '/path.png'); +} + +main(); \ No newline at end of file diff --git a/packages/vrender/__tests__/node/graphic/polygon.js b/packages/vrender/__tests__/node/graphic/polygon.js new file mode 100644 index 000000000..8f38bd729 --- /dev/null +++ b/packages/vrender/__tests__/node/graphic/polygon.js @@ -0,0 +1,31 @@ +const CanvasPkg = require('canvas'); +const path = require('path'); +const { vglobal, createStage, createPolygon } = require('../../../cjs/index.js'); +const { ensureDir, renderAndExportPNG } = require('../export-image/utils'); + +function main() { + vglobal.setEnv('node', CanvasPkg); + const outDir = path.resolve(__dirname, '../export-image'); + ensureDir(outDir); + + const stage = createStage({ width: 600, height: 400, autoRender: false }); + + const samples = [ + { + points: [ { x: 40, y: 40 }, { x: 140, y: 40 }, { x: 90, y: 120 } ], + fill: '#4a90e2' + }, + { + points: [ { x: 220, y: 60 }, { x: 300, y: 40 }, { x: 360, y: 100 }, { x: 280, y: 140 } ], + fill: '#50e3c2', + stroke: '#333', + lineWidth: 2 + } + ]; + + samples.forEach(attrs => stage.defaultLayer.add(createPolygon(attrs))); + + renderAndExportPNG(stage, outDir + '/polygon.png'); +} + +main(); \ No newline at end of file diff --git a/packages/vrender/__tests__/node/graphic/pyramid3d.js b/packages/vrender/__tests__/node/graphic/pyramid3d.js new file mode 100644 index 000000000..e1e937000 --- /dev/null +++ b/packages/vrender/__tests__/node/graphic/pyramid3d.js @@ -0,0 +1,29 @@ +const CanvasPkg = require('canvas'); +const path = require('path'); +const { vglobal, createStage, createPyramid3d } = require('../../../cjs/index.js'); +const { ensureDir, renderAndExportPNG } = require('../export-image/utils'); + +function main() { + vglobal.setEnv('node', CanvasPkg); + const outDir = path.resolve(__dirname, '../export-image'); + ensureDir(outDir); + + const stage = createStage({ width: 600, height: 400, autoRender: false }); + + const samples = [ + { + points: [ { x: 80, y: 80 }, { x: 160, y: 60 }, { x: 180, y: 140 }, { x: 100, y: 160 } ], + fill: '#4a90e2' + }, + { + points: [ { x: 260, y: 100 }, { x: 340, y: 80 }, { x: 360, y: 160 }, { x: 280, y: 180 } ], + fill: '#50e3c2' + } + ]; + + samples.forEach(attrs => stage.defaultLayer.add(createPyramid3d(attrs))); + + renderAndExportPNG(stage, outDir + '/pyramid3d.png'); +} + +main(); \ No newline at end of file diff --git a/packages/vrender/__tests__/node/graphic/rect.js b/packages/vrender/__tests__/node/graphic/rect.js new file mode 100644 index 000000000..6e6909bb7 --- /dev/null +++ b/packages/vrender/__tests__/node/graphic/rect.js @@ -0,0 +1,27 @@ +const CanvasPkg = require('canvas'); +const path = require('path'); +const { vglobal, createStage, createRect } = require('../../../cjs/index.js'); +const { ensureDir, renderAndExportPNG } = require('../export-image/utils'); + +function main() { + vglobal.setEnv('node', CanvasPkg); + const outDir = path.resolve(__dirname, '../export-image'); + ensureDir(outDir); + + const stage = createStage({ width: 600, height: 400, autoRender: false }); + + const samples = [ + { x: 40, y: 40, width: 120, height: 80, fill: '#4a90e2' }, + { x: 200, y: 40, width: 120, height: 80, fill: '#50e3c2', cornerRadius: 12 }, + { x: 360, y: 40, width: 120, height: 80, fill: '#f5a623', stroke: '#333', lineWidth: 4 }, + { x: 40, y: 160, width: 120, height: 120, fill: '#9013fe', cornerRadius: 24 }, + { x: 200, y: 160, width: 120, height: 120, stroke: '#d0021b', lineWidth: 6 }, + { x: 360, y: 160, width: 120, height: 120, fill: '#7ed321', stroke: '#000', lineWidth: 2 } + ]; + + samples.forEach(attrs => stage.defaultLayer.add(createRect(attrs))); + + renderAndExportPNG(stage, outDir + '/rect.png'); +} + +main(); \ No newline at end of file diff --git a/packages/vrender/__tests__/node/graphic/rect3d.js b/packages/vrender/__tests__/node/graphic/rect3d.js new file mode 100644 index 000000000..3f9bcec6f --- /dev/null +++ b/packages/vrender/__tests__/node/graphic/rect3d.js @@ -0,0 +1,23 @@ +const CanvasPkg = require('canvas'); +const path = require('path'); +const { vglobal, createStage, createRect3d } = require('../../../cjs/index.js'); +const { ensureDir, renderAndExportPNG } = require('../export-image/utils'); + +function main() { + vglobal.setEnv('node', CanvasPkg); + const outDir = path.resolve(__dirname, '../export-image'); + ensureDir(outDir); + + const stage = createStage({ width: 600, height: 400, autoRender: false }); + + const samples = [ + { x: 80, y: 80, width: 120, height: 80, length: 40, fill: '#4a90e2' }, + { x: 260, y: 100, width: 160, height: 100, length: 60, fill: '#50e3c2' } + ]; + + samples.forEach(attrs => stage.defaultLayer.add(createRect3d(attrs))); + + renderAndExportPNG(stage, outDir + '/rect3d.png'); +} + +main(); \ No newline at end of file diff --git a/packages/vrender/__tests__/node/graphic/star.js b/packages/vrender/__tests__/node/graphic/star.js new file mode 100644 index 000000000..d8847dc00 --- /dev/null +++ b/packages/vrender/__tests__/node/graphic/star.js @@ -0,0 +1,24 @@ +const CanvasPkg = require('canvas'); +const path = require('path'); +const { vglobal, createStage, createStar } = require('../../../cjs/index.js'); +const { ensureDir, renderAndExportPNG } = require('../export-image/utils'); + +function main() { + vglobal.setEnv('node', CanvasPkg); + const outDir = path.resolve(__dirname, '../export-image'); + ensureDir(outDir); + + const stage = createStage({ width: 600, height: 400, autoRender: false }); + + const samples = [ + { x: 60, y: 60, width: 120, height: 120, spikes: 5, thickness: 0.4, fill: '#4a90e2' }, + { x: 220, y: 60, width: 160, height: 120, spikes: 7, thickness: 0.2, fill: '#50e3c2' }, + { x: 400, y: 60, width: 120, height: 160, spikes: 8, thickness: 0.3, stroke: '#333', lineWidth: 2 } + ]; + + samples.forEach(attrs => stage.defaultLayer.add(createStar(attrs))); + + renderAndExportPNG(stage, outDir + '/star.png'); +} + +main(); \ No newline at end of file diff --git a/packages/vrender/__tests__/node/graphic/symbol.js b/packages/vrender/__tests__/node/graphic/symbol.js new file mode 100644 index 000000000..b577a0831 --- /dev/null +++ b/packages/vrender/__tests__/node/graphic/symbol.js @@ -0,0 +1,25 @@ +const CanvasPkg = require('canvas'); +const path = require('path'); +const { vglobal, createStage, createSymbol } = require('../../../cjs/index.js'); +const { ensureDir, renderAndExportPNG } = require('../export-image/utils'); + +function main() { + vglobal.setEnv('node', CanvasPkg); + const outDir = path.resolve(__dirname, '../export-image'); + ensureDir(outDir); + + const stage = createStage({ width: 600, height: 400, autoRender: false }); + + const samples = [ + { x: 80, y: 80, symbolType: 'circle', size: 60, fill: '#4a90e2' }, + { x: 180, y: 80, symbolType: 'cross', size: 60, stroke: '#d0021b', lineWidth: 4 }, + { x: 280, y: 80, symbolType: 'diamond', size: 60, fill: '#50e3c2' }, + { x: 380, y: 80, symbolType: 'square', size: 60, fill: '#f5a623' } + ]; + + samples.forEach(attrs => stage.defaultLayer.add(createSymbol(attrs))); + + renderAndExportPNG(stage, outDir + '/symbol.png'); +} + +main(); \ No newline at end of file diff --git a/packages/vrender/__tests__/node/graphic/text.js b/packages/vrender/__tests__/node/graphic/text.js new file mode 100644 index 000000000..1ef758d66 --- /dev/null +++ b/packages/vrender/__tests__/node/graphic/text.js @@ -0,0 +1,25 @@ +const CanvasPkg = require('canvas'); +const path = require('path'); +const { vglobal, createStage, createText } = require('../../../cjs/index.js'); +const { ensureDir, renderAndExportPNG } = require('../export-image/utils'); + +function main() { + vglobal.setEnv('node', CanvasPkg); + const outDir = path.resolve(__dirname, '../export-image'); + ensureDir(outDir); + + const stage = createStage({ width: 600, height: 400, autoRender: false }); + + const samples = [ + { x: 100, y: 60, text: 'Left/Top', textAlign: 'left', textBaseline: 'top', fontSize: 40, fill: '#333' } + { x: 300, y: 60, text: 'Center/Middle', textAlign: 'center', textBaseline: 'middle', fontSize: 24, fill: '#4a90e2' }, + { x: 500, y: 60, text: 'Right/Bottom', textAlign: 'right', textBaseline: 'bottom', fontSize: 18, fill: '#d0021b' }, + { x: 100, y: 200, text: '宽度限制\\n自动换行', textAlign: 'left', textBaseline: 'top', fontSize: 16, maxWidth: 140, fill: '#50e3c2' } + ]; + + samples.forEach(attrs => stage.defaultLayer.add(createText(attrs))); + + renderAndExportPNG(stage, outDir + '/text.png'); +} + +main(); diff --git a/packages/vrender/__tests__/node/image.png b/packages/vrender/__tests__/node/image.png new file mode 100644 index 0000000000000000000000000000000000000000..307159d0a006fa8a02cf2e15e59891844f36685a GIT binary patch literal 652 zcmeAS@N?(olHy`uVBq!ia0vp^AAooZ2OE%FHD}=qAjOvC?e4 Date: Mon, 24 Nov 2025 16:59:11 +0800 Subject: [PATCH 2/2] fix: fix bug of symbol path & autoRefresh --- packages/vrender-components/src/label/base.ts | 7 +- packages/vrender-core/src/core/stage.ts | 2 +- packages/vrender-core/src/graphic/symbol.ts | 6 + packages/vrender/__tests__/node/image.png | Bin 652 -> 31284 bytes packages/vrender/__tests__/node/index.js | 57 +- .../vrender/__tests__/node/vchart-stage.json | 2618 +++++++++++++++++ 6 files changed, 2682 insertions(+), 8 deletions(-) create mode 100644 packages/vrender/__tests__/node/vchart-stage.json diff --git a/packages/vrender-components/src/label/base.ts b/packages/vrender-components/src/label/base.ts index 383c2d8d5..8c0574c65 100644 --- a/packages/vrender-components/src/label/base.ts +++ b/packages/vrender-components/src/label/base.ts @@ -862,7 +862,8 @@ export class LabelBase extends AnimateComponent { const relatedGraphic = this.getRelatedGraphic(text.attribute); const { enter } = this._animationConfig; - [text, labelLine].filter(Boolean).forEach(item => + [text, labelLine].filter(Boolean).forEach(item => { + item.setFinalAttributes?.(item.attribute); item.applyAnimationState( ['enter'], [ @@ -884,8 +885,8 @@ export class LabelBase extends AnimateComponent { } } ] - ) - ); + ); + }); } protected _runUpdateAnimation(prevLabel: LabelContent, currentLabel: LabelContent) { diff --git a/packages/vrender-core/src/core/stage.ts b/packages/vrender-core/src/core/stage.ts index c21273f50..70e1d6efc 100644 --- a/packages/vrender-core/src/core/stage.ts +++ b/packages/vrender-core/src/core/stage.ts @@ -590,7 +590,7 @@ export class Stage extends Group implements IStage { }); } enableAutoRefresh() { - if (this.autoRefresh) { + if (this.autoRefresh || this.global.env === 'node') { return; } this.autoRefresh = true; diff --git a/packages/vrender-core/src/graphic/symbol.ts b/packages/vrender-core/src/graphic/symbol.ts index bb5cff78c..99433b694 100644 --- a/packages/vrender-core/src/graphic/symbol.ts +++ b/packages/vrender-core/src/graphic/symbol.ts @@ -122,6 +122,9 @@ export class Symbol extends Graphic implements ISymbol const { size = symbolTheme.size } = attribute; const symbolClass = this.getParsedPath(); + if (!symbolClass) { + return aabbBounds; + } symbolClass.bounds(size, aabbBounds); return aabbBounds; @@ -136,6 +139,9 @@ export class Symbol extends Graphic implements ISymbol toCustomPath() { const symbolInstance = this.getParsedPath(); + if (!symbolInstance) { + return null; + } const size = this.attribute.size; const x = 0; const y = 0; diff --git a/packages/vrender/__tests__/node/image.png b/packages/vrender/__tests__/node/image.png index 307159d0a006fa8a02cf2e15e59891844f36685a..a762998948f7975423fac841797116b74c2416af 100644 GIT binary patch literal 31284 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%0D}&&u!!a9z5H*lrgBL4XVzq%T51U zmmgb3O7U6ly9eD{{uE^l66mFDl0eyGn7+X5^1Y8m06rY@wkh8G^1^|O3!mA3f6RF7 zXSbR4%7q%h{52@rwQ&2;iI*q0sPV^6*#o1vy}Ma~)nTCb!C@uq)&?X+TqWSSMer(H zLF39;vzK>w=(edMKnp!)Ap~DuWDwzf9}#Y(^Rd4*Kbx5N!y%c_72N8b^rOmZL@XW{ zrAX3G3>qOlA+j%hcf&|AiFK>mlqQam3EjZ zl{)_=S&rYeWb0G_iWH`|ahVHMDFIzDXvts*t*49RL^PGY^&b^SdZ!a9{@@~wV8qkh z^sM)IsHrm@4;;fmj!_GRgpC|_llV;I{JWhp_&cBp7T_z?7qK(~|x7lhbs? zmPkL0k_^0n0jcnZ3c!W!m?n-(~U=hm7eL#qTIDyNJ>6vw+JR3L!0V zS7EPkZn0F7Lgr* { + _add(g, item); + }); + } else if (json.type === 'line') { + console.log(json.points); + group.add(createLine(json.attribute)); + } else if (json.type === 'text') { + group.add(createText(json.attribute)); + } else if (json.type === 'symbol') { + group.add(createSymbol(json.attribute)); + } else if (json.type === 'rect') { + group.add(createRect(json.attribute)); + } else if (json.type === 'path') { + group.add(createPath(json.attribute)); + } else if (json.type === 'arc') { + group.add(createArc(json.attribute)); + } else if (json.type === 'area') { + group.add(createArea(json.attribute)); + } else if (json.type === 'circle') { + group.add(createCircle(json.attribute)); + } +} + +const loadVChartStage = (stage, json) => { + const layer = stage.at(0); + + json.children[0].children.forEach(item => { + _add(layer, item); + }); +}; + function main() { // 注册 Node 环境与 node-canvas vglobal.setEnv('node', CanvasPkg); // 创建舞台 - const stage = createStage({ width: 240, height: 180, autoRender: false }); + const stage = createStage({ width: 340, height: 300, autoRender: false, dpr: 2 }); // 添加图形 - const rect = createRect({ x: 30, y: 40, width: 140, height: 90, fill: '#4a90e2' }); - stage.defaultLayer.add(rect); + loadVChartStage(stage, vchartStageJson); // 渲染与导出 stage.render(); diff --git a/packages/vrender/__tests__/node/vchart-stage.json b/packages/vrender/__tests__/node/vchart-stage.json new file mode 100644 index 000000000..ccf02849a --- /dev/null +++ b/packages/vrender/__tests__/node/vchart-stage.json @@ -0,0 +1,2618 @@ +{ + "attribute": {}, + "_uid": 1206, + "type": "group", + "children": [ + { + "attribute": {}, + "_uid": 1212, + "type": "group", + "children": [ + { + "attribute": { + "x": 0, + "y": 0, + "width": 300, + "height": 300 + }, + "_uid": 1217, + "type": "group", + "name": "root", + "children": [ + { + "attribute": { + "visible": true, + "x": 47, + "y": 121, + "width": 233, + "height": 135, + "clip": false, + "zIndex": 450, + "pickable": false + }, + "_uid": 1218, + "type": "group", + "name": "regionGroup_135", + "children": [ + { + "attribute": { + "visible": true, + "x": 0, + "y": 0, + "zIndex": 0, + "pickable": false + }, + "_uid": 1219, + "type": "group", + "name": "seriesGroup_bar_137_139", + "children": [ + { + "attribute": { + "pickable": false, + "zIndex": 300 + }, + "_uid": 1220, + "type": "group", + "name": "bar_140", + "children": [ + { + "attribute": { + "visible": true, + "lineWidth": 0, + "fill": "#1664FF", + "stroke": "#1664FF", + "x": 12.70909090909089, + "y": 118.125, + "y1": 135, + "width": 38.12727272727273 + }, + "_uid": 1297, + "type": "rect", + "children": [] + }, + { + "attribute": { + "visible": true, + "lineWidth": 0, + "fill": "#1664FF", + "stroke": "#1664FF", + "x": 55.072727272727256, + "y": 101.25, + "y1": 135, + "width": 38.12727272727273 + }, + "_uid": 1298, + "type": "rect", + "children": [] + }, + { + "attribute": { + "visible": true, + "lineWidth": 0, + "fill": "#1664FF", + "stroke": "#1664FF", + "x": 97.43636363636362, + "y": 84.375, + "y1": 135, + "width": 38.12727272727273 + }, + "_uid": 1299, + "type": "rect", + "children": [] + }, + { + "attribute": { + "visible": true, + "lineWidth": 0, + "fill": "#1664FF", + "stroke": "#1664FF", + "x": 139.79999999999998, + "y": 109.6875, + "y1": 135, + "width": 38.12727272727273 + }, + "_uid": 1300, + "type": "rect", + "children": [] + }, + { + "attribute": { + "visible": true, + "lineWidth": 0, + "fill": "#1664FF", + "stroke": "#1664FF", + "x": 182.16363636363636, + "y": 92.8125, + "y1": 135, + "width": 38.12727272727273 + }, + "_uid": 1301, + "type": "rect", + "children": [] + }, + { + "attribute": { + "visible": true, + "lineWidth": 0, + "fill": "#1AC6FF", + "stroke": "#1AC6FF", + "x": 12.70909090909089, + "y": 92.8125, + "y1": 118.125, + "width": 38.12727272727273 + }, + "_uid": 1302, + "type": "rect", + "children": [] + }, + { + "attribute": { + "visible": true, + "lineWidth": 0, + "fill": "#1AC6FF", + "stroke": "#1AC6FF", + "x": 55.072727272727256, + "y": 59.0625, + "y1": 101.25, + "width": 38.12727272727273 + }, + "_uid": 1303, + "type": "rect", + "children": [] + }, + { + "attribute": { + "visible": true, + "lineWidth": 0, + "fill": "#1AC6FF", + "stroke": "#1AC6FF", + "x": 97.43636363636362, + "y": 25.3125, + "y1": 84.375, + "width": 38.12727272727273 + }, + "_uid": 1304, + "type": "rect", + "children": [] + }, + { + "attribute": { + "visible": true, + "lineWidth": 0, + "fill": "#1AC6FF", + "stroke": "#1AC6FF", + "x": 139.79999999999998, + "y": 75.9375, + "y1": 109.6875, + "width": 38.12727272727273 + }, + "_uid": 1305, + "type": "rect", + "children": [] + }, + { + "attribute": { + "visible": true, + "lineWidth": 0, + "fill": "#1AC6FF", + "stroke": "#1AC6FF", + "x": 182.16363636363636, + "y": 55.6875, + "y1": 92.8125, + "width": 38.12727272727273 + }, + "_uid": 1306, + "type": "rect", + "children": [] + } + ] + } + ] + }, + { + "attribute": { + "pickable": false, + "zIndex": 300 + }, + "_uid": 1225, + "type": "group", + "name": "137-bar-label-0-component_164", + "children": [ + { + "attribute": { + "dataLabels": [ + { + "smartInvert": true, + "baseMarkGroupName": "bar_140", + "textStyle": { + "pickable": false, + "fontSize": 11, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "lineWidth": 2, + "stroke": "#ffffff", + "fill": "#fff" + }, + "overlap": { + "avoidMarks": [], + "strategy": [ + { + "type": "position" + } + ], + "size": { + "width": 233, + "height": 135 + } + }, + "visible": true, + "offset": 5, + "animation": true, + "animationUpdate": true, + "animationEnter": true, + "animationExit": true, + "hover": false, + "select": false, + "centerOffset": 0, + "type": "rect", + "data": [ + { + "visible": true, + "x": 0, + "y": 0, + "angle": 0, + "textAlign": "center", + "lineWidth": 2, + "textConfig": [], + "fontSize": 11, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "stroke": "#ffffff", + "fill": "#fff", + "text": 10, + "textType": "text", + "data": { + "category": "A", + "series": "S1", + "value": 10, + "__VCHART_DEFAULT_DATA_INDEX": 0, + "__VCHART_DEFAULT_DATA_KEY": "A_S1", + "__VCHART_STACK_END": 10, + "__VCHART_STACK_START": 0, + "__VCHART_STACK_KEY": "A" + }, + "id": "vrender-component-label-0" + }, + { + "visible": true, + "x": 0, + "y": 0, + "angle": 0, + "textAlign": "center", + "lineWidth": 2, + "textConfig": [], + "fontSize": 11, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "stroke": "#ffffff", + "fill": "#fff", + "text": 20, + "textType": "text", + "data": { + "category": "B", + "series": "S1", + "value": 20, + "__VCHART_DEFAULT_DATA_INDEX": 1, + "__VCHART_DEFAULT_DATA_KEY": "B_S1", + "__VCHART_STACK_END": 20, + "__VCHART_STACK_START": 0, + "__VCHART_STACK_KEY": "B" + }, + "id": "vrender-component-label-1" + }, + { + "visible": true, + "x": 0, + "y": 0, + "angle": 0, + "textAlign": "center", + "lineWidth": 2, + "textConfig": [], + "fontSize": 11, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "stroke": "#ffffff", + "fill": "#fff", + "text": 30, + "textType": "text", + "data": { + "category": "C", + "series": "S1", + "value": 30, + "__VCHART_DEFAULT_DATA_INDEX": 2, + "__VCHART_DEFAULT_DATA_KEY": "C_S1", + "__VCHART_STACK_END": 30, + "__VCHART_STACK_START": 0, + "__VCHART_STACK_KEY": "C" + }, + "id": "vrender-component-label-2" + }, + { + "visible": true, + "x": 0, + "y": 0, + "angle": 0, + "textAlign": "center", + "lineWidth": 2, + "textConfig": [], + "fontSize": 11, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "stroke": "#ffffff", + "fill": "#fff", + "text": 15, + "textType": "text", + "data": { + "category": "D", + "series": "S1", + "value": 15, + "__VCHART_DEFAULT_DATA_INDEX": 3, + "__VCHART_DEFAULT_DATA_KEY": "D_S1", + "__VCHART_STACK_END": 15, + "__VCHART_STACK_START": 0, + "__VCHART_STACK_KEY": "D" + }, + "id": "vrender-component-label-3" + }, + { + "visible": true, + "x": 0, + "y": 0, + "angle": 0, + "textAlign": "center", + "lineWidth": 2, + "textConfig": [], + "fontSize": 11, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "stroke": "#ffffff", + "fill": "#fff", + "text": 25, + "textType": "text", + "data": { + "category": "E", + "series": "S1", + "value": 25, + "__VCHART_DEFAULT_DATA_INDEX": 4, + "__VCHART_DEFAULT_DATA_KEY": "E_S1", + "__VCHART_STACK_END": 25, + "__VCHART_STACK_START": 0, + "__VCHART_STACK_KEY": "E" + }, + "id": "vrender-component-label-4" + }, + { + "visible": true, + "x": 0, + "y": 0, + "angle": 0, + "textAlign": "center", + "lineWidth": 2, + "textConfig": [], + "fontSize": 11, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "stroke": "#ffffff", + "fill": "#fff", + "text": 15, + "textType": "text", + "data": { + "category": "A", + "series": "S2", + "value": 15, + "__VCHART_DEFAULT_DATA_INDEX": 5, + "__VCHART_DEFAULT_DATA_KEY": "A_S2", + "__VCHART_STACK_END": 25, + "__VCHART_STACK_START": 10, + "__VCHART_STACK_KEY": "A" + }, + "id": "vrender-component-label-5" + }, + { + "visible": true, + "x": 0, + "y": 0, + "angle": 0, + "textAlign": "center", + "lineWidth": 2, + "textConfig": [], + "fontSize": 11, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "stroke": "#ffffff", + "fill": "#fff", + "text": 25, + "textType": "text", + "data": { + "category": "B", + "series": "S2", + "value": 25, + "__VCHART_DEFAULT_DATA_INDEX": 6, + "__VCHART_DEFAULT_DATA_KEY": "B_S2", + "__VCHART_STACK_END": 45, + "__VCHART_STACK_START": 20, + "__VCHART_STACK_KEY": "B" + }, + "id": "vrender-component-label-6" + }, + { + "visible": true, + "x": 0, + "y": 0, + "angle": 0, + "textAlign": "center", + "lineWidth": 2, + "textConfig": [], + "fontSize": 11, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "stroke": "#ffffff", + "fill": "#fff", + "text": 35, + "textType": "text", + "data": { + "category": "C", + "series": "S2", + "value": 35, + "__VCHART_DEFAULT_DATA_INDEX": 7, + "__VCHART_DEFAULT_DATA_KEY": "C_S2", + "__VCHART_STACK_END": 65, + "__VCHART_STACK_START": 30, + "__VCHART_STACK_KEY": "C" + }, + "id": "vrender-component-label-7" + }, + { + "visible": true, + "x": 0, + "y": 0, + "angle": 0, + "textAlign": "center", + "lineWidth": 2, + "textConfig": [], + "fontSize": 11, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "stroke": "#ffffff", + "fill": "#fff", + "text": 20, + "textType": "text", + "data": { + "category": "D", + "series": "S2", + "value": 20, + "__VCHART_DEFAULT_DATA_INDEX": 8, + "__VCHART_DEFAULT_DATA_KEY": "D_S2", + "__VCHART_STACK_END": 35, + "__VCHART_STACK_START": 15, + "__VCHART_STACK_KEY": "D" + }, + "id": "vrender-component-label-8" + }, + { + "visible": true, + "x": 0, + "y": 0, + "angle": 0, + "textAlign": "center", + "lineWidth": 2, + "textConfig": [], + "fontSize": 11, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "stroke": "#ffffff", + "fill": "#fff", + "text": 22, + "textType": "text", + "data": { + "category": "E", + "series": "S2", + "value": 22, + "__VCHART_DEFAULT_DATA_INDEX": 9, + "__VCHART_DEFAULT_DATA_KEY": "E_S2", + "__VCHART_STACK_END": 47, + "__VCHART_STACK_START": 25, + "__VCHART_STACK_KEY": "E" + }, + "id": "vrender-component-label-9" + } + ] + } + ], + "pickable": false, + "size": { + "width": 233, + "height": 135 + } + }, + "_uid": 1339, + "type": "group", + "name": "data-label", + "children": [ + { + "attribute": { + "data": [ + { + "visible": true, + "x": 0, + "y": 0, + "angle": 0, + "textAlign": "center", + "lineWidth": 2, + "textConfig": [], + "fontSize": 11, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "stroke": "#ffffff", + "fill": "#fff", + "text": 10, + "textType": "text", + "data": { + "category": "A", + "series": "S1", + "value": 10, + "__VCHART_DEFAULT_DATA_INDEX": 0, + "__VCHART_DEFAULT_DATA_KEY": "A_S1", + "__VCHART_STACK_END": 10, + "__VCHART_STACK_START": 0, + "__VCHART_STACK_KEY": "A" + }, + "id": "vrender-component-label-0" + }, + { + "visible": true, + "x": 0, + "y": 0, + "angle": 0, + "textAlign": "center", + "lineWidth": 2, + "textConfig": [], + "fontSize": 11, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "stroke": "#ffffff", + "fill": "#fff", + "text": 20, + "textType": "text", + "data": { + "category": "B", + "series": "S1", + "value": 20, + "__VCHART_DEFAULT_DATA_INDEX": 1, + "__VCHART_DEFAULT_DATA_KEY": "B_S1", + "__VCHART_STACK_END": 20, + "__VCHART_STACK_START": 0, + "__VCHART_STACK_KEY": "B" + }, + "id": "vrender-component-label-1" + }, + { + "visible": true, + "x": 0, + "y": 0, + "angle": 0, + "textAlign": "center", + "lineWidth": 2, + "textConfig": [], + "fontSize": 11, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "stroke": "#ffffff", + "fill": "#fff", + "text": 30, + "textType": "text", + "data": { + "category": "C", + "series": "S1", + "value": 30, + "__VCHART_DEFAULT_DATA_INDEX": 2, + "__VCHART_DEFAULT_DATA_KEY": "C_S1", + "__VCHART_STACK_END": 30, + "__VCHART_STACK_START": 0, + "__VCHART_STACK_KEY": "C" + }, + "id": "vrender-component-label-2" + }, + { + "visible": true, + "x": 0, + "y": 0, + "angle": 0, + "textAlign": "center", + "lineWidth": 2, + "textConfig": [], + "fontSize": 11, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "stroke": "#ffffff", + "fill": "#fff", + "text": 15, + "textType": "text", + "data": { + "category": "D", + "series": "S1", + "value": 15, + "__VCHART_DEFAULT_DATA_INDEX": 3, + "__VCHART_DEFAULT_DATA_KEY": "D_S1", + "__VCHART_STACK_END": 15, + "__VCHART_STACK_START": 0, + "__VCHART_STACK_KEY": "D" + }, + "id": "vrender-component-label-3" + }, + { + "visible": true, + "x": 0, + "y": 0, + "angle": 0, + "textAlign": "center", + "lineWidth": 2, + "textConfig": [], + "fontSize": 11, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "stroke": "#ffffff", + "fill": "#fff", + "text": 25, + "textType": "text", + "data": { + "category": "E", + "series": "S1", + "value": 25, + "__VCHART_DEFAULT_DATA_INDEX": 4, + "__VCHART_DEFAULT_DATA_KEY": "E_S1", + "__VCHART_STACK_END": 25, + "__VCHART_STACK_START": 0, + "__VCHART_STACK_KEY": "E" + }, + "id": "vrender-component-label-4" + }, + { + "visible": true, + "x": 0, + "y": 0, + "angle": 0, + "textAlign": "center", + "lineWidth": 2, + "textConfig": [], + "fontSize": 11, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "stroke": "#ffffff", + "fill": "#fff", + "text": 15, + "textType": "text", + "data": { + "category": "A", + "series": "S2", + "value": 15, + "__VCHART_DEFAULT_DATA_INDEX": 5, + "__VCHART_DEFAULT_DATA_KEY": "A_S2", + "__VCHART_STACK_END": 25, + "__VCHART_STACK_START": 10, + "__VCHART_STACK_KEY": "A" + }, + "id": "vrender-component-label-5" + }, + { + "visible": true, + "x": 0, + "y": 0, + "angle": 0, + "textAlign": "center", + "lineWidth": 2, + "textConfig": [], + "fontSize": 11, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "stroke": "#ffffff", + "fill": "#fff", + "text": 25, + "textType": "text", + "data": { + "category": "B", + "series": "S2", + "value": 25, + "__VCHART_DEFAULT_DATA_INDEX": 6, + "__VCHART_DEFAULT_DATA_KEY": "B_S2", + "__VCHART_STACK_END": 45, + "__VCHART_STACK_START": 20, + "__VCHART_STACK_KEY": "B" + }, + "id": "vrender-component-label-6" + }, + { + "visible": true, + "x": 0, + "y": 0, + "angle": 0, + "textAlign": "center", + "lineWidth": 2, + "textConfig": [], + "fontSize": 11, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "stroke": "#ffffff", + "fill": "#fff", + "text": 35, + "textType": "text", + "data": { + "category": "C", + "series": "S2", + "value": 35, + "__VCHART_DEFAULT_DATA_INDEX": 7, + "__VCHART_DEFAULT_DATA_KEY": "C_S2", + "__VCHART_STACK_END": 65, + "__VCHART_STACK_START": 30, + "__VCHART_STACK_KEY": "C" + }, + "id": "vrender-component-label-7" + }, + { + "visible": true, + "x": 0, + "y": 0, + "angle": 0, + "textAlign": "center", + "lineWidth": 2, + "textConfig": [], + "fontSize": 11, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "stroke": "#ffffff", + "fill": "#fff", + "text": 20, + "textType": "text", + "data": { + "category": "D", + "series": "S2", + "value": 20, + "__VCHART_DEFAULT_DATA_INDEX": 8, + "__VCHART_DEFAULT_DATA_KEY": "D_S2", + "__VCHART_STACK_END": 35, + "__VCHART_STACK_START": 15, + "__VCHART_STACK_KEY": "D" + }, + "id": "vrender-component-label-8" + }, + { + "visible": true, + "x": 0, + "y": 0, + "angle": 0, + "textAlign": "center", + "lineWidth": 2, + "textConfig": [], + "fontSize": 11, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "stroke": "#ffffff", + "fill": "#fff", + "text": 22, + "textType": "text", + "data": { + "category": "E", + "series": "S2", + "value": 22, + "__VCHART_DEFAULT_DATA_INDEX": 9, + "__VCHART_DEFAULT_DATA_KEY": "E_S2", + "__VCHART_STACK_END": 47, + "__VCHART_STACK_START": 25, + "__VCHART_STACK_KEY": "E" + }, + "id": "vrender-component-label-9" + } + ], + "textStyle": { + "fontSize": 11, + "textAlign": "center", + "textBaseline": "middle", + "boundsPadding": [-2, -1, -2, -1], + "fill": "#fff", + "pickable": false, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "lineWidth": 2, + "stroke": "#ffffff" + }, + "offset": 5, + "pickable": false, + "smartInvert": true, + "baseMarkGroupName": "bar_140", + "overlap": { + "avoidMarks": [], + "strategy": [ + { + "type": "position" + } + ], + "size": { + "width": 233, + "height": 135 + } + }, + "visible": true, + "animation": true, + "animationUpdate": true, + "animationEnter": true, + "animationExit": true, + "hover": false, + "select": false, + "centerOffset": 0, + "type": "rect" + }, + "_uid": 1340, + "type": "group", + "name": "label", + "children": [ + { + "attribute": { + "fontSize": 11, + "fill": "#ffffff", + "fontFamily": "PingFang SC,Helvetica Neue,Microsoft Yahei,system-ui,-apple-system,segoe ui,Roboto,Helvetica,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol", + "textAlign": "center", + "textBaseline": "middle", + "boundsPadding": [-2, -1, -2, -1], + "pickable": false, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "lineWidth": 2, + "stroke": "#1664FF", + "visible": true, + "x": 31.772727272727256, + "y": 126.5625, + "angle": 0, + "textConfig": [], + "text": 10, + "textType": "text", + "data": { + "category": "A", + "series": "S1", + "value": 10, + "__VCHART_DEFAULT_DATA_INDEX": 0, + "__VCHART_DEFAULT_DATA_KEY": "A_S1", + "__VCHART_STACK_END": 10, + "__VCHART_STACK_START": 0, + "__VCHART_STACK_KEY": "A" + }, + "id": "vrender-component-label-0", + "opacity": 1, + "strokeOpacity": 1 + }, + "_uid": 1341, + "type": "text", + "children": [] + }, + { + "attribute": { + "fontSize": 11, + "fill": "#ffffff", + "fontFamily": "PingFang SC,Helvetica Neue,Microsoft Yahei,system-ui,-apple-system,segoe ui,Roboto,Helvetica,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol", + "textAlign": "center", + "textBaseline": "middle", + "boundsPadding": [-2, -1, -2, -1], + "pickable": false, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "lineWidth": 2, + "stroke": "#1664FF", + "visible": true, + "x": 74.13636363636363, + "y": 118.125, + "angle": 0, + "textConfig": [], + "text": 20, + "textType": "text", + "data": { + "category": "B", + "series": "S1", + "value": 20, + "__VCHART_DEFAULT_DATA_INDEX": 1, + "__VCHART_DEFAULT_DATA_KEY": "B_S1", + "__VCHART_STACK_END": 20, + "__VCHART_STACK_START": 0, + "__VCHART_STACK_KEY": "B" + }, + "id": "vrender-component-label-1", + "opacity": 1, + "strokeOpacity": 1 + }, + "_uid": 1342, + "type": "text", + "children": [] + }, + { + "attribute": { + "fontSize": 11, + "fill": "#ffffff", + "fontFamily": "PingFang SC,Helvetica Neue,Microsoft Yahei,system-ui,-apple-system,segoe ui,Roboto,Helvetica,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol", + "textAlign": "center", + "textBaseline": "middle", + "boundsPadding": [-2, -1, -2, -1], + "pickable": false, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "lineWidth": 2, + "stroke": "#1664FF", + "visible": true, + "x": 116.5, + "y": 109.6875, + "angle": 0, + "textConfig": [], + "text": 30, + "textType": "text", + "data": { + "category": "C", + "series": "S1", + "value": 30, + "__VCHART_DEFAULT_DATA_INDEX": 2, + "__VCHART_DEFAULT_DATA_KEY": "C_S1", + "__VCHART_STACK_END": 30, + "__VCHART_STACK_START": 0, + "__VCHART_STACK_KEY": "C" + }, + "id": "vrender-component-label-2", + "opacity": 1, + "strokeOpacity": 1 + }, + "_uid": 1343, + "type": "text", + "children": [] + }, + { + "attribute": { + "fontSize": 11, + "fill": "#ffffff", + "fontFamily": "PingFang SC,Helvetica Neue,Microsoft Yahei,system-ui,-apple-system,segoe ui,Roboto,Helvetica,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol", + "textAlign": "center", + "textBaseline": "middle", + "boundsPadding": [-2, -1, -2, -1], + "pickable": false, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "lineWidth": 2, + "stroke": "#1664FF", + "visible": true, + "x": 158.86363636363635, + "y": 122.34375, + "angle": 0, + "textConfig": [], + "text": 15, + "textType": "text", + "data": { + "category": "D", + "series": "S1", + "value": 15, + "__VCHART_DEFAULT_DATA_INDEX": 3, + "__VCHART_DEFAULT_DATA_KEY": "D_S1", + "__VCHART_STACK_END": 15, + "__VCHART_STACK_START": 0, + "__VCHART_STACK_KEY": "D" + }, + "id": "vrender-component-label-3", + "opacity": 1, + "strokeOpacity": 1 + }, + "_uid": 1344, + "type": "text", + "children": [] + }, + { + "attribute": { + "fontSize": 11, + "fill": "#ffffff", + "fontFamily": "PingFang SC,Helvetica Neue,Microsoft Yahei,system-ui,-apple-system,segoe ui,Roboto,Helvetica,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol", + "textAlign": "center", + "textBaseline": "middle", + "boundsPadding": [-2, -1, -2, -1], + "pickable": false, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "lineWidth": 2, + "stroke": "#1664FF", + "visible": true, + "x": 201.22727272727272, + "y": 113.90625, + "angle": 0, + "textConfig": [], + "text": 25, + "textType": "text", + "data": { + "category": "E", + "series": "S1", + "value": 25, + "__VCHART_DEFAULT_DATA_INDEX": 4, + "__VCHART_DEFAULT_DATA_KEY": "E_S1", + "__VCHART_STACK_END": 25, + "__VCHART_STACK_START": 0, + "__VCHART_STACK_KEY": "E" + }, + "id": "vrender-component-label-4", + "opacity": 1, + "strokeOpacity": 1 + }, + "_uid": 1345, + "type": "text", + "children": [] + }, + { + "attribute": { + "fontSize": 11, + "fill": "#000000", + "fontFamily": "PingFang SC,Helvetica Neue,Microsoft Yahei,system-ui,-apple-system,segoe ui,Roboto,Helvetica,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol", + "textAlign": "center", + "textBaseline": "middle", + "boundsPadding": [-2, -1, -2, -1], + "pickable": false, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "lineWidth": 2, + "stroke": "#1AC6FF", + "visible": true, + "x": 31.772727272727256, + "y": 105.46875, + "angle": 0, + "textConfig": [], + "text": 15, + "textType": "text", + "data": { + "category": "A", + "series": "S2", + "value": 15, + "__VCHART_DEFAULT_DATA_INDEX": 5, + "__VCHART_DEFAULT_DATA_KEY": "A_S2", + "__VCHART_STACK_END": 25, + "__VCHART_STACK_START": 10, + "__VCHART_STACK_KEY": "A" + }, + "id": "vrender-component-label-5", + "opacity": 1, + "strokeOpacity": 1 + }, + "_uid": 1346, + "type": "text", + "children": [] + }, + { + "attribute": { + "fontSize": 11, + "fill": "#000000", + "fontFamily": "PingFang SC,Helvetica Neue,Microsoft Yahei,system-ui,-apple-system,segoe ui,Roboto,Helvetica,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol", + "textAlign": "center", + "textBaseline": "middle", + "boundsPadding": [-2, -1, -2, -1], + "pickable": false, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "lineWidth": 2, + "stroke": "#1AC6FF", + "visible": true, + "x": 74.13636363636363, + "y": 80.15625, + "angle": 0, + "textConfig": [], + "text": 25, + "textType": "text", + "data": { + "category": "B", + "series": "S2", + "value": 25, + "__VCHART_DEFAULT_DATA_INDEX": 6, + "__VCHART_DEFAULT_DATA_KEY": "B_S2", + "__VCHART_STACK_END": 45, + "__VCHART_STACK_START": 20, + "__VCHART_STACK_KEY": "B" + }, + "id": "vrender-component-label-6", + "opacity": 1, + "strokeOpacity": 1 + }, + "_uid": 1347, + "type": "text", + "children": [] + }, + { + "attribute": { + "fontSize": 11, + "fill": "#000000", + "fontFamily": "PingFang SC,Helvetica Neue,Microsoft Yahei,system-ui,-apple-system,segoe ui,Roboto,Helvetica,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol", + "textAlign": "center", + "textBaseline": "middle", + "boundsPadding": [-2, -1, -2, -1], + "pickable": false, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "lineWidth": 2, + "stroke": "#1AC6FF", + "visible": true, + "x": 116.5, + "y": 54.84375, + "angle": 0, + "textConfig": [], + "text": 35, + "textType": "text", + "data": { + "category": "C", + "series": "S2", + "value": 35, + "__VCHART_DEFAULT_DATA_INDEX": 7, + "__VCHART_DEFAULT_DATA_KEY": "C_S2", + "__VCHART_STACK_END": 65, + "__VCHART_STACK_START": 30, + "__VCHART_STACK_KEY": "C" + }, + "id": "vrender-component-label-7", + "opacity": 1, + "strokeOpacity": 1 + }, + "_uid": 1348, + "type": "text", + "children": [] + }, + { + "attribute": { + "fontSize": 11, + "fill": "#000000", + "fontFamily": "PingFang SC,Helvetica Neue,Microsoft Yahei,system-ui,-apple-system,segoe ui,Roboto,Helvetica,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol", + "textAlign": "center", + "textBaseline": "middle", + "boundsPadding": [-2, -1, -2, -1], + "pickable": false, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "lineWidth": 2, + "stroke": "#1AC6FF", + "visible": true, + "x": 158.86363636363635, + "y": 92.8125, + "angle": 0, + "textConfig": [], + "text": 20, + "textType": "text", + "data": { + "category": "D", + "series": "S2", + "value": 20, + "__VCHART_DEFAULT_DATA_INDEX": 8, + "__VCHART_DEFAULT_DATA_KEY": "D_S2", + "__VCHART_STACK_END": 35, + "__VCHART_STACK_START": 15, + "__VCHART_STACK_KEY": "D" + }, + "id": "vrender-component-label-8", + "opacity": 1, + "strokeOpacity": 1 + }, + "_uid": 1349, + "type": "text", + "children": [] + }, + { + "attribute": { + "fontSize": 11, + "fill": "#000000", + "fontFamily": "PingFang SC,Helvetica Neue,Microsoft Yahei,system-ui,-apple-system,segoe ui,Roboto,Helvetica,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol", + "textAlign": "center", + "textBaseline": "middle", + "boundsPadding": [-2, -1, -2, -1], + "pickable": false, + "fontWeight": "normal", + "fillOpacity": 1, + "lineJoin": "bevel", + "lineWidth": 2, + "stroke": "#1AC6FF", + "visible": true, + "x": 201.22727272727272, + "y": 74.25, + "angle": 0, + "textConfig": [], + "text": 22, + "textType": "text", + "data": { + "category": "E", + "series": "S2", + "value": 22, + "__VCHART_DEFAULT_DATA_INDEX": 9, + "__VCHART_DEFAULT_DATA_KEY": "E_S2", + "__VCHART_STACK_END": 47, + "__VCHART_STACK_START": 25, + "__VCHART_STACK_KEY": "E" + }, + "id": "vrender-component-label-9", + "opacity": 1, + "strokeOpacity": 1 + }, + "_uid": 1350, + "type": "text", + "children": [] + } + ] + } + ] + } + ] + } + ] + }, + { + "attribute": { + "visible": true, + "x": 47, + "y": 121, + "width": 233, + "height": 135, + "clip": false, + "zIndex": 700, + "pickable": false + }, + "_uid": 1221, + "type": "group", + "name": "region_interaction", + "children": [] + }, + { + "attribute": { + "pickable": false, + "zIndex": 100 + }, + "_uid": 1222, + "type": "group", + "name": "axis-bottom_144", + "children": [ + { + "attribute": { + "zIndex": 100, + "pickable": true, + "scale": { + "_rangeFactorStart": null, + "_rangeFactorEnd": null, + "type": "band", + "_index": {}, + "_domain": ["A", "B", "C", "D", "E"], + "_ordinalRange": [], + "_range": [0, 233], + "_step": 42.36363636363637, + "_bandwidth": 38.12727272727273, + "_isFixed": false, + "_round": false, + "_paddingInner": 0.1, + "_paddingOuter": 0.3, + "_align": 0.5, + "_userBandwidth": "auto", + "_wholeRange": null, + "_bandRangeState": { + "reverse": false, + "start": 12.70909090909089, + "min": 0, + "max": 233, + "count": 5 + }, + "_fishEyeTransform": null + }, + "x": 47, + "y": 256, + "orient": "bottom", + "line": { + "visible": true, + "style": { + "lineWidth": 1, + "stroke": "#d9dde4", + "strokeOpacity": 1 + }, + "startSymbol": {}, + "endSymbol": {} + }, + "label": { + "visible": true, + "inside": false, + "space": 8, + "style": { + "fontSize": 12, + "fill": "#89909d", + "fontWeight": "normal", + "fillOpacity": 1 + }, + "formatMethod": null + }, + "tick": { + "visible": true, + "length": 4, + "inside": false, + "alignWithLabel": true, + "style": { + "lineWidth": 1, + "stroke": "#d9dde4", + "strokeOpacity": 1 + } + }, + "subTick": { + "visible": false + }, + "title": { + "visible": false, + "text": "category", + "maxWidth": null + }, + "panel": { + "visible": false + }, + "verticalFactor": 1, + "start": { + "x": 0, + "y": 0 + }, + "end": { + "x": 233, + "y": 0 + }, + "items": [ + [ + { + "id": "A", + "label": "A", + "value": 0.1363636363636363, + "rawValue": "A" + }, + { + "id": "B", + "label": "B", + "value": 0.3181818181818181, + "rawValue": "B" + }, + { + "id": "C", + "label": "C", + "value": 0.49999999999999994, + "rawValue": "C" + }, + { + "id": "D", + "label": "D", + "value": 0.6818181818181818, + "rawValue": "D" + }, + { + "id": "E", + "label": "E", + "value": 0.8636363636363636, + "rawValue": "E" + } + ] + ], + "verticalLimitSize": 90, + "verticalMinSize": null + }, + "_uid": 1226, + "type": "group", + "name": "axis", + "children": [ + { + "attribute": { + "x": 0, + "y": 0, + "pickable": false + }, + "_uid": 1307, + "type": "group", + "children": [ + { + "attribute": { + "x": 0, + "y": 0, + "zIndex": 1, + "pickable": false + }, + "_uid": 1308, + "type": "group", + "name": "axis-container", + "children": [ + { + "attribute": { + "visible": true, + "lineStyle": { + "lineWidth": 1, + "stroke": "#d9dde4", + "strokeOpacity": 1 + }, + "startSymbol": { + "visible": false, + "autoRotate": true, + "symbolType": "triangle", + "size": 12, + "refX": 0, + "refY": 0, + "refAngle": 0, + "style": { + "fill": "#000", + "zIndex": 1 + } + }, + "endSymbol": { + "visible": false, + "autoRotate": true, + "symbolType": "triangle", + "size": 12, + "refX": 0, + "refY": 0, + "refAngle": 0, + "style": { + "fill": "#000", + "zIndex": 1 + } + }, + "points": [ + { + "x": 0, + "y": 0 + }, + { + "x": 233, + "y": 0 + } + ] + }, + "_uid": 1309, + "type": "group", + "name": "axis-line", + "children": [ + { + "attribute": { + "points": [ + { + "x": 0, + "y": 0 + }, + { + "x": 233, + "y": 0 + } + ], + "lineWidth": 1, + "stroke": "#d9dde4", + "strokeOpacity": 1, + "fill": false, + "closePath": false + }, + "_uid": 1310, + "type": "line", + "name": "axis-line-line", + "children": [] + } + ] + }, + { + "attribute": { + "x": 0, + "y": 0, + "pickable": false + }, + "_uid": 1311, + "type": "group", + "name": "axis-tick-container", + "children": [ + { + "attribute": { + "points": [ + { + "x": 31.77272727272726, + "y": 0 + }, + { + "x": 31.77272727272726, + "y": 4 + } + ], + "lineWidth": 1, + "stroke": "#d9dde4", + "strokeOpacity": 1 + }, + "_uid": 1312, + "type": "line", + "name": "axis-tick", + "children": [] + }, + { + "attribute": { + "points": [ + { + "x": 74.13636363636363, + "y": 0 + }, + { + "x": 74.13636363636363, + "y": 4 + } + ], + "lineWidth": 1, + "stroke": "#d9dde4", + "strokeOpacity": 1 + }, + "_uid": 1313, + "type": "line", + "name": "axis-tick", + "children": [] + }, + { + "attribute": { + "points": [ + { + "x": 116.49999999999999, + "y": 0 + }, + { + "x": 116.49999999999999, + "y": 4 + } + ], + "lineWidth": 1, + "stroke": "#d9dde4", + "strokeOpacity": 1 + }, + "_uid": 1314, + "type": "line", + "name": "axis-tick", + "children": [] + }, + { + "attribute": { + "points": [ + { + "x": 158.86363636363635, + "y": 0 + }, + { + "x": 158.86363636363635, + "y": 4 + } + ], + "lineWidth": 1, + "stroke": "#d9dde4", + "strokeOpacity": 1 + }, + "_uid": 1315, + "type": "line", + "name": "axis-tick", + "children": [] + }, + { + "attribute": { + "points": [ + { + "x": 201.22727272727272, + "y": 0 + }, + { + "x": 201.22727272727272, + "y": 4 + } + ], + "lineWidth": 1, + "stroke": "#d9dde4", + "strokeOpacity": 1 + }, + "_uid": 1316, + "type": "line", + "name": "axis-tick", + "children": [] + } + ] + }, + { + "attribute": { + "x": 0, + "y": 0, + "pickable": false + }, + "_uid": 1317, + "type": "group", + "name": "axis-label-container", + "children": [ + { + "attribute": { + "x": 0, + "y": 0, + "pickable": false + }, + "_uid": 1318, + "type": "group", + "name": "axis-label-container-layer-0", + "children": [ + { + "attribute": { + "x": 31.77272727272726, + "y": 12, + "text": "A", + "_originText": "A", + "lineHeight": 12, + "type": "text", + "textAlign": "center", + "textBaseline": "top", + "fontSize": 12, + "fill": "#89909d", + "fontWeight": "normal", + "fillOpacity": 1 + }, + "_uid": 1319, + "type": "text", + "name": "axis-label", + "children": [] + }, + { + "attribute": { + "x": 74.13636363636363, + "y": 12, + "text": "B", + "_originText": "B", + "lineHeight": 12, + "type": "text", + "textAlign": "center", + "textBaseline": "top", + "fontSize": 12, + "fill": "#89909d", + "fontWeight": "normal", + "fillOpacity": 1 + }, + "_uid": 1320, + "type": "text", + "name": "axis-label", + "children": [] + }, + { + "attribute": { + "x": 116.49999999999999, + "y": 12, + "text": "C", + "_originText": "C", + "lineHeight": 12, + "type": "text", + "textAlign": "center", + "textBaseline": "top", + "fontSize": 12, + "fill": "#89909d", + "fontWeight": "normal", + "fillOpacity": 1 + }, + "_uid": 1321, + "type": "text", + "name": "axis-label", + "children": [] + }, + { + "attribute": { + "x": 158.86363636363635, + "y": 12, + "text": "D", + "_originText": "D", + "lineHeight": 12, + "type": "text", + "textAlign": "center", + "textBaseline": "top", + "fontSize": 12, + "fill": "#89909d", + "fontWeight": "normal", + "fillOpacity": 1 + }, + "_uid": 1322, + "type": "text", + "name": "axis-label", + "children": [] + }, + { + "attribute": { + "x": 201.22727272727272, + "y": 12, + "text": "E", + "_originText": "E", + "lineHeight": 12, + "type": "text", + "textAlign": "center", + "textBaseline": "top", + "fontSize": 12, + "fill": "#89909d", + "fontWeight": "normal", + "fillOpacity": 1 + }, + "_uid": 1323, + "type": "text", + "name": "axis-label", + "children": [] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "attribute": { + "pickable": false, + "zIndex": 100 + }, + "_uid": 1223, + "type": "group", + "name": "axis-left_148", + "children": [ + { + "attribute": { + "zIndex": 100, + "pickable": true, + "scale": { + "_rangeFactorStart": null, + "_rangeFactorEnd": null, + "_forceAlign": true, + "_domain": [0, 65], + "_range": [135, 0], + "type": "linear", + "_domainValidator": null, + "_niceType": "all", + "_niceDomain": [0, 80], + "_autoClamp": false, + "_input": null, + "_output": null, + "_wholeRange": null, + "_fishEyeTransform": null + }, + "x": 47, + "y": 121, + "orient": "left", + "line": { + "visible": false + }, + "label": { + "visible": true, + "inside": false, + "space": 12, + "autoLimit": true, + "style": { + "fontSize": 12, + "fill": "#89909d", + "fontWeight": "normal", + "fillOpacity": 1 + }, + "formatMethod": null + }, + "tick": { + "visible": false + }, + "subTick": { + "visible": false + }, + "title": { + "visible": false, + "text": "value", + "maxWidth": null + }, + "panel": { + "visible": false + }, + "verticalFactor": 1, + "start": { + "x": 0, + "y": 0 + }, + "end": { + "x": 0, + "y": 135 + }, + "items": [ + [ + { + "id": 0, + "label": 0, + "value": 1, + "rawValue": 0 + }, + { + "id": 20, + "label": 20, + "value": 0.75, + "rawValue": 20 + }, + { + "id": 40, + "label": 40, + "value": 0.5, + "rawValue": 40 + }, + { + "id": 60, + "label": 60, + "value": 0.25, + "rawValue": 60 + }, + { + "id": 80, + "label": 80, + "value": 0, + "rawValue": 80 + } + ] + ], + "verticalLimitSize": 90, + "verticalMinSize": null + }, + "_uid": 1229, + "type": "group", + "name": "axis", + "children": [ + { + "attribute": { + "x": 0, + "y": 0, + "pickable": false + }, + "_uid": 1324, + "type": "group", + "children": [ + { + "attribute": { + "x": 0, + "y": 0, + "zIndex": 1, + "pickable": false + }, + "_uid": 1325, + "type": "group", + "name": "axis-container", + "children": [ + { + "attribute": { + "x": 0, + "y": 0, + "pickable": false + }, + "_uid": 1326, + "type": "group", + "name": "axis-label-container", + "children": [ + { + "attribute": { + "x": 0, + "y": 0, + "pickable": false + }, + "_uid": 1327, + "type": "group", + "name": "axis-label-container-layer-0", + "children": [ + { + "attribute": { + "x": -12, + "y": 135, + "text": 0, + "_originText": 0, + "lineHeight": 12, + "type": "text", + "textAlign": "right", + "textBaseline": "middle", + "fontSize": 12, + "fill": "#89909d", + "fontWeight": "normal", + "fillOpacity": 1 + }, + "_uid": 1328, + "type": "text", + "name": "axis-label", + "children": [] + }, + { + "attribute": { + "x": -12, + "y": 101.25, + "text": 20, + "_originText": 20, + "lineHeight": 12, + "type": "text", + "textAlign": "right", + "textBaseline": "middle", + "fontSize": 12, + "fill": "#89909d", + "fontWeight": "normal", + "fillOpacity": 1 + }, + "_uid": 1329, + "type": "text", + "name": "axis-label", + "children": [] + }, + { + "attribute": { + "x": -12, + "y": 67.5, + "text": 40, + "_originText": 40, + "lineHeight": 12, + "type": "text", + "textAlign": "right", + "textBaseline": "middle", + "fontSize": 12, + "fill": "#89909d", + "fontWeight": "normal", + "fillOpacity": 1 + }, + "_uid": 1330, + "type": "text", + "name": "axis-label", + "children": [] + }, + { + "attribute": { + "x": -12, + "y": 33.75, + "text": 60, + "_originText": 60, + "lineHeight": 12, + "type": "text", + "textAlign": "right", + "textBaseline": "middle", + "fontSize": 12, + "fill": "#89909d", + "fontWeight": "normal", + "fillOpacity": 1 + }, + "_uid": 1331, + "type": "text", + "name": "axis-label", + "children": [] + }, + { + "attribute": { + "x": -12, + "y": 0, + "text": 80, + "_originText": 80, + "lineHeight": 12, + "type": "text", + "textAlign": "right", + "textBaseline": "middle", + "fontSize": 12, + "fill": "#89909d", + "fontWeight": "normal", + "fillOpacity": 1 + }, + "_uid": 1332, + "type": "text", + "name": "axis-label", + "children": [] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "attribute": { + "pickable": false, + "zIndex": 50 + }, + "_uid": 1224, + "type": "group", + "name": "axis-left-grid_149", + "children": [ + { + "attribute": { + "zIndex": 50, + "pickable": false, + "x": 47, + "y": 121, + "style": { + "lineWidth": 1, + "stroke": "#f1f2f5", + "strokeOpacity": 1, + "lineDash": [] + }, + "subGrid": { + "visible": false + }, + "type": "line", + "start": { + "x": 0, + "y": 0 + }, + "end": { + "x": 0, + "y": 135 + }, + "items": [ + { + "id": 0, + "label": 0, + "value": 1, + "rawValue": 0 + }, + { + "id": 20, + "label": 20, + "value": 0.75, + "rawValue": 20 + }, + { + "id": 40, + "label": 40, + "value": 0.5, + "rawValue": 40 + }, + { + "id": 60, + "label": 60, + "value": 0.25, + "rawValue": 60 + }, + { + "id": 80, + "label": 80, + "value": 0, + "rawValue": 80 + } + ], + "verticalFactor": 1, + "length": 233 + }, + "_uid": 1232, + "type": "group", + "name": "axis-grid", + "children": [ + { + "attribute": { + "x": 0, + "y": 0, + "pickable": false + }, + "_uid": 1333, + "type": "group", + "children": [ + { + "attribute": { + "path": "M0,135L233,135", + "z": 0, + "lineWidth": 1, + "stroke": "#f1f2f5", + "strokeOpacity": 1, + "lineDash": [] + }, + "_uid": 1334, + "type": "path", + "name": "axis-grid-line", + "children": [] + }, + { + "attribute": { + "path": "M0,101.25L233,101.25", + "z": 0, + "lineWidth": 1, + "stroke": "#f1f2f5", + "strokeOpacity": 1, + "lineDash": [] + }, + "_uid": 1335, + "type": "path", + "name": "axis-grid-line", + "children": [] + }, + { + "attribute": { + "path": "M0,67.5L233,67.5", + "z": 0, + "lineWidth": 1, + "stroke": "#f1f2f5", + "strokeOpacity": 1, + "lineDash": [] + }, + "_uid": 1336, + "type": "path", + "name": "axis-grid-line", + "children": [] + }, + { + "attribute": { + "path": "M0,33.75L233,33.75", + "z": 0, + "lineWidth": 1, + "stroke": "#f1f2f5", + "strokeOpacity": 1, + "lineDash": [] + }, + "_uid": 1337, + "type": "path", + "name": "axis-grid-line", + "children": [] + }, + { + "attribute": { + "path": "M0,0L233,0", + "z": 0, + "lineWidth": 1, + "stroke": "#f1f2f5", + "strokeOpacity": 1, + "lineDash": [] + }, + "_uid": 1338, + "type": "path", + "name": "axis-grid-line", + "children": [] + } + ] + } + ] + } + ] + }, + { + "attribute": { + "textStyle": { + "ellipsis": "...", + "fill": "#000", + "fontSize": 26, + "fontWeight": "bold", + "textAlign": "left", + "textBaseline": "top", + "width": 260, + "maxLineWidth": 260, + "lineHeight": "150%" + }, + "subtextStyle": { + "ellipsis": "...", + "fill": "#89909d", + "fontSize": 14, + "fontWeight": "normal", + "textAlign": "left", + "textBaseline": "top", + "maxLineWidth": 260, + "lineHeight": "150%" + }, + "visible": true, + "text": "示例图表111333", + "orient": "top", + "align": "center", + "verticalAlign": "top", + "textType": "text", + "subtextType": "text", + "subtext": "", + "x": 20, + "y": 20, + "maxWidth": 260 + }, + "_uid": 1234, + "type": "group", + "name": "title", + "children": [ + { + "attribute": { + "x": 0, + "y": 0, + "zIndex": 1, + "width": 182.77993774414062, + "height": 39, + "boundsPadding": [0, 0, 0, 0] + }, + "_uid": 1235, + "type": "group", + "name": "title-container", + "children": [ + { + "attribute": { + "text": ["示例图表111333"], + "whiteSpace": "normal", + "ellipsis": "...", + "fill": "#000", + "fontSize": 26, + "fontWeight": "bold", + "textAlign": "center", + "textBaseline": "top", + "width": 260, + "maxLineWidth": 260, + "lineHeight": "150%", + "x": 130, + "y": 0 + }, + "_uid": 1236, + "type": "text", + "name": "mainTitle", + "children": [] + }, + { + "attribute": { + "text": [""], + "whiteSpace": "normal", + "ellipsis": "...", + "fill": "#89909d", + "fontSize": 14, + "fontWeight": "normal", + "textAlign": "center", + "textBaseline": "top", + "maxLineWidth": 260, + "lineHeight": "150%", + "heightLimit": null, + "x": 130, + "y": 39 + }, + "_uid": 1237, + "type": "text", + "name": "subTitle", + "children": [] + } + ] + } + ] + }, + { + "attribute": { + "layout": "horizontal", + "title": { + "align": "start", + "space": 12, + "textStyle": { + "fontSize": 12, + "fontWeight": "bold", + "fill": "#2C3542" + }, + "visible": false + }, + "item": { + "spaceCol": 10, + "spaceRow": 6, + "shape": { + "space": 6, + "style": { + "size": 10, + "cursor": "pointer", + "lineWidth": 0, + "fillOpacity": 1, + "opacity": 1 + }, + "state": { + "selectedHover": { + "opacity": 0.85 + }, + "unSelected": { + "opacity": 1, + "fillOpacity": 0.2 + } + } + }, + "label": { + "space": 6, + "style": { + "fontSize": 12, + "fill": "#606773", + "cursor": "pointer", + "lineHeight": "130%", + "opacity": 1 + }, + "state": { + "selectedHover": { + "opacity": 0.85 + }, + "unSelected": { + "fill": "#bcc1cb", + "opacity": 1 + } + } + }, + "value": { + "alignRight": false, + "style": { + "fontSize": 12, + "fill": "#ccc", + "cursor": "pointer" + }, + "state": { + "selectedHover": { + "opacity": 0.85 + }, + "unSelected": { + "fill": "#D8D8D8" + } + } + }, + "background": { + "style": { + "cursor": "pointer" + }, + "state": { + "selectedHover": { + "fill": "#f1f2f5" + }, + "unSelectedHover": { + "fill": "#f1f2f5" + } + } + }, + "focus": false, + "focusIconStyle": { + "size": 10, + "symbolType": "M8 1C11.866 1 15 4.13401 15 8C15 11.866 11.866 15 8 15C4.13401 15 1 11.866 1 8C1 4.13401 4.13401 1 8 1ZM8.75044 2.55077L8.75 3.75H7.25L7.25006 2.5507C4.81247 2.88304 2.88304 4.81247 2.5507 7.25006L3.75 7.25V8.75L2.55077 8.75044C2.8833 11.1878 4.81264 13.117 7.25006 13.4493L7.25 12.25H8.75L8.75044 13.4492C11.1876 13.1167 13.1167 11.1876 13.4492 8.75044L12.25 8.75V7.25L13.4493 7.25006C13.117 4.81264 11.1878 2.8833 8.75044 2.55077ZM8 5.5C9.38071 5.5 10.5 6.61929 10.5 8C10.5 9.38071 9.38071 10.5 8 10.5C6.61929 10.5 5.5 9.38071 5.5 8C5.5 6.61929 6.61929 5.5 8 5.5ZM8 7C7.44772 7 7 7.44772 7 8C7 8.55228 7.44772 9 8 9C8.55228 9 9 8.55228 9 8C9 7.44772 8.55228 7 8 7Z", + "fill": "#333", + "cursor": "pointer" + }, + "visible": true, + "padding": 2 + }, + "autoPage": true, + "pager": { + "space": 12, + "handler": { + "style": { + "size": 10, + "fill": "rgb(47, 69, 84)" + }, + "space": 4, + "state": { + "disable": { + "fill": "rgb(170, 170, 170)" + } + } + }, + "textStyle": { + "fill": "rgb(51, 51, 51)" + } + }, + "hover": true, + "select": true, + "selectMode": "multiple", + "allowAllCanceled": false, + "items": [ + { + "label": "S1", + "shape": { + "symbolType": "square", + "fillOpacity": 1, + "strokeOpacity": 1, + "opacity": 1, + "texturePadding": null, + "textureSize": null, + "fill": "#1664FF", + "stroke": "#1664FF", + "lineWidth": 0 + }, + "id": "S1", + "index": 0 + }, + { + "label": "S2", + "shape": { + "symbolType": "square", + "fillOpacity": 1, + "strokeOpacity": 1, + "opacity": 1, + "texturePadding": null, + "textureSize": null, + "fill": "#1AC6FF", + "stroke": "#1AC6FF", + "lineWidth": 0 + }, + "id": "S2", + "index": 1 + } + ], + "zIndex": 500, + "maxWidth": 212, + "maxHeight": 185, + "disableTriggerEvent": false, + "defaultSelected": ["S1", "S2"], + "width": 77.17999267578125, + "height": 19.6, + "dx": 67.41000366210938, + "dy": 0, + "x": 44, + "y": 79 + }, + "_uid": 1238, + "type": "group", + "name": "legend", + "children": [ + { + "attribute": { + "x": 0, + "y": 0, + "pickable": true, + "childrenPickable": true + }, + "_uid": 1239, + "type": "group", + "name": "innerView", + "children": [ + { + "attribute": { + "x": 0, + "y": 0 + }, + "_uid": 1240, + "type": "group", + "children": [ + { + "attribute": { + "x": 0, + "y": 0, + "cursor": "pointer", + "width": 32.39599609375, + "height": 19.6 + }, + "_uid": 1241, + "type": "group", + "name": "legendItem", + "children": [ + { + "attribute": { + "x": 7, + "y": 9.8, + "pickable": false + }, + "_uid": 1242, + "type": "group", + "children": [ + { + "attribute": { + "x": 0, + "y": 0, + "symbolType": "square", + "strokeBoundsBuffer": 0, + "fillOpacity": 1, + "strokeOpacity": 1, + "opacity": 1, + "texturePadding": null, + "textureSize": null, + "fill": "#1664FF", + "stroke": "#1664FF", + "lineWidth": 0, + "size": 10, + "cursor": "pointer" + }, + "_uid": 1243, + "type": "symbol", + "name": "legendItemShape", + "children": [] + }, + { + "attribute": { + "x": 11, + "y": 0, + "textAlign": "start", + "textBaseline": "middle", + "lineHeight": "130%", + "fontSize": 12, + "fill": "#606773", + "cursor": "pointer", + "opacity": 1, + "text": "S1" + }, + "_uid": 1244, + "type": "text", + "name": "legendItemLabel", + "children": [] + } + ] + } + ] + }, + { + "attribute": { + "x": 42.39599609375, + "y": 0, + "cursor": "pointer", + "width": 34.78399658203125, + "height": 19.6 + }, + "_uid": 1245, + "type": "group", + "name": "legendItem", + "children": [ + { + "attribute": { + "x": 7, + "y": 9.8, + "pickable": false + }, + "_uid": 1246, + "type": "group", + "children": [ + { + "attribute": { + "x": 0, + "y": 0, + "symbolType": "square", + "strokeBoundsBuffer": 0, + "fillOpacity": 1, + "strokeOpacity": 1, + "opacity": 1, + "texturePadding": null, + "textureSize": null, + "fill": "#1AC6FF", + "stroke": "#1AC6FF", + "lineWidth": 0, + "size": 10, + "cursor": "pointer" + }, + "_uid": 1247, + "type": "symbol", + "name": "legendItemShape", + "children": [] + }, + { + "attribute": { + "x": 11, + "y": 0, + "textAlign": "start", + "textBaseline": "middle", + "lineHeight": "130%", + "fontSize": 12, + "fill": "#606773", + "cursor": "pointer", + "opacity": 1, + "text": "S2" + }, + "_uid": 1248, + "type": "text", + "name": "legendItemLabel", + "children": [] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] +}