From 668f2bd93e3ea72e43e57ce10981d300f39a1967 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Wed, 9 Jun 2021 16:33:50 -0700 Subject: [PATCH] [subset] Add hb_subset_or_fail () to public subset api. --- src/hb-subset.cc | 22 ++++++++++++++++++++-- src/hb-subset.h | 3 +++ util/hb-subset.cc | 10 ++++++---- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/hb-subset.cc b/src/hb-subset.cc index 1b8cc2967..74085a571 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -304,13 +304,31 @@ _subset_table (hb_subset_plan_t *plan, hb_tag_t tag) **/ hb_face_t * hb_subset (hb_face_t *source, const hb_subset_input_t *input) +{ + hb_face_t* result = hb_subset_or_fail (source, input); + if (unlikely (!result)) return hb_face_get_empty (); + return result; +} + +/** + * hb_subset_or_fail: + * @source: font face data to be subset. + * @input: input to use for the subsetting. + * + * Subsets a font according to provided input. Returns nullptr + * if the subset operation fails. + * + * Since: REPLACE + **/ +hb_face_t * +hb_subset_or_fail (hb_face_t *source, const hb_subset_input_t *input) { if (unlikely (!input || !source)) return hb_face_get_empty (); hb_subset_plan_t *plan = hb_subset_plan_create (source, input); if (unlikely (plan->in_error ())) { hb_subset_plan_destroy (plan); - return hb_face_get_empty (); + return nullptr; } hb_set_t tags_set; @@ -331,7 +349,7 @@ hb_subset (hb_face_t *source, const hb_subset_input_t *input) } end: - hb_face_t *result = success ? hb_face_reference (plan->dest) : hb_face_get_empty (); + hb_face_t *result = success ? hb_face_reference (plan->dest) : nullptr; hb_subset_plan_destroy (plan); return result; diff --git a/src/hb-subset.h b/src/hb-subset.h index 8a895aec5..51378f606 100644 --- a/src/hb-subset.h +++ b/src/hb-subset.h @@ -118,6 +118,9 @@ hb_subset_input_get_no_prune_unicode_ranges (hb_subset_input_t *subset_input); HB_EXTERN hb_face_t * hb_subset (hb_face_t *source, const hb_subset_input_t *input); +HB_EXTERN hb_face_t * +hb_subset_or_fail (hb_face_t *source, const hb_subset_input_t *input); + HB_EXTERN hb_bool_t hb_subset_input_set_user_data (hb_subset_input_t *input, hb_user_data_key_t *key, diff --git a/util/hb-subset.cc b/util/hb-subset.cc index 4f9557869..ad196a9ab 100644 --- a/util/hb-subset.cc +++ b/util/hb-subset.cc @@ -101,16 +101,18 @@ struct subset_consumer_t hb_face_t *new_face = nullptr; for (unsigned i = 0; i < subset_options.num_iterations; i++) { hb_face_destroy (new_face); - new_face = hb_subset (face, input); + new_face = hb_subset_or_fail (face, input); } - hb_blob_t *result = hb_face_reference_blob (new_face); - failed = !hb_blob_get_length (result); + failed = !new_face; if (!failed) + { + hb_blob_t *result = hb_face_reference_blob (new_face); write_file (options.output_file, result); + hb_blob_destroy (result); + } hb_subset_input_destroy (input); - hb_blob_destroy (result); hb_face_destroy (new_face); hb_font_destroy (font); }