Fix MarkMark issue with ligid and components
authorBehdad Esfahbod <behdad@behdad.org>
Thu, 5 Nov 2009 21:16:14 +0000 (16:16 -0500)
committerBehdad Esfahbod <behdad@behdad.org>
Thu, 5 Nov 2009 21:16:14 +0000 (16:16 -0500)
src/hb-ot-layout-gpos-private.hh
src/hb-ot-layout-gsub-private.hh

index 2c88f53..3159ab1 100644 (file)
@@ -1065,9 +1065,9 @@ struct MarkLigPosFormat1
      * is identical to the ligature ID of the found ligature.  If yes, we
      * can directly use the component index.  If not, we attach the mark
      * glyph to the last component of the ligature. */
-    if (IN_LIGID (j) == IN_LIGID (buffer->in_pos))
+    if (IN_LIGID (j) && IN_LIGID (j) == IN_LIGID (buffer->in_pos) && IN_COMPONENT (buffer->in_pos))
     {
-      comp_index = IN_COMPONENT (buffer->in_pos);
+      comp_index = IN_COMPONENT (buffer->in_pos) - 1;
       if (comp_index >= comp_count)
        comp_index = comp_count - 1;
     }
@@ -1164,9 +1164,10 @@ struct MarkMarkPosFormat1
       return false;
 
     /* Two marks match only if they belong to the same base, or same component
-     * of the same ligature. */
-    if (IN_LIGID (j) != IN_LIGID (buffer->in_pos) ||
-        IN_COMPONENT (j) != IN_COMPONENT (buffer->in_pos))
+     * of the same ligature.  That is, the component numbers must match, and
+     * if those are non-zero, the ligid number should also match. */
+    if ((IN_COMPONENT (j) != IN_COMPONENT (buffer->in_pos)) ||
+       (IN_COMPONENT (j) && IN_LIGID (j) != IN_LIGID (buffer->in_pos)))
       return false;
 
     unsigned int mark2_index = (this+mark2Coverage) (IN_GLYPH (j));
index c240e86..eb74c03 100644 (file)
@@ -406,14 +406,10 @@ struct Ligature
       for ( i = 1; i < count; i++ )
       {
        while (_hb_ot_layout_skip_mark (context->face, IN_CURINFO (), lookup_flag, NULL))
-         _hb_buffer_add_output_glyph (buffer, IN_CURGLYPH (), i - 1, lig_id);
+         _hb_buffer_add_output_glyph (buffer, IN_CURGLYPH (), i, lig_id);
 
        (buffer->in_pos)++;
       }
-
-      /* TODO We should possibly reassign lig_id and component for any
-       * components of a previous ligature that s now being removed as part of
-       * this ligature. */
     }
 
     return true;