From 593e58c84287968f5625c8aa0dd7c60f1a03b705 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Wed, 20 May 2020 18:00:25 -0700 Subject: [PATCH] [subset] ChainContext subsetting fix: add lookup index remapping --- src/hb-ot-layout-gsubgpos.hh | 57 ++++++++++++------ test/subset/data/Makefile.am | 1 + test/subset/data/Makefile.sources | 1 + ...f1.keep-layout-retain-gids.30,31,32,33.otf | Bin 0 -> 2408 bytes ...es_f1.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 2032 bytes ...ayout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3776 bytes ...le_subrules_f1.keep-layout.30,31,32,33.otf | Bin 0 -> 1944 bytes ...tiple_subrules_f1.keep-layout.41,42,43.otf | Bin 0 -> 1332 bytes ...es_f1.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3776 bytes ...f1.keep-layout-retain-gids.30,31,32,33.otf | Bin 0 -> 2428 bytes ...es_f1.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 2032 bytes ...ayout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3808 bytes ...le_subrules_f1.keep-layout.30,31,32,33.otf | Bin 0 -> 1964 bytes ...tiple_subrules_f1.keep-layout.41,42,43.otf | Bin 0 -> 1332 bytes ...es_f1.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3808 bytes ...f1.keep-layout-retain-gids.30,31,32,33.otf | Bin 0 -> 2400 bytes ...le_f1.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 2008 bytes ...ayout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3744 bytes ...ing3_simple_f1.keep-layout.30,31,32,33.otf | Bin 0 -> 1936 bytes ...aining3_simple_f1.keep-layout.41,42,43.otf | Bin 0 -> 1308 bytes ...le_f1.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3744 bytes .../gpos_chaining1_multiple_subrules_f1.otf | Bin 0 -> 4772 bytes .../gpos_chaining2_multiple_subrules_f1.otf | Bin 0 -> 4860 bytes .../data/fonts/gpos_chaining3_simple_f1.otf | Bin 0 -> 4740 bytes test/subset/data/tests/layout.gpos8.tests | 13 ++++ 25 files changed, 53 insertions(+), 19 deletions(-) create mode 100644 test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf create mode 100644 test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf create mode 100644 test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf create mode 100644 test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.30,31,32,33.otf create mode 100644 test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.41,42,43.otf create mode 100644 test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf create mode 100644 test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf create mode 100644 test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf create mode 100644 test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf create mode 100644 test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout.30,31,32,33.otf create mode 100644 test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout.41,42,43.otf create mode 100644 test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf create mode 100644 test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout-retain-gids.30,31,32,33.otf create mode 100644 test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout-retain-gids.41,42,43.otf create mode 100644 test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout-retain-gids.retain-all-codepoint.otf create mode 100644 test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.30,31,32,33.otf create mode 100644 test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.41,42,43.otf create mode 100644 test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.retain-all-codepoint.otf create mode 100644 test/subset/data/fonts/gpos_chaining1_multiple_subrules_f1.otf create mode 100644 test/subset/data/fonts/gpos_chaining2_multiple_subrules_f1.otf create mode 100644 test/subset/data/fonts/gpos_chaining3_simple_f1.otf create mode 100644 test/subset/data/tests/layout.gpos8.tests diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index 62b3b0aad..2c0631206 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -2323,6 +2323,7 @@ struct ChainRule } ChainRule* copy (hb_serialize_context_t *c, + const hb_map_t *lookup_map, const hb_map_t *backtrack_map, const hb_map_t *input_map = nullptr, const hb_map_t *lookahead_map = nullptr) const @@ -2345,13 +2346,19 @@ struct ChainRule serialize_array (c, lookahead.len, + lookahead.iter () | hb_map (mapping)); - const ArrayOf &lookup = StructAfter> (lookahead); - c->copy (lookup); + const ArrayOf &lookupRecord = StructAfter> (lookahead); + HBUINT16 lookupCount; + lookupCount = lookupRecord.len; + if (!c->copy (lookupCount)) return_trace (nullptr); + + for (unsigned i = 0; i < (unsigned) lookupCount; i++) + if (!c->copy (lookupRecord[i], lookup_map)) return_trace (nullptr); return_trace (out); } bool subset (hb_subset_context_t *c, + const hb_map_t *lookup_map, const hb_map_t *backtrack_map = nullptr, const hb_map_t *input_map = nullptr, const hb_map_t *lookahead_map = nullptr) const @@ -2369,7 +2376,7 @@ struct ChainRule !hb_all (lookahead, glyphset)) return_trace (false); - copy (c->serializer, c->plan->glyph_map); + copy (c->serializer, lookup_map, c->plan->glyph_map); } else { @@ -2378,7 +2385,7 @@ struct ChainRule !hb_all (lookahead, lookahead_map)) return_trace (false); - copy (c->serializer, backtrack_map, input_map, lookahead_map); + copy (c->serializer, lookup_map, backtrack_map, input_map, lookahead_map); } return_trace (true); @@ -2479,6 +2486,7 @@ struct ChainRuleSet } bool subset (hb_subset_context_t *c, + const hb_map_t *lookup_map, const hb_map_t *backtrack_klass_map = nullptr, const hb_map_t *input_klass_map = nullptr, const hb_map_t *lookahead_klass_map = nullptr) const @@ -2497,6 +2505,7 @@ struct ChainRuleSet auto o_snap = c->serializer->snapshot (); if (!o->serialize_subset (c, _, this, + lookup_map, backtrack_klass_map, input_klass_map, lookahead_klass_map)) @@ -2621,10 +2630,11 @@ struct ChainContextFormat1 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), hb_second) + | 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) @@ -2795,8 +2805,9 @@ struct ChainContextFormat2 hb_map_t lookahead_klass_map; out->lookaheadClassDef.serialize_subset (c, lookaheadClassDef, this, &lookahead_klass_map); - hb_vector_t rulesets; + unsigned non_zero_index = 0, index = 0; bool ret = true; + const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups; for (const OffsetTo& _ : + hb_enumerate (ruleSet) | hb_filter (input_klass_map, hb_first) | hb_map (hb_second)) @@ -2807,24 +2818,24 @@ struct ChainContextFormat2 ret = false; break; } - if (!o->serialize_subset (c, _, this, - &backtrack_klass_map, - &input_klass_map, - &lookahead_klass_map)) - { - rulesets.push (0); - } - else rulesets.push (1); + if (o->serialize_subset (c, _, this, + lookup_map, + &backtrack_klass_map, + &input_klass_map, + &lookahead_klass_map)) + non_zero_index = index; + + index++; } if (!ret) return_trace (ret); //prune empty trailing ruleSets - unsigned count = rulesets.length; - while (count > 0 && rulesets[count-1] == 0) + --index; + while (index > non_zero_index) { out->ruleSet.pop (); - count--; + index--; } return_trace (bool (out->ruleSet)); @@ -3014,8 +3025,16 @@ struct ChainContextFormat3 if (!serialize_coverage_offsets (c, lookahead.iter (), this)) return_trace (false); - const ArrayOf &lookup = StructAfter> (lookahead); - return_trace (c->serializer->copy (lookup)); + const ArrayOf &lookupRecord = StructAfter> (lookahead); + HBUINT16 lookupCount; + lookupCount = lookupRecord.len; + 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); + + return_trace (true); } bool sanitize (hb_sanitize_context_t *c) const diff --git a/test/subset/data/Makefile.am b/test/subset/data/Makefile.am index 61e5594fe..ef915b175 100644 --- a/test/subset/data/Makefile.am +++ b/test/subset/data/Makefile.am @@ -18,6 +18,7 @@ EXTRA_DIST += \ expected/layout.gpos3 \ expected/layout.gpos4 \ expected/layout.gpos6 \ + expected/layout.gpos8 \ expected/layout.gsub3 \ expected/layout.gsub6 \ expected/layout.gdef \ diff --git a/test/subset/data/Makefile.sources b/test/subset/data/Makefile.sources index a42321fef..5a63081bc 100644 --- a/test/subset/data/Makefile.sources +++ b/test/subset/data/Makefile.sources @@ -18,6 +18,7 @@ DISABLED_TESTS = \ tests/layout.gpos3.tests \ tests/layout.gpos4.tests \ tests/layout.gpos6.tests \ + tests/layout.gpos8.tests \ tests/layout.gsub3.tests \ tests/layout.gsub6.tests \ tests/layout.gdef.tests \ diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf new file mode 100644 index 0000000000000000000000000000000000000000..61f41df1048db11e615cf1953f23eaf6acdcc75f GIT binary patch literal 2408 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout-retain-gids.retain-all-codepoint.otf new file mode 100644 index 0000000000000000000000000000000000000000..3fabe7185ad2b296665645878a8d378c750466e9 GIT binary patch literal 3776 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.30,31,32,33.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.30,31,32,33.otf new file mode 100644 index 0000000000000000000000000000000000000000..34966da1d51ce4bb7d1f9bcd195de407c743e092 GIT binary patch literal 1944 zcmZuy3rt(}8vjmT97+dMIlI?Q*>Mlulx+yiJEwDFn=CGwTVS~1l0k*81zHMic@`Ke zE$ulyebJ5;%Ai0sW=w}0LngY!Jzdo3t~b}{B|42J#%SVW=CmFR_dD(Mnj60_|L^hp zUjP5UC;#rBr5p0~vt>~L zc^Li5DucQKmJ#a#6qD%h(`nSzZ!~MY7|%ohF&zSnZ!3R&R}UJ3#E4Sb?B=M z>edF3??V$#<5JYC4VsJ%D=%R@j{bCm(QH{5fqa}V=Fm6-LjVNGBtQ^^qPodoXcMi? z@hpfhC*rguPD|r|mkD>Nq&ZRWx!ozLO1mH6)!U0k1;ww|61(L5wyZh+$ld(TyFft@ zvNYwQeP!ChP1?f8wHx!a8z0?aY-lspXmu8PP1RaDKQAwzE~+-ZprK3K%odHoOg~d! zWi&MyO=^p#dOcmF*V83px|uG~m^G$m1XFv%%{iqY$Gv7Orj|aad{CLWLb*y5tCg86 zm9!`xP-dE9iPbT|8RK_`FU5rZn1VkOo4*|UD7HJ6_Wv>Rf3frl<*kefmFkvXwFnQG zekD68skwU~4Q~jJ!36OXaaF=di=@T;>cl##sM08Gc5FK)ERG5d{F(}~d-7c0*=2#C z*XLXQ;q|kpJU?--`=_1L_AkqML&1zWT+bQ%jMd!RgW$-%^Ybj2s3kY>6ed@Qp zo+*~sJNR0buj_tQ?Y18w`A>dZibDQrKd$DNM1DNZ zR4^56WvZT=@gS3dfSdC#p9(tOR=Y^X#WKr${4y7R@ALdUjMwF1JdQw*&&HAths)_) z&afhpLi>C!6&eT(gu;>W$%{jyv+urja$!r!{eN62`NV5Bmp5=$tK z;aGO5-DCIn<_s3^T=CA~f0pyL*JlMX)Z#U}n!1GSgE~Rw(6D=Y8(*m(tu;n!&mR1@ z`YNDIw3fh`~Fs|?>mMJgv75f8Xb;AhJw3&yB&L+wYIXV&SxxJ-Y6TX z3b&R|wq9tTX`iv4>VDx8YaFPijCL zEdYs9AyvpTBoY}`h)8n!_m6r^T|^43;jVPQd>ie3@2ND6os_eaRmvA!7n zlr4cw^isC;Pq^$)wj8oy|D7B~64ycl7{Lq`Pz5?rLk-j?mlhsH%m7WG2MZz%s5OX~ z5qSYjNnDexJA#=d7}F*(HO8Jp&xElW>|Br0^>`+cB;sV$*{GGM3qb}nY8kSK7lEOx>2)sQ?#&J(9FAB>vC*1&JM%kOR3u=+%~bAaM#3&JZJnMPs%g nCU(N#4DXaq;fN8*m5rzv6RT2rzeh5YxEK}pEmn)?O4;yVw8oO^ literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.41,42,43.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.41,42,43.otf new file mode 100644 index 0000000000000000000000000000000000000000..206062b21dea465c1b975c75c4fbaa896888b9fa GIT binary patch literal 1332 zcmZuxeM}rx5TD)KJC?mGAIcF03k#H_#HQd$udz05&!be^AOxtPiltXr_V~E(qlE@) z4c~VMoEA|^i=gKp6%e9;#+tMNQn6|@ZLHCdhX4G})QaxWM{~~Zp*F^Oc{B6-&Fq_b zFK=IQd3iB#a1K z-NTm(9>IMI$!K5LST_v}_Nh(KXK`6vTn5L>DnnM8T%0?!o*g3HA*tYyTiYA-Sf@7>7TO>5h_6FAb~Ti zFW~nFQrwfrU6%wl{N#gOdTlsseY;-lt9{GbPIfeuk*&2P#Y&PFh*`?8NO`YHsnQ!q zr1+Yj8hZ8&yMkhy=XJ5w(c*HA-n}6uOPWjUMDWA*iOo_h86g|`t4mVO%{f9(?%qd^ z67^)xW&6E>Uj{pdeZzxnIGbG6Ykv*@slPG&RqNNi?D%_uzVUQVeY4Oc7)j1PlG98~ z1GV$rZ%>U%&-@@|-;pw>mO{&m(_` zxR)NkUW+%8iq6W!$hE5Yy?+3uUO@(0vuDo9_UGSS>yRAjXAJZw2vtDKEZ*W3YDaV+ zz%^o*&@Rg?jH{njR+ZEK77FOtB`OGN&{1pD8r%niVgY^h@DJrQDver8)AHXT_wJf^ VH57?ll;4{F5qU)p-@&+O>@TPfgQoxh literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining1_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf new file mode 100644 index 0000000000000000000000000000000000000000..3fabe7185ad2b296665645878a8d378c750466e9 GIT binary patch literal 3776 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout-retain-gids.30,31,32,33.otf new file mode 100644 index 0000000000000000000000000000000000000000..4c3af1350bb105127da276a3b29095bc94e1fc07 GIT binary patch literal 2428 zcmdT`du&tZ6+hQboEs-3JmR!G8r(oAj{x@dbrR?p1ZY~&Xi$Kb42|F>=5rp7gYCQ@ z1jml;>vx=j69V{f`T4|a(sVz)5=}ncLYga0o_Rs#@ zIr`4ycfRkO@0@%6DBZog6y(qiQc!LwDN(-CY%T?Wae!p+%R5VVJ)-}94}ks_F|Ksi zTBh#Go)Lf)1NsLljk*TdPW=Ys-RSQ$=yg@^H5q6C*(UT03<%7AB0G!wx1zt)V6?Vm z%$C|Q-h%$0jJlQvV0WSkXK=~tbw+)fYRNU+e+T`E29w1)GYkyozmL8WO8~F{6eLN2 zq9|EaqtVzZTI(k>Ve(aKvQ#ozDxG{bNtlx^%^87!$CHrhDbE4C^JLbjAp7Cg)XT~I z&2xEv4rnP#nw*lFHY;<^yzKdl7U$+IU$sWf7Ovm0X-mnrUzL{a*}HGQu8Pzc z8!Sz&9fxfWm&YIa^mC#n4ABslXh{JnBt>K$QLBhrP1FogYlxa9YAsP05OpC@7ZLS3 z!l(#?XBfh02*VOaOPB(}6cVP0Fzbj$MKo%n!IT=JVTnddGzCOcNHj%6vyQMT!m0_& z5Ed)4gw+zZfUt#xEh6kXqE!*CdW)%{)m%*sR^{@_6-q{>VwA;IrZ@D;U9A?Y-e^&7 ztFJVf8%$=MRbRD6SzK4AEEBg|lx2F0-rR&>Vw^ZnCj%^wH-%1>r=`!z$ecZA?z}8T z_A}4UU$Ah|b2*EZ&*v^#nz!tQdy;KgUwX9mx>4TAO&9;I09qTFR7anx3pMV!skt`RumsF3F{r3jtH|yga&?j1>Jq_ zLf`p?p|C#?SbYEX`P07dz3&DmoD=p(<-AdI$r7pen)(iNJx+(c-QDi$>Y@3Ja>X|# zrvCU<7>O$(Ru6#Y5wycSK!XCrcxA}S8rJR(#qQXRaNd?zV@Jf z!2VekpB??~O?QR6f;*5n@4e(hrb8i*H@J8_?D#u2+ya1&Xx^&vca! z(~~)ZNs%@_m96l)y&Si|?z0Dba|TPc=HA)==W@R0_7#EdZ}wYUja@?4UW1VC&~rO_ z54~MKT4RdVoZtHw&n@2;0ZP*XOxtI4V$BKPW&O&3Qc@?*j9g{fCb0>B&_;YH>0br-~GsW4SNbwVd_Hq5j7H zrm!{A9O?<%`+IdAb%&bD>WapNoUf{5wo~oD^?vPh^nQGqzJ0!zPwu(tKGij98|@ix z9qfqO`)mQ5-ycK{O?=t($n~{jxGmi2I?~@A?())yr$K>pi#92q$gjShvk z2evzQIBRTsDm%AXH@vrJxH8gGey-(m+oiTk?WeonJ~rli9P;pG&bu^swinrb(s{~t zGIF(T_{7y<)ETjb2akGAHb?0#g$iGFzz{UJTAb|;drMa$? zM+S%9JU-Gl5*>Ao_x_>fLMP3+@hx$8`a5jSCYs+feFg9B@+i{qLnVG8!|!^Q&#lP( z#lL_`et-yc zi5jAOxRIKfnGvg^SBxx@3|__gQc0;;y#)P)ErAU561MayJn1Pr8M0vaPkUr>oInGZ zzycLe2?o$XHPpu!!C&JFFhV2LffbPk)OtiLh`a&jIIfSMI|ynh!x)KUI*h%Bo*84+ zn7JOKYp^GgBw}UMS*YcxSx5pU>Lg?l*NB~hDlSDIAU!S@#btc@@k|=@RhT1AGehG4 zhW|oh207$FK2UW!Ydz3d1qri@5z4B!SP>JmQg|~NWG8UMD9FW?^;49_=v-J7=S0nw bh*08lil0`+Z!h*Hb|Ee?pV(=_#!deQpzP7W literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout-retain-gids.41,42,43.otf new file mode 100644 index 0000000000000000000000000000000000000000..4a10c7683f6bba71dbf7990cd31cddb5a6ac0403 GIT binary patch literal 2032 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout.41,42,43.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout.41,42,43.otf new file mode 100644 index 0000000000000000000000000000000000000000..b64fb14cea2e14d2d1bcbad7d29295b626770541 GIT binary patch literal 1332 zcmZuxeM}rx5TD)KJC?mGQ00h%g#}7dV$3AOxtPiltXr?)bP5ZjTlk zs5N}w9pzM{rL+jT{!sxT3TUiJ4UmepM$^U`4Qcq#|4gmu9(~kvb`P~N&dZyb-*4W| z%zN4Q3QJ21frB%k0p6OQ&)+^o^#Q;%0DbyEQDF%@4h8`2X5z~Fi)atOAn&rUd4jOQXYJCI0N(Y=Pa3Grr!)7Ql2(q)M25pzyklLwe0 zbYUE)&Si57`kc%;jISY{^|(b}Y$5cU8K*9=F%#6RNiHmil_W zSXnOe#eyh!PaqlX3mfaAfx$lY3C2t=lZ#8|ctxcvDuavjN~>8C>5}BU^K%jzkaY5- zv^Fo@l3tKv{u^Wejm3^}%la{cVL4>jfZK{)NL00P=~4Aupc^7oDRpFeHOUz43HtrX z?Y-@x&eRL}c^QjGZyu3rzq~@&{*!0L?#9z3vCKgX9fH50vthzDTI(LF{iy7A;9BpU z&<`V@f5%Fbfhz+u!?%vj+CDA#mOSm<`~JzA8uu5K~fd#m4ew2`fKC1g`INp_H=IbxO5ZF0`5a*F)M zAvwP4$GYxagAE~jtN6OT#ogS{FnssAoFwZmv16eR+Q!yPv1Ev>8LuwL**9khJ-%}f zIZU+U*_U1S`hM_P0<#$1YGI(1L+lp;q8Nm{besqlY(?(`j^CJxwdOL+R-s zvE)6sANGL-tkD{ZUfxSZA`zu3A`1>hbnqhfM=`PZeLmu-PeUA{sIPg5XCCskkO-yg zYji4a2M@SGgbJtx2iTwnTT zdkK*jV>OuBh0$%0qxMZJmC;K?%c0H1cY#OC;81w0vQx0&hQC-p8GOZ1o=|o4w3HLD Y;-oN#Dv^uITk}7nWaRK2jElzp0zNo`r~m)} literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining2_multiple_subrules_f1.keep-layout.retain-all-codepoint.otf new file mode 100644 index 0000000000000000000000000000000000000000..53dccf98201d273443fec9ed19e79f4aac075cff GIT binary patch literal 3808 zcmds)iC2`@6~OOf^J7s=;@Cut4g&)-Mw8hW{bClKS0ElXO}Hqal7=35P)$C)a_ro;we?8d(}07 zs5h{_Avw#G3o#@KVC)~UzAV*jN;y`X$^k@HVO^Jsit%^DHlw{2>+z{sg(dR}XSQJb z5v*UzGL_^)$}%iMFFs+}rYv)$BJMQyhkd}|+?;~K`#S)~Gj2TA#pnVc1%N*JmAbf1!v(rT!O1`4X(rca1#dLBe)Hp!av|k_y)d%yTHRwaE|~9CSfF; zM3HFnFcFbQNer1nVo3@~qe`lxYO0}Hs-t>pphl`xP^FS8RaB{_N)1(NsZvLkda5)~ zrID%>RE3O+s?=1ap(-s^>8MIiRR*duQniArl~j#gs;OE-)mp07QMI0`4ODHU8U@uT zsYXRL=uty8TB^}ejh<=@RAZ!C1=T94RzK0msa8j|da5;0t&!>!RHvjm71gP! zPD6D#ULDoxsm?%kMygj(y^`uxRIjFb4b^L@9;c(HdIQxPsX;*vN@`G1gPIyN)S#sX z9W~%=4b)(yMg=u0sZm9ZYHHL_qm~+V)TpOMTnyvFoZQmVvnv_lt$LJ#c6 zFgONpVF+A=KjHS@fWP6^e-2;aw*LqMZh0t)!0nzu9>cAUBQi3BsED4-BJ;^&@*-JA zR*_do5(@#6O$tZ}v5;zFCvM^=%_KlN$!lZ}=_CE*C^<>akPGB0d5?TR2FTyZXXH!r zE%{+u#I%TU;)qx#BuvCH5zmB_i3BDRnUFCdj~EvlA!Y)JSVqJ$B9;-cjEH4KEF)qW z5z7b(BP5KFFharz2_qzokT62R2ni!3jEG}I93$cw5yyx)M#M29juCN;h+{+?BjOnm z&xm+N#4{qE5%G+OXGAPX$_F+#=&86#wj zkTF8W2pJ<}jF2-z&ImapFN*cj~qC2ljaGxZm_0 zwjZ|MUdv~xj})|IyK@>gyK3w8#RK2I)#b?_1bQhmd zwa-*%-N^Ab@5#|JZm?H$uIs{q%k?*X_0uxe%@x9h&Xv`|EN5nOmM_z{#aFwv_C&?o zjVIh!+*j+bxc4{I9ZGHHVx0n5#a?GeO^2sFz{m32PG950uk+)c<0XP3d9`I--kOqR zOJGfZBgYR7_lhDvAG{%I@wYUzdQS!Tm)uP=-Ib0?hoySGFy3OS;havlE5SNLwQaj`A>+qc2NlPJG1ZD>F1Mg#V_yR|IDPmA zuD~ZlV?+yP%zo;bX&LKNQk*M12&Ln4&Ys2UYx{r7;bAErF+c&kp z(RRw@;G7PZGseruIQYk2;U966QKs43DuPWE>;0C7%Iikq^p@||lE{AK9)noP5PH9`bNOEEQ zdu#dh^T!3QX;XcHqo`7tuqIWAvYA~=YV-DHccte9(hsb8zwVspmhXekKV0Lw`|6H2 zAKHF>!(r2rCGQC8{JF1fI{fAt+tqJdzpK6D8r?>LpnsnLWt_`hSLdFT-@87q!^{mn zaZf9X9E=;1iKu7e*3=qddd3Rj@r}ZyRAJ(2VId!D;uXK+V|f3Ie00jq49CpYJRh|b zY@ro7rFnVVzrDmy;2YH4dkS~?(2zl--X=-3YF&j} z@|ud8iW>`CHu-BBtxdJ2ip;#?<(YF{z}islt*)>4VfG*XsQ9+yQ`?TRMvG%hQ&nT7o7+4LB8&l7y=$Aj#nn{v zT4{^fpR+4|!wexR5ZAVV7k_wbPj8p=P{Vfn_WJe)u7_VE@~o>~m%cG8O?SDbzv|4N z`N{7VHaZ$@4K`1vH`9~F@hgUXxF69&(W141b=|A|!t9+HLgT>nt8>e}UpYB{6Z@ug zc5V*@+8bZ+zF=EoPp@8;Y0T`|J4S_KTdW zuNJd&r+t@WXUoa59otX(0``{b#y(Wc^Ji`!CH z;ePq;v~wLF`8wO$w{~j(UoA3zOMNcUH<_g}xyFMx^n>qAsQ2eBFqK}?HB*8wv9|0CmMaQ@+E z@qK~K3c5m{9$6JO&7Tv2pzyQAhiCLCa+lo2Gq7sp4Oqq!Ku|VwIT=aT#P?=!Dhn~#~LF!(jDF9``p+r?NPEeF9ktc{j~f1wZgML85E zz{&?UVIz8qH-H?x10+E*q~g6G4YEfbinp00ydM-nCLRRS&?*y;g-K{x1g}E=h~7NH zZN%Hga%`g`Iuo|NjJ14hOT(VCvGqw%jEp;odB)NNd`IA010f*BcL-*tPi8X(oG_F4 z;B{<7P9Bk?x)D39vwP4;y5G+3UH>C7%LteP(}84~3bTPjFPN}*)j0= znuy0as;vWgT->rDN2JDs-M&UU-Yw2ssMu{+(FZFT2CA076-q%(DP_MiQ8 z@0ok<`Tfqh=iGa8At`y~l@d@wH^@P~v$$COVsk?Y0E`19dS2L9Qud(mZzKTuXUz4M zlx?DoQ~QSik_;FhsW9p4U=Q&+_Dgu5L9eTPx2Y-%K(QU;d;=yHK2lu7@w+fyWiVM= z(iY0?*x!QjA56NII$-x<6E5JXsMVSDWc`X4ar|A3hw980>--?lIR7NZYFq+<1t1_n z1_VJUDjQ9vR>|5jlMXX46Eh{UnG*TTQwidtRC(4A_}%WfPEC3m;O$2XhDF7Xw`X5S z6dtBe&ond30qVo}5fapR*Z$^v;F%)8ON(M13Vzh|KM@#`?3K6pzu^Pluh@}yW zE3$~yA~qkf1&A#~>}I6ZAT71iT-VxAg$!2pnu@h*TBD)WMV02?=+$Md7OUQ5QSYv; zFgMhh8+2BESxxhUAI1O!^TY-ie^~tmTkLsuU4*Bru~m2N4ZLwmZQv7 zrma+}CAC7C))1Y|jf&2wuq%8$DxQccgp1L+8`00Ad!kAI=_7yfC66lar;Mhi-VdZM zz@K>X&5W2g1SXsl_6OyHiJ7#7Ydz+^V|j?Jv zZ9M64xSY;xj+X{0w$0_K`cDN<^@k%PW7kd(Pks3Qz4!0^F2^IvoFc*6#3#GT2g#W% z(X2`tpUqTxI1kS+wR`P>-mHP*T{(9T{jprAzB46~{mnj$tFcSWIA9P{9eRFmZ~a@f z!`0?U^`!%Ua^LoT75HN4y-&#KMfcQ+D`!7DGNGH?`?1J0Y z=3r0A-ruY1FxEGf8Vkq8tZ%BKwvqPVdcO5KdOy8N-nrB(B=+3mM!JS=!##to104~2 zpUrRc`2tvi6JIwyaDD3-YzuX|j`w$mx;*5uIZ)xg@jm{fGtBq*yxAJo2hAg^j%*N9 zBP$1X27R(%9JC)YR$eba!}Oy;XJl%-4aTfzxlC z8R{E~47I zV+J~M$GWBUFApsoWX}5%XxU{9eA-dN+2f;lyWS zU3vUs6v&cq5&=krRN@iw2z~@QwgR@X1t3!@Uy7$7yKm&bIh%dtER#?p;qWB#=C`{2I}DT5NSAP)$m&RPp3 zu7U^7E_n#6-eSd^l$F45QUU5Xk2xYXGcYUlQK}Y?BV*@Zig`7x#=g9t-*PNpELO@z M;Yr{#NgD6{H??fc#Q*>R literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout-retain-gids.41,42,43.otf new file mode 100644 index 0000000000000000000000000000000000000000..66b19412b3204b0a58e96799736328eb7ad5d38c GIT binary patch literal 2008 zcmd^Ae^As_5Z~`{9LI5hC`XEl2S`Dh-uLJ6L($_7)XZQ&8q5MOIQB%~;0_cVC`(Y_ zK(RBwauZ$h3$o?PQ~A?~5M^Wx_(SeUTLn3$BjIOX9-Qqvw?vh=ZK%S|lD3!-FB&&bSLu`+wr zYD{OhgyR*BiE55C# zt#?nt;XGT?c6v zr?#ux>+Ozr50};-b!Y=i?umwoK=M?o0edQ6b?%mzZYz=(R?6{CIqs5d^(Wf>rf2>0 z{Rh_jqbt7O){)s?-;1rD7qP|FTwj0e)>VI;UvpGD)celvq5Gk<@)7y2;o_J-?b@iU z8a8Lk#d7Fy+R576`+w?d>+kCC(*{!Hi-w3_0)H5;_J7v$d8c;pjqaYoMV_iAN25cM z)3W8XCfTyT^4#7-r;hnEzVWBr@F$%b^Nn8~8932;a$Bdi{h6nCZ=P@KS$jBlXL;+9 zlC!U91Jb?abe0aUfl3=gm4rrGc@|R^z2bLZLMKQAEh(pWDg1}uJe?3Xy-&@l-Xj6->`)f2oJyOwjQQ0noa&S^9-wL(Cfxwf_L$XrVtHD92lD>jM zk`Nk6V+S`pMaUgo`v>^lfZ5FsH82}uAE z2q-A+se_NM)9G?rYx_YzdYpHmGt)C?{(^b$eD}S3zx#XZ z&6oF{Jf&#`#XV+XZ#S;#jFc}Gyno&AwUR; zNGr+7DaYEJp;#EIB12n3hPH$bJsc)H5EDAB3w-tUV=`vkqX7HwjqesBempnH>cmN)P$?ynFh3Oy#8OY%=cpOxq1p~~2IWQj< z!4h~DUVvq=0#?BqSO@FD%tl8c6LKIQil7wAp%S)04cNg6_0RwTXol_34xP{iyWut1 z!{*%&2jMUrg%fZJPQy940GHt!T!$O*9^8UK_z>>EC-8Up0=|ZC;U4htBm6{wgpvpn zNn%JWd60<6!z7MOBNCEEGN_8GsfKE)j_Rp_8mWn@lvJgnDm7JUs7gy!I;zrBm4T{^ zRAr)SB~>#5^Os`XTDplTyko2W)fH7crMO=_q{OEo&G(Nm3qYK&B4qFN=@ zs;E{?wX8=i)#|8LPqhZBHBzmK>XcNcqB=FzX{e43NJn*gsxwfXk?KrTucUev)vKvq zL-ks!XXDjVy@BeDRBxgNB{it1K}`)BYS2=HjvCl>4Afwx1`{Nhq!Etz#g}^2FBisI)@K?6=pTU=G+kXIoZFx9}V%t55Ji@j*p2*2eq9z71n=Bwp z$n#`5Sw&tZDHsAImlTmQVkI@iK|CZtT1b#|kypuH(oY7+F>;EWB^Svx@-BIw43fW* zPstbL8}j{(s2Ncc#8DCyQWWth5>UucB%(+{AxEKznjnc1qhN#t2?-JsBqT^kkdPoD zK|+Fr6bUI3QY55ENRf~tAw@!pgcJ!W67fjHBN2~8JQDFp#3K=pL_8AlNW>$NfJ6ck z2}mR$k$^-35(!8oAd!GX0unMLWJt)6kRc&MLWYD42^kVHBxFb=B9VwhA`*#6BqEWB zL?RN2NF*YWh(r<+Nk}9ik%UAN5=lrTA(4bc5)w&B$dQmEAxA=vgd7Pu5^^NuNXU_p zBcVV-frJ7H1riD*6i6tLP#~c|LV-kK&#hr9*>vhHdm{wg%Q>fK@`m|8diurLRLV?V$x?m-QXQ?^VxPj)6Hj9?>E=mHgf!} zpA^h9eyC4$zWd_AD-E~&4KuRV%@ZPpt`}>B*{R`XRh;+H~0z9@KQmUy4t#~U`<)7HMnM=iQ|Vy z`b5#64c!#A23i~2e5Zr_3!dg#o+@XR(^|7$m}oWEaxRz09p@UCQ|V9L@3>HR$#Hzc z?fC)-Q%sxYS0sLFwwBb|%D0tzU0#>RwQXyQbDNj*dflG5psk(dK5L(KzwK`M;O8f9 zox1(}S9ALv9;esg?Pv@(w{O3BG3$rfhm^;KaW%?RF2AUAV}Bzzlss~it-!~_<3tN* z&Uxag8CmPo(p)ROoBg&n+xuz!o2WovaZq9CZIvmqoZcLm|F_J85ZVR+Ew+43~IMva8;>yWO zCojD&^#~yjfoN-lUsbK$$qh{t@8@2=%DFPsp# z=1mPn&XOu&(wcN3#%^&htt;4<+nt#g%sjZ}z54Us+y3{v{&1b^>90T0a(Ks$4M)sJ zm%c4%3g^AL>Bt*r?bp6(`?l_`du$s8!ut0MP{Fx9_4S@9g?;M_IxXDLV?XIc(L?dW zauM}z+?HM|BxkJ@9^EKRNf#!c5fVl6BhV39&v2nw}UtRnU~$>rTfnH zTs+&~wcENU%f;D$`*Q8NxW(RQ+MlZUIrxV3KRv;A`S7q&q}eV_vgzE#TML>?noFCC zTQ>!2n{3T>=F04X(iPdp0b$z589g<-H^1ij#A~m6=NNb4U>zS``<82WRd-Ey?auP{ z%Al>W##htO;Ac5-+E>e4ErGn< z2^(e#F~Ruug}nHK+k5-EU56WYICeC2G;+QC8j*Kh&AQBuIT`vZwFA{>|HMyyr?|=4 zWN);4vwhj#9FAW(;%EC2I~*%o8(i13Iv~v1l_fL{CSRMk+4rT33pC?5rK@X4Fxb)b zobNgNQb%UZs#NQ<#dD6Y+L_u~w)Q~Tv5KP=M>p@S-nYHi`(2=(U*WjKx%=x_cI|TP zcJ69DRk3r&DSyz>TGQ0tQon0ckXvLBc{6R#LL5wAAXc)>nF7dMo36 z=ZF5T_Kt0xU5#DAZs$PV@5>HZIk$^Nyvy29S>q_>_*Ek(*tnhbqG zVrPHP{^bXm1uA6+sLD>+GSC^Z281fb<-sQ>@~ literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.30,31,32,33.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.30,31,32,33.otf new file mode 100644 index 0000000000000000000000000000000000000000..55f3f66554961e11877fc52ab9f46c4654f4011a GIT binary patch literal 1936 zcmZuy3rt&882)cxTuKLG^|w|Fu5-*!G?Jb%uA{_p!A=Rc=6 zr@J11d>1I83#34AD=egQM?xF`OaRC%5AWVp{N>m;7Jw8IImfQzyK;5YB~bu*7;$-p zUR@7MiFE)95%1P&)RnI^RcE0;2l3rnBo%Mpf#Fr6q zS`w$F@f&5rB9$~N3O=_xsZ}Yr0K9m0!LXqC{rv31a(+w348Q+6e)}R&5QHp6xnOrm zRsP1R{Clf5Cf|=mMRNE)v5{bdkoSF*YHY>{l(o1E!wMOlWH6 zdPu<=f`c$dJV>0AFwz2PA-`&NEmcr%5bm>YIVdcQ3ibT$Wn|a*iJs$213|CPx9r^u z$B%e^=3e$sIwx&kmGb($DO0$PGxQu_yPbBMg|WCgyGcI1l=`mlh`_efo!RR91?kZz zBlb59e%LyB@luc3)*BQ|z($ZGE9J zna@pmP{=^Q&H0y21nsY@T_odTnWa8{sf)kqDgJuK>+&!jd!XBAWl6i;<#aA%SaFa- z+gvsk>I?LR!jaMO(*wiPZ@qT$wTsU$=LCsUAo8uk4V|S!WIRhSP-zphiz$xbSaylc zWAi(*`U|%&e{`q6+3w6UahDgovJs-Nydp`Gn z6n*twGIq>8-FtHI{qjlm)XsN=JmcnPn_5 zc5_RNNB1=x){yZ#|JZ;xb8>bgm3L_QZMF@p`Cvn+G1L?^hnoZ4L0ib7Zr3$573nrk z2w7iO$E>54=eR2#yW`R+^1^WkFYi9bjCKxNhr5Sb``aV79;?sl_4-i)lV3D_<+@@Y zY72I_4u-mdog8^!4k)}g*2^AphS^Z}v#nuGz%aV9e6660tmxm$)1Q5Q>iy@=h2gV@tmJZi)YMcP^FQ* zu_pt4JA6CrJDoMwl8TN;&6{2+8L9}kl#aKY zYMW}CvK;Ap;n0}pmw=lua$Y3aV-6H%#5w9337>8o8a(ZfIK$Rpf3JI_IYMr`hw@bW zw0^Ct#c8qIS{fUho0>Yf4tG2E#JTG8hrjSg`v;ym9PNolhFuemms(DAkSv2=3Deq0hzGQA1`*yjhH1Y9C%qt)N_Cs051HS?xpFsxNSB-ax>!-h%7+5^-mE}rKAe4ec zWbxUWA+rAxu}11yB;OQS7?$6ksG5korU;Ovo+bSF+Np@E#8vnmauX|{jTV4JsgNq< zX%dMHGsK?$9tGRCJ_K7J2lA48i2CwoVt#&J+!av)iZ~ST81_fVQZZkAuamX}(h((X z>A!f{zic^V!h_dh6bZfx>cIdeD1!>nf*Pu!E-|Yh4>=RsdW_J42GM?44@GEIK_fD1 zFv1gvjEN`%=B_JlLgcH=sfcaC1T@Z$&&; z9!>&lB*y%J_e literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.41,42,43.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.41,42,43.otf new file mode 100644 index 0000000000000000000000000000000000000000..5f69d873a82f99e24ea86b320c9ecf59038c0493 GIT binary patch literal 1308 zcmZuxYfKzf6h3$M!7#f8sw`2kFn}Z_HZ9%KZLAILx|CKMga9>EYv~HZE{|m&11&UA zYk2Piwu&gFMbPm_1%xP|u_iTzRID0J8*4PA;h%qusffn)U9x>;zHoHJwj4DhZ zX&bB#fpw=JM*lkEQI}I}48ILV%>N5w9!sDKKtRm^Aw*l%DA&hq0r+5b(-_s>yS{cvBkzk}l8-+mAJ_~ULew!_VTsMO+h#J^ zOnWR&SBs~{W^d%TR%Y|YoE#%>u5!LC@TDzcqu>zvXBsM<9+%T&Z4|1u^XB?`zC;NZ z`4T}CJg3kY?F$?0WJki@TqYNn&hZLMS6BuY=aJU3B-$;>`EOm5=%A#Pr=<0H z>6Y}Y6!Tvn`;RYnoLkn7>-Eb){U#hMb|Eps4NDJ4&INiPOv=cynYAQ?zt`{eCU*on zf?cT>3i2}+Pux5v*M4z@vID34#Ga`J z`I9{pC)}3=HuS{(-3DDKb8V}^7N~y1-cGmGmC`NMG}%s*u2GAeZk2Ohl2hdKN96db zAM1Md4!MK2Ht|(ktFy)J9=Ur%PLj2k*zw@|?c*DzSUODC4ObWB?3=Tcnb?y@k5bJ< z_T`3^{+|arhP*=qY$%IfHRyf~{b{%{^kwT;z3kXK{=it8SlcW#2_~AIN3)x$xxad@ z`_0J_`N{9)tUGeX+ z8Fct3k|Ng)JEnbgeqVZE8e0dvMst1V2;=Y zl#7ZL#xzewvMOPJF9J;L0ttc!^kkK+!aXoXB%qEO-cU}f(rR=JgLmTJUz_uvJ_rZE z43=mOg)i?X;c!@~ipY#xSz34w`y=XD{5}V9RA(R#QB+qwU{^n&YakKwHe$39yA536 z1Q9Br66|1w8fb`+4R)bTMBRZA^&lXshMiD?nhl!JVg(O8kH`~=a^iP8VS6Meqg24Y z5>av}bMgN3DAl+XyG5A@%sANR8z-Q=Q~-}fc=S}1Ni9eOb3|77qVlHv&r&jS_};}u GeSZPD#C@#* literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos8/gpos_chaining3_simple_f1.keep-layout.retain-all-codepoint.otf new file mode 100644 index 0000000000000000000000000000000000000000..e7cc68d1596eecd5bafecf0aaee05aa0ed865d0a GIT binary patch literal 3744 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/fonts/gpos_chaining1_multiple_subrules_f1.otf b/test/subset/data/fonts/gpos_chaining1_multiple_subrules_f1.otf new file mode 100644 index 0000000000000000000000000000000000000000..721115e7bf1b50788e8a5e885c0a352bdee5d85b GIT binary patch literal 4772 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/fonts/gpos_chaining3_simple_f1.otf b/test/subset/data/fonts/gpos_chaining3_simple_f1.otf new file mode 100644 index 0000000000000000000000000000000000000000..b6f1863fbd1554a296f3f71f8995ff5533e91756 GIT binary patch literal 4740 zcmds*iF;HF7&uvJ1CaRvrmk7Fe8oy+L3;tF-vof^M;;fs9&7Ao9GkY{Av&R zU;R*+0SoVs2^+U#*b4F1FVxsXA$J)nXOq=#W2v6!I< zUL;!4_^1NHso=@+Ic0POvi=OxP9d!pLO?;<5K^f zMCKST_YP1${{Mm?LyTRvnPsqsd z#{piu^FWUj_VZh#t3pQ~n|6~}Lf1Yts(27G$ZTZIPzZ;~B+egzY49LC3^U2 zf55-s2l7scB))z@fF_|ZG#N#rY3Ly&M~|Q=6pdm~I?BQ-ti~Fw#X79V25iJ8tWsi? z3aivurNJsKR_U-xk5vY&GGdhptCd(y7&TUFuv&}NI;_@XwE?S*SZ%@@CDy30hD@o! z8ZFl7uttwH2COk+jR|X&SgXQXHP(_9wOFgeT0Pbpu-1sRCahCpoeJyJSf{}{vLPMT z>9Nj$bw;c+VZ9RTRamdadJWcVv7YQ#kM#zuH)6dB8lW;fyJtPzc;3x@$({P@Iz%_WExc@WwD{=idaErM8E=a`Xp=b(m z_YCwXadjL@M)Qyw8PGFm30jGsL+ep0+J<)05J35;7?mL_vLP1|PyjWfAnHahqkeP* z4WU!$9J++AqW92;=u>nP{U`c6`Umdh^It6CE_U&PlC zi3Ca{P$Gd636w~nL;@ueD3M5sL`o!5B9Rh_lt`pRA|(7yPS>+u7a(yGvd^(@>?tWCB9NoHP`&KG-+^iFz;f;shofE;=q4>(AwC+ zwfh9YLuwn>$~6>>)%*1dKI21mv!`|UJ5ENs?mW$WL$sdVRSBtTdGHtVUd*PO{G;46nPy-{5jt$Bq zz8U#U-Wq7FZ}VLUiq8v;^Mxw5inZEyNYkxmJHv4TAH{{|Rr=Fjb6u&s<~qIW^TiTK zvrPLJmnZ(+Y~5#fSei;boQD&*rrKt<$-{U&ybu+1w39k$9kjmYxNW)l-I*KbK7a0? z3y-)2*5mRVs1G)_w|sUr=k7Ddm8Yd}n=*~rTimhdNIf$$ckDBA0)HC~moJ^S;Hec) z+SzNrj};`D zOF~+k^qZ=!UCcq?}+I;- zo3l}Re2+9MQ<`~ES|-MrMdk0rC^7JyI4%7~4m-cC(2uRfwYajtQdrpe{oCS9F|30b z@b}vX?k~kiL1|2W{<4_z;R#7LXjmwvN}+=(hx2dyzG-x{@okOFNP=`;9`Ub{yYjc& zu2sInF+B$bPtWY)?6Qn~8G0#Yp_Ec4E%EIccD20PDVqK)CVVc&zIwUu>ZK#yz1G7y z9OHaxn|*uKa?k4a73KGXZ$$sgQ^dIyQ z@yE2$Y4WYX?R}dA(t?9IQp3%;?=7nE-Qt))BmJgycXtMZ2O6IBJ?mWS%C@DZS=W>- zIGx&+)>^jpXxXXqljSEX`fFZo8SwlVaElvU*BJgt9jV+wS1)_8^;~&Z=Q)4S)oN>K zZ+0KtA7qvph}(Ousi>|uxM zUN1XtWq6K6JZJS*+FYfKm^yZboc*@Z>2kp?*gSUE?|5tZ+MSYNzLZ=hEu3&={gw7N zJ1$*xoo~C~>qzZN?R&9v&)LqZ8u$ zZ(S8!-MPkGmsV>Q`ab;qhdm!NV$awndBh(_evp@KwC!itvC2a#uhP4c4OFdWSivQ5 z(RCF~Wxd?BfH=o<=|XpRUq^f2mD_W^o%7nk*52Tuo)0b--Q9f7(plJ0(z3pPab~K8 zDYS9L%~p;So@Iul!}7m+j>ssa*x?(cJAWqPVuLj zPWgKpJL|iddOpDVqtA7`(tgRxNP5XB_m%lAzA{D#W4qW+j(jaNW4|F`@$|^3e8UC-QX=%>h!(zCWarx`HK-6FS*E^5D8$8t9bFi!LmBPWS>Z+O=TaDFP zR`NorGpjb!o@px$<~Lh=mWdG^;_G*AF`XU#?%syi_Z=nmb<4{qv-_Bj$42E5?~mM) zH#7>3QTfvBPU-OuNx^X8fz5oIcR9m`+dU4!;pN(@TlVt|%er}Xc8$x$I%>ubfQx1; zy|(6>FBXa0-nsbYw_^N3aq4eHZSA3=PD{_)Po$_yZ7st)oo;8;ZjMbo;bO%09Jv@e zCtWHqCT8z`K7W&q@rFCZ72CvRL*i1#AAT)xl|R3e5f_cUD~~uo^0T~4@1O6|aGP1| z+RQjBq-FK{qMNgZT!(q)$6H4Ox9@+s70#HKB-Gw`nZNA4?CJLmc>2$J&iT*Y|9#ua zZ>!tFd2g^cDsC{}c8iSr8%yW@fhNxY?{#~5Z(X~yzQPyND?Q1^p_(@{^TO>lg0;csk&vH$c+veI=AWE*xx1gXla&ti zcT^8yZdt|B*5$SQurTZyW;`c4hlFFI%=ME)l=V&wkWh&PO_I!4(Nk1cTY;VKZO2{A z$ckTNBpg_`JR*XomNe^}$VEw_PO{bYu!-1GVJp$Lk(_SQc%D3w#ZG}}m5*ywyA^q&Bd2|o#|N!CvPPeAa*#3(WXjbAf}oo4bTa#!}Nb@BaC wk)&0V874C2iCG!46GRdW87Lr;^yc25ndAlIRXHwI<5E2?HT0j0e~$|A-%IN`X#fBK literal 0 HcmV?d00001 diff --git a/test/subset/data/tests/layout.gpos8.tests b/test/subset/data/tests/layout.gpos8.tests new file mode 100644 index 000000000..1e0579177 --- /dev/null +++ b/test/subset/data/tests/layout.gpos8.tests @@ -0,0 +1,13 @@ +FONTS: +gpos_chaining1_multiple_subrules_f1.otf +gpos_chaining2_multiple_subrules_f1.otf +gpos_chaining3_simple_f1.otf + +PROFILES: +keep-layout.txt +keep-layout-retain-gids.txt + +SUBSETS: +0123 +ABC +*