diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index fbfb07671..c8fe9441a 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -3178,6 +3178,24 @@ struct ExtensionFormat1 extensionLookupType != T::SubTable::Extension); } + bool subset (hb_subset_context_t *c) const + { + TRACE_SUBSET (this); + + auto *out = c->serializer->start_embed (this); + if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false); + + out->format = format; + out->extensionLookupType = extensionLookupType; + + const auto& src_offset = + reinterpret_cast &> (extensionOffset); + auto& dest_offset = + reinterpret_cast &> (out->extensionOffset); + + return_trace (dest_offset.serialize_subset (c, src_offset, this, get_type ())); + } + protected: HBUINT16 format; /* Format identifier. Set to 1. */ HBUINT16 extensionLookupType; /* Lookup type of subtable referenced @@ -3208,6 +3226,18 @@ struct Extension } } + // Specialization of dispatch for subset. dispatch() normally just + // dispatches to the sub table this points too, but for subset + // we need to run subset on this subtable too. + template + typename hb_subset_context_t::return_t dispatch (hb_subset_context_t *c, Ts&&... ds) const + { + switch (u.format) { + case 1: return u.format1.subset (c); + default: return c->default_return_value (); + } + } + template typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const { diff --git a/test/subset/data/Makefile.sources b/test/subset/data/Makefile.sources index 46680a59d..21371fbc6 100644 --- a/test/subset/data/Makefile.sources +++ b/test/subset/data/Makefile.sources @@ -20,6 +20,7 @@ TESTS = \ tests/layout.gpos6.tests \ tests/layout.gpos8.tests \ tests/layout.gpos8.amiri.tests \ + tests/layout.gpos9.tests \ tests/layout.gsub3.tests \ tests/layout.gsub6.tests \ tests/layout.tests \ diff --git a/test/subset/data/expected/layout.gpos9/gpos9_font2.keep-layout-retain-gids.41,42.otf b/test/subset/data/expected/layout.gpos9/gpos9_font2.keep-layout-retain-gids.41,42.otf new file mode 100644 index 000000000..968dd3729 Binary files /dev/null and b/test/subset/data/expected/layout.gpos9/gpos9_font2.keep-layout-retain-gids.41,42.otf differ diff --git a/test/subset/data/expected/layout.gpos9/gpos9_font2.keep-layout-retain-gids.41.otf b/test/subset/data/expected/layout.gpos9/gpos9_font2.keep-layout-retain-gids.41.otf new file mode 100644 index 000000000..842cf79d0 Binary files /dev/null and b/test/subset/data/expected/layout.gpos9/gpos9_font2.keep-layout-retain-gids.41.otf differ diff --git a/test/subset/data/expected/layout.gpos9/gpos9_font2.keep-layout-retain-gids.42.otf b/test/subset/data/expected/layout.gpos9/gpos9_font2.keep-layout-retain-gids.42.otf new file mode 100644 index 000000000..5ef0589f1 Binary files /dev/null and b/test/subset/data/expected/layout.gpos9/gpos9_font2.keep-layout-retain-gids.42.otf differ diff --git a/test/subset/data/expected/layout.gpos9/gpos9_font2.keep-layout.41,42.otf b/test/subset/data/expected/layout.gpos9/gpos9_font2.keep-layout.41,42.otf new file mode 100644 index 000000000..46484863c Binary files /dev/null and b/test/subset/data/expected/layout.gpos9/gpos9_font2.keep-layout.41,42.otf differ diff --git a/test/subset/data/expected/layout.gpos9/gpos9_font2.keep-layout.41.otf b/test/subset/data/expected/layout.gpos9/gpos9_font2.keep-layout.41.otf new file mode 100644 index 000000000..cd2c4c268 Binary files /dev/null and b/test/subset/data/expected/layout.gpos9/gpos9_font2.keep-layout.41.otf differ diff --git a/test/subset/data/expected/layout.gpos9/gpos9_font2.keep-layout.42.otf b/test/subset/data/expected/layout.gpos9/gpos9_font2.keep-layout.42.otf new file mode 100644 index 000000000..09e20f804 Binary files /dev/null and b/test/subset/data/expected/layout.gpos9/gpos9_font2.keep-layout.42.otf differ diff --git a/test/subset/data/fonts/gpos9_font2.otf b/test/subset/data/fonts/gpos9_font2.otf new file mode 100644 index 000000000..1378f81e8 Binary files /dev/null and b/test/subset/data/fonts/gpos9_font2.otf differ diff --git a/test/subset/data/tests/layout.gpos9.tests b/test/subset/data/tests/layout.gpos9.tests new file mode 100644 index 000000000..c95069ff5 --- /dev/null +++ b/test/subset/data/tests/layout.gpos9.tests @@ -0,0 +1,11 @@ +FONTS: +gpos9_font2.otf + +PROFILES: +keep-layout.txt +keep-layout-retain-gids.txt + +SUBSETS: +A +B +AB diff --git a/test/subset/meson.build b/test/subset/meson.build index de28fda2c..892163a77 100644 --- a/test/subset/meson.build +++ b/test/subset/meson.build @@ -13,6 +13,7 @@ tests = [ 'layout.gpos6', 'layout.gpos8', 'layout.gpos8.amiri', + 'layout.gpos9', 'layout.gsub3', 'layout.gsub6', 'layout.gdef',