From 95230e291dddc20185e6a34b69836631d894c0d8 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Thu, 18 Mar 2021 17:41:25 -0700 Subject: [PATCH] [subset] support subsetting GSUB8 --- src/hb-ot-layout-gsub-table.hh | 73 +++++++++++++++++- test/subset/data/Makefile.am | 1 + test/subset/data/Makefile.sources | 1 + ...retain-gids.41,42,43,44,45,46,47,48,49.otf | Bin 0 -> 3172 bytes ...ayout-retain-gids.41,42,43,44,45,46,47.otf | Bin 0 -> 2796 bytes ...ayout-retain-gids.41,42,43,44,45,46,4D.otf | Bin 0 -> 2860 bytes ...ayout-retain-gids.41,42,43,44,45,46,51.otf | Bin 0 -> 2864 bytes ...p-layout-retain-gids.41,42,43,44,45,46.otf | Bin 0 -> 2540 bytes ...eated.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 1984 bytes ...lly_created.keep-layout-retain-gids.41.otf | Bin 0 -> 1872 bytes ...lly_created.keep-layout-retain-gids.61.otf | Bin 0 -> 2584 bytes ...ayout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3832 bytes ...keep-layout.41,42,43,44,45,46,47,48,49.otf | Bin 0 -> 2384 bytes ...eated.keep-layout.41,42,43,44,45,46,47.otf | Bin 0 -> 1996 bytes ...eated.keep-layout.41,42,43,44,45,46,4D.otf | Bin 0 -> 1996 bytes ...eated.keep-layout.41,42,43,44,45,46,51.otf | Bin 0 -> 2044 bytes ..._created.keep-layout.41,42,43,44,45,46.otf | Bin 0 -> 1832 bytes ..._manually_created.keep-layout.41,42,43.otf | Bin 0 -> 1284 bytes .../gsub8_manually_created.keep-layout.41.otf | Bin 0 -> 1172 bytes .../gsub8_manually_created.keep-layout.61.otf | Bin 0 -> 1540 bytes ...eated.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3832 bytes .../data/fonts/gsub8_manually_created.otf | Bin 0 -> 4824 bytes test/subset/data/tests/layout.gsub8.tests | 17 ++++ test/subset/meson.build | 1 + 24 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout-retain-gids.41,42,43,44,45,46,47,48,49.otf create mode 100644 test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout-retain-gids.41,42,43,44,45,46,47.otf create mode 100644 test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout-retain-gids.41,42,43,44,45,46,4D.otf create mode 100644 test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout-retain-gids.41,42,43,44,45,46,51.otf create mode 100644 test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout-retain-gids.41,42,43,44,45,46.otf create mode 100644 test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout-retain-gids.41,42,43.otf create mode 100644 test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout-retain-gids.41.otf create mode 100644 test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout-retain-gids.61.otf create mode 100644 test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout-retain-gids.retain-all-codepoint.otf create mode 100644 test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout.41,42,43,44,45,46,47,48,49.otf create mode 100644 test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout.41,42,43,44,45,46,47.otf create mode 100644 test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout.41,42,43,44,45,46,4D.otf create mode 100644 test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout.41,42,43,44,45,46,51.otf create mode 100644 test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout.41,42,43,44,45,46.otf create mode 100644 test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout.41,42,43.otf create mode 100644 test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout.41.otf create mode 100644 test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout.61.otf create mode 100644 test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout.retain-all-codepoint.otf create mode 100644 test/subset/data/fonts/gsub8_manually_created.otf create mode 100644 test/subset/data/tests/layout.gsub8.tests diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index 062eea6ff..943acf5ad 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -1274,11 +1274,80 @@ struct ReverseChainSingleSubstFormat1 return_trace (false); } + template + bool serialize_coverage_offset_array (hb_subset_context_t *c, Iterator it) const + { + TRACE_SERIALIZE (this); + auto *out = c->serializer->start_embed> (); + + if (unlikely (!c->serializer->allocate_size (HBUINT16::static_size))) + return_trace (false); + + for (auto& offset : it) { + auto *o = out->serialize_append (c->serializer); + if (unlikely (!o) || !o->serialize_subset (c, offset, this)) + return_trace (false); + } + + return_trace (true); + } + + template + bool serialize (hb_subset_context_t *c, + Iterator coverage_subst_iter, + BacktrackIterator backtrack_iter, + LookaheadIterator lookahead_iter) const + { + TRACE_SERIALIZE (this); + + auto *out = c->serializer->start_embed (this); + if (unlikely (!c->serializer->check_success (out))) return_trace (false); + if (unlikely (!c->serializer->embed (this->format))) return_trace (false); + if (unlikely (!c->serializer->embed (this->coverage))) return_trace (false); + + if (!serialize_coverage_offset_array (c, backtrack_iter)) return_trace (false); + if (!serialize_coverage_offset_array (c, lookahead_iter)) return_trace (false); + + auto *substitute_out = c->serializer->start_embed> (); + auto substitutes = + + coverage_subst_iter + | hb_map (hb_second) + ; + + auto glyphs = + + coverage_subst_iter + | hb_map_retains_sorting (hb_first) + ; + if (unlikely (! c->serializer->check_success (substitute_out->serialize (c->serializer, substitutes)))) + return_trace (false); + + if (unlikely (!out->coverage.serialize (c->serializer, out).serialize (c->serializer, glyphs))) + return_trace (false); + return_trace (true); + } + bool subset (hb_subset_context_t *c) const { TRACE_SUBSET (this); - // TODO(subset) - return_trace (false); + const hb_set_t &glyphset = *c->plan->glyphset_gsub (); + const hb_map_t &glyph_map = *c->plan->glyph_map; + + const OffsetArrayOf &lookahead = StructAfter> (backtrack); + const ArrayOf &substitute = StructAfter> (lookahead); + + auto it = + + hb_zip (this+coverage, substitute) + | hb_filter (glyphset, hb_first) + | hb_filter (glyphset, hb_second) + | hb_map_retains_sorting ([&] (hb_pair_t p) -> hb_codepoint_pair_t + { return hb_pair (glyph_map[p.first], glyph_map[p.second]); }) + ; + + return_trace (bool (it) && serialize (c, it, backtrack.iter (), lookahead.iter ())); } bool sanitize (hb_sanitize_context_t *c) const diff --git a/test/subset/data/Makefile.am b/test/subset/data/Makefile.am index 73585f85c..6239adb8b 100644 --- a/test/subset/data/Makefile.am +++ b/test/subset/data/Makefile.am @@ -25,6 +25,7 @@ EXTRA_DIST += \ expected/layout.gsub3 \ expected/layout.gsub5 \ expected/layout.gsub6 \ + expected/layout.gsub8 \ expected/layout.gdef \ expected/layout.context \ expected/layout.gdef-varstore \ diff --git a/test/subset/data/Makefile.sources b/test/subset/data/Makefile.sources index 6275bfda8..433eeac03 100644 --- a/test/subset/data/Makefile.sources +++ b/test/subset/data/Makefile.sources @@ -24,6 +24,7 @@ TESTS = \ tests/layout.gsub3.tests \ tests/layout.gsub5.tests \ tests/layout.gsub6.tests \ + tests/layout.gsub8.tests \ tests/layout.tests \ tests/sbix.tests \ $(NULL) diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout-retain-gids.41,42,43,44,45,46,47,48,49.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout-retain-gids.41,42,43,44,45,46,47,48,49.otf new file mode 100644 index 0000000000000000000000000000000000000000..8495a4a1601b7dc9a35daae731affed35b09deab GIT binary patch literal 3172 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout-retain-gids.41,42,43,44,45,46,4D.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout-retain-gids.41,42,43,44,45,46,4D.otf new file mode 100644 index 0000000000000000000000000000000000000000..27982fd91dd87e7ddc3330f3a4e4f1d02c7448ff GIT binary patch literal 2860 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout-retain-gids.41,42,43,44,45,46.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout-retain-gids.41,42,43,44,45,46.otf new file mode 100644 index 0000000000000000000000000000000000000000..eea44642ba41cc3b9439adf14521068a78d1fab2 GIT binary patch literal 2540 zcmd^Bdr*^C7C&Er@DUJvh4pPjv9h8jUy?6?Paa~mwK`Z@kzFN1xB(LaBp`2jg}g~1 zDFh-IB<-w%3#&kJ?buz#XSY*ZyW81W#yXvLc4nu$({;kD4h7kBmj&7@J}8%mYt@t8;k%EkFajlkz+e3 z&F`|W0g$a2=jCgarSLjb<9QAzs#VH@4~PdR0K%7JOslbC@pJxfuzeoJo77rERm`r? zQ9S=T0I^i7tSW^ANAVO4$;&}yqWDJ2*KK_wA9%?q9m39blbmqdlE^Mli7Ti{XQYXN@we9-{Q|NidGfv})C zW_l)NY0$m|Ud2n{%ZEWYL_j1gf*4o=%ODn3!Wvi)aS#t%U@L3~3CKVJDX<&%K{{l@ zL45TikOkRr9CG0#D4_rl6oVE@K@XKUEOl@Wn!yNWut7U?fCsvv7y7^tgYX_)!j~R_ zt1u3ea070_Z($1V!9!vZu@p%Vg``M^Bnl)+ zLXu=ei4lc;C`3sSB}0@PQ8c0yh)P0KGLnjsRDz^d|i2| zu3TwQ6>Jx!YBZuO&Rj3bQt4IYl~}p(#`uv<`{4k7^Kddk5E->7I%e^brOTEJV}G(@ z<*LBrtnB z@HlWN5dNQY>-K4J{-Sog@4<^D=9#6E!3%cd{YFZ~L^jYOkO9tCbo0%O_q>pQYDn zw>vQPSiF`l>`_0<3M0p6Vuf~#-D+Lc>S%Sft?SLqh`WFCvmB=Q-VK)YoNd>eD;n74 z$JK0AW|VhKCTbFolETJ1KQeO3AJ$+A8b8Ql7VTo@VLII~5F9EI?$=Idy7qHHYgeK&zaRs$7@VX!5`0U7m*W&PhhWMUb9 zA35Z@+%ojzRwV0VXN4b5F$tfIv%F!&9yXf|8&0@X^33^XPiv30$3q6=*$;)0e+&Lg z_^{_e-A5L3;G*3zuwGwWrK(WTY{DKkp^8m)7EYMDuk*T$wZA@6p9m`k5&h}O<>3L#cxS(nB&V0yxqa>zIcXpPbYr7x7PWsh3xQfpVIH|_xaAd4>=DR51Wdc zv-9f@8g~CW`$E3ADrdCndd+0bWbNg~E8Rnme{|TGEYkzhI?{&8a?vzszUaMKbD{sH z%V+X7yL-EA7ti|0bcN7SUz=)&|bR-TI4^-mzerm+U< z;zt{~ak}C09f+N452biG7vki>=frdP9;o>du#6=Do`4_14~yjSLKoJ1;hdV0wjZbCRLES|gX2&4 z5_5BN+^!g0uv tAQVJ+48_FZOztL-I?p-GoqWE{o#*PJ|I#=s0WM!w0HIMDN`QP}^KT3P@2UU* literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout-retain-gids.41,42,43.otf new file mode 100644 index 0000000000000000000000000000000000000000..89553364da45104f7d85f1ea4099f4029a393c73 GIT binary patch literal 1984 zcmd^AZA_C_6h3chOIr$vQl|J-KsK06`+k<9qCmkprx=h0bptDuQxPb%pkTm#2#ORC zH>Sg{!R(eea2O}fL^C&KPTiI*nr&G^j6as_*A{2kT6{I^yv0nj?B9Ow-rRG~bM86! z-gC~)x%unY=Ys)WgD^1XAHz*zwGl9h!;*;SqOZ2;kZlEvp2F6OGfE;YQalEX@X{W72be0Xa^s3!vW}pLvR?5K|h>;58xy@Jq%}H1kS?+_!K^8 z)QlckEr>1adNf-H+Hhb)h*fUJnDgsc_WbYyMFS&$B!lTw;<0VPh0ZH3&@MeOUPT1Pe8(sM>zNH_C*n+<`#L*1;#<2~ zd-lvboM%tGR&sMgpz_NLvaWYWx3|4vmmFK{l8tT7jx~GgPSp%lx{p+zDgMECwd;1z zkNp?F)A@&e7Y>dbzqR?C&h0&P>UhBReIWUEAo0|w|Js$|{u3=Hx9!uly}WVvrrGwc=MU%ZENeMZ zeD*C}P=_I9v-wWk9ne6xAmKlMO2UDAPk_)yRx9<8U9i&2W6S@!H)DzRCRGj)bS?<{8~CnuFt31v}Nnikelei*f$>@9?+ zcojqun&QKrkgK2IH4qD#k94#lIa0}PfGto8W#FPxz7=Xh1A!-*mw2VDSAmmI1$_kt z#35N!k*)_`BIF5axyg>D&qBG6@~tSI89@zZn$^@5oTGRGSs|)m<>sL_c~tr9{-r5e S2Ktg_0#oIvuL0d-oxcEXz}jp8 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout-retain-gids.41.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout-retain-gids.41.otf new file mode 100644 index 0000000000000000000000000000000000000000..1a29bbe47114a2b870a4b28ed4a4a12f001a4b5f GIT binary patch literal 1872 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 HSc886zvqDj literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout-retain-gids.retain-all-codepoint.otf new file mode 100644 index 0000000000000000000000000000000000000000..aae2b269c468e70e20368b06592b7fcb0264c30c GIT binary patch literal 3832 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 ZMB_}%sn6~ZKkJChaHa}_Q4!<;{2P9wPHq4I literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout.41,42,43,44,45,46,47.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout.41,42,43,44,45,46,47.otf new file mode 100644 index 0000000000000000000000000000000000000000..0f8ef5ac3f854dc2ae0d46cccc28b190e7811d48 GIT binary patch literal 1996 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout.41,42,43,44,45,46.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout.41,42,43,44,45,46.otf new file mode 100644 index 0000000000000000000000000000000000000000..97dd96d4ef373278d3d89d3126edf3e9f7f3cc63 GIT binary patch literal 1832 zcmZuy3rw3;6h41n{FDxu?k9%n*0C{1M8{ax%}qDigFSSQz?egHqe5wcmO@*gJj#H! zwEf%CLOWI{j}|(U0TX0^n=@)Q_VN)Q^AVNI#b`{-)H%_=crkc?Ai5au$vyY`zH`pK z=eEu5!NZ3Sf)MI~3*sH=>Ef>{*Q^78Q2<`|?#!(1N{7x25Fx@^{K3q%smk}W&H?b> z!8|ulB`pOJQ~?NBo~)2b^WP+Hyny3}F_$Q?5IZF}fq5t9s}w4oJ~Ed#jJX5zSd~;? z3K54egh4z7B~q1)%v*5)Low!oQngk$+XJbX-@zPfI5z@-03HVjf)M1Ft5j7i+8mC7 z@CqWFzzHXC!w>P$Vi9*)09pV<>L$y7hUJhvD~g5X66 z7sWn!Bu6gUAeTtwl8ti7Cb{HE`NotT>e4Drp3N&iqrDdFU!Q4Ra%`) zr4{cj$x~}e)f%Zzmj8q}O{o-Tu<2THhD~byt=-NoX^Pb~%_qb);^ldhyT7O>aD{-h>PtZn-*;HezvDO($ zCOVtClirW$T5(;nbPM7RKJQmus<}}76U_|#_@U3+W$SP`98PTQHlM8xR~Tjx6*W2? zM>%W`nvOR)P41>;9qBt0t{?j(n<=_>5s}`?X05fn4lOyVKq9k@-rrPqwj@}j_7{yD z{oH=ldCUDp;LVT7(2)IN+gSI_+;Qpo{U4(Bnr){m$6vo}{@`x=uTA&p;a2;Yq74xa z#Bn32CTWM=?uge69xLmTk>SVw+CW8xS5B{?G6_oB zijwpw%~ddNId!(1dGa$R@fMSCb|Q5B@=&19aHiNsnqPdun6q@Jb5F;v>O6!0=%|Mb zOa59*MKNR3o2d1t5*{^epmhyp-g0k+N9U_-F?vkiCTXp*tRh3XX%sE{t}xWtSM!SF zd#AbS;|t`qktT+3ykhIC3pNIgJyjjGep73stFgJ+jjd(;n~HC(-FJo$C1dtvST|V{`yw`V9++!+HL7>?rbFon4^?4 zr!l9fKvgJt&p29t`BUcMk98ia$J}amDqTvaiexfp-1z&5nU0~d{W+oMThP`aE`21yS!VYBsG`mDXax2k)(-*WpczD7?+o4vQvPwv=AISXA1x5BEo)R;~B z^76`x3WLL7uXP-`Qh2rN8+V|i^JG_`HQ*0gN1I;LpEHoO%|_EULvwATrGjL#W-j8s zt#&F3zf{Ehtcm@_cs%B*-+|yyVg+gwhwIsOvhL;;h?{NZrE>6FieFw1tKwI2l1RSa z*nJ`=aNs%{fgpd&+|F~k3yuIz#?TASOuk^1Q})punsaXlH&>`&egyX%rtXZ zYFxJto|xN{U{An(iGT-Uyz;QIJe|D>q~Qy_vv6}R=6K9@vi~XnGuSF2#KA*AD5bg* IApgzz8#UvT>i_@% literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout.41,42,43.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout.41,42,43.otf new file mode 100644 index 0000000000000000000000000000000000000000..d4783b35160f731bd6a9457f72bf4870c8c593ea GIT binary patch literal 1284 zcmZuxeN0nV6hHU%wLIDix=~^V*cJC(hC5S08Gn)^2&YopsyW({SCFW(()~O`*)QS0E$b< zPnsPjH)!Du`emMH6HJzCh0z6NePQ-$1)Ty*HkH+p@7!^^+qG`l=*m&fE2ESq_w-OiWE z;a@Cu$YD8}o;!a5mXu};leUA8(~os_BOWs@nJEOnAcT+R_`rzjP@e?z4GqDmSU zS7yX{@ntdLzdr7XFL6Y@s2R~}7em@L*jD0fO3dmOo{fDM=z=JzAV(&bQ+2`apx>X? z*3%a1NWWNIlr?w!?h&cx)>X>&oxR}gs&AnwRW_<^7yKn1bz{zOjcc&xv#NW6n?3hK zKM!B~krT%QSNo@i=1)$WzAX8HZu9K<`0Vr-Gwt6$82F>(p?~7-z?7|@k|1S56wYz} zU?31o^Nb#^yDV^#=O6FTX(HLnn{?Km>UV9eG_SUtZmgzhHkx{a7D|~WDgSk8gY?!R zDcSN%ZP%`Wx{$Tm`=+(Y)mT?I^x%$^Dyc4WBcV@PM^>-m=pbFuU7wY5?@m!>bY}sr zq{`9UE6#_#zxK5a_y_v9NDjTO)BGO!OLu4BcGI`rT=>IaPdLL{(;(Cf2AW$ya~r6! zw|ctsy|E$bg`cFH`%>1}tT;C_KKxPhmD+Bu{n*jg*ESUO9K5*yoVj_hYVsW}VtBj- zd+7@3H26y-@zs8-;_DO1yZ;2DTtEeyawg8p`$Eh7H;@{=!0MULkt%?ZRRHAz$%{`U zct+wZ?sKvVVdaalQ{}LK1_35B z{je8|P#C{Mwu^g6G#Zs}MP|e)4;387`Usnd`T5A>n1Li@ajbYsXP?4KNP&XY7*$NS zf*0!H6r2Dv*uVs*!5Ldt*oK-Hu>;&-2LV|%Y=tsJR?M(ttOs62=7~kQFmEetj-5&5 x8?Y`dzIz^b7N^V$@Cb%|aI&wE%!s3FX2t+hs+1!E(Gy5>pM4+^HEu-J)0MhCk6nymwXj1ZI3zw-*ub?40Xi! zdV=l^L3eKi((?jO z2_A9>HN{i4i{feG_XBSsYaMPXZOU*|8v9fu+d6m9-B@B$o&CmHZZEOff`eOTi z{)D>LQ>!}b>z%608{Vg>ZGG{C7L2PqLY{Ce5{|hOns=S*3Ix9=!P3wSgPA#(p2Xojm_`YT7@_S(-~3j#rgrI+aRS#HMyfPiac-kv})u zt+|Jm*4ll;UGMmh^11_Uyt0c|__^aMZ_umUdi~4#1NvLf>Sf+v4h(G>i)MVU#ozE9 z3im~$r*D0$J9N`2Wis>e(aGgf3O~v3+ON#$wKu1^G_`pv@8HI%+K)oFPy9C0Kb9OD zQF1l>3Y8s7*{yUsSn>VR+Xq6k4Z! wQGxohL551ROpo9$u@f=ozgXUR;fe$K_r?AF9}`&?IItQl;7)`f{t(Od7bl8M(*OVf literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout.61.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout.61.otf new file mode 100644 index 0000000000000000000000000000000000000000..62764981521cde36d27dd3ca95f44c45bd76d55a GIT binary patch literal 1540 zcmZuxeN0nV6hH6vgGXDbZj>xISy4$OBZ@e2IzNUWPBvu$aj2VG%cJF^6xsp>sdEbS zn-)O?D%j%NABqe&KgOofMA4~>+oIXb65`xn?hms#$M%X>)1B8cw=BCi_rBlnch5QZ zoOg3?;pWYSAcuV*g3R3feD(Ib50U|396+>iecrl!P=XXd!l9P9zPM!V&oBRyihK-t zL1FQttm=m)-vEe9k?+zPG_^1Tx^Z3L8G2Szc7eLF4P#9r&(@&gkf z=mmb|ED%$aIIf^jm%UWCd|9rsw#ihX(_7RFwCU=s%*-rxPML8xt1fObTUdixy`e^H zG}RhS8Vg&tP@Pjt@1f)C9QzM7<4Nsh1loc-{~Aiw;3KJ6YqcVwKqeq}Ux%yzuW$+W${?ZEcg zdEU4B*EMTxfzmTwOgQ`5BCJI@rBrPVZ0FwVB&&w1NY_Nhtu=dm51mYBcZbjSN-#JW z2ps7u@D;Rev{&vg(b_gxR()A=RNHIaddm7m^H}rPo)h~<4i9^O?{xD;_8W|Av>m&1 z$bQT*)O)e{=-@?vz}~yRtG~xR)EHoLm#MrJKD}S>u-f;uwOZ@z8ygyI9-F(xv*l{V zwSk}f!TuwM27(8Jfso@&`={2^Hpb<2x?E0MN6UVD1H+d*J&$=i+$uTV94a>6$tirW zQ@QdFpd=HhKug-GeZqHQ@13iV6zLFW(WjA$fEHA|brV#E&;|c^d?Dbvpg>6SMl@p7 zW_qH4jvuG|AOQt6Nln5N$claeF(Lq3CKX8~a+(&ShmglbECxZ=%0x^hG|GZ7Q^_aJ=ewm!V*Y?)zdc8sICJu)WdGr30lzO z-W5<29XeQoni;VHYM~lfWaY3JiV*40qZ(~ZumzbZYGp*f#jr3M6YqPpG6jf1jd_T% z3zcewN`yHQnywt*Frh_`2yff}G{H+Tt>d3XuUI4*qyU~qwZ>8d3~JagwqQ+JShEGS Tzt37cjTu~xMWPT19nbbJWz*(f literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout.retain-all-codepoint.otf b/test/subset/data/expected/layout.gsub8/gsub8_manually_created.keep-layout.retain-all-codepoint.otf new file mode 100644 index 0000000000000000000000000000000000000000..aae2b269c468e70e20368b06592b7fcb0264c30c GIT binary patch literal 3832 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