Bug 336153 – Mark to mark positioning (Lookup Type 6) isn't correct when
authorBehdad Esfahbod <behdad@gnome.org>
Wed, 31 May 2006 07:23:02 +0000 (07:23 +0000)
committerBehdad Esfahbod <behdad@src.gnome.org>
Wed, 31 May 2006 07:23:02 +0000 (07:23 +0000)
2006-05-31  Behdad Esfahbod  <behdad@gnome.org>

        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

index a8e158a..3461279 100644 (file)
@@ -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;
-
-  if ( flags & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS )
-  {
-    if ( property != (flags & 0xFF00) )
-      return HB_Err_Not_Covered;
-  }
-  else
+  while ( i <= buffer->in_pos )
   {
-    if ( property != HB_GDEF_MARK )
+    error = HB_GDEF_Get_Glyph_Property( gpos->gdef, IN_GLYPH( j ),
+                                       &property );
+    if ( error )
+      return error;
+
+    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 ),