From 6e87481731e0945f71e8cb9556f30ffcd2388fcf Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Wed, 27 Mar 2024 17:47:57 +0000 Subject: [PATCH] [subset] add virtual links to keep the gdef varstore last. --- src/OT/Layout/GDEF/GDEF.hh | 19 ++++-- src/hb-serialize.hh | 60 +++++++++++++++--- ....default.retain-all-codepoint.wght=300.ttf | Bin 131708 -> 131708 bytes ...gular-new.default.retain-all-codepoint.ttf | Bin 222684 -> 222684 bytes ...hints-retain-gids.retain-all-codepoint.ttf | Bin 191560 -> 191560 bytes ...ar-new.drop-hints.retain-all-codepoint.ttf | Bin 191512 -> 191512 bytes ...-Regular-new.gids.retain-all-codepoint.ttf | Bin 222684 -> 222684 bytes ...r-new.glyph-names.retain-all-codepoint.ttf | Bin 229676 -> 229676 bytes ...l-layout-features.retain-all-codepoint.ttf | Bin 223380 -> 223380 bytes ...w.layout-features.retain-all-codepoint.ttf | Bin 220876 -> 220876 bytes ...ular-new.name-ids.retain-all-codepoint.ttf | Bin 222424 -> 222424 bytes ...ew.name-languages.retain-all-codepoint.ttf | Bin 222684 -> 222684 bytes ...r-new.name-legacy.retain-all-codepoint.ttf | Bin 222684 -> 222684 bytes ...ne-unicode-ranges.retain-all-codepoint.ttf | Bin 222684 -> 222684 bytes ...ew.notdef-outline.retain-all-codepoint.ttf | Bin 223280 -> 223280 bytes ...r-new.retain-gids.retain-all-codepoint.ttf | Bin 222732 -> 222732 bytes ...oint.wght=200-300,opsz=14.iup_optimize.ttf | Bin 9988 -> 9988 bytes ...ain-all-codepoint.wght=200-300,opsz=14.ttf | Bin 10136 -> 10136 bytes ...iable-Roman.default.1FC,21,41,20,62,63.ttf | Bin 3888 -> 3888 bytes ...fault.61,62,63,64,65,66,67,68,69,6A,6B.ttf | Bin 9704 -> 9704 bytes ...ceSerifVariable-Roman.default.61,62,63.ttf | Bin 3784 -> 3784 bytes ...fVariable-Roman.default.D7,D8,D9,DA,DE.ttf | Bin 4324 -> 4324 bytes ...le-Roman.drop-hints.1FC,21,41,20,62,63.ttf | Bin 3864 -> 3864 bytes ...hints.61,62,63,64,65,66,67,68,69,6A,6B.ttf | Bin 9704 -> 9704 bytes ...erifVariable-Roman.drop-hints.61,62,63.ttf | Bin 3784 -> 3784 bytes ...riable-Roman.drop-hints.D7,D8,D9,DA,DE.ttf | Bin 4324 -> 4324 bytes ...oman.filter-scripts.1FC,21,41,20,62,63.ttf | Bin 3856 -> 3856 bytes ...ripts.61,62,63,64,65,66,67,68,69,6A,6B.ttf | Bin 9548 -> 9548 bytes ...Variable-Roman.filter-scripts.61,62,63.ttf | Bin 3752 -> 3752 bytes ...le-Roman.filter-scripts.D7,D8,D9,DA,DE.ttf | Bin 4292 -> 4292 bytes ...in-all-codepoint.wght=300.iup_optimize.ttf | Bin 3276 -> 3228 bytes ....default.retain-all-codepoint.wght=300.ttf | Bin 3300 -> 3252 bytes ...ht=200-300-500,wdth=80-90.iup_optimize.ttf | Bin 8684 -> 8684 bytes ...-codepoint.wght=200-300-500,wdth=80-90.ttf | Bin 8708 -> 8708 bytes ...oint.wght=300-600,wdth=85.iup_optimize.ttf | Bin 7592 -> 7592 bytes ...ain-all-codepoint.wght=300-600,wdth=85.ttf | Bin 7592 -> 7592 bytes ...ll-codepoint.wght=300-600.iup_optimize.ttf | Bin 303960 -> 303960 bytes ...ault.retain-all-codepoint.wght=300-600.ttf | Bin 305092 -> 305092 bytes ...ll-codepoint.wght=500-800.iup_optimize.ttf | Bin 249808 -> 249808 bytes ...ault.retain-all-codepoint.wght=500-800.ttf | Bin 250164 -> 250164 bytes test/subset/data/fonts/AnekBangla-subset.ttf | Bin 5456 -> 5276 bytes 41 files changed, 66 insertions(+), 13 deletions(-) diff --git a/src/OT/Layout/GDEF/GDEF.hh b/src/OT/Layout/GDEF/GDEF.hh index 03c83a514..afec61c41 100644 --- a/src/OT/Layout/GDEF/GDEF.hh +++ b/src/OT/Layout/GDEF/GDEF.hh @@ -663,14 +663,15 @@ struct GDEFVersion1_2 auto *out = c->serializer->start_embed (*this); if (unlikely (!c->serializer->extend_min (out))) return_trace (false); - // Serialize var store first (if it's needed) so that it's serialized last. Some font parsers assume - // that varstore runs to the end of the GDEF table. - // TODO(garretrieger): add a virtual link from all non-var store sub tables to the var store. + // Push var store first (if it's needed) so that it's last in the + // serialization order. Some font consumers assume that varstore runs to + // the end of the GDEF table. auto snapshot_version0 = c->serializer->snapshot (); if (unlikely (version.to_int () >= 0x00010002u && !c->serializer->embed (markGlyphSetsDef))) return_trace (false); bool subset_varstore = false; + unsigned varstore_index = -1; auto snapshot_version2 = c->serializer->snapshot (); if (version.to_int () >= 0x00010003u) { @@ -683,21 +684,25 @@ struct GDEFVersion1_2 { item_variations_t item_vars; if (item_vars.instantiate (this+varStore, c->plan, true, true, - c->plan->gdef_varstore_inner_maps.as_array ())) + c->plan->gdef_varstore_inner_maps.as_array ())) { subset_varstore = out->varStore.serialize_serialize (c->serializer, item_vars.has_long_word (), c->plan->axis_tags, item_vars.get_region_list (), item_vars.get_vardata_encodings ()); + varstore_index = c->serializer->last_added_child_index(); + } remap_varidx_after_instantiation (item_vars.get_varidx_map (), c->plan->layout_variation_idx_delta_map); } } else + { subset_varstore = out->varStore.serialize_subset (c, varStore, this, c->plan->gdef_varstore_inner_maps.as_array ()); + varstore_index = c->serializer->last_added_child_index(); + } } - out->version.major = version.major; out->version.minor = version.minor; @@ -727,6 +732,10 @@ struct GDEFVersion1_2 bool subset_markattachclassdef = out->markAttachClassDef.serialize_subset (c, markAttachClassDef, this, nullptr, false, true); bool subset_ligcaretlist = out->ligCaretList.serialize_subset (c, ligCaretList, this); + if (subset_varstore && varstore_index != (unsigned) -1) { + c->serializer->repack_last(varstore_index); + } + return_trace (subset_glyphclassdef || subset_attachlist || subset_ligcaretlist || subset_markattachclassdef || (out->version.to_int () >= 0x00010002u && subset_markglyphsetsdef) || diff --git a/src/hb-serialize.hh b/src/hb-serialize.hh index 73634e6b9..e988451eb 100644 --- a/src/hb-serialize.hh +++ b/src/hb-serialize.hh @@ -91,6 +91,26 @@ struct hb_serialize_context_t } #endif + bool add_virtual_link (objidx_t objidx) + { + if (!objidx) + return false; + + auto& link = *virtual_links.push (); + if (virtual_links.in_error ()) + return false; + + link.objidx = objidx; + // Remaining fields were previously zero'd by push(): + // link.width = 0; + // link.is_signed = 0; + // link.whence = 0; + // link.position = 0; + // link.bias = 0; + + return true; + } + friend void swap (object_t& a, object_t& b) noexcept { hb_swap (a.head, b.head); @@ -469,16 +489,40 @@ struct hb_serialize_context_t assert (current); - auto& link = *current->virtual_links.push (); - if (current->virtual_links.in_error ()) + if (!current->add_virtual_link(objidx)) err (HB_SERIALIZE_ERROR_OTHER); + } - link.width = 0; - link.objidx = objidx; - link.is_signed = 0; - link.whence = 0; - link.position = 0; - link.bias = 0; + objidx_t last_added_child_index() const { + if (unlikely (in_error ())) return (objidx_t) -1; + + assert (current); + if (!bool(current->real_links)) { + return (objidx_t) -1; + } + + return current->real_links[current->real_links.length - 1].objidx; + } + + // For the current object ensure that the sub-table bytes for child objidx are always placed + // after the subtable bytes for any other existing children. This only ensures that the + // repacker will not move the target subtable before the other children + // (by adding virtual links). It is up to the caller to ensure the initial serialization + // order is correct. + void repack_last(objidx_t objidx) { + if (unlikely (in_error ())) return; + + if (!objidx) + return; + + assert (current); + for (auto& l : current->real_links) { + if (l.objidx == objidx) { + continue; + } + + packed[l.objidx]->add_virtual_link(objidx); + } } template diff --git a/test/subset/data/expected/apply_cvar_delta/Comfortaa-Regular-new.default.retain-all-codepoint.wght=300.ttf b/test/subset/data/expected/apply_cvar_delta/Comfortaa-Regular-new.default.retain-all-codepoint.wght=300.ttf index 18b352e45e1320aa5019bca0a85ef9e4cec4d407..3b17439316b27bbb7c56b4ab524e504eca20b23b 100644 GIT binary patch delta 69 zcmeyZMcVEo9)=>=2)0(_Hm VSZz0-W?sbDypnbMN>;|pe*lEg6n+2z diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.default.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.default.retain-all-codepoint.ttf index 749ef45e722e58e3a61cd943ae9c7d5012e51d10..77658843e7c7a62982505a90e69b058fe63e8fb1 100644 GIT binary patch delta 87 zcmca}n)l9WUJ(XH1_lN(Ai=_r;O^q;7HnvjzEMPniDkOfn`fI{m||G@7=(aIfPire l5P#Ur&AFIy@&yi?&Fk3}8JpK}wXfr11Y)M`>$sTpq5;R#7bXAz delta 87 zcmca}n)l9WUJ(XH1_lN(Ai=_r;O^q;c4A8d*G3T?CYCiKnF}_%FvYO)G3Eo600E;h lkPzD3!>PnLIgrz4^LqA0jLqw~+ShS00x{F}bzIDP(Ez!17D@mB diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints-retain-gids.retain-all-codepoint.ttf index 8a7e8281c26a7fa750fa8fb8567e6ffbf31c4cdb..b752b3c6f54b16c01c8612fb27519892f7ac42a0 100644 GIT binary patch delta 83 zcmX?cgZsn{ZV?7X1_lNpAi=_*;O^q;=4u@nyiw#0BMV1V5AS9cCIx0b1|gslAYj}D i#NRgev#n&D9KvR^*_c(4vDt#7-GYO0y9Ec6z!Lxqy%O92 delta 83 zcmX?cgZsn{ZV?7X1_lNpAi=_*;O^q;mb2|B&qk3qj4V5om(1SG!lb~=$CwXP0tAf4 jKtgD<7`qbV1 diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.drop-hints.retain-all-codepoint.ttf index 711c070aa6693ba35699eab425d70f5ac6c9818f..d5603862761a5eb919cf5a02e51721867ea2e5c7 100644 GIT binary patch delta 83 zcmbPngL}peZV?7X1_lNpAi=_*;O^q;7HnvjzER{2Ba8kgrJ0*qm=u`#7=(aIfPire j5P#U*&$gIxatNEvW@A=G#%3dqb|VhP?M56-&mIE+7|#?F delta 83 zcmbPngL}peZV?7X1_lNpAi=_*;O^q;c4A8d*G7>yj4Up%=Lc_QVNzh`W6TFC0Rl#2 jAR)9_fL)1k@>MpQ&Bm;Y7@Lha+Ko6Ew;ORVJ$noQIkXfu diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.gids.retain-all-codepoint.ttf index 749ef45e722e58e3a61cd943ae9c7d5012e51d10..77658843e7c7a62982505a90e69b058fe63e8fb1 100644 GIT binary patch delta 87 zcmca}n)l9WUJ(XH1_lN(Ai=_r;O^q;7HnvjzEMPniDkOfn`fI{m||G@7=(aIfPire l5P#Ur&AFIy@&yi?&Fk3}8JpK}wXfr11Y)M`>$sTpq5;R#7bXAz delta 87 zcmca}n)l9WUJ(XH1_lN(Ai=_r;O^q;c4A8d*G3T?CYCiKnF}_%FvYO)G3Eo600E;h lkPzD3!>PnLIgrz4^LqA0jLqw~+ShS00x{F}bzIDP(Ez!17D@mB diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.glyph-names.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.glyph-names.retain-all-codepoint.ttf index 56cba1bd0f098fe41c2df8454320b42c9c91692a..3a16f49c769ea1cf94fce8592d4ddaaf1f582b2a 100644 GIT binary patch delta 87 zcmZ3}#J8r2PlSPyfq_8`NU$&@xVyNz1smF>ZxrESV$quD7_eD|DTbAgK?tY>2pG2j l@rTW?ITkZc-oRnAxu0E;vAK_{y^o6#h?%zcaWT&;0{}XQ6=?tf delta 87 zcmZ3}#J8r2PlSPyfq_8`NU$&@xVyNzo!HXAwNZqJiN(HaAJ=9TrWjT}#(ba>AYe2G l5<;7EIF%SD8*K qh(B!R=3LA;`2vT{=Jo7~jFaW~*_*d=wQuEO1Y)M`Te+C;#{vNFP#7Kn delta 87 zcmbPok$1{PUJ(XH1_lN(Ai=_r;O^q;_Ik@gu8kr(Oe|}HjxXKp!W6^G$CwXP0tAf4 mKtgD952q62TELJ?C7;$zGgho3%OQ8JlIe+hw>JftYE#3^((JU;w|U6+{34 delta 87 zcmX@Jm-ozGUJ(XH1_lN(Ai=_r;O^q;*0VS1_eK#NCKiz^vK5JftYE#3^((JU;xF+6<+`V diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-ids.retain-all-codepoint.ttf index 660c052bf23e04cfc4d7ba544fca82ab000b7f51..3aad013e1a460c451cc3625028be30f08ae8f43e 100644 GIT binary patch delta 87 zcmca{lJ~|*UJ(XH1_lN(Ai=_r;O^q;7HnvjzEMPniRGB44a;U1rU({31|gslAYj}A l#2+@Zb1Y_@e1_d-^J+Fl#^zO=?W;H$ftYFgDo$p-XaIYK6`lY9 delta 87 zcmca{lJ~|*UJ(XH1_lN(Ai=_r;O^q;c4A8d*G3T?CYIYuJN9jMVTxekW6TFC0Rl#2 lAR)B5gF}gNvM-0t=GAPA7@Jpdwy)x31Y)M`t2mkUq5;*s7Qg@i diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-languages.retain-all-codepoint.ttf index 749ef45e722e58e3a61cd943ae9c7d5012e51d10..77658843e7c7a62982505a90e69b058fe63e8fb1 100644 GIT binary patch delta 87 zcmca}n)l9WUJ(XH1_lN(Ai=_r;O^q;7HnvjzEMPniDkOfn`fI{m||G@7=(aIfPire l5P#Ur&AFIy@&yi?&Fk3}8JpK}wXfr11Y)M`>$sTpq5;R#7bXAz delta 87 zcmca}n)l9WUJ(XH1_lN(Ai=_r;O^q;c4A8d*G3T?CYCiKnF}_%FvYO)G3Eo600E;h lkPzD3!>PnLIgrz4^LqA0jLqw~+ShS00x{F}bzIDP(Ez!17D@mB diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.name-legacy.retain-all-codepoint.ttf index 749ef45e722e58e3a61cd943ae9c7d5012e51d10..77658843e7c7a62982505a90e69b058fe63e8fb1 100644 GIT binary patch delta 87 zcmca}n)l9WUJ(XH1_lN(Ai=_r;O^q;7HnvjzEMPniDkOfn`fI{m||G@7=(aIfPire l5P#Ur&AFIy@&yi?&Fk3}8JpK}wXfr11Y)M`>$sTpq5;R#7bXAz delta 87 zcmca}n)l9WUJ(XH1_lN(Ai=_r;O^q;c4A8d*G3T?CYCiKnF}_%FvYO)G3Eo600E;h lkPzD3!>PnLIgrz4^LqA0jLqw~+ShS00x{F}bzIDP(Ez!17D@mB diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.no-prune-unicode-ranges.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.no-prune-unicode-ranges.retain-all-codepoint.ttf index 749ef45e722e58e3a61cd943ae9c7d5012e51d10..77658843e7c7a62982505a90e69b058fe63e8fb1 100644 GIT binary patch delta 87 zcmca}n)l9WUJ(XH1_lN(Ai=_r;O^q;7HnvjzEMPniDkOfn`fI{m||G@7=(aIfPire l5P#Ur&AFIy@&yi?&Fk3}8JpK}wXfr11Y)M`>$sTpq5;R#7bXAz delta 87 zcmca}n)l9WUJ(XH1_lN(Ai=_r;O^q;c4A8d*G3T?CYCiKnF}_%FvYO)G3Eo600E;h lkPzD3!>PnLIgrz4^LqA0jLqw~+ShS00x{F}bzIDP(Ez!17D@mB diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.notdef-outline.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.notdef-outline.retain-all-codepoint.ttf index e33f66c27a6dbdcd25199b492061ca1625a4fbd3..2f4b98715dcf22af09c43de972e3dcef6fd3c7ff 100644 GIT binary patch delta 87 zcmdmRfp^0NUJ(XH1_lN(Ai=_r;O^q;7HnvjzEMPniN)dD?yAi$Ofjr{3_?I9K)|>K lh(B!R=3LA;`2vT{=Jo7~jLqw~+ShS00x{F}bzIC%u>h(F7Zv~j delta 87 zcmdmRfp^0NUJ(XH1_lN(Ai=_r;O^q;c4A8d*G3T?CYI0-7ABirm||G@81sQjfPm2$ lNC<82;Z$Or9LQ<2c|H3g#^!Zg?d!N0ftYFgIxgm>SOA-<7CHa` diff --git a/test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.retain-all-codepoint.ttf b/test/subset/data/expected/basics/Comfortaa-Regular-new.retain-gids.retain-all-codepoint.ttf index 93aa9829b8f554c156aac986577b9e8e335cb681..b19ee0fc845db97f57dd3467f2bb5170e20e548f 100644 GIT binary patch delta 87 zcmeAC)fq_8`NU$&@xVyNzxmpJXZxqpCV$uF6q_f$DDTbAgK?tY>2pD$( l@wd&~oGTe8U*NFWyq;Z=v3Uzu`xY)nAZFUWg^M{N8UR?T6|MjP delta 87 zcmeAC)fq_8`NU$&@xVyNz^# diff --git a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.1FC,21,41,20,62,63.ttf b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.1FC,21,41,20,62,63.ttf index 43edc2cc8f77f6470f200610c32b358254cb2032..9d6fc9d3001f4118ea77152035df3195349689fc 100644 GIT binary patch delta 71 zcmdlWw?R&XfsuiMK^RD|Fc`SIxVo`eit%m~kzisezZ!dKvH{apaUq}r7?5FL0%~9a QDrTJgiOF)aDf4e`0IWz1NB{r; delta 71 zcmdlWw?R&XfsuiMK^RD|Fc`SIxVnjDu<&dYkzis8E^oXt*??&)uNP1O3fsuiMK^RD|Fc`SIxVnj~eKC2XhzJwQrPqxYHtR6uGKvcURltA@0~1gO TBLg=BfsuiMK^RD|Fc`SIxVpVm5GmOxBErO?#jeG-S%)c?k+%q_0tSR8Z(vU3 SWCH49WZ-6C+$_LyLlFSyTnrNc diff --git a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.61,62,63.ttf b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.default.61,62,63.ttf index d049757ef27b6cf82697b2cd049222fd2fd6659b..07411395d41f59a054ee259e473a31ba345856e6 100644 GIT binary patch delta 71 zcmX>hdqP%(fsuiMK^RD|Fc`SIxVkZ0am#NMabRMZC;R-@E+Y delta 71 zcmX>hdqP%(fsuiMK^RD|Fc`SIxVmwdF!OE{abRNUUHL<9as*Q@uM1EC3fsuiMK^RD|Fc`SIxVnj~eKC2XhzJwQrPqxYHtR6uGKvcURltA@0~1gO TBLg=BfsuiMK^RD|Fc`SIxVpVm5GmOxBErO?#jeG-S%)c?k+%q_0tSR8Z(vU3 SWCH49WZ-6C+$_LyLlFSyTnrNc diff --git a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.61,62,63.ttf b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.drop-hints.61,62,63.ttf index d049757ef27b6cf82697b2cd049222fd2fd6659b..07411395d41f59a054ee259e473a31ba345856e6 100644 GIT binary patch delta 71 zcmX>hdqP%(fsuiMK^RD|Fc`SIxVkZ0am#NMabRMZC;R-@E+Y delta 71 zcmX>hdqP%(fsuiMK^RD|Fc`SIxVmwdF!OE{abRNUUHL<9as*Q@uM1EC3fsuiMK^RD|Fc`SIxVo`eit%m~VPRsKU;FRTWErNd;zB?LFd)Og1k}I; QRLnT}9+Tx}MdtV10H+TOEdT%j delta 71 zcmbOrH$hH>fsuiMK^RD|Fc`SIxVnjDu<&dYVPRsaR#18}S%zsVuNP1O3q`AiJRZD#47**J4X(( delta 72 zcmX@(b;e7CfsuiMK^RD|Fc`SIxVpVm5GmOxBEZC=_}=5*W(_7^Cf*{T3K$TY+{2Q{ S$pqBJ$iU6OxcLoBf&u^;=MBFA diff --git a/test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts.61,62,63.ttf b/test/subset/data/expected/full-font/SourceSerifVariable-Roman.filter-scripts.61,62,63.ttf index 590ccb9720827710b5a34bd8fff88db925a059da..bc71acff5376ec4389895cbfda800b1ff90c3b3b 100644 GIT binary patch delta 71 zcmZ1>yFylkfsuiMK^RD|Fc`SIxVkZ0am#NM(P3gadaRRcvI|qLxDZeQ49GAr0W~l( RFf%Yt-p6FT`8U&AZUC7O3;O^7 delta 71 zcmZ1>yFylkfsuiMK^RD|Fc`SIxVmwdF!OE{(P3iQ8Z=XHvI|o#uM1EC3jIY&~5fsuiMK?F#!FgUooxVm+=@!w)#U_ApA{ox+qADnsg&U~Qc9U%Y1M4fKg zBMc0Te(7b2MIlRsPcSfWh%hiPab=_?rl>yCPMLTmm{DP~2BQq4jH*UzLp;CDR|aPG z3qZXLcmG@M0@07OmtNkSz*NsP`8sP*G7|#_&;c9_ObiYTE>~v delta 337 zcmbOuc}7x)fsuiMK?F#!FgUooxVm+o=z)zFTE_WC}fH72?hoZpd=GlMrvY;;;TmgiC2Od12$_g$}q~Pd+nYR&u{aUftmdR z&@6_#|E+d`=zIFV_iavKs%PS7W_SVQ3xNcIVA|w+tgVxa*@7k~vx!W8$P!S`$-u$D z#8AY*1#}`4Pz8u*zyP$5A%I~Xkj(1Dyf`Obkgt zehiEYW{Wa}f%yNYG6ekp%isl;V*;82G6w`W8bBl$m}GBYn0$s!SsfzF1QZ8(ml0?m qh-3tsHx0-V0%8zYHu)V(D?bxZ79_(6bO+F7lZ#k`H-BY&&k6uYuR03= delta 337 zcmdlY`9xBOfsuiMK?F#!FgUooxVm+o=z)zFTE_W=;HqK(F_b6KuIQ*jMT&w#aE5~6R!j_W^C4Alwp+76?Son=ePOFz|4LD zXcoiW|5m#|^gaFG`!**q)id!kGrR!ug+PKpFm3WZ*4D|zY(bNg*+eEkWC^I}WZ+<6 zVklzZ0y>cir~7ZspV9|kj^Ai^S$1DF}KfMU#G2e40` P!m7*y(zN+7+ecOa3>rGG diff --git a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.default.retain-all-codepoint.wght=200-300-500,wdth=80-90.iup_optimize.ttf b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.default.retain-all-codepoint.wght=200-300-500,wdth=80-90.iup_optimize.ttf index 5d138ef29e7212e9420d2cdf4c74556f0b8806c6..a447b7ba556287ae285868250e3ba91976d3b4a3 100644 GIT binary patch delta 71 zcmaFk{Ki>?fsuiMK@3Q+FeJFUxVlx|vlZPaQp3dZHas?U@)V{_aUq}r7?5FL0%~An RU}j*P%*AZF*^_y(8~`WJ4Q~Jd delta 71 zcmaFk{Ki>?fsuiMK@3Q+FeJFUxVqWqRBqTPQp3cOX7xmW@)V{_UN@iu7!aB)!feXP R1k}XHz|6q7*@JnB8~`pk4R`k!@U}Rum5Cak{3<>Tou5Ok0Y(+PU)G)Es7d=*;JcTJ!TnMND24onRfEpMX Rm>C!+b1|E4_GI2I2LSCJ46FbE delta 71 zcmZp1X>k!@U}Rum5Cak{3<>Tou5PwDl^ZsS)G)F92+Mpwc?we|uNzPS3oHlh-gAiVFc1z<>+`6Ho&q S12Y5T delta 71 zcmZ2sy~0|AfsuiMK@3Q+FeJFUxVo`U{1?4ZWC|0@!BzVtCa+;Kz`O>kaS# diff --git a/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.default.retain-all-codepoint.wght=300-600,wdth=85.ttf b/test/subset/data/expected/glyf_partial_instancing/Roboto-Variable.ABC.default.retain-all-codepoint.wght=300-600,wdth=85.ttf index 2447337a4bab459574e4a7876518cc8a5d102999..4f5c057613895730c745e4917fefa847b89b2046 100644 GIT binary patch delta 71 zcmZ2sy~0|AfsuiMK@3Q+FeJFUxVru7W(?UVGKGod`i>oHlh-gAiVFc1z<>+`6Ho&q S12Y5T delta 71 zcmZ2sy~0|AfsuiMK@3Q+FeJFUxVo`U{1?4ZWC|0@!BzVtCa+;Kz`O>kaS# diff --git a/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.default.retain-all-codepoint.wght=300-600.iup_optimize.ttf b/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.default.retain-all-codepoint.wght=300-600.iup_optimize.ttf index 46885af6856d7cb8af797c29d93dec7ccfe32180..b20d328638898112e4867b9a3ee4e2f7875ba252 100644 GIT binary patch delta 87 zcmca{Oz6fjArS^f1_lOUAi=_5;O^q;rpI9Guu)_KBg?(=2Jy`&7(F=o7*c>r7#M^= l1mmgAA9;5&ZkFf1%+$P!zkL-yBM>tIG4u9S{4DDx0|2_!7u5g& delta 87 zcmca{Oz6fjArS^f1_lOUAi=_5;O^q;=D;;&#zv71j4Zp7E~alj!RW!s$7~K%!oc(t lL^23%zQ%KfX|p`{4#wtH{Ozmw8G)Dyh?%#q;%8Ym836x37~TK? diff --git a/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.default.retain-all-codepoint.wght=300-600.ttf b/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.default.retain-all-codepoint.wght=300-600.ttf index 22ea1db7b83eb2add9af6c9d293f851be2420c20..781934111656e7906fc00e943cd06790e656523b 100644 GIT binary patch delta 87 zcmX?dUg*eqArS^f1_lOUAi=_5;O^q;rpI9Guu)_KBa6^4;q#kMFnVzEF{A*MFfa&# l2*y*JKl1Km+$_(1nW=ddfBPzaMj&PaV&?6u_*tZ8006M$7cu|< delta 87 zcmX?dUg*eqArS^f1_lOUAi=_5;O^q;=D;;&#zv71j4bb-rpj+V!RW!s$7~K%!oc(t lL^23%zQ%KfX|p`{4#wtH{Ozmw8G)Dyh?%#q;%AYX0RZ@e7(4&~ diff --git a/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.default.retain-all-codepoint.wght=500-800.iup_optimize.ttf b/test/subset/data/expected/update_def_wght/SourceSerifVariable-Roman.default.retain-all-codepoint.wght=500-800.iup_optimize.ttf index f9435b588658cd2f3639c33d8076a7dbc3b407c8..edbda6a43795b375ab1e57a356386ac6c9ab4a71 100644 GIT binary patch delta 80 zcmcaGpZ~&qeh~&n1_lOUAi=_5;O^q;mTs@mwo&8-Ba4$C%bHD0f{eT=Km`m8LLh?i e)aDt?I~ga-GgmbSvbG1ZG6FHv_CQwV`cnYeR1)X_ delta 80 zcmcaGpZ~&qeh~&n1_lOUAi=_5;O^q;mgcIkXQRjqMiv(*7Kcqtf{eWPfC?BGdcdU6 deh~&n1_lOUAi=_5;O^q;mTs@mwo&8-Bg?f6wpE*$1Q~f#fC?BGgg^x2 fsm(K(cQQ_vXRc}vWNi;*WdvfT?SZV!k52;t>q-;J delta 80 zcmdn8h=0o>eh~&n1_lOUAi=_5;O^q;mgcIkXQRjqMwS~fY<8QN1Q~hn0TnPX^ngjB e$=6t_H_J2cU~CR#Z4YE+1Y)M`fvn7rPXhq=niL2C diff --git a/test/subset/data/fonts/AnekBangla-subset.ttf b/test/subset/data/fonts/AnekBangla-subset.ttf index e8228d76045f57a82b73627805a9ed6101bafd25..3595d2525c218f18e59cd761d1e013292339a093 100644 GIT binary patch delta 1356 zcmZ8gYiJx*6#nMU?9A*V+q4bXXlY}Kacx75A=Ey?HZ5sVV%lgnO|%Aey4mc8WH(E) zhNMb2fr@`bkWuW9P>WO)1g#_@NU9brGzwDnkBBYe&laUr6MW!azk4S>@D6kC`Of+7 zdECd%&5?}YGyonnReIEj< zV#K@Cd9Pet-E3a~L^loH!z8RPT$d!Y6Q9X?lSR%9?#y#`vtu*E$6ndjO8z2~9LwnY7aGpd zP?Ptji`aydT<{igUBSy|CO>+6AGgN>%&Fq|WJ$h;W)}3U@)svE#hm@Zb6kIh*wMRb z;PTE$e)!3Ctt&8{tF+^q-20)Lf7tQH*I3U|mqKbsZS)9b=HLm0KmCK9I6FzGwU>0L zz!%7{wuG?_Ci>z2&uQx)EGrNdA%&>GkQJk1NU1l5m_x208o#{~jjo_h-i)uV zR^R$jhuDlbBGeiohDIh!Xd2B-6wm~#y`#GijVCgNED|RQ*=8ihyi!5&^u{$Xs4B$e zuWn))Qffmm8>Bq}bpvxa#ogx7uML4V`a1rGT8~5BHOLpy%QhZe^SQH132PbAGODFR zDVWR9$%9#x5!9m+D=jc9q>lC9k5`tDAwqi#T4AQs`67~9c8!f>J(e7Fp46Qub>~Ul z`N6fwEo??zo%*$mK{n>s+l@PEuG6jtlG^w;(NmA@>`!VAd0JD&1%;_uXrzi2Oc3I? z1r6NV4SYf4x-uaCv3(+Gw-pK8*9691FDETd(YfmQV?h{Z4< zwlN@I$K&#MSnsY%OjJHF`sMrb^9vgj=$GekT>gsCdp{c(rza&B_!AEyW&l*97$a!D?mcioFb<*0E@7G$}mBMA{h7;!fej;@PUVPUFj PtKlzOFE6|l|JeQuTS6?^0o|4Xx<3TxSm;&|X56uL?Xc~dZCSP$ zZHf5BDAAlGn3zcXiqXL!Bsj>3@WBiX`hgG=7EDY`G#G<+K^lAhp7+LPY?#{f3Uqz_koU)Ww)e=I+qFc&N#F%*!W#YcrJEk2 z&|cu@1~OJYx46zb4TCu_I)|X}Kz6}FHkW{pC9Sa>?n)%Y0gYsOYN+>U6O!}vAz)V$ z`h}fSo8a&RBJW%(VGTb1OCb;XCiFL_z^F=zdH9D7)uuAzlhH?I5O_7?^hno$CB6`U z!QcuQ;fytzqgwGY@aMphtd&WOT{zK%V4XzTL~dkk-1(FmkV}~5xzR)}<$doRV03_d zGrB&d*=@mNGiPMCsNvrFsYt6RP6jbrc{CFCarw{|<_fy}cGDa0zqYEmNSf~|E8TD! z&+)ymv2>v{U;5a*W-I`DNivtnj>`3Qu=QUmp?vd5Y5uNeUi)7Rj;?#w+E+xM-6?zR zH+|{6B(1;^b<$*?@+X(^d4;{e5>yp5Qi|gNN7KJoH2p_9tT?)o{-9_9nkx#EhLfj$ z81FgwGv;Uxq}^}qe~~q~4k63P1I=R^91X|=KfbaoOGnDG;Gg5j(CuPHv7(|FT8#X* zSoy~-^4YV-K6iNo)J)x^x3+io(1rtvY?7)EWRne4owmlav_SfD!JwlQu6kVrY^4gKW8cwL7 zTB%NV(9B^Tp{8w=TIy8weVvLfcZ#d#GVq{p90Mf`3}kW?R%dm3IBC&i5VKczlza;w z2yf1lI9bTm2S8WRY9-<6y6*VoX|o2uo7L?h6PvRRuA}H7cMW@^ZVg`9M#m|YmzAD! zXnc+0RjOl>AI>WR6LKPJAcB4 z$I4s5OU+5ROL|tsr$^5`7@aSl6|vJJr$f>2oJZ(yZO!c3x^JMTE!l7DLVdd%Gg0PO#phM7UbdncawjNs2a6b&+Jul@hal^?v`Eazo1sZ+|=pMr# Qt~6)r%^ETDQ}8SAzgB|w#{d8T