[pango/harfbuzz-ng] [HB] Implement get_lig_carets()



commit fb8da04aac1fe1b11b8a617342f1532e12c595db
Author: Behdad Esfahbod <behdad behdad org>
Date:   Tue May 26 12:40:10 2009 -0400

    [HB] Implement get_lig_carets()
---
 pango/opentype/hb-ot-layout-gdef-private.h |   57 ++++++++++++++++++++++------
 pango/opentype/hb-ot-layout.cc             |   17 ++++++--
 pango/opentype/hb-ot-layout.h              |    8 +++-
 pango/opentype/main.cc                     |    9 +----
 4 files changed, 66 insertions(+), 25 deletions(-)

diff --git a/pango/opentype/hb-ot-layout-gdef-private.h b/pango/opentype/hb-ot-layout-gdef-private.h
index d038098..d5dac9d 100644
--- a/pango/opentype/hb-ot-layout-gdef-private.h
+++ b/pango/opentype/hb-ot-layout-gdef-private.h
@@ -50,11 +50,16 @@ ASSERT_SIZE (AttachPoint, 2);
 
 struct AttachList
 {
-  inline void get_attach_points (hb_codepoint_t glyph_id,
+  inline bool get_attach_points (hb_codepoint_t glyph_id,
 				 unsigned int *point_count /* IN/OUT */,
 				 unsigned int *point_array /* OUT */) const
   {
     unsigned int index = (this+coverage) (glyph_id);
+    if (index == NOT_COVERED)
+    {
+      *point_count = 0;
+      return false;
+    }
     const AttachPoint &points = this+attachPoint[index];
 
     unsigned int count = MIN (points.len, *point_count);
@@ -62,6 +67,8 @@ struct AttachList
       point_array[i] = points[i];
 
     *point_count = points.len;
+
+    return true;
   }
 
   private:
@@ -157,11 +164,22 @@ ASSERT_SIZE (CaretValue, 2);
 
 struct LigGlyph
 {
-  friend struct LigCaretList;
+  inline void get_lig_carets (hb_ot_layout_t *layout,
+			      hb_codepoint_t glyph_id,
+			      unsigned int *caret_count /* IN/OUT */,
+			      int *caret_array /* OUT */) const
+  {
+
+    unsigned int count = MIN (carets.len, *caret_count);
+    for (unsigned int i = 0; i < count; i++)
+      caret_array[i] = (this+carets[i]).get_caret_value (layout, glyph_id);
+
+    *caret_count = carets.len;
+  }
 
   private:
   OffsetArrayOf<CaretValue>
-		caret;			/* Offset rrray of CaretValue tables
+		carets;			/* Offset rrray of CaretValue tables
 					 * --from beginning of LigGlyph table
 					 * --in increasing coordinate order */
 };
@@ -169,13 +187,20 @@ ASSERT_SIZE (LigGlyph, 2);
 
 struct LigCaretList
 {
-  friend struct GDEF;
-
-  private:
-  inline const LigGlyph& get_lig_glyph (hb_codepoint_t glyph_id)
+  inline bool get_lig_carets (hb_ot_layout_t *layout,
+			      hb_codepoint_t glyph_id,
+			      unsigned int *caret_count /* IN/OUT */,
+			      int *caret_array /* OUT */) const
   {
     unsigned int index = (this+coverage) (glyph_id);
-    return this+ligGlyph[index];
+    if (index == NOT_COVERED)
+    {
+      *caret_count = 0;
+      return false;
+    }
+    const LigGlyph &lig_glyph = this+ligGlyph[index];
+    lig_glyph.get_lig_carets (layout, glyph_id, caret_count, caret_array);
+    return true;
   }
 
   private:
@@ -207,20 +232,28 @@ struct GDEF
   STATIC_DEFINE_GET_FOR_DATA_CHECK_MAJOR_VERSION (GDEF, 1);
 
   inline bool has_glyph_classes () const { return glyphClassDef != 0; }
-  inline hb_ot_layout_class_t get_glyph_class (hb_codepoint_t glyph) const
+  inline hb_ot_layout_class_t get_glyph_class (hb_ot_layout_t *layout,
+					       hb_codepoint_t glyph) const
   { return (this+glyphClassDef).get_class (glyph); }
 
   inline bool has_mark_attachment_types () const { return markAttachClassDef != 0; }
-  inline hb_ot_layout_class_t get_mark_attachment_type (hb_codepoint_t glyph) const
+  inline hb_ot_layout_class_t get_mark_attachment_type (hb_ot_layout_t *layout,
+							hb_codepoint_t glyph) const
   { return (this+markAttachClassDef).get_class (glyph); }
 
   inline bool has_attach_points () const { return attachList != 0; }
-  inline void get_attach_points (hb_codepoint_t glyph_id,
+  inline bool get_attach_points (hb_ot_layout_t *layout,
+				 hb_codepoint_t glyph_id,
 				 unsigned int *point_count /* IN/OUT */,
 				 unsigned int *point_array /* OUT */) const
-  { (this+attachList).get_attach_points (glyph_id, point_count, point_array); }
+  { return (this+attachList).get_attach_points (glyph_id, point_count, point_array); }
 
   inline bool has_lig_carets () const { return ligCaretList != 0; }
+  inline bool get_lig_carets (hb_ot_layout_t *layout,
+			      hb_codepoint_t glyph_id,
+			      unsigned int *caret_count /* IN/OUT */,
+			      int *caret_array /* OUT */) const
+  { return (this+ligCaretList).get_lig_carets (layout, glyph_id, caret_count, caret_array); }
 
   private:
   FixedVersion	version;		/* Version of the GDEF table--initially
diff --git a/pango/opentype/hb-ot-layout.cc b/pango/opentype/hb-ot-layout.cc
index 5a30f94..8f53d46 100644
--- a/pango/opentype/hb-ot-layout.cc
+++ b/pango/opentype/hb-ot-layout.cc
@@ -140,11 +140,11 @@ _hb_ot_layout_get_glyph_property (hb_ot_layout_t *layout,
 
   /* TODO old harfbuzz doesn't always parse mark attachments as it says it was
    * introduced without a version bump, so it may not be safe */
-  klass = layout->gdef->get_mark_attachment_type (glyph);
+  klass = layout->gdef->get_mark_attachment_type (layout, glyph);
   if (klass)
     return klass << 8;
 
-  klass = layout->gdef->get_glyph_class (glyph);
+  klass = layout->gdef->get_glyph_class (layout, glyph);
 
   if (!klass && glyph < layout->new_gdef.len)
     klass = layout->new_gdef.klasses[glyph];
@@ -302,13 +302,22 @@ hb_ot_layout_build_glyph_classes (hb_ot_layout_t *layout,
     hb_ot_layout_set_glyph_class (layout, glyphs[i], (hb_ot_layout_glyph_class_t) klasses[i]);
 }
 
-void
+hb_bool_t
 hb_ot_layout_get_attach_points (hb_ot_layout_t *layout,
 				hb_codepoint_t  glyph,
 				unsigned int   *point_count /* IN/OUT */,
 				unsigned int   *point_array /* OUT */)
 {
-  layout->gdef->get_attach_points (glyph, point_count, point_array);
+  return layout->gdef->get_attach_points (layout, glyph, point_count, point_array);
+}
+
+hb_bool_t
+hb_ot_layout_get_lig_carets (hb_ot_layout_t *layout,
+			     hb_codepoint_t  glyph,
+			     unsigned int   *caret_count /* IN/OUT */,
+			     int            *caret_array /* OUT */)
+{
+  return layout->gdef->get_lig_carets (layout, glyph, caret_count, caret_array);
 }
 
 /*
diff --git a/pango/opentype/hb-ot-layout.h b/pango/opentype/hb-ot-layout.h
index 984243c..7759532 100644
--- a/pango/opentype/hb-ot-layout.h
+++ b/pango/opentype/hb-ot-layout.h
@@ -99,12 +99,18 @@ hb_ot_layout_build_glyph_classes (hb_ot_layout_t *layout,
 				  unsigned char  *klasses,
 				  uint16_t        count);
 
-void
+hb_bool_t
 hb_ot_layout_get_attach_points (hb_ot_layout_t *layout,
 				hb_codepoint_t  glyph,
 				unsigned int   *point_count /* IN/OUT */,
 				unsigned int   *point_array /* OUT */);
 
+hb_bool_t
+hb_ot_layout_get_lig_carets (hb_ot_layout_t *layout,
+			     hb_codepoint_t  glyph,
+			     unsigned int   *caret_count /* IN/OUT */,
+			     int            *caret_array /* OUT */);
+
 /*
  * GSUB/GPOS
  */
diff --git a/pango/opentype/main.cc b/pango/opentype/main.cc
index 11aa57d..1347cdf 100644
--- a/pango/opentype/main.cc
+++ b/pango/opentype/main.cc
@@ -159,15 +159,8 @@ main (int argc, char **argv)
 		  gdef.has_attach_points () ? "" : "no ");
 	printf ("    Has %slig carets\n",
 		  gdef.has_lig_carets () ? "" : "no ");
-
-	for (int glyph = 0; glyph < 1; glyph++)
-	  printf ("    glyph %d has class %d and mark attachment type %d\n",
-		  glyph,
-		  gdef.get_glyph_class (glyph),
-		  gdef.get_mark_attachment_type (glyph));
-
-	}
 	break;
+	}
       }
     }
   }



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