diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index cc793afa7..53f8664d9 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -100,11 +100,23 @@ static void _collect_layout_indices (hb_face_t *face, if (!features.alloc (table.get_feature_count () + 1)) 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 && layout_features_to_retain->has (tag)) - features.push (tag); + 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) @@ -113,7 +125,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); - if (features.get_size () == table.get_feature_count () + 1) + if (retain_all_features) { // Looking for all features, trigger the faster collection method. layout_collect_func (face, diff --git a/test/subset/data/Makefile.am b/test/subset/data/Makefile.am index f46bc2456..c2dff35e6 100644 --- a/test/subset/data/Makefile.am +++ b/test/subset/data/Makefile.am @@ -38,6 +38,7 @@ EXTRA_DIST += \ expected/layout.gdef-attachlist \ expected/layout.notonastaliqurdu \ expected/layout.tinos \ + expected/layout.default_features \ expected/layout.duplicate_features \ expected/layout.unsorted_featurelist \ expected/layout.drop_feature \ diff --git a/test/subset/data/Makefile.sources b/test/subset/data/Makefile.sources index 7a366a3f5..1a56e1e3d 100644 --- a/test/subset/data/Makefile.sources +++ b/test/subset/data/Makefile.sources @@ -36,6 +36,7 @@ TESTS = \ tests/layout.notonastaliqurdu.tests \ tests/layout.tests \ tests/layout.tinos.tests \ + tests/layout.default_features.tests \ tests/layout.duplicate_features.tests \ tests/layout.unsorted_featurelist.tests \ tests/layout.drop_feature.tests \ diff --git a/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.default.61,63,68,69.ttf b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.default.61,63,68,69.ttf new file mode 100644 index 000000000..4e7ce2993 Binary files /dev/null and b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.default.61,63,68,69.ttf differ diff --git a/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.default.retain-all-codepoint.ttf b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.default.retain-all-codepoint.ttf new file mode 100644 index 000000000..745a87673 Binary files /dev/null and b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.default.retain-all-codepoint.ttf differ diff --git a/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.layout-test.61,63,68,69.ttf b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.layout-test.61,63,68,69.ttf new file mode 100644 index 000000000..b0ee6ab4f Binary files /dev/null and b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.layout-test.61,63,68,69.ttf differ diff --git a/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.layout-test.retain-all-codepoint.ttf b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.layout-test.retain-all-codepoint.ttf new file mode 100644 index 000000000..9f9138552 Binary files /dev/null and b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.layout-test.retain-all-codepoint.ttf differ diff --git a/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.retain-gids.61,63,68,69.ttf b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.retain-gids.61,63,68,69.ttf new file mode 100644 index 000000000..9e1167f30 Binary files /dev/null and b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.retain-gids.61,63,68,69.ttf differ diff --git a/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.retain-gids.retain-all-codepoint.ttf b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.retain-gids.retain-all-codepoint.ttf new file mode 100644 index 000000000..5bf02df94 Binary files /dev/null and b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.retain-gids.retain-all-codepoint.ttf differ diff --git a/test/subset/data/fonts/FranklinGothic-Regular.ttf b/test/subset/data/fonts/FranklinGothic-Regular.ttf new file mode 100644 index 000000000..97797397d Binary files /dev/null and b/test/subset/data/fonts/FranklinGothic-Regular.ttf differ diff --git a/test/subset/data/tests/layout.default_features.tests b/test/subset/data/tests/layout.default_features.tests new file mode 100644 index 000000000..30a4b007c --- /dev/null +++ b/test/subset/data/tests/layout.default_features.tests @@ -0,0 +1,11 @@ +FONTS: +FranklinGothic-Regular.ttf + +PROFILES: +layout-test.txt +default.txt +retain-gids.txt + +SUBSETS: +achi +* diff --git a/test/subset/meson.build b/test/subset/meson.build index 167e53a9e..c75106caf 100644 --- a/test/subset/meson.build +++ b/test/subset/meson.build @@ -33,6 +33,7 @@ tests = [ 'layout.duplicate_features', 'layout.unsorted_featurelist', 'layout.drop_feature', + 'layout.default_features', 'cmap', 'cmap14', 'sbix',