From 8b5d3ebd9653375025e5ff439191370332e1b346 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Fri, 17 Apr 2020 11:58:31 -0700 Subject: [PATCH] [subset] GSUB5/GPOS7 Contextual Subst/Pos Subtbale Subsetting support --- src/hb-ot-layout-gsubgpos.hh | 160 +++++++++++++++++- src/hb-subset.cc | 2 +- src/hb-subset.hh | 7 +- test/subset/data/Makefile.am | 1 + test/subset/data/Makefile.sources | 1 + ...es_f1.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 2140 bytes ...rules_f1.keep-layout-retain-gids.41,42.otf | Bin 0 -> 2028 bytes ...rules_f1.keep-layout-retain-gids.41,43.otf | Bin 0 -> 2048 bytes ...subrules_f1.keep-layout-retain-gids.41.otf | Bin 0 -> 1916 bytes ...ayout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3756 bytes ...tiple_subrules_f1.keep-layout.41,42,43.otf | Bin 0 -> 1440 bytes ...multiple_subrules_f1.keep-layout.41,42.otf | Bin 0 -> 1324 bytes ...multiple_subrules_f1.keep-layout.41,43.otf | Bin 0 -> 1332 bytes ...t1_multiple_subrules_f1.keep-layout.41.otf | Bin 0 -> 1216 bytes ...es_f1.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3756 bytes ...es_f1.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 2156 bytes ...rules_f1.keep-layout-retain-gids.41,42.otf | Bin 0 -> 2040 bytes ...rules_f1.keep-layout-retain-gids.41,43.otf | Bin 0 -> 2048 bytes ...subrules_f1.keep-layout-retain-gids.41.otf | Bin 0 -> 1916 bytes ...ayout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3772 bytes ...tiple_subrules_f1.keep-layout.41,42,43.otf | Bin 0 -> 1456 bytes ...multiple_subrules_f1.keep-layout.41,42.otf | Bin 0 -> 1336 bytes ...multiple_subrules_f1.keep-layout.41,43.otf | Bin 0 -> 1332 bytes ...t2_multiple_subrules_f1.keep-layout.41.otf | Bin 0 -> 1216 bytes ...es_f1.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3772 bytes ...le_f1.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 2120 bytes ...imple_f1.keep-layout-retain-gids.41,42.otf | Bin 0 -> 1912 bytes ...imple_f1.keep-layout-retain-gids.41,43.otf | Bin 0 -> 2028 bytes ...3_simple_f1.keep-layout-retain-gids.41.otf | Bin 0 -> 1896 bytes ...ayout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3736 bytes ...ontext3_simple_f1.keep-layout.41,42,43.otf | Bin 0 -> 1420 bytes ...s_context3_simple_f1.keep-layout.41,42.otf | Bin 0 -> 1208 bytes ...s_context3_simple_f1.keep-layout.41,43.otf | Bin 0 -> 1312 bytes ...gpos_context3_simple_f1.keep-layout.41.otf | Bin 0 -> 1196 bytes ...le_f1.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3736 bytes .../gpos_context1_multiple_subrules_f1.otf | Bin 0 -> 4760 bytes .../gpos_context2_multiple_subrules_f1.otf | Bin 0 -> 4780 bytes .../data/fonts/gpos_context3_simple_f1.otf | Bin 0 -> 4732 bytes test/subset/data/tests/layout.context.tests | 15 ++ 39 files changed, 176 insertions(+), 10 deletions(-) create mode 100644 test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41,42.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41,43.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,42,43.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,42.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,43.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41,42.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41,43.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41,42,43.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41,42.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41,43.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41,42,43.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41,42.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41,43.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.retain-all-codepoint.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41,42,43.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41,42.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41,43.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41.otf create mode 100644 test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.retain-all-codepoint.otf create mode 100644 test/subset/data/fonts/gpos_context1_multiple_subrules_f1.otf create mode 100644 test/subset/data/fonts/gpos_context2_multiple_subrules_f1.otf create mode 100644 test/subset/data/fonts/gpos_context3_simple_f1.otf create mode 100644 test/subset/data/tests/layout.context.tests diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 0bca97f7a..f52a94836 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -1144,7 +1144,7 @@ static inline bool match_lookahead (hb_ot_apply_context_t *c, struct LookupRecord { LookupRecord* copy (hb_serialize_context_t *c, - const hb_map_t *lookup_map) + const hb_map_t *lookup_map) const { TRACE_SERIALIZE (this); auto *out = c->embed (*this); @@ -1450,6 +1450,47 @@ struct Rule return_trace (context_apply_lookup (c, inputCount, inputZ.arrayZ, lookupCount, lookupRecord.arrayZ, lookup_context)); } + bool serialize (hb_serialize_context_t *c, + const hb_map_t *input_mapping, /* old->new glyphid or class mapping */ + const hb_map_t *lookup_map) const + { + TRACE_SERIALIZE (this); + auto *out = c->start_embed (this); + if (unlikely (!c->extend_min (out))) return_trace (false); + + out->inputCount = inputCount; + out->lookupCount = lookupCount; + + const hb_array_t input = inputZ.as_array (inputCount - 1); + for (const auto org : input) + { + HBUINT16 d; + d = input_mapping->get (org); + c->copy (d); + } + + const UnsizedArrayOf &lookupRecord = StructAfter> + (inputZ.as_array ((inputCount ? inputCount - 1 : 0))); + for (unsigned i = 0; i < (unsigned) lookupCount; i++) + c->copy (lookupRecord[i], lookup_map); + + return_trace (true); + } + + bool subset (hb_subset_context_t *c, + const hb_map_t *lookup_map, + const hb_map_t *klass_map = nullptr) const + { + TRACE_SUBSET (this); + + const hb_array_t input = inputZ.as_array ((inputCount ? inputCount - 1 : 0)); + if (!input.length) return_trace (false); + + const hb_map_t *mapping = klass_map == nullptr ? c->plan->glyph_map : klass_map; + if (!hb_all (input, mapping)) return_trace (false); + return_trace (serialize (c->serializer, mapping, lookup_map)); + } + public: bool sanitize (hb_sanitize_context_t *c) const { @@ -1546,6 +1587,36 @@ struct RuleSet ; } + bool subset (hb_subset_context_t *c, + const hb_map_t *lookup_map, + const hb_map_t *klass_map = nullptr) const + { + TRACE_SUBSET (this); + + auto snap = c->serializer->snapshot (); + auto *out = c->serializer->start_embed (*this); + if (unlikely (!c->serializer->extend_min (out))) return_trace (false); + + for (const OffsetTo& _ : rule) + { + if (!_) continue; + auto *o = out->rule.serialize_append (c->serializer); + if (unlikely (!o)) continue; + + auto o_snap = c->serializer->snapshot (); + if (!o->serialize_subset (c, _, this, lookup_map, klass_map)) + { + out->rule.pop (); + c->serializer->revert (o_snap); + } + } + + bool ret = bool (out->rule); + if (!ret) c->serializer->revert (snap); + + return_trace (ret); + } + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); @@ -1648,8 +1719,26 @@ struct ContextFormat1 bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - // TODO(subset) - return_trace (false); + const hb_set_t &glyphset = *c->plan->glyphset (); + const hb_map_t &glyph_map = *c->plan->glyph_map; + + auto *out = c->serializer->start_embed (*this); + if (unlikely (!c->serializer->extend_min (out))) return_trace (false); + out->format = format; + + const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups; + hb_sorted_vector_t new_coverage; + + hb_zip (this+coverage, ruleSet) + | hb_filter (glyphset, hb_first) + | hb_filter (subset_offset_array (c, out->ruleSet, this, lookup_map), hb_second) + | hb_map (hb_first) + | hb_map (glyph_map) + | hb_sink (new_coverage) + ; + + out->coverage.serialize (c->serializer, out) + .serialize (c->serializer, new_coverage.iter ()); + return_trace (bool (new_coverage)); } bool sanitize (hb_sanitize_context_t *c) const @@ -1774,8 +1863,45 @@ struct ContextFormat2 bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - // TODO(subset) - return_trace (false); + auto *out = c->serializer->start_embed (*this); + if (unlikely (!c->serializer->extend_min (out))) return_trace (false); + out->format = format; + if (unlikely (!out->coverage.serialize_subset (c, coverage, this))) + return_trace (false); + + hb_map_t klass_map; + out->classDef.serialize_subset (c, classDef, this, &klass_map); + + const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups; + bool ret = true; + unsigned non_zero_index = 0, index = 0; + for (const hb_pair_t&>& _ : + hb_enumerate (ruleSet) + | hb_filter (klass_map, hb_first)) + { + auto *o = out->ruleSet.serialize_append (c->serializer); + if (unlikely (!o)) + { + ret = false; + break; + } + + if (o->serialize_subset (c, _.second, this, lookup_map, &klass_map)) + non_zero_index = index; + + index++; + } + + if (!ret) return_trace (ret); + + //prune empty trailing ruleSets + --index; + while (index > non_zero_index) + { + out->ruleSet.pop (); + index--; + } + + return_trace (bool (out->ruleSet)); } bool sanitize (hb_sanitize_context_t *c) const @@ -1886,8 +2012,28 @@ struct ContextFormat3 bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - // TODO(subset) - return_trace (false); + auto *out = c->serializer->start_embed (this); + if (unlikely (!c->serializer->extend_min (out))) return_trace (false); + + out->format = format; + out->glyphCount = glyphCount; + out->lookupCount = lookupCount; + + const hb_array_t> coverages = coverageZ.as_array (glyphCount); + + for (const OffsetTo& offset : coverages) + { + auto *o = c->serializer->allocate_size> (OffsetTo::static_size); + if (unlikely (!o)) return_trace (false); + if (!o->serialize_subset (c, offset, this)) return_trace (false); + } + + const LookupRecord *lookupRecord = &StructAfter (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++) + c->serializer->copy (lookupRecord[i], lookup_map); + + return_trace (true); } bool sanitize (hb_sanitize_context_t *c) const diff --git a/src/hb-subset.cc b/src/hb-subset.cc index a03b41f14..31127392b 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -89,7 +89,7 @@ _subset (hb_subset_plan_t *plan) retry: hb_serialize_context_t serializer ((void *) buf, buf_size); serializer.start_serialize (); - hb_subset_context_t c (source_blob, plan, &serializer); + hb_subset_context_t c (source_blob, plan, &serializer, tag); bool needed = table->subset (&c); if (serializer.ran_out_of_room) { diff --git a/src/hb-subset.hh b/src/hb-subset.hh index a3dfd3b87..dc86f150c 100644 --- a/src/hb-subset.hh +++ b/src/hb-subset.hh @@ -57,14 +57,17 @@ struct hb_subset_context_t : hb_blob_t *source_blob; hb_subset_plan_t *plan; hb_serialize_context_t *serializer; + hb_tag_t table_tag; unsigned int debug_depth; hb_subset_context_t (hb_blob_t *source_blob_, hb_subset_plan_t *plan_, - hb_serialize_context_t *serializer_) : - source_blob (source_blob_), + hb_serialize_context_t *serializer_, + hb_tag_t table_tag_) : + source_blob (source_blob_), plan (plan_), serializer (serializer_), + table_tag (table_tag_), debug_depth (0) {} }; diff --git a/test/subset/data/Makefile.am b/test/subset/data/Makefile.am index 32efc0bc2..05ad13b4c 100644 --- a/test/subset/data/Makefile.am +++ b/test/subset/data/Makefile.am @@ -21,6 +21,7 @@ EXTRA_DIST += \ expected/layout.gsub3 \ expected/layout.gsub6 \ expected/layout.gdef \ + expected/layout.context \ expected/cmap \ expected/cmap14 \ expected/sbix \ diff --git a/test/subset/data/Makefile.sources b/test/subset/data/Makefile.sources index f50e6ae6b..ea250f3c1 100644 --- a/test/subset/data/Makefile.sources +++ b/test/subset/data/Makefile.sources @@ -21,6 +21,7 @@ DISABLED_TESTS = \ tests/layout.gsub3.tests \ tests/layout.gsub6.tests \ tests/layout.gdef.tests \ + tests/layout.context.tests \ $(NULL) XFAIL_TESTS = \ diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf new file mode 100644 index 0000000000000000000000000000000000000000..41f4ff45ad714da25558235605f89d7f0ca20edf GIT binary patch literal 2140 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41,43.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.41,43.otf new file mode 100644 index 0000000000000000000000000000000000000000..47fe5d0801c9c547db3a06cc46109946004e1c61 GIT binary patch literal 2048 zcmd^AeNa?Y6hCj-U3Qn{OIcDBT|f%bbl>L!nu;u#sbQcEW`Qd#2a)At7ZeQ25)@ca zOw!OW$h8>*!!a<+Mki&=tR_dNni|HO{^_5lA&1(qU?>Xmp&bjBE zbMKs+y>@Lj7+?nkfjJ{9%lvcr>R$k05I}8Rz9u^trh^e6c$Bb+?A!%h+1Kk%0%-F{ z-dO0gSHdyX1=5$1TvXz)7k!%E!jbQ9Buga(M2u-kuN6q1Q{t?yjqD6+1klU@U?QCM z+DfpkAre{(>O?G_@RQ44Tygdp(}X)fgNL@Znf!udKa&X?(fHUl%?yZkpn6h=feq zijvnrFz6u!LLnR?VJbvZ;xl13#6uz^!CaUREC^tQGmwP z*r5mzO2G-0;D)VG2len8ya7$n3?A46`=ApJ!XfB}9yki`!*NP_08YUWoPo1&4nAkp zj2>C!kVgSUl+cPPn2M|gSr%CiSsqydSrJ(YSu3(B$fhD^L5_SlE+LA|JKwd;%Lf(pe3i7EaSWsY5;83850tzAu5(-unQcy@m(Sjn2B8MW6 zBK?qvqJ*Lq#S|1%QL>=KqQs%Zqa>h2|0|(n&8VoXb8W_wYI9OyvYE43ICFYY#U_V2 zx6WPdaJtPa$_p!8l@%^~wWDahIlZjRoTHe#%{dOY!?l&b$wQ@6-MtKKbjZOvy&=RH z8WtWAIb~{;Df+Q#(_?1LjGZ;x92cK3C-Lzol9HdCJMXFa3oIoQ-s|3H zy}|#~=^pCzeTJJMeMaNW4r3_YNBwYAU^R_Q4P0otClkzCX8quJw5hG7t+h3#vAwZl z*Q`TXw)o5W*Vg+=zc?%FI=Ag{H`lx>N9C2s#wJJW>RnYQ%6m&I4ws(F``&Y@{YJ+R zJ)d3Gc?Uda4-6f-zVWpE%<6At-nHb|w$mS9Z2D%j>yKTxT2H>|87es-Gi|b}Lx%0T z);5o)EymTKU)Al<`RCphO(Fh-@gx(r7r#}qQ=YdaSB@=~V@l-c3vz}p&hE3k?3>}+ zx6&70^y8N1w63ZSY;eDh^%ZqhRYyjz_@aH#N(YxBXHJX4u-FIh47*u;Fmt z;C`K7y1RgKY4(^xl*SR5*4W@z3c?rt35;fh5U5W)xkI5po!j3H(Gz>roa!SIgFvOA z)U8ICd6V4#cfDVO0Hr$Whp85q15&SMVW6^)7RLrE{V>x(ZPmz(F=KEWxBvy>i33m> zv_V=;h)Sgg8y8sG_mP0i-pq5sa5GT|?8S$IRri}0cva5kj z;0oZ5fLAeD=8z5pn4NSlkmMrW=D>a|Js=kPN0kzlXcSQc(M6!9=S9gyO}I+QTFLVP qeOMbKp%AcDsB$xvD%_tL#81v3;%H2~qr98{GL+~Bdeg%ub$+RjO&1U|H5|}}#{5`eJu9*-?1D;TWr>O` zDi&F2m`+h3dIW)WYT6A{TDW~aQKf62kobx>A+;iT0 z@4M%%SiQOe7VLr^w$k!)+u_NB4glu?{Z~s@Ra9XTtUyvdbK@$i=1KKmtT_!Be__0_ z#^-LtTHzRAy2p5x*W<4J*tK5*3~h`ZUM9wkm_FtBA;z=3zUCb%7j@O_zXS+opL<6m zN>;H8{X9(#ZlA|;d*(-MKEe2Wqd(X@_7*r_(h9~lE&-JAN*Hty1i@6>;`6n}tm0@o zqR$G^b-L&}eRQHh%dqOFoxq_`C?Ty$Q-RYXsV6nl-D{&ujZuI4@Th)#G?;->PQ{xy zA_>VzK`PRbfeFawjZeXJh^EW~1zq8!Vx0u`vl8dPH~*29fj5bEGV zBZAn5R_w%!co}=pjt~ywFuL(Nj-nSQ@HXDXDcHrw)R3T%?yF4;|toBHPrY6jsAeU z*;6~$=Blr^RmQ@Dwn|UX6WGRN;wt$r_bo;VUu}{(*^**SO-mn_F@8d3R`x>^C*@3@ zGIiQ?+l<_qv+^E(B){O%*>fJ7JI^jkvZ6Yig+;~l7c6{y(PCFgY1xwU<++wzOWJ=O zGb}bsS|B`{7uNQLBV}(~32R5frpTG_y{qAy;U~jM|MZ#v_9gdOZl&~Dt+%?Ysr>dO z4`s$>*6;-AWA9u$#stIp(d?|w{hb{hIc*2py7o>xT3(iWef^DRB6Xh)YUb|k2ZQY` zFKC(7Ud_74)3I`I)B6o4>-@*+&Q*UKx_02luJ2A<`oGBiRvCueq=5z1@BHOPRG}+P$pHLy>|T1DdYi`M9=5GxispYPfUg=kB(ij-GCF zG*7$CW!pnpDg4hC67#3k>hTTf3x0!O9A*YP^Um&y=^s9MwHMiA2Mv<$1BQC&Vk~!+ zVPQ_f`v1!K8Swcf$2#owI67&ZA3xCt52XaUQq&FE; zbUFhsi`~ax!&O$Ygj=2qu0)NPytPOe8ykyNWyGF%unAA`-3W$cUSGyc!qy>;QNq?g zz#AU0jmYFinusyQdEzGO=Qg?lHLM%Z3=ej&6q)g%1@ξh1{nH*j1FHX#t_J@HkW zIkJ*{6zAORdzw*zeOu!BL~iJIenwraD(g(v7S;+3u(3AqFUGrKySy)B7_qM*k127P bI4Kv~iK$PpV{gX3S^qL(87!P3E#dnU*ubui literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf new file mode 100644 index 0000000000000000000000000000000000000000..eff7821adf7280124efe0228577f1593c4207c8e GIT binary patch literal 3756 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,42,43.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,42,43.otf new file mode 100644 index 0000000000000000000000000000000000000000..b1a0b3c8f65b5235dc6d7dbc85533834e5d2da25 GIT binary patch literal 1440 zcmZuxeN0mL&kqJSSW&I~efYBXD%(U1lI(!|8zg1)lLQqO$_oyPle&pE%}Irp4% z@4N5i6&2-y2F`*41XE6qaO()^0f1=$uJLewUg1xkU-AJ|0&*e->hc6^YF&>X#7LB7WFv_tx@RTrpxBVvXHg>jEXF z2N=hxc9`v=W;yjE^sgbFb~!!X(3^nyR4hio5?Bg=fRY13h`OxCZm(n3-e3#_6GjHXj?$ae&cF@_65|^ zWMFMBa5M09AmYD1{vTiDm}V(zOsie;Yd7JxBIjdesat$NJ{M?*5Gf+ZrdQ*1T^(JW zo$<}x&HmQJft>7=g%dZ9NtK^prhM<|bDs8^MjBgerP>y;Gq<&R!ZBLu9ISk=_?GWl z_ig|8BcFWB2PS=&`(}o3o}4v*nEMTV)P3OX)3YDUwS2wY|9k75&Z$>@GuA#zx+v$T zaE9;f^7*>r-Qy>!heSU3$i3aVs9@^qcAcfW{55M6&8RA*+sbLYmBwAACMnr0WxgOK zNUt1`V##D1Vm#<54l6r_A^S{$HwqA;-gLF-IWnN0ZF+;iW zJ^SfVsv1wf^MQrA$&t4jE>(5#Eytg0dOjh$`^kYrXG$9ei>J@? zLBqYBxR-XHE(&iV3C{u3uNO;V_Wc1wwTKMVr%jz@`o~Yt4?$e$oKnxdk5B;|WAPR* zl8o?!0CPmnqh4SvjH(`&v$C*_L4b>#Cw{#ATCze`;4bK84QQi4K+N2{Sjp(uFpmswmFDK6t)%j@yh#b6~scp zdW>4;E#Lwtc%TGIQ9Hm3BGjVXg^V3)z=n1O#@LWA!MGYY1#X!am zEFw4hD&%~-U`1S4+tv-MNaA_jO!mf@3PyEow^ zm_r_+3+zAhKZ9k|Kq6!Sv6;ON;MpGt0BbN0@roWVax4?RFFa2n%p*tS8H<|r%esz` W<2F3e$Zo9K`gaV5U@VJg`Qb0Zb&R0^ literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,42.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,42.otf new file mode 100644 index 0000000000000000000000000000000000000000..b070e2bc9a3a19f7692e01e52f33098531fcad85 GIT binary patch literal 1324 zcmZuxZ){Ul6hHU9*VotAvVpdX8LoL7&ag;uRGAABvD+LG#V#F~X#%6HZ|z3^x0BU? zVi;qz9aNnQ6NW6QA9T|Z-B5vufdz@tXuwD`iP z)zvkIBgt5o&!13Mcho43+FFO=^oDn} zw;EStuOM0M37a}hfX5!q%d6xnxujB7n5dLXV!6fY96g-VnvP$}(czq^P3G=i&Rx%K z$r=Calm7LY#^pKlxWzJ;wJgKKm}acHw9VcRJl+NjK!FHTi)FUVkxVL8-Z$8n?YF<% z+*EaS=e3u#?yt{NX=v}!_(0EV)Y|5!mP2Z4Yk%~k&{%i)ME56cKc%k>{+hjU`oa%V zZZds-c>2`!U1vR?Z~dM=7Tfgx-m{-wKJ?xE$gTd{sWWe-r~Si}WGI)V@T!!`q|=%5 z*u>80s4C?j`E$L^oL{xL+U6VVe8+!~uG!N{D>`YppO#&sjasEgtKFfk)ZTnfEA{@o zXJErfH0#?Rf5W#goQy_K&3~hnY2v6fp8fFP_);l}o}hPa7iYAZYtxjQc;YF#of;-; zJ_y}Dc5|q2BsDT5<*VsMEIW|4nej!z+tAmIw*9x-OE>-j#4yX~ebr|UF#XGyZ;wJ* z;i%x?K1Ij_$5;TvELp=Q+i#jd;wocc%W0o`I*q2@S;>OwMg0g+hTNQ53$@rI$Eu>XqLxuV4gx5s1)Pj;V5bBp9`>uHTVa0! zfCqJ1yeW4223+|46xqT__7C`6Tan1>|Pcmg?=37;34UBmzY literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,43.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41,43.otf new file mode 100644 index 0000000000000000000000000000000000000000..a2715ef0d0b0b5c021f13d31d996be656e6aeca1 GIT binary patch literal 1332 zcmZuxeN0wQZ)rtEDQMvws6Z$xDG?$kyCVQF1Hk$Y9xE+}hd~dZ*@j$7Y57iL!?(w$0aPKx z)in;Y8>}q4>M>LnyJ)t2X6i9wJQs0+9f_1R?iIv##M|r+UsD3lRwAxO%sb3YZcrUV z7bdWAPP0SQu4aFV@!t{8xLsaf>}|mDG-|{G0OqOy7*MmoFbrq$I~>i_+Z#=WXa*C_ zWTTm?=tF9RW- zdnQgbj);8p(Yw11x@h)#uEEx8eZ$^Hw%3=F3@b^ule8X9+v8XCFCEG!uE3 zoVWUZ>u( zpeQ~E)hqj%SS&_oMP$N{3J1?(ZHzh*`xhgQ`z$0Oiu#l)G@xILISt5HVV)mOgGb>-rI!^m%P?kBI5WncL*&6&tuo#& z*a7)iBTHvRn~GM8wh+`n-xm%o?ipP*U1!|JzKqS^+Z%kjP-rd{`bX$4&_>5A+Guoq UMPhH!x8{F@W^3^sOp3?;0a;0erT_o{ literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41.otf b/test/subset/data/expected/layout.context/gpos_context1_multiple_subrules_f1.keep-layout.41.otf new file mode 100644 index 0000000000000000000000000000000000000000..c94a78f60124a5a4c10c22918e3189d332b7d6bd GIT binary patch literal 1216 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf new file mode 100644 index 0000000000000000000000000000000000000000..520a37393bf9e8674f66719c7618bce47b993df7 GIT binary patch literal 2156 zcmd^Adr*{B6hGgxyX-Ct_+Uvy;&Wle)C@&t zx%b@rom;qKMIo5rC5QoQenEltS6gu$0Q3TAXD(P;xcrAjKmP&{dyTLih0AAfm7f)z z0MHkczPilku7Op|A+lGJzSQe+m!Hl%w~prCBwg|nFzUAcLmDrTKE>+`)|-EfX#&t? z0WfBtyS@foOUVS?)b&+vpT~4F<1~r=r1#cT2ZF!tp*r|(U;fx zd<}|}8%>002@@^VL`!3$N=140G(pauf40UBU4ya=yAGqgYmcEB#!4SQi99Du`c1m1z8wCNr=34PEH zXW$%s#Aq2KvdAHi0*WZ19dpoutPNQfSq@nqSpiuQSqWJ?vN^~)kh392b2#L9$BEZfT2Y@F3u zUcJU+UEUA~dVB%v!m6@re@(UD9rTn>w>m2;t;>|*0qZhPz~kRQ;K-rUscy>y7aek} z!Dxyz$0sC?8a-xgk|p_(apO}aOq`TD*_xJ~F(vcS$Fi~?pE~V{=`(CB#|xrl&vE3= zoHcvS+AaOc|zx|Ju?_R#QTnDNP~irUZX@C^IZ?3rAdUTnNj1!um*0 z`0mB<)$pQl>_2UWziq~2rWb?S3`e4bGm63{%&&Y<|8+Qa+>RynOioLSA+0(jYYwhu>u8QjY6(@_o z30-Qx-tq0>vtJs*J)tvu`VL-QeahXxW4!r`{7SanX#SEDN@;ecii7p0<9uJZY_*;+2yx$oY{p zcf|I5WI|-u;z(lock5enJ8L_zG4L{Ou5PHUJ$UnSBsro#U^v$C?v`WsLmA}#@?FdM zfk^h1K3UUkpCcE^y6)_wRkwEjw7aRZwR5*2nkk>R#Qhfi({j1Bk4cgBN=aA894FdbA@&CG4) zHrxSDB^f=CDsY~BQX?uV=gm1Jgh_|%}Jlq^zbyD z52H2Ge0mk`%Nj@^Z3K^b2-iL&>mZ2=_sAH%iX#>6YAV~MP)588g5ZIAq8uSUsDnz9 z*U^|t!b@pf9jpPrihI;qYw3AdMmAJ2H`$&c%}=&o^m{mGar6ZYglAKT7Nj}sz{HF3o{!3Flm>?DC#46pvDlkwKYUEw9 zFhNfsNSNZ4p_S>uI)W3%s6B~z48_T#c(Lj@1C2Ao81=76B`ZT#r7OEq_NI6l^FX61 KgeVpz9{dGNiR)be literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41,42.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41,42.otf new file mode 100644 index 0000000000000000000000000000000000000000..b9e8c99f14aa2bfe86966c8d2ca129a5dbcfa47c GIT binary patch literal 2040 zcmd^AYiv|i5dQAIy4@}9z~~{{=j?xz_35?2NSpI#(;Bu90)ivx zZ)-+rC7W=9o2}6w3^?viyTBs*;7oH>v(t)?{?Y}cjY zL29kcu>nLIyH17C9J?NtlW} zT1aXUdEDd?$s>_RCXYfMUazOLskuE=N3{{xjOv*#$?cY0zM7_u0oTg*a3l~6yOuUq zH-(y;LjFjgX12@M(BN93yN6vX0^vYt3xmn?S7@aw0Y*u#8 zW8=n8m^f+jl&P-VylK<(AAe%T%qM3RJT-fcTa;u)^>_=5is#OozhL1aUrA}%;__vc zd5%0s`hTTdhs%+k>&SJahhoF|F>QA&UiS8tn06p$i=T`=xEi|=dpef#Pn-R3Tk3Jg zowVal=bawsD87iP16f9&eS0j-`t|F?h+sK0oRi)CdUsdXgdKZ!^z52)u)Hj9uXyN-?&wYAz=ht`pe%p1g>(m?3v$Y2_p<6TcXn4`y)g6s?PY9i; zYUvNy6SMwMv(pmOhG%5co=tDozNQsyUa3vqq)n*Ra;|8l@mzo0y)Hg6zJFOfqvqD; z&f>n79@-Xug*uwrTUrj^{W6{txAohP_k8%;@xMaZwL{v2?8^i3nb*&1rW4);+G@>u zV&<{Nd;5Or-O<<8*K1GYYnM4}XEZyFe{#--(X7(8!1|1NzeBLz*5Qu)Q`>d^!{x!7 z$QjvdkxZYkYKBQixx(BQ3X;31tG_rEkI@ieRqlqbjDRn^T;j-rx zhJ+#9hh%WD%o1R7*vvL-n#pA0VfvXoBwty{VlII`lq6&5{hfuv$jFEul{FuKI@$0n zpO0Wkz^G?-D+v*L6UD`M^&_l61_+t;FEwBslVp{)YVv>D~@ZK>>sYf20w1j>5#V>lPsr x2uB#x^DpqqZ0u>^j0r}|GH^Z#e!O%qJ9{}X#`q^Du`cjh^rqJsy;&Yg_!FCTyMO=y literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41,43.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41,43.otf new file mode 100644 index 0000000000000000000000000000000000000000..52fcc8c62af1a03132503441d82fdbf2bb4f8a51 GIT binary patch literal 2048 zcmd^Adr*{B6hGgxEW69{QkE273rInl?)O~4C$M0qhJiMi1+K811z8@upx|Ixf+7ow zMH(6gxi({9I0oiuqmwd5R+FPWriL-6fBL6s$f0)e)1mV%zNYEF{_K8p?>Xmp&bjA1 z=iWItXWhCS(8Ep$0#jyow&~}HHNODB0D#)EVr@ zys5}(tAgXIOQbI+x!7U16`#wvP)fePkt{g~h#b?9UL%k^*Ws+Gi|Pn!1PGoBz(hK2 zbyZ+pODgE2sj09z?fTJ#bHtt{d7!G&T{H0>aJ2t5l1%_)Yb8%mtAJq`O>wQ$S+8(u z{s{0FF#bZ7zc9!@O)Wn zut6~(lz|hfzztiW9va{^cmtZC89cBL4nPMSg2T`S-Ea&(fD@E-Kb(d^I1A_D0({1( z86C37A&&xzD4_*YFcn!dvMjP3vOKZ^vLdn)vKC}hkWEF-j2!uJ$nnSt$ce~F$XSp} zK`s?}Gx99*v?Y(cfV_yjguDg$6y#G;Fr&btz@b191r$USBor(tq@a+Bq8UXNMGi$C zMfxETMF~X^PjCo?(^w=3QXU(2tii=N}oA~5YNy$&ooBzy$g=UuH1yQo3q^2!eykzOJ z<>?uj)~xJRt6xaaC+Nff>xk2vXp=a7yguCJ9Z&Sid%QmDJD0rjL9fQw@4b83d&B#j zH{_o>?IWG8SAQ$C*I>BSZV03Ms2hq7tj3Y4feTIdWP(}8Y#11iF}Ch)ZE1;ZY-?=a zJ^OIBHGa6@`UYRw=jUZ@$F_a$=Gs@~=zNE4XtKAg*$%AZnpo> z{pmHWx8HOA;Na04o6gwIuK7mhUCWMdJM+oqrmsgk|JZ%I<Mpz1KkuGs4D~0BCmFG=c~*%W>yTqE$(g=5o6r1;Z-(!{ zDqlqLk6W74I;-1phx>JGsI0H9K012U7vs}(X?xp0+|_$OlvX|>-!)zw@+Ds%lvRC} zrSf_?xG(uc#qIsSb~JXjbarU{iSk8b=tLdk&pE>P!93mw3|`e{#q>e7V2-*p3rh_G+76erean8P>LE4`*#J+HoX* z;4Q6Ry0?&WY4#XHmBta6me{V)!idFx0uww!2s9*~+Nsc=E)IVSF%$dLoa$o|gFvOA z)U8IC`IFrLcYRQU0Hr$WhNu?90jVc=QJ}Jq7sm=J-4N4GZPmbxF=KECxBvy>i33pS zH9?x-P?bteZpyhl9O>4KENZdokU1GcS#K?4CMG77s3fJ+rwk1|PiMrab>vU4!hK!^ z;UrDsL670;$M|4~rp7&KqY2p!s0mjoSu1%y qq>pN2AQS?&3RP~VQiTUIllaLQL>!HYca?YZUxpH0Pj7nor0#Di<>6xh literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.41.otf new file mode 100644 index 0000000000000000000000000000000000000000..ae6325f7da799953a199706fe159cb00f7fcbd0b GIT binary patch literal 1916 zcmd^AZBUd|6n@_QVp$dt1ycN4Q3}#<->+T3&jrLx4Fhdx%#Rh;1IV(l3o4D3B`UF~ z*pP*$>9jRtkUA#jh?9*n=JY+<)YLHLzxrto%`Uzco!xcHY5LdC?#?~uJkL4zp7);n z?s>~suP%oLJE4cIq^!(#aPpu7z&Sww<cao1cd{-_Qxv@>?pGBIw%^fAW|F`iZHZP}i5L0858OMqbZy0 zconurl#MUhlQ zo)seNbdh!X$V7vdX4OwSjswA9Tv`*R0;fijPiUsQ*G88bBfiw(QT_NxAPptF6(8P+ z1SBE}$w);SCLog!J_XZ}jU41+Hu51tffGeofW;_58J1xM%29zesKQ#ThZ{8@)WeG= z1h5rt*nt=EGIpZ_LF~st^x$cVlcyr@ZSvSE+X5{fZ@{*!vD)Wv^7-8@ zo|=4{tD(VG5e*O6Dm(#?e=C#mtK_@fyBNiMwF%}#OOiD?C3Rfd_zCG5nGa2zlr?$E z)M?XgGqPvS%6a&a+`LC;&v`6=u3eO5MRhm}3XA5=U$Ah|VpnlV>5{VL*_Lce%6}a* zEH+DuKQx*X()NbJrEgpbX@^3l@afRKtD&2rCqfDT^qK$mCH7fvCG}aYx4Ny#{Prad zrN?B(@C4|i?_3AQ1jD(}%#5yAx;i_v+V{10@0oVEtTg-j`Ww%L>pvOP%st!o2Rd3` z(9)}FHS2Cq=gK|J?>C;P_Z_J}TlH=5+P)vVzdL^EYjfyyaPZK;v6~yuyDzN#N|XJI z-r08k!>hZ$xZV5fo;#gqUJVY^9@2y^P1mjAIdf-MFxZvl?_b}1)MJj!{$0&Tip(6% z&7ggoU#s1v&Dm0^P2H?z)oPhnw36@)ci6rzJUM)Dc{sJ^`z;+sz0KY9eBdS8;cIJd zK6d-laAw$a)ZEwo-mbp;sm$6D?Ow*^p>W=f0ZrHMT&S(ljQx2h8}A(Wxu?Civ$w|_ z$`26Xq&+<2<&i@U9ahMtG$T_n!s(-kA{TpPC?Keoe4;bp9i?ZBR zhJ`tC>;EfbHQ@RsMmy~F7&>8`7pv%lMJa|ZaY*RqHfI$^gc00@6w_dvEkI{6=}pEY zozB3^qWAIFaFrG>;g;uuE1n}NZ!HqW#>S#q8L=l8Y{HX#H-aIN*OxLAw{=Ki6u0#c z@P-F$BhtB%#$!w|p16tnxQ%W=HS0#Sz=Q29C1$*6MFZP)9Mi!3299gRCir8#C$?%c zx9bY_QH*o5?`cMU_SMDq6S<+=`5AT5tgO>nTUaYFz{c9ZzbNmDp7OqoVnn}&Jf_5C byizW<<5M4J$KH&7v;Jj7cd+mdDRJMQiA=AJ literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf new file mode 100644 index 0000000000000000000000000000000000000000..339bfe8cc896fd31466e8f5425de5b5856503cca GIT binary patch literal 3772 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41,42.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41,42.otf new file mode 100644 index 0000000000000000000000000000000000000000..5f0ded38042ba23a46501d0366d6b1d01e062c70 GIT binary patch literal 1336 zcmZuxeN05QBfsKXJjlvO81HeI>dW@6A2u{C?-0 zd(OS@qhZgU1~9`B;6bjbtCOqmOuqsElK@=F&c=r3-`@NEDFERLa=i`Bk2wS1?VSMN zs}Ub)3wk23p6o;aZp4j##p9iJf7OAxw-8tPkyyPXzKQWR#E)^8w33QE>cU*vzsZ?HCjU@n|F0C4+;=Sw3I}KWO;k?$gR@=S?1VRMkt_EM# zR$o+ty#^2W9b*;!fXlwIENK}Bxvi6@j`Tz)>(7LG;2F;7DAZkAnvfZW8w z<8qS{S7NUsnePdkI!=Jc9xbcO%w^_+QnSoNsktDgE|;tHxT@8jx~kG)Rn#Wb``6T) z>MqszU!U}^&opLUu#8!)3mNMwJdA19rc3+$I^gj(U;uJNm|QNhr{7K|lf`|5eVKm8 z>AKpox&1d@);hnrOr@d2C*lKLZ%|u{pIVP8$@>22C!x{K@R`ofT7F7hAN)0Q`@)qU zC3PZod3fsl%>$P_U)KLXACK+$@bINCt{wY+apaHwyUC01rl$PEl%y$_q41iNOs7)m z;@J59=s88oKKj>IyCu6}d86Go*#5r%DBX0ZnU=KEVm~dqN^7)Ik5;))Td%$If>!AL z`Ov_&k!Z&Edi*V4Z@4EKJ-_&^R-}pNq_ND$N5@u5N%Rc8Z=adfDsD_sZv4q-=w50V zulOi*_vD?SzLDg}kd!T_Ggx*YWw+pqg14cs+hyzOTMM`U3B)kZ=-%>+N0|O)X6_ag zvj(W_BAi$YsNd^pHB}-%p?txR+fHqqA z1(-!%G*~!Jzzo*UKf_h)eh!`m7r65^m|WOFa=9Fknp%vOthadq8bfa`46ND}ZpxuEn0pwdTt_u!AOy?Cn zs~xuBjtcm6&V#;}5XI2fq3^c^HbW)$$g!%ZZK%ztp8x@5)B;Y%yV)thg@^rmQNF}R#=OYb;PprlYL)o3A$t!{0$j`UBmzY literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41,43.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.41,43.otf new file mode 100644 index 0000000000000000000000000000000000000000..5c14c1b8d96b1a59fe52c01337c12b20c7bdab35 GIT binary patch literal 1332 zcmZuxeN0dnn=b)pHmXFfX76%LH z4B!12RT0P75cK)SEC^9Rvl%giOq?3c=0`MS;XnT|1{d5byIbnHuVgO9^K#EQzu!6c z-gED}_m-5Gmw*;dg9-#oaj_6N)*AtUX#m!@|8PkeJPLXM%@*WRO3Jny8@@d<1)vHd zuBvug-B81#s~$yVbBI>krNS?2F`kRqnrT%*+~YFDx^Vf+uo({7j77kd|sIKLXP0D!qF00z`7Fbu=lnw`#8>g|puLo|bl zX0p*tRrC=x*{D}#jzWJR5ZC&I41kYTH;fVP&egU38u`iOCAst=xnLux8AhFOpu}$4 zX*cb%xZJItTD!w1YHo@G`Ae7Q{ zuTUy_Mb9fp#%sc&dKge)jk=Uw9+(HHGc%-q-DIuGXfek(Fz5n#^6`BjFD_BI{G}WSHDF%q_@y*JlVjzH1LTLNw!f z7aMQ&|31(;Gp!+j=+i-2@>$Y$D__6nbp|QujbuD7EXd-!gNL~vu_t(t! zyfZN(KlPKGb5qWmSdbRyCr96JzgXYLcO84N;GO<{U&Wgy49~BM`VQq{$5&IV*j{7VmA&UE|2YB@Zz6MgEbUlYtcssbk z1zxCxYP5~u0})zK8oB)r)i%PE=*nuO8U{^RR#$G_=!C0*_ z-VWFX`B)=MXGNQeR*SX()Ii@C4lV8(T{T^2+{V6)&E4M{e7R6)E*1Jm=q}Jk$Fr{eQX zilLOcyM=|+hRQ>lj6bvm8g0>lu?8A!j79^5hiOdz`L~jq*>W-KxwBP?@lNKP^L^)e zZ|+Rp&Yg82!y({7t*WU}H{KI20Kg~!x45>xt`VLB1wa@_&EvhY^_y1AokYCekHo@R@jZ-}5I^k?#yj#Pg1J0G5QCnM2ypex z9%eY?32O4piYw?(As&r{WAW_A;KKT8#45JH(f|Ym4hSKlw>=o_WY(rk0c4hvObM4M z;WJMPbdka@I}gW`$(&U3N&qg-E*PZZ!y9w8Hgj#klv%sj+^`6ELWJ7wzV+*>!jVqB z)#s0^E1SzzS7oJ3b$i46G_|oa7T1C?bz7)8tVhDSC$4!{sqR2PZD8RswLyz%`ddim z=D`7v0*B){O65{Hf4Qv6`MNPzX3(RCS$*o7LHiBSyktDOZrn0nHuC=Klm7MDhvaF; zkfKbdl?Av1`$VB7ol{Q$k4FGKkR`(CT#+;NK`N0b?&|GIcQ5;>rn+=;&&}7(w(qV| zsqetCSWo-Av~ahdDo3=$j_&A%&|q8mblc~taiIJ1ZF@HZLDaxfOye%bC$z-ZnAKnu^t4Wz>{#@sD zWLC_rbozQ*KJ*`^75f`$NeeCZ)1qs%%3SU-E8jGim?vH_3%vLD_iP%7rhV_k-uE30 zcSfVY4S(0nV2o~DnS;}d52%`wUiZ+MaJqPF4kPeTum|JK(vkQnHb zGG%le+x8@#4!j*C_nz9=@LW^D3x5EyO(6pZ%SH|{{mb~|Z79kf6I|RE2zhpo*s@KL z3U(t|zI_7qBx7LE_PkY*h5Wq;aP|q31{)}3mdwIKa9JAAMhmZ|Eb^kw!EpknuzCJj z?&_^C!4`0XJJ*BB>CGgY&9bhD&|?LQ@G8zm1Uu$eBa^c^$VZg3`Nw$SG1~@(&@dk( zTD%V;5QZ2uK{M(Q#6g1&lrCg~&<+8#TQMepd=tjC!#>b0UbC`VU^Q0Mz-MtD^u2~i zM_;Q|Z#ArfN}Q2nT~QaJmQk+-0aVliK8$y>T{4;dcK%cp!~jbznL8=Ad-f8nVXf>L R_TB%_VijflC*|jSe*wLrQO*DW literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf b/test/subset/data/expected/layout.context/gpos_context2_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf new file mode 100644 index 0000000000000000000000000000000000000000..339bfe8cc896fd31466e8f5425de5b5856503cca GIT binary patch literal 3772 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41,43.otf b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout-retain-gids.41,43.otf new file mode 100644 index 0000000000000000000000000000000000000000..58c9bf42e841f43498f487d12d19b6a483a044ea GIT binary patch literal 2028 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 Q*5ZegHH#9C#3a`C7f=g`r2qf` literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41,42.otf b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41,42.otf new file mode 100644 index 0000000000000000000000000000000000000000..2ee02fe34632a94694dbe741967a242ed82e5fa8 GIT binary patch literal 1208 zcmZuxZ){Ul6hHU9*SFW#vJGt)9Bz4=E@6@2C^8pZ#CCH;40hSTOcNM&eQO!(zxO)X z3@T=0)V70a=E6iKGtWfbbVL{$Fqwe`(P%JWG@5Dl4L>58c^wy1&utea#(Q(mIltdI z=bm$K-hJMkJG~&oA>cu2YH3j#Zk&G}0L}t%728_9?QkF10fY~bEA_TN?CSk?*9-vP zfOv0L$QOmRWH6_k}_O%-WJIfouiI zR&v=&KD$PstL=Q{DL9r&6{NkW0^pOSRg+Y_eR+AC#cU{9Fx&1i8&`ush)}fM8>rtL zsIPB|Ly>grsI+aGyBRoVyixEj)xr@~zkEgI2$an-*;argErZ7f_@ z+EiWDUPQ9c6E<~(0FOP|N~`5+xwuMJn5dGAHDkHPphpa|`S?YHjv1mkW8Ar9TsO8G zMgR3l|N5*`@}h0ZZePsUSK(o-^Nzf9F5C+|-UcKfM})J>WzO{L>148eXk;ieT={lO zbM=)y*Pb(bzPdoA(E~^IMBgja(GjHf!)kKJaO~soWKZNo&!-(frY?{Cmig(_7vD?9 zOzOhe?8NoG=X{^j9$MCJ>={Hle!7)nGl*>?fNlKz8k?{B9S-LyPN%P!I;v&v`I?Kan%Z#-?5_&lPjei2MEHL_D&FMo-|1$UWAe7~f z3NG#pLLNBA0$3KvdNx_UbsmW;jDbnZWBDEPF)M-qXPqY*uz;N`ktMhduDk}c(ZUxX zi@a#Dah!k|te<~|yV>(3JOOU-6lyTJxRvB`IaU>s8z&ngJcGRv!HW4C5EpC?iV+oT z{w`j)%eH_68dqY(JRg84L_mj5=t3QaIH=H%auYH-?1K>cdy(seZrBKIXa%4T86Rly zEFvu*#WFYIes%f&I935I2WlDhBOri+TENM84?7XK@nB!B+yHy^0Qcu*;a1p5J-G0# V6xiH5?7jcbU^~kAFDfqh{szjDPtO1V literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41,43.otf b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.41,43.otf new file mode 100644 index 0000000000000000000000000000000000000000..6e881ee476c0262d808c45b077c7d1bfe615d0b8 GIT binary patch literal 1312 zcmZuxeN0k&WSy&gUPqAVdK_X2LSaWK%P6imism?+#A_aDK!! zwKkIj>R5DD6q~J*$^6yc*$o)aMOk%{N1aorE2Br6U`Jb-05*GCGo~*N-XPmudpY3Dmu3?I4>QDo92hNw<=;E2K!-WK!~9RW>Sbzn~1XGayqnX69oxB^946|qyo*hD z`hOef9P$ng2$38ztJnS!`CET|=vv#ieM0DhKM;D{UEd-#O9dovH_2-u#{RmQo-^Yk z$}>MIIk%Op@p*Y+ZesMq_KOXDLf6rkJ6_pX9N2$u-^tqc;i{>3g-F5ut+l+RpW`J>;t)6$;mK_!w^i2iU<4 z)liGJ2|OS{3+nC2xZyb1Fy4qT09@RL%OH9jb4tjI-I9`Tb_z z%)FPkTeo|69msGPcu=cqYShPn63zp_WdLqzZGBxMJPZneFpS*dy2i&mZQty<0Kiuu z-rpSZMPWI43F8dc2Q{Dnv+a}1aP2hWO+h3U&xvnhzJz#nFcj~|lL+SW2tf?_I-DrT{W4NT!6# zl<=8l0$rl;E6>33WHP6fyb^#5bBji)c<;u1t;5<-Fk{s&wKgvSo)Dq-*}$faRgq|? zejpHxt81FeRZnH5NA>z6uV`vxrxDjehPor%9MPi@-51yVYgKPso7%wA4YfftH2qa1 zbMxSUM}fofT%~fUoWDv|<$T?oFEi;;)2cpk&7^~-Xk9e#UpH@?&zO1tjY;fpe!+eDDLU+N%yXNzoxo$df%-Vt=2EE zQfc7OF{7{j4O+N2NR=a6VpnhMe0a1qaqox5GxU4!-NdDLlM}%~N>Y?dQ+Q2Eq>{;0u|B>pc1n{nkN&yQ z?aDkdzs4QtZ+S1+O)CyI(vlWh9Hd3pXqC0fXH~vzEw|p;X%+Z?KG?TqD3%VqZoC!f zigdGiY)PzG?xCbdu*YVL{HND?#U^u{MH2J#y3An_fW@p`3K><$A25>8A=Qd zNSQJ^iEaCmZWrDTl6!~0e}QW%*!l+$#|$#iRd(qxv%gG!)eS}2V}ghK7$MK@5fjG@ zsbDvft#?kLon{P-I-amAvXsAt0Oy<{X>fo-=Exk}1CMP1ef02Z$|5g1TpTCh5;o62 z;;r8PG&}`f@aB3jJ-dx$vsu;^5k~A}5uU@@h~UKaYmv$M9ONU)`TPUC@PO}tLfE>H zBieibq7VTCnxGkN7~-Ho2kQ067;peW7;i(a30hzsG@uuNc4T~@!}ExAJBzJchxID$ z`8d`Ay+X7y+6^FpidMjf@m{tgrn6rxoPdHDV1=!7r^0s1UV=4j$qut`{C|X1l=1(Q HpNstk)#*#r literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.retain-all-codepoint.otf b/test/subset/data/expected/layout.context/gpos_context3_simple_f1.keep-layout.retain-all-codepoint.otf new file mode 100644 index 0000000000000000000000000000000000000000..5588fd3bbe51704a9667c98f9db021fc97381a79 GIT binary patch literal 3736 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 z zeF9q@Q8P#TrrQv6(Sib)+pSLx2G93<%v*Fs#v@tE1(2oh?5I%V{QOpTB zE+Gd?hxWYPHpue1Wo<&_ak44+gxpp?T+&v{vEDq9#=!x(0apm zVX9thq!@-{!LZ%jJfvmeV`#FBX6>Q?q+P76T> zNg7pH(z)w!BQ-K->?^zje;N%EFP*#Kjpe`0*`A)xY_L^1P3@*H)A<>mADfv}CY9YW zv4h-68?KbgW#yc+2HocKTAE^LmI-t4VKo2BR{kZ%PUHJCyNnJ4OPS5I#WIUwNuh+w zu{q+Vc2|2-o2U24@E-4(YiF;Xz544YP7qlHs4xh>sM*p@jf4vY;*i178Db7^2RqYb zGdUZ=J60@Hq|N9@Eg3J|aF6hI}#a#kxh zvv^>8QD+7 zAxrDQE?)C{KK4Ezb?}n!%EiMyz4`+=3}yact8rV{GTU1n%PXG;--z<*8~Bt@jH<=* z)~I+>5?fkd)Ku0~?k;WH?J~MeO%2-W+@kXJx#~e7{7+dvLvPi7?mL^g;diH~%f}k{ z0OQ9@Z;jXBHFoPdsy(JggTr9AJ8^XleO>-7{hhhH(ygcKo9f&(99268#5e|6JKJh$ zW1EcobZr@~g5H=NbA?b(bjMOY;y>>94S1Ooja`;5`<_OspWiIDZ8L1k-j$c7yk;D% zyZ8nF>hDV3wA`dv|-NWR=*K<;Zkq(iN5}v#Fx2YtEY&cqRTu-qKj(A3IuQpi9DL!TF4Bq>#qf^D4ku%tg zmS3^@$~CEiYMzi#AuOCY%ErqbA9r57U^&-*-qD%To#K1HYuDMXn&Xt3U!B3fm&0$O z8aX%T4!8L#S}W;Fn@(>prUry{;5%s#ZYt=F^P z`}u|9C!2zJix z_mI7t`7Lw8G-UdS;uH9@;?H!)7HnSs{@OQd7u8a%m1V;?QxIciIX1kc%9YvIaHr)= z%h?ZgE}gT|rgdn|JJ^O(?5XBcPH$6JV-MBHx@c$kaOZ~|7xk2&6wG2rg;VFKptwM~ zo9<%p*Frw_3mg`2j*N=8?@K?4!(!Y1RbydCg{h~7*@XxAAO&S{HZrcTKR9o89l!3` z-{Rfd?fbB3Agi{fuFg=W*H@IjS8mR#&opKl%02lldT%lx(#aov{DA7}?6dZ|kCq+5 z^{8&&$!s6>#n`AgJnb-6e1`l$hC=Ww=bjUAfwI1ne0q^ZR>89 zqG>Bj&#JRnXj9$z1~B1twcXHC_w^!v>$MBt{J_WT%q?g(Mkih7DQ zo2}-soeZ6F!b0&KIbuFwcDhiYj?3QpPX0y%We+m(%eV5$gZxs;8FbZkg*}%_@r%Z; zi$l(h{4DNPI_FvB%qALHHc{p(A-SLRyiVj zh1coGJgU-cuC1HN(pH+IsgaFiKjVEG6^WgJ_FP?-CC`$>)v{V@ZjiB#)4L5e0XoTt z7e4=C{>l7=dGcikUTIHXXYC+jlB<@sEvsjTxFOpRWjoO|$Q|QFmY+<#sCU9afTaRx z7DSFJZ*fC?6*6159=A{<%b$vHIM7ycNC-(SN!B@$i;^tXAE)^nu`LB`!P-`w)A^0( z&J$T|FbD^80L;~v<^u}*;({|;G6O8lC@IA@GM_*BcL2oUB;eigxrmK=eoe=-LY(KX z#-8Ng2Z+-K(LYB+u}*9+;tS&B0pcukI+mmajgS1#Jd?*gmS8pzdz0LIDfT6W%uh&M M$iEr?9upF literal 0 HcmV?d00001 diff --git a/test/subset/data/fonts/gpos_context2_multiple_subrules_f1.otf b/test/subset/data/fonts/gpos_context2_multiple_subrules_f1.otf new file mode 100644 index 0000000000000000000000000000000000000000..c5afd3ebcd66c73e62956408e2db7625a54597e3 GIT binary patch literal 4780 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