From e53fe3ec244833437fb35674258b983f9dcefa2d Mon Sep 17 00:00:00 2001 From: Jeff Muizelaar Date: Tue, 16 Sep 2008 01:45:10 +0100 Subject: [PATCH] [test] Add a test case for drawing glyphs with different metrics. The ability to draw glyphs with different metrics is useful when doing font substitution with fixed layout like in pdf and I eventually plan on adding code to poppler to do something similar. --- test/.gitignore | 1 + test/Makefile.am | 2 + test/user-font-rescale-ref.png | Bin 0 -> 15679 bytes test/user-font-rescale.c | 329 +++++++++++++++++++++++++++++++++ 4 files changed, 332 insertions(+) create mode 100644 test/user-font-rescale-ref.png create mode 100644 test/user-font-rescale.c diff --git a/test/.gitignore b/test/.gitignore index 374bbf55d..a66739ec2 100644 --- a/test/.gitignore +++ b/test/.gitignore @@ -222,6 +222,7 @@ unbounded-operator user-data user-font user-font-proxy +user-font-rescale xlib-expose-event xlib-surface xlib-surface-source diff --git a/test/Makefile.am b/test/Makefile.am index 2a273100e..57aa781bf 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -174,6 +174,7 @@ unbounded-operator$(EXEEXT) \ user-data$(EXEEXT) \ user-font$(EXEEXT) \ user-font-proxy$(EXEEXT) \ +user-font-rescale$(EXEEXT) \ zero-alpha$(EXEEXT) # XXX: Here are some existing tests that are currently disabled for @@ -740,6 +741,7 @@ REFERENCE_IMAGES = \ user-font-proxy-pdf-ref.png \ user-font-proxy-ps-ref.png \ user-font-proxy-svg-ref.png \ + user-font-rescale-ref.png \ unbounded-operator-quartz-ref.png \ unbounded-operator-quartz-rgb24-ref.png \ xlib-expose-event-ref.png \ diff --git a/test/user-font-rescale-ref.png b/test/user-font-rescale-ref.png new file mode 100644 index 0000000000000000000000000000000000000000..39bce60e83aaa52f271899259526850ce26de78c GIT binary patch literal 15679 zcmdseWmHvP^zEfCNQxj`lF~>@gLHQ{(%s!CAtl`*jg)kkbf^Lt<4*Z1N7 zACBQ+T=DF6_FikQIpo_YBjX@b%SA;a>FSBVX1K4fkBxI4I$~iX4i^~t8di!-RZ{Z9 zlvF|ScS^Nh?Yi%K-!$fQNOr38QakC z@LxS5QYa$gV|N2XZW++n7dZY{*5zUP>boZ@06`}P~N44Iy7u>t7xf!p7HQh#`%ydu$E zlW#0odyap4UidscT%9mM!5;cbX+l+q63xub$B{(x`eaM{udf?T*5l*ie%LN?GHCvQ zSXx>_Ai-TP$N#)T?Os0nA>$S@vAT+0H2ngi+2Y3dy|nbNE_sMi${k8{T;`j|$Vkcl zo0}U)h8N)O4=)Hu@PoR4e~p%-Rw0u4$%5+apSwWC%gr6`yfxN!;O6b)cDf;z?QA}t z6;)?FciT3*zD`!5*AfyPjSg{d<=gkHU@^K^6Ah#lInNkKu;=ypJ0x7HpN z8;kj#2t7rXI=`@x9PFH!nAlrpW(g%FCDq+;2*NKXmX{;@`ozyKFO8j?UWw;nYH4Y` zWn}E#{Z$$pAD?%-^!vAwZi^cl#NqDJcIWKhKeHHo8VKKUC!C~|)TAy`X!o1)a5EDV z!Lqqo!H|S_+-^$C;GBY!`kB<6#df=DsxRg~?VzaYjKBM5~e*cba zR`Xbj?=^@8DJ(2>xH&bgt*tdQF@Xocr>3TA*4yB#mun+L^yYfs!0gH-GwJ=j*qeLD z!$Y^?zB5&zS!eYc+-`DmGBBOX9u|_spq0DRM91y?FS3@e%Ja+&#Dw@TdVT$#Nw*OK z0Z-WlhrvhYTQrLcFDxV@gJNZE{f>nN(y|h*Rb%$8tPFK;wp_%{&Q8)4T8v@P+BYgt)X0@Bh5z`x!4aDn;*$#H+&jp4B#hshSS+UIiK5|BCuf^ZAS|=<|lt5 zm~->;M6A4bc6Q#-U$?gl%*@Wh9uw^&{25B5pW^4TnFm|tZctoY+*y?E_XVV!cgFKG zXJwIO2>O#K@SVVO+Aijov@#{5gkq5P^+w?G3p8k#KWEdgQjL@KU<_k$WPX+3Gz5*v zMQXZarKNxV{EYGj33hR5sbKuyc=nOAoxXn7xcT(-v-M*w>K{U#@}u&C*2r=omO>!nzpje z8pW-w=x~^HkpdE;-cVGs}yK(2%gZ+>uhZ|L_7 zKP5^8)zx};*aG%HK>*AA80@A4PbMB7o{+gY4X7I*D1^MbyBi{z1aL-7U!Mfj1X!7> z;K<>iVH*VUQv0wq@;x8%GTPtdt%}%(^YvzMH1@20-59>0$Jgg z&!xNb6gY+p4}*wK)Cr0-HX|dFN+yYnmzU73Melp?@aE503JF6NydRE#`*JqHLc`L*yFICd zt>O(3NnDkzynNqSCa;o~*3MrySDs7@OUu}V1g_7YKhM`%VkI%^6z=}3Svt7B-K$j6 z(LpJi4rlJTf7S7DV6RqL@S1;f2c*xv6#MJcn#hk%asv2RGIPJh&%#|q^R45;SV$BY} zHl{1J!}NBS9pz5v#5L>GsIfE-l*-oAFEP0N7VLkj`bpx=0_BTTSj`@v84a&HlfLKX z>+JUsknY61Zj!VwB*evi7N=z=+^?|Sy-OLw+@y%%3pzh{c|u?%;ExO|Mion#%$1Uo zx_zxIQK8>PM{K{^s>NX_zR`t9ny_J1r(HmlQ1x$8f)tI1Rjy~Nm|^<%VvhqsK{Tk# z@K|v+S4WWOJb`9?;gH1d`gcGV3xHD5u!4)2Z4!iHlEB=?=WQJglnE^U{ylEdT2C)i z!dsbDK!BxLC0L|e&(Nwn6zccX;zW1U*Y59D-&nPn+q|EI5|~s#2$xEmHy47;F-Kwc@UprdziQ3EWy-dz=?^j z_?Lz$CM}i}A^_1o5WS+d_Ltn;+~QC7)}}5ls>pOw za&l+{lSrN2Xf*BoCy)dWIg|j*HQTZ35)2~y zv=NO!W;=-_uA~&J8VXWdy32F*dDToMdVbzjwoTDF_bWoBb5@;25t}iD0ZPLP4?hGtrktnL~UKn zsx*JtuRYU*KT`!V&kc_tZF(mmh+ID7ec*HKqiGzmYUJ<<$g0-jB%4U@NQ4EoXA@qX zaMPI*@4WT)@W4B2yUMC1Ndyr9Kzt)8Xy6nP{>9e90tql9%oPQDPr6E6`Ic$8ayT4* z1MDAu4_=mqfJ{>DFE^>&GR-VdeNFM@jQuY$&fwPUHNt_D372(pmS(BCdRuA~cJ(rc0# zv|s~Z-?iWF($hZ74#v}boDE2LvyzvWm$u8x!jf})CrXZ)omVXjK1oSSL)P&O$B&MS zkFNqt1=Qpy>efF_=w#)}XupIz}xL9ZH8{}I%q;8$9HpHZe?ZYlf>FeHs>6Bo@;@`rB z6Cw5m)|n^s-2x|&Cc(-2UQz_TS65eek%c1Vq3R4c5!l;*-C8)r+P3;p~TDBH6I zWC(-p2VD3!`$#{5D7Bnr12QsaPd?U$3Ug8?3*2%@%BEpSZTcM@fC*()TgsGCvy#zf zU8dzmM~d|u&~=)ZH3k7r7CbT(;?ATk^b;lzQj)=A5rj76hRcvHFCr3bSD|Fe-~RM?7XUW_I`m%qzvRS3 zDqHiN!^1uW!3WAwh>VPkh`b}dtXp|`xpIP&yu7?-`1}R6rl8UJn=;>&Kd92fk~ldg z{l@278XCCm_op&)nT2_I-R9}N>+3m%n0_FlnPT(Nv;qQt94r1>Wj#H{rUF3g4&N=R z{c(7I3>bn`ls6DhervjMNR)q^0qtzVc3l7rKqM3$K@I2Q$B!gWTOoai?>gAj zLc0Tj9vR)!?V3=@f{f<(xVZy7?5LRqI>6^_lnXOqIbN+)UCM57Y)qbr&qI+z>Kbg3 z!{xr#%3-N!s_dU7`wq1SUHYh~D8SBCAI8jTejoqto_Z=REpD78ae)l&Oh| z(|)zA+4KF3mjx9E$Lk<6$;0{CS#_{51ps3}82~4>u(lQf*nYU$h7uqi=6!W|u`~hb z5*63Pa~sgq#B*v&xb|+-AOjebHfpx<@1L|i{?5UHn6))M0}jg6)YR961WGCcd$6d6 zf$wwW#4My}nklt|6P_Z`2Jl-_LR(v3{|8`#n7ccdlao_^s)f9K^x6h?k$h$l8InL{ z{Fe|u7%O+CWSQ@w#pg9OHL-DVLEyi!b8-SOhJsAXBl+EGCZiS8+R7K>1>n=z#s(D* z4h}@$UG=fw0m#z){QR8n-=zt1Zd>eG7ChrKGo!5MD!S|%WZ0I0y4hc>qqo3rbT@!l zKo4DbKvlv;^umI(f3^v1C7wBJopo|d7iyh78Y-$}YWly?^w85&ryXAY3t}v8BQboN z)mD6PGI+$qpMP2P0?n{~($>fUU0wrS_>;-Qz<@NGRFLUm z&4T@>ABB*Ze#llR-NwP#3>{B6L)cMDzx=d0!ciWpEp< z&?h~oZnF!m+tDiHsEwDG7p&c#;;=)F=`apEkj9mj7yyah1C@bJ%mZJuu>Vd6_*LD} z#JtCI9giG6Y2Wi2_?}77`PEe(pf~bGSkE&2sp z;`crVOuYNI18^rqSqaENrv`*PM#7A!ZK^Gt7A5iG1=YL+B?SfCQoU_=ARMB@?YU)! zfbXJ&8w6qNV5LPPncZJ|BJY_a&rWA?SmUgE?J+*nNuWi8dW|PHk~FJLUR)ln#Q^by z7-IX>>o1Pw#pHI1iFpt51{?hNNWzA?ZSByj_;M^y+?uyXor(B|@mR2~(eKo7}p-T%E zJVhm?K(18}5f$+q$;lS5BStUJQ8CeAPV^#zgM&eHWg&=)BV+)rdwO8ntma!~rNW{z znf`O-dwO~*>FFRP0>YEq(144Dg~gI8J1{bmuxiN_FV(a49++(ah5oObM$XNxy;)p)i$?g8Vvh-{5l~^6RL1fO3Ue7lbgS6d*zi6WYqC_B*&nT}tR^Ve1A*=7 zwtQK&^F{%)W`QV{D7OoEleK+d*IlAm)XXkl(9BCj{rU5!(Vh@9RqFOopNbRRBgE*? zviALVc;QZZqeU6S+n z7ZkYNrm)1YR#uKH+}2PYkSBz+sWCWj?Ri^?wry zg(x!p27WN#pVN0&)HW>mAx3!Oa75?NHaZJ|VesJp$SX^K3q*E%{y<0rmxUjVk_HY1 zx35Jsa-cw_^ZGsU)&}JD>l4NpK^~rf@E1H;To{rHG4`GTsT3`S%k5~g@>7nv14)yJ zoGEOP(dg^l7=sqDLT;SLp@KaPvXLWA&O!#H#LPNLjnYroj_b3GJbs(64F}^IaS%I4 zV)aw6ixt$nSB4h5a!_>H-fBa(h=&=6(6KwBInyy#$Y{#eKSi)E~8R<%Drq zHrTYEl4n0IQ~3O9x?^uPcG3hd#K;&?VsMPChYZkz>!e^KynlY5!25)so4Nj@`?!X9 zA>rI_N>=;CxxbXRq(7FI#>c?qG~#KtzCU)g;ap$jSpO$yXc1N~k)IDR1eoicLx}-{ z`Q@_2#GRYNsv+SoSgEzNu*cebxD#o#FD8aY(}jHb_14VtT>BSlN+L_uVZ_89{jF;z z3Fw7%q*{joYqnX&({Cy)45%@uoiLuJHnfQ(zqeb-J)l!l>r7${m>mB>w>qwbmK?D$ zy)4VLUqVZ#V)O>VjnUw+L%@yK;V;w{WqS`!T%ttYjE%qYk8w^l>+u;fF2CuH8(dwT zkO~&dd!+Y7s*hq30T+9DTi+a7O3?rKX394wpSDLu&5S_|ca#msGA0fu*D%=GCmfC5 zh)qND>eLRIhm+wD5VF>?1)06=XDg_*I5?E_pwMlt{319MoQbR7Jv^uwDtC7Fh-KaJ1C1 zHfNC~h(W|pH~#0>(A1>xMMW{h?SMQOht_M@$pi0tn_~S?Z+yJJFJMgm`xXkbsJ@-O zxcGK^TU%CkO!Sm5vo1v6EBuhz&U|nTeZ{b_NX6TMCvZfTwYe*DG?rq9I#Qfj((B8-8*9P3quga+>Mv_faSZ9ZwO(*c3Q_Sd5`VgmAytMih=K95kR06*VP;gMfa z&HUP1rTh#7cz{9tHHkVKt5}4TM>IWN%*m-ZP@BP}oRG_6V`dKVe(edyzEyZgH|o}_ z38o-_LceI=M%m-xVJ57wa3=47ygU@Auqe=d4Z+K6`w0rCs4acv*di4kmbXf;G0@n4 z9%sL$K~0TEn0HDy{C&>mch8Gm9~_jyek-cYQtA#-&uD2c@4$|Ss4)adfz3@y(w59f zJ%2%bvW6uM?x?82zA58xS|;-7iG#n%;ASR;p%vc($JQE{f5c4(WmOZA(%^>$lf;Lc zxi>XYCf9Q+-;?_9FU(Sy8V4Qn^2t7N5tN`KAehYCtx`7aIj+s9vc{pIsU}}uc82pF zF2^D&Zf zv-cCh_v(~{pN?=?tHz?HeTx4r(nk4vXYsKOtQXd^19l76bFhRXi`wIB2zjN$9sB5{ zNy!q?Bvf$wEBb9WJ2bo9zB{3nm9iDR}K}PWa3tPbxI7J#g#$`Mev>q8p z%<>vKYyX|wz#t*cr+3lferLzenrb1Ws{G2Y>DOT?yEOQyq5vPYbGDpPhhMWcERrBc zpcu=s$)r0isnGXplX*<@zT5uSxk_U6wAavXi|2*v#`Rh@Tz9J8aaa6I7oByzA_S(V ztLtf4ef}p{yn7>7&x%0~&fBcNZqsE*VarrFXp4&*@_gQ$_~QOHigqEM_jqTrV4o+M>Jg7_K!#Fk3sLauz_%D?Tn8UzQL{efJt9bJgW?#*o)W(`T(3ae02JtAU5gNv4Ccn^i6sATS$ zk4DnOSh3t}ba5dNqV4Bd0427R@QS@dF5^?A3WMYrI9h1z&DrM1cdV-6laf(rIb-D1 zJo4C}Bw`Yg)zKn8=Pu9q5z5@tYEl9BY{gE?%+vF{h{leK*7RijASu{)-|b2GL)U~( z(vX(O3ox}z`T@oJExWSgN`T`0&_Z`8csG~trYMCZE~UgtQivtdAcxQ|D)TQ5~#m{d1F8asI4~_7_Yl{)wK0+}-JI&&TqkRew+^u!dAiwPy@r)j z{W<1y-q40;HIUdcCfudTZrsjMXxPZ3kHYiv49MBmc|kiD4yt8QkZT*F3?DccqaJ%w z_d12vU1cX-_c030yLrE;Q^x)mCu$)c8WhqW{rOVIKWf`tkYbaQPd4gmU+b2Qpv1XM zSL)lESCoZ_@V;z7eR1cE>dku+3dsnuC4nEJKGD)z5fmp5KNj9X_WGhG{EE!hYgZLS zF|_E+X@)L0Fc`NigctM~lh(Jaxh3d9(Zvqe)zwDROihrru-1(+!5loO*|>MzmXb(` zztWmpu@_x2L=G}pAi8s@5^*RC56YSD^`|LY zd}NJ^fj*}(B4xfn-I-XrL5l%aDlyJK-|Cwre`s!KB_#=e(!WBG453$tXjCewmG7@KLT#Wcn#P z1&2P3L5rLQ@?!xu#!93lR6W7FG2zDY;ajBF`IvL6BvAgca*2s<=H?!KvL%$k2%%vV zw}vUQf#&oeX|)awZS5>1JL;S^vxW^Xws$5uyHTlmsR|05?B;I0xMP@v*oGCSb)fNj z2HE?MI8hpWFU02F#bVWWVe1)b^XQ9x_VM{0bUF6&g*2CJj%&E$?zh*b+c)Jpf#xsW z4+oHSWNDL%DR-T*x$+g{ESCtkqMYRDQgoDt&0GU?U55fF?az}6sz>YUq3Rh!2RO00 zW&PzkPOvXH5@;cCn6hrGVKtKJXxES4+{hYxt1?uhqk-9QV9g z^3q+#;ob<-hO(8zR58iHbuux{-QMM@w~Z!2(a_ z%rODs&hNrP<(vqziN(&*^v)PT<*|`M>Mssw=wUyW0-qiXhPvM(xu7{(ivkAo_5|(C zuU~=Aav|Cn9s!p0(1j zrmU}caucRhfgw;_k)I*Y3OFRYjuVgXocKjT!K7q%xK;oUuVp4HZ+eA!!?b(0pY$qr zo)Srq*kabd(Y)qn-BatK4Ebhr1JXL+w{1LR=W_M0`PL1{OGzXDa<`DIQ1KJ6?Vkub zz0en@KtL@SJnV#N+VAa6FjHjQy&8J$8TCHJCOv&KphheL^xc5R=IHRqAN>@)z3lP3 zhnGGNGa+a*Ut0%95%j&I^kGcu;)0Hok#y+!`GKoAS=A*JrN`|(Fii2e(44=v+7RY= zBc44NTOx31pGkVeZ2e~I;$6@rwNmz9EQPOeRyLHI?$<02mPV80X^gtmm!>Y*RE>{MzO1=16_(zWW&^kRKAjx!_sjRkvk*{$W8nccZG`B4kIw4T67!t3Tl$ zAihX`|Iy@s)XBWi81oeCJ9-_tH<{BKVWvcUT*k4qQi~FEtJfu`lHh?x@ zksrI#?%TyB9jby+ZnG?j{7#W2nI*OF- z8A5K7cm=4*M=f2{`(2GiiDPOkDmjdQ1rst!YXaIws)vFX4Ua`?ZqiAN@eL;UsJ{tE5KxN8zqb{s*u-?)MAeUIdgYjt8j<&t zA$j$MTJ;|kDou9=?2}8&6--+BwO{t$2EsTME!xZ|v9b=7W9~T|8KR<3F}V5YGMPI% z9?!v1@qknncWykV{_=`MElVQXca(}_^vrc<&WC9X)GkIqY3yY+( zOigbwkRRUsTac4EOSpNuk0HW4Z&};HHC{JYKY3^uJqsVyr}Y`p30lj05j< zhK~C6erlSQoGZ>WO){0X`B0zQPNqkk0w48A1Lm`|ot;gBR{qAu2x_u*F+f&!0;wI^ z_(f|f+HkYj6HSyUnIs79jFA0m7^hWD=8mOjW#K{@@bksjLz=IY(SidbW3SST`To0c zNbpyDAf+!Zs_7lOU>~N=3Z^g0I7;mrtgndB zkrQ4u(HlccgaNX5H^N&<$;fZZm6K~2- z==s-D!WJ50UNN}1tC&=biYxUE4r0I1SN@>Gf9}yFq)lK89P=eHVHiE$W!u*gxWhWG zuehgiu>Akjmwz$>CWP6m{}t}hAJ+FskF(Rp75CGVLb=W~4k0g|rq7Vh5rJ^;Bo6Csg~5&|UKUQA z?9*k1AN%IevPZn|s&_e+G0`Z<0W{f>_MYHWU%iNqGo|b?d=Y^9JYq`$5+znqyqlV) zzmfpFXL zhnB#9X16WgxG5R%@PXttPEOliGRd$D3sseQU|I+}Y-UE(H6tzeqBny``=eeBwTITv zlC9+?$`;LuIYf5OsgwJg&Rj8<!tQ0oH;^Le=d=A;2+)2_0%%m>WG0_AU_vvhcQjI%}btc^7QLgis@LgxT z>1f+K-})L&QNWa=6XXklI{opa1h!G(<;qISc|bG?g5RCaMKnPa&+gzci&!-nkM!eW z{g8P%f^T>QnyK{f8Rvt=c>>u<3;R`Bw5NClFu}?{Ub7&Hvo#Lq|H$U*MHN2Vo`3`k zhABHsR7~#M@JR}{JpaI#(`snkWu2|KpSQN{QP0{te7)?*}9# zfC8a1zk{^66t3QWuH#*B&mP^WG2jJHAOk%>1w@@ef!K1A8XCUWs%bGVZt1`;Fiy}Zng_hO5Xi%*c0 z7{P9Z9PWCEUKPWCdxbO@v$~6cK2IrNpyyLrqxtxy;Lj^uy&bn{@M14ske>Ei>=)4a z5C6&S+L(_`T!vyqWZ6 zT{BY1KC%kP`};rf9!D5J3JP}Tkc+ZBJ-ueB*#+)oIg>0cX9AN9@!3;$jt~!*-*iu}Rr*CuDmATw&la=!(--@C;74~uLL`NM%_wRm zGh^u2OHQg>x*vXZdc9<=jx#7g8=hb)f#|Ryxj(nc%NrOYm^7RiEBr8N{H=Xv72W57 zW0dowu<|QU3MT!0P8AJ_nx8^%m(~{R9>>$ua+{-LRMvEW?Vx2&^Y8)|U&E1_AW|fB zK-0`DE}AuchsSvRcN8I@mbYuc1W}K8kzdvB=_@@RJIc{Ko_u-qtKsLH*lPDO-@kD$ zjznGW#kHjVmfw;N|FLG$!so`x^=kNHui60_C2-C_!(A8+BOc}F+JM**$U3gIfj(B6 zP)_slR0{tihp$GKR=MbBy||r^54)~%8(v=1tMcQVG>9I%w7X?P3z8bitrrqf_J27lmZoX)f|P5x}r1zx*`#LjOETPk}+bMyV7I=f81^foV!A14HOUx$;@ z_gZjO!{3)K{|Ia)9&+>Ac{K=|Q{U{vjkb9Ij$4XtDU<}3#9OvK$-+e;Gxy1$5yE$! z)4U~o^jQ445&94rJ%t3DGt_$f-98l7LiBdO#)YBz$4sNMgurU;;FH&A26w)Txi;nY zJRU7HfM5cJ*@HkPAjmb#Utj--fFN!T#+;R(Uv zd9^bQEoU7^dL$}cwv(;YU^H=puhgg}EM+Mo$=A7na`m)WF)V)5wOQ(Mp6VLkC@P^E zI>s6T{w7Be{p67m_$==+cW%SMS5M=N+9R3t;}+gtuo&bCH8PBQna*3vOP6*z~ol zA@3t&o#3A5xzY+XWib-uSOBC*gll)*yC3$OE<7G4L^r-<4!BM4*!p24vR=1fkz=DE zomVXSas%=vFE;3BP?cleQ}bIy2I+-sk&?UwyeRB#>ObR#eIjf9zYOW-IMpjq{o3Du zaOK&I&3sjWvOYyMe$nI&vl%9x!FVll({}34mU!+$P#*e$yn)#?Cm2WUH9D|4FM9<| zg%*26T@Gn;K}0ab(qg-E>NrjNA3slxHamQKI-8pQ*l}r~MLX_hZT$-|fXjX;^-~hV zHzz2CB7ek}w^sOHDcayL2Odg^h`bOz!+StL9Mdt?A0wkCw_hp7Tw=j1bZM2hZy#wq(aX1dE?&Qwv?}QQ;=Hweckc3~PrJ>_tXv%JhMUn) z>$xHElcCoN!Q32Ta0~&rNlEwf+Vvx}n@9F$NZV{4F`?}->0PSPerO>Rgb5vJ<$JSA z$K4Axwf~CPSvd)#Itd8|ae_?JR`Jo8@qwVDml^;k_S2~yIL^RLabpuzRqnq)4S zSfyI73>Uu3|1_xM_syK&=T7IKLbdmF+S0^vpYF%AwB(s|C!VqiC_@e$vR3}sh0_kSXf==QA1l;4BcN>dp@j5*svt3EGw?~ z4f%d-u$Rz|ThA|yBNO}kjuU5ooavPm@dc%zfxu;QmV#(gR$?;l-H%IAve>2MYMa%P zt`EZOFRA0r?-VJB@WY^*FZovVz{u3)5F>4%*&tK0my2_)BD5BMach&%@MsRoUm%qDU?7)F_FY--eebTJXPhldYrj^GtSh#!!`xWGe z+o4p4w@Sd;*KbOEqxdSizJ9)0KuiQ)kwndZ<`=?Y=_8WH(TcNN!wm__t^Lb+`KB)Cy(wP%mvA z)D3U^ZP4^$CB1}JIvFq8y0T1G;PE%&0SOMjDZnZEwOg+Xi}jtId3bhOt*Q@h{O)ew zulj*4c71YOL0Yljrq!r8hUB*SWk0dF43&RhmKi^t5Ac4h{^FG0O^G8?KMmc+Ds&M2g2n;Gz5N z;c(3C+kD^Zfp5}jzy8T~^sm`O>5qb7c1dRpY_H6m0^?Y4Dlkdzv0 zP}L?6K)&}&35lJvV8jwzY%nCGXWjHOv5gA~H`v^^;yh97Y<_&8Jv8TyAEla9Nd3Jb zMK>oecroSL3G&W2YmxQqwY2cjT$tzdr0^+x@o4FRT69u7#wRAFY6XE8t!L=3olHde zUtE$t6+cR+-<$;|>&HpVgGGao5sTspzR!oDL9OOjBYtgeCK#yD$AXJ^m92G;b6zXvdH+0yxkRdr?I zih>bES{}=^I>-IxPo10I!cN|)NpEiM3Y&TjJ)ZPiuC(U`->#cy-(`HlZbF5~OTyUf(U|SK53lOHE{LxQ0`afX`Pd(cSC26GO)wPsdo_a+ zunCrX&-lxwm+h>ua3Z#D*ZWC_gA>=D1Uy8Y*@rGjpM+W22m%Ekq?T3))6x}F^@am2$_HHAPL>i26^6r7t5JiawN zsj{^kcGT^&EV2KMD`8QmrgrMsD=7yY+AY=tN)NS~W%xo;UUohbN@&|-EBVLKjq|}^ z`K!cvFzC0>78V}b^FY}D>v}IJHEV?V1=-^}_(n8DN=#m~ J;)7w({{c83s3HIW literal 0 HcmV?d00001 diff --git a/test/user-font-rescale.c b/test/user-font-rescale.c new file mode 100644 index 000000000..a65d7e5aa --- /dev/null +++ b/test/user-font-rescale.c @@ -0,0 +1,329 @@ +/* + * Copyright © 2008 Jeff Muizelaar + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Jeff Muizelaar not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Jeff Muizelaar makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * JEFF MUIZELAAR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL JEFF MUIZELAAR BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Contributor(s): + * Jeff Muizelaar + * Kristian Høgsberg + * Behdad Esfahbod + */ + +#include +#include +#define __USE_ISOC99 +#include + +#include "cairo-test.h" + +#define BORDER 10 +#define TEXT_SIZE 32 +#define WIDTH (TEXT_SIZE * 13.75 + 2*BORDER) +#define HEIGHT ((TEXT_SIZE + 2*BORDER)*3 + BORDER) +#define TEXT "test of rescaled glyphs"; + +static cairo_test_draw_function_t draw; + +static const cairo_test_t test = { + "user-font-rescale", + "Tests drawing text with user defined widths", + WIDTH, HEIGHT, + draw +}; + +static const cairo_user_data_key_t rescale_font_closure_key; + +struct rescaled_font { + cairo_font_face_t *substitute_font; + cairo_scaled_font_t *measuring_font; + unsigned long glyph_count; + unsigned long start; + double *desired_width; + double *rescale_factor; +}; + +static cairo_status_t +test_scaled_font_render_glyph (cairo_scaled_font_t *scaled_font, + unsigned long glyph, + cairo_t *cr, + cairo_text_extents_t *metrics) +{ + cairo_font_face_t *user_font = cairo_scaled_font_get_font_face (scaled_font); + struct rescaled_font *r = cairo_font_face_get_user_data (user_font, &rescale_font_closure_key); + cairo_glyph_t cairo_glyph; + + cairo_glyph.index = glyph; + cairo_glyph.x = 0; + cairo_glyph.y = 0; + + cairo_set_font_face (cr, r->substitute_font); + + if (glyph - r->start < r->glyph_count) { + cairo_matrix_t matrix; + + if (isnan (r->rescale_factor[glyph - r->start])) { + double desired_width; + double actual_width; + cairo_text_extents_t extents; + + /* measure the glyph and compute the necessary rescaling factor */ + cairo_scaled_font_glyph_extents (r->measuring_font, &cairo_glyph, 1, &extents); + + desired_width = r->desired_width[glyph - r->start]; + actual_width = extents.x_advance; + + r->rescale_factor[glyph - r->start] = desired_width / actual_width; + } + + /* scale the font so that the glyph width matches the desired width */ + cairo_get_font_matrix (cr, &matrix); + cairo_matrix_scale (&matrix, r->rescale_factor[glyph - r->start], 1.); + cairo_set_font_matrix (cr, &matrix); + } + + cairo_show_glyphs (cr, &cairo_glyph, 1); + cairo_glyph_extents (cr, &cairo_glyph, 1, metrics); + + return CAIRO_STATUS_SUCCESS; +} + +/* UNICHAR_TO_UTF8 from Behdad + * http://mces.blogspot.com/2004/07/static-unicode-to-utf-8-converter.html */ +#define UNICHAR_TO_UTF8(Char) \ + (const char []) \ + { \ + /* first octet */ \ + (Char) < 0x00000080 ? (Char) : \ + (Char) < 0x00000800 ? ((Char) >> 6) | 0xC0 : \ + (Char) < 0x00010000 ? ((Char) >> 12) | 0xE0 : \ + (Char) < 0x00200000 ? ((Char) >> 18) | 0xF0 : \ + (Char) < 0x04000000 ? ((Char) >> 24) | 0xF8 : \ + ((Char) >> 30) | 0xFC, \ + /* second octet */ \ + (Char) < 0x00000080 ? 0 /* null-terminator */ : \ + (Char) < 0x00000800 ? ((Char) & 0x3F) | 0x80 : \ + (Char) < 0x00010000 ? (((Char) >> 6) & 0x3F) | 0x80 : \ + (Char) < 0x00200000 ? (((Char) >> 12) & 0x3F) | 0x80 : \ + (Char) < 0x04000000 ? (((Char) >> 18) & 0x3F) | 0x80 : \ + (((Char) >> 24) & 0x3F) | 0x80, \ + /* third octet */ \ + (Char) < 0x00000800 ? 0 /* null-terminator */ : \ + (Char) < 0x00010000 ? ((Char) & 0x3F) | 0x80 : \ + (Char) < 0x00200000 ? (((Char) >> 6) & 0x3F) | 0x80 : \ + (Char) < 0x04000000 ? (((Char) >> 12) & 0x3F) | 0x80 : \ + (((Char) >> 18) & 0x3F) | 0x80, \ + /* fourth octet */ \ + (Char) < 0x00010000 ? 0 /* null-terminator */ : \ + (Char) < 0x00200000 ? ((Char) & 0x3F) | 0x80 : \ + (Char) < 0x04000000 ? (((Char) >> 6) & 0x3F) | 0x80 : \ + (((Char) >> 12) & 0x3F) | 0x80, \ + /* fifth octet */ \ + (Char) < 0x00200000 ? 0 /* null-terminator */ : \ + (Char) < 0x04000000 ? ((Char) & 0x3F) | 0x80 : \ + (((Char) >> 6) & 0x3F) | 0x80, \ + /* sixth octet */ \ + (Char) < 0x04000000 ? 0 /* null-terminator */ : \ + ((Char) & 0x3F) | 0x80, \ + 0 /* null-terminator */ \ + } + + +static cairo_status_t +test_scaled_font_unicode_to_glyph (cairo_scaled_font_t *scaled_font, + unsigned long unicode, + unsigned long *glyph_index) { + cairo_font_face_t *user_font = cairo_scaled_font_get_font_face (scaled_font); + struct rescaled_font *r = cairo_font_face_get_user_data (user_font, &rescale_font_closure_key); + int num_glyphs; + cairo_glyph_t *glyphs = NULL; + + cairo_status_t status = cairo_scaled_font_text_to_glyphs (r->measuring_font, 0, 0, + UNICHAR_TO_UTF8(unicode), -1, + &glyphs, &num_glyphs, + NULL, NULL, + NULL); + if (status) + return status; + + *glyph_index = glyphs[0].index; + + cairo_glyph_free (glyphs); + return CAIRO_STATUS_SUCCESS; +} + +static void rescale_font_closure_destroy (void *data) { + struct rescaled_font *r = data; + cairo_scaled_font_destroy (r->measuring_font); + free (r->desired_width); + free (r->rescale_factor); + free (r); +} + +static cairo_font_face_t * +create_rescaled_font (cairo_font_face_t *substitute_font, int glyph_start, int glyph_count, double *desired_width) +{ + cairo_font_face_t *user_font_face = NULL; + struct rescaled_font *r = xmalloc (sizeof(struct rescaled_font)); + cairo_font_options_t *options = cairo_font_options_create (); + cairo_matrix_t m; + unsigned long i; + + user_font_face = cairo_user_font_face_create (); + cairo_user_font_face_set_render_glyph_func (user_font_face, test_scaled_font_render_glyph); + cairo_user_font_face_set_unicode_to_glyph_func (user_font_face, test_scaled_font_unicode_to_glyph); + + r->substitute_font = substitute_font; + + /* we don't want any hinting when doing the measuring */ + cairo_font_options_set_hint_style (options, CAIRO_HINT_STYLE_NONE); + cairo_font_options_set_hint_metrics (options, CAIRO_HINT_METRICS_OFF); + + cairo_matrix_init_identity (&m); + + r->measuring_font = cairo_scaled_font_create (r->substitute_font, &m, &m, options); + + r->start = glyph_start; + r->glyph_count = glyph_count; + r->desired_width = xcalloc (sizeof(double), r->glyph_count); + r->rescale_factor = xcalloc (sizeof(double), r->glyph_count); + + for (i=0; iglyph_count; i++) { + r->desired_width[i] = desired_width[i]; + /* use NAN to specify unset */ + r->rescale_factor[i] = NAN; + } + + cairo_font_options_destroy (options); + + cairo_font_face_set_user_data (user_font_face, &rescale_font_closure_key, + r, rescale_font_closure_destroy); + + return user_font_face; +} + + + +static cairo_font_face_t * +get_user_font_face (cairo_font_face_t *substitute_font, const char *text, cairo_font_face_t *old) +{ + cairo_font_options_t *options = cairo_font_options_create (); + cairo_matrix_t m; + cairo_scaled_font_t *measure; + int i; + double *widths; + int count; + int num_glyphs; + unsigned long min_index, max_index; + cairo_font_face_t *ret; + + cairo_glyph_t *glyphs = NULL; + + /* we don't want any hinting when doing the measuring */ + cairo_font_options_set_hint_style (options, CAIRO_HINT_STYLE_NONE); + cairo_font_options_set_hint_metrics (options, CAIRO_HINT_METRICS_OFF); + + cairo_matrix_init_identity (&m); + measure = cairo_scaled_font_create (old, &m, &m, options); + + cairo_scaled_font_text_to_glyphs (measure, 0, 0, + text, -1, + &glyphs, &num_glyphs, + NULL, NULL, + NULL); + + /* find the glyph range the text covers */ + max_index = glyphs[0].index; + min_index = glyphs[0].index; + for (i=0; i max_index) + max_index = glyphs[i].index; + } + + count = max_index - min_index + 1; + widths = xmalloc (sizeof(double) * count); + /* measure all of the necessary glyphs individually */ + for (i=0; i