From 82afc75835364338b8db4e978ad8a0c466e41225 Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Tue, 4 Feb 2020 13:24:37 -0800 Subject: [PATCH] [subset] GPOS4 MarkBase subsetting support --- src/hb-open-type.hh | 7 + src/hb-ot-layout-gpos-table.hh | 145 +++++++++++++++++- test/subset/data/Makefile.am | 1 + test/subset/data/Makefile.sources | 1 + ..._1.keep-layout-retain-gids.41,42,43,44.otf | Bin 0 -> 2344 bytes ..._1.keep-layout-retain-gids.41,42,43,45.otf | Bin 0 -> 2352 bytes ...ors_1.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 2104 bytes ...nchors_1.keep-layout-retain-gids.41,42.otf | Bin 0 -> 1912 bytes ...keep-layout-retain-gids.41,43,44,45,46.otf | Bin 0 -> 2712 bytes ...ors_1.keep-layout-retain-gids.41,43,44.otf | Bin 0 -> 2348 bytes ...ors_1.keep-layout-retain-gids.41,43,45.otf | Bin 0 -> 2360 bytes ...nchors_1.keep-layout-retain-gids.41,43.otf | Bin 0 -> 2116 bytes ...e_anchors_1.keep-layout-retain-gids.41.otf | Bin 0 -> 1896 bytes ...ayout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3772 bytes ...iple_anchors_1.keep-layout.41,42,43,44.otf | Bin 0 -> 1640 bytes ...iple_anchors_1.keep-layout.41,42,43,45.otf | Bin 0 -> 1632 bytes ...ultiple_anchors_1.keep-layout.41,42,43.otf | Bin 0 -> 1404 bytes ...4_multiple_anchors_1.keep-layout.41,42.otf | Bin 0 -> 1208 bytes ...e_anchors_1.keep-layout.41,43,44,45,46.otf | Bin 0 -> 1992 bytes ...ultiple_anchors_1.keep-layout.41,43,44.otf | Bin 0 -> 1632 bytes ...ultiple_anchors_1.keep-layout.41,43,45.otf | Bin 0 -> 1632 bytes ...4_multiple_anchors_1.keep-layout.41,43.otf | Bin 0 -> 1400 bytes ...pos4_multiple_anchors_1.keep-layout.41.otf | Bin 0 -> 1196 bytes ...ors_1.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3772 bytes .../data/fonts/gpos4_multiple_anchors_1.otf | Bin 0 -> 4712 bytes test/subset/data/tests/layout.gpos4.tests | 18 +++ 26 files changed, 169 insertions(+), 3 deletions(-) create mode 100644 test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42,43,44.otf create mode 100644 test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42,43,45.otf create mode 100644 test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42,43.otf create mode 100644 test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42.otf create mode 100644 test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,44,45,46.otf create mode 100644 test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,44.otf create mode 100644 test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,45.otf create mode 100644 test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43.otf create mode 100644 test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41.otf create mode 100644 test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.retain-all-codepoint.otf create mode 100644 test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42,43,44.otf create mode 100644 test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42,43,45.otf create mode 100644 test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42,43.otf create mode 100644 test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42.otf create mode 100644 test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43,44,45,46.otf create mode 100644 test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43,44.otf create mode 100644 test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43,45.otf create mode 100644 test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43.otf create mode 100644 test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41.otf create mode 100644 test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.retain-all-codepoint.otf create mode 100644 test/subset/data/fonts/gpos4_multiple_anchors_1.otf create mode 100644 test/subset/data/tests/layout.gpos4.tests diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh index 725f294b7..743a736d8 100644 --- a/src/hb-open-type.hh +++ b/src/hb-open-type.hh @@ -73,6 +73,13 @@ struct IntType HB_INTERNAL static int cmp (const IntType *a, const IntType *b) { return b->cmp (*a); } + HB_INTERNAL static int cmp (const void *a, const void *b) + { + IntType *pa = (IntType *) a; + IntType *pb = (IntType *) b; + + return pb->cmp (*pa); + } template int cmp (Type2 a) const { diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh index eb4b8894b..e0459c263 100644 --- a/src/hb-ot-layout-gpos-table.hh +++ b/src/hb-ot-layout-gpos-table.hh @@ -34,6 +34,11 @@ namespace OT { +struct MarkArray; +static void Markclass_closure_and_remap_indexes (const Coverage &mark_coverage, + const MarkArray &mark_array, + const hb_set_t &glyphset, + hb_map_t* klass_mapping /* INOUT */); /* buffer **position** var allocations */ #define attach_chain() var.i16[0] /* glyph to which this attaches to, relative to current glyphs; negative for going back, positive for forward. */ @@ -465,6 +470,27 @@ struct AnchorMatrix return this+matrixZ[row * cols + col]; } + template + bool serialize (hb_serialize_context_t *c, + unsigned num_rows, + AnchorMatrix const *offset_matrix, + Iterator index_iter) + { + TRACE_SERIALIZE (this); + if (!index_iter.len ()) return_trace (false); + if (unlikely (!c->extend_min ((*this)))) return_trace (false); + + this->rows = num_rows; + for (const unsigned i : index_iter) + { + auto *offset = c->embed (offset_matrix->matrixZ[i]); + offset->serialize_copy (c, offset_matrix->matrixZ[i], offset_matrix, this); + } + + return_trace (true); + } + bool sanitize (hb_sanitize_context_t *c, unsigned int cols) const { TRACE_SANITIZE (this); @@ -478,7 +504,6 @@ struct AnchorMatrix } HBUINT16 rows; /* Number of rows */ - protected: UnsizedArrayOf> matrixZ; /* Matrix of offsets to Anchor tables-- * from beginning of AnchorMatrix table */ @@ -491,12 +516,27 @@ struct MarkRecord { friend struct MarkArray; + unsigned get_class () const { return (unsigned) klass; } bool sanitize (hb_sanitize_context_t *c, const void *base) const { TRACE_SANITIZE (this); return_trace (c->check_struct (this) && markAnchor.sanitize (c, base)); } + MarkRecord *copy (hb_serialize_context_t *c, + const void *src_base, + const void *dst_base, + const hb_map_t *klass_mapping) const + { + TRACE_SERIALIZE (this); + auto *out = c->embed (this); + if (unlikely (!out)) return_trace (nullptr); + + out->klass = klass_mapping->get (klass); + out->markAnchor.serialize_copy (c, markAnchor, src_base, dst_base); + return_trace (out); + } + protected: HBUINT16 klass; /* Class defined for this mark */ OffsetTo @@ -542,6 +582,20 @@ struct MarkArray : ArrayOf /* Array of MarkRecords--in Coverage orde return_trace (true); } + template + bool serialize (hb_serialize_context_t *c, + const hb_map_t *klass_mapping, + const void *src_base, + Iterator it) + { + TRACE_SERIALIZE (this); + if (unlikely (!c->extend_min (*this))) return_trace (false); + if (unlikely (!c->check_assign (len, it.len ()))) return_trace (false); + c->copy_all (it, src_base, this, klass_mapping); + return_trace (true); + } + bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); @@ -1514,6 +1568,29 @@ typedef AnchorMatrix BaseArray; /* base-major-- * mark-minor-- * ordered by class--zero-based. */ +static void Markclass_closure_and_remap_indexes (const Coverage &mark_coverage, + const MarkArray &mark_array, + const hb_set_t &glyphset, + hb_map_t* klass_mapping /* INOUT */) +{ + hb_set_t orig_classes; + + + hb_zip (mark_coverage, mark_array) + | hb_filter (glyphset, hb_first) + | hb_map (hb_second) + | hb_map (&MarkRecord::get_class) + | hb_sink (orig_classes) + ; + + unsigned idx = 0; + for (auto klass : orig_classes.iter ()) + { + if (klass_mapping->has (klass)) continue; + klass_mapping->set (klass, idx); + idx++; + } +} + struct MarkBasePosFormat1 { bool intersects (const hb_set_t *glyphs) const @@ -1573,8 +1650,70 @@ struct MarkBasePosFormat1 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; + + hb_map_t klass_mapping; + Markclass_closure_and_remap_indexes (this+markCoverage, this+markArray, glyphset, &klass_mapping); + + if (!klass_mapping.get_population ()) return_trace (false); + out->classCount = klass_mapping.get_population (); + + auto mark_iter = + + hb_zip (this+markCoverage, this+markArray) + | hb_filter (glyphset, hb_first) + ; + + hb_sorted_vector_t new_coverage; + + mark_iter + | hb_map (hb_first) + | hb_map (glyph_map) + | hb_sink (new_coverage) + ; + + if (!out->markCoverage.serialize (c->serializer, out) + .serialize (c->serializer, new_coverage.iter ())) + return_trace (false); + + out->markArray.serialize (c->serializer, out) + .serialize (c->serializer, &klass_mapping, &(this+markArray), + mark_iter + | hb_map (hb_second)); + + unsigned basecount = (this+baseArray).rows; + auto base_iter = + + hb_zip (this+baseCoverage, hb_range (basecount)) + | hb_filter (glyphset, hb_first) + ; + + new_coverage.reset (); + + base_iter + | hb_map (hb_first) + | hb_map (glyph_map) + | hb_sink (new_coverage) + ; + + if (!out->baseCoverage.serialize (c->serializer, out) + .serialize (c->serializer, new_coverage.iter ())) + return_trace (false); + + hb_sorted_vector_t base_indexes; + for (const unsigned row : + base_iter + | hb_map (hb_second)) + { + + hb_range ((unsigned) classCount) + | hb_filter (klass_mapping) + | hb_map ([&] (const unsigned col) { return row * (unsigned) classCount + col; }) + | hb_sink (base_indexes) + ; + } + out->baseArray.serialize (c->serializer, out) + .serialize (c->serializer, base_iter.len (), &(this+baseArray), base_indexes.iter ()); + + 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 4a5bb3064..81aee9579 100644 --- a/test/subset/data/Makefile.am +++ b/test/subset/data/Makefile.am @@ -16,6 +16,7 @@ EXTRA_DIST += \ expected/layout.gpos \ expected/layout.gpos2 \ expected/layout.gpos3 \ + expected/layout.gpos4 \ expected/layout.gsub6 \ expected/cmap \ expected/cmap14 \ diff --git a/test/subset/data/Makefile.sources b/test/subset/data/Makefile.sources index d642db89d..b5b4a1f37 100644 --- a/test/subset/data/Makefile.sources +++ b/test/subset/data/Makefile.sources @@ -8,6 +8,7 @@ TESTS = \ tests/layout.gpos.tests \ tests/layout.gpos2.tests \ tests/layout.gpos3.tests \ + tests/layout.gpos4.tests \ tests/layout.gsub6.tests \ tests/cmap.tests \ tests/cmap14.tests \ diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42,43,44.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42,43,44.otf new file mode 100644 index 0000000000000000000000000000000000000000..1c2e5a4622a044448605628032c0c1b53960353c GIT binary patch literal 2344 zcmd^Bdr(y86+d@jm&>w(MwS{yTo9_%*WTwYnrK!Q(lkwRKsz+F!WPzV!F>R`AXqdC zERTKg+^T>g8#c};7*h*08QZ3fG%-m#ZIV8wtz(@`Z93CVCe7I1CD#l+cgakgPXFtl z{l2;9@jK@`=YHq==AK)2@L(Be;S?l+p}4fv@VDY0Z2^Ee0JZMP17#KW{`&V10qFCH zg~}>+vCf|#`W`^acGPQXUA9K3qM~S5^aBpNt?rfg-FtBDPf!;f2&}%ZK{TK- zwWY64>PCAUfJ%4S+8Uwc0GePHAC24QveOH>JJ3Ib`c$LG>s!7EEXMCZ-GC_oN^m74 ztAL^?O;wjQFu`tk9G-w; zD21ost562za0n`)3J!w}>VQB4xS$cd&r?fv_TBO@uWQwuo>>!ZC!ykR0K7!U=>E31=dlnQ%pfHxiy9JWF`Y z$P->5yhwNx;mw3EB7%_!3=vo&a74ft5{MuY!9)Zz5sHXtBqBpZmWUh?c_QNbibOOK z(Om3lY;Ue74xeFbZJ~iR8d-y-&hu@%p`zXEv%9>8r`)xk=0;Dm&1bLMX|On*hH}N- zYbdvS?ai$SuAD3$ZErD@;7O;@soFH%s`QN2YaUsfsn7btx<}V<$ljQ<$&j13IlthG zTecQ{Y1{T4J9ilwmg5D{WG>ph=ds84?t8+rzt~z*`t*TA&*p3Mwdw!s$kiIO>ABim zh2$w@vo^gswp0+4dt;LI+-ouUOiUwPi#@m*doT8tSjvCe=+AAbGupdpGdkVfA>Asx zo~etO397%n7Szh6?1N?MplY3J8d;0;F)N+UisVL>)|^?znl8uujtsd;Egl$lke3m*j|3- zmonG9?}cLvKe*}t#YbcR==nJC(nxULaYm*>vT8_%<8&Yt42IS>&mL~NV5j5TJ{9z7 z@y$zH^(1`cyN)h-`_T${;}LniL(Y0lE|zj_lJQ&825ITh40SGs#()s`H-xhExhdhc<_Tr_gG*o zLdOf_SM_Nh#{Z>%YwXRAxBKbn^PzBbleeMG-eMQ!!o6}~n`{|8ve0|>>ZDZk8>!%q zly`M8cI)P~sp%7!kM`64Z$8^qwZR(x@_5Pd+7lC%bE9-z{B)N-O`2aa>$$UeTe^jS z?{rh7CDJwU#^0b8^m~>tmhM-?SO6|);rUy)Uij@pWx^bnr>kgSGG*!!7}CV>-dL>_EKJXB*-Y5^zs zpdK+N*b%XT8*0IU9?j@ejqR-*agy+}A@+6D6iYpNxY4>Z5mTjP!1u~Tu0_s6G8m92 z<5X~~vLmo0sG%<+cX7ja0O{6%>5hhfmI*? literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42,43,45.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42,43,45.otf new file mode 100644 index 0000000000000000000000000000000000000000..2fed45d31783595e44f0c0a9fb3e24780779e5e4 GIT binary patch literal 2352 zcmd@WYfx0z`MV3dT$YuU$Wo(G7nD{a(Y=qo%lZuRu$ovL6r(j&x3GQ-^4>&KpnSbN5RgI#{M=6z!DEl1v}U9 ze#eS+-$#0RUZoUYk(z|;P{#2W#~HlJ2PtO^*0 z(UjCxR5U2m+K3(^2bqXX6|u!c7RJg+x|pRw==S;Mpe}9+z^|s~4a=IZZqIB{M^5Oc zW>!5C@g%_(+KQ4_Lmb3I0?Y$FB*6kmfk)vnSO#g34l7|5tOgE5u)tc_08c^=g|QW$ zh5{&rBG?1_U_aQP1Q5!g0;<6Y_0RxK@N+m0Ezkx&=z<>Th0`zqgAj!C@B&<*q{rb3 zT!R}h0XN~dFbS_ST1Jl?@+hE)W|Yu^S!hMhgdB$)kDP#kgg#oTEuv^(v! z^(34-UOHb-F67g3$FcF+1l_zu{rsdy79<-|zPIqvMT;L>vUHg-HEsEd^zZ**Wya&H zGM`wz#>DZ0XqGHl*0t-_Z`io$$?VNJxq10d?I_y4Z-sV+Ht~NQsam5pF;$zYfHc}J zRl8i9SR0y256PZTIQPtJA-ON436F>F-wM4K+7^oYPaXT6E`C&dFJV-tyXV)(YVz+_XFU-`yK7dwoJ?dyjNE z+v`r z?b2lE&aLs_`Q{6U+u4?9e|%!!;@r+34&*f!HwX4yJ;g?(uh&p6`Wd}pZ(v{OnI3t= z$YJ@^ROVZoj&}dOo$cxE>h4|^3=RbXXHRYG-qy0+Q+B+lxOuBzQVXrgkYW>iJ(NQ48_nChS$Tu@4~aHA9V^|0dEX&W6p=Xq0T`ljIJ3OzUB2VW_qD J5p=`Fe*+a5RUQBU literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42,43.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42,43.otf new file mode 100644 index 0000000000000000000000000000000000000000..00076157a5f332b4aed08550620dc0010493fc0b GIT binary patch literal 2104 zcmd^Adu)_N5dVGG>-Bm)T7h1b^12qPtsva@yq5R1rHH5{Kur;)p6xM5>HDtG5>S-# z>a|c6!Gb_5ClM)@C{zqaR2r?XXf$dxgb+2Fm}roocjbfB`L0BX@jw4`H#TUZ_8;O}fcR`cuvdGV z>QK0tRp{Yisqt3(tbG}GF?*WjuDaSlaOe;u_Wu&gP7VPS@=BOZ5Cp+e(O6yGY;ZH8 zDTuBVqGhINSzPosvp&)uH=zr=LZM-5PZ$rpa%DufZn^s2;DY#QbISR_F{7dzM`Av^ z;={)y0f|V$2&7;nMk5VlFb)%ui7aGe3Z_AX0yk!0Hs+xKMOcV?QH&)hK`B;XCA_Er zp%T@oLjY^hj171kPhtzUBZQrJ3cIlv`)~kVIE*7W%7^a7t2l+zID@zFj$jrNNhFD6 zQb;9@+>}dsB)UixNt8&GNmNKwNz_PmlbB0l9!V~ec#TAoOp-#9N|HvBo1|Ql@7|Uq{^i7hE!5D zQr)EHlA1@Fi!_lmi8Prsg*4u;Mw+{zwywEhHTi?i?D8C^D)Subm5j5xys! z@K2rfZ(ZUs+r^|~cKgK+`v`uMiT$ZD>Nr0-_Ne)-3<=AGJ&y4*1L#dUqJpWE`urOw~BUT!_{bm)|Sk1n+7rVbtJ zt*vdLP+NLK&&v7(K5KN!b=8p+oiv#3p!QYI`Zw!S*DTe?uhP@~dfK~sK_tT)aXlOv z8+mF`B&Fh;HQQ%&)_2gxz!S8gwz#>fPHy^tZ%Bt_zuQ|^4M{+(t zrJH)(bMz8Dz9;8s&E;J`?QZF8?c8mRX6a`gNxw$_aD3SL!G@1^Si4_nYww;IsBH2z z`ZPUfj-Jz`dv>kr+qU=k!ARbhk*o`m%;WvxfpfiGhc_Nwv%|XOp$9jw7+ctW_rCe- z%Qx;XJ^73^s$HMXXW1TdaA^~`lJI!+=!%cZQfB=QA^tog*pPK%lQDl=)^r4ELp#lq z=`|MPU@}mySm%YQ!`%Ou8aXh!k-x-#&ci?~E8X!kV_Cg9G5Ihh_6r?cR_($S;R>!o zip^l2IlyGI#988#OeQlgGw$TC<|)jd&n4D_g5ekjy*O7G8X7X9vgF}zGz;$M`w`5E zyxzs~FmFOKOT&EJO}P0cJ|3x?9DcTF zV4E`j3YIWVF*`3~53potRpLn8!zfgoeUUikx!X$3|E mjyj5II&Nnwa5RD6ya)L_8#xv*fFBvLu${nP+#aS)c==DE8RuaD literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,42.otf new file mode 100644 index 0000000000000000000000000000000000000000..8eb6ace1982a6bbd89ebc84d7d4cce4c43959538 GIT binary patch literal 1912 zcmd^AeNa?Y6#wlf%d&tdkmA>ZQjm)KzIMUyWf3zo7|@2s5!_%sE3zyssL)th`9Uly zHe{h;IBm`t6po46*kq%OIZaNDHZ?X(<223muQ@oo_-yFB#VM!hzy9pJx#ynqJLjHr z@44@tSGHk88LZd?1MHsCQu}dF+gSkT0K=^{npy#b%)eD)$1*$4ei!IsvE_aJiqr&zah3c$lFVbnvX)0yjb1On}vv?P{_ z*k)aAHAk-s( zCbVED+OZq2;5F<+2f{dnBj~}~IEFs-<9(dMX+HE2&SDrBa1mc<=OKYal1L_noaCZH zDk8x_f>ybnStOY=$|Nf!J4tqtTu5>eDGpKuQbbZDQg}lODNa&cq!f}; zL{0}e1#*hyl*lQQllSZN1e@AJ+sNN)&#TS1iw=iqch?19@YyTdTUvdA7W>-9+F+I&@ch6a0u=H6nj@U{3tI~kn3PrlFtZg{vJ36?}_k}WwUbxPXQY3Ui6k4>ME zHFMVNIdkpVIrHY{KK?{r{*wz9E-F~;5JX8-qq>EY(*KuhHHcS%YnV8~b+{I<%1P7GcvT-QOfmF{Bf4&Gdp6yeZVdM! z#%Hk15}>!54Q5l4UT@@O+MWDG?vmow+ydPwp3I@~+beYw6BAli*4+GPWX7|6KRRO~ zuXnIMDeIBK+N5lF1UEh+n~;tb4}HvWoVck5xvk2m;Rd?{4QRzS#v0&b#EVAM!p|Nd z_Nn1kUBNiT{k)7l$C_r@#vYAqEr`d|YZ-W7={#F`mSKdQXCprvUaXx6?l{+UXn#Vc gS#dsD6*tSpJlq^3P808H|Eqr?ErOLJq)giW1Z&o;jQ{`u literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,44,45,46.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,44,45,46.otf new file mode 100644 index 0000000000000000000000000000000000000000..73315f3ed5395d3f6eca3e95836e963e5cb3927a GIT binary patch literal 2712 zcmd^BX;4(z6+W+l=FuRyHE~?9MR6pecE8@h9YI`Xj0VNgAyHarZ?iNFbc3wQ*7Qy{ z%OKE#jr3SiFd79$W6DVs_e{;2q>`~5%bG1ICp9r9ubIabISmxT6^Wh5&@GZ`rkT_viUv=>SADVxFD5S1|>@&$t9Y zH=>@Et=AO6F9bIM!gxJLr`6n&i(tzxG{GPaVWCE^rAHR6K>trs_Z1n8riqilVEivpmjIye7W@)|1wc`hFsD?n zui&NCfhY)QsK6mX;80LtPB1qkA}GcOZii!vMuaW^_~o-{eVp){TVq>70@kPpW2%_} z=M312p>Xjb5DH-s4$~kCX22|nhL>PIEQDBygJrNBR)P!^poZ134mLsxq`@|L6?Q^8 zWWYYigae>~93YSfdME-TltBel!!f7_Gg!d^&Cmkva2&d!2Yk>Er{N4P`aE2OVYm!e z;Trr7M&UNxqoz?aiHtBrP838*R76b@NfMDsiA+Xh43Wu+OhIHyB2y8Wn#dA~EQv5u z!r(UyVdR8S5JpKD6=BqbNhC}XkxPkOM&uY$PUH$AR}#63$kjxiNaRUGAteeKQ7}Y- z85KmKBnlN#sEHzxD3XX$N|Z99WQbBulsF+JQL2biO_Yg5nM71lqLL96LsW92QVX)Na*56)S(Y6yVWd(Xl~l&a6-t#lF=_Rhwd>Yz*qFR2C3SP!E3f`^Z)Vm~ z(Na<5|Jq_ji!ey6Xt4;%5}w3~A{UD!qR0~eSe&1;_}SFX>wd1oFJ#aA$8Y#Q^l$fv z{?JB$Zwng`JqjO)hoSbFg zR+~50anpTV5xeXlU3=kD>&1C3ZOv}?!uM`pJnMSue9JRp8EJgHpViAR8#@b~hSp>D z28+3|%2s7P+Ca0B`^8Vv&T{r@$)EEge|?tx_BwSUk2&Ok9WG&^2%g z`MbFVhq<{rF8Vr`!YQ*p^q=sGL9NTUU1#dq|D3j#L{eii>-{zQ;zh!XA3S zbGBjNyHqsi<;KNtkFxO}40D1(^?ELY3mJ?*Q~1>VMSEkHy{nxL#Bpzn!~Y)mxA^?kVIexB}P5J{H_mGV}H|oE0-;&66&EKw{!9{X~m(r&6NZZB;wYcq8oX=!L{ zY;V$37ZjJJ7bFgGF`wr8>-(!tJ3n)oo8G@d-@e$yhBVx?^&jo4?`t?&(OvCrY^`_K zH#d8*w~TyJ_SpKF`DA5VjkT`5w(Y2sJ~j?wm(68wwjZ~2+S?o6tmxFX82XoFt>7ZO zi@P_ml8+yr9qh9WxAt0kn@_aT1MEJrE3-Z`@31~sb-!V#_Qpr-{P#_5);4pi*;U{! zaOr7w_qYeoBWf&4yx*JYf31aEcPgK2dyw$XhAQ_H8{N{*UrL{^*Xupew%xtmyu*@L zpOIa&&9v^<87H$l%lBU>zfyU*@^aPL+H=PTT>orwu<4e&wEcV&cH1dSzx7n-waSyd z*F0WJXMJ0DhvU={FP)+myK>z+kIq_dsWLZ~mzEwWE30wVII5j{Z|2_W`NZSvKJiA6 zuhr-6vko==s{B$7ZMWI%c3Vwzb-ksGW;4dG;=HX6aX3~PYHFzW{5I!c)Y^Xm74iTP zsE)f(%k#e+EI$p=6V1Vl0P7$Y4grq>ggl@UrlkL0`g{*~KGktAa6iLFk>8oL_JypO z+~F5DDHQ}^qm&0ra0K;?dIsMBGsyvElmG-GVURE+Tp$RZiue7;$*G$*V>wQSw5c3C zeYAm^n3&+RqLz%EZ$kJ9o)r}whS{a4Pssv^L~TkAdI1l9K@Nf0u>LzA;UrG5z#Fi{ zE8rj&`%)+X6XYUR09r&ePzc$eLyr>lIf&1Obi~P|p9ZnLsPUFu^e9B@%E_1lJ_F8c zHgXa2wGfQY4u0Ojhzs}?@@qn#GRddzDFP6|lSyBm^S6;-@$->_avF{lj62yTPVn!k z|I+yEB8Y(mpb9jmLZC4-Hq6FbD3jJ`LhSkf5j<(75TS4e(U^BW=HY7;|1{#gD4YWy pVJ1p*kjEfjg5wT+j`S{kf%G1HiS$1F6{!&8Q22!EKw1dC{{S}{1*HH0 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,44.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,44.otf new file mode 100644 index 0000000000000000000000000000000000000000..4005a0d77cf504b194899df1ba038c9fc89c508d GIT binary patch literal 2348 zcmd@WYfx0@_1uMBF3T!DSZYvlL1?7D_C9w}qrnA|G)YN8GqkqC7S?aUeE_>4STxF; zeZT@+6^O`|jWY%;)&fn&Ow$TYOwvx9q>pK9t&>TbADzjh4((lX&Cqj~q;Wd^*PlIi zzVrURbH4L^^PO9A=uio0;S3~z!BSjo_;cp83IJvR)bwM|l$5>i|C<|tzJ|J!C1tx= z$1e{55Flv>%9T}4YaLux&7)nBtL-*x^~>+M_Tt=EP!{c|ShJ|PiT*UoId-SFdEHMF zI?%odK&^9Ho9m$H88pEZ4vov|w9#`}JJCOY@_3!w<6XW4EUq6y*#LmPMK}`@RX|ac zrn=GTY*Dy9u~djvP_ar?tTG|CAyHndOUN9De!qVO>ykDD{9tiaMAm%r+R|g{*y+^U zONMo^wzW`A4Mb^!xCm|zb)0*`_Pis1=( z3QC|94nsK{fumrBY9LSxPN)M9G(iir!gJ6DozMe*=z{?W!+98ii!croa2c-Prl;XL z%)(1>1AYQOg9R#y(h-KRgd;o=h)7JtO!5h1Bn(3smM|P)c)|#T5eZ`=jF~X`gf$Wt z=dgt32+I>zAgoAO6JgDS%_p3Za17yaNse$l;RM2ogfkJ&Ot^f)8wt-4o+Ug+o^%qOtWD9aTAjLP?Yi}8`t&btcqn7zrp=jK3|ZM*b8^4@@V30K zY~QhS*KQ-ja=aj#%=vrv?t5hafkz7tS_+GbpM2`;&*o@zw5$JD$kG~ckt}Vt7SUGi z>W1i2ZdC4$N`)70M&)x+jWiv-KOcQJ`qgOCf7<9TY{`?_yD5`8-QAFG6<*Ecg|s-< z-(C-Dm1o%Y{2H#_!j<(&1Ur++1L4F_I0 zG56#7&R>2!{P(VVzH5X2S^GJe3dpLE3@2${!0!)aG)x_>zi6Xl+dmcbDY30f+w>%O z?0fchdB^cGdGj$j!!D=alr2)0RWg2C+9(Y?DWz8b;dsxU;rb9clrZH+cj&f72NHOmG4$L6}vUmcV3e=FtQk+QEYL~qSc zk58Psa=e%B{MI+yk8CUqK0Z=(vg*`m`OFX<6F=RpPmyMq%zEy8_QM^5&wI8$+!$^e z@?JPG&_2`=?y|Nz>YGX(<{3Hj{hDao#CIeJ-Tw35iPMp`Nc*Lh zk=D_U!M6UkzP=EC19N|Adavh$&PykUPW7A(pBXwGpr5-B`e1L+*XKLmeZd!Qf1%}q zZNNQ|Q@K;tjcy$|C>j2A=f$Z=@9f}M_gLTagY=|St`8n*J5qbhStGvHK67UNH`1oJ zy+b`ior9f0N53QJq@}X^Av}*Bzdi-;iSihN_oK+Yiqw7o07`uuHPD)S?TkYISkZhL z(wF-ZS=EnFOaSF&M^N9Ul=u4o8a}UqLgUrIIwmh*Np8h05%u19bswxzA*hlUs1UXa z9koa;!Y9DSDIkv=fJ&=L(5O>XszjWooXx+XpzvT3wv7TPT#2FJy9cP{cxs6m|r zY^bq<3#!159u4SIf$gmn^(5|RMcuO~DV7@aaG`Zqd`*=S0rN^jsztgF60tohc_*S? zrR-4I6H-f@eo+SOV literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,45.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41,43,45.otf new file mode 100644 index 0000000000000000000000000000000000000000..c9f261ce9d72d8dbd9b40eca89b9b49b910ec1b8 GIT binary patch literal 2360 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 literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.41.otf new file mode 100644 index 0000000000000000000000000000000000000000..f50cc90bc860508a22ecb4021252f767f4d23649 GIT binary patch literal 1896 zcmd^AZA?>V6n<`7N+|_Ifhm3!lnth0?^g@>$%i=S90qh@af%((QxPb%_`%{fHxU^{ z#f7<{(_z+`IG7qI&IJ<}CC)7SiY8mOki{%Zwx7ndQy9vERSEibnpo<8gZZ~-uWxpHkq6{f)k#8)#nsiJD3)bRQGGeF!g zj5pUdx|^{Y+*M0nB(;~ps&e-W?V$zuT6ZRirJlEUUx-0RLfn%921A?W| zy{j1|YuSWBp5`WZqsMYFYXPfIFz#>m1zIQGfyDU>7~44oP{KQ5GC&XnbKUmF#x`9m ziliX&oDkV)h-@@Qrkb==n{ie@4h4fTX^Wo;oEb|xshRIxA72?4@uiH88z)BssVL=8 zeE2xTBLRs>LJCqb1sQzs8JLZ1gYHYwJxKRf} zJsQ!B0Cu1ayYVt!#XfW*h=VwcUc8B;IF5e2i&Hqwhdzt*7{VnC;}5||B1t5ZLMl1Q zMFmtyqJu<{M2SS1M1@3^L??+Z5(`KyB*{S%?~zE7Nm58sNph0pBB_9+LXsUMizIVM znPi1zm1HN$E|LpKE+oZ4ib#q?3TISEQAu%<;v%JhltNM+q>7|Uq{^i71F57sNp+E0 zKx!d59pn_rDUnkqr$SD()YshR-%8$Adv0x>U2-@idvTrbd5^uSEzs&|4A@sS)%yI+ zKEJ!wQh1x1r6=I=?_e@^m3)``m!pKQHr|q8O|&H?r%XznJS8nX&GNS`VZeGjalmG~-D6AQ zw=ZENEh^JTr@*McbDfwFOc%y8(z{>l?&`{HKhWOOG3#h~S@w-hH=hmHe>$vLdUqZS zbZ&o1ORM&3wtb$iH61MU?Y#KWwS8aQ>HD?gZr8cjgG1gUn$WEodNjOX>FN#!yEFZRn_7;0ERlJ?tLcf6 zIpewMbYROH-o4uVZB^RLEn22m%ebnQhO^vZ$HwsV@Zr_rl)CS>br$ut^w5ieS7^7d zt)=C}ozKDa9K@B(5?Px$NwldcM4>N8wp%z~D@Uu@1x8_RbDeC8D z?ioh9Wh;9$u{A#$)1YVI=St(%%Buns?7W)zr}M@7i5^HDL;v#em=Tq+suZ&xo5mPB S@wWbb`j??cuyTatnC(xa0I8Dz literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout-retain-gids.retain-all-codepoint.otf new file mode 100644 index 0000000000000000000000000000000000000000..d4f9fc081b8747ed521a8110364a07248cb09a97 GIT binary patch literal 3772 zcmds)iC2?X7QpWdiyw<(TSHs18UlgDYD@OSx@+y~=xD84XT%invF{)tK@165NJs+6 z7En;yQw7CQv@WAPE_HWm>rAUt#&$eyZKun$j_n8Y(c|0)?M%;{`3vT~^WFFEeed_y zOL%wLOD`>haHxhLkStoVMDpR4-6{YW00_VG%<^R`@3j2=5r7H!!OmqXpHyYLS6u^$ zd;|3jDLJNmh#|=U(bFM@m}Z_>~BRqK0T+nY<}^qR%}0l z`lTFGSw5sL$13#U7n*CzN#hR3&cyLJ)VuQYii+>=09?=bA=D)}1wbkQfnX63LPAqZ za&pR9ZO%{>3{{b#Eux_45_@N0}pdC7)3wFWlup9T? z4+r279D(C-5>CNcI1iWLDqMr>@IKsxLHG!6!>8~$d1wUKI)s76UO zDyqR5HB_Ue8XeW>sm4GxMygGsS|!!0s8&t2xF9Xn>Zn#vwFas+Qe6_&DXC6Hb!w{9 zP#vyUM|FCtGfXWEmN%bnKS5v))>a|pl+tE|Kf$ELakVFkiYEV&wni@3Jprr;K zHQ;Uy)L^8>Bx+Prqly~U)Tp6GEj8+>QBRF{7{*0;`Q?QfG`(0NPfXpcvhv3Tn_LJkWsd&;i}(3cau& z-QXC!g)VRr{(#qi1O9?ne+Rz8YySZRyz&qdj@LbjJc?HxN91HCQ4u|vO%{+PakPGB0d5?TR2FYK^XXH!r zE%|q8LdFOgBV>$7U_=5V5*U%d zhy+F?Fd~5w35-Z!L;@oc8Ij0{L`EbsB9Re^j7VfeA|nzRk;n)+Bjk*bGeXV?IV0qZ zkTXKg2stCuVR^`?q&mn>wBCUbowWxy{+?Y(~O7B8VgSMZ*fQTgdVYStz}xQ}vz!7oTn8GhKXE z^*&RbbtA{${852D;o=z7T_%ywos=lHUHTYa_LYEM+Y z-FU)%#eKE@ihF-U-J$emF4if4RpNDa)^vJ00(>mra{3w{cAcN_EH4$3QdXPS6|5;s zF$dNRG;;j#NS`?3&d?2UtG~6O&3h`qzvyn7<*ss6In0*z!bG#FhI2aIt{CUIoJwEH zKKuFFi}qt1Zp{}!m~7lMzarr?lewhETE4B+gI^rKdGgi^U(fBgyB!|8r=uaz)ZTLALe>wn4<;QG##xe5xcs8djr|SW(2S8A zcmkgcj}tGPIp@izr)RBCO?9sHZ1!2(tRJNE(Sh%_Ig_2qt_@=+=sx1X%=!IwZr`+l zM%yWqgL67u&KNHrwFY+W zKiScJ{PKy5CoaArbqgZ9Kr|NN;i|PexS^>+o;YG)I9lw+<8V#3daS|0;ZnZ^x0 z{-ahLF%&l}7gNv1ZRs__jI5QyV;hCZ=|c2rVG$o|;*);M$MF6a_^8yIS&mt41wLvn z+Da?)$_om%e|w3K=0iKVUf-UY-k+x8gn%$2e(Nl+c<+!P>eJ5^RtX_}iru+)y?2_d zZLYQ^Zb&A)C64%J=m+towu_aQom}@$x2JnrQD#|MNt#Yj%oP-6!UFHc!}gZF+j--k zc-bvpy7z3)g){wKyUe?@oSf}9uhguIS?qbX{ppIIoNq|?s6O*Y ze#*PWjgCfJgUyre&GzJQ{K^p@-bd7Mlz44mUC(O2FlT3$&^S2b>b%X~ubiB}iT$Q@ zb!`s>IvSt%K5tuU&$O&cF+W#4=h&(pDXnE|_m>^5I8t$B^PcLxExn$9`0Mx;_KTdW zzZSD|r+t@WXY0v|9otX(0`^u*V|#Pm&P@SskzVY{@TU9H9cA{-Hfvc)$)?g$v)f!( z>3;d`jB}kI`MTOWwsm$jbOpK{1GT>^J80%yPV{)ExxUh3FXi}EBgb*wjyiD!{#3FD zEj*kVwmdm%_V@T-eh@8CDcfJo%0DNUy$;d$>w{IIgQy09h*|OJI!I>xe`MSY?mz4- zmKWHrpgZKL(NkgD{5cU2g`Fine4|H_d*mLzfmNd=U>$1!qVUk5(2xj`C>RlTrvFY0 z7B74n-|GZY#^zx1<9X!%{rhZI)D~c7DHMK%=Szaaux}FTV|5WsKy9oZ^b33NFX|yM z3FiLPCv?5t{+mH3`dbEHw}e5-fu;GkXf#5#Yv{#1F%+Q8{H)j@d^0q0Zu+ z(R9Cq#aI6$v7X^D6=nd*HWlXrhqGY9(OC;APAe)#+s~u2HLyB|UnE9OA|#(hNk-!& z)*`}FUO3w8LDX10ITg!z{4T&}C@+G zeL$fd@=&CsnkYD(12&_Hi!jB<;?zB|%{XJ`{AXF5!QJA;bmz8gGt0g&-|suW-#Pc3 z^WB^KWo_G*1rn$M0nqC=ZlrHWo>T+C0DxfYrtGZT2fE*k0HQmnd9rdBEA-d5e*z%X zBi~hE(3HX~LW6#uXX_YE;o1AfRp=KYSL#rhJ|^Ced^7SioxxT?EfqMBuSPC2XevrU zl#M3z;}RP+28J3+S&07Y$a_jnR$Jrx1#_w8Lnn$Ne~;Feg{9^Eta*>K%gk2?OS zf9yKl>K@d!afF8>eH`qiTpqXElVs`NX+F$Q;g_E+lS{+%#^=km-l7k6c5cD$Ty9Pg zm!#toFLLYI6b+mC9y^O|d6SJV{9(6qWrx|Pt+pP}R+%cz=I%#V*+f=+nCkPLu=h=t zqPQ+@LVjU{&A2tlk^RfpaN9Xif5vg+rKUhYL5o7Qa6ww{fMhk$Hhy`MilqC7vgYW5|p;EuL z0oH*E)Ug^o-djsVA`!kSG8ImKh+!-CM+oEa`Ap<7n}lh|Vz%HpUHF_Wf&^GI86%GB zS||k*SYavTg8|Aw4>l-9O%Dtz8Zbfu=rF>9G5PQcU1lW#zV9AI`7V{e5&sTvo7Iie$Sh`%HMXYd&% zkPHie&}(c)ps)%KtigK-8)LPh7R!p4YSc@hLVyfAB(bUjZN6u|JN`x?aq>9{n2u`{ eenq?j4^fq%l88?bPzY^^M(9DTfD?$dFz^>m*!NKY literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42,43,45.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42,43,45.otf new file mode 100644 index 0000000000000000000000000000000000000000..e6c891b2e7a23a1e833d2c803f8dc148fa2ca447 GIT binary patch literal 1632 zcmZux4NOy46h80uhexTR8zl=)eV`<=F=b3^{1^H0XK@%1r*jj#wzT}Tg|=>UC0iEf*k18zx^oLUv+TaybI^ z-mTOr%AtgoV4Pr;R;^H-`%%9F_l6M5wMfhu7r%@7D-qAv>dY2qv7jDt8e*wVVJQdE z7IdK>r&zDhshQ!#moR<_aiH8_GKY^qI@TXS%mQGp2!H}14HQL*Rh2qj4e^$TVj(n_ z3bAyE6@;D>@-wA^IRWsxT$5HBH5=fA@o7E0_`%hQ^&)O<>=;+{43{+%#1tirl1$rD zpph@p$mJUOQjL6BrlGvXSgg^S*#*iJHa#sZoy|}g-d3~uH72uKXJR+%l?G$E!Kg5+ zRSVgSvNAT0q?_10wMlKPLUK|Yin9qogj!=}$P(sD=1Zn0N?2kNiAf@6o@BZ)IFTIW zZ9y)p{c@0R3yQhH;KM7yTft4isQ<>8e`C>ok~=YdQt2I^bQ(4oJrWnOvax4Dgl`D! z5T>@$QhMglM7+%Ha66p|^`3fPT%v+YdyAXJHNVQms=h0=FYl=EX{@IAG_n_=hks}A^=5umZzzx}2 zbo>2>TQ+$&HEgz(>?=@OH=0*{TyR9$ZrO3ta<2Al?b$si_6{8C^ZeQD;___Q80TOk zK8{}7QG0Luh1w(C7kqwO`@WXWHdk-8pUGS*^AvlvKCRti+tW~QsjRH7sOmQ!}5= zDU4nD7f_-xWS}njo-QFK7L4zXmT@02@5@<6_Kiu zyeUHg9X&$%@YYJHacUeMKzd{a^w9&LC1QbC6hqTO+(9%w85vpYvSBS`K=$Mr#NJs$ zg~MTTDxwU0$PmM8sE-mx<9_m8ne=Ixj%d;sJjDy2@PCQec>duj@?Ze)ZHlW*n!43aH@ zIgkoenZm3G1{L7IQ%Qs}t4(I)9{(qVktl@>1yWQ^!Sh&`C>3CYtYi{3q?;LtM&T#4 T*Wnjr#khw86||wXz=?kVnT_#M literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42,43.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42,43.otf new file mode 100644 index 0000000000000000000000000000000000000000..127f798f3666520c79b23c440e620895282224b6 GIT binary patch literal 1404 zcmZux4NO~A6h8O$hezpPo0J%E@BlF*;)V!a+z4AOW9otsV20@&tMt(V{i7|eEHG#I zZ_B8PC}Ts=YO(=B6i_phnL#E_jb_ss4OxgLniyl|g1)lLQqOHMPUF3~=bZ05=bdxz zZSO6sswx8&oB$aJ`jQgi+J4dx05bsG@qOiGl|L5$QUIV(Bj+fq+@5Fo{J=DT>@?yd zwN`@zQb-MeoZ)h_XfS^GgKZc3^AT&!NNikDK9AUg_+GQs?cwveYQz@ADyzZc0C_o@ zFo8>HGgw7_F8u-YuOS|F*j?`M>yU@}e?=@{2{Zu+$T=W{D2>flYYVe>h7ur@N6@>JlEa)!Lm7yVKwnjoSpB#UfO& zaFW1n#wHJPeRReZWiU?QD~3{|`{xSAED-9f4NwTnSI7*tAA z!L|9|)!^g7nE(3te|)jys^z$GwR$W;IFU@AZ4V z$sK(ifv(h3CB+$whp!xz8a_Es`GKP+T|LdmX=1gRsyjt*X;;&vZLGmQ-0*JoHQ%Ma z>w#}aKl+LfPWjFc&W>C?GH3Xp^h^4XbN5?E=iZ<1{Nl#Y?_D>&(=YjE&4ZNqDHot{ zjQ9F|K7X=v;&9U$kq_N}yFe2c%3R&5G4<8GVs587jg@pu9ZfdVq>EH9r5mK&XQUMA z#r;x(@w>*JokL9lQ=97rQ>(qDscGcKWhqHgp5ey>=i0~DOYwA=u4yhTNZD6rDL1jB zh#sJdiR`nsoBclzbPRci2KZ1Gy`YKvE%c}6^3bQPpY`%%Z}|Jh(p(K5v02p8>>`@& zp}PLMx$ajdN2G_pk+QB!8Iuda#rdhxH`~rO_VS&Fo@#$OrMU0WQ+toqwhdR$yv&ER zx3}Y7dVHEV{3nv=8vZ)7uqL7K4VOAB94ksH*cmn$)@>u*n7je|)ARbZFmfgY2@30k+2u15L z$_Q@)2iU;{`A`E^Xa)?;wq3Uxl-e*v`|C*$>ON1(%veY}1G?4<&@CnBS#!gi|1MKDKXgio_K<$ngt zsDf0;0b((@ZNRhF1^{a?4{?hwH*(Re_y|S31Q`Nq*o-n6?nBAy;BU9S*clU8grAU6 OVjKY@45IYFxxWB1mWrbQ literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,42.otf new file mode 100644 index 0000000000000000000000000000000000000000..6cafcb8313c29d5d0c60adb3f3e39fec07c15dca GIT binary patch literal 1208 zcmZuxeQXp(6o0e3x82)2+M;)j7Tau#O=v`{C)5TAcx^2a#cNtH)db4fTW(wK`>xU& zR1BpYcUL$}ZK!;;$!gSAOO)0ROfb+OF&YgR4W==T|L`x8n!PfZ^UYqP#5j|A@BM!7 z&3kVqJL}oL-2*Zl03MX4mKLSq=9e!4z zhZ!p-;to6AP$W@SB zC6}w@a}Nk~xt*^ZgJbD*LE4Kd06tz=HcrJmR~ENejE0gqqwPLp<8lxP5sJ2Y{PpYn z_4Q5RNPn!`uO*aKUA2mnec_i?rM*9%P=j&hnNU|a7753^3DvhoaR&lQ8w-ys zZE9SNy@F(+Cv5640Ump_l~&8ua&eWcFi|BJ$MnS-ogUVW<`b86I--lllz#WJeqG_kCmi=Yys~;tO zDt%#O`pos+Gv3d){Xn0HZGLy(%x9MmeSd58kHOoib8n@mwGm1(l*>|hRZ3;j=}dWS za#!@UD&-#eYn{`UTe-N(=^xtjwsw%N-rG(q_Rw;TmR+JvMwQp7+i9#Yjz4RZ_-^b? zt{;tN{jbH}^zRS%N26zMeQT5%;%R9j`{BWfrBV_-N$)x@&KkAXrYSf1tY(w#x6UGQl`$}G*APaB@T&4!J(ZUxX zi@a#Dah!lVSU>*^cXQ*@@D#YAu~37_`OPGs&$FtC+&I|~;d$(h2v*!*hqz#KP>iTx z^Y`$=J+=iLuxTkqG3!M;zUI;(}x{(Wjii{UR&;=Ss#4x549)~vM{brmO zxfc*IPd7${(7VRW$*~I9mjktodMyZ`pcZg4zLA{>+<36Bmu`T)dVq&aS-2H;(nehP VRtjwX6npRgGgw9$|3$?G-``1>PS5}V literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43,44,45,46.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43,44,45,46.otf new file mode 100644 index 0000000000000000000000000000000000000000..5f4754268bf33dcd62f6d57751b5912ee5141369 GIT binary patch literal 1992 zcmZuy3rw5W6+XXT{1^w)mLF9~OH2~Fu#uLLg``QFltO8mDN6*Ug=H(a;Mjm4fDM?3 zdD+JHZyOuz5`zQS;8rS-CQE=O%hXH>&2wEJ={9XcX%wx^Hf2+nW&2Gp6+6G_+G^Ul zy65qobI&>VzxKTcUwrW(NTC~qATKB?l2`7!F$Dm#0HVP2hYpr}_T9U801|d0<~vyO zM6TvnrKbVJ=!eQGt)d=k1VR7_Z&$08it4ksb-U5O5A8fP0&DL}y3qEay;-d_ni4C8 zR}Pe@%o)zPPmXyqGIYS>);; z0{F5jnWLBZQ|Kxo@GjtH%aBvOyWxY&r=~pj+;98l?eo^#<(zig8ADL#)(>{E7Q4;b?re8- zT4*l0oVi;xMc58`XSQND5zf3E(q3pkTlY7XoBr$j!N90<#Oro@a11+x&LLc3UM5V^ z>{1%zcDh-1oz-LY^`(y#6>hxp%17l~?d5ZX4z%~ZQmYTu zo+|sT>yqcD?|0!}d_YG}xXumDjoql6SDZQUKH1i|_w|`+WExefQXtgRVLC z5TV>e;3LpRvu>Bmy{>WQm4;Cz9sAyw+nJ=;rll>6%5&s3wS{EYm5@h|kacR3c7YUd z8451vr`&pO;D=mF_3!H(yM`NlDzl+S)uC@~Xc+ta8kfdNM(Jtalx6y>QZxyXW#;?> zm-W#c5zOq^LrRHwChJYzJ@1`>b(kFv(6LN%o=N(9?BC3_;j10jopfZv?TKtK)S8q{ z$~=;_hh&*ZzW2zy{pj&A?#bV9nK!wO#}}ekE}jTan%}H*(zc)c*m8J%p=aO7b8S`T zP}!`Xj^%y%1e3(gE$w8s9o_gH>vq=I(-3G1H2aOgmH~_38t7AWXd0S}H9KcX`k!i| zy_4;4xIgvS`aV2MUq02xi7oFsCp#m(5zBb%NJq#z*z4`>@Au&tnE#~tw&PRVc$?qs z=m~WDJKc2GGB6&ehwW#N+JkJs@_K7fIiR21T)CCVLYqdO<>Y_7IW-e;&JB*)$NG;A z($icS<2l@Wxb}#)Chxjsw)^78+#??v{SLov(B{#2H6AU^l`Q-4JW`fYnDWr!=*t7- z>4`exU(9}QZ@c%dlO720Kgw`;EEGEC-|yXTJ7BNvEv+)YV0`-LrQ=mWQ~62L*|sxn zXWFN_j~|`({Byv?72B`U?1?@c&I$XZVmM0%O|*pQf*p*f#;f+J z9VUCb&1!0DYH4mZyUnf+_e<~ATpInv7alqG+Guz%9Evz*`+jCRZKheLlVzRe{*GRI zGtHGQpToW#E+z^8WBkPgT{*A*x+3MNe*q<4LV24;7|2AZ?{zlqtsg;!#zA9SzICzr4kFZBdl!)td&|cLAkc`%< zF8mfQ`j#$+RM_)Xj3kb$pdR#KfFD2wXrT!-V1ydPG@wL80XnDxHAXaIOa*)&iV;`E z;}nR!gck3q!3Z6CACKo0@D;GHRFqPbPk{)w#QPQ@F5q{_?+IlAZtj;W=fD0AGDIOB z%S-+g_#N|;&sTu62q&LEPAkXw_vil*A1#G+$OcNIFzSHD4v?@a@1cxJgAuXStoUHX zy%Zu8$RG{#KZ14mn^}P8$Vc&m&+s5h{1j literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43,44.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.41,43,44.otf new file mode 100644 index 0000000000000000000000000000000000000000..8fe4d63eb220a9a18c2b0266421e7cec6e477efa GIT binary patch literal 1632 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 H!hGy61+7fe literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.retain-all-codepoint.otf b/test/subset/data/expected/layout.gpos4/gpos4_multiple_anchors_1.keep-layout.retain-all-codepoint.otf new file mode 100644 index 0000000000000000000000000000000000000000..d4f9fc081b8747ed521a8110364a07248cb09a97 GIT binary patch literal 3772 zcmds)iC2?X7QpWdiyw<(TSHs18UlgDYD@OSx@+y~=xD84XT%invF{)tK@165NJs+6 z7En;yQw7CQv@WAPE_HWm>rAUt#&$eyZKun$j_n8Y(c|0)?M%;{`3vT~^WFFEeed_y zOL%wLOD`>haHxhLkStoVMDpR4-6{YW00_VG%<^R`@3j2=5r7H!!OmqXpHyYLS6u^$ zd;|3jDLJNmh#|=U(bFM@m}Z_>~BRqK0T+nY<}^qR%}0l z`lTFGSw5sL$13#U7n*CzN#hR3&cyLJ)VuQYii+>=09?=bA=D)}1wbkQfnX63LPAqZ za&pR9ZO%{>3{{b#Eux_45_@N0}pdC7)3wFWlup9T? z4+r279D(C-5>CNcI1iWLDqMr>@IKsxLHG!6!>8~$d1wUKI)s76UO zDyqR5HB_Ue8XeW>sm4GxMygGsS|!!0s8&t2xF9Xn>Zn#vwFas+Qe6_&DXC6Hb!w{9 zP#vyUM|FCtGfXWEmN%bnKS5v))>a|pl+tE|Kf$ELakVFkiYEV&wni@3Jprr;K zHQ;Uy)L^8>Bx+Prqly~U)Tp6GEj8+>QBRF{7{*0;`Q?QfG`(0NPfXpcvhv3Tn_LJkWsd&;i}(3cau& z-QXC!g)VRr{(#qi1O9?ne+Rz8YySZRyz&qdj@LbjJc?HxN91HCQ4u|vO%{+PakPGB0d5?TR2FYK^XXH!r zE%|q8LdFOgBV>$7U_=5V5*U%d zhy+F?Fd~5w35-Z!L;@oc8Ij0{L`EbsB9Re^j7VfeA|nzRk;n)+Bjk*bGeXV?IV0qZ zkTXKg2stCuVR^`?q&mn>wBCUbowWxy{+?Y(~O7B8VgSMZ*fQTgdVYStz}xQ}vz!7oTn8GhKXE z^*&RbbtA{${852D;o=z7T_%ywos=lHUHTYa_LYEM+Y z-FU)%#eKE@ihF-U-J$emF4if4RpNDa)^vJ00(>mra{3w{cAcN_EH4$3QdXPS6|5;s zF$dNRG;;j#NS`?3&d?2UtG~6O&3h`qzvyn7<*ss6In0*z!bG#FhI2aIt{CUIoJwEH zKKuFFi}qt1Zp{}!m~7lMzarr?lewhETE4B+gI^rKdGgi^U(fBgyB!|8r=uaz)ZTLALe>wn4<;QG##xe5xcs8djr|SW(2S8A zcmkgcj}tGPIp@izr)RBCO?9sHZ1!2(tRJNE(Sh%_Ig_2qt_@=+=sx1X%=!IwZr`+l zM%yWqgL67u&KNHrwFY+W zKiScJ{PKy5CoaArbqgZ9Kr|NN;i|PexS^>+o;YG)I9lw+<8V#3daS|0;ZnZ^x0 z{-ahLF%&l}7gNv1ZRs__jI5QyV;hCZ=|c2rVG$o|;*);M$MF6a_^8yIS&mt41wLvn z+Da?)$_om%e|w3K=0iKVUf-UY-k+x8gn%$2e(Nl+c<+!P>eJ5^RtX_}iru+)y?2_d zZLYQ^Zb&A)C64%J=m+towu_aQom}@$x2JnrQD#|MNt#Yj%oP-6!UFHc!}gZF+j--k zc-bvpy7z3)g){wKyUe?@oSf}9uhguIS?qbX{ppIIoNq|?s6O*Y ze#*PWjgCfJgUyre&GzJQ{K^p@-bd7Mlz44mUC(O2FlT3$&^S2b>b%X~ubiB}iT$Q@ zb!`s>IvSt%K5tuU&$O&cF+W#4=h&(pDXnE|_m>^5I8t$B^PcLxExn$9`0Mx;_KTdW zzZSD|r+t@WXY0v|9otX(0`^u*V|#Pm&P@SskzVY{@TU9H9cA{-Hfvc)$)?g$v)f!( z>3;d`jB}kI`MTOWwsm$jbOpK{1GT>^J80%yPV{)ExxUh3FXi}EBgb*wjyiD!{#3FD zEj*kVwmdm%_V@T-eh@8CDcfJo%0DNUy$;d$>w{IIgQy09h*|OJI!I>xe`MSY?mz4- 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