From f8f7bd2451eeafb57f5c80c7b4e88a1e50b97c4f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 31 May 2006 07:23:02 +0000 Subject: [PATCH] =?UTF-8?q?Bug=20336153=20=E2=80=93=20Mark=20to=20mark=20p?= =?UTF-8?q?ositioning=20(Lookup=20Type=206)=20isn't=20correct=20when?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2006-05-31 Behdad Esfahbod Bug 336153 – Mark to mark positioning (Lookup Type 6) isn't correct when using MarkAttchmentType Patch from Tin Myo Htet. * pango/opentype/harfbuzz-gpos.c (Lookup_MarkMarkPos): Ignore marks of non-matchin attachment type. --- src/harfbuzz-gpos.c | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/src/harfbuzz-gpos.c b/src/harfbuzz-gpos.c index a8e158abc..3461279fa 100644 --- a/src/harfbuzz-gpos.c +++ b/src/harfbuzz-gpos.c @@ -3006,7 +3006,7 @@ static FT_Error Lookup_MarkMarkPos( GPOS_Instance* gpi, FT_UShort context_length, int nesting_level ) { - FT_UShort j, mark1_index, mark2_index, property, class; + FT_UShort i, j, mark1_index, mark2_index, property, class; FT_Pos x_mark1_value, y_mark1_value, x_mark2_value, y_mark2_value; FT_Error error; @@ -3038,27 +3038,34 @@ static FT_Error Lookup_MarkMarkPos( GPOS_Instance* gpi, if ( error ) return error; - /* now we check the preceding glyph whether it is a suitable - mark glyph */ + /* now we search backwards for a suitable mark glyph until a non-mark + glyph */ if ( buffer->in_pos == 0 ) return HB_Err_Not_Covered; + i = 1; j = buffer->in_pos - 1; - error = HB_GDEF_Get_Glyph_Property( gpos->gdef, IN_GLYPH( j ), - &property ); - if ( error ) - return error; + while ( i <= buffer->in_pos ) + { + error = HB_GDEF_Get_Glyph_Property( gpos->gdef, IN_GLYPH( j ), + &property ); + if ( error ) + return error; - if ( flags & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) - { - if ( property != (flags & 0xFF00) ) - return HB_Err_Not_Covered; - } - else - { - if ( property != HB_GDEF_MARK ) + if ( !( property == HB_GDEF_MARK || property & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) ) return HB_Err_Not_Covered; + + if ( flags & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) + { + if ( property == (flags & 0xFF00) ) + break; + } + else + break; + + i++; + j--; } error = _HB_OPEN_Coverage_Index( &mmp->Mark2Coverage, IN_GLYPH( j ),