[HarfBuzz] harfbuzz: Branch 'master'

Behdad Esfahbod behdad at kemper.freedesktop.org
Mon May 12 10:47:02 PDT 2014


 src/hb-ot-cmap-table.hh |   10 +++++++---
 src/hb-ot-font.cc       |   33 +++++++++++++++++++--------------
 2 files changed, 26 insertions(+), 17 deletions(-)

New commits:
commit 3608a6847e7b7eb4206df049158513a085810afd
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon May 12 13:46:29 2014 -0400

    [ot] Hook up cmap table to hb_ot_font_funcs()

diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh
index e02c234..f47285f 100644
--- a/src/hb-ot-cmap-table.hh
+++ b/src/hb-ot-cmap-table.hh
@@ -193,14 +193,18 @@ struct cmap
 {
   static const hb_tag_t tableTag	= HB_OT_TAG_cmap;
 
-  inline unsigned int find_subtable (unsigned int platform_id,
-				     unsigned int encoding_id) const
+  inline const CmapSubtable *find_subtable (unsigned int platform_id,
+					    unsigned int encoding_id) const
   {
     EncodingRecord key;
     key.platformID.set (platform_id);
     key.encodingID.set (encoding_id);
 
-    return encodingRecord.search (key);
+    int result = encodingRecord.search (key);
+    if (result == -1)
+      return NULL;
+
+    return &(this+encodingRecord[result].subtable);
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) {
diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc
index d2f02a2..669a2db 100644
--- a/src/hb-ot-font.cc
+++ b/src/hb-ot-font.cc
@@ -42,6 +42,9 @@ struct hb_ot_font_t
   unsigned int num_hmetrics;
   const OT::hmtx *hmtx;
   hb_blob_t *hmtx_blob;
+
+  const OT::CmapSubtable *cmap;
+  hb_blob_t *cmap_blob;
 };
 
 
@@ -69,15 +72,25 @@ _hb_ot_font_create (hb_font_t *font)
     free (ot_font);
     return NULL;
   }
-
   ot_font->hmtx = OT::Sanitizer<OT::hmtx>::lock_instance (ot_font->hmtx_blob);
 
+  ot_font->cmap_blob = OT::Sanitizer<OT::cmap>::sanitize (font->face->reference_table (HB_OT_TAG_cmap));
+  const OT::cmap *cmap = OT::Sanitizer<OT::cmap>::lock_instance (ot_font->cmap_blob);
+  const OT::CmapSubtable *subtable = NULL;
+
+  if (!subtable) subtable = cmap->find_subtable (0, 3);
+  if (!subtable) subtable = cmap->find_subtable (3, 1);
+  if (!subtable) subtable = &OT::Null(OT::CmapSubtable);
+
+  ot_font->cmap = subtable;
+
   return ot_font;
 }
 
 static void
 _hb_ot_font_destroy (hb_ot_font_t *ot_font)
 {
+  hb_blob_destroy (ot_font->cmap_blob);
   hb_blob_destroy (ot_font->hmtx_blob);
 
   free (ot_font);
@@ -93,24 +106,16 @@ hb_ot_get_glyph (hb_font_t *font HB_UNUSED,
 		 void *user_data HB_UNUSED)
 
 {
-#if 0
-  FT_Face ft_face = (FT_Face) font_data;
+  const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
 
-#ifdef HAVE_FT_FACE_GETCHARVARIANTINDEX
-  if (unlikely (variation_selector)) {
-    *glyph = FT_Face_GetCharVariantIndex (ft_face, unicode, variation_selector);
-    return *glyph != 0;
-  }
-#endif
+  if (unlikely (variation_selector))
+    return false;
 
-  *glyph = FT_Get_Char_Index (ft_face, unicode);
-  return *glyph != 0;
-#endif
-  return true;
+  return ot_font->cmap->get_glyph (unicode, glyph);
 }
 
 static hb_position_t
-hb_ot_get_glyph_h_advance (hb_font_t *font,
+hb_ot_get_glyph_h_advance (hb_font_t *font HB_UNUSED,
 			   void *font_data,
 			   hb_codepoint_t glyph,
 			   void *user_data HB_UNUSED)


More information about the HarfBuzz mailing list