[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',