[OTLayout] Implement GPOS collect_glyphs()
authorBehdad Esfahbod <behdad@behdad.org>
Sat, 24 Nov 2012 06:38:41 +0000 (01:38 -0500)
committerBehdad Esfahbod <behdad@behdad.org>
Sat, 24 Nov 2012 06:38:41 +0000 (01:38 -0500)
src/hb-ot-layout-gpos-table.hh
src/hb-ot-layout.cc

index e0b8913..c2e5df0 100644 (file)
@@ -419,6 +419,12 @@ struct MarkArray : ArrayOf<MarkRecord>     /* Array of MarkRecords--in Coverage orde
 
 struct SinglePosFormat1
 {
+  inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    TRACE_COLLECT_GLYPHS (this);
+    (this+coverage).add_coverage (&c->input);
+  }
+
   inline const Coverage &get_coverage (void) const
   {
     return this+coverage;
@@ -458,6 +464,12 @@ struct SinglePosFormat1
 
 struct SinglePosFormat2
 {
+  inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    TRACE_COLLECT_GLYPHS (this);
+    (this+coverage).add_coverage (&c->input);
+  }
+
   inline const Coverage &get_coverage (void) const
   {
     return this+coverage;
@@ -548,6 +560,23 @@ struct PairSet
 {
   friend struct PairPosFormat1;
 
+  inline void collect_glyphs (hb_collect_glyphs_context_t *c,
+                             const ValueFormat *valueFormats) const
+  {
+    TRACE_COLLECT_GLYPHS (this);
+    unsigned int len1 = valueFormats[0].get_len ();
+    unsigned int len2 = valueFormats[1].get_len ();
+    unsigned int record_size = USHORT::static_size * (1 + len1 + len2);
+
+    const PairValueRecord *record = CastP<PairValueRecord> (array);
+    unsigned int count = len;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      c->input.add (record->secondGlyph);
+      record = &StructAtOffset<PairValueRecord> (record, record_size);
+    }
+  }
+
   inline bool apply (hb_apply_context_t *c,
                     const ValueFormat *valueFormats,
                     unsigned int pos) const
@@ -557,8 +586,8 @@ struct PairSet
     unsigned int len2 = valueFormats[1].get_len ();
     unsigned int record_size = USHORT::static_size * (1 + len1 + len2);
 
-    unsigned int count = len;
     const PairValueRecord *record = CastP<PairValueRecord> (array);
+    unsigned int count = len;
     for (unsigned int i = 0; i < count; i++)
     {
       if (c->buffer->info[pos].codepoint == record->secondGlyph)
@@ -606,6 +635,15 @@ struct PairSet
 
 struct PairPosFormat1
 {
+  inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    TRACE_COLLECT_GLYPHS (this);
+    (this+coverage).add_coverage (&c->input);
+    unsigned int count = pairSet.len;
+    for (unsigned int i = 0; i < count; i++)
+      (this+pairSet[i]).collect_glyphs (c, &valueFormat1);
+  }
+
   inline const Coverage &get_coverage (void) const
   {
     return this+coverage;
@@ -660,6 +698,24 @@ struct PairPosFormat1
 
 struct PairPosFormat2
 {
+  inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    TRACE_COLLECT_GLYPHS (this);
+    /* (this+coverage).add_coverage (&c->input); // Don't need this. */
+
+    /* TODO only add values for pairs that have nonzero adjustments. */
+
+    unsigned int count1 = class1Count;
+    const ClassDef &klass1 = this+classDef1;
+    for (unsigned int i = 0; i < count1; i++)
+      klass1.add_class (&c->input, i);
+
+    unsigned int count2 = class2Count;
+    const ClassDef &klass2 = this+classDef2;
+    for (unsigned int i = 0; i < count2; i++)
+      klass2.add_class (&c->input, i);
+  }
+
   inline const Coverage &get_coverage (void) const
   {
     return this+coverage;
@@ -800,6 +856,12 @@ struct EntryExitRecord
 
 struct CursivePosFormat1
 {
+  inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    TRACE_COLLECT_GLYPHS (this);
+    (this+coverage).add_coverage (&c->input);
+  }
+
   inline const Coverage &get_coverage (void) const
   {
     return this+coverage;
@@ -940,6 +1002,14 @@ typedef AnchorMatrix BaseArray;           /* base-major--
 
 struct MarkBasePosFormat1
 {
+  inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    TRACE_COLLECT_GLYPHS (this);
+    (this+markCoverage).add_coverage (&c->input);
+    (this+baseCoverage).add_coverage (&c->input);
+    /* TODO only add combinations that have nonzero adjustment. */
+  }
+
   inline const Coverage &get_coverage (void) const
   {
     return this+markCoverage;
@@ -1036,6 +1106,14 @@ typedef OffsetListOf<LigatureAttach> LigatureArray;
 
 struct MarkLigPosFormat1
 {
+  inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    TRACE_COLLECT_GLYPHS (this);
+    (this+markCoverage).add_coverage (&c->input);
+    (this+ligatureCoverage).add_coverage (&c->input);
+    /* TODO only add combinations that have nonzero adjustment. */
+  }
+
   inline const Coverage &get_coverage (void) const
   {
     return this+markCoverage;
@@ -1144,6 +1222,14 @@ typedef AnchorMatrix Mark2Array; /* mark2-major--
 
 struct MarkMarkPosFormat1
 {
+  inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
+  {
+    TRACE_COLLECT_GLYPHS (this);
+    (this+mark1Coverage).add_coverage (&c->input);
+    (this+mark2Coverage).add_coverage (&c->input);
+    /* TODO only add combinations that have nonzero adjustment. */
+  }
+
   inline const Coverage &get_coverage (void) const
   {
     return this+mark1Coverage;
@@ -1357,6 +1443,13 @@ struct PosLookup : Lookup
   template <typename context_t>
   static inline typename context_t::return_t process_recurse_func (context_t *c, unsigned int lookup_index);
 
+  inline hb_collect_glyphs_context_t::return_t collect_glyphs_lookup (hb_collect_glyphs_context_t *c) const
+  {
+    TRACE_COLLECT_GLYPHS (this);
+    c->set_recurse_func (process_recurse_func<hb_collect_glyphs_context_t>);
+    return TRACE_RETURN (process (c));
+  }
+
   template <typename set_t>
   inline void add_coverage (set_t *glyphs) const
   {
index d345ba6..022460a 100644 (file)
@@ -412,18 +412,19 @@ hb_ot_layout_lookup_collect_glyphs (hb_face_t    *face,
 {
   if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return;
 
-//  OT::hb_collect_glyphs_context_t c (face, glyphs_before, glyphs_input, glyphs_after, glyphs_output);
+  OT::hb_collect_glyphs_context_t c (face, glyphs_before, glyphs_input, glyphs_after, glyphs_output);
 
   switch (table_tag) {
     case HB_OT_TAG_GSUB:
     {
-//      hb_ot_layout_from_face (face)->gsub->collect_glyphs_lookup (&c, lookup_index);
+      const OT::SubstLookup& l = hb_ot_layout_from_face (face)->gsub->get_lookup (lookup_index);
+      l.collect_glyphs_lookup (&c);
       return;
     }
     case HB_OT_TAG_GPOS:
     {
-//      hb_ot_layout_from_face (face)->gpos->collect_glyphs_lookup (&c, lookup_index);
-//      l.collect_glyphs_lookup (&c);
+      const OT::PosLookup& l = hb_ot_layout_from_face (face)->gpos->get_lookup (lookup_index);
+      l.collect_glyphs_lookup (&c);
       return;
     }
   }