From a973b5ce86051e8ef0d20df362db1a50488842ab Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 30 Jul 2012 01:46:34 -0400 Subject: [PATCH] [GSUB] Further adjustments to mark-attachment vs ligation interaction The d1d69ec52e75a78575b620a1c456d528b6078170 change broke Kannada badly, since it was ligating consonants, pushing matra out, and then ligating with the matra. Adjust for that. See comments. --- src/hb-ot-layout-gsub-table.hh | 11 ++++++++--- .../shaper-indic/indic/script-kannada/misc/misc.txt | 1 + 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index b5520edb3..4ad61a93b 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -522,7 +522,11 @@ struct Ligature * - Ligatures cannot be formed across glyphs attached to different components * of previous ligatures. Eg. the sequence is LAM,SHADDA,LAM,FATHA,HEH, and * LAM,LAM,HEH form a ligature, leaving SHADDA,FATHA next to eachother. - * However, it would be wrong to ligate that SHADDA,FATHA sequence. + * However, it would be wrong to ligate that SHADDA,FATHA sequence.o + * There is an exception to this: If a ligature tries ligating with marks that + * belong to it itself, go ahead, assuming that the font designer knows what + * they are doing (otherwise it can break Indic stuff when a matra wants to + * ligate with a conjunct...) */ bool is_mark_ligature = !!(c->property & HB_OT_LAYOUT_GLYPH_CLASS_MARK); @@ -543,6 +547,7 @@ struct Ligature unsigned int this_lig_id = get_lig_id (c->buffer->info[skippy_iter.idx]); unsigned int this_lig_comp = get_lig_comp (c->buffer->info[skippy_iter.idx]); + if (first_lig_id && first_lig_comp) { /* If first component was attached to a previous ligature component, * all subsequent components should be attached to the same ligature @@ -552,8 +557,8 @@ struct Ligature } else { /* If first component was NOT attached to a previous ligature component, * all subsequent components should also NOT be attached to any ligature - * component, otherwise we shouldn't ligate them. */ - if (this_lig_id && this_lig_comp) + * component, unless they are attached to the first component itself! */ + if (this_lig_id && this_lig_comp && (this_lig_id != first_lig_id)) return TRACE_RETURN (false); } diff --git a/test/shaping/texts/in-tree/shaper-indic/indic/script-kannada/misc/misc.txt b/test/shaping/texts/in-tree/shaper-indic/indic/script-kannada/misc/misc.txt index 5defb0ceb..19bec8c99 100644 --- a/test/shaping/texts/in-tree/shaper-indic/indic/script-kannada/misc/misc.txt +++ b/test/shaping/texts/in-tree/shaper-indic/indic/script-kannada/misc/misc.txt @@ -16,3 +16,4 @@ ಕೈ ಕೋ ಕ್ಷ +ಕ್ಷಿ