From 3608a6847e7b7eb4206df049158513a085810afd Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 12 May 2014 13:46:29 -0400 Subject: [PATCH] [ot] Hook up cmap table to hb_ot_font_funcs() --- src/hb-ot-cmap-table.hh | 10 +++++++--- src/hb-ot-font.cc | 33 +++++++++++++++++++-------------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index e02c23451..f47285f0e 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 d2f02a2d6..669a2dbfd 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::lock_instance (ot_font->hmtx_blob); + ot_font->cmap_blob = OT::Sanitizer::sanitize (font->face->reference_table (HB_OT_TAG_cmap)); + const OT::cmap *cmap = OT::Sanitizer::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)