From dd107699938740e261948e4b525fa0ad501beb03 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Tue, 6 Mar 2018 18:33:39 -0800 Subject: [PATCH 1/3] [subset] drop all glyph names from the post table. --- src/hb-ot-post-table.hh | 28 ++++++++++++++++++++++++++++ src/hb-subset.cc | 4 ++++ 2 files changed, 32 insertions(+) diff --git a/src/hb-ot-post-table.hh b/src/hb-ot-post-table.hh index 9e4792115..cb1e4eb42 100644 --- a/src/hb-ot-post-table.hh +++ b/src/hb-ot-post-table.hh @@ -82,6 +82,34 @@ struct post return_trace (true); } + inline bool subset (hb_subset_plan_t *plan) const + { + hb_blob_t *post_blob = OT::Sanitizer().sanitize (hb_face_reference_table (plan->source, HB_OT_TAG_post)); + post *post_table = (post *) hb_blob_get_data (post_blob, nullptr); + + post *post_prime = (post *) malloc (post::static_size); + if (unlikely (!post_prime)) + { + hb_blob_destroy (post_blob); + DEBUG_MSG(SUBSET, nullptr, "Unable to alloc %lu for post subset output.", (unsigned long) post::static_size); + return false; + } + + memcpy (post_prime, post_table, post::static_size); + hb_blob_destroy (post_blob); + + post_prime->version.major.set (3); // Version 3 does not have any glyph names. + hb_blob_t *post_prime_blob = hb_blob_create ((const char *) post_prime, + post::static_size, + HB_MEMORY_MODE_READONLY, + post_prime, + free); + bool result = hb_subset_plan_add_table (plan, HB_OT_TAG_post, post_prime_blob); + hb_blob_destroy (post_prime_blob); + + return result; + } + struct accelerator_t { inline void init (hb_face_t *face) diff --git a/src/hb-subset.cc b/src/hb-subset.cc index 541987bf5..77f60db1d 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -41,6 +41,7 @@ #include "hb-ot-hmtx-table.hh" #include "hb-ot-maxp-table.hh" #include "hb-ot-os2-table.hh" +#include "hb-ot-post-table.hh" #ifndef HB_NO_VISIBILITY @@ -270,6 +271,9 @@ _subset_table (hb_subset_plan_t *plan, case HB_OT_TAG_os2: result = _subset (plan); break; + case HB_OT_TAG_post: + result = _subset (plan); + break; default: hb_blob_t *source_table = hb_face_reference_table(plan->source, tag); if (likely (source_table)) From ec47cd95ba6c550314a1cbcc46fafd7946e52ece Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Wed, 7 Mar 2018 10:33:02 -0800 Subject: [PATCH 2/3] [subset] Unit test to check that post subsetting drops glyph names. --- test/api/Makefile.am | 2 + ...-Regular.660E,6975,73E0,5EA6,8F38,6E05.ttf | Bin 3572 -> 3724 bytes test/api/test-subset-post.c | 61 ++++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 test/api/test-subset-post.c diff --git a/test/api/Makefile.am b/test/api/Makefile.am index 3c5a5ccfc..54e367faa 100644 --- a/test/api/Makefile.am +++ b/test/api/Makefile.am @@ -36,6 +36,7 @@ TEST_PROGS = \ test-subset-hdmx \ test-subset-hmtx \ test-subset-os2 \ + test-subset-post \ test-subset-vmtx \ test-unicode \ test-version \ @@ -47,6 +48,7 @@ test_subset_glyf_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la test_subset_hdmx_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la test_subset_hmtx_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la test_subset_os2_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la +test_subset_post_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la test_subset_vmtx_LDADD = $(LDADD) $(top_builddir)/src/libharfbuzz-subset.la test_unicode_CPPFLAGS = \ diff --git a/test/api/fonts/Mplus1p-Regular.660E,6975,73E0,5EA6,8F38,6E05.ttf b/test/api/fonts/Mplus1p-Regular.660E,6975,73E0,5EA6,8F38,6E05.ttf index 89c7a1accde325ab37f39472069986cb4d753ee3..2a978fbdc621c828b235634e7ac2f011d6a1e273 100644 GIT binary patch delta 353 zcmew&-6K0e!J_L*s1pMNI|C3LNiHie+FitRKUcDe8(IH2Ij_s{Nj?b)2~?=7#h%Z`$TWEtue?1lKp2@AnHgCaSsB?F+1X3;GEH3_%|Nu7nSm>q bwlp^d)2;?!+T7UH0K~U&Gq#w#gVzQC!mLt# delta 205 zcmeB?{USX + +#include "hb-test.h" +#include "hb-subset-test.h" + +/* Unit tests for hmtx subsetting */ + +static void +test_post_drops_glyph_names (void) +{ + hb_face_t *face_full = hb_subset_test_open_font ("fonts/Mplus1p-Regular.660E,6975,73E0,5EA6,8F38,6E05.ttf"); + hb_face_t *face_subset = hb_subset_test_open_font ("fonts/Mplus1p-Regular.660E.ttf"); + + hb_set_t *codepoints = hb_set_create (); + hb_set_add (codepoints, 0x660E); + + hb_face_t *face_full_subset = hb_subset_test_create_subset (face_full, hb_subset_test_create_input (codepoints)); + hb_set_destroy (codepoints); + + hb_subset_test_check (face_subset, face_full_subset, HB_TAG ('p','o','s','t')); + + hb_face_destroy (face_full_subset); + hb_face_destroy (face_full); + hb_face_destroy (face_subset); +} + +int +main (int argc, char **argv) +{ + hb_test_init (&argc, &argv); + + hb_test_add (test_post_drops_glyph_names); + + return hb_test_run(); +} From 869ccac5ab69060f2db2893014b5538539fd4f45 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Thu, 8 Mar 2018 11:06:49 -0800 Subject: [PATCH 3/3] [subset] use create_sub_blob instead of manually copying the post table. --- src/hb-ot-post-table.hh | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/hb-ot-post-table.hh b/src/hb-ot-post-table.hh index cb1e4eb42..c5ad66547 100644 --- a/src/hb-ot-post-table.hh +++ b/src/hb-ot-post-table.hh @@ -84,26 +84,20 @@ struct post inline bool subset (hb_subset_plan_t *plan) const { + unsigned int post_prime_length; hb_blob_t *post_blob = OT::Sanitizer().sanitize (hb_face_reference_table (plan->source, HB_OT_TAG_post)); - post *post_table = (post *) hb_blob_get_data (post_blob, nullptr); + hb_blob_t *post_prime_blob = hb_blob_create_sub_blob (post_blob, 0, post::static_size); + post *post_prime = (post *) hb_blob_get_data_writable (post_prime_blob, &post_prime_length); + hb_blob_destroy (post_blob); - post *post_prime = (post *) malloc (post::static_size); - if (unlikely (!post_prime)) + if (unlikely (!post_prime || post_prime_length != post::static_size)) { - hb_blob_destroy (post_blob); - DEBUG_MSG(SUBSET, nullptr, "Unable to alloc %lu for post subset output.", (unsigned long) post::static_size); + hb_blob_destroy (post_prime_blob); + DEBUG_MSG(SUBSET, nullptr, "Invalid source post table with length %d.", post_prime_length); return false; } - memcpy (post_prime, post_table, post::static_size); - hb_blob_destroy (post_blob); - post_prime->version.major.set (3); // Version 3 does not have any glyph names. - hb_blob_t *post_prime_blob = hb_blob_create ((const char *) post_prime, - post::static_size, - HB_MEMORY_MODE_READONLY, - post_prime, - free); bool result = hb_subset_plan_add_table (plan, HB_OT_TAG_post, post_prime_blob); hb_blob_destroy (post_prime_blob);