diff --git a/src/hb-subset-glyf.cc b/src/hb-subset-glyf.cc index b7412fbb32d770f1b83de69f7f774dac2fa625f5..c6e2b5dbd1a0f26c96416764b29e16897e259557 100644 --- a/src/hb-subset-glyf.cc +++ b/src/hb-subset-glyf.cc @@ -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().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; } diff --git a/src/hb-subset-glyf.hh b/src/hb-subset-glyf.hh index 035085f03970f7fe2c5eabe3c682094738553b36..dbdd3410d7c20ed2f9a9091487a90e1d0685f96d 100644 --- a/src/hb-subset-glyf.hh +++ b/src/hb-subset-glyf.hh @@ -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 */); diff --git a/src/hb-subset.cc b/src/hb-subset.cc index 73812b72d9e401fc88496e409418650d5c0bd717..cf8ac6cc1cccd0a8fd7003168e10e5389232c0af 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -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().sanitize (hb_face_reference_table (source, HB_OT_TAG_head)); + const OT::head *head = OT::Sanitizer::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