From 374960681e2e36d0e4032623d8cb92a7910baf71 Mon Sep 17 00:00:00 2001 From: Owen Taylor Date: Sat, 26 Jul 2003 13:50:23 +0000 Subject: [PATCH] If applying a ligature lookup makes adjacent two glyphs that were not Sat Jul 26 09:41:22 2003 Owen Taylor * pango/opentype/ftxgsub.c (Lookup_LigatureSubst): If applying a ligature lookup makes adjacent two glyphs that were not originally adjacent, avoid making subsequent ligatures between those glyphs. (From FreeType, Werner Lemberg, 2001-08-22, 2001-08-23) --- src/ftxgsub.c | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/src/ftxgsub.c b/src/ftxgsub.c index f56ae6f16..5ab955885 100644 --- a/src/ftxgsub.c +++ b/src/ftxgsub.c @@ -1194,7 +1194,8 @@ FT_UShort index, property; FT_Error error; FT_UShort numlig, i, j, is_mark, first_is_mark = FALSE; - FT_UShort* s_in; + FT_UShort first_ligID, first_comp; + FT_UShort *s_in, *lig_in, *comp_in; FT_UShort* c; TTO_Ligature* lig; @@ -1222,8 +1223,12 @@ if ( in->pos + lig->ComponentCount > in->length ) continue; /* Not enough glyphs in input */ - s_in = &in->string[in->pos]; - c = lig->Component; + s_in = &in->string[in->pos]; + lig_in = &in->ligIDs[in->pos]; + comp_in = &in->components[in->pos]; + first_ligID = *lig_in; + first_comp = *comp_in; + c = lig->Component; is_mark = first_is_mark; @@ -1243,6 +1248,26 @@ break; } + /* don't apply a ligature lookup to glyphs with different + ligature IDs. Example: + + ' + ^' ' ^ + f ^ l ' -> fl ^ ' -> fl but not fl ^ -> fl */ + + if ( first_ligID != lig_in[j] ) + break; + + /* don't apply a ligature lookup to glyphs with different + component values. Example: + + ' + ^' ' ^ + f ^ f ' l -> ffl ^ ' -> ffl but not ffl ^ -> ffl */ + + if ( first_comp != comp_in[j] ) + break; + if ( !( property == TTO_MARK || property & IGNORE_SPECIAL_MARKS ) ) is_mark = FALSE;