[subset] Use gsub closure if ot layout is not being dropped.

This commit is contained in:
Garret Rieger 2018-06-07 14:32:34 -07:00
parent a5673da9be
commit feb23892a3
2 changed files with 26 additions and 4 deletions

View File

@ -973,8 +973,14 @@ hb_ot_layout_lookups_substitute_closure (hb_face_t *face,
do
{
glyphs_length = glyphs->get_population ();
for (hb_codepoint_t lookup_index = HB_SET_VALUE_INVALID; hb_set_next (lookups, &lookup_index);)
gsub.get_lookup (lookup_index).closure (&c, lookup_index);
if (lookups != nullptr)
{
for (hb_codepoint_t lookup_index = HB_SET_VALUE_INVALID; hb_set_next (lookups, &lookup_index);)
gsub.get_lookup (lookup_index).closure (&c, lookup_index);
} else {
for (unsigned int i = 0; i < gsub.get_lookup_count (); i++)
gsub.get_lookup (i).closure (&c, i);
}
} while (glyphs_length != glyphs->get_population ());
}

View File

@ -53,9 +53,22 @@ _add_gid_and_children (const OT::glyf::accelerator_t &glyf,
}
}
static void
_gsub_closure (hb_face_t *face, hb_set_t *gids_to_retain)
{
// TODO(grieger): This uses all lookups, instead collect
// the set of lookups that are relevant.
// See fontTools implementation.
hb_ot_layout_lookups_substitute_closure (face,
nullptr,
gids_to_retain);
}
static void
_populate_gids_to_retain (hb_face_t *face,
const hb_set_t *unicodes,
bool close_over_gsub,
hb_set_t *unicodes_to_retain,
hb_map_t *codepoint_to_glyph,
hb_vector_t<hb_codepoint_t> *glyphs)
@ -82,10 +95,12 @@ _populate_gids_to_retain (hb_face_t *face,
initial_gids_to_retain->add (gid);
}
if (close_over_gsub)
// Add all glyphs needed for GSUB substitutions.
_gsub_closure (face, initial_gids_to_retain);
// Populate a full set of glyphs to retain by adding all referenced
// composite glyphs.
// TODO expand with glyphs reached by G*
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))
@ -141,6 +156,7 @@ hb_subset_plan_create (hb_face_t *face,
_populate_gids_to_retain (face,
input->unicodes,
!plan->drop_ot_layout,
plan->unicodes,
plan->codepoint_to_glyph,
&plan->glyphs);