From 21a8d626248f8b93373fe43d02e64da7a1066d42 Mon Sep 17 00:00:00 2001 From: Srishti Date: Fri, 21 Jun 2013 03:33:30 +0530 Subject: [PATCH] Fixes Text rotation issue #2095 --- src/canvas.js | 22 ++++++++++++++-------- test/driver.js | 11 +++++++---- test/pdfs/.gitignore | 1 + test/pdfs/TaroUTR50SortedList112.pdf.link | 1 + test/pdfs/rotated.pdf | Bin 0 -> 12963 bytes test/test_manifest.json | 14 ++++++++++++++ web/text_layer_builder.js | 12 +++++++----- 7 files changed, 44 insertions(+), 17 deletions(-) create mode 100644 test/pdfs/TaroUTR50SortedList112.pdf.link create mode 100644 test/pdfs/rotated.pdf diff --git a/src/canvas.js b/src/canvas.js index 99968d014..c8c46a400 100644 --- a/src/canvas.js +++ b/src/canvas.js @@ -968,14 +968,20 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { var ctx = this.ctx; var font = this.current.font; var ctxMatrix = ctx.mozCurrentTransform; - if (ctxMatrix) { - var bl = Util.applyTransform([0, 0], ctxMatrix); - var tr = Util.applyTransform([1, 1], ctxMatrix); - geometry.x = bl[0]; - geometry.y = bl[1]; - geometry.hScale = tr[0] - bl[0]; - geometry.vScale = tr[1] - bl[1]; - } + var a = ctxMatrix[0], b = ctxMatrix[1], c = ctxMatrix[2]; + var d = ctxMatrix[3], e = ctxMatrix[4], f = ctxMatrix[5]; + var sx = (a >= 0) ? + Math.sqrt((a * a) + (b * b)) : -Math.sqrt((a * a) + (b * b)); + var sy = (d >= 0) ? + Math.sqrt((c * c) + (d * d)) : -Math.sqrt((c * c) + (d * d)); + var angle = Math.atan2(b, a); + var x = e; + var y = f; + geometry.x = x; + geometry.y = y; + geometry.hScale = sx; + geometry.vScale = sy; + geometry.angle = angle; geometry.spaceWidth = font.spaceWidth; geometry.fontName = font.loadedName; geometry.fontFamily = font.fallbackName; diff --git a/test/driver.js b/test/driver.js index 50272ea61..36f2309e7 100644 --- a/test/driver.js +++ b/test/driver.js @@ -194,15 +194,18 @@ SimpleTextLayerBuilder.prototype = { appendText: function SimpleTextLayerBuilder_AppendText(geom) { var ctx = this.ctx, viewport = this.viewport; // vScale and hScale already contain the scaling to pixel units - var fontHeight = geom.fontSize * geom.vScale; + var fontHeight = geom.fontSize * Math.abs(geom.vScale); + ctx.save(); ctx.beginPath(); ctx.strokeStyle = 'red'; ctx.fillStyle = 'yellow'; - ctx.rect(geom.x, geom.y - fontHeight, - geom.canvasWidth * geom.hScale, fontHeight); + ctx.translate(geom.x + (fontHeight * Math.sin(geom.angle)), + geom.y - (fontHeight * Math.cos(geom.angle))); + ctx.rotate(geom.angle); + ctx.rect(0, 0, geom.canvasWidth * Math.abs(geom.hScale), fontHeight); ctx.stroke(); ctx.fill(); - + ctx.restore(); var textContent = this.textContent.bidiTexts[this.textCounter].str; ctx.font = fontHeight + 'px ' + geom.fontFamily; ctx.fillStyle = 'black'; diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index b8a523177..79c8ec6aa 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -29,6 +29,7 @@ !TAMReview.pdf !issue918.pdf !issue1905.pdf +!rotated.pdf !issue1249.pdf !smaskdim.pdf !endchar.pdf diff --git a/test/pdfs/TaroUTR50SortedList112.pdf.link b/test/pdfs/TaroUTR50SortedList112.pdf.link new file mode 100644 index 000000000..b8b7b6207 --- /dev/null +++ b/test/pdfs/TaroUTR50SortedList112.pdf.link @@ -0,0 +1 @@ +http://blogs.adobe.com/CCJKType/files/2012/07/TaroUTR50SortedList112.pdf diff --git a/test/pdfs/rotated.pdf b/test/pdfs/rotated.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3da0186e9c58d816bd5363506aab34bbf2840ebb GIT binary patch literal 12963 zcmajG1yo$wwl&-d!3huu8UmG|!AgKCJi#Tn1&0C(cM0wu+}$k%cL@;OlAytz;O;Je z(cSOfzVE(&d}mO#_gedGS#!;G&KQhYv~t3tEMQi4EZUCTj;4;W$ zi`l+dDPA(u#G0JX=>>)pz7;Eg;fLmpJCli+i&*X}E$60$CUu|b)&%ZH{UkV#=zWeu zTIL zAU*WaSs^5l_1nH72#q>kC^5mKyJoX)+h-_9w02miycqK+ki4Oy>u2mrKY}n?Cz2t4 zO-B4S+JJ=SYZPzSXTm3&8p&~H8f_zUi%qy}{tNP*?>z`bzU@mMWxo8NH;swu?UR7* z1~0>-Fcpp8!ue*{$kF$G2rWB$NHXHAhWQIXcA%`*Que*^7bt7>Emd_3FUePK<+mue zPi5|QeX$Uh27e=p>^&p_>jC?R4jTmaF#4yD+0&J zG*)vzeVxi>G;e1pz7{0~F@p51fW6;Q`uT~|MS77t(hRH?fLoj?fJEX%=r95 z^VxJ+&4jk=eoRtJ`W-$g{EsIXwZ&$8l6F%Te;h#msHidDPz>A8PZtcO87tmWZyu<( z9VPg~;#K}c+1_N+m$Ni7;NwKkCyO_B8lM|ZYhDf}J%Tvuy&Rp190uL7kd2Cg)8=bS ztwwb?h*Y7+IQiH-+#1P_YXj$x4I03^+7nHMOf!jZ^jy&L$4-B43l@I6?5G22p=Z)K zI-H&D2Bc!NhVsWRj1g`%T3*hKCEihbEv@%bUzA5Y%jz6a!sm!C9@~5>dU1c4!}WwU zm*%HzEA3SqCcZP(CQeAt47HIef5>Ja11~wXm;1pJlR)}K5U<#Pej)u5U?)(=2ZeDd zupG4oeMZ1%wYPyNelbVj?mUR8lIm#jQFR{rB2jEJxuu_wF8x3+x;3FWp+`twtvBXK z=3`<3`dOLMPbWessn5SX?Xo5+4rGPk7lzC}YhXH}z5r7^_aGxfL7@@A<}VZGAGr}* zi2#wkccVIMm9S0NdxN3Jgu-xXHH31G74|x~INZ&f@1R|D#~0&xiOALut^5qXNjB9W z1cYwp%s>!MA@T;sF8E>=J5c;tl2~(cK<`a2lWq?b3NLZhCBZ-O-mrLAHXwx72ku=d_#L)=$l#e6Vew0IcA)^N-{vUsx z^Qm6X(7eNyqvm7frQxUZc#{{J@hQ1?6-tQ zzpIpXh`yCHh}fmr8#YG@?b_k$#sZNNS*0~0&rJ7YVey!p;DcG{5sg%O{# z)iO%*?_{p76y1)Y`;=6a3slbN1U9%aa@dp%9rLi?RcPz3F!kA(0}ValIoc=+NQkC? zvYNnnq-7;0hcjD4!cF4&ZNZA#uaW&euAQpjM(2!zq1W6gtexxXu-rN@MVq`cyFQ-BzXU0w$SO|MdEDlh(Mdb1Vm zo0|9b8F3cTjZ|u0AxhbS&_&^pw53;pF_G8Z`(2sp->56{C)gY`8E$mK?=rE6K7I0k z+g1l>xy9oQ*>*yol~(T>vqpa&$#THY8(Q>Qqe{C!ilDE|_$#M4ebnu{E-`C+TADPB z>{#cL>l;*=RN)~mP8v=WuAZrPN{PVq3FcQ8^^YyRG%|TAiJ)d%oePm;fJj8- zt8~HrT9ICoX3_;e?Yu|s(~mUg0*COFFpi^s3x99G+RY~B>ukQ5_4N=G#y0KY@ZfN% z_yGT=BqRo}>6RMW{v!w&2J~Ky3WUoVa1=+(qQ(qUnMatnk)OA@mSdkqS^S<5BFSCu zcTUmFOL`w+wkAq9DsY9~7`xYE?;$@!)`>~Ae5@$-V}uvQcX=QFCRXgDs7K&rIqq8?DL*z#u3cSU`UNtzU6PUd zg3eCejj3ZX;<6s@a^|0jGwhrs zDf7XS#oAx=%4lPqHwQU^IoE#FqaMj8wp48aq zyrf*H63Sb;(rJS)SY^+~U>_O-33RRd)}DQkbI?j=<8l4q3i7g(a2LsIziQnbAyz{)=Ka z)tIb{Uv1wWseA43=&-J`_i!o%9Km!Wr}|J8J8n2}(H}3RQW(BIqDWQT`OTcpnwgiGFC4#U-0OfiA45=lPejnc*2(WJ+y zez!$i<|6q7yBvx>Kc=?TQ{Db{U?jg2^JQAHqw`L-QfT;QE3aj%>-+YvFKzjWmPKZ) z5+cV&n!O=e2f17hf{?IR$;=0u?EL}Q?acBId^t5jY@WmXL@ZEJtrC#6rCo%f_m~RRy{k^ekrqrYh{6 z=LAsqWqC}u0^VfVB^yrQ<>_nB2@nB#8)9w9VrZ4(y-a<4De~1>Gu%KJpjJDPfyK>u z`NydRVaFKNp(6~k!N&|ooeaQU=ba9>AF0WW!Q&kX2Db*)qLLSnG*F!MdS-GbwrUJ@ z-&v2|N)m;;5&ddS$owQGM_@&n>HOG=LqB-fFt?v;(DlL86pGNqis# zZ&beRI!sjEj6BS(-5ZRHW25^btcgeOJ!9v^jkvmDR$QJU1UpXEJh&_Io{IX-oiTqu zQ$^w`dfB^3c*}@;UgNK!MeX&yVGD>=t@-GF`K*OYC&ZLX-(w*=F-&yKRH9s+MI}Vu zsAJSRS_`adHwd8~Dc2)f=^+ z-g~2fuRx>DhhmFaZcRI8Dgry@EK zl(fv;g!i>~2_;x2KS{#ekn~*&7aOUGx& zdXcFuC@H}*G#bCg5tkoZ2C^hYpG%KEl}d;H6iuBeLX;mzeahgwOm|!y>G_QZbeQ5G zuFI>70L6R@Vfbb3B(%K{@<=U8S?%38{SR`(iT+U;x)=kx3f8d?oJ19B-!JM(%h?Pq zo!0C@$w_fj^}%Ef&JAkEx@)3_YabCx&vABVr+p?<(fj3xMO9uLOtm8gN(ipW@kCT9TILz%$oGf6lF0Jc-S88+!Ju<*sXmzXceWT z=W>~s;Cb8rzQ_63&oaKr^{_WQZ}STI z1Dt#!{Kwa9Y}J$KITli8N%GuhF=0iM-En54RY$cr)WN;ej9SVuv$S}HG_{*UOds+F^XxE0vIoL1G<=BnJyl^YD7yl zxElI0Dcs2`a86$kSA~$bvc8Ievbs3g(&#T+5F_Y)Sud-^N)oyr!9Yn)mZy2*E$*N&kJEp|I!kL_ZHm`giP*Sk*> zP`m7PKp%`oR_moCxTf+`Qwc^-I+s^QQkiVYrNg+)q;|Qa715>Z3>M7p1xBdzJDH&v zh98s6;~Gg_CQpsWA5E~SiD~szdBj|(#Mh3+$fafO3oU;8Xok{cq{u^G4rDcp$Ik56e2T>Ed9)qfMG%A0udGfCip$z$y8*nO^!VtXy0 zq50i#@3zfB-=pzrPx9|L$%*F-Tnd8wz*n@mP_LR|)4+I#Ur|d^-+x0hdR_`p*4;Fn zbd1;pyX4viOJasn(}Ku?6QX{&MX(<|9qEIKQE$J+wh38b6;n|4%rjx5n*@=AkI6H1 zGuc0)*C%kjSlD_zTZ^*a+{1irpLw&Rx>y}&Wku5eQJ?(YI;Er8a$0E-En)!urMx4W z9q2B*eRDMAQc)?fuPHQ@D};D4z`t&{^U2qabrPB>DZ&OS!B<(ur;Ew-8EF%)&co9% zl^CBdFJTrkm^>31^$tBbA>srvC`|`W^d)CFI*)Q-17~_aR+(x_7uF{eyz-wVv3F`s z6F2i0mCh+0$0ry!<#u@G3yn(pL-7S=lni7s=bsT z+Uu%Cn;>wkvd~hfa*e5ebEtS#sQ8GdB9S6oo}{=LSXNpp z>)Q~zF;(cemS`gFlw{(qYmo20f(okj_e#26?KO@9!m^B%XzSgq*$7+@kViPp z&7otbR10?w)%a3y587{xF5;AxV&Sro2E33 z2f=JbIfLn~nbg~t7K!MlYHs#6q1^m3%Luw+ZBkV3yw-F?&MYXDoGbf*%6jn>y+pi zs$00ox-8tGUUn8o3b&cdF-Pt|dsT+$vj=TO&uQ&VG1Aw1CLjB-ZvQT5ApBmgzWg}; zVhX*jr%fu}qE9ZCP$gT{cbsn9OZnu0Eiy18uo!BntFlLv6j3huF(51xLNv-??!a>!{9s83Y#qQpIO*}j9o9f>zpY|&Jp}g~x zFUKDD#Bshi@yh8wfNKA%$0$nOY~Atqz%v54wGAqVCpckR zoBu3?WWni@;rc!m6=>s0bekz>i!UXw+(i-+UMMpd**Yo|JBR5TOsp3v{6&b$V#IfT z*?_Tb1)g!Jk6?vdnuLU@9&kn!WYzhGXwrUX`Pwx%&9~;tBE~M3OMUd7IE~gAC_zBC zNgypD`RomcIjtjUwR3GzmrKLEoKZ{4Y|giy1NN63cO%w6ZYqxg4tVCuq^%hDH!W&k z1)q25K1mr{W?#y!eDQqGHHeu&j&S2tseK#k3*LtptPo;a^bZoz05b>f*Am=e42w(H zWlnU26{=F7yuHGcaeU;5-xHe-GXdK}xW5>9u|9f7FE<*pVG0Qq^ciN@aNrimBp~-2 z#<=o_>V0ju&jCwYnZ(<}&`xt`E;lo)#mOU|n8XfXCMz$ACfDM}x%)eOm;cygdb464 zZB}f<+~=&~EPJ`KlkoyLTcTR8#YQ_+e;bf9Q^1K5=2Y-_+&u*G^=#u~l`T8D9!*MI zCB#CF?}~sIbsxr~D2XGr5D-hCpPVE7PHz)#72JN4$6w)>>-^r{spHcNEq8rbIU$TP zMXk~+@^O=vG>}zvg%A?#Kg-*)o)(y2Z^tI;@%HYe?Tm(1Y`EvUs@{wB0r0YLA!6$5VP1_lG`2oddgvK=rY1U!3(muwZeDxoO)|{6$s%9Y>(H1s6 zRv|ndDLUU-dsG5yTxzqcu{7k>Ya8jSPIILdVleJ#xukDc&6m4PmL1`v_b068p>zJ< zf)@M-d-mH)lb#ZWw}uT@0lCjMv^dws^%Hb)a?(@hWM3B6cPN%6=t$a#WM7}ni&gC> zFW7vz75n{-d_kbp^Q@)2D1VOEqi8L1ikQ26FX^zNq6f9|I6uIOJ~Jnz zWZR3~M&~OK6KU2fUf(Yl2iR25eA9sDDOg(83F2Fl?3ndK*rsLuJn+A>3SN8DGW$cV zMJ?$AVm`^$vy^v^hwm$|V=26}j`3@^M$8;*os&joiY>bBLND*{+g?Z3(XI0L!8!KE zp7E~HQj^|_@^D6W0TP_nXPl3m)^cG_h{9$phCk#rgt@rt35a_0^XpJ_?r~+HvQ3$9 zvZW3X;%0ODgwyqS3H=aJ9-Y?Q%X&F0#KY=jjD9|Z%QL8duDX|%6x%r>kGHG4E(?7V zzQKF=yN#p`>cPKJ6^SE$e9&-iUADWVJrmLQoMz`Mv>>B~otP;(u+0y|BO{ z@dJ(7q}U-OrN(^eZo2)pri-X|_ZX7!Qq|ffWIvsXPneOg8R|IWwtXL~6(&=)d&eHq zpk^%?b4mxT3YFA5R@hM__V&%bTH-*%fGEaC3b!E$g<`0j|!2G{2O}b=!=0ii@-BL-)GEZW`A-IECUCV zpf8xFpSuy9!u`EaU7i(_T9~$`>zsGxrT*th+q3XD9)_=nrOE~wC2XHjHeqihTr+uS z*qwiMc3(cNs&(?<-k-$UL2#wJ23WI569xFhPz;|VcTBvx?=NJS^qmwKXeqjs;@MvuH4)= zQ8pLG?uVQ{jL$VJWL#0-Qg;VJJYzYQJ=?6-_2KF=At*W&xjh2rO$u%p3T|==Zi!A8 zMl*pdH3kh(wvNvvF-o4<#);9Ls%px7TO z@_g@Vcq?4?i0kO^k>O)o7hIK-*sm+XxP5So$|J7BgbIrCBd(q4wlBSKn5N2m8G?Op z5-Wi8rPz^)^W8iCpGFhO_KRA%u z9<{UN(6d@AHT}AE+6A|ZJ;W|>-ueb_1#&)}F1L!{Hxj)g(jfUUle&tj>2Yhi9vwj2 z#qZcp-{ zotLJ&WxM-(UsX3rYifuN{zYJ!cM^?($=ypzeAle#_;=jhA6_d{|3oY-;6GwcMp#qj z8&RiqvR|txzE%^u_NO?UNS??$&poep+5O%4`--+(d)^1rFjK1>4;A%Dmu&pFerY{( zX;z`XC5rywhJ*LH)8Gj&?SX>fMhN^-slQcMc@U&PFVVehtAjMYRmvFWdwDbixY)li zmp;G&Bu*I$Cv=Zp(;gCux^ThCVPp>=%?Fspk`e=Ce+R*zA=bLf(L$5ANaN-1kYDiR zwQ16EAH^!B00+6eO9`A5@sc&5D%&&EGe-5&#Y7YFsC7GL8xQIp$a<&0QtZpRh%5$ngFD2I-^hO@Od{3{wwRO_Q5{y1Z~M(Baq_`-bi~ZeOYzz z%0#oR!u#}ReY`&Py3Sxl((hdgredq^eOq44ik}yM^k8Zl`u!Hx9)ySQrh2C8lK`*j zdipfiP{I}Kf2>ouUKF`M?b(!?H(2Ei)W_?INuo`rV=G?0jeyU`7y7~VV|BW~R3Ro{ z-p7n9zYk;Gw`KgvjeYUEkFyBJsZZMsd21m96jG-ELpa;fOhf1MABA4HZc3^?O=GGp zcrMP2el{3+Fx|;d(L_Nr73S!J8c%P7lB3QeEaGG$mF@*QNMUQJb7;! ze9!v9?vb)>Ul>CJWliq#UJVviK59Hq(smi4%8?rp@j)td1!Qq1$a+M481LdF!$Y;L zfO9S1!jTUos!{T}15#~O7`)9-!iDP34jLtz6tLtMDL0k5r%nXJnbsW-&!Bc%l`hIF zCkOoCzIfFnIp(<^W?Rc8WkQAg={=GqD-I`JClk+JtY2X_2gL`S=NS2zlhl1u*|EX4 zqW%&Q*0dl+t@Ad(IJvJ@*X&l4x@30kUY@X67+p+_AtMZ26&qLK;pslNeGlyRs5l$P zwp-}lS%8L04_5MoH?+i7;W7;ap z<*HFK?3|oW%N|k=hjOdUbJlIiIj5jL+}H~vDEsO&4$rM>6H{po@wA18mMSZ|58`Q~ zQ=?;3qq7t94IZD=hljIRO?2kQCyH1xPXk<_e(D8EC)F@VX3UbkedE301jbb%*Fm6|%gUwvEA197|CW2n0<7HKbkHaBc#ueGF~#h)2EnAqK4 zsq7?hml%k8xEpa+mGW1Y>8L3mu2-Qc zu4AQggNxv4hYQE*kc6peacZ5qBKl*)k%JTBI zjFiF09bjPdcB?=&0mXcxp#T z)O+lwM#D>LKU!)o3{TCv6cQxo2;rT6=FFBc$LhFiDZS&b;i&d5BtuLKzSK%EHOAr| zlW9>+xrDSLB&Cc4%!csaE?V-W*FAsA)>u7BU`n({6yTSE85o6&73kM-aePKRk=M)799p-axwdVyllF%&1P*iixeoY+p+@adu-;iE2u&5t z7Cf^CblJ)EK351Za`DOWvFeOZv?@$wEJ@M@Ax(1=a0oj3uX|Dc51e7=>he+#O!_^LP)GK!a?+<`Qsbs(h; zswvm!ln~8u;Y}*A(nbnrF$`Qi1jBC@SZFQ1{a9a5a}PlGZX!J}==7rILNhn=NJ^Ch#4T{iZ1=kKLOc&83Oxqt2zi2|Esup6 zi%&pX1IUaiaQ&S#8kfZUr*$sos(ozMQrHY!I8+B0a3?wJHjea6Ph9fM{>Pr1h#=5p z(cbB3rsp}ORAsAYk5-WC;x}jd*TffPGoOM`@4}xV9adVt$nGi=ensoIaxpn zShRPEL1rk9=6kfq2CdR)3VrV)ad?FcGa1put?z03qBCP~D5z0nBfYgDi}WaD27ol2 z&$*nOlFc0-o*#VvBt}hSJ`8u8Vm{#~-VzCO8D4ANAjH*oqIlD;DDYfiG`qc2iMSwa zC01-yQSz9FiM3!*zir)yJUuW*{I$%`v9ai&KJB1BDlyLYC>6j<0d6GIqvg1t^0b5m z65||4_9MM>e)hN$%X3_T!dYzNUG&a9M|x@6y$UDJZj*Sd&A(nq$(Ir zdDWEV{AXa?2UQJT$!VX4Bg+OEZ3fwd<5kTmCfAkcTxv2y)778Gi#beB)k{=HKB<2} zwRn7eW#rZDD--#gSmHIdNH|fyAi2A@Y;b&g9DX{D(&$!Rm4w5EIJQ!mQbz{sX&Axn z@+v&c3W_=NC9Bc!qmyW+i&8i|-9F}l>5s1Ne4M*4`qNfx)yAV6;&cevyV^1DgFkBfD7JqsN*MR2k}kwsXTz5$ zEW`CoxRu)hTqdTLec=_q>(9Pw^lfK8vKb@jCNWeVpZE|FjnKqZI{FYR6mrRwFuL6R zW98jgzUb;+SU*D7IrhELv;Ix{$hK98JvS>o0UhjDincOWZ2AC#g7L&QNjs2ReoYmv z-@w3{?D`Li-;kai6e&91kdXR0hUl%e*EE>3nw`?o^}UrLubshB8o;30ehq?N5i&=m zZhJ;neQtk<_x&b4I}bj9nr&Nyd@^Du*-iOXZvKJAi|N!Q@3=4AzZ9shPt(4cAl|WfNQTz>65XB@+Y{>Ely)j@8FWzs^d!4^pMNYW4Z5@kzJQkoeUmn|#^bYjOj@fbxv{?gvI)<4hhwPigpvSod_ zyy_rS89GY`&9yd3H3BJxiG~X&DMqUGC;C_mL>~5&$`*uR-ko3WM|9l;GNYU%JtL5! zbsy3I`Y9HfF*N!lPs)ztE~$O8z-vC`Y}FIrtT4@h_!(=U>@2>jlhUD_FF!28nH$KP~9~6yX5E}>dU-CxSzvYce&ejN^sFkI? zFv3pX*2LQ03MoKEnlf+;1W-`m;bIc7HG!K;D`7n-Q;qBZ?8pxC4naXHCk+-TlpVmr z24M$4Kp+qR3<5#5fD-m_a}#|5OCxgx0E7h;u+v9a+5@;i99Y1IT^dz_|V&+F7lr zK}$aXe)m2vYR@hl1*t+L)UT`o9}c}O+(lssjn928zRn5~emrzTpnBxy#0x&`Te(>YP+1qBzhMmu$21o{{bbckM`B+)Tv$5xvvG)1l|v zG^MYJF^e`)C$(kYNe(cnL#0LDefQ+^M6Jfjx!5U5pwsSmPFG1+T(KkM6k?U}mObRf zOcfhI$)L{3e<$O-`2Ixu@j}m~lSkOq>jM^YJUrgGZpi zNUxEDYf(dRoBsmr5I2zd|DX%kzp?!nF@TB=diD=2QL=SF{OJ{h+aVqj^xyn2v9+@o zGKSkeq+JUBcOMMF0)8+tus62TfN_8TFbFcK98drR2K%#p=>N+`atI3j%l^}kw6*?X z!@v0nc%ZKW7EsAb+0x`eB@K9>#D8!E4ElEL~n5+wiryagy{Yo)J< zu-5=0Rog%%gp0mtjAnmW0H}blvvRQ2N7wv0Sr4a@u z@P|ry*Z>NK0AO4YEufgKm4h`>{;h}v6>e!~{jh|-Gf+qoSs))x^brbTfPG@0Wt*u@Lz)RhZOwX|Bo>KNAiq3!C&)0 zKqV7C zA%g^fwEhR0KhOEkgFj&P@Ki$X|1TWvu>K1?tbe12obWIB9vJc7#K2Ai@aL8f=HJo( z6Py3NhY%e3RI)Ncp2-NAojg^)6R zhRhu&n4KL0;bZ}E(1SqqZ~lRglP$s!3;Do?Vj)-j`vO2YIM_GozxM@$ z|Bv;+(Er{842AypTu$hJodwJVK~~0po&^HtK(g$A`5^y{&E6J{d{NmxkXg~h1%ZSV zs9KCCShr41pxo`8UsoQ12h1 0) { var textScale = textDiv.dataset.canvasWidth / width; - + var rotation = textDiv.dataset.angle; var transform = 'scale(' + textScale + ', 1)'; if (bidiTexts[i].dir === 'ttb') { - transform = 'rotate(90deg) ' + transform; + rotation += 90; } + transform = 'rotate(' + rotation + 'deg) ' + transform; CustomStyle.setProp('transform' , textDiv, transform); CustomStyle.setProp('transformOrigin' , textDiv, '0% 0%'); @@ -125,13 +126,14 @@ var TextLayerBuilder = function textLayerBuilder(options) { // vScale and hScale already contain the scaling to pixel units var fontHeight = geom.fontSize * Math.abs(geom.vScale); - textDiv.dataset.canvasWidth = geom.canvasWidth * geom.hScale; + textDiv.dataset.canvasWidth = geom.canvasWidth * Math.abs(geom.hScale); textDiv.dataset.fontName = geom.fontName; + textDiv.dataset.angle = geom.angle * (180 / Math.PI); textDiv.style.fontSize = fontHeight + 'px'; textDiv.style.fontFamily = geom.fontFamily; - textDiv.style.left = geom.x + 'px'; - textDiv.style.top = (geom.y - fontHeight) + 'px'; + textDiv.style.left = (geom.x + (fontHeight * Math.sin(geom.angle))) + 'px'; + textDiv.style.top = (geom.y - (fontHeight * Math.cos(geom.angle))) + 'px'; // The content of the div is set in the `setTextContent` function.