From 1d634cbb4b0338e1c2841127a72c5fac3a2a5ca1 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 6 Jun 2014 17:55:02 -0400 Subject: [PATCH] Fix base-position when 'pref' is NOT formed If pre-base reordering Ra is NOT formed (or formed and then broken up), we should consider that Ra as base. This is observable when there's a left matra or dotreph that positions before base. Now, it might be that we shouldn't do this if the Ra happend to form a below form. We can't quite deduce that right now... Micro test added. Also at: https://code.google.com/a/google.com/p/noto-alpha/issues/detail?id=186#c29 --- src/hb-ot-shape-complex-indic.cc | 28 ++++++++++++++++-- test/shaping/fonts/sha1sum/MANIFEST | 5 ++++ ...07635780b42f898d58654b65098763e340f5c7.ttf | Bin 0 -> 3000 bytes test/shaping/tests/indic-pref-blocking.tests | 3 +- 4 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 test/shaping/fonts/sha1sum/MANIFEST create mode 100644 test/shaping/fonts/sha1sum/e207635780b42f898d58654b65098763e340f5c7.ttf diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index 62f117273..638aa3db7 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -1365,10 +1365,34 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, * cluster. */ + bool try_pref = !!indic_plan->mask_array[PREF]; + /* Find base again */ unsigned int base; for (base = start; base < end; base++) - if (info[base].indic_position() >= POS_BASE_C) { + if (info[base].indic_position() >= POS_BASE_C) + { + if (try_pref && base + 1 < end && indic_plan->config->pref_len == 2) + { + for (unsigned int i = base + 1; i < end; i++) + if ((info[i].mask & indic_plan->mask_array[PREF]) != 0) + { + if (!(_hb_glyph_info_substituted (&info[i]) && + _hb_glyph_info_ligated_and_didnt_multiply (&info[i]))) + { + /* Ok, this was a 'pref' candidate but didn't form any. + * Base is around here... */ + base = i; + while (base < end && is_halant_or_coeng (info[base])) + base++; + info[base].indic_position() = POS_BASE_C; + + try_pref = false; + } + break; + } + } + if (start < base && info[base].indic_position() > POS_BASE_C) base--; break; @@ -1603,7 +1627,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, * the following rules: */ - if (indic_plan->mask_array[PREF] && base + 1 < end) /* Otherwise there can't be any pre-base reordering Ra. */ + if (try_pref && base + 1 < end) /* Otherwise there can't be any pre-base reordering Ra. */ { unsigned int pref_len = indic_plan->config->pref_len; for (unsigned int i = base + 1; i < end; i++) diff --git a/test/shaping/fonts/sha1sum/MANIFEST b/test/shaping/fonts/sha1sum/MANIFEST new file mode 100644 index 000000000..c05a9ef18 --- /dev/null +++ b/test/shaping/fonts/sha1sum/MANIFEST @@ -0,0 +1,5 @@ +226bc2deab3846f1a682085f70c67d0421014144.ttf +4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf +d629e7fedc0b350222d7987345fe61613fa3929a.ttf +e207635780b42f898d58654b65098763e340f5c7.ttf +f499fbc23865022234775c43503bba2e63978fe1.ttf diff --git a/test/shaping/fonts/sha1sum/e207635780b42f898d58654b65098763e340f5c7.ttf b/test/shaping/fonts/sha1sum/e207635780b42f898d58654b65098763e340f5c7.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d91df5726b3fb2f7ff4963102a32971624a39c52 GIT binary patch literal 3000 zcma)84Nz3q6+ZXv+qWx!!t&>|gd*Ugh!q!Duu^M`K+DKaHEoq-23OeybQc&F1*%iA z6O6>4A#F@|5>jgnrlO{#rpBN6L+KDrgW8ymq*L3DF&*0`YA`yD-F@5dytgaZrZatS z?tS;1d+s^k`MbL$h$x1-$Uv*gmXwrIIxQeF9RoMJth#FX6Te!t3-oo+@0Kn9&f?c{ z50(;{2Z;*DM` z&B6L(B6)R#(@|%hc_xd$7#%nE{A=#x2&bv+tyV+Iv@5y(gFBb9lT+>BR@kkXdXRE zB<%J)n_|qswIClp#`8At z1Gc>&Up{XO3|>>!&z&zFeo=h&((gpx{*OkFj=lGbXSU7VSkkfC+qCtE(jU8bkN;jB z^KDrv=AAhp;(zjzdU4dR-o1Td=!SZ)_#4l5@A%QsaBK)kBanQBvWaHcVS&MzU^gi- zK>-GU0HidEL!?EL4gw;E6CGPV9X+Prn(5u_J9=vGhPUco6UDy~nWC(}-#=#TYObnn z{NDQJZ(ZN@{y(psE*I)OQ1%n(_^O&+- zvJ!WOiDdIPiFCf=)%cRmH-3n(P(KJ<5!d7<%7pL(qt-0V<-$CLS;?tV7($^(S?gT8 zcGlvBvn$I_F007=`n;LbE*(8`N$E+Q?po(wSK7Px`CqSW7ja!ZH=nK=^le<_TYUlfZXx$_?1wK&=hJP8kJ4%>> zSH(wSI>}TWxS~~mHrc6^Dxu|z>t8X&P0tecLhJw81VS;1WP9H9a5HQvE($lpiWUF5 zT_Ji(9o^2Yujn1IPi$=8$sMuPUsA7i#AEsB2ut?-z#&m{NDRu^xnI;AyKmJ5Y&*px zdGpP)CVJ#CF?Ihw^vH|qKcwTK9x$A;N`#-X#kPSAmY-{y5N5& zX{U13QS)$)h6i39Mvk)2xx6L4Kl`r~4V*apGE&49fe}d~WTt0PJxonJh7j$dgLG5G ziATgNQ7bkJzcf$Vf%Inu*U#5ZExt>Uz>R0rI`UoqUK||E{Jh71+cKb>0XZeCSstY! zRA@D-vD$c?a1RCs!nF8Q{XpEI8m6V=!OMI`x#z!4WVsJrGb{sPEo?!1BFSL#h+Z<{ zPJO|c2i{-xuk<9jq%F91A{E78mL*B<>U#KeMO9@LEh18bx((%?0d=a&$W6vKu})*X z;OKFPLPh3+HseK4MdwDBMpvNID0;5G8h>y6)cBhZS&?wt;k3;DTX9xjOZWw|qMn**F($5N%gc|_-0pOH8|#~x8?m7gd~GMX)6vrEY;d?;yb;|xnTo(3exkG! z*a$7noeo_$9|h0h)+BUT62}TL3P+H+>F|MR9x`47q8tGpQ$q7kKq>+^R6a=_x5q{? zY!We(`8c%kzNl;Twn4id5k99Nn`}>L!=g#c_^nAntaCK|CTL}ODR_ev3_%gWZ9G$* zrio8VWT9!mm{a}=OJw+hbryueqA2vnBqf66Z zi#=k`449P=#nE9Z?6CpXjOb6ZV_icN*|fQcvqTG#E*C9n@wT~WsWvae?4=djygGz{ zacEJ~G$I0;cOq2ZunIZ~5#|oi>`*jK1!Y0(tn@W{oHkG&y+wZ)31XpGDr!UvULW4G zQog2BkNRJgUXy1qIfji3ZjGH^+ld8KHp z2`NiRT1JF8PyBLag|(zk(!vtD7S6R^ah%Hu=@d;HpkLt`4v)b!=hLhRzdf+oX~I)3(qQ88aX&pP68#ta*2;IXGH V!QAk@7(Ow<=M^JRa8lPz{|537b@>1Q literal 0 HcmV?d00001 diff --git a/test/shaping/tests/indic-pref-blocking.tests b/test/shaping/tests/indic-pref-blocking.tests index 23ef5bc0e..260980a15 100644 --- a/test/shaping/tests/indic-pref-blocking.tests +++ b/test/shaping/tests/indic-pref-blocking.tests @@ -1 +1,2 @@ -fonts/sha1sum/62927e416ab1fba8cc6222d97b2b0ba0e0eb00ea.ttf:U+0D2F,U+0D4D,U+0D30,U+0D46:[evowelsignmlym=0+1465|rapostmlym=0+499|yamlym=0+2120] +fonts/sha1sum/226bc2deab3846f1a682085f70c67d0421014144.ttf:U+0D2F,U+0D4D,U+0D30,U+0D46:[evowelsignmlym=0+1465|rapostmlym=0+499|yamlym=0+2120] +fonts/sha1sum/e207635780b42f898d58654b65098763e340f5c7.ttf:U+0D2F,U+0D4D,U+0D30,U+0D46:[yamlym=0+2120|viramamlym=0+0|evowelsignmlym=0+1465|ramlym=0+1507]