[HarfBuzz] harfbuzz-ng: Branch 'master'

Behdad Esfahbod behdad at kemper.freedesktop.org
Wed Jul 25 15:39:00 PDT 2012


 src/hb-ot-layout-gpos-table.hh |   10 +++++-----
 src/hb-ot-layout-private.hh    |   23 +++++++++++++++++++++--
 2 files changed, 26 insertions(+), 7 deletions(-)

New commits:
commit a3313e54008167e415b72c780ca7b9cda958d07e
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Wed Jul 25 18:37:51 2012 -0400

    [GPOS] Fix MarkMarkPos applied to results of MultipleSubst
    
    This was broken as a result of 7b84c536c10ab90ed96a033d88e9ad232d46c5b8.
    As Khaled reported, MarkMark positioning was broken with glyphs
    resulting from a MultipleSubst.  Fixed.  Test with the ALLAH character
    in Amiri.

diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh
index e95aa3e..5b71407 100644
--- a/src/hb-ot-layout-gpos-table.hh
+++ b/src/hb-ot-layout-gpos-table.hh
@@ -1169,11 +1169,11 @@ struct MarkMarkPosFormat1
     unsigned int j = skippy_iter.idx;
 
     /* Two marks match only if they belong to the same base, or same component
-     * of the same ligature.  That is, the component numbers must match, and
-     * if those are non-zero, the ligid number should also match. */
-    if ((get_lig_comp (c->buffer->info[j]) != get_lig_comp (c->buffer->cur())) ||
-	(get_lig_comp (c->buffer->info[j]) > 0 &&
-	 get_lig_id (c->buffer->info[j]) != get_lig_id (c->buffer->cur())))
+     * of the same ligature.  That is, the lig_id numbers must match, and
+     * if those are non-zero, the lig_comp number should also match. */
+    if ((get_lig_id (c->buffer->info[j]) != get_lig_id (c->buffer->cur())) ||
+	(get_lig_id (c->buffer->info[j]) > 0 &&
+	 get_lig_comp (c->buffer->info[j]) != get_lig_comp (c->buffer->cur())))
       return TRACE_RETURN (false);
 
     unsigned int mark2_index = (this+mark2Coverage) (c->buffer->info[j].codepoint);
diff --git a/src/hb-ot-layout-private.hh b/src/hb-ot-layout-private.hh
index 7a1c7e3..ba375aa 100644
--- a/src/hb-ot-layout-private.hh
+++ b/src/hb-ot-layout-private.hh
@@ -68,8 +68,27 @@ _hb_ot_layout_skip_mark (hb_face_t    *face,
  * GSUB/GPOS
  */
 
-/* unique ligature id */
-/* component number in the ligature (0 = base) */
+/* lig_id / lig_comp
+ *
+ * When a ligature is formed:
+ *
+ *   - The ligature glyph and any marks in between all get a unique lig_id,
+ *   - The ligature glyph will get lig_comp = 0
+ *   - The marks get lig_comp > 0, reflecting which component of the ligature
+ *     they were applied to.
+ *   - This is used in GPOS to attach marks to the right component of a ligature
+ *     in MarkLigPos.
+ *
+ * When a multiple-substitution is done:
+ *
+ *   - All resulting glyphs will have lig_id = 0,
+ *   - The resulting glyphs will have lig_comp = 0, 1, 2, ... respectively.
+ *   - This is used in GPOS to attack marks to the first component of a
+ *     multiple substitution in MarkBasePos.
+ *
+ * The numbers are also used in GPOS to do mark-to-mark positioning only
+ * to marks that belong to the same component of a ligature in MarkMarPos.
+ */
 static inline void
 set_lig_props (hb_glyph_info_t &info, unsigned int lig_id, unsigned int lig_comp)
 {



More information about the HarfBuzz mailing list