Merge pull request #4092 from harfbuzz/more-cmap-cache
[ot-font] Use the cmap cache more
diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh
index c4a0987..f5a03d2 100644
--- a/src/hb-ot-cmap-table.hh
+++ b/src/hb-ot-cmap-table.hh
@@ -31,6 +31,7 @@
#include "hb-ot-shaper-arabic-pua.hh"
#include "hb-open-type.hh"
#include "hb-set.hh"
+#include "hb-cache.hh"
/*
* cmap -- Character to Glyph Index Mapping
@@ -1841,6 +1842,8 @@
struct accelerator_t
{
+ using cache_t = hb_cache_t<21, 16, 8, true>;
+
accelerator_t (hb_face_t *face)
{
this->table = hb_sanitize_context_t ().reference_table<cmap> (face);
@@ -1895,14 +1898,6 @@
}
~accelerator_t () { this->table.destroy (); }
- bool get_nominal_glyph (hb_codepoint_t unicode,
- hb_codepoint_t *glyph) const
- {
- if (unlikely (!this->get_glyph_funcZ)) return false;
- return this->get_glyph_funcZ (this->get_glyph_data, unicode, glyph);
- }
-
- template <typename cache_t = void>
inline bool _cached_get (hb_codepoint_t unicode,
hb_codepoint_t *glyph,
cache_t *cache) const
@@ -1913,13 +1908,21 @@
*glyph = v;
return true;
}
- bool ret = this->get_glyph_funcZ (this->get_glyph_data, unicode, glyph);
+ bool ret = this->get_glyph_funcZ (this->get_glyph_data, unicode, glyph);
+
if (cache && ret)
- cache->set (unicode, *glyph);
+ cache->set (unicode, *glyph);
return ret;
}
- template <typename cache_t = void>
+ bool get_nominal_glyph (hb_codepoint_t unicode,
+ hb_codepoint_t *glyph,
+ cache_t *cache = nullptr) const
+ {
+ if (unlikely (!this->get_glyph_funcZ)) return 0;
+ return _cached_get (unicode, glyph, cache);
+ }
+
unsigned int get_nominal_glyphs (unsigned int count,
const hb_codepoint_t *first_unicode,
unsigned int unicode_stride,
@@ -1942,7 +1945,8 @@
bool get_variation_glyph (hb_codepoint_t unicode,
hb_codepoint_t variation_selector,
- hb_codepoint_t *glyph) const
+ hb_codepoint_t *glyph,
+ cache_t *cache = nullptr) const
{
switch (this->subtable_uvs->get_glyph_variant (unicode,
variation_selector,
@@ -1953,7 +1957,7 @@
case GLYPH_VARIANT_USE_DEFAULT: break;
}
- return get_nominal_glyph (unicode, glyph);
+ return get_nominal_glyph (unicode, glyph, cache);
}
void collect_unicodes (hb_set_t *out, unsigned int num_glyphs) const
diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc
index e03339d..42f3143 100644
--- a/src/hb-ot-font.cc
+++ b/src/hb-ot-font.cc
@@ -136,7 +136,7 @@
{
const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
const hb_ot_face_t *ot_face = ot_font->ot_face;
- return ot_face->cmap->get_nominal_glyph (unicode, glyph);
+ return ot_face->cmap->get_nominal_glyph (unicode, glyph, ot_font->cmap_cache);
}
static unsigned int
@@ -167,7 +167,9 @@
{
const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data;
const hb_ot_face_t *ot_face = ot_font->ot_face;
- return ot_face->cmap->get_variation_glyph (unicode, variation_selector, glyph);
+ return ot_face->cmap->get_variation_glyph (unicode,
+ variation_selector, glyph,
+ ot_font->cmap_cache);
}
static void