[pango/harfbuzz-ng: 15/17] [GSUB] ContextSubst format 1



commit 9ca1c677b6f9e4329bbf9efc826621845b12b879
Author: Behdad Esfahbod <behdad behdad org>
Date:   Fri May 8 19:09:17 2009 -0400

    [GSUB] ContextSubst format 1
---
 pango/opentype/hb-ot-layout-gsub-private.h |   52 ++++++++++++++++++++++++----
 1 files changed, 45 insertions(+), 7 deletions(-)

diff --git a/pango/opentype/hb-ot-layout-gsub-private.h b/pango/opentype/hb-ot-layout-gsub-private.h
index 14519e9..653e0b5 100644
--- a/pango/opentype/hb-ot-layout-gsub-private.h
+++ b/pango/opentype/hb-ot-layout-gsub-private.h
@@ -568,9 +568,6 @@ DEFINE_NULL (LigatureSubst, 2);
 
 
 struct SubstLookupRecord {
-  /* TODO */
-
-  private:
   USHORT	sequenceIndex;		/* Index into current glyph
 					 * sequence--first glyph = 0 */
   USHORT	lookupListIndex;	/* Lookup to apply to that
@@ -584,7 +581,36 @@ struct SubRule {
 
   private:
   DEFINE_ARRAY_TYPE (GlyphID, input, (glyphCount ? glyphCount - 1 : 0));
-  /* XXX */
+
+  inline bool substitute (SUBTABLE_SUBSTITUTE_ARGS_DEF) const {
+
+    unsigned int i, j;
+    unsigned int property;
+    unsigned int count = glyphCount;
+
+    if (HB_UNLIKELY (buffer->in_pos + count > buffer->in_length ||
+		     context_length < count))
+      return false; /* Not enough glyphs in input or context */
+
+    for (i = 1, j = buffer->in_pos + 1; i < count; i++, j++) {
+      while (!_hb_ot_layout_check_glyph_property (layout, IN_ITEM (j), lookup_flag, &property)) {
+	if (HB_UNLIKELY (j + count - i == buffer->in_length))
+	  return false;
+	j++;
+      }
+
+      if (HB_LIKELY (IN_GLYPH(j) != (*this)[i - 1]))
+        return false;
+    }
+
+    /*
+    return Do_ContextSubst( gsub, sr[k].GlyphCount,
+			    sr[k].SubstCount, sr[k].SubstLookupRecord,
+			    buffer,
+			    nesting_level );
+			    */
+  }
+
 
   private:
   USHORT	glyphCount;		/* Total number of glyphs in input
@@ -600,11 +626,23 @@ DEFINE_NULL_ASSERT_SIZE (SubRule, 4);
 
 struct SubRuleSet {
 
-  friend struct ChainSubstFormat1;
+  friend struct ContextSubstFormat1;
 
   private:
   DEFINE_OFFSET_ARRAY_TYPE (SubRule, subRule, subRuleCount);
 
+  inline bool substitute (SUBTABLE_SUBSTITUTE_ARGS_DEF) const {
+
+    unsigned int num_rules = get_len ();
+    for (unsigned int i = 0; i < num_rules; i++) {
+      const SubRule &rule = (*this)[i];
+      if (rule.substitute (SUBTABLE_SUBSTITUTE_ARGS))
+        return true;
+    }
+
+    return false;
+  }
+
   private:
   USHORT	subRuleCount;		/* Number of SubRule tables */
   Offset	subRule[];		/* Array of offsets to SubRule
@@ -633,8 +671,8 @@ struct ContextSubstFormat1 {
 
     unsigned int index = get_glyph_coverage (glyph_id);
 
-    //const SubRuleSet &lig_set = (*this)[index];
-    //return lig_set.substitute_ligature (SUBTABLE_SUBSTITUTE_ARGS, first_is_mark);
+    const SubRuleSet &rule_set = (*this)[index];
+    return rule_set.substitute (SUBTABLE_SUBSTITUTE_ARGS);
   }
 
   private:



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]