From e05a999495e6575f7cebd7f35db087d964f11ef6 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 15 Nov 2012 16:23:21 -0800 Subject: [PATCH] Add hb_face_[sg]et_glyph_count() --- src/hb-font-private.hh | 9 +++++++++ src/hb-font.cc | 29 ++++++++++++++++++++++++++++- src/hb-font.h | 7 +++++++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/hb-font-private.hh b/src/hb-font-private.hh index b6dafbf47..48fbb0ee5 100644 --- a/src/hb-font-private.hh +++ b/src/hb-font-private.hh @@ -100,6 +100,7 @@ struct hb_face_t { unsigned int index; mutable unsigned int upem; + mutable unsigned int num_glyphs; struct hb_shaper_data_t shaper_data; @@ -130,8 +131,16 @@ struct hb_face_t { return upem; } + inline unsigned int get_num_glyphs (void) const + { + if (unlikely (num_glyphs == (unsigned int) -1)) + load_num_glyphs (); + return num_glyphs; + } + private: HB_INTERNAL void load_upem (void) const; + HB_INTERNAL void load_num_glyphs (void) const; }; #define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS diff --git a/src/hb-font.cc b/src/hb-font.cc index 062703256..b59fdebae 100644 --- a/src/hb-font.cc +++ b/src/hb-font.cc @@ -34,6 +34,7 @@ #include "hb-blob.h" #include "hb-open-file-private.hh" #include "hb-ot-head-table.hh" +#include "hb-ot-maxp-table.hh" #include "hb-cache-private.hh" @@ -520,6 +521,7 @@ static const hb_face_t _hb_face_nil = { 0, /* index */ 1000, /* upem */ + 0, /* num_glyphs */ { #define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INVALID, @@ -549,6 +551,7 @@ hb_face_create_for_tables (hb_reference_table_func_t reference_table_func, face->destroy = destroy; face->upem = 0; + face->num_glyphs = (unsigned int) -1; return face; } @@ -736,7 +739,6 @@ hb_face_get_upem (hb_face_t *face) return face->get_upem (); } - void hb_face_t::load_upem (void) const { @@ -746,6 +748,31 @@ hb_face_t::load_upem (void) const hb_blob_destroy (head_blob); } +void +hb_face_set_glyph_count (hb_face_t *face, + unsigned int glyph_count) +{ + if (hb_object_is_inert (face)) + return; + + face->num_glyphs = glyph_count; +} + +unsigned int +hb_face_get_glyph_count (hb_face_t *face) +{ + return face->get_num_glyphs (); +} + +void +hb_face_t::load_num_glyphs (void) const +{ + hb_blob_t *maxp_blob = OT::Sanitizer::sanitize (reference_table (HB_OT_TAG_maxp)); + const OT::maxp *maxp_table = OT::Sanitizer::lock_instance (maxp_blob); + num_glyphs = maxp_table->get_num_glyphs (); + hb_blob_destroy (maxp_blob); +} + /* * hb_font_t diff --git a/src/hb-font.h b/src/hb-font.h index d796856f3..88d489551 100644 --- a/src/hb-font.h +++ b/src/hb-font.h @@ -105,6 +105,13 @@ hb_face_set_upem (hb_face_t *face, unsigned int hb_face_get_upem (hb_face_t *face); +void +hb_face_set_glyph_count (hb_face_t *face, + unsigned int glyph_count); + +unsigned int +hb_face_get_glyph_count (hb_face_t *face); + /* * hb_font_funcs_t