From e3e0ac98238b78530a625a6b7e7647dbabbe1c4d Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Tue, 20 Feb 2018 14:07:40 -0800 Subject: [PATCH] [subset] Move glyf subsetting code into hb-ot-glyf-table.hh --- src/hb-ot-glyf-table.hh | 49 +++++++++++++++++++++++++++++++++++++++- src/hb-subset.cc | 50 +---------------------------------------- 2 files changed, 49 insertions(+), 50 deletions(-) diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index a73fd4aa..454b4e68 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -29,7 +29,9 @@ #include "hb-open-type-private.hh" #include "hb-ot-head-table.hh" - +#include "hb-subset-glyf.hh" +#include "hb-subset-plan.hh" +#include "hb-subset-private.hh" namespace OT { @@ -78,6 +80,51 @@ struct glyf return_trace (true); } + inline bool subset (hb_subset_plan_t *plan) const + { + hb_blob_t *glyf_prime = nullptr; + hb_blob_t *loca_prime = nullptr; + + bool success = true; + bool use_short_loca = false; + if (hb_subset_glyf_and_loca (plan, &use_short_loca, &glyf_prime, &loca_prime)) { + success = success && hb_subset_plan_add_table (plan, HB_OT_TAG_glyf, glyf_prime); + success = success && hb_subset_plan_add_table (plan, HB_OT_TAG_loca, loca_prime); + success = success && _add_head_and_set_loca_version (plan->source, use_short_loca, plan->dest); + } else { + success = false; + } + hb_blob_destroy (loca_prime); + hb_blob_destroy (glyf_prime); + + return success; + } + + static 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); + hb_bool_t has_head = (head != nullptr); + + if (has_head) { + OT::head *head_prime = (OT::head *) malloc (OT::head::static_size); + 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_READONLY, + head_prime, + free); + has_head = 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 has_head; + } + struct GlyphHeader { HBINT16 numberOfContours; /* If the number of contours is diff --git a/src/hb-subset.cc b/src/hb-subset.cc index 1fe266fc..418e481f 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -219,63 +219,15 @@ hb_subset_face_add_table (hb_face_t *face, hb_tag_t tag, hb_blob_t *blob) return true; } -static 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); - hb_bool_t has_head = (head != nullptr); - - if (has_head) { - OT::head *head_prime = (OT::head *) malloc (OT::head::static_size); - 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_READONLY, - head_prime, - free); - has_head = 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 has_head; -} - -static bool -_subset_glyf (hb_subset_plan_t *plan) -{ - hb_blob_t *glyf_prime = nullptr; - 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, &use_short_loca, &glyf_prime, &loca_prime)) { - success = success && hb_subset_plan_add_table (plan, HB_OT_TAG_glyf, glyf_prime); - success = success && hb_subset_plan_add_table (plan, HB_OT_TAG_loca, loca_prime); - success = success && _add_head_and_set_loca_version (plan->source, use_short_loca, plan->dest); - } else { - success = false; - } - hb_blob_destroy (loca_prime); - hb_blob_destroy (glyf_prime); - - return success; -} - static bool _subset_table (hb_subset_plan_t *plan, hb_tag_t tag) { - // TODO (grieger): Handle updating the head table (loca format + num glyphs) DEBUG_MSG(SUBSET, nullptr, "begin subset %c%c%c%c", HB_UNTAG(tag)); bool result = true; switch (tag) { case HB_OT_TAG_glyf: - result = _subset_glyf (plan); + result = _subset (plan); break; case HB_OT_TAG_head: // SKIP head, it's handled by glyf -- GitLab