From c529bf7b0681ac95499894f010ae34af8c1af5f4 Mon Sep 17 00:00:00 2001 From: Hermann Kraus Date: Thu, 2 Aug 2012 01:12:52 +0200 Subject: [PATCH] Implement font sets. --- src/text/layout.cpp | 28 +++++++++-- .../images/hb-fontsets-800-reference.png | Bin 0 -> 11892 bytes tests/visual_tests/styles/hb-fontsets.xml | 45 ++++++++++++++++++ tests/visual_tests/test.py | 3 +- 4 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 tests/visual_tests/images/hb-fontsets-800-reference.png create mode 100644 tests/visual_tests/styles/hb-fontsets.xml diff --git a/src/text/layout.cpp b/src/text/layout.cpp index 61439739f..eb089ee86 100644 --- a/src/text/layout.cpp +++ b/src/text/layout.cpp @@ -145,11 +145,12 @@ void text_layout::shape_text(text_line_ptr line) { face_set_ptr face_set = font_manager_.get_face_set(itr->format->face_name, itr->format->fontset); face_set->set_character_sizes(itr->format->text_size); - face_ptr face = *(face_set->begin()); //TODO: Implement font sets correctly + font_face_set::iterator face_itr = face_set->begin(), face_end = face_set->end(); + for (; face_itr != face_end; face_itr++) + { + face_ptr face = *face_itr; text_shaping shaper(face->get_face()); //TODO: Make this more efficient by caching this object in font_face - line->update_max_char_height(face->get_char_height()); - shaper.process_text(text, itr->start, itr->end, itr->rtl == UBIDI_RTL, itr->script); hb_buffer_t *buffer = shaper.get_buffer(); @@ -158,6 +159,24 @@ void text_layout::shape_text(text_line_ptr line) hb_glyph_info_t *glyphs = hb_buffer_get_glyph_infos(buffer, NULL); hb_glyph_position_t *positions = hb_buffer_get_glyph_positions(buffer, NULL); + bool font_has_all_glyphs = true; + /* Check if all glyphs are valid. */ + for (unsigned i=0; iadd_glyph(tmp); } + line->update_max_char_height(face->get_char_height()); + break; //When we reach this point the current font had all glyphs. + } } } diff --git a/tests/visual_tests/images/hb-fontsets-800-reference.png b/tests/visual_tests/images/hb-fontsets-800-reference.png new file mode 100644 index 0000000000000000000000000000000000000000..e6d716724aa0cd7de3967dcbb31c66216f3a0629 GIT binary patch literal 11892 zcmeHtWmwbU-|s*`1Su6!5Sd~Sih_g;fzc&7Mwil~qy;1dk&qHWx?yZ|jt0R1=@^}g zbW9xsVZ^z4p7WgRygYBtyZ;OLZP&G5+~4~fpZG;+X(%z!vC}~y5C#=xc^wGk3>19s zqNM@LA0tdJwE%fy3b2$hFI52Zi(t<D8T_LO2vHowem*L>ES=8o`&gpt=-T~V*6RHWS6!h(KSc3=W!WDa ze#NV8Ru%@nzQqD(#=5lbf9uVV7(d*db}>BBfKX_C4>&pUe&jOuggB~ip3-)Fz`x;7 z3*||Y^?XP{HA+oEb(>5aknYQt3F%ejaI&Hoon6OcEsbjIo^7|1osDlufc;BU&dGCM z>9-k0>Z>P)IFwYr72mF3?EMmPab#N!B9n0ZZ;|QIiv@V~kGCA?(RRPh%CLr&OuylE z3rgA|dP-VVuWsJLe7Y9Lx<0Y_ndaXe^t-L6msM=(=Wwi$=@-CW%UR=A^)ioL!(qAA_y%OPZ?Y~%u^pn?~?_#s=DWai83aP_gn*gf}! z*Jsfr)r)W~zGzhaB38fLOnhUZJ>+a*$Jzh=%nci5O@I3(`#iaWAec+ANwKHm$`Bc> zbJG@1tMfVql?r!I_N~T(mIRn6D?efDj&kIC=3l~U;+G!J?Z=4L%MCx)*1uI6~9Xq5(u z`R>?Nzx?wv-}|CSvf?a#qSE&6Hx8ExcNaI)1SYr}E!6tOn4v8)#RaQ+6%!$BV%|IR z^DP6%RAP|SzlD%|Z%#p06W{>SRRa zm+0J`z>Bk`6H%(9_%d6AUrp3EOWE1ZiwZd2w{^#BD}}OpTAbbDTi`}<9c`{EtF+sRI!@Xx45KA)sRm}sRaf*r#?`S+122_ z^42$9-`sz+q;||`*HzENRl$8Z#Ws~I@K7+`AHQ=gBOBYfJypxk`hwxdS!Pp{t%}c# z#ctDqCr5pZ5}R?j-n=GLf6}N*8&$&V;Lo5%m@g5>A|{O3cit;quT&duJwDi2{?o}N zHg4uuI_W+ji5UO%LhR^1AA7`*Am*>$53#2%b?ATp@+KNF)8Q=KH>Z^(KVILPKRK>r z5cid$O1cWy-Nqb#Z}warY`>o6n^is9*$A~t2sk3?SC42&Om<2y1fAI&u6wpBu_$m8 z^FFP5KuV$t7lIDkkZo_g9F0~GFsk8+@1*X42FY)}xu~Jc>ee__8kqPS)NY&OfZvpT zAu?t8#jwiV6l3Rxua~1_&T~o4I42nz6c70jTJ}Eb(xR;Fvix^d{AL1=Hq4i!9`!%m zn{n4%?Nr#`r;vZf&6RQH#c59kDUgrT4$;bU$6V|Ac>mF~W3~F!UV{&Dd3k>&>p^`f z>^i>kM;ZMkBt+X%b>!sGUneX~Q80Kj2~+aqXE=A2*G;U9gzL{Qcmfdwu%u^8I1H z3OB8ap~a^6^e0}Mm7O%cQ8FPklNI@tYcUer52u~#Ovh9WB-Ng+=HpGsk1ak0X~jmo zymS$MEtL7>QR^Byt-CoX9ARTw>@XqBFYzsJY+vY}Czo(*9e&cZ*N|tq4 z_4v^dYO^|+W8XHyY?px6%yJIdauzICzdV@@Y$1)Q z^@$^0BKRyw7aETA%W=N(ks_dh8CN(r|M`ZCAGeG2_1H;931ehsNUV2)Fk(~X3&OHt z-48w2@ihZ_^BWbC)v&Nzo4Ty#U}$W$uBtAoB?;7WUN76E^Bo$|D>a%VbGdchz-n7Y z&sguKJN&x)G^OAop|(ZQAIXS{X=DG)$AP5bPS&9e$5;-|A7cwM`RoHd%<>e8m#ztu z_ET&#D_2rhE9<6E#qf5M*K&L2fk&ji-jqjMgdLcOlWXm$p4wJ1S|Ln4P@!DAGsVW* zj=iU;R-SBCnR|wSbH*O!PsWe=BKTj^h&v!UX6(d@)^TKZ4Hp*M^KQVu%An z;ps6g<^lV+2NzdOpllC?CAHgUv~6QxXOL&50rFHJEP{q+ZEJ(c)8YKc==m^S5fTy3 zzJ9!a5th~AD(O&0NryW8_ea#CK8;T>YdNtli zH3hQgZ!k|2cfG04dkcI(-*sRusqn~*r+)-X;(a>NrO3@!c5f_V#U$)3z*o0!mW8Q_ zkq!^?m_EN{P)n1(R^uvS)0wqd(*BQ@;0FAx6s#?@z(;mcj*PUoBgUeDZ$ zz!SIoA0mb^+P?xdP`{JjIn*?zNe8E{{Rra{C9RLDsr#LKgv4v-jb!u`+MCQadRALo zl$*6|t{cGgL{KG5-63uWqgfAjQsY3%qq{p&V>a4U%+bAM&RY%FQg#-4^$naqY}qwkmdO-WgUysGU$ZV1xA(t_g2qh6mmM zQS+nTK0gy)CRLKXhSMH+mV>mQg^GlrZ|r9w#2?%-cnV=5Z8j3`;p>}!M)F7cN@cvu zb^C7KP%)_fOewlO8^8bS@*VAg21OUGbRNp^dX~Uhk6>5pH ziHwWEsqIWqqZ9>xBkMUDrt6O5#rligCjxfQLSz|~ZUo`ab4qwUC8u|bXXH&lZla!Rx`03l#UgH(K%Q)cuM*goC>-sDvA+XOvxC@3|4vb`y_zPGC1=^gC|`;h%!y zK;OjND71frxpw^Z>?pnQ>>CECk?**ZzFq$0P^9d$IeJQE`&>Hc@mD`j$vB=j=b+q* zQOZtvEWff36PtyFE>HomeU2huo}J-0z1)#>5&&%yp33*mh)ecpU^hVlN76}I$L&1<(Q zX}fbKJ`8&PDDCC9-mp@^zdGJCLr8a&?IHxI;=1)?cn!9uYTsGS(?a1dsNybQ{(9=~ zc;&Gh8QvW4lV&j$yT5Ve^ddJlLur{{tJ!!jSer827umisETXVRs3iHK(;^&#eWgv! z+{XBBT^38l41G+ge6EJ7z?}KA-w2(|v+~LJKmu4|77enqhMv3}S2e^;3db)6qP0!$ z-RA=j!3GvZ?LBL0#}drL3=dkMh2H+1RL{lo2`TX}d$ytwB9AnQ?%^SQ9IU({J7mXj^roRuIl>PnDv zKL8rn7i8l4m38;zK#c7q_0H!oCZ-(|RDHdZ zo~h?3d>ZNlD)nyGtLI~2g4RSz%~y@U2wiPu%AUri=hn&^mQ!m6aN2o_fL)6#NPYu4 zz_ZV4W#2~r{aGA|i3p`?^Wf!`$dqS9R#3#WVlNNBKxv4lKGNmMMwX@q%fu+W5D#`v=5yCykMWE+G2YZ`aY-z6{Va`}y~>{3WJt-*4ORWeMBs;2)e}8MZBbr*V*#!Y-U@ zT+S=dU^m*vX8vlZ#&NRB;>_P*dI4p>Lr{a4XUf5->Ygk!ZJNrG@ZL^$=MZ^wL{r#L zpzq+4N8Zag}e6)!2^&Ckj&JFAp_1pt5ZP=J=#No{5>}Be`$Oy**z!Lhvx> zVT965;{?qMpJSm~=yx4yqB1Sw-2BQkP` z-gDtBVf^GvTBi=U4{u5yT9|7uIE&B%0Qv-RTiJ z6V`MHjPq=xg74AAgd{F_WW$;6;0f8XP7q@P{G%10TB{G^%gManR@v2oLkR*+}wTLvt%cR zSq({&uHOx7pwz_OWMCKODScf4zwmK6tFf~PQK*r4J*EDPvLJOKw^v{clNWlEr@ z$PWhd5W;-hv-=4NkMMe<8!dI;CMVNKWchEOeXQ&Rgi`*-QwRl$pHi6`%Sd50l&gRX zTRLUib!#JqXN_8DAgV}C&?=HpU)y*Q=!p->BB_O;szAnBk>5T02b^=unA2o?f$5D5 z1PfK6W>$}WygOkzqVb}qdF>a%)I_DHloBouveHAK7mR%eqgqrV?u+lTu)_VWZ2O18 zwEPGi3i#YdL-(Mdz(Hdp=a{*3MHI;YkvGJqbVn!>i zU<_bY4HJI@xsAQ2l>%cL53onoI_#``4|2n51t_ueWi(zuPMS_kn(-e4gmI9~MV^!> z4;hL~1zD`J3Mjh>pkd0zA+>xN=4a=D5>~m%5yu1q25K3fSGY2w;=KPc0WYF3bFRo} z{>ivbB7|A*0>v+IPgTjnvc7Bw&0j)pzq;`L1CJM@40f6RsN4*4Y+OU{?$^9=Y1JyG zwya@K+cvIqo;BEI=n8}A$i#!$L>eU8+ttMZ*;2ALQ08MjRnT*ALysS_d+7s`dnWDV zjo|3U@{a@sYjC;x9!ih3;erK!5%!Biln4CgrL^Zsg~BpKj*5^Taj z35k3!5BZa%JvzJ=TJL~fEgHw%1B&C`E2FWtxJ*eu^!9+xpfdaE>aM~)SRGAeUjANa z7bmCzX0%pKvc%nO#(<6t zNk9x!ScNc%R-A0tjA)1xG$B|M6&mIYzO4Kp@T_o@(Sv2_6tv zhW1y{692uxdLleC@OVFc?{-i&?8a$G&x9XyO1*kH_dkovcU}Bub9}h(^FK=)ZExgx zCPl@pdzUJXE?yo2bk5Wim}k-czr|SkxxJnTZ8dwNTd~r|;m-&V{2kCmzP@8C>=rpP z>597gXw#o)TF)wixIpoR(+}T{u|G|4N66Y#ZLy^HVpWd-|Kc14+$R(OxL}VDchon( zFRtrSbO4y+LD{gr07RgVu7sfVP>@A>=KdrtiZAy$Pe+^3HYX%u9Egar)N$a63vhnF z+t2pYhhePv%bVRW5S?-}$tLwMM$YbfZ#YR7lxQP!Hvgg9{m?WO1Wk?GTjOs`5LD5h z#m>U+Ptjs?6Nf;kdX3`%LOx0&lm!|E1Y>keo{8EI8(?OPJDFXpY zC)9idt={+R`v>BjIU7F;aN#NTU5FOqzIp4DQkIv%j#-hM)FUo<{w$LaG*L?iz^q(w zTafSjq-|CPj(sYD7x8y4aID1820&S5CnB&DzSb1N|AO$yv##6-yB3eTmsK_}ghkvP zDb|1B4g~E<a3!xzSn8_9SqqVxQfhtRdzvqABvLW<322C=7!E~%GCs;t%AJI>vm zNc?xOvu4@oxnZ+AY0HHG)rdc07q+vwqmiBr^k|w9kqX8qzd!Ny2-y~gAjQc12BrXo zsSu=?Pg^3pgjWeDz;}~&dC|jkvM1=loM7$HTs>=wAk|8%?-$&`{gQD`)94J2B%hHE zPSBpoc#@wPyayVFT$s(+mP!x%nC3UVGqN0>h!sF(FEr!i6U9HF>z~*`c zRNt=aOp^@PpG*Y2J=g@$+nM;8N%~jI$zrUu^YvH1+e-qCagHgHUjD?D0Wly6yJ!0k z5xM+#hL*u#5FL;rJ65o1QSBL>esZ7p-%j6OEkl2hR+GNc)0Hsbdz|`Q zQ@fwOvYDsvX7t(usV}G77|I3s=FXCSh|~VxC0s|t?v%q8!Ebld-YoFQ(->;C82G;0 zAB)Vcm;GAU*>iYQ*?HYTp!v5faVg0>6*QBS<-WAE^45dyLm;1_fhK_)L@phH$WN(G z6{;R2TgFr-meP#@G$*zaa6o2$!^e!A(6IUUeJ_=H1~?@av9+KlPrvQ5=}S#fcz3yA zw)3PH|M&oe7;!Ri7zIXSh8|0CE<14V+K*oT`w`}(P;Ti0I1APybHk@9p@YJ{;csBR)eQtbZ6Wxc&`$zB+6#z=OAjgIflw+^-a%U}E&Z;ROmzSk{sHH^X}x%-ur z|HcC_xbP(6!}zi&?E9*U399%c0D)AkDA$k=rm7_m9d?&MmR@%zgd{aszsyM z77CzCA@@Ok#%&fz?L$Rk0VpeVG?hoLKJ@O;8co(^5cRJ0twlGMdFhy?2iU#1XY|bN7 z2*8!vwUrLK_Tm%8GSJrR%FP+9wJqfd@6ATQwY3k^nAAFxxOmE14^SM+OJFZVfZ|e} zRlx3=J2%m^-Pm(nvZ$NoTC7*vn-?pUI;Gg+(0|$3@flZ}dYUM99-HI?v@v^fPA1%+ zO$aN99x&+q1j6||urN}ybLiaNbc@(?(I3Bq;kfBqVENUh#Kx}_wXjC!hV=u4$~0Z= zeTopf5v+~A*`%Z4`8!XOEeIQw;e2jKeJ;PCV$|UuG+?}2-l$K-={kh+ZsEPjO#pV5 z!C$rYYlmytJh{&JZpoGv4(IwDPSc+J7-q?jF-+7?6V*T$t@Xd2_&Qfe$lX{ZX6K)j zWQ^}?&nI?)z`e2XyB5nX(tT`7Mhoc<eb>R`e`~eL@5lhnSR@q8Nx78liAGT zvRT0Uw_5Ftv%1aNN^|`6CCj&V0#?Z%-nG)FIaWpZo9|2jA1&j4Cy8^=TY*qb*>|)z z?-J{<^E)zv4w4ylWvsAMn}Qp4sYpqMLW!a0DIK&( zSL9MLo%s)ion!%?`Z;;h4kqrx)(F5LF8u1GR~tTG2(SO12{(Jk=Oc;cW7NK#HW?EA z)0&2v6onlgA?OM=Wm+9+jM#bf9uUX?+SwK6U^*^}xuI#A*|$*FBDg$8nLS(VVlp+s z7P=yJ*^%z}aIFw+*3^J?=UR>mgd}2$h7;Nr{hUzZ@Vn3Mu+NpjGZLbYu6pp;XXD*zmItEC&L@;z+ z9I2$ROxtz(as@{k-{PfIkqg=H#X^xvo#p6DHZehVbUD{YlI{oD@r_kH`|Nl(0;VZ% zog{G?f5qdOoUj{a#Z|^|{&sZD_ktudRF4O#xA@Ppl@}z!H`nu`2+VZS6nGiB`{nQ5 z*`8iggnvvy>YIvqMy*{LBCo)7@mgboH~7w&*rv~k`L8@ug5&GQPDbJSoapyFiDJ_( zZ7nV3tI2pfC-8*D<*g{-L7G`}k$lQ=Qz#@_pcH6RSQbj^^PF|Ck2Cmt(VuwoF})-1 z#l7*4o~0$N2kVA~!0sr{SU|iO+*7ND?(BiqkN5ggKXf&#+eR#MrQ6m2?2f5NMz(KM z?|3IIZ8s1;DMglbgRq}mCA)s2Eh6Y>`V86Hs&p*-qN6ZMn(m>a{JGuQq4A1W@dm@X zXC*VG>qfQDXiIuav3^+}b;U!Fd79Lj4)-3@LHU~Tk8*>*BU9I}4iO!sJ&wcKAyZ>5 zjM_{pagf}%!M-H?L;P-8PBEmTOKDB$OgNv@-W;DYrZRs(r!$RDfDNw8f||;XVI}#F zmYYkHt`sFJ0uJIOpp*moxq4+#`K@m~a*`j<=doVxJ>u*!(-gNUjq?>l?ypUBrw3;3 z8;v%tvKON)9<$G06}F4ZfGuZjTSjfe$M*QAKOV1MD(Qvf#@tBMJVSH7f>OLMz;MjBFrLZb4#i`CJMJpt>u(J;R0rGPZHh=X%aa%=@VAh&bO z2eGALR$}m>mhvxKr`3-0TFQkP2&?M!Ub+{(UUZ$7ipyIB(_#qEW%dN<@-`i~EvXS`W?>(3cT_tBRI z`MoGfnE{buK|pZJhQ`~~8_QMk1&wNXBD^knfQ`!hte&WSW6d`JuiXEN@zQ`xLh-md zYbYO2#=9I#A>tuB8yug88JKh`G;>gD*GpUiXfZQ2t;BNtsD#%T#JD^i{{hV+#Cdm0 zx{e9;51Tu{3cnWJUB4F8U{>6bpvW@2yZy^g-4(z0J16YAs`@zuw;_Y^(1uQI9{WHl zO^8JmHM2;%$%C3X_m;hQz`{$gXTFlQBLkZ;COZ511D~Y@u2IuQKYz@ZC$#bnL^^sG zd)I*YLnPyl@!~Kwb11b~slrmqycWJIjQy?iEqUwGjh!K$*cjr|21;dIMecYGp=4K| zTXYhAe)RGrWfu@}GE;N0zq5tZ!TRTHTawB`)DA7563W@hjj`+EVw6AaYI-=^atB1G zcdSA1*9|0-=oco}ccDPjF-_ZlDHZBL?WK$ju_*QABA)4!JmJc(=?=PYzDhCHb{n7P%y1tu&B#!@MuL|2%YxiS=;Z zP&f7##VsRWX;#`DpEcsR;F{e*gm2}J838~{+>d3-aLS_X^0hk$nUaXQ+V3J z8d?&5?eV~QD7%kVo|)vkgC=(8Tsni!O5BLlGCdU5@9DVKI=S55G+uNxXcw85SE`t1 z_744E-F38Ua03xqu2|)pGP{~3aaJCI+cDTjzxok)x{D^dyXoNNqupxn6>BScC~9!+ zXzWBpL>^(kV~BMv|0{!Nlpk@rq>DUmAb!`?Sp8#4J7~M5nQ=j+RaitZue7oJ*wY#v zTpe>pWTvLPF@hfI>#W|ReYJo^rY#4Pxd~pXnHVS7wbjf|DS1My=`O%)EZ$s~>ufM9 zkI|SoGbULY-wP}ZDss{Ny$dV}zG+8h z(7NYuGkd7d4Rxut&asgC2mRvDx9qJ`dlgsIuhHes?~l;Z4Y?+`@G6Sr3jd97m@+D} ze8hoVeiox28spfR9FXLIyq};US@QLooRoim3cq}Wq9yWJp#_#H8`&nC&i*EqZYi^R z@WNPYZ{l)?7EjOafi_amI$V>Kgch`QF0RsSD;KbqvoSReH`B!Z)#!A^3Dq0G1m5jS zL7ss(B9j&2!l}8D64T + + + + My Style + + osm + ../data/points.osm + + + + + + + + + + + + + + + + diff --git a/tests/visual_tests/test.py b/tests/visual_tests/test.py index ab9190a90..2eb01a81f 100755 --- a/tests/visual_tests/test.py +++ b/tests/visual_tests/test.py @@ -46,7 +46,8 @@ files = [ {'name': "jalign-auto", 'sizes': [(200, 200)]}, {'name': "line-offset", 'sizes':[(900, 250)], 'bbox': mapnik.Box2d(-5.192, 50.189, -5.174, 50.195)}, - {'name': "orientation", 'sizes': [(800, 200)]} + {'name': "orientation", 'sizes': [(800, 200)]}, + {'name': "hb-fontsets", 'sizes': [(800, 200)]} ] def render(filename, width, height, bbox, quiet=False):