[subset-accelerator] Cache gid-to-unicodes

This commit is contained in:
Behdad Esfahbod 2022-12-02 15:50:52 -07:00
parent 10c8fc5553
commit 7d6893a803
2 changed files with 23 additions and 4 deletions

View File

@ -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<hb_tag_t, hb::unique_ptr<hb_blob_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 ();
}
};

View File

@ -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);
}