From 7d6893a8034230458ba22f677d54e67c68b1508a Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 2 Dec 2022 15:50:52 -0700 Subject: [PATCH] [subset-accelerator] Cache gid-to-unicodes --- src/hb-subset-accelerator.hh | 15 +++++++++++---- src/hb-subset-plan.cc | 12 ++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/hb-subset-accelerator.hh b/src/hb-subset-accelerator.hh index 90f431caf..63ae6d77e 100644 --- a/src/hb-subset-accelerator.hh +++ b/src/hb-subset-accelerator.hh @@ -31,6 +31,7 @@ #include "hb.hh" #include "hb-map.hh" +#include "hb-multimap.hh" #include "hb-set.hh" extern HB_INTERNAL hb_user_data_key_t _hb_subset_accelerator_user_data_key; @@ -51,11 +52,12 @@ struct hb_subset_accelerator_t } static hb_subset_accelerator_t* create(const hb_map_t& unicode_to_gid_, - const hb_set_t& unicodes_, + const hb_multimap_t gid_to_unicodes_, + const hb_set_t& unicodes_, bool has_seac_) { hb_subset_accelerator_t* accel = (hb_subset_accelerator_t*) hb_malloc (sizeof(hb_subset_accelerator_t)); - new (accel) hb_subset_accelerator_t (unicode_to_gid_, unicodes_); + new (accel) hb_subset_accelerator_t (unicode_to_gid_, gid_to_unicodes_, unicodes_); accel->has_seac = has_seac_; return accel; } @@ -76,8 +78,9 @@ struct hb_subset_accelerator_t } hb_subset_accelerator_t (const hb_map_t& unicode_to_gid_, + const hb_multimap_t& gid_to_unicodes_, const hb_set_t& unicodes_) - : unicode_to_gid(unicode_to_gid_), unicodes(unicodes_), + : unicode_to_gid(unicode_to_gid_), gid_to_unicodes (gid_to_unicodes_), unicodes(unicodes_), cmap_cache(nullptr), destroy_cmap_cache(nullptr), has_seac(false), cff_accelerator(nullptr), destroy_cff_accelerator(nullptr) { sanitized_table_cache_lock.init (); } @@ -91,6 +94,7 @@ struct hb_subset_accelerator_t mutable hb_hashmap_t> sanitized_table_cache; const hb_map_t unicode_to_gid; + const hb_multimap_t gid_to_unicodes; const hb_set_t unicodes; // cmap @@ -106,7 +110,10 @@ struct hb_subset_accelerator_t bool in_error () const { - return unicode_to_gid.in_error() || unicodes.in_error () || sanitized_table_cache.in_error (); + return unicode_to_gid.in_error () || + gid_to_unicodes.in_error () || + unicodes.in_error () || + sanitized_table_cache.in_error (); } }; diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index ae169fb8e..bde77d557 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -27,6 +27,7 @@ #include "hb-subset-plan.hh" #include "hb-subset-accelerator.hh" #include "hb-map.hh" +#include "hb-multimap.hh" #include "hb-set.hh" #include "hb-ot-cmap-table.hh" @@ -930,8 +931,19 @@ hb_subset_plan_create_or_fail (hb_face_t *face, if (plan->attach_accelerator_data) { + hb_multimap_t gid_to_unicodes; + + hb_map_t &unicode_to_gid = *plan->codepoint_to_glyph; + + for (auto unicode : *plan->unicodes) + { + auto gid = unicode_to_gid[unicode]; + gid_to_unicodes.add (gid, unicode); + } + plan->inprogress_accelerator = hb_subset_accelerator_t::create (*plan->codepoint_to_glyph, + gid_to_unicodes, *plan->unicodes, plan->has_seac); }