From 1bf051ef3bafe2d6c24983863dc3bf2f04505b3c Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Thu, 30 Jun 2022 20:03:33 +0000 Subject: [PATCH 01/11] [subset] refactor feature tag filtering so it can be used for scripts as well. --- src/hb-subset-plan.cc | 72 +++++++++++++++++++++++++++---------------- src/hb-subset-plan.hh | 3 ++ 2 files changed, 49 insertions(+), 26 deletions(-) diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index 4e3bb1d47..560355b3a 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -91,6 +91,38 @@ _remap_indexes (const hb_set_t *indexes, typedef void (*layout_collect_func_t) (hb_face_t *face, hb_tag_t table_tag, const hb_tag_t *scripts, const hb_tag_t *languages, const hb_tag_t *features, hb_set_t *lookup_indexes /* OUT */); +/** + * Removes all tags from 'tags' that are not in filter. Additionally eliminates any duplicates. + * Returns true if anything was removed (not including duplicates). + */ +static bool _filter_tag_list(hb_vector_t* tags, /* IN/OUT */ + const hb_set_t* filter) +{ + hb_vector_t out; + out.alloc (tags->get_size()); + + bool removed = false; + hb_set_t visited; + + for (hb_tag_t tag : *tags) + { + if (!tag) continue; + if (visited.has (tag)) continue; + + if (!filter->has (tag)) + { + removed = true; + continue; + } + + visited.add (tag); + out.push (tag); + } + + hb_swap (out, *tags); + return removed; +} + template static void _collect_layout_indices (hb_face_t *face, const T& table, @@ -98,35 +130,18 @@ static void _collect_layout_indices (hb_face_t *face, layout_collect_func_t layout_collect_func, hb_set_t *indices /* OUT */) { + unsigned num_features = table.get_feature_count () + 1; hb_vector_t features; - if (!features.alloc (table.get_feature_count () + 1)) + // TODO(garretrieger): propagate error to plan + if (!features.resize (num_features)) return; + table.get_feature_tags (0, &num_features, features.arrayZ); + features.resize (num_features); + bool retain_all_features = !_filter_tag_list (&features, layout_features_to_retain); + + // TODO(garretrieger): propagate error to plan + if (features.in_error () || !features) return; - hb_set_t visited_features; - bool retain_all_features = true; - for (unsigned i = 0; i < table.get_feature_count (); i++) - { - hb_tag_t tag = table.get_feature_tag (i); - if (!tag) continue; - if (!layout_features_to_retain->has (tag)) - { - retain_all_features = false; - continue; - } - - if (visited_features.has (tag)) - continue; - - features.push (tag); - visited_features.add (tag); - } - - if (!features) - return; - - // The collect function needs a null element to signal end of the array. - features.push (0); - if (retain_all_features) { // Looking for all features, trigger the faster collection method. @@ -139,6 +154,8 @@ static void _collect_layout_indices (hb_face_t *face, return; } + // The collect function needs a null element to signal end of the array. + features.push (0); layout_collect_func (face, T::tableTag, nullptr, @@ -549,6 +566,8 @@ hb_subset_plan_create_or_fail (hb_face_t *face, _nameid_closure (face, plan->name_ids); plan->name_languages = hb_set_copy (input->sets.name_languages); plan->layout_features = hb_set_copy (input->sets.layout_features); + plan->layout_scripts = hb_set_create (); + hb_set_invert (plan->layout_scripts); plan->glyphs_requested = hb_set_copy (input->sets.glyphs); plan->drop_tables = hb_set_copy (input->sets.drop_tables); plan->no_subset_tables = hb_set_copy (input->sets.no_subset_tables); @@ -636,6 +655,7 @@ hb_subset_plan_destroy (hb_subset_plan_t *plan) hb_set_destroy (plan->name_ids); hb_set_destroy (plan->name_languages); hb_set_destroy (plan->layout_features); + hb_set_destroy (plan->layout_scripts); hb_set_destroy (plan->glyphs_requested); hb_set_destroy (plan->drop_tables); hb_set_destroy (plan->no_subset_tables); diff --git a/src/hb-subset-plan.hh b/src/hb-subset-plan.hh index 2aaf19c61..830c8b9c2 100644 --- a/src/hb-subset-plan.hh +++ b/src/hb-subset-plan.hh @@ -55,6 +55,9 @@ struct hb_subset_plan_t //layout features which will be preserved hb_set_t *layout_features; + // layout scripts which will be preserved. + hb_set_t *layout_scripts; + //glyph ids requested to retain hb_set_t *glyphs_requested; From e5c8a2f4e11fa2b5b1b64ecf1d210fc3dc862381 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Thu, 30 Jun 2022 20:14:29 +0000 Subject: [PATCH 02/11] [subset] Pass plan through to collect methods. Allows to more easily access the filtering sets as they are added and enables propagating errors to the plan. --- src/hb-subset-plan.cc | 40 ++++++++++++++++------------------------ 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index 560355b3a..6f80c15d0 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -124,28 +124,25 @@ static bool _filter_tag_list(hb_vector_t* tags, /* IN/OUT */ } template -static void _collect_layout_indices (hb_face_t *face, +static void _collect_layout_indices (hb_subset_plan_t *plan, const T& table, - const hb_set_t *layout_features_to_retain, layout_collect_func_t layout_collect_func, hb_set_t *indices /* OUT */) { unsigned num_features = table.get_feature_count () + 1; hb_vector_t features; - // TODO(garretrieger): propagate error to plan - if (!features.resize (num_features)) return; + if (!plan->check_success (features.resize (num_features))) return; table.get_feature_tags (0, &num_features, features.arrayZ); features.resize (num_features); - bool retain_all_features = !_filter_tag_list (&features, layout_features_to_retain); + bool retain_all_features = !_filter_tag_list (&features, plan->layout_features); - // TODO(garretrieger): propagate error to plan - if (features.in_error () || !features) + if (!plan->check_success (!features.in_error ()) || !features) return; if (retain_all_features) { // Looking for all features, trigger the faster collection method. - layout_collect_func (face, + layout_collect_func (plan->source, T::tableTag, nullptr, nullptr, @@ -156,7 +153,7 @@ static void _collect_layout_indices (hb_face_t *face, // The collect function needs a null element to signal end of the array. features.push (0); - layout_collect_func (face, + layout_collect_func (plan->source, T::tableTag, nullptr, nullptr, @@ -166,36 +163,33 @@ static void _collect_layout_indices (hb_face_t *face, template static inline void -_closure_glyphs_lookups_features (hb_face_t *face, +_closure_glyphs_lookups_features (hb_subset_plan_t *plan, hb_set_t *gids_to_retain, - const hb_set_t *layout_features_to_retain, hb_map_t *lookups, hb_map_t *features, script_langsys_map *langsys_map) { - hb_blob_ptr_t table = hb_sanitize_context_t ().reference_table (face); + hb_blob_ptr_t table = hb_sanitize_context_t ().reference_table (plan->source); hb_tag_t table_tag = table->tableTag; hb_set_t lookup_indices; - _collect_layout_indices (face, + _collect_layout_indices (plan, *table, - layout_features_to_retain, hb_ot_layout_collect_lookups, &lookup_indices); if (table_tag == HB_OT_TAG_GSUB) - hb_ot_layout_lookups_substitute_closure (face, - &lookup_indices, + hb_ot_layout_lookups_substitute_closure (plan->source, + &lookup_indices, gids_to_retain); - table->closure_lookups (face, + table->closure_lookups (plan->source, gids_to_retain, - &lookup_indices); + &lookup_indices); _remap_indexes (&lookup_indices, lookups); // Collect and prune features hb_set_t feature_indices; - _collect_layout_indices (face, + _collect_layout_indices (plan, *table, - layout_features_to_retain, hb_ot_layout_collect_features, &feature_indices); @@ -412,18 +406,16 @@ _populate_gids_to_retain (hb_subset_plan_t* plan, if (close_over_gsub) // closure all glyphs/lookups/features needed for GSUB substitutions. _closure_glyphs_lookups_features ( - plan->source, + plan, plan->_glyphset_gsub, - plan->layout_features, plan->gsub_lookups, plan->gsub_features, plan->gsub_langsys); if (close_over_gpos) _closure_glyphs_lookups_features ( - plan->source, + plan, plan->_glyphset_gsub, - plan->layout_features, plan->gpos_lookups, plan->gpos_features, plan->gpos_langsys); From 41d2c335bcf7f4f57b91ec8469dbfaa4d7b47e84 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Thu, 30 Jun 2022 20:24:42 +0000 Subject: [PATCH 03/11] [subset] Apply script list filter when doing layout collection. --- src/hb-subset-plan.cc | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index 6f80c15d0..f89c8c861 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -136,28 +136,25 @@ static void _collect_layout_indices (hb_subset_plan_t *plan, features.resize (num_features); bool retain_all_features = !_filter_tag_list (&features, plan->layout_features); - if (!plan->check_success (!features.in_error ()) || !features) - return; + unsigned num_scripts = table.get_script_count () + 1; + hb_vector_t scripts; + if (!plan->check_success (scripts.resize (num_scripts))) return; + table.get_script_tags (0, &num_scripts, scripts.arrayZ); + scripts.resize (num_scripts); + bool retain_all_scripts = !_filter_tag_list (&scripts, plan->layout_scripts); - if (retain_all_features) - { - // Looking for all features, trigger the faster collection method. - layout_collect_func (plan->source, - T::tableTag, - nullptr, - nullptr, - nullptr, - indices); + if (!plan->check_success (!features.in_error ()) || !features + || !plan->check_success (!scripts.in_error ()) || !scripts) return; - } // The collect function needs a null element to signal end of the array. features.push (0); + scripts.push (0); layout_collect_func (plan->source, T::tableTag, + retain_all_scripts ? nullptr : scripts.arrayZ, nullptr, - nullptr, - features.arrayZ, + retain_all_features ? nullptr : features.arrayZ, indices); } From 70e32a662f53409a849ad175d460dd524da14489 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Thu, 30 Jun 2022 21:00:48 +0000 Subject: [PATCH 04/11] [subset] Add layout_scripts to subset input. --- src/hb-subset-input.cc | 2 ++ src/hb-subset-input.hh | 1 + src/hb-subset-plan.cc | 3 +-- src/hb-subset.h | 3 +++ 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/hb-subset-input.cc b/src/hb-subset-input.cc index 028ddf903..e10391739 100644 --- a/src/hb-subset-input.cc +++ b/src/hb-subset-input.cc @@ -203,6 +203,8 @@ hb_subset_input_create_or_fail (void) input->sets.layout_features->add_array (default_layout_features, ARRAY_LENGTH (default_layout_features)); + input->sets.layout_scripts->invert (); // Default to all scripts. + if (input->in_error ()) { hb_subset_input_destroy (input); diff --git a/src/hb-subset-input.hh b/src/hb-subset-input.hh index 07c0e2267..a21a6f352 100644 --- a/src/hb-subset-input.hh +++ b/src/hb-subset-input.hh @@ -50,6 +50,7 @@ struct hb_subset_input_t hb_set_t *name_ids; hb_set_t *name_languages; hb_set_t *layout_features; + hb_set_t *layout_scripts; }; union { diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index f89c8c861..574d45eff 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -555,8 +555,7 @@ hb_subset_plan_create_or_fail (hb_face_t *face, _nameid_closure (face, plan->name_ids); plan->name_languages = hb_set_copy (input->sets.name_languages); plan->layout_features = hb_set_copy (input->sets.layout_features); - plan->layout_scripts = hb_set_create (); - hb_set_invert (plan->layout_scripts); + plan->layout_scripts = hb_set_copy (input->sets.layout_scripts); plan->glyphs_requested = hb_set_copy (input->sets.glyphs); plan->drop_tables = hb_set_copy (input->sets.drop_tables); plan->no_subset_tables = hb_set_copy (input->sets.no_subset_tables); diff --git a/src/hb-subset.h b/src/hb-subset.h index a2799d91e..636e399a6 100644 --- a/src/hb-subset.h +++ b/src/hb-subset.h @@ -100,6 +100,8 @@ typedef enum { /*< flags >*/ * @HB_SUBSET_SETS_NAME_LANG_ID: the set of name lang ids that will be retained. * @HB_SUBSET_SETS_LAYOUT_FEATURE_TAG: the set of layout feature tags that will be retained * in the subset. + * @HB_SUBSET_SETS_LAYOUT_SCRIPT_TAG: the set of layout script tags that will be retained + * in the subset. Defaults to all tags. * * List of sets that can be configured on the subset input. * @@ -113,6 +115,7 @@ typedef enum { HB_SUBSET_SETS_NAME_ID, HB_SUBSET_SETS_NAME_LANG_ID, HB_SUBSET_SETS_LAYOUT_FEATURE_TAG, + HB_SUBSET_SETS_LAYOUT_SCRIPT_TAG, } hb_subset_sets_t; HB_EXTERN hb_subset_input_t * From 38e81f2be9711f5dcde3b9cae40fdddb9104c493 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Thu, 30 Jun 2022 21:09:11 +0000 Subject: [PATCH 05/11] [subset] Add --layout-scripts command line flag. --- util/hb-subset.cc | 61 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 13 deletions(-) diff --git a/util/hb-subset.cc b/util/hb-subset.cc index a9ab1559e..8794f0351 100644 --- a/util/hb-subset.cc +++ b/util/hb-subset.cc @@ -532,30 +532,31 @@ set_flag (const char *name, } static gboolean -parse_layout_features (const char *name, - const char *arg, - gpointer data, - GError **error G_GNUC_UNUSED) +parse_layout_tag_list (hb_subset_sets_t set_type, + const char *name, + const char *arg, + gpointer data, + GError **error G_GNUC_UNUSED) { subset_main_t *subset_main = (subset_main_t *) data; hb_bool_t is_remove = (name[strlen (name) - 1] == '-'); hb_bool_t is_add = (name[strlen (name) - 1] == '+'); - hb_set_t *layout_features = hb_subset_input_set (subset_main->input, HB_SUBSET_SETS_LAYOUT_FEATURE_TAG); + hb_set_t *layout_tags = hb_subset_input_set (subset_main->input, set_type); - if (!is_remove && !is_add) hb_set_clear (layout_features); + if (!is_remove && !is_add) hb_set_clear (layout_tags); if (0 == strcmp (arg, "*")) { - hb_set_clear (layout_features); + hb_set_clear (layout_tags); if (!is_remove) - hb_set_invert (layout_features); + hb_set_invert (layout_tags); return true; } char *s = strtok((char *) arg, ", "); while (s) { - if (strlen (s) > 4) // table tags are at most 4 bytes + if (strlen (s) > 4) // tags are at most 4 bytes { g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, "Failed parsing table tag at: '%s'", s); @@ -565,9 +566,9 @@ parse_layout_features (const char *name, hb_tag_t tag = hb_tag_from_string (s, strlen (s)); if (!is_remove) - hb_set_add (layout_features, tag); + hb_set_add (layout_tags, tag); else - hb_set_del (layout_features, tag); + hb_set_del (layout_tags, tag); s = strtok(nullptr, ", "); } @@ -575,6 +576,34 @@ parse_layout_features (const char *name, return true; } +static gboolean +parse_layout_features (const char *name, + const char *arg, + gpointer data, + GError **error) + +{ + return parse_layout_tag_list (HB_SUBSET_SETS_LAYOUT_FEATURE_TAG, + name, + arg, + data, + error); +} + +static gboolean +parse_layout_scripts (const char *name, + const char *arg, + gpointer data, + GError **error) + +{ + return parse_layout_tag_list (HB_SUBSET_SETS_LAYOUT_SCRIPT_TAG, + name, + arg, + data, + error); +} + static gboolean parse_drop_tables (const char *name, const char *arg, @@ -777,9 +806,15 @@ subset_main_t::add_options () {"name-languages", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_name_languages, "Subset nameRecords with specified language IDs. Use --name-languages-=... to substract from the current set.", "list of int numbers or *"}, {"name-languages-", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_name_languages, "Subset nameRecords with specified language IDs", "list of int numbers or *"}, {"name-languages+", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_name_languages, "Subset nameRecords with specified language IDs", "list of int numbers or *"}, + {"layout-features", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_layout_features, "Specify set of layout feature tags that will be preserved. Use --layout-features-=... to substract from the current set.", "list of string table tags or *"}, - {"layout-features+",0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_layout_features, "Specify set of layout feature tags that will be preserved", "list of string table tags or *"}, - {"layout-features-",0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_layout_features, "Specify set of layout feature tags that will be preserved", "list of string table tags or *"}, + {"layout-features+",0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_layout_features, "Specify set of layout feature tags that will be preserved", "list of string tags or *"}, + {"layout-features-",0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_layout_features, "Specify set of layout feature tags that will be preserved", "list of string tags or *"}, + + {"layout-scripts", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_layout_scripts, "Specify set of layout script tags that will be preserved. Use --layout-scripts-=... to substract from the current set.", "list of string table tags or *"}, + {"layout-scripts+",0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_layout_scripts, "Specify set of layout script tags that will be preserved", "list of string tags or *"}, + {"layout-scripts-",0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_layout_scripts, "Specify set of layout script tags that will be preserved", "list of string tags or *"}, + {"drop-tables", 0, 0, G_OPTION_ARG_CALLBACK, (gpointer) &parse_drop_tables, "Drop the specified tables. Use --drop-tables-=... to substract from the current set.", "list of string table tags or *"}, {"drop-tables+", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_drop_tables, "Drop the specified tables.", "list of string table tags or *"}, {"drop-tables-", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, (gpointer) &parse_drop_tables, "Drop the specified tables.", "list of string table tags or *"}, From 587969af42dad7342871de693bd37683822eb6cf Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Thu, 30 Jun 2022 21:37:42 +0000 Subject: [PATCH 06/11] [subset] Drop scripts that are not in the layout_scripts list. --- src/hb-ot-layout-common.hh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index d34380534..226c3f0d9 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -764,6 +764,8 @@ struct Script { TRACE_SUBSET (this); if (!l->visitScript ()) return_trace (false); + if (tag && !c->plan->layout_scripts->has (*tag)) + return false; auto *out = c->serializer->start_embed (*this); if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false); From 79bdcbef0d63607ac8f652168848e19651c5819f Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Thu, 30 Jun 2022 22:20:32 +0000 Subject: [PATCH 07/11] [subset] Fix GDEF version downgrade logic. --- src/hb-ot-layout-gdef-table.hh | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/hb-ot-layout-gdef-table.hh b/src/hb-ot-layout-gdef-table.hh index 9d47bac2b..72722414f 100644 --- a/src/hb-ot-layout-gdef-table.hh +++ b/src/hb-ot-layout-gdef-table.hh @@ -645,21 +645,25 @@ struct GDEF bool subset_ligcaretlist = out->ligCaretList.serialize_subset (c, ligCaretList, this); bool subset_markattachclassdef = out->markAttachClassDef.serialize_subset (c, markAttachClassDef, this, nullptr, false, true); - bool subset_markglyphsetsdef = true; + bool subset_markglyphsetsdef = false; if (version.to_int () >= 0x00010002u) { subset_markglyphsetsdef = out->markGlyphSetsDef.serialize_subset (c, markGlyphSetsDef, this); - if (!subset_markglyphsetsdef && - version.to_int () == 0x00010002u) - out->version.minor = 0; } - bool subset_varstore = true; + bool subset_varstore = false; if (version.to_int () >= 0x00010003u) { subset_varstore = out->varStore.serialize_subset (c, varStore, this); - if (!subset_varstore && version.to_int () == 0x00010003u) - out->version.minor = 2; + } + + if (subset_varstore) + { + out->version.minor = 3; + } else if (subset_markglyphsetsdef) { + out->version.minor = 2; + } else { + out->version.minor = 0; } return_trace (subset_glyphclassdef || subset_attachlist || From d6f579e96affe78919936f24cb54cb18cffe2ea5 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Thu, 30 Jun 2022 22:22:03 +0000 Subject: [PATCH 08/11] [subset] add tests that exercise script filtering. --- ...ilter-scripts-features.1FC,21,41,20,62,63.ttf | Bin 0 -> 2856 bytes ...ter-scripts-features.2.1FC,21,41,20,62,63.ttf | Bin 0 -> 2856 bytes ...atures.2.61,62,63,64,65,66,67,68,69,6A,6B.ttf | Bin 0 -> 4560 bytes ...egular.filter-scripts-features.2.61,62,63.ttf | Bin 0 -> 2484 bytes ....filter-scripts-features.2.D7,D8,D9,DA,DE.ttf | Bin 0 -> 2828 bytes ...features.61,62,63,64,65,66,67,68,69,6A,6B.ttf | Bin 0 -> 3932 bytes ...-Regular.filter-scripts-features.61,62,63.ttf | Bin 0 -> 2484 bytes ...ar.filter-scripts-features.D7,D8,D9,DA,DE.ttf | Bin 0 -> 2828 bytes ...Regular.filter-scripts.1FC,21,41,20,62,63.ttf | Bin 0 -> 2972 bytes ...-scripts.61,62,63,64,65,66,67,68,69,6A,6B.ttf | Bin 0 -> 4140 bytes .../Roboto-Regular.filter-scripts.61,62,63.ttf | Bin 0 -> 2600 bytes ...oto-Regular.filter-scripts.D7,D8,D9,DA,DE.ttf | Bin 0 -> 2928 bytes ...oto-Regular.no-scripts.1FC,21,41,20,62,63.ttf | Bin 0 -> 2836 bytes ...-scripts.61,62,63,64,65,66,67,68,69,6A,6B.ttf | Bin 0 -> 3912 bytes .../Roboto-Regular.no-scripts.61,62,63.ttf | Bin 0 -> 2464 bytes .../Roboto-Regular.no-scripts.D7,D8,D9,DA,DE.ttf | Bin 0 -> 2808 bytes ...ilter-scripts-features.1FC,21,41,20,62,63.ttf | Bin 0 -> 3476 bytes ...ter-scripts-features.2.1FC,21,41,20,62,63.ttf | Bin 0 -> 3476 bytes ...atures.2.61,62,63,64,65,66,67,68,69,6A,6B.ttf | Bin 0 -> 8700 bytes ...-Roman.filter-scripts-features.2.61,62,63.ttf | Bin 0 -> 3476 bytes ....filter-scripts-features.2.D7,D8,D9,DA,DE.ttf | Bin 0 -> 3948 bytes ...features.61,62,63,64,65,66,67,68,69,6A,6B.ttf | Bin 0 -> 6584 bytes ...le-Roman.filter-scripts-features.61,62,63.ttf | Bin 0 -> 3476 bytes ...an.filter-scripts-features.D7,D8,D9,DA,DE.ttf | Bin 0 -> 3948 bytes ...e-Roman.filter-scripts.1FC,21,41,20,62,63.ttf | Bin 0 -> 3856 bytes ...-scripts.61,62,63,64,65,66,67,68,69,6A,6B.ttf | Bin 0 -> 9548 bytes ...rifVariable-Roman.filter-scripts.61,62,63.ttf | Bin 0 -> 3752 bytes ...iable-Roman.filter-scripts.D7,D8,D9,DA,DE.ttf | Bin 0 -> 4292 bytes ...iable-Roman.no-scripts.1FC,21,41,20,62,63.ttf | Bin 0 -> 3456 bytes ...-scripts.61,62,63,64,65,66,67,68,69,6A,6B.ttf | Bin 0 -> 6564 bytes ...ceSerifVariable-Roman.no-scripts.61,62,63.ttf | Bin 0 -> 3456 bytes ...fVariable-Roman.no-scripts.D7,D8,D9,DA,DE.ttf | Bin 0 -> 3928 bytes .../data/profiles/filter-scripts-features.2.txt | 2 ++ .../data/profiles/filter-scripts-features.txt | 2 ++ test/subset/data/profiles/filter-scripts.txt | 1 + test/subset/data/profiles/no-scripts.txt | 1 + test/subset/data/tests/full-font.tests | 4 ++++ 37 files changed, 10 insertions(+) create mode 100644 test/subset/data/expected/full-font/Roboto-Regular.filter-scripts-features.1FC,21,41,20,62,63.ttf create mode 100644 test/subset/data/expected/full-font/Roboto-Regular.filter-scripts-features.2.1FC,21,41,20,62,63.ttf create mode 100644 test/subset/data/expected/full-font/Roboto-Regular.filter-scripts-features.2.61,62,63,64,65,66,67,68,69,6A,6B.ttf create mode 100644 test/subset/data/expected/full-font/Roboto-Regular.filter-scripts-features.2.61,62,63.ttf create mode 100644 test/subset/data/expected/full-font/Roboto-Regular.filter-scripts-features.2.D7,D8,D9,DA,DE.ttf create mode 100644 test/subset/data/expected/full-font/Roboto-Regular.filter-scripts-features.61,62,63,64,65,66,67,68,69,6A,6B.ttf create mode 100644 test/subset/data/expected/full-font/Roboto-Regular.filter-scripts-features.61,62,63.ttf create mode 100644 test/subset/data/expected/full-font/Roboto-Regular.filter-scripts-features.D7,D8,D9,DA,DE.ttf create mode 100644 test/subset/data/expected/full-font/Roboto-Regular.filter-scripts.1FC,21,41,20,62,63.ttf create mode 100644 test/subset/data/expected/full-font/Roboto-Regular.filter-scripts.61,62,63,64,65,66,67,68,69,6A,6B.ttf create mode 100644 test/subset/data/expected/full-font/Roboto-Regular.filter-scripts.61,62,63.ttf create mode 100644 test/subset/data/expected/full-font/Roboto-Regular.filter-scripts.D7,D8,D9,DA,DE.ttf create mode 100644 test/subset/data/expected/full-font/Roboto-Regular.no-scripts.1FC,21,41,20,62,63.ttf create mode 100644 test/subset/data/expected/full-font/Roboto-Regular.no-scripts.61,62,63,64,65,66,67,68,69,6A,6B.ttf create mode 100644 test/subset/data/expected/full-font/Roboto-Regular.no-scripts.61,62,63.ttf create mode 100644 test/subset/data/expected/full-font/Roboto-Regular.no-scripts.D7,D8,D9,DA,DE.ttf create mode 100644 test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts-features.1FC,21,41,20,62,63.ttf create mode 100644 test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts-features.2.1FC,21,41,20,62,63.ttf create mode 100644 test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts-features.2.61,62,63,64,65,66,67,68,69,6A,6B.ttf create mode 100644 test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts-features.2.61,62,63.ttf create mode 100644 test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts-features.2.D7,D8,D9,DA,DE.ttf create mode 100644 test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts-features.61,62,63,64,65,66,67,68,69,6A,6B.ttf create mode 100644 test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts-features.61,62,63.ttf create mode 100644 test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts-features.D7,D8,D9,DA,DE.ttf create mode 100644 test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts.1FC,21,41,20,62,63.ttf create mode 100644 test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts.61,62,63,64,65,66,67,68,69,6A,6B.ttf create mode 100644 test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts.61,62,63.ttf create mode 100644 test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts.D7,D8,D9,DA,DE.ttf create mode 100644 test/subset/data/expected/full-font/SourceSerifVariable-Roman.no-scripts.1FC,21,41,20,62,63.ttf create mode 100644 test/subset/data/expected/full-font/SourceSerifVariable-Roman.no-scripts.61,62,63,64,65,66,67,68,69,6A,6B.ttf create mode 100644 test/subset/data/expected/full-font/SourceSerifVariable-Roman.no-scripts.61,62,63.ttf create mode 100644 test/subset/data/expected/full-font/SourceSerifVariable-Roman.no-scripts.D7,D8,D9,DA,DE.ttf create mode 100644 test/subset/data/profiles/filter-scripts-features.2.txt create mode 100644 test/subset/data/profiles/filter-scripts-features.txt create mode 100644 test/subset/data/profiles/filter-scripts.txt create mode 100644 test/subset/data/profiles/no-scripts.txt diff --git a/test/subset/data/expected/full-font/Roboto-Regular.filter-scripts-features.1FC,21,41,20,62,63.ttf b/test/subset/data/expected/full-font/Roboto-Regular.filter-scripts-features.1FC,21,41,20,62,63.ttf new file mode 100644 index 0000000000000000000000000000000000000000..38de0fe28a89ea42542e8452f9bf98325a7bc1ba GIT binary patch literal 2856 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 BqS^oe literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/full-font/Roboto-Regular.filter-scripts-features.2.61,62,63,64,65,66,67,68,69,6A,6B.ttf b/test/subset/data/expected/full-font/Roboto-Regular.filter-scripts-features.2.61,62,63,64,65,66,67,68,69,6A,6B.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cd3d30aa35b072edd89c462971b09a234a09f370 GIT binary patch literal 4560 zcmbtXYgAKL7T)LHn@bWR+#3QxqH;qd2n2Zqf~8c^^3Xa8f{%m|0RaI869v>hoUt!u zQYd{mt)qR-V|BICRc}&T3AW0t*0$qJTeXih&Z?MpJHKri1>o1? zo-cQ{_IW@JN!VY2^SaKSTQ@m62UY>7Qvoz%UG2TQl8i~2IA4kLsa+kd?N>LSyAAiF z*wKXp+HuwMbT7nnyL$U~Ey&@{;`|+m7xcK>TJ>#-`*9x6gE_seyFAQ7R)d(%OIure zJM>&0hy1VNn8D-j>ksupJN6%=^PcS;p5JV`@&^DF`a_lh)k>>;5dwqUnNSE4ag@#o z8a1b)A6BJe7?p}@0&p9gCwXLue8VhdUS&1x5_W|B2Up8|h;wvR0*pWktOk{WD8`MM zxxgc4=>`Cy&6LxRd~khSPf&+iExTe0-l8dp>=Ao30Y?~^6B!62R2s2Pc@~etHXi?U zFa!JaLoGeofR-{e(A>b5!!N~K&}V?wP$=}2g2R3=7JYHeeQC{!<=?=}uw+Qj1q_qV zLMOQd80NM@I{zM&Lk>I+d%z33;5}4kB{af5Xo0m*%#_2+;D`I+H9W@lAC}uo9>6Go>Y&PwE~STC_AG3of`p|}o(%gN z=>pW$*497;w89o1f&iQ14l*bgd6GWBmEn03e#1&?VJY%uI=6RhfwG>~{;e48xxiJ| zFP31|irSx`UAcHI+WOiRXfg7ku)<19wMQa7-JPvqP%P$3Bm!Z2M2Qg{Q{&$(rDZU( zJpM7L`wZm4V@vQG_Bsx=Lv9@23D^MZBYm0;b&)=U9G67;?38hCN?!$5JT1HrPkBQ< zxUrJBp&$S95OqK&3_uU6v>oHrfwm92ac(PWQv~y&5bRJ2H!7$AQR#JSrtWt$uJgdH zxJNhc+J$G(J?N@J?A73`8^?R_6bY8$32nH)1dDN`2iy8ZoS{QCGfbU>=w-JM$LUzA4r{LR$- zoSOVJ((kXO#!bx#HAkokQInoV2Iz_bx?+H?81N^~p=+u64>jp?@VRDcMyPp*nh-UM z=HSC_YVsv~&W#3>KnB}#SySiq5put4jD+r$@0sn>u+1CtWMY$~s_sgewB*T*O(r?! zJejpg)iRq|UGKEGB(LOM*6x+6rLNX?nafmKoapen@+BD>oZVV;c}Jb z$sFAVSK!lL7jCdQvH`ZrQ2u0|tgEBXXsBDs1CyGM|$ttHV1qIOPhH3@)#i?$_Y7nB_fQugQxZMDfIQJVxO9fr_aE zs6f>i*;9vGVPi3y=zzs+F(X4)WuC0DEpKpEAw@G%)Y{~ERe5r}P0q$fXY*x|LCM?T z3{+qxXd6?*;A&?8=CPl8TqfCqWTn9|0doM$6+urfMQ#+2o$615%>mIW_ z7<{f@s^9zKea{|W)7sZwv+7aj@!tg#e(4m38<$>uW8FqtetnvW z($fnvi$1IK6;E~OoG$7%i-3)~%_HEc+bT6n-PY=8BkKg8KIV?h3O-{D78DW#W68*h zvxs)lA?d{|>R_ChVlQ%V(%&ZD@@NhRJjDBP;Gtg}t6OvQ-u;aDZSdU(ck?j$>V3fv zf|IIO-aZ_(9ex{Y`g)AmWsKNtSne0*q~qb?NC`+xh*DM~P$Nqp#8}8`>Y^+NvVq#^ z1gXCE1SAP!Nkn#wRfz&h&Ma)(uRfyMacb*@;P?IK_rLUo`iOd@d-%}7yLUAnf4_>= zDJm-sRXJ&jL#T3U3>Fk773=LqM%36sbBQT28c^Xp=QHMVfFI6;e6i=kcrJfcM5tB%~-bb3+Bt{rD@y(b5 zi6AGP!2~NP#3+>DO~xB+j0-1{J=r3DGCDebxMGnuzoc>FC!esRBkt!vKxH*O!f zx(0P`39eYYy+jM4KeJL%Y8J=-ij>>)a0?@HXusMPD5|`y~1Ip>r6U zA$&FcE8Z0mZt-jNNlI*l@Eu{$Ehg%t3V|wmM-mVuP#=L&QRf)Jr=7~1IP6lAXc3ib z9ETk{sk;3XS;q!Qx4UuB8VIn*9u4lEEMfjM;AvTTb&|d{G{l#kwFTpOKUEefa7h{oTQ$ zD+=a}tP&+&BGSO$5{1X|;NNd5mWmfHPAV;NARPx+_WiQpoBI9gn;W>}B;B?s%#2Vi zI33EO!}r?QFJSbtOsfHkEYZ*?xu}Fj&7dev5@ipK%kAR`Z)Mg^1*rX&8@+Ec(~fU zle7oRC%qWCbj+f+lp8)1?)9s~ziU{tj8kh?l>D@dH0`FRVqT?2Gwxb|>B~S0&ZJNu z|GyeQv*PsV=sT}?M$>n1+u42L0<&y<9BaY)7f;{xSkaa(8?YAO|8fkiS$q+Cl!b5W zPlh9)aELlFt#(PsPKxr@BhW{I^4<~!IXIIO1=$F)qfxUUutY%?f-DLo!DpV5YME#7 zCR|_jOg~!h%s;4p7SSwH@26Hl@<3RK?K`_KUJL|1+(URVr_{x;D4TnzDD0>r%>Mvz CaFB}t literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/full-font/Roboto-Regular.filter-scripts-features.2.61,62,63.ttf b/test/subset/data/expected/full-font/Roboto-Regular.filter-scripts-features.2.61,62,63.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3c04b26d8c203c06ac37816cdfea49902c17e002 GIT binary patch literal 2484 zcmZuzdu&@*8UOCX&v?$Y=frK?CfB{qtFfCjN!=}rwrsPLmWaknQg$76Z9Lm~l(_L4 zC(9-Zg>7B%+Lc15N!^19O)v_g$7WlTbx4uegaB=9&>?~b64L${s1hI*R26FTJ2y_! zO&sff=lgxH^F5AELIM%FL1a?^r_(BwVWg-<%{`bglABT?P&;$hb zw@j}>{{is!iF9^e`HrvzJj(5-rW0}D2ebkl0Jf*&^BJ*IvH^b!SUnm~r`&Q-CX%`# z^JJ!HvZXX7!85MU97|=sH+JKfXb#R3_CZGUIIRdl?7VMw=BRhBhYn@KjA zOo)7nlJW?p<>PcpZli-`zb&+d#PMUPFOzdBo;^yavAlR(na)r(4U@^RCax7p+)id- zY1OWDgy;Ex7W^$!MF){>-wj{!3%0g$j15y65|L`l0;hq{ePD-SD}wTKcqSq~exj$0 zJ^Y>k%lL790yPuGOQq5)243xpsJY+hyZy@H%I<&BW?Uz%cmCnp$@hB`k!Z|vUPRf#ce#Pwh4WPWcwa2Y6P=QAr|1x-yUGjbWVFnSnBIM5Ub;mt-@==y z0rz3m*9?wmkf!Njd|7-!pcIYMEKMP!W9Uf=bcQCOJBmEoX(#QX4%$O^8K@0t&*yw@ zjdwr%GV~Z?Od{$8&fqb)*Di2<&`v`>g;P}8hZ7QruhPAcOkp2f_nI+K3YqYH=0KCQ zlQ~)#wNOD^685DO|XxMwlra z=HzRfwAKjO!T=}JoSfn0A}1wI>S}~p?lH?fX1T{~p|Y0ya`Jah>S|$kn3FS{{DzYf zC->CCc$$+|6?W4gxCD#>{md5C^MdefY*8pZ#h%=nw@HT&1(^^~)yQO+38O(K2AHtJ zA7oNM?PXGZ@1U;5)SQ~zm&~cX>O?%rw;kszxGux4zIK)z8}P;*22QV-s@#G;iJ zhV>cXOezLjOX%G(00XJJvL5k22bVc!xpOP_{gK|C($(pBki@_xLu zP4tz5w|R%leJArOO#J|pjp)qV>dSj;?v5Ei29VulKmY_#5WO;-3Kho2Dq7*5uN0WQ zMfd-~cP)n7>g7RYC11B8Wfe+Z+kkDm{0)s}ZCk_c&g~r?yE_}SZRRSiGZgA*ulBk; z-m3cc(4O6zTIH#hniTujfBMRMg7DYZvyUWBzBTji+~q5BL$Tt)7qzp+A7|CUlW#op z!^;QaGs(UOp4TtGT68|AE2l^H{`nUVKFlA~Q>Cl2ipSSUn`x}zuJQ5o+zOLWv$fTz z)Pdq0Yh_CS(puSO05dP!WR-Z?b_d^>L&>{0%3+d{_in(pU4lo{wl!KbSBER4x?PRD zK#Qxoqdg?6pDe$Zv0Yfo2)Vy3efyi2q6c1o>YV7hUi{tJ<7T?~^Jj{`FWxl$?EMSH zz=ikm_v;`gb`=xbO8o_;who7{PD(*y%38`+04uW0tE4&N;1A$OKGXMYp literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/full-font/Roboto-Regular.filter-scripts-features.2.D7,D8,D9,DA,DE.ttf b/test/subset/data/expected/full-font/Roboto-Regular.filter-scripts-features.2.D7,D8,D9,DA,DE.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d7d7a736aced7a15ed0c30530fc5b3f3a44730c7 GIT binary patch literal 2828 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 Zj{biqx! literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/full-font/Roboto-Regular.filter-scripts-features.61,62,63.ttf b/test/subset/data/expected/full-font/Roboto-Regular.filter-scripts-features.61,62,63.ttf new file mode 100644 index 0000000000000000000000000000000000000000..836df1cc11714c3efae6e11dcfcb00a88af4a748 GIT binary patch literal 2484 zcmZuzdu&@*8UOCX&v?nTapER!lk48*)!0p%r0$kQYqr@*OGM)(DZ7rkHlFP~O5Avj zlcf`d!dMr)cBN2+)IFHc1fw8&Y{r_bLyE*EG|n)rsZg8WxptCn z;#l`P-|u^!?{Rbz5{SqJB9l503is0>S&4)jkhTm&hDNBG?7(*dI|fD$-S=kg`y8i% z>xV|#J2O*Xt|Suw2s|E7#nR-USAe$ycgGhpYTHYe=YW@hM<>#gsYgE={{fNdS;Tm4 zGB%gSX`ccgg5EJXb8;fM<%8#mEINF~rV^>eO1q5sLIiqcDj7@s_tX~AR~H=)`S3d-Z#7PDLN~6(BZP*R@zEp{N#xls+>HL{2Zai^5Su2I!`q;N+!daxK<=_2bqDT zl3no_&-4E*_*-TQ4kFuuo8H2wZ5`zpo2D`(BGs1#l?FohfgOge2+GglnTYuKiS9CX z^Lqj;bNykT#Ew?={)=jHov>d2hjSO--xG#!-1Odh&(>j` z1GE_@aK%n~j!sjS7U^A7c96#CNgAimQn%PkuTh?!rq^NRE{u~~e1=rXM-_4px#e@D zm>9XuTc}$2E;-GsRB2vAr}&cOGnh1{V7g@LLTU}AUHUam@WS}Fv3NBbYhY+-fchv# zaWfT&CM=gklr4Ol8^}F4PsNY-#ezK1DH(T)j$pbaUO*=!WnRSe?kn@sZF2cG-b78f z4<%nSIHF;irHAol@CAU9G)eO`gN#m~CrQvbnuhK;^5~>pw41tUFWqgR4xqiC@VPzS z{qRfENyL~&)G3_7V{otC;0BQ-`!ZlW%7~F^tRP< z&J^@-udU*o`H_eEJH4EYV1_tgn=`J`)}L(RP*5h&~NEs{2@9)VskZqtTuKlX)0; zz&aa6fMewV*bPzptpGFm2UR9DMf3-Bb~@x`eW9q==TpOMHKMcCkk=QD2AFvxN94-; zX=H2hGxN>>vz8)^=&aAnD4Nakcq6*zW2duOZx$7-Fp!qZ(GK_`-%;p~)(Zfj5hZOC8))Ee|3O{Sb=J4m5g(WpRqObJfeTy$!X=zkn zp%&@Gbkxfp@yk}6)8{w5#9OWQ)9 z&wE;TI$d`$kHXY|Q;CZT3)yHTkF z#W~i?mH?#nvdsWyUbe|9@v`j>zA=ZAb8VKxBqitBgdMvDx2SDzwrI{SXHa!Hn|Xm2 zXH8dUP*y)!eJgFdypk5Oe_8qZSFc76z5K*Q(fLu~w--*C>DJGlD*Uc+%kB*#4lQ}m=@kR{-?r!GHVxK`KR@Y_5Ad?XD&UyIQGy>387h_hUfpi S^!|^gpZw*jcI_8<7ybt-*FH1= literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/full-font/Roboto-Regular.filter-scripts-features.D7,D8,D9,DA,DE.ttf b/test/subset/data/expected/full-font/Roboto-Regular.filter-scripts-features.D7,D8,D9,DA,DE.ttf new file mode 100644 index 0000000000000000000000000000000000000000..263c6447adde5b366bb3d45efaa7a680df9963fb GIT binary patch literal 2828 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 E198x*(*OVf literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/full-font/Roboto-Regular.filter-scripts.61,62,63,64,65,66,67,68,69,6A,6B.ttf b/test/subset/data/expected/full-font/Roboto-Regular.filter-scripts.61,62,63,64,65,66,67,68,69,6A,6B.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e6dd264da6d8ed983edd355fd3abb92d6283381d GIT binary patch literal 4140 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 TFMaZpiD!Sk>b>+UybJ#W3q?pP literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/full-font/Roboto-Regular.filter-scripts.D7,D8,D9,DA,DE.ttf b/test/subset/data/expected/full-font/Roboto-Regular.filter-scripts.D7,D8,D9,DA,DE.ttf new file mode 100644 index 0000000000000000000000000000000000000000..69d7875bca363ef36ae6e01fa5a7793654cb80ab GIT binary patch literal 2928 zcmZuz4Qx}_6+ZX<*s&AhXJZl)lkgma1H{H5NfUmuHU)hG_jp+CokuDGSz6LvvH>y8qPwkx1?Y-rdmp&Gl~- z%wnIl0T(y5Mk+=>Idla33UFJ;K>HB;fHfh$A2`~vcT_JsYkwM;18?mf>KPcj)^?7_ zRt1h%dfG>ZD2wJp4`Dy2r+0=NwpA( zU5TV6WCNDdo~d0TumAnXN2yaSr=!w-S|c5z14@((b)5DpQ*=hy@wLvd_nSF5sPVeb z+~g?FoHIw41&c(*8AGmxP#tiN<;#$plF^v8N&(MrE+5&w(^dN~DiGsB^!k_Xm12F5 zwOqaKyZN4@JZl8d0p?pDp^1vTkfL%gSj(~6EOv=z>0@-4=+EgjwG3YA#wy6bj_$9Z zr)iwxw2$6JN4C&5`XRN^x2Q_0rB^6P$LV#!YqpVBdWv+}Pua>^@+!wjQ#pBU3uys6 zLvGtN<=Q^XaLdXM*h%n{`lMQkb}de?^4ruc5}r%{ZqU%w)IfD2TN{}~-S#IX(utjd zA1P~bo{n$2QYS5;io0e&5q_vwbb>w7HM|@3S+@m?VjauGykRzkX9)Lmdmf-kRzK!$ z1|ws|z!f{&#JLJ)op#Ve8J*!an=`tEDO;b>X44 zP#5*k9_pud8pa)TL5@%#_I9K03R+34sFG@EorTJQYVL};lWzm!hG;)H`oP+YGX#f- zS_Q2EyMwUz;}o45aY6_9b-EvxeylCGqed*$g-k>~dm%e%CC@42R7OdrNo6eQW{?-$ zYs;7VG|DQY3+#b)EB#)m7o^w&tCv}t+_Ir+X`ZktJHAm{RvY&Bq+}pOfx=7fv4|i@!`{jI?jCa%u+dQv^M~KjJ zYb#0@xrOGct6E-U#cIv>r?aA@C)cKvAB@!5fOVt#2yi`C+R8{u|j+y#NuN3?G)mK5PuRPCB%Kja2^yQqQh?x0z<$l zw3$1aV+qEN8-Bw6&f3CU3URi=ALepM-^k^q8(U%lLyzn6 z#?H9DQSWW<ewM>zl zVXlTY>s$^t#~zIF@u-j2MGc?duh;YG<`|!j`uv6w=C<28B3IE*D_eVr+g5~mR+^zT z#_N2XjCfq|wZ;N|J|2(z;;7&jp8hJHWOTQo?oI=0j$B`1_9WfOY5HFmKMPlArgESlIFyGYCAD?^5l2av2j zF{z<%8JnnbUWnICOzN~PmRL?v-$hz3Ux^xFJU5P}K3AT{v&lnWORDp|ZqFLrXnl-R z#FwDrdkqUX035e~3ZQ!KH4?duJIiAJ4}4dR@>R@jBfGtXO5K%iZ(e0Z^*wIod1j_Q zs{F$IRC@J=pFR64mES0N%e<~hO!}*Q`9|=W^DjIjUqTLRlvy^52fIuG;w+MMF}9u4 zOaYQu$eG5a87@U$bV-XPX**5|uu3+2$}~SgSWrA64=A(JqFeD2;w38{;V-&qF-hCG zq;VO1a%3UmE5T5E*}VEwJf>$wyg_fte^ELpn^qHil8zi1ec+Br(&-RdQjr~EVNONZ zWsR#dNxR~-oHU+2Q@(0GV>OKBGiGPZV4KXzG1kZ$$IMB#Y0P}ddb0-)dul7*VcC>gL8 z9?-aNhHF})Xzpfsp~ja8rbKYgh$eU?B~Vgo57Y$R_f&b7R958IRNC|AtKNJT43tQA zwW^fi8a*|tr#_ozy{+%C_2(XaF7<13w&UtCd1BD~`@iSCeE7zRI_A2GH`5us6SrgT z=HY#2Bpvw+GtJa8^?qgkvQclgsFzW;@WYH~X-$hH9CLMHSni%me??y20qW=P#=d02H literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/full-font/Roboto-Regular.no-scripts.1FC,21,41,20,62,63.ttf b/test/subset/data/expected/full-font/Roboto-Regular.no-scripts.1FC,21,41,20,62,63.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5f46234ae2c6fdcec51b5af75114241300f77ff1 GIT binary patch literal 2836 zcmZWrdrVvB6+hp1AHIGBKWb>e0q(^GLa?!U%n(9Tni^K|*CY0GCT8qjqT>)I*VmacnrN}^R-r)laRnYvZ!6w%n;`L0b( z+I!`5&+mNSIp=rIJ-+t>0RRUI5!8-gTRZFq2LMGQ)O3Wpx*;D-0K|jX($W3!wk&Sq zxU1V&H|;z227sU-?i-lskBW|T5dB9HKQwT7TCF~3cp33U#682&k%`A{_5B1ux`Z*` z8tI>kf&zD;jy_-+8Gn5EOz)dN1TY-On9q$4PR!;N*qyi@!gc59Q2*fV1Alq~ zM$uq;Q#yz1e?xrF=*0AF=>a-}coA{g_~byp@Q7H7c#!)~^v_1=X2FPf7O{G;e`3fX zdPU5Ie2FtUIW?W00NhJn;_J~vL($iVS1x07o@ueDx4cz##b? z_gmpLsR=fSN8p6$hrRT>FlTro{b~AB^g$+u@stI?xP8Ty`nu7d&65kKpoKz7){v(o zWRKXQ??pPug!5DI>De}rNFZ_xh{`bHEuLAj%&tE&TAK_$0kNC6BR&QPRJ zUgbN)X3VGJ$?G;CPpn+z-uq#1Rwvl$P*$fn0o$^=u*NQ~(Iu#W4cR?1Y5==n5+23h zH2%DZhF}C{U>y445cXsUMA$bxn^x`s4CWdZK3-!tRUeq8?XSi?a0{rVB)?aGL`7%;yYaUipX@Li;GDv zPH}O8i!>LdMP!D1%y5qx?lF_FmT+G#KH;LY1o!oFaf*vSaFOQXz7pI#$%RkFeUm6~ z2pD)enK2ZO6Y^|ik))qu$BW}ep?ANR5s#|2jRhI$^D^pTWRvD)f=6v*d?#Kc@MS~mS_5{VZIK)eVJN(~H5WIyHMfQg zBS9}SdOEwqZAei=iY5=+*yd$s539n9#S^b2^J=U+ywr-%v4KSe=6k|Ruu=Fp8gVf< zl2zvyZP>T0jaRwO!&>JTRoD}bS3%IV1XaSv!H5?hF0Z9OBXjty;Qx9*-psZzqdr%h zmTZmaz>L7`*cyq;5;IkYwX3e1kpz*c-LctUOWZ=e&=9CAaLQ#Bx)qsdf}7M6H(rG+$yc8F4fUL(-glEb$S1eRld0npTM5x3`eWpB zB7H+t@zI+Hg)p3O6uEd+J#6VXthcaF-eE1@(0SQT^xgm8kLjQk29#TKd5=3!#TEK6RSf zZ>9eH{1F+Fzy5yeuc@T;%lFQwJm=rTchTPT4dI5k6N;fTVJj)c7V~sxuBdHJ9+lZvDrQQ&JB`E0;R9~Z~pqv#-9G&vildm&%k%l3Z+2zG0OQAGQqbV8^mv2%imKsU%*${b(|Rf6=B$o6Jy1%!nsU| z`Y5ap31Eq^dRO%E;X`7Vf!_|hFHUp)XRV2NMoGlD}5d z1U_0?zIK=X!vQnwzJ1b~{QZ@G2vK1nxx-0!CKn6nuU0OQOQobg^{T{PN>#m>{5P4U jAL4g}UWs8Ft-$FAVgQ+5Cfo2EBsbnzQ#@a}>974ih2Wdt literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/full-font/Roboto-Regular.no-scripts.61,62,63,64,65,66,67,68,69,6A,6B.ttf b/test/subset/data/expected/full-font/Roboto-Regular.no-scripts.61,62,63,64,65,66,67,68,69,6A,6B.ttf new file mode 100644 index 0000000000000000000000000000000000000000..424209a66e2aa561b9977dfa1bcba2a76f604d00 GIT binary patch literal 3912 zcmZu!32;-_6}|8OudfyROO`ET1^i`!3|PX8ESWeiIK;*fPr%p^Bp1gvUa*NBDe(eX zXvqeyV&bNu358~9o5>`G2~P?Q7Np=#AW3N!LY4`grcGwrgizXM?IZ+Cz3)pxcG|De zeec}2oqOJWPhUU)z=TEsxvr*m1vG&MfSgC~g1Uw^O^^*b#7@M9x~BEZlXwZkYnqD7 z27B(w0pJlrTStF;5Dah}fU8Da-Z4BV7d@kX4Dmt4>$-!R`?r46b^t&%iF3ZVxqTpr zt7T!m2HOpr`)==k{^R-r0QFt?eXXane_NJ0V-B`AV0&&)S9|B>Eobk*`34btd(fdf zs=~R+NyPJd`Ukf;&kMuYE+H=I3v{&4+NH0>_8!D}{q5U=TotcHd>>-@miGQGli(7N ze;fMD!N9;^ydOHT{uFBu-qscTb@!z|pg6c5Sp`fho$^6Aqt0O*Ts#h$=w&UERwby| z!>d#rr$P^V?tpW|MMlZj+)C~xUdu1%$M}!Y&qf$v402!{s1yW{fl&ZA4@AU@ya4en zjNAWtaJ;%NW&qHxx@3)AuPsT=k?v|h4+nFTjtm8{HQAS~&Y>ls2f~j+r_c=j!gd%H zN?@aKFSH6jfEMl*s6tuV%T*6Yo55qU3E&%QE zc>GBPC*tMoCQIhw_ggcozJ}SDa`>G5%($49?~=x^E?KAE)s|=m5NeTK;#mZb!43$) zHh2e>SPjjv3)3RP7{y7* z5YM5q?BRu-y9B@^#kBBvZMhL(r z{0`#Rg{TWQ!w~c#quWrEF0=#Ci*2_ck1|*crQn7NxJE%Gh$_A}X8L^B;kY2&j&tsb@;VD< zXR?}jYs-o|}t>F@1ao#{ESI5YWqWQdIzVk3swh@nX4TsD@Oe>0Om7yGp`GseuD%*2^lHWxbw zm?@UAUjPjz0R?A0)i(ITggoe$~)y1 zl%Kz%(P#I|Avv_FGbFE&d)hmxFkdOLp)2GsmMJv(deN@)*=V)jdZpUs_gA{8z^1_w z*gNFM3AQ9Bz*2D)Pr0bdSua!G(coL_qdRJ>w7SM`wb|raI@#c(lQmYG-|wR06^_W2 z>8Y?)JE^$HMKy^TntZg{O2HorvH6;Ob{pLh3Ry!KK?+aK#1jO*@2H;cKm}?i$c_e_ z3Jbf<${co^-G&VPH7=@k);IZTk)jPL>YQ{zt&8fNbRiZ7XSk4z$e|`*v>NZXjtLEn ztn)=-0e?Q|w^BQjl}9Ed)Gg^_QOX8W--VY;fBYhUL0FA9 z^8&alVp+JzXu6tOBr2c5ovrmzOR+U<$y@4IfPg?SB>^A+1QE_6;Gl?JDX6{}hleu> z)fM?{?_0m}W42n@q=FRAPkX6e3ft4Lq}1jp6zv5LPx(Bz+f(ka7l_&Ra+9Z$GqMgsGPvh`kq^QvL3Y@tAY` z4gCGuh&y%>cWe&SN2Iy=xOifxBqS!KC~FXCkYyOsEU1QsNF|AynVm_H>Fdrwl3?^C zWw$$&T|mjXr5$@Thg8F-Zuubg-Qc-BFMO^!q#5hoy?@`m+nQUR=_G{&@*n@t$e*6; z-Sx*w`?1qZABTDk}w3Icr)# zsB&%^mXv0do7`m<)Y#5)iSt;@sBndmh0%KP#PL9MTpM`##eYWk?xbs*4vy^Q9N&`S zd${sTFgQZWzfn(|d7OOyi?fV<3$p(bRnA78`yv`eXC`1y@?0ncQ`D~+3rp96yVpBIfd8%Q#?=AlHZywIr zy`R1DRAE@B#cYhIE0T$aDwQ`%By#dl&)5+oCXw;`F|yPqX~L*Uc-AyXB${;w6Re~Z zcfo@v8Bef9ok%2iw%z#2fdfa!tC#7DJOO;@au!nr^~hFlPR5~JTgoZrS)`Fni=It{myR(_Hj=G0 zvioXI+RFkgNW)ZCRk)32Oe#lV1=|vjhb34=I=|X3{Ql*D_StXG4t;n{+t!1-9t}($ z|Hsisb{%S5KfVhSZHg3)Zu{=TvtM*>2t2$u)Utz=eR<@qC&<6{pT)fy#n-^U;#o1m z^%0#ZOW7MKaYi@{i%Z3*LZC{WkqiVGEJol|EI3XI>!$N2UbmcOv>TOUtj3C))ZTfD zY~Z7$H_$xdh(`G%kH)r7dAQexf^DlWPqFt=j=fQn9@R;F(=))bh&U^Q%`HllBzIs2 zp;YGM;#7Br>Wagn>dMWJmpU%WmwU@{%wmCqtdB-tt>{~_q_0A#B>AqTOPi}$QpQij z>WLp$G~oXaywfbXY(>1LAi3iIUdFi1VNE(#yccNp8Jb-j#@FoB?+#wNM#)xC=u!5| zh&1rGMBz~%`}+^dt8+NXIKwezz+2s%ekrx+dWm$#*VGFe6M0!GN+D@Vz$u z3z#}AGwuLImekfLxu|T7hQna0vn%0xdL`*h&#TDX>Vz)Rf z?i3#ppB7&bUlw&O7=f~F#tPyl#7>S5Mxz~M?MJa6lK0M$uWygtC&J~{t)w$nH5K|V D)Y;?$ literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/full-font/Roboto-Regular.no-scripts.61,62,63.ttf b/test/subset/data/expected/full-font/Roboto-Regular.no-scripts.61,62,63.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5397c5b9caddf4fe2540bc8bb06ee5b64c8c4eeb GIT binary patch literal 2464 zcmZuydu&@*8UN0`*Uxy#wQ=G$UX$zI=GE9unxyWQMO(JnNlQfIB`Ld(x;CDjR~0wj z;$+#hLSb7MymqBfgw#El&;+9(dThp;v_p!-CSKZjZHOR&K-wPzRRW}erb2Cg=f+LC zifi5Pe82B}kKgy5t7BqByJeHXn^cQ?9Z?^_s0f@shXU?cL2NkhY#LY#u0%B zhub=`Q(vqkl70$2mP{uyTb0%w+npkH@}CWLZMaHzyNw z8C3fe^q9yuIrI2Lc*_Sb6WNeo8l6g|7b~3#^0PzOSEt4kssA4R%@f$`0S-^W;Jj>k zRpbKRF_q3Ps$XR*z%#;sW;U5%-=;O-Ah0u?SjFL3X$9ln>RB% zmo23!1^q>_pLujV^UaBCKf`cPkL`zz=m}b5A*^CRHCY~m)&7eEEWr@ zoT8L6N@?Xdol@HAkeNfFGgLz(WHAwum?lX($OgTirzBzif;l~!B6Zb(GyXkR4Tn<;`P2I z-ILz8eECRK&%bD^ICi49{^8yw*7w=aN7ww<-*>dz=KvjM1+lS{UZN9}qeXfTogJW2 zdX~oMv($xieUl3GJiP@kZ*h#g(hH=?0jf~C$*Y_u)xybZ-9pvuTjaK`Ql)hblM;`t zoMd0d6v=Yl(g|wy>#O{0nh=eNcjFP=Y&`vggZr*~gjmv6EwH|Z8?q}$6rR%k>+G)oWT&EgFKjngE} z(+n6rikXZ<&e1gXj)6x9?V{b(Nqgxo6SV{Fy(Q-6eD@ihR7kJc0=pO z?kwyxsG`w+R7fJfM)$%pgLP;lYR*LCU?TV|K&EIHceQeAr2R#tE`$V=|-_6EO7 z_Ex&Y_T9BB;DvfgGWOlkY-;k*{ap<;!loSlOi$}pp;^Mg?OUsaW_{$Lz7D_8Y-b-k z)U6B6{<+E6owY)9j6}nYW)|nd*g$xjuvI*jI_5If(jMp!YkSkp08ru*=huS@Bb){uhl1#Dr&xd)5f5c=dRI8y*-_(jdwtan9pSxubgkN3BR8wgFZ|$@cNqKY z>)A(=Coj*vy>R6{rLkD?;EVd%;`g%J(8(V@_nj*T6LYEl2fl7xd9_&iHA6i;y6;av zdGKLzp`I#TRWw|_m9&*63Z7cOpyyG!jGpanW~VMR=ep6h3?ScV+X`S6ZCmWJXxr%$ z3wNn`&t^MZR`b41*uI;2C4GC7O?P*?!py<3_`BkD%a7i@Pz+vp7yn;}aAH?+V%un-pw`u+`1(ny zAg11+YzMG|Wu7)!aJy)ct19;j`ALFezMYjIN$x%6vFnZIDPZK%-N|$Iis(<<4OMm$O^s~QM)vx><_rm`GCkQw= literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/full-font/Roboto-Regular.no-scripts.D7,D8,D9,DA,DE.ttf b/test/subset/data/expected/full-font/Roboto-Regular.no-scripts.D7,D8,D9,DA,DE.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8660d677e437dc6ba7987e65d3f4b2a6bf62137d GIT binary patch literal 2808 zcmZuz4QyN06+ZX<*m-suKReE^o8&oeou;wt{E;*vgU~t&X|=}0+2qHXHX;92LcHd; zi|C@3ZNcgv+Ykr@Wgx1IZte9G&@`)9hS1O?#sV4)(hkrz38bO1N!e6Y$@9*AcAK`F zpM385&OPV5=bU@r4-f!wpb$W52{tvuKCl3AXarwNs4Wax3=<#X^p^0qcBSx6hTFn{ z%JI*RJ%Rpfh`V}5x})S{(uTMfaj<7{Tq&D3KaY4GaYui2U}Wlg*LeW(3UXc<=pKtg z8f2m#WPAg|NBW~RzkL_LJPp7f9qb*Mw%crZI3L1!=U`uV@7kdczK47)pPE55SQbU( zCf5*e85|j(cK?fi1@Qvn;^EPrZhl@kjF{!)9O<5pa&^3f82LeYw0oq_A@~JcYd_kY z(b2K-#0a1-d4|nL5BEi1>c8Hu*4yj&;S1T6VNM`!wK#P z)N#jPMhJo`&cdXy2)d!+KzIvaFpXyKqRWymlPW{)`C@Fkd= zkkW`TavsM!7k>ZJL0iMWAur7ceEXmF9ZdO zN{;;d(9aS!?gAW*-yNW(t*r$bS+*w70s76)a-aY?%RGg8Tu;G^)oaE)v0?$w92|iC zDV<<oA`kA|W@vo-?&_`C%qAT8WpEW#Tjw7nw*fQIt<6Si}U2m|zhT znyrwaFb%7*)Kp!uN zOZ>qDeoB0b(livLq{~k^A0^w}e#-llX3B4EZjX3WC8oq$dt*woGT7Zqg{{Vj6MZo? zpil@$hER4y+_X`3-BSBhwcbw!MuQRP9aE9uP>KLY!xUKeQ_;6qp}aQ~c_>0>gD%<_ zR9$Yj(nOa+5xNv~xmDFqO}BEyTvfEw|W-RV6G!_8Mg6XMpYN}V6w{Gf{cAj*;tjEe6(?HL4k)O z@lpu7E<-8*Wl;6w^X)|9E8$gqRyg1rnwaUdJL+&pn<5kft~eClry4*)Al(Ea0?~1w z8qXlqQWkN4>{?aJD~R0$W^*x=*sJW$?5fI|d+friL{D6+`da@R_vVG4z5Gj&t`)zh z-;g=N{e}O0&HKW|3or0jF^4)~g{nviHl3u)=M=8P8!nXT)RpYc?nXu9I>y<&lpM+F#Oo>M%wly3!EJQZiqaYVIz4~9`_!2? ze@v{u_~@qtC(k~?t@$3|s{7Bq@jlOI?Oeb5og<6y^4!lq(tk7G{@fQ!WH9^z*>(Q0 zR}#O{S9(@Y@^hp5-~Y4ejpJ*l8;NZlUux&@9o32FZWDfcsG5|Mn`)+E^X9>hvn{5>8{Mq&Tg_wJH7jU-f@1 zE|RQMFTOY@QvK@CTSwpeLVpL<-Rqw|Jw5X@!S4a%4l&noUOXv4%)pT{QiIrQw*$Q$%sY#D1N;}P)|=k| literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts-features.1FC,21,41,20,62,63.ttf b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts-features.1FC,21,41,20,62,63.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d45039738057700a44820a6ca7864fcfb71cb044 GIT binary patch literal 3476 zcmb7GdrVu`8UN0?e%lyh3%cf4#-1kro{JCun|Rb#zKgP*WkN2SypiGXr~ zY7$iBkC9)(R(OlSu)m`iT;MFSOkB(|Mxl%LQP`x(mIi1921x2g5@w0qJV!ZZ1pnVi zu}%2~_NsV(_(?8y*i+FvJ3xMhUC$LNNvTkBu7ECz0fZQ(%6c&RE4J8Hoj$bkDc7570-jII(Y?bX>M2CgKViXXq2#h^b)WiGCGR#neCn zWK6@fpztIy9n%9iyqQ=5(I*kXLa-G3P~;E-?7}n(&`vr)ee{ytYmp0?%VizjR`6mq|R$lt&{ zjuOa9lvhxgXH7~^%u7s{@}$DTbyl@3Q698(|9U)legDVSPx4L7XnN)a%Xikt$FJva zEbr%gm){)m`9=gUFs4Rkcmf|o#B4dDdJ8W|$S5eZs*|h<>Oy}YP>}CQPgAMX8G%5a zKRG$cqEe-&c`^!~`A{_qpQ?=)msC3=Q+&lAdft)-;g=b)rm3 zzN*#f86F{g#RexaQyoTKoGVUebi_g6@j%E=t#R64?syr0yAzLqs6}8VkJ`m5Z~z2=Y|5dg0!U8%D)vBPm*GNm^1Y zSu93PI83vlLFx9jYqvv8s}1Rk%gN5UorL5V_I;{SsZ~u)Elm3|PJceH4@V-Jix>Z- zG8iZUeu)?%cJpRP|JE0D`PQw=WWqScaEi&OnvlH%*>lZii&GvcDHD@-@7}&WW43wo z^YholvAHD`4!lLiBaw(gqtvL>Dy^E7p+Pn^cHCZ8v_YfM%r7shMn}izwPu^mmTa+F z^h--ibMq$@v!7l5=V*v&C^sCwbyXgVi#w{sC}eY^=gys*Sem-4N>5MAEGes~tgI|4 z4mw;}S!of<31vs(<0FK$*RM@Z-kNl|?k{*e&SWDW8yh?O(b(uLYDtJw(lUl)&AKd4 zh)qgzU3*YhE$Z?}b7L1ST(~+hb8k^`e{w;k(`&`hM5ex&Uo@@tW@epIE?qFr>9L+7qTrcTik)_ z>gs^ovOGRMeCqV)vwr{V_0y+@$3tv9`YxIkXR`t)D*c(i7NZ$?d1s8~WaI~8v_y4W z7o!yq*eI!w{VXO|;eF8>rSZ5J*t0Pj?@U$^qd5hbDMm}AW2zXfppA4TMk`nILZ3r# z#pG%-(a&SF2Hy(pFPEgHs=mF}hc=f>VAbg_t$9stEUC7?F;_)#5IHY?Jp$*jtynSDxvMOY2 zL(c|im3lnRZFB@4eaNxu^(fh1p!qWXqodZ#I6H7{0_GOCF}+7-!W;O_yRX4&qrEDyj|%mRE-ZI;*Z5TXgIR!BSL9{Xjzuq(iClN@_B zLn)PG-(!-s26Lt7yO!=U)R=7e?rPx(H=vWKr zS~`jz4S?>#-AOypE76HQ>XomJvhE->>*aMGfV>#r0onAt{PUsrUqkr18z;Rr~m)} literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts-features.2.1FC,21,41,20,62,63.ttf b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts-features.2.1FC,21,41,20,62,63.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d7dbd754355abff74290f2a74d0a16d8de9c1e78 GIT binary patch literal 3476 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 N-i#M(<;_HW=|88?wx<99 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts-features.2.D7,D8,D9,DA,DE.ttf b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts-features.2.D7,D8,D9,DA,DE.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cac2b1e8453af964946ce4746c1b1fee732efb54 GIT binary patch literal 3948 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts-features.61,62,63,64,65,66,67,68,69,6A,6B.ttf b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts-features.61,62,63,64,65,66,67,68,69,6A,6B.ttf new file mode 100644 index 0000000000000000000000000000000000000000..715c714e27b5f0fa7ba8fe5f423b0b7d6d335fdf GIT binary patch literal 6584 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts.1FC,21,41,20,62,63.ttf b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts.1FC,21,41,20,62,63.ttf new file mode 100644 index 0000000000000000000000000000000000000000..40fb67a996f6b5350b810944ac3bd11dd76a4623 GIT binary patch literal 3856 zcmb7HeNa@_6+idA{oZ9+mW2h1xB|N%$chUriW>!jiU!0AQR7s@hX{^*SfEDRG{YLr zv}T%gGM%*3KbmQi=}a_;0j=^=(krVeSzM-Ekp>yp*g~nel%|7SZDeohYTiqBY0U%c4fI3I`87Io z^G(Ids1a7{=h%;Eu+Z6N-z73#)Z(=TruQH6!QLZY1sVIOkN$n?LL&PSTa;g=w76gJ z-Sp>`QmGWNSb6n(p7h~oV?+NTRpqszGasbn@qOS}<0&nE_FdEaD(VQo3QN%<{!O^M zx_i1h=VUgiNyVseWNtDN&u3dPYl>2wr3<;T#)Yi04rIc`vldYqHE9|s52!|_v_ERU z#9X%KCPbdz8MKUOA(}v)CoJf=#&A81PGJc!2x*JG16!B$$%9ko z&G8~@!%@=ZOdB*D1(LeKxCtV!lCK}Oga2yw*wV^k@nc{n<*2d^Hcv(FVkZRzo)AT6 zQ1v>!qUfMw|8uRZqPzwr^iY#>VfGfUyr}Vzc!MX1LFE^?d7@QxNF**`vOL$)+Cv{< z#*uA{)WdQv3HHk}MWFU#3A#=I5pa<(2t4h)gi`4C@Q6r{V2$bNZ-o>T`vYw<*3L}$dNEI9z8Ce&&c>W zi(usa`y=H|=wc|2+(ZRM#Rcw!jQE2147ETlE?(p|N{N1#tK+Sa(B&N;yFV#(2)pB% z7hKP0$HrzWZ_eycw$8jg==TpY&sipGx0N_$7#^2OkH%F>QCwD0vD=v7jx!bqg2AFf zUq-sYV9W{z3j&FW2`+;nBi)x(oS2x_wnzw3`?_7HS`KGE;jLWZ^sn%mm(&*&Z7B%u zDDiL4HfPmjxQY|2zPV5wvt;C%Ug?XO?SG~)r>?AFx83J;mWN6@s;j$K7j1L|aya{3 z?Y8((T;aEXK-2_RVq!rcSnQTTeMN;45N-(}%kA@t_}mKL;`K{&H@K5r&#tX#4wkis zmQ)1{Mqjd9pX^T#h~s(NN>^{q%l6q;J^94Gs*T?crI&cUDe>F9F*a0SlXjc>mEV$; zQi$B?90PeGO;wIYV@8&bg|DW-h-A>C`1s^4f7Xf5 z?^|az&2;YEpA9w}#lbEfEiA5H4O`#&g3e#NcAgw)hXhUm;W7WalupFTZ0J$}=W zk&&KTTE4cjva+-!l$M#7m#$HMc&Qc}tKl`GUA}bv`nBtsnRh3BK2M@u86F-!_0jOq z1agUs(bEiC+JZ%SzOcBi%DgrsuUh2gQ|}F*J$v@z=VB+$Ls z{)_T@lophuv_)x!?8?q4tx}z0iPE|U=IE(Q{46Rr;QZYkq4Bub#P%qS?;5c-N-Go; zjwr2?MHr&Aj+W4cD6OB53w=Jl6O|juK|hbuCY(gAQQC}Cr9MhqC`f z0&_EJJzw`N;Jff&U=OO%K^|I$6FnbeKCQ%mfZ939O5pDVo+deOzmx|tmwOSudRNMI z+zW3!Yd55Avc>_a=XpiAR!HCT5z6p2P);?l{{NA$#5Z*XY|Cj4^7&sY;(1`VdFbIv zyp22p5>p|lyg9BIR2gE~Aa%Q-$(HNf19=I) z1D4Wr^75nhUwZRP%Xa7%pg4to|H6S*yc#(T literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts.61,62,63,64,65,66,67,68,69,6A,6B.ttf b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts.61,62,63,64,65,66,67,68,69,6A,6B.ttf new file mode 100644 index 0000000000000000000000000000000000000000..28c360518f9ed96d064c79c5c152e81814946cc9 GIT binary patch literal 9548 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts.D7,D8,D9,DA,DE.ttf b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts.D7,D8,D9,DA,DE.ttf new file mode 100644 index 0000000000000000000000000000000000000000..bbab9cad98d60d740e76c84d85ce5128a7edd02f GIT binary patch literal 4292 zcma)8dr(x@8UN0?yZ0{3E|^7avR0wrh?6b1;`WRi$P!GQ&5p(b`R zDT|5IIMcV&X`8;LGwqD|r;TZo{?R7R#Bq|&B$GNVp?@hsdKgwNe_VEwF7+r(E}%7zYF~4hURr;Pn|mS7WQ8Pzq`4mx@GX< zkMDuMTJR^@54QXBd~3c9fACNF9lrJhY?y6>{W0*h`>_Armp{A;`-{T9v**yhg_NOm zB6$sTdONYdCae8jA`A4Tvt4`JpLI06D`U?C{i-eql1Jpf!2iF%uj%p)Jf9Y(GvNOO zKCh>*qn)3U>cMXYuld@aKR~&x0{j8+p5Auf-eY@C{)5N{-qduUuYW-QCzWCUhhiTO zs-ysYkA6-UD9qe!JqbLml!G7dIOOl4lurNNZb~t9#U%EV=oRSv0gvEr4GE_Jw8hXr z6mh;h_#id%kIBp5r4nNm^d2hW>2yD=hV-{#1Ft4q>~-LBPS4QqvAlUl9Bd>cjFgjf zl0N%j)G1=IR{p!JPS=b1v&BUZ(L;tvi1`m*$b07KGwS9AlBCN*{O`B2io`nd*F7KT z8L`(bZ%S9d%EW~fBVL(^qxBE?`)G8XPu4OQJ^&NqkB-{CJJoh7(9cv#Ml8Lz`7`YSu-fMQGfa z8HY?{5wFP$N{c(ioDM9x5zmAfZ3s^2d5qacX3&Ntb@m1_*2pYQ{fiMKUWkr@CO>N2 zoX6rTdz#7^ZVNZblG$YDT=-wX7bH=2ZA}B<0}6aJHYZMtzsBN8Aed@o zp#df9bDdoS^d2-`-j!?IOeDla&O*i+aA&yB%*2q9=yWDC1%Yv=nS}v4{x?uomW*Ow z0wqqAB|1tYXo}t!F@#HWejZifB%UTe9f@a;Scqgi%UF$ym?UBncvKyiab`B6gJ;)o z>M2GZ;Q7&;vLum_;3dyZS+dAY@J5BAmlFPjE`~_XN^5Y-zIaas#)RGy`>cDfzZaFo zwHeMg-ZwqQ%@uizv)@3qpqfw*H%=SOmxq3V>S0x^lW zhzgC{BOIiCD-rYw+6`|{z*`G+i~)KlqHM=nV+h0zh~EYD_n;7&1~HLj%y^MtFk>dn z@qC27xN-6Ov(onxdG#RwGy2I)$&?S})diL14s$_eu0zStoX+yHs>-zTG)D zR#xN}l*_V%*J-`iqKiW;bI4uzSb1w(+1Bpb?Y&zV-_05CRJ~qRJh2n49fiF|Sbwa4 z|BD+p9DJ&0$1iu(zuJIIO7toI6Mh1eOT6D0D_~4p#mmdK^2&;0zB(_3XOykt4lMf89-xy zcW>=$9e8S6(9Ikc3_HEd{7`K(Gs@7KtJBKDKvaHm& z*0~%xcGc<3xp(Wmuq}2u($duwcWPQ*D!?@mj(5M;xN$_{-9UJUoW`4fhCRhzV6U-} zlekKQoNR&qD(|(&bc0mGD%hxv%~^SiFtEWO-oNt4hBn0T|0MHmp+g#Nm6EJ zrpq#a?aBpX?8G2*Api5v$7W{6#*9g~Azr3(b!H~TCWXV{#f5NWDL69|3`GKL#vISR z9l5t7_o9VxhW+&EGviCT>@M24abuBN)|bZ5oYo}@UAuNIM3NrXEvl+2u`ua@``xBF zMG8$$T)K2=VlpJD*`D0oTu-)YHd7=fnPn3SQLGjTuK_cvh!k1u%L|Q-btP$$iTB<( ze*E|w?@dI~O6nRT%#v)k+ieyW2?eL8rlzJ5>_*`J*(sfeW`ki_mczl>kRF}Ca^=c= zRG*(;ys;b#1{YA$(!%vnGCJzw z-hTM&68=i<_UY*bT9}@;+p{rp&Yk-d&UPeoT~%j3I(6#Qf96$n(&Wyj)PN;^;u#qk0b2&m#K#nivcqcR z+U3iWlamOvFc-u@4&f@}_~U4~P@NmqDT=y0H@B=RhZTo?iENr40&Y`DH)fBw_)!)n-)WV5A6u@F+3TUZJs z;*y%H*+N$ZYLlUu$zpRKR%b_XAI?rr22B`TUkET${vE!ZSwP2`W{t&SB*|7Ad@nCA z&cSaeCfV$ED^P>)Psis%5uW5g6Xs>wLR0X4J;sFF;N;{dpPW5AYWPOR8osgcA7c{# zrKkB%6Evf>yeC0(O5sl@Xo*_5H9?zh(=n5u{VXAu@tw3UPUGclV^1V#e0#FG1kI_6 zr6y>JtV~YOCcIll6SVnOT_^p_2KsS;@_f%dO&qh_ifbwW7P+{XJHdx?`|QY z`w)H4O^ZAEyJgx051pt+h4w#)AO+KBgQSOuadPPo3HoU zYUH^e^B&~97g*oIy%oHl`r)Aur{JMdD#p2&;(3r7QQL~-LFC_ud^!xhgND2cy5gy% z3TTUS?1nd?wGYxB_}qhD5&J@~62Fax?^_Y7@#R=U4Y2-dJiadT2T52r!2V&>^S@5S zb6dB0=uUsfQAe4PQw6A^o7{R()#$1|RInFxGaUj(1E76aJ@g2$5=i*zfHAild(UFW zYn<}{iVXqK3!-M_(uo(5#jb~T!h;V| Ok0 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 z zI|qm4+%)($Ddq~fd@c%sI6a+ST9Qg>#6-kCUxf@UEG!^dh3_g$v32cDo>W%Gg$<66 zNALpDsNrVC{qYz~QT!6827lliYif+QZmn$I>i4d$j#VJ_a6H4ZnfNgLQ%(U9f#8qj zvg&z|>^#^Yl;j%>27WRMSAi&;gF2m1I5P?UG&MaJUx*du7L!&;t6xf#Tl zYIKMf2|Oz31SJcXZ}-CLk+YTwviTVOIHpME?Q&x+a1?HixpUrw*YX7AlZzDQtrI7*ZOZKA`I zaFN1TppfJDhEj@3y8^t?;Aq*iXHQ#=z*cJqHEdPxbxJs2%RaXs^d(uB#yW{4;^a>Y z1csRz;!RLW2fWQtoSW0@MZBuQkKiXpPMCTIimB)RD?|>^E7xCxEK#y z3|?5fNDgxE);&FNP;YulsVpDlW$z(Jd&uRYsOT=wwr!J+b7*@+#YlK?l1ZhD337sq dBxq?V!Y;-0d~hT1CmvYJ4k>pv2uC+U{|j4-sO10v literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.no-scripts.61,62,63.ttf b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.no-scripts.61,62,63.ttf new file mode 100644 index 0000000000000000000000000000000000000000..06dfe74420aa93899a2e4cece546811ee81a253b GIT binary patch literal 3456 zcmb7GS!`6-8UD|`GxyHs@$6#{_IMb3#v3!X#~u%h!3$svu`$Ke&`1z3ctNqTYr6#c z(Bg&}%Ci6-Eth9i|n&X2y64ty2({pK^xectY@ zZzKK$u)nptxt9!d3H~X-CGD91-dk73V9)t9b#$F;5AAyAJjfzG`=|r+SO5Io9wMn0 zKEs`D%_r^kA4-scsk9Rc{Y~jT*!~kZtFwFHtme1$ci<*qQ&&%GGuuml1O`XabvK{w zr8HIo`~zUm>E`aXpS2AAgGjptIS=>t^bf>7p%CW(#OLu4wZQ*AMqWpq^81o3oTo!< zg@QskrLr$5U$L`r$Mq&a$4FFqz7O9=l;7jw5jUEM88HrHS2%|kG`@|7HLO=N9J9vK zHJ6@?!K25cGLnaAi0)m!?ci}(qwqUdhx0rBC&54kRm4LJ7cv z?*yy&5c@TsV|RpKVelj>X;N6&PyyW=9i0R8F)ZFXwpqNO*b?J$xlUlHKf~E$Dh5X2 zMNDEcSb!PRFfF9NLDDfjh{K!liZO~;#YV8CG!l3Yg{qOfR7wZv1ohF|N(Ff?WKy0b zjLMEMk>?~}tU9g}m|DpW%x2c@WQ7N?aB*Fy<%~EMJ?lC>=f<(JLVl(a@whEV6pT%? zS@r-G+D#NGDJ_lc5+ZgWNJ?qO2S@SlV18F%fImMPI8arR9 ztF@VvEE=07w>K?Rn4&QmRatV1){^Bl=6H23N3uQLooy{I+Zr4#3fp9TMx(=-v#qNB z#C7i`gU*qTmq?)0*tB34M#)SCM8)BVyh{k1v%}zRcber0)&SaIEy;1h4!e!B_h&~O z4tLjP##qCoH%F0sF`g8Qv)LZslDgoHyQnfzxwhh$`s3fbaWHp!q56%Jq7y zaYd9=DizH?e01;n_3L*ZPU&4Pv*>gfRV3)O#?5ZG+o2ODKO4S!^X|iGgU+xr@n{Tf zVt!^;Se~38q}9Q+1-wZMi}SPdT3I7X(#pixty{N7=R{gb)~nvkTw7g@$tu0YZnvxF zr&PvGn>I=6m6a7aRW~^@GVtWk&kQfk z-j7aAJh&fSn|LrhJpB3NiN}*sYoNqsTz+zI#=El`ZAU2Ir}h^Vq>^W_oEe-hr_E+} zCL7GjE? z(jYU5@rt#eVy95CB8$c5QCdn$bo|MaM~|j0uDp_xlJq3Dup;4uy37Q8k5wAAMv^71 zOzOe&Y;yEMTGiHEjYhM$x-5;1JY3XTTrQWx=CtWig@whpRC9N4eKs=4G*q;pkB^OK zWz8@7{T_!=7#$tG{PF0>92RCyQWMs_>Q3Jr@DH+aQ8@{Rv91QJ%P%gB-nemNI66JE ztePKRl5~14Z<^TT#Nx6kBQHNY)sjTQV3OUgU7nwLaOcjQ>;L*B`leM7VzkP)(qi-Z zd^Y_mOS1E=^lz;_-qh4|bbr-WcUpdiDLHu!HJ&qN6>cpp&bApRr?tVtGV%>($+9`c z>hk5~<)!NE8 z3MUe>NJj)+LRLLvqozLg^Mqc)z0w|+@%k9ps|gu*A*)Wv0+ljTLKaEKq=c-ZEp$5} zt2gpuz7YRP6rQ*(O!Uiytik_=&V;PREzy*ab(DvDA#Sh7KaVX5*#L>}P!D|zH%2S9 zL2iR|irVQgwB5MvPE&xYsEglw^!hW>SMlnB-%0qy$CrEX?A^%TvhMLbei_rlh|q!6 zaK3$CVP&<*)`6N0(1!GKo_pymJo=Dh!|O%5qhRwi{)?kFDm+i2Zvp2v)Ow@tjlg}> zj|e^31rHTb5c^()X9pd^+Ma55fPWA8v?_LI6n!ad`4grRSo3{+9nrW|JG5O&jYG;j zw+rL9O^Lmcp_2As=j!48|1;k~+`AtBd$FGXwIiNqPMe3Guf!j)j*!Bs1X5rfMIcq; zRP~@@ZIB!29BMQGxf`R0_M=w35`EOG^v%lLNzCLZ`#b>scHH0v^oH^aqBc*X1r^V3 u%;nKFygMQBRrKTOqciAvv}!~@jad&JM1*c=J)V?jYvoBred)jIy0NPO literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.no-scripts.D7,D8,D9,DA,DE.ttf b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.no-scripts.D7,D8,D9,DA,DE.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c278d1fd7541a4e997e07af0288360a84e90cf19 GIT binary patch literal 3928 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/profiles/filter-scripts-features.2.txt b/test/subset/data/profiles/filter-scripts-features.2.txt new file mode 100644 index 000000000..6890a27c6 --- /dev/null +++ b/test/subset/data/profiles/filter-scripts-features.2.txt @@ -0,0 +1,2 @@ +--layout-scripts=grek,latn +--layout-features=liga diff --git a/test/subset/data/profiles/filter-scripts-features.txt b/test/subset/data/profiles/filter-scripts-features.txt new file mode 100644 index 000000000..971824c47 --- /dev/null +++ b/test/subset/data/profiles/filter-scripts-features.txt @@ -0,0 +1,2 @@ +--layout-scripts=grek,cyrl +--layout-features=numr,onum diff --git a/test/subset/data/profiles/filter-scripts.txt b/test/subset/data/profiles/filter-scripts.txt new file mode 100644 index 000000000..428f7fabf --- /dev/null +++ b/test/subset/data/profiles/filter-scripts.txt @@ -0,0 +1 @@ +--layout-scripts=grek,cyrl diff --git a/test/subset/data/profiles/no-scripts.txt b/test/subset/data/profiles/no-scripts.txt new file mode 100644 index 000000000..9bbc847ff --- /dev/null +++ b/test/subset/data/profiles/no-scripts.txt @@ -0,0 +1 @@ +--layout-scripts-=* diff --git a/test/subset/data/tests/full-font.tests b/test/subset/data/tests/full-font.tests index d60c6eac7..31cb92c5d 100644 --- a/test/subset/data/tests/full-font.tests +++ b/test/subset/data/tests/full-font.tests @@ -5,6 +5,10 @@ SourceSerifVariable-Roman.ttf PROFILES: default.txt drop-hints.txt +no-scripts.txt +filter-scripts.txt +filter-scripts-features.txt +filter-scripts-features.2.txt SUBSETS: abc From dbfd2bf3275466ea507a8a41614e4785873213f4 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Thu, 30 Jun 2022 23:04:35 +0000 Subject: [PATCH 09/11] minor. --- src/hb-subset-plan.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index 574d45eff..851504fa9 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -91,7 +91,7 @@ _remap_indexes (const hb_set_t *indexes, typedef void (*layout_collect_func_t) (hb_face_t *face, hb_tag_t table_tag, const hb_tag_t *scripts, const hb_tag_t *languages, const hb_tag_t *features, hb_set_t *lookup_indexes /* OUT */); -/** +/* * Removes all tags from 'tags' that are not in filter. Additionally eliminates any duplicates. * Returns true if anything was removed (not including duplicates). */ From 216cf5946bdea85b954c73669c085437f9e99a72 Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Tue, 5 Jul 2022 17:49:12 +0000 Subject: [PATCH 10/11] [subset] Allocate space for null entry in script/feature list. --- src/hb-subset-plan.cc | 8 +++----- src/hb-subset.h | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index 851504fa9..68a1741ff 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -99,7 +99,7 @@ static bool _filter_tag_list(hb_vector_t* tags, /* IN/OUT */ const hb_set_t* filter) { hb_vector_t out; - out.alloc (tags->get_size()); + out.alloc (tags->get_size() + 1); // +1 is to allocate room for the null terminator. bool removed = false; hb_set_t visited; @@ -129,18 +129,16 @@ static void _collect_layout_indices (hb_subset_plan_t *plan, layout_collect_func_t layout_collect_func, hb_set_t *indices /* OUT */) { - unsigned num_features = table.get_feature_count () + 1; + unsigned num_features = table.get_feature_count (); hb_vector_t features; if (!plan->check_success (features.resize (num_features))) return; table.get_feature_tags (0, &num_features, features.arrayZ); - features.resize (num_features); bool retain_all_features = !_filter_tag_list (&features, plan->layout_features); - unsigned num_scripts = table.get_script_count () + 1; + unsigned num_scripts = table.get_script_count (); hb_vector_t scripts; if (!plan->check_success (scripts.resize (num_scripts))) return; table.get_script_tags (0, &num_scripts, scripts.arrayZ); - scripts.resize (num_scripts); bool retain_all_scripts = !_filter_tag_list (&scripts, plan->layout_scripts); if (!plan->check_success (!features.in_error ()) || !features diff --git a/src/hb-subset.h b/src/hb-subset.h index 636e399a6..d0064cbfe 100644 --- a/src/hb-subset.h +++ b/src/hb-subset.h @@ -101,7 +101,7 @@ typedef enum { /*< flags >*/ * @HB_SUBSET_SETS_LAYOUT_FEATURE_TAG: the set of layout feature tags that will be retained * in the subset. * @HB_SUBSET_SETS_LAYOUT_SCRIPT_TAG: the set of layout script tags that will be retained - * in the subset. Defaults to all tags. + * in the subset. Defaults to all tags. Since: REPLACEME * * List of sets that can be configured on the subset input. * From 30309ec8d3eb39f6f5c05ff0e7464095c5d7bfbf Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Tue, 5 Jul 2022 18:33:19 +0000 Subject: [PATCH 11/11] [subset] add null element in _filter_tag_list. --- src/hb-subset-plan.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index 68a1741ff..3716a8ba2 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -119,6 +119,9 @@ static bool _filter_tag_list(hb_vector_t* tags, /* IN/OUT */ out.push (tag); } + // The collect function needs a null element to signal end of the array. + out.push (HB_TAG_NONE); + hb_swap (out, *tags); return removed; } @@ -145,9 +148,6 @@ static void _collect_layout_indices (hb_subset_plan_t *plan, || !plan->check_success (!scripts.in_error ()) || !scripts) return; - // The collect function needs a null element to signal end of the array. - features.push (0); - scripts.push (0); layout_collect_func (plan->source, T::tableTag, retain_all_scripts ? nullptr : scripts.arrayZ,