From 615d00ea252739da57edbd980ff27e573f88ee7e Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 17 Jul 2014 13:36:09 -0400 Subject: [PATCH] [arabic] Apply init/medi/isol/fini/... in separate stages Follows the order of the Arabic/Syriac specs. Also don't stop between rlig and calt in non-Arabic scripts. Micro-tests for Arabic and Mongolian added for the latter. --- src/hb-ot-shape-complex-arabic.cc | 56 +++++++++++------- test/shaping/Makefile.am | 2 + ...3c2f8e5512187fd982417a7fb4286728e6f4a8.ttf | Bin 0 -> 3428 bytes ...9fea2a7384f2116e5b84a9b31f83be7850ce21.ttf | Bin 0 -> 3428 bytes test/shaping/fonts/sha1sum/MANIFEST | 3 + ...19b33197965846f21074b24e30250d67277bce.ttf | Bin 0 -> 12560 bytes test/shaping/tests/MANIFEST | 1 + test/shaping/tests/arabic-feature-order.tests | 3 + 8 files changed, 43 insertions(+), 22 deletions(-) create mode 100644 test/shaping/fonts/sha1sum/813c2f8e5512187fd982417a7fb4286728e6f4a8.ttf create mode 100644 test/shaping/fonts/sha1sum/8a9fea2a7384f2116e5b84a9b31f83be7850ce21.ttf create mode 100644 test/shaping/fonts/sha1sum/a919b33197965846f21074b24e30250d67277bce.ttf create mode 100644 test/shaping/tests/arabic-feature-order.tests diff --git a/src/hb-ot-shape-complex-arabic.cc b/src/hb-ot-shape-complex-arabic.cc index 3c5974392..1b4ebc919 100644 --- a/src/hb-ot-shape-complex-arabic.cc +++ b/src/hb-ot-shape-complex-arabic.cc @@ -68,31 +68,30 @@ static unsigned int get_joining_type (hb_codepoint_t u, hb_unicode_general_categ ) ? JOINING_TYPE_T : JOINING_TYPE_U; } +#define FEATURE_IS_SYRIAC(tag) hb_in_range ((unsigned char) (tag), '2', '3') + static const hb_tag_t arabic_features[] = { - HB_TAG('i','n','i','t'), - HB_TAG('m','e','d','i'), - HB_TAG('f','i','n','a'), HB_TAG('i','s','o','l'), - /* Syriac */ - HB_TAG('m','e','d','2'), + HB_TAG('f','i','n','a'), HB_TAG('f','i','n','2'), HB_TAG('f','i','n','3'), + HB_TAG('m','e','d','i'), + HB_TAG('m','e','d','2'), + HB_TAG('i','n','i','t'), HB_TAG_NONE }; /* Same order as the feature array */ enum { - INIT, - MEDI, - FINA, ISOL, - - /* Syriac */ - MED2, + FINA, FIN2, FIN3, + MEDI, + MED2, + INIT, NONE, @@ -145,14 +144,23 @@ collect_features_arabic (hb_ot_shape_planner_t *plan) { hb_ot_map_builder_t *map = &plan->map; - /* For Language forms (in ArabicOT speak), we do the iso/fina/medi/init together, - * then rlig and calt each in their own stage. This makes IranNastaliq's ALLAH - * ligature work correctly. It's unfortunate though... + /* We apply features according to the Arabic spec, with pauses + * in between most. * - * This also makes Arial Bold in Windows7 work. See: + * The pause between init/medi/... and rlig is required. See eg: * https://bugzilla.mozilla.org/show_bug.cgi?id=644184 * - * TODO: Add test cases for these two. + * The pauses between init/medi/... themselves are not necessarily + * needed as only one of those features is applied to any character. + * The only difference it makes is when fonts have contextual + * substitutions. We now follow the order of the spec, which makes + * for better experience if that's what Uniscribe is doing. + * + * At least for Arabic, looks like Uniscribe has a pause between + * rlig and calt. Otherwise the IranNastaliq's ALLAH ligature won't + * work. However, testing shows that rlig and calt are applied + * together for Mongolian in Uniscribe. As such, we only add a + * pause for Arabic, not other scripts. */ map->add_gsub_pause (nuke_joiners); @@ -163,12 +171,15 @@ collect_features_arabic (hb_ot_shape_planner_t *plan) map->add_gsub_pause (NULL); for (unsigned int i = 0; i < ARABIC_NUM_FEATURES; i++) - map->add_feature (arabic_features[i], 1, i < 4 ? F_HAS_FALLBACK : F_NONE); /* The first four features have fallback. */ - - map->add_gsub_pause (NULL); + { + bool has_fallback = plan->props.script == HB_SCRIPT_ARABIC && !FEATURE_IS_SYRIAC (arabic_features[i]); + map->add_feature (arabic_features[i], 1, has_fallback ? F_HAS_FALLBACK : F_NONE); + map->add_gsub_pause (NULL); + } map->add_feature (HB_TAG('r','l','i','g'), 1, F_GLOBAL|F_HAS_FALLBACK); - map->add_gsub_pause (arabic_fallback_shape); + if (plan->props.script == HB_SCRIPT_ARABIC) + map->add_gsub_pause (arabic_fallback_shape); map->add_global_bool_feature (HB_TAG('c','a','l','t')); map->add_gsub_pause (NULL); @@ -202,8 +213,9 @@ data_create_arabic (const hb_ot_shape_plan_t *plan) arabic_plan->do_fallback = plan->props.script == HB_SCRIPT_ARABIC; for (unsigned int i = 0; i < ARABIC_NUM_FEATURES; i++) { arabic_plan->mask_array[i] = plan->map.get_1_mask (arabic_features[i]); - if (i < 4) - arabic_plan->do_fallback = arabic_plan->do_fallback && plan->map.needs_fallback (arabic_features[i]); + arabic_plan->do_fallback = arabic_plan->do_fallback && + !FEATURE_IS_SYRIAC (arabic_features[i]) && + plan->map.needs_fallback (arabic_features[i]); } return arabic_plan; diff --git a/test/shaping/Makefile.am b/test/shaping/Makefile.am index 33f75abbb..3f43aec36 100644 --- a/test/shaping/Makefile.am +++ b/test/shaping/Makefile.am @@ -36,8 +36,10 @@ CLEANFILES += \ $(NULL) TESTS = \ + tests/arabic-feature-order.tests \ tests/context-matching.tests \ tests/indic-pref-blocking.tests \ + tests/mongolian-variation-selector.tests \ $(NULL) TEST_EXTENSIONS = \ diff --git a/test/shaping/fonts/sha1sum/813c2f8e5512187fd982417a7fb4286728e6f4a8.ttf b/test/shaping/fonts/sha1sum/813c2f8e5512187fd982417a7fb4286728e6f4a8.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b728b277ce516422a3c45bc1681ab1928d62c662 GIT binary patch literal 3428 zcmd5VZtLsPU#>j){+5MqCfN`$RjSBaNaitT;Jb{=Dl z^si|*Irp6JJHPKc-|L=p3 zTL(ttBgb>#5nLEBK|K-%h1T4!3UX`4aXk?C?mt$5Ade$*KC^@t-3-g>>D>*g#zWcilduT}V4d<5T0Xii{$SB)F3C(e3YailxP$0jC!!XKPR`XjXWDX>95fN)mWfZm8u06H*&6-vMf5_q8+0w6;zG(a=7 z!+LlgHbER-hMn+z0HYL@qxq)C-WZk51RIy{8O_EE{lXmMEnuYV2<2q66qStZEt6xqW^ z^Wi0W`s&rIU!A?$e(l<|uItyYQ=u{Ue0lCiiH3#*fB$^r-o1_I_ol|q(2nl(MEY0H zkoVJXb5|}7|K_>VCsU`~`%b9&YOmT`<16T1f9rc4MeXVn$CS!L+CZ_*tK3pFH&;X( zX131u&V6-$HeD&pf>V~iyz%({Vd=~a?VOuSU!R>#ot~ZLkDrnEJ?Oh|L>4xj+4tZF z7i8*-cI%X>B)LzwtVv&>2iresQ@^M3!#74W>SRf^L7`Erd3U$`^H=HvZ}WSe zv+zcx(jdCxX9WEZA(Me1yd@Ng&6I+GdFM$-=AzCH*kW+_tkx=r!QiMOYdK%E#3@&r)^`=UtPev5r*}cC)#7s&?LW}{)XvWOUdPi- z%|jhtYo*_&4~1(q6(O^4b!F{vcQCwhqP4Tj^R39Kb!+am1oMimHlIU}QM#SED4hDA zMTzcyLX_x@|I;Xuh1!BHtRhUm=;xx*h=-L3R)gg6M6-p%3JbqnEE+2oT5ZgZb;W8c zh7;@q76eMoe$GqH)UFTMCA-F2YIc`7Ol1`+omngCH|?ozY$lyjBxVyhq5h}c1)4%b zv1r#i12y5YzJss7vTko*15ZzWduFg8cKFba;$KFZMQxGJRIYPqbTx+fi{pL!j|8SB zUosioW_vT?$Oojl%D$$(K~?T7x2^8q5?{Uh7wPxXFV9pQIQC8xpl_)R|2lsOTEB*G z=%5~pUet1;WNhMUo4BYR3V}Pxq~syk+J>Yn!&jCE0aew{>IJ3Xa_TYkKRZ z1O035I$KFa8FBJTwNa<7z%N;xRw+pcbDl4aEF&<@JPx^afeaLil@@TDXUIhh2D=VNqUsNS^*1+<`mfHCjx+OK)=3+%sH~JI8&>+Y!nnu>EQ5 zpKtc-8t*|snU(*z@SXc?F#GwHUuOnVnS#$Sb9gBNnwU9I)p!x z+l=PVV(Y><90lN9*q+BF?f}q_5Q}Rmj;CKBt2CvVf%FRnpXF`Lsbz01aC{}oDnO|? zp^#D5k?Xn3Fi38rKAg%u?*ere0dGUAvUat0J=+5<;7W&bYltIsGa?mu@&b2EfqNvl z&<8XH8;8w=Zx#U)#;yu`Asa(#E3mon+=g6#>;A1zmsv@{!K8Q<@*G(`Y)sK^2RsX7 zkc1(8k3a%%XGvUd6Aa^c61KwzY(wxW&c*T8ma_u8%peS6_n(gzeW$ol^7#DJKdf`_dI ztC+bEVctO_GZWVC97znZa}y=l1)bFps|j{X!`}qhvl-SiU94Av8gJz`2xE3Cz0X~60BSwj6){f_U_RE6eILBo(`w_K-8(+j}9>MjZJxjQbMV$H(oF7+M!nqc4 kg^%C_^oZHPtXZ&9$YXMQM2>IDq!7WpW+)+(#y0`+U*f`w?EnA( literal 0 HcmV?d00001 diff --git a/test/shaping/fonts/sha1sum/8a9fea2a7384f2116e5b84a9b31f83be7850ce21.ttf b/test/shaping/fonts/sha1sum/8a9fea2a7384f2116e5b84a9b31f83be7850ce21.ttf new file mode 100644 index 0000000000000000000000000000000000000000..875c6998db051f23fc8b2e9d26f196f47cb634e4 GIT binary patch literal 3428 zcmd5V&!3!iYO`MdZ z5MUyJP}>P9()O)xeq|bzSSKFPnPL#0u=lK zQQP}R;$yb;wr&7*1o_6n`1ly`phWy%*eZj=`vx9mVm2Iq3ZRM%?Tqgbj!lcG-;A=@ z5DJVY)m7v#AYU;wGBH{IJN^sgCy}ok9_^1C{;ofOybF29NPKb(R*@0pkp)*WKC+YF ztNk(VKZbnA*y#AgPx!<0$bW+NJ_k1F0}##&o6s92Xh07lSfK=*Ab}UEApkPeLIX5G z8*G4$um$4q8tjH20*F#nj^>*IsTh^b1RIy9jA!Eox-iFN3m7RoLOt0mMJ18-GKq$x z5wC2J48-il-fec9D>;diMUi;Cg3@BKIykGvVm3+TUQblESi`j*uP65(jn!JLryBCl z$Cv5ZYuB!Qeg0b8_3PI=Z``;+g~r_T)rAie4GjtY;dJBv{f*Q6Q={i-dsliq{p%OV z&(iO5S1%3y=B2ZzQ)k=`zMh^b93n%v$LtQv$OokbMk>ly%&$k!lrWv9{uQ| zOnuQVy(*O?59zkG>5KGm+sBVnQ}l4^_f&rTgJG>YSyF9OXw_=o-6j9x_4>fO{Jxhg zyr@zcm9F?X!SDfOG7yA!gd$}Vr66G5dD5P_q`0bR$NWmL6?S3nCC(F#tf6uk11TuE zu!EXSIx3a>DHB&pvD#SfKN|6)SclULA}k=}tcFq$l`sZ9%(e5&dp+l~WAA`eygmV{zGSX!IX1 zcUpqYMu*R8t#TNRjw-T_^F>RXa;0fQXQ9jbIAnBs7gn`ee9oeShq|8I-BI7;cz#XO zV7u2^>9-j|;Tmm4$n0BPSv%Af3~wH9>FD%)Cvs-}+6T?S{K8h7&tbqQ-OXGQ&iv1! zME5=;O7!OcX_Ux9Z9yki5vE`1=c3Vwhm{CcgXHloBZOo2!#cC^t z6YK>R1WL_*&P&bIZV1>VyVhE2c9%I!WfcW_vraN>*;n1zL^`BM%qDO`{ZG3z+CpQo z(yns`YQkl`hu?mE{r=tto}T{h%z!3#^vJH_Uqzafx+1-)T<_58YmD(%#(EDP3rtSD zYBIXb_9nuSpOfk;``WgKf^uiMZFS$a`0BmCOn;PqZKmSTiTBn3`j*P@Z}XR-JBIh{au#iy+l96OQIPxGQ7FXG;$Bje++Vg{fIGURgGW+Ui#v*1RyNp0I^netJz@xiU3Hrk|Dg`P;ZhkO-U$GhdPQbA>nZ z*%>EwE2TLbR~EbyF;mhKA{l5K==qc(k}dw z++{p}9$P2I;Wz;2!nP5&xCcN#K`id2IGKK#tkRZd`qM9KKF`~jTbA`Y;P^_^Re(xy zN+F}JBS*O_FhK6&dN`GP-UsR|0^WvJW$kL|e6bsv!Ici>_D~Mft%y|M$qU>G1%4yJ zg+8Du*f?w^>{$d%7`rN@LN zm{xH?wXH53?2G#oYk@#Vl+ zUKUyswuG}=<1V3WXeg$gVpeh)Q)9lq2V`V4IfxnM83O0n{fb~NIFu+r=#LLifQRh` ztC+bEVctO_GZWVB9!?Cha}zbx*s~g9HNkFa_?rMJn_-l##i$A|@)~^8!dPS9#;hKJ zc}(sbk&~M;DMT=@8A`~cu_vJX7yoF9?f?J) literal 0 HcmV?d00001 diff --git a/test/shaping/fonts/sha1sum/MANIFEST b/test/shaping/fonts/sha1sum/MANIFEST index d1ff35067..0e52060fb 100644 --- a/test/shaping/fonts/sha1sum/MANIFEST +++ b/test/shaping/fonts/sha1sum/MANIFEST @@ -1,6 +1,9 @@ 226bc2deab3846f1a682085f70c67d0421014144.ttf 37033cc5cf37bb223d7355153016b6ccece93b28.ttf 4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf +813c2f8e5512187fd982417a7fb4286728e6f4a8.ttf +8a9fea2a7384f2116e5b84a9b31f83be7850ce21.ttf +a919b33197965846f21074b24e30250d67277bce.ttf d629e7fedc0b350222d7987345fe61613fa3929a.ttf e207635780b42f898d58654b65098763e340f5c7.ttf ef86fe710cfea877bbe0dbb6946a1f88d0661031.ttf diff --git a/test/shaping/fonts/sha1sum/a919b33197965846f21074b24e30250d67277bce.ttf b/test/shaping/fonts/sha1sum/a919b33197965846f21074b24e30250d67277bce.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d2f116efa2606c2b55314df53a15223f0857f0f7 GIT binary patch literal 12560 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 DXo0w& literal 0 HcmV?d00001 diff --git a/test/shaping/tests/MANIFEST b/test/shaping/tests/MANIFEST index 024169d66..1b577c7cc 100644 --- a/test/shaping/tests/MANIFEST +++ b/test/shaping/tests/MANIFEST @@ -1,3 +1,4 @@ +arabic-feature-order.tests context-matching.tests indic-pref-blocking.tests mongolian-variation-selector.tests diff --git a/test/shaping/tests/arabic-feature-order.tests b/test/shaping/tests/arabic-feature-order.tests new file mode 100644 index 000000000..3e3cf6a97 --- /dev/null +++ b/test/shaping/tests/arabic-feature-order.tests @@ -0,0 +1,3 @@ +fonts/sha1sum/813c2f8e5512187fd982417a7fb4286728e6f4a8.ttf:U+1820,U+180B:[uni2048.E81A=0+1550] +fonts/sha1sum/8a9fea2a7384f2116e5b84a9b31f83be7850ce21.ttf:U+1820,U+180B:[uni2048.E81A=0+1550] +fonts/sha1sum/a919b33197965846f21074b24e30250d67277bce.ttf:U+0644,U+0644,U+0647:[Lellah=0+1503]