src/hb-ot-layout-private.hh | 8 + src/hb-ot-shape-complex-indic.cc | 56 ++++++++-- test/shaping/fonts/sha1sum/MANIFEST | 5 test/shaping/fonts/sha1sum/e207635780b42f898d58654b65098763e340f5c7.ttf |binary test/shaping/tests/indic-pref-blocking.tests | 3 5 files changed, 65 insertions(+), 7 deletions(-)
New commits: commit 1d634cbb4b0338e1c2841127a72c5fac3a2a5ca1 Author: Behdad Esfahbod <[email protected]> Date: Fri Jun 6 17:55:02 2014 -0400 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 diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index 62f1172..638aa3d 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 0000000..c05a9ef --- /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 0000000..d91df57 Binary files /dev/null and b/test/shaping/fonts/sha1sum/e207635780b42f898d58654b65098763e340f5c7.ttf differ diff --git a/test/shaping/tests/indic-pref-blocking.tests b/test/shaping/tests/indic-pref-blocking.tests index 23ef5bc..260980a 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] commit 04dc52fa15f5b7f9eb5f448ea43e7ef1b2269e88 Author: Behdad Esfahbod <[email protected]> Date: Fri Jun 6 17:28:38 2014 -0400 [indic] Recover OT_H undergone ligation and multiplication Sometimes font designers form half/pref/etc consonant forms unconditionally and then undo that conditionally. Try to recover the OT_H classification in those cases. No test number changes expected. diff --git a/src/hb-ot-layout-private.hh b/src/hb-ot-layout-private.hh index 3ded92f..e66e19c 100644 --- a/src/hb-ot-layout-private.hh +++ b/src/hb-ot-layout-private.hh @@ -395,6 +395,14 @@ _hb_glyph_info_ligated_and_didnt_multiply (const hb_glyph_info_t *info) return _hb_glyph_info_ligated (info) && !_hb_glyph_info_multiplied (info); } +static inline void +_hb_glyph_info_clear_ligated_and_multiplied (hb_glyph_info_t *info) +{ + info->glyph_props() &= ~(HB_OT_LAYOUT_GLYPH_PROPS_LIGATED | + HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED); +} + + /* Allocation / deallocation. */ static inline void diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index 81f4c61..62f1172 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -1336,6 +1336,27 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) plan->data; hb_glyph_info_t *info = buffer->info; + + /* This function relies heavily on halant glyphs. Lots of ligation + * and possibly multiplication substitutions happened prior to this + * phase, and that might have messed up our properties. Recover + * from a particular case of that where we're fairly sure that a + * class of OT_H is desired but has been lost. */ + if (indic_plan->virama_glyph) + { + unsigned int virama_glyph = indic_plan->virama_glyph; + for (unsigned int i = start; i < end; i++) + if (info[i].codepoint == virama_glyph && + _hb_glyph_info_ligated (&info[i]) && + _hb_glyph_info_multiplied (&info[i])) + { + /* This will make sure that this glyph passes is_halant_or_coeng() test. */ + info[i].indic_category() = OT_H; + _hb_glyph_info_clear_ligated_and_multiplied (&info[i]); + } + } + + /* 4. Final reordering: * * After the localized forms and basic shaping forms GSUB features have been commit 39c8201f8e361e8c0f23f07bf20124ccadc6086c Author: Behdad Esfahbod <[email protected]> Date: Fri Jun 6 17:19:35 2014 -0400 [indic] Improve base re-finding No test numbers change. diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index e996967..81f4c61 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -1353,11 +1353,10 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, break; } if (base == end && start < base && - info[base - 1].indic_category() != OT_ZWJ) + is_one_of (info[base - 1], FLAG (OT_ZWJ))) base--; while (start < base && - (info[base].indic_category() == OT_H || - info[base].indic_category() == OT_N)) + is_one_of (info[base], (FLAG (OT_N) | HALANT_OR_COENG_FLAGS))) base--; commit c04d5f0dd24d0ed9560fb9aebb5561ce946743c3 Author: Behdad Esfahbod <[email protected]> Date: Fri Jun 6 17:02:39 2014 -0400 [indic] Minor diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc index 4b12220..e996967 100644 --- a/src/hb-ot-shape-complex-indic.cc +++ b/src/hb-ot-shape-complex-indic.cc @@ -1383,7 +1383,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, if (buffer->props.script != HB_SCRIPT_MALAYALAM && buffer->props.script != HB_SCRIPT_TAMIL) { while (new_pos > start && - !(is_one_of (info[new_pos], (FLAG (OT_M) | FLAG (OT_H) | FLAG (OT_Coeng))))) + !(is_one_of (info[new_pos], (FLAG (OT_M) | HALANT_OR_COENG_FLAGS)))) new_pos--; /* If we found no Halant we are done. _______________________________________________ HarfBuzz mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/harfbuzz
