Update head table with loca format selected by glyf+loca subsetting.

This commit is contained in:
Garret Rieger 2018-02-09 12:52:08 -08:00
parent 335bbaa66f
commit 1582eabee6
3 changed files with 39 additions and 6 deletions

View File

@ -103,10 +103,8 @@ _hb_subset_glyf_and_loca (const OT::glyf::accelerator_t &glyf,
{
// TODO(grieger): Sanity check writes to make sure they are in-bounds.
// TODO(grieger): Sanity check allocation size for the new table.
// TODO(grieger): Subset loca simultaneously.
// TODO(grieger): Don't fail on bad offsets, just dump them.
// TODO(grieger): Support short loca output.
// TODO(grieger): Add a extra loca entry at the end.
unsigned int glyf_prime_size;
unsigned int loca_prime_size;
@ -150,7 +148,8 @@ _hb_subset_glyf_and_loca (const OT::glyf::accelerator_t &glyf,
bool
hb_subset_glyf_and_loca (hb_subset_plan_t *plan,
hb_face_t *face,
hb_blob_t **glyf_prime /* OUT */,
bool *use_short_loca, /* OUT */
hb_blob_t **glyf_prime, /* OUT */
hb_blob_t **loca_prime /* OUT */)
{
hb_blob_t *glyf_blob = OT::Sanitizer<OT::glyf>().sanitize (face->reference_table (HB_OT_TAG_glyf));
@ -161,7 +160,7 @@ hb_subset_glyf_and_loca (hb_subset_plan_t *plan,
bool result = _hb_subset_glyf_and_loca (glyf, glyf_data, plan->gids_to_retain, glyf_prime, loca_prime);
glyf.fini();
// TODO(grieger): Subset loca
*use_short_loca = false;
return result;
}

View File

@ -34,6 +34,7 @@
bool
hb_subset_glyf_and_loca (hb_subset_plan_t *plan,
hb_face_t *face,
bool *use_short_loca, /* OUT */
hb_blob_t **glyf_prime /* OUT */,
hb_blob_t **loca_prime /* OUT */);

View File

@ -253,6 +253,32 @@ hb_subset_face_add_table (hb_face_t *face, hb_tag_t tag, hb_blob_t *blob)
return true;
}
bool
_add_head_and_set_loca_version (hb_face_t *source, bool use_short_loca, hb_face_t *dest)
{
hb_blob_t *head_blob = OT::Sanitizer<OT::head>().sanitize (hb_face_reference_table (source, HB_OT_TAG_head));
const OT::head *head = OT::Sanitizer<OT::head>::lock_instance (head_blob);
if (head) {
OT::head *head_prime = (OT::head *) calloc (OT::head::static_size, 1);
memcpy (head_prime, head, OT::head::static_size);
head_prime->indexToLocFormat.set (use_short_loca ? 0 : 1);
hb_blob_t *head_prime_blob = hb_blob_create ((const char*) head_prime,
OT::head::static_size,
HB_MEMORY_MODE_WRITABLE,
head_prime,
free);
hb_subset_face_add_table (dest, HB_OT_TAG_head, head_prime_blob);
hb_blob_destroy (head_prime_blob);
}
hb_blob_destroy (head_blob);
return !head;
}
bool
_subset_glyf (hb_subset_plan_t *plan, hb_face_t *source, hb_face_t *dest)
{
@ -260,16 +286,20 @@ _subset_glyf (hb_subset_plan_t *plan, hb_face_t *source, hb_face_t *dest)
hb_blob_t *loca_prime = nullptr;
bool success = true;
bool use_short_loca = false;
// TODO(grieger): Migrate to subset function on the table like cmap.
if (hb_subset_glyf_and_loca (plan, source, &glyf_prime, &loca_prime)) {
if (hb_subset_glyf_and_loca (plan, source, &use_short_loca, &glyf_prime, &loca_prime)) {
hb_subset_face_add_table (dest, HB_OT_TAG_glyf, glyf_prime);
hb_subset_face_add_table (dest, HB_OT_TAG_loca, loca_prime);
success = success && _add_head_and_set_loca_version (source, use_short_loca, dest);
} else {
success = false;
}
hb_blob_destroy (loca_prime);
hb_blob_destroy (glyf_prime);
_add_head_and_set_loca_version (source, use_short_loca, dest);
return success;
}
@ -284,8 +314,11 @@ _subset_table (hb_subset_plan_t *plan,
switch (tag) {
case HB_OT_TAG_glyf:
return _subset_glyf (plan, source, dest);
case HB_OT_TAG_head:
// SKIP head, it's handled by glyf
return true;
case HB_OT_TAG_loca:
// SKIP loca, it's handle by the glyf subsetter.
// SKIP loca, it's handle by glyf
return true;
case HB_OT_TAG_cmap:
// TODO(rsheeter): remove hb_subset_face_add_table