[subset] For gsub subsetting only consider glyphs reachable via gsub closure.
This commit is contained in:
parent
c740c8636b
commit
0af9de13b7
@ -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 =
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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.
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user