[subset] GDEF MarkGlyphSets subsetting support
diff --git a/src/hb-ot-layout-gdef-table.hh b/src/hb-ot-layout-gdef-table.hh
index dc751d8..9cfdc61 100644
--- a/src/hb-ot-layout-gdef-table.hh
+++ b/src/hb-ot-layout-gdef-table.hh
@@ -288,6 +288,34 @@
   bool covers (unsigned int set_index, hb_codepoint_t glyph_id) const
   { return (this+coverage[set_index]).get_coverage (glyph_id) != NOT_COVERED; }
 
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->start_embed (*this);
+    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+    out->format = format;
+
+    bool ret = true;
+    for (const LOffsetTo<Coverage>& offset : coverage.iter ())
+    {
+      auto *o = out->coverage.serialize_append (c->serializer);
+      if (unlikely (!o))
+      {
+        ret = false;
+        break;
+      }
+      
+      //not using o->serialize_subset (c, offset, this, out) here because
+      //OTS doesn't allow null offset.
+      //See issue: https://github.com/khaledhosny/ots/issues/172
+      c->serializer->push ();
+      c->dispatch (this+offset);
+      c->serializer->add_link (*o, c->serializer->pop_pack (), out);
+    }
+
+    return_trace (ret && out->coverage.len);
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -313,6 +341,15 @@
     }
   }
 
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+    switch (u.format) {
+    case 1: return_trace (u.format1.subset (c));
+    default:return_trace (false);
+    }
+  }
+
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -448,7 +485,11 @@
     out->markAttachClassDef.serialize_subset (c, markAttachClassDef, this, out);
 
     if (version.to_int () >= 0x00010002u)
-      out->markGlyphSetsDef = 0;// TODO(subset) serialize_subset (c, markGlyphSetsDef, this, out);
+    {
+      if (!out->markGlyphSetsDef.serialize_subset (c, markGlyphSetsDef, this, out) &&
+          version.to_int () == 0x00010002u)
+        out->version.minor = 0;
+    }
 
     if (version.to_int () >= 0x00010003u)
       out->varStore = 0;// TODO(subset) serialize_subset (c, varStore, this, out);
diff --git a/test/subset/data/Makefile.am b/test/subset/data/Makefile.am
index 15f0811..32efc0b 100644
--- a/test/subset/data/Makefile.am
+++ b/test/subset/data/Makefile.am
@@ -20,6 +20,7 @@
 	expected/layout.gpos6 \
 	expected/layout.gsub3 \
 	expected/layout.gsub6 \
+	expected/layout.gdef \
 	expected/cmap \
 	expected/cmap14 \
 	expected/sbix \
diff --git a/test/subset/data/Makefile.sources b/test/subset/data/Makefile.sources
index dd4fff8..597ab7e 100644
--- a/test/subset/data/Makefile.sources
+++ b/test/subset/data/Makefile.sources
@@ -12,6 +12,7 @@
 	tests/layout.gpos6.tests \
 	tests/layout.gsub3.tests \
 	tests/layout.gsub6.tests \
+	tests/layout.gdef.tests \
 	tests/cmap.tests \
 	tests/cmap14.tests \
 	tests/sbix.tests \
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.default.1E00,303.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.default.1E00,303.ttf
new file mode 100644
index 0000000..d505524
--- /dev/null
+++ b/test/subset/data/expected/layout.gdef/Roboto-Regular.default.1E00,303.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.default.303.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.default.303.ttf
new file mode 100644
index 0000000..c710e19
--- /dev/null
+++ b/test/subset/data/expected/layout.gdef/Roboto-Regular.default.303.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.default.309,20,30F.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.default.309,20,30F.ttf
new file mode 100644
index 0000000..c4f5e02
--- /dev/null
+++ b/test/subset/data/expected/layout.gdef/Roboto-Regular.default.309,20,30F.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.default.323.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.default.323.ttf
new file mode 100644
index 0000000..134a7dd
--- /dev/null
+++ b/test/subset/data/expected/layout.gdef/Roboto-Regular.default.323.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.default.41,42,43.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.default.41,42,43.ttf
new file mode 100644
index 0000000..b037840
--- /dev/null
+++ b/test/subset/data/expected/layout.gdef/Roboto-Regular.default.41,42,43.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.1E00,303.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.1E00,303.ttf
new file mode 100644
index 0000000..5b1077f
--- /dev/null
+++ b/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.1E00,303.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.303.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.303.ttf
new file mode 100644
index 0000000..665a3ec
--- /dev/null
+++ b/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.303.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.309,20,30F.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.309,20,30F.ttf
new file mode 100644
index 0000000..cb041bd
--- /dev/null
+++ b/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.309,20,30F.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.323.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.323.ttf
new file mode 100644
index 0000000..eea77c1
--- /dev/null
+++ b/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.323.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.41,42,43.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.41,42,43.ttf
new file mode 100644
index 0000000..dcf5653
--- /dev/null
+++ b/test/subset/data/expected/layout.gdef/Roboto-Regular.drop-hints.41,42,43.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef.1E00,303.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef.1E00,303.ttf
new file mode 100644
index 0000000..35b7212
--- /dev/null
+++ b/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef.1E00,303.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef.303.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef.303.ttf
new file mode 100644
index 0000000..7f7c39d
--- /dev/null
+++ b/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef.303.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef.309,20,30F.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef.309,20,30F.ttf
new file mode 100644
index 0000000..83b02bc
--- /dev/null
+++ b/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef.309,20,30F.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef.323.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef.323.ttf
new file mode 100644
index 0000000..928bb5f
--- /dev/null
+++ b/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef.323.ttf
Binary files differ
diff --git a/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef.41,42,43.ttf b/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef.41,42,43.ttf
new file mode 100644
index 0000000..717fe21
--- /dev/null
+++ b/test/subset/data/expected/layout.gdef/Roboto-Regular.keep-gdef.41,42,43.ttf
Binary files differ
diff --git a/test/subset/data/tests/layout.gdef.tests b/test/subset/data/tests/layout.gdef.tests
new file mode 100644
index 0000000..e71e8ac
--- /dev/null
+++ b/test/subset/data/tests/layout.gdef.tests
@@ -0,0 +1,14 @@
+FONTS:
+Roboto-Regular.ttf
+
+PROFILES:
+default.txt
+drop-hints.txt
+keep-gdef.txt
+
+SUBSETS:
+Ḁ̃


+̉ ̏ 
+ABC