[subset] layout_features filtering fix we should not use get_size (), which returns length * item_size
diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index cc793af..53f8664 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc
@@ -100,11 +100,23 @@ 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 @@ // 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 f46bc24..c2dff35 100644 --- a/test/subset/data/Makefile.am +++ b/test/subset/data/Makefile.am
@@ -38,6 +38,7 @@ 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 7a366a3..1a56e1e 100644 --- a/test/subset/data/Makefile.sources +++ b/test/subset/data/Makefile.sources
@@ -36,6 +36,7 @@ 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 0000000..4e7ce29 --- /dev/null +++ b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.default.61,63,68,69.ttf Binary files 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 0000000..745a876 --- /dev/null +++ b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.default.retain-all-codepoint.ttf Binary files 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 0000000..b0ee6ab --- /dev/null +++ b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.layout-test.61,63,68,69.ttf Binary files 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 0000000..9f91385 --- /dev/null +++ b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.layout-test.retain-all-codepoint.ttf Binary files 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 0000000..9e1167f --- /dev/null +++ b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.retain-gids.61,63,68,69.ttf Binary files 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 0000000..5bf02df --- /dev/null +++ b/test/subset/data/expected/layout.default_features/FranklinGothic-Regular.retain-gids.retain-all-codepoint.ttf Binary files differ
diff --git a/test/subset/data/fonts/FranklinGothic-Regular.ttf b/test/subset/data/fonts/FranklinGothic-Regular.ttf new file mode 100644 index 0000000..9779739 --- /dev/null +++ b/test/subset/data/fonts/FranklinGothic-Regular.ttf Binary files 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 0000000..30a4b00 --- /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 167e53a..c75106c 100644 --- a/test/subset/meson.build +++ b/test/subset/meson.build
@@ -33,6 +33,7 @@ 'layout.duplicate_features', 'layout.unsorted_featurelist', 'layout.drop_feature', + 'layout.default_features', 'cmap', 'cmap14', 'sbix',