[subset] Move plan unicodes and gids population to end of _populate_unicodes...
diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc
index 4c273a6..04159ea 100644
--- a/src/hb-subset-plan.cc
+++ b/src/hb-subset-plan.cc
@@ -240,12 +240,12 @@
{
OT::cmap::accelerator_t cmap;
cmap.init (plan->source);
- constexpr static const int size_threshold = 65000;
+ constexpr static const int size_threshold = 4000;
if (unicodes->get_population () < size_threshold && glyphs->is_empty ())
{
// This is the fast path if it's anticipated that size of unicodes
- // is << then the number of codepoints in the font.
+ // is << than the number of codepoints in the font.
for (hb_codepoint_t cp : *unicodes)
{
hb_codepoint_t gid;
@@ -254,36 +254,37 @@
DEBUG_MSG(SUBSET, nullptr, "Drop U+%04X; no gid", cp);
continue;
}
- plan->unicodes->add (cp);
+
plan->codepoint_to_glyph->set (cp, gid);
- plan->_glyphset_gsub->add (gid);
}
cmap.fini ();
- return;
+ } else {
+ hb_map_t unicode_glyphid_map;
+ cmap.collect_mapping (hb_set_get_empty (), &unicode_glyphid_map);
+ cmap.fini ();
+
+ for (hb_pair_t<hb_codepoint_t, hb_codepoint_t> cp_gid :
+ + unicode_glyphid_map.iter ())
+ {
+ if (!unicodes->has (cp_gid.first) && !glyphs->has (cp_gid.second))
+ continue;
+
+ plan->codepoint_to_glyph->set (cp_gid.first, cp_gid.second);
+ }
+
+ // Add gids which where requested, but not mapped in cmap
+ // TODO(garretrieger): once https://github.com/harfbuzz/harfbuzz/issues/3169
+ // is implemented, this can be done with union and del_range
+ for (hb_codepoint_t gid : glyphs->iter ())
+ {
+ if (gid >= plan->source->get_num_glyphs ())
+ break;
+ plan->_glyphset_gsub->add (gid);
+ }
}
- hb_map_t unicode_glyphid_map;
- cmap.collect_mapping (hb_set_get_empty (), &unicode_glyphid_map);
- cmap.fini ();
-
- for (hb_pair_t<hb_codepoint_t, hb_codepoint_t> cp_gid :
- + unicode_glyphid_map.iter ())
- {
- if (!unicodes->has (cp_gid.first) && !glyphs->has (cp_gid.second))
- continue;
-
- plan->unicodes->add (cp_gid.first);
- plan->codepoint_to_glyph->set (cp_gid.first, cp_gid.second);
- plan->_glyphset_gsub->add (cp_gid.second);
- }
-
- // Add gids which where requested, but not mapped in cmap
- for (hb_codepoint_t gid : glyphs->iter ())
- {
- if (gid >= plan->source->get_num_glyphs ())
- break;
- plan->_glyphset_gsub->add (gid);
- }
+ + plan->codepoint_to_glyph->keys () | hb_sink (plan->unicodes);
+ + plan->codepoint_to_glyph->values () | hb_sink (plan->_glyphset_gsub);
}
static void