Rewrite handling of IGNORE_SPECIAL_MARKS to be properly "ignore marks of
authorOwen Taylor <otaylor@redhat.com>
Tue, 29 Jul 2003 14:21:54 +0000 (14:21 +0000)
committerOwen Taylor <otaylor@src.gnome.org>
Tue, 29 Jul 2003 14:21:54 +0000 (14:21 +0000)
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)

src/ftxgdef.c

index e7e02f1..c1d5b79 100644 (file)
 
     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 )
+      /* 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;
+
+      /* 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 )
       {
-        /* This is OpenType 1.2 */
-
-        if ( (flags & 0xFF00) != *property )
-          return TTO_Err_Not_Covered;
-      }
-      else {
-        if ( flags & *property )
-          return TTO_Err_Not_Covered;
+       if ( basic_glyph_class == TTO_MARK &&
+            *property != desired_attachment_class )
+         return TTO_Err_Not_Covered;
       }
     }