Rewrite handling of IGNORE_SPECIAL_MARKS to be properly "ignore marks of
Tue Jul 29 09:58:13 2003 Owen Taylor <otaylor@redhat.com>
* 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)
diff --git a/src/ftxgdef.c b/src/ftxgdef.c
index e7e02f1..c1d5b79 100644
--- a/src/ftxgdef.c
+++ b/src/ftxgdef.c
@@ -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;
}
}