Tue Jul 29 09:58:13 2003 Owen Taylor * pango/opentype/ftxgdef.c (Check_Property): Rewrite handling of IGNORE_SPECIAL_MARKS to be properly "ignore marks of attachment type different than specified. (#118456, Kailash C. Chowksey) Index: ftxgdef.c =================================================================== RCS file: /cvs/gnome/pango/pango/opentype/ftxgdef.c,v retrieving revision 1.8 diff -u -p -r1.8 ftxgdef.c --- ftxgdef.c 11 Jan 2003 00:16:26 -0000 1.8 +++ ftxgdef.c 29 Jul 2003 14:12:06 -0000 @@ -1166,20 +1166,39 @@ if ( gdef ) { + FT_UShort basic_glyph_class; + FT_UShort desired_attachment_class; + error = TT_GDEF_Get_Glyph_Property( gdef, index, property ); if ( error ) return error; - if ( flags & IGNORE_SPECIAL_MARKS ) - { - /* This is OpenType 1.2 */ + /* If the glyph was found in the MarkAttachmentClass table, + * then that class value is the high byte of the result, + * otherwise the low byte contains the basic type of the glyph + * as defined by the GlyphClassDef table. + */ + if ( *property & IGNORE_SPECIAL_MARKS ) + basic_glyph_class = TTO_MARK; + else + basic_glyph_class = *property; - if ( (flags & 0xFF00) != *property ) - return TTO_Err_Not_Covered; - } - else { - if ( flags & *property ) - return TTO_Err_Not_Covered; + /* Return Not_Covered, if, for example, basic_glyph_class + * is TTO_LIGATURE and LookFlags includes IGNORE_LIGATURES + */ + if ( flags & basic_glyph_class ) + return TTO_Err_Not_Covered; + + /* The high byte of LookupFlags has the meaning + * "ignore marks of attachment type different than + * the attachment type specified." + */ + desired_attachment_class = flags & IGNORE_SPECIAL_MARKS; + if ( desired_attachment_class ) + { + if ( basic_glyph_class == TTO_MARK && + *property != desired_attachment_class ) + return TTO_Err_Not_Covered; } }