[subset] fox for (Chain)ContextFormat3: subset lookupRecord

skip copying a lookupRecord if lookup referenced in the lookupRecord is
not retained after subset
diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh
index a68abb5..626abc5 100644
--- a/src/hb-ot-layout-gsubgpos.hh
+++ b/src/hb-ot-layout-gsubgpos.hh
@@ -1618,7 +1618,14 @@
     const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord>>
 						       (inputZ.as_array ((inputCount ? inputCount - 1 : 0)));
     for (unsigned i = 0; i < (unsigned) lookupCount; i++)
+    {
+      if (!lookup_map->has (lookupRecord[i].lookupListIndex))
+      {
+        out->lookupCount--;
+        continue;
+      }
       c->copy (lookupRecord[i], lookup_map);
+    }
 
     return_trace (true);
   }
@@ -2234,7 +2241,14 @@
     const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount));
     const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups;
     for (unsigned i = 0; i < (unsigned) lookupCount; i++)
+    {
+      if (!lookup_map->has (lookupRecord[i].lookupListIndex))
+      {
+        out->lookupCount--;
+        continue;
+      }
       c->serializer->copy (lookupRecord[i], lookup_map);
+    }
 
     return_trace (true);
   }
@@ -3303,13 +3317,21 @@
       return_trace (false);
 
     const Array16Of<LookupRecord> &lookupRecord = StructAfter<Array16Of<LookupRecord>> (lookahead);
+    const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups;
+    hb_set_t lookup_indices;
+    for (unsigned i = 0; i < (unsigned) lookupRecord.len; i++)
+      if (lookup_map->has (lookupRecord[i].lookupListIndex))
+        lookup_indices.add (i);
+
     HBUINT16 lookupCount;
-    lookupCount = lookupRecord.len;
+    lookupCount = lookup_indices.get_population ();
     if (!c->serializer->copy (lookupCount)) return_trace (false);
 
-    const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups;
-    for (unsigned i = 0; i < (unsigned) lookupCount; i++)
-      if (!c->serializer->copy (lookupRecord[i], lookup_map)) return_trace (false);
+    for (unsigned i : lookup_indices.iter ())
+    {
+      if (!c->serializer->copy (lookupRecord[i], lookup_map))
+        return_trace (false);
+    }
 
     return_trace (true);
   }
diff --git a/test/subset/data/Makefile.am b/test/subset/data/Makefile.am
index 8490c37..d7b05f4 100644
--- a/test/subset/data/Makefile.am
+++ b/test/subset/data/Makefile.am
@@ -34,6 +34,7 @@
 	expected/layout.gdef-varstore \
 	expected/layout.gdef-attachlist \
 	expected/layout.notonastaliqurdu \
+	expected/layout.tinos \
 	expected/cmap \
 	expected/cmap14 \
 	expected/sbix \
diff --git a/test/subset/data/Makefile.sources b/test/subset/data/Makefile.sources
index 17c9160..74b7079 100644
--- a/test/subset/data/Makefile.sources
+++ b/test/subset/data/Makefile.sources
@@ -31,6 +31,7 @@
 	tests/layout.khmer.tests \
 	tests/layout.notonastaliqurdu.tests \
 	tests/layout.tests \
+	tests/layout.tinos.tests \
 	tests/sbix.tests \
 	tests/variable.tests \
 	tests/glyph_names.tests \
diff --git a/test/subset/data/expected/layout.tinos/Tinos-Italic.default.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf b/test/subset/data/expected/layout.tinos/Tinos-Italic.default.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf
new file mode 100644
index 0000000..d289df2
--- /dev/null
+++ b/test/subset/data/expected/layout.tinos/Tinos-Italic.default.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.tinos/Tinos-Italic.default.retain-all-codepoint.ttf b/test/subset/data/expected/layout.tinos/Tinos-Italic.default.retain-all-codepoint.ttf
new file mode 100644
index 0000000..d28d567
--- /dev/null
+++ b/test/subset/data/expected/layout.tinos/Tinos-Italic.default.retain-all-codepoint.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.tinos/Tinos-Italic.glyph-names.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf b/test/subset/data/expected/layout.tinos/Tinos-Italic.glyph-names.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf
new file mode 100644
index 0000000..31b87ec
--- /dev/null
+++ b/test/subset/data/expected/layout.tinos/Tinos-Italic.glyph-names.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.tinos/Tinos-Italic.glyph-names.retain-all-codepoint.ttf b/test/subset/data/expected/layout.tinos/Tinos-Italic.glyph-names.retain-all-codepoint.ttf
new file mode 100644
index 0000000..4a632a1
--- /dev/null
+++ b/test/subset/data/expected/layout.tinos/Tinos-Italic.glyph-names.retain-all-codepoint.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.tinos/Tinos-Italic.notdef-outline.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf b/test/subset/data/expected/layout.tinos/Tinos-Italic.notdef-outline.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf
new file mode 100644
index 0000000..d289df2
--- /dev/null
+++ b/test/subset/data/expected/layout.tinos/Tinos-Italic.notdef-outline.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.tinos/Tinos-Italic.notdef-outline.retain-all-codepoint.ttf b/test/subset/data/expected/layout.tinos/Tinos-Italic.notdef-outline.retain-all-codepoint.ttf
new file mode 100644
index 0000000..d28d567
--- /dev/null
+++ b/test/subset/data/expected/layout.tinos/Tinos-Italic.notdef-outline.retain-all-codepoint.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.tinos/Tinos-Italic.retain-gids.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf b/test/subset/data/expected/layout.tinos/Tinos-Italic.retain-gids.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf
new file mode 100644
index 0000000..6c9e2d3
--- /dev/null
+++ b/test/subset/data/expected/layout.tinos/Tinos-Italic.retain-gids.5bf,5f0,5f1,5f2,fb21,fb22,fb23,fb24,fb25,fb26,fb27,fb28.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.tinos/Tinos-Italic.retain-gids.retain-all-codepoint.ttf b/test/subset/data/expected/layout.tinos/Tinos-Italic.retain-gids.retain-all-codepoint.ttf
new file mode 100644
index 0000000..78e92ad
--- /dev/null
+++ b/test/subset/data/expected/layout.tinos/Tinos-Italic.retain-gids.retain-all-codepoint.ttf
Binary files differ
diff --git a/test/subset/data/fonts/Tinos-Italic.ttf b/test/subset/data/fonts/Tinos-Italic.ttf
new file mode 100644
index 0000000..851621e
--- /dev/null
+++ b/test/subset/data/fonts/Tinos-Italic.ttf
Binary files differ
diff --git a/test/subset/data/tests/layout.tinos.tests b/test/subset/data/tests/layout.tinos.tests
new file mode 100644
index 0000000..64a9dab
--- /dev/null
+++ b/test/subset/data/tests/layout.tinos.tests
@@ -0,0 +1,12 @@
+FONTS:
+Tinos-Italic.ttf
+
+PROFILES:
+default.txt
+retain-gids.txt
+glyph-names.txt
+notdef-outline.txt
+
+SUBSETS:
+U+5bf,U+5f0,U+5f1,U+5f2,U+fb21,U+fb22,U+fb23,U+fb24,U+fb25,U+fb26,U+fb27,U+fb28
+*
diff --git a/test/subset/meson.build b/test/subset/meson.build
index c3ce6b2..4ed2fdd 100644
--- a/test/subset/meson.build
+++ b/test/subset/meson.build
@@ -26,6 +26,7 @@
   'layout.gdef-varstore',
   'layout.gdef-attachlist',
   'layout.notonastaliqurdu',
+  'layout.tinos',
   'cmap',
   'cmap14',
   'sbix',