From b7fb41f18e387ab3900bcab36bd414b097247b53 Mon Sep 17 00:00:00 2001 From: heindlalex Date: Sat, 29 Dec 2018 18:23:59 +0100 Subject: [PATCH] Fix Issue #385, using TextBounds.Width rather than path bounds to ensure proper font alignment for "middle" and "end" - see also "text-align-03-b" --- Source/Text/SvgTextBase.cs | 10 ++-- ...__issue-385-01_Test_text-anchor-middle.PNG | Bin 0 -> 12122 bytes ...__issue-385-01_Test_text-anchor-middle.svg | 47 ++++++++++++++++++ 3 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 Tests/W3CTestSuite/png/__issue-385-01_Test_text-anchor-middle.PNG create mode 100644 Tests/W3CTestSuite/svg/__issue-385-01_Test_text-anchor-middle.svg diff --git a/Source/Text/SvgTextBase.cs b/Source/Text/SvgTextBase.cs index 9467f53..58ab6dd 100644 --- a/Source/Text/SvgTextBase.cs +++ b/Source/Text/SvgTextBase.cs @@ -325,7 +325,7 @@ namespace Svg if (textNode == null) { - if (!string.IsNullOrEmpty(node.Content)) state.DrawString(PrepareText(node.Content)); + if (!string.IsNullOrEmpty(node.Content)) state.DrawString(PrepareText(node.Content)); } else { @@ -838,11 +838,13 @@ namespace Svg var xOffset = 0f; //_xAnchor - minX; switch (Element.TextAnchor) { - case SvgTextAnchor.Middle: - xOffset -= (maxX - minX) / 2; + case SvgTextAnchor.Middle: + if (_anchoredPaths.Count() == 1) xOffset -= this.TextBounds.Width / 2; + else xOffset -= (maxX - minX) / 2; break; case SvgTextAnchor.End: - xOffset -= (maxX - minX); + if (_anchoredPaths.Count() == 1) xOffset -= this.TextBounds.Width; + else xOffset -= (maxX - minX); break; } diff --git a/Tests/W3CTestSuite/png/__issue-385-01_Test_text-anchor-middle.PNG b/Tests/W3CTestSuite/png/__issue-385-01_Test_text-anchor-middle.PNG new file mode 100644 index 0000000000000000000000000000000000000000..34b6fb2b30bcad854aabc7e7455fabfd04782e26 GIT binary patch literal 12122 zcmeHtXFQwl8!xTaYSAiMyOY$2RZ=6A+AS3=wOhMJP(mYw)(=$#6=JW5QmgjnhoY!G zQX^E2Aa=wiC;gxC?wl9ryf`n;d67@@+_|6Yx$gV=Uf=r~PsB3=?aM5@EOc~qmvwa> zL+I$}WB-1bF49JVTjYPzzUaLn+Uj&A{roGm3kIi0Pao0ImBp~0yuLt32V~HF{OI{R z>vaNarR9rs;&xLZRB+*L%;WRJ!XI?iteK@IKiLITmWE1*@5Dma#-Uv90_nbhkr=P< zCYTZ5{ojyLEdj5pdfv}cuWE`xwUfUlWl?J9F1J19)x0Ks{oGCF1z6$U3H3!oTi;WH z1@UCR071$ipB7aa6Vp=t*A$6svkx2k+Zl-^Z|Ue3Mp-xj?C*$zQ6s@U@vuMkW+Da= z?L|WWil$Sr6^!LZTJqIY2DS0Xgq`v_a?Op*FV!s%9_5_@pXz6E!pIQ=wG(Q!B+SD z({pB-rJntt?MM>JS^_u49kggg!n@*{9l0UtDP!xqWHmdM4;1?jZqCZSJMoMs|6-2TSoy`ZUkK@Al{&eOF^B|$B+XYg0ClHzypJLsEJYcpbI zr-^aD>a3lv;-~(bTVbhHOL+Wr8HI6sAXxIY*y8KE^dD|l^6>_}*+M3W^DtZB=8$h< zONA<>h6X*K28GI@Fs?7ZcZc5qs@1bVGv#^|!owPTDOMI2T~zM7Si9tprXBD2Oh~B( zT@ePgT_#Fey(l~^98tI9Z*^Dxb;+Y{twcgK()eCFLs!Sm13%sTCK&@>(-OKHcNrA; z1IUw_Lr(zsZHBQdpZkqlYtu111&4s z`#EEso?gMOskHqTArXrG@wSAA14?+jiwA~sxDJ{1 zPqVBoNWomclukFNz58iIVob}k=ErX?$WguWk3{Ml$k}Rsh=vVb$bEjH*}TSfCDoyH zo)6xJWtwR)MVL0cZr{P#y!7k5LH@JQ?6L_P^`OkORAkO&=h<4@ZgB{6RU|V!p8ed@y&AH2Gjk`S@YDf6O$H=$4iS{ zy^28TTBg`fpF1fny6s0BAjK8)K=SQqU{TBOU1FDR=#U1~Z*6kVRHpW;io++kUv?(p zWans6zaM4HQUyKyEEc#W^bs3hl1aWA5=~c-1rtkbdLam&7ED!qunF9`J;zJ1_!!SJ zlrKcNFtI}&@bVGXxs53Bs~WgwWx8Jd`SSaiZob{B-me&BpZ+EJbGf$Tr7wNs*yp^x zd{*H#Z@V_!Z6fTtZ9#0E8C@^SMat(Rv}c66KCj%Yhi$gV>?xxF##@cwf8SQSzYw7%Wl%pvYUj>}DDzmz8EqZrKS1b(d;t@oZ68J@fLyrM2jl0%aMM79%<%Ov@AUl+{`d2#n4)?+QlFPNX51t&pTMKt zrzmnR<1}(z))482mvvI$MF^_8EG=!OZKnzB9QC?LHtK_y>$Y1`m;J7Xt+tdcRU>LT zbnA+2ns);ZH#{P-x|Pj4o1R1D@}WzG_?bEf4SvmTPeGl~6T*bk0PF#E2IO*0F#at} zLTmO@Ym%h9?pnOWSsV??dWSg4m%wtuyS+vP%c62}nPORztW>xBHwhhHay8@J z-tAWPE+dKiR{q46SuPQwa!2wOg_Q_IhMaVHeAm4<{H+;kAM{R>zwa)Hng?>`*gL4V zxEsCP1)OPIoCB2=R{71eSn(2C(3|8wFOQ%1-i@3jdH-CCO!F(8cZMD%2Ub*@uO3-5 zqo(E;G(M$Z{%}QS-zbf27X_TlUD*BBlfo_(fxR~g+OOBivfeMKYeAYd=zljTeZj>j z>k3-|If41i!DL3sroe*?P)av0H7rOJaV|3odw3Yz!1sjcpt4<)^ZQiElmMUg`{Qh? z+1G2n6?C1^2*RM#z5ebGUJO^ID1lnywyf2v(VJiXXM7s5DG1kU%LuM6JZo!oa@YSi zne@eCvi$B@4GkUy);**Y$f+?aD-%HlP5z9l@)GBqI0k{)mbe=m9-U*#aqU=8_12vP3TIASr{$Yx}>YC2QKkeWp*YX=`*|gG3<>``Pjb5UD z43V#z!C0t9u`da^hOnpp$$GlA1kG^F7vN+>=%r(B9(WW_R^Ht=dRIWxa8UA7i0I98 zx!=vL1etm8uC-RCK^>Ak7%gE8I?0EQB_&xyl|wHZ4y~JrArXF(bE1N(9y1%*^36~N zYCH%%)tc-b-@m{nnZ!pq&!|C?ntK9S!g;g9l>Xc=M8gZh#bZVt%XlC(gXmTPU7VDj zS9UOtFb4``-#7!X@rLqrz0crXPvuMgCoV2G{+w&;REZkjbaRI`5Gjg!Dhjhc;@Cw3 z9lOcH$2{L}qA$@yAX9$e07nQ$yFE~eEm>UIf17={Ki)IBl;?q*JyoFXcx`he!Oy8P zyAhd0NvtU#%e?q+ z7Wq~~Gi?Kgz|32h3s>6Sw=RPG#k{P?*-+Cr7@tCjIQFI3j^NvBdOgRU2K;hN`!xgS zbry}!-SNg2gpcTHK>dM)^KhSi`H?0K^{vct@EIs28QP~{r9z$?(xm}P8`yMw_QcA8 zQ$Gna1I#FzI3rf0zA&bsDnsVl;`#Xd1N+1v-*h80x#Z1sEx=qOL0 zjkv{bwa^IV>J|)ta28EF6r>DN29LP(XEy`;d_JUa1dgtrg?P!`K5pF2PKtg%3I{w8 zQPcZK2e_#ceru)c^(M>mj@g^?3ol60KeMI_rw?T{%DE&)i~_2|anj7u%xq(UthP zFhx8L4B1nkJW=LxQ7ER-YaU}vvY+#&Q?7MssYTgtpOUXfgCTgNVSeG{!*Ofdg-BK2 zE*af)3`B$$fR~TLSJWTvN42WmRO=C?tWzPZp~%$f$OrY;sRs0K+r(}zC?4wfgkB0yJ$5ba^IzV$89^RaDB?jVThbh& zNfh}QNOPxu8d-HQsOxX?d{wHd_&y=>Cm?tkaW}6kJ zUllPU2!^=;EBGf86@g?+NrziB9+`V9d)<;j=iyx#PcGCQ#eH?pv1tEbkb{{r>2c3G zrcik9XbH^BKELj&X^tN_i&L-v_PnR@@k3fLrM>}8q|d!v4W*Da*}R5xStQro>X(E{ zCo31rZTkz#089L_K0ATm7$NEmI?V9ROfE+6k@hF^ztQnpA}i|QytfMF*;~FJF5TU6 zVOA|6?u|Vw%`DkBiJ5lg2iF`R$n?Xjh3g5+}l2qC|x2 zVm_)qX=}VR!&SwDegb^T$!K(ofk{syL*?vDD{v2(d*wLREq)(pxmZPc+-}~~3~&GB zVAG8VEQYW`ZTQtAID|zdnySZ8gej=2jlcbH(D$asCEk7am(6RXMVLrn{G&-ebuXq^ znVpg=;X7jQ^o@Ag5JE`LB@)Q}W!dier^IGS8!az_?!&5j_eKO2Wi>TU!|?)_*IO_% zc{sch`>Rtg8M9-SxAx3&mz^G>{s@@%dXa1ez7sP4#|}DE7vd!)OPHMfW;;P#n8=JJ zs>&K45~28e4FN`eDy)L)Cp*?MvaJ6tjOp{c$r zL)vtX!7)WoFtW`Ud&mhza$Y@zSN(2DP>sJ_Ac1Gy|qYb95_S#tmo>Txo;>%NZETcca&F{+3Zi=vM~5XS;(HX>HoF& zi+wlBml?xqzni%CT#We&{y=X@Xq`T==pKWA z?O`)>TakCz44erUoWv75B^K`))`yDUdNol2Gt`_`9_`~i@HH0Z*irb6#;L1+(WS%e z;Qp>_ET3n1c{C+D7th=`NFFa;pXFR@LC9H>KUeudCpffaEgIk?iJ9q+q(*JRJW6{DG=8wm2@T&05 zF}n>4e{8Q?3DmYXT%b|30(_%^l0o#UETj=1C$aTrM5*ksP9ft(P8zPvcxNI;y=Ni= zEN4_z*%o=Gu`P(M@k=1Dp?nh*fv&BY z{EQ>HKlLZ{8)%7I=(IUcNGMG)lXkJop8S2qH`+ZiWyCS^kF#DF$A*a}iKw#$) zL1&IzoX{r2+zFrA$dGRCKBcp8W^IRbAt4dl49r!uu`2M`kDdF8^ts&J+&L))MStMV zs0N&JIF3ju%yZpSb`il9x;y9B7TXe7w{M&)ZJ5C%8m3~-mRnSv3gF=U?j%f722}C-@Hy*wRiLyA z?VK7bdaxN4a<9CjPM$60fMbS((VMkjrE&>XtO69URgpEX?(ti-*5H@WlCmyQuFVi3 z-W|}lksV-taD#kxgk}oJBrtPt-nF(Ce>0Dhd8Xwa+tR(uCe>t_BELE^^tDS(|I4LW z-hj=>yWCPh8`&+|T~}#$txK$Vdhsp8MB;H$C*4vgZDV9YFTNNxQ>C$90mIr#de4KPxCF z_f>+OH+jMxi=8wI3Ab-kCP+#2fd25K$yB^S$M+^!P@BxUF*KjC{bZuzNB;N!YKgaG_WtG(JM+sgTC8yLTJT@+1j~AhoGDmhwlZP<}Cr;V)8{V z_wH`CMVBYIH@`OCnmbYs=fohbZ6~+OFZd-WL(#=$YZmHBCcEJ2s%OVY{--10v|T|n zC^C=udik!T{e&*~j(n|WAFV2JX3XE`)?W9eWq7Qu*h|i+cJ{$3_0j{sfyfPNhwNY0 zB>SwEBvYnZyqCy=?qN%BXi3=f)w3n^?`7wsCHjAWcj+Nl$~zjZ z1%C!oPIDC;d0p0&7C$!#$`P{OwC^~~;#DF*<{vd1GC%Jud}N>dx0L5+YDM5#+5sl# z9}z*1}u6!;AjRF(AcfxkHDZkPu_n=BL(o$fqN+@l8?B3c1qx zi?yoFN>fXJTdcw(X!XW|kMCA?Vye0>>eeFr@`^K~Zr}5_6M0j6CWB&Y{(a`t=e|EF z8F;Hl87SRED~^==lM@Sl?#5t^fwj?HeKsd~phWwD4}nxG!Hd+!5DqYaJm)c=l-%FT zF^!pD9u@PnwmlM7yWgoq1;Y;@2sf6{EyK$~GsdHumnq5-{>5itI04wHd%jC)e@LJT zZrV9y-zW9ffoYCRD_C5kJvET_RPU9%IhzOjV>4nFQO14|5ggTrah*!z(8;%cX^@Zl zQ0g`iW%2DGT?X_HajW&TDqvrz@efLgtrO5aJ_D!jg|c$D=+~Uh=XT@2(Dwa3t+4W7 zf2QHf%=EGUjkHf;zU^n`AkuKdra~qi=n8=a3_YumWR(n1;~oDK^l|{eps<#5R%7BW zc&3*2T(sE3J7}F^Jeod+hexz_y>8^HK^_jPZp~1$FE!_@;8fL_QWxe}_uXc84%wCP zZiefn;}36v8wv0lMT4Fq*!9hfFXru2#6B-L`+Nc&Vo-^S^DjoGZ`|nU4y@Xkc4#pr z&lUF{W4`MKN^{W)L5ttWYPrh7^gFMP4f9j}Rwt{|zAdxw^(Vn~)1K!~+-9U6!l!%# zR+E|-Gd{-O>(gnnZt>gpDxHu;ERnQbs&HO!4ZYd;eY|n`B2N9DhPvH3OKp2~$6C;b zXJuBimM07GOSg-QGK%mq_4^9kO~p~Pr)tQ|+jmD9D9ZM72JH+M#dVf0t*ahvHJ)b-5}+!^{)KVXa+|uO(vkpdE#n5o&Y^HGA8sfx z-RwEryj~tU`7tPCyt08bG*Q9xfK;;4q~tyRK5pJATFy_P=$O%o-)&l{X6P3m)fIq- zTj#WN`o7-2ttj=Wh^JVHdCHE~nsH92gtWh-|Nl*w|4HBJm5e3eZq)r69Y9+sM60DF z5xRkqIigwuan7bXH%WrL zwPkG``tzZ5kGP5=W3ZdST)T8DP4C@R5v!fMYRD0Fq9(9j}<&Ms70>E-{(9)cEiO@)NNtS_?`Sxnk{71?~x zDH98!tu)$KI@*1CmS2cmD+>1I5X|SN3Equ9__gf<@PGJOxzpDsI`C=ME^X?N0xs9b zE_%IrSRb?OdM-gdIO}Vt@5AV(l#RzoAlNrbrJOaN;T(hUqlPH0*@iarW?+ZQ+Spr) zOT8IQ$B)HjBJ92mlO87K;ZRtw#jetYdt9`24;L=F;76QkQ##LtntYf|XEg89)?Qv_ zW%ze2+nOAfTCENH|( z*BWk08Z3swBaz&%AT&w!WmeBPVRq3fb6dUJSMu-B7N}6o>e2`mPnX}*5vebI_J$_C zWGXtZo;E9e?;*ev&Xb@OOs75L{MABX{MQ@HdWHn;U^=V%vS#^JEu$KcU!$@!-Xz@m zVyHeQYln#=t2a8YnKa$|C+oO>ZZ5m>m?dBN9D}pcn&UI}XqH$6s&NO}gVPTl7FG+c zZimWM&DL>NgZ9NG6!}HOnogK8lJpGp=PCufumy;8rKkG*>jwb=4EJN`=reqO#l2ux z^81tsnk>5sKKEA-L!~t>V?#y1H7pj@dDXvJXZ62{ZWmbXoJ1U0F^>HrYX_caACum23ssLzZ&<%aq{VNJnXru_N`K&eRCN?M zsD1T8f1rDrw}=n&j+``QcO6Ssb5li0C_}4gYQEEweI5@=#N~OQW#RY;RRK#@i+u>-ayKeC~&_-a@Dl zM+MOS&YU#n6DE$&W=8Suo#+72;YY(`cVdaf#`M5^{)AInL%{Cl11F_@0p^6DXsnve zf4a-{--0C-8_y*mK9@#t{P=ZndE5q62*H-J&G=NN9q8K&Pvszc=f;kS^>L%1Ma;KW<22a14@(R`EyZ(;#o=}0wdr|SuQ&SkQ&={MtDS#yoYEm@D) zehhU?{!5ea^_#>F_~J+I(=?NiYP__yZUI*EJi*#~@KcHLI7jk046V9*i6ao=@@{$N zJyc=^>Ruzs;=cPJ6c%~63h^YGu;+8S!aQWv1YZ3i2-(odU@`B*5(2azt0b5-jR z^1q-Hjx-4r(C@}>DK1Hw!A7;dPPy6xczpm6-e1amy|{er6X#+f&h!YViqLN|1cGAC z{K?tBa}Tb)dMJ8y>SHjvT62HY$PisoFAp|{8T9|X-2Ugl+3RUQ<#0Udo<_kc$S8PO z*M{4_)AbX&iAM#Y!mdIhs1MLRbtrb48L$jhTuR@>nw_uK7`RmZqXGFM8|9zakdWb( zY5ORk@&~!D_k}j$@(>{oq-fr=VW5W(ujf}H3iBnrFL5JX4($xw7H6SqFE4Ta5ix#WeojnV9sno`VM^jZ#yu{!HY8&~yPXvM#d({@S_CiMa6bVs6!I72D9C`GYi5 zaKT0goC6KrUy)A)vv;W$QxAK!3jc~$wP%S%j}GS~jCI=QTrf5LgckCLb^I9l7Z$&B zRxi9v7MUasx2&)vln>^vjTPJYl&Gg4VUfDA!Yy3SPYR1enw(N;L4?B54dZJj zU0#>e1z-=qNot!{_6-k6SvO>jP&UU^=q1L3*OLB%+mR&}g_h_s7`g!AyJ-cYP$2j7 zG;M$|8XQc&qHlcF%q$hlA2%cwv;#^D2FCDumw%vWb~F8nj?OTt`&B1&3M4{L^Sr6= z>bw66gvXk)W764AGzDN9 z8s{rMO6-Yi;+fs&cU6w7;$+7w3$V%$0cu(#Q-2rFC%(>6+NvQXQm0H$0twx2&$^6h z#Hp9l`+VSEIfjoVyYUlQC=qXg%MQ<0^N*_badV*LZ0Wf7#n?t2F|{HE^l<2M2jnPl zJ_S`!TNf$+&R>?Nslry(V^wC-eil?nbLm$n5&&R)POoboU*-z;3#Y>S#LKu*+Mm78 zyB^0|X}hmgqNqln#>+Alz@(%#KBuRtiY~!FG)nmNV0&`+uv1@6hl<4rJ@@^^vMab| zVv1`THCvoc#gCFdJ*VmVHf|J$MF@0C7C|-fsX503@uZiYE7}4HP=KKc#-KC@asCMY zNq&7*lq&7blPGyjb4}|_2+roS{B_OsL>O<@sPNFmqK{C}sj|7kIuYNM(`M3AGphBM zjTY5ZO?RAzvELTXpY~Su6K*#+`g@#}P=QWEo#3iCi6Rul=WOK&I~!=kcTIED=*?}D z?@q%5*xsf@niN$`nBUho7TSmGD(4^bJh%F`+aa#W<5?Vw)SZ8@H5r;CB(oS;xr{J7 zc7!>s(N4=qq;GNiyXZ^<{H9t< z1sxvG)8B9&!Bgs_4oyd#6l85YO=O5$bE;aEUG>=Jt zL5>@l?Z2!_7yX39k4F>55q-DTFYs{`X50)yfhN;&O9RQOC*ShQJi*KsNLB@=<%t_ic$M0Xps8r9$ zzETF@OEQIox<*`keU&vgUKgP8Bubzujbjzec+viX0z!X1FK^l&fJBxdA0* zyT|1j&!$MZzwVEE`2|!C`sUx-Ri#*HvMag14v`dr}52TJ# zaHji@XIGPk>_?4oMdbRT}4fyz+7Lgz9riM*n9o6t+dmBFBb_- za=7@lB|}W~bx)xb#F#@frg_vzuSO-L;43z4TD6KXe)-t_bIv|>y!Z_2{=WLbWZ&s6 zfLQMGPKr7{jz?z&b|ZFp)ad+U!OkXhM89XU^15E)g({7f-)OmvuQ?VWX0#)c*Lqxo zvrD2}{Tdt)57kul9xv{09`(Aam!bG|R3*JYv>v(QpZEf>D$3cV!cwSF^Egj`9@`KG zceD-PpnrWw~{`*pxWvSMdZs4P1wAKAg~OaXsxf z<{K-cxuv^3Y*EhR;M#TJ`dh2xwKT@mE3tczvw@A`NALpwToyXbpd62HHtCF%(_-e# zvny6T=V$5|=V$NTN#*GZ>Z&6LZA`y~*O2*|2I_QtE9K;d+uW@FOcP4IHkvD@RD1UO zS{~NC3K?CeC-%>5OkX%2LCy8smv~#Cyr2iy;Kw|=0=SHpPeH4ZG*bt*)$zE|Qe}4t zUL@UuS7hI({Muof#EyW2#l!F7L_up|igI^dUvGNDzF&jD(Mu^;f#SRzl#TbsC{?U? z1(#)7wc&Pl0e;WvosL7RCtT% zTJb2)P0QMgEi9{S=c~SX7eh#$V^S-?XLr8M2yh>c-3SQtHvGZq*DcdvCAjF2XTr5w z+fnDF+fbp#8}1|+`y{?PuZsRoyS8pR0(wa|-RID4%q~p4A=2JXi+d|D5{E1=tG8$~ kiZM@xgxF{k&s5#;{J)dpp;5H= + + + + + + HH + 8888888 + + 080 + + HVH + + + + + + + + + + + + + + + -- GitLab