diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index 9491c7878..0e1966e98 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -103,7 +103,7 @@ struct SingleSubstFormat1 bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - const hb_set_t &glyphset = *c->plan->glyphset (); + const hb_set_t &glyphset = *c->plan->glyphset_gsub (); const hb_map_t &glyph_map = *c->plan->glyph_map; hb_codepoint_t delta = deltaGlyphID; @@ -203,7 +203,7 @@ struct SingleSubstFormat2 bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - const hb_set_t &glyphset = *c->plan->glyphset (); + const hb_set_t &glyphset = *c->plan->glyphset_gsub (); const hb_map_t &glyph_map = *c->plan->glyph_map; auto it = diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index 5ea51c4ab..c0aee1a2d 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -99,24 +99,21 @@ _remove_invalid_gids (hb_set_t *glyphs, } } -static hb_set_t * -_populate_gids_to_retain (hb_face_t *face, +static void +_populate_gids_to_retain (hb_subset_plan_t* plan, const hb_set_t *unicodes, const hb_set_t *input_glyphs_to_retain, - bool close_over_gsub, - hb_set_t *unicodes_to_retain, - hb_map_t *codepoint_to_glyph) + bool close_over_gsub) { OT::cmap::accelerator_t cmap; OT::glyf::accelerator_t glyf; OT::cff1::accelerator_t cff; - cmap.init (face); - glyf.init (face); - cff.init (face); + cmap.init (plan->source); + glyf.init (plan->source); + cff.init (plan->source); - hb_set_t *initial_gids_to_retain = hb_set_create (); - initial_gids_to_retain->add (0); // Not-def - hb_set_union (initial_gids_to_retain, input_glyphs_to_retain); + plan->_glyphset_gsub->add (0); // Not-def + hb_set_union (plan->_glyphset_gsub, input_glyphs_to_retain); hb_codepoint_t cp = HB_SET_VALUE_INVALID; while (unicodes->next (&cp)) @@ -127,38 +124,35 @@ _populate_gids_to_retain (hb_face_t *face, DEBUG_MSG(SUBSET, nullptr, "Drop U+%04X; no gid", cp); continue; } - unicodes_to_retain->add (cp); - codepoint_to_glyph->set (cp, gid); - initial_gids_to_retain->add (gid); + plan->unicodes->add (cp); + plan->codepoint_to_glyph->set (cp, gid); + plan->_glyphset_gsub->add (gid); } #ifndef HB_NO_SUBSET_LAYOUT if (close_over_gsub) // Add all glyphs needed for GSUB substitutions. - _gsub_closure (face, initial_gids_to_retain); + _gsub_closure (plan->source, plan->_glyphset_gsub); #endif + _remove_invalid_gids (plan->_glyphset_gsub, plan->source->get_num_glyphs ()); // Populate a full set of glyphs to retain by adding all referenced // composite glyphs. hb_codepoint_t gid = HB_SET_VALUE_INVALID; - hb_set_t *all_gids_to_retain = hb_set_create (); - while (initial_gids_to_retain->next (&gid)) + while (plan->_glyphset_gsub->next (&gid)) { - _add_gid_and_children (glyf, gid, all_gids_to_retain); + _add_gid_and_children (glyf, gid, plan->_glyphset); #ifndef HB_NO_SUBSET_CFF if (cff.is_valid ()) - _add_cff_seac_components (cff, gid, all_gids_to_retain); + _add_cff_seac_components (cff, gid, plan->_glyphset); #endif } - hb_set_destroy (initial_gids_to_retain); - _remove_invalid_gids (all_gids_to_retain, face->get_num_glyphs ()); + _remove_invalid_gids (plan->_glyphset, plan->source->get_num_glyphs ()); cff.fini (); glyf.fini (); cmap.fini (); - - return all_gids_to_retain; } static void @@ -248,15 +242,17 @@ hb_subset_plan_create (hb_face_t *face, _nameid_closure (face, plan->name_ids); plan->source = hb_face_reference (face); plan->dest = hb_face_builder_create (); + + plan->_glyphset = hb_set_create (); + plan->_glyphset_gsub = hb_set_create (); plan->codepoint_to_glyph = hb_map_create (); plan->glyph_map = hb_map_create (); plan->reverse_glyph_map = hb_map_create (); - plan->_glyphset = _populate_gids_to_retain (face, - input->unicodes, - input->glyphs, - !input->drop_tables->has (HB_OT_TAG_GSUB), - plan->unicodes, - plan->codepoint_to_glyph); + + _populate_gids_to_retain (plan, + input->unicodes, + input->glyphs, + !input->drop_tables->has (HB_OT_TAG_GSUB)); _create_old_gid_to_new_gid_map (face, input->retain_gids, @@ -287,6 +283,7 @@ hb_subset_plan_destroy (hb_subset_plan_t *plan) hb_map_destroy (plan->glyph_map); hb_map_destroy (plan->reverse_glyph_map); hb_set_destroy (plan->_glyphset); + hb_set_destroy (plan->_glyphset_gsub); free (plan); } diff --git a/src/hb-subset-plan.hh b/src/hb-subset-plan.hh index 6f65e773e..f0b8ddc2b 100644 --- a/src/hb-subset-plan.hh +++ b/src/hb-subset-plan.hh @@ -65,6 +65,7 @@ struct hb_subset_plan_t unsigned int _num_output_glyphs; hb_set_t *_glyphset; + hb_set_t *_glyphset_gsub; public: @@ -77,6 +78,15 @@ struct hb_subset_plan_t return _glyphset; } + /* + * The set of input glyph ids which will be retained in the subset. + */ + inline const hb_set_t * + glyphset_gsub () const + { + return _glyphset_gsub; + } + /* * The total number of output glyphs in the final subset. */