From 6555f209586886a4b2562412363cf152d7837d5c Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Wed, 15 May 2019 09:42:38 -0700 Subject: [PATCH] [subset] Truncate empty gids at the end in retain-gids mode. --- src/hb-subset-plan.cc | 8 +++--- .../api/fonts/Roboto-Regular.a.retaingids.ttf | Bin 0 -> 2068 bytes ...urceHanSans-Regular.41,4C2E.retaingids.otf | Bin 2736 -> 2656 bytes test/api/test-subset-glyf.c | 25 ++++++++++++++++++ ...-Regular.abc.drop-hints-retain-gids.61.ttf | Bin 744 -> 732 bytes ...-Regular.abc.drop-hints-retain-gids.62.ttf | Bin 712 -> 704 bytes .../Roboto-Regular.abc.retain-gids.61.ttf | Bin 1808 -> 1792 bytes .../Roboto-Regular.abc.retain-gids.62.ttf | Bin 1756 -> 1748 bytes 8 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 test/api/fonts/Roboto-Regular.a.retaingids.ttf diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index fad75d0b3..2e7b71b8e 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -183,9 +183,11 @@ _create_old_gid_to_new_gid_map (const hb_face_t *face, | hb_sink (reverse_glyph_map) ; - // TODO(grieger): Should we discard glyphs past the max glyph to keep? - // *num_glyphs = + hb_iter (all_gids_to_retain) | hb_reduce (hb_max, 0); - *num_glyphs = face->get_num_glyphs (); + unsigned max_glyph = + + hb_iter (all_gids_to_retain) + | hb_reduce (hb_max, 0) + ; + *num_glyphs = max_glyph + 1; } + reverse_glyph_map->iter () diff --git a/test/api/fonts/Roboto-Regular.a.retaingids.ttf b/test/api/fonts/Roboto-Regular.a.retaingids.ttf new file mode 100644 index 0000000000000000000000000000000000000000..183b148ca289cc64214f419adb37f3b93a08e1a1 GIT binary patch literal 2068 zcmZuxZ){Ul6hHU9*MDo-y3wuB!uGmuV_RD`w^3m(P_*43Q#RHCuZyykwcCJ|m92we z5D^uZDj*@o1SJw<3`UK&RkI;{*awI)(Fh42SYrH05G88F#F)5x&U^a<#@oE#J->6$ z`Q3Bx>pQ>zpa?+%xh)uKh0UM`Fw~>Bs;#plth;~z5^@FkiMH^LC(jk1C_(-Ma(_p- zt|2va!UDiB2KxFF(Ihz8&j7+I@@Jx1i-uaMCsa*M2L+ngM1RdgaO)SVJkIO%T`T*wvLWA2tX8~dYA(kFq{`a2KF8;OU*itLr+96sF=$5dVH~{e+|;RL z7&{%AX1Q1SE2}dmv3IwRGp{U%_69lY^Krq;S*^>*MX%h-#md$$#T}8;a(ZhlEw{=; z(HNI1)fpG!=}4W-A*}30>{eVn5OFS=@kpfE$0d@%42(`kP+;G@0M4qb?jIl5dD~?! zR&^@d6@EPE2k>-KGUi2nV{1ZiTJpFu|}-*g}p1ZY7Jhluk~@GrVv(mz{w$! zPLp0(al82OblRE56D;tVNBJ~^|2hH>JMacV)9iRBO5x;oImzL6xm{RcB{DW}8A_AQ;9=Q9hB#H&Twm$5g3$w0Y|9gCT{bkQ z1ZB(mYSj|Eo@%NrA)mDSnHJAVvUGlL`N{&a^ar17ZE%uhID7cnW;a>JV}qR=9Aufg zL;fmNCGSvQyMHzL%rD2bX>pd>Y`VXNe9LTBi%CybeoMoeRfS{~1e$7AtGU+B&01BE zEixPM0NQ)YZgQ}(Y%jr!1a%IU%61Tp5S$_Sj37r)=3wKLF-{rdlrf$yD5YG2UkS=e zF|L>348ivVIf6~47(7ByCu7_Q0(}>?Z~=}(8YbWtcAag|1Fu0J?1Uzv1+GFCPQx{f zvd#5@O?U@n(FJCy8En!iu;O=X)31PH_8}DNXCPlcOMQEOP|p(Uy6mG9`X6%lQ5tT?tq@sBONB~JzuuGVfHLDXh*I|05fbl$!;=1j85W(BD zlc;3Plr4F=*_v@L(fY?+RcrL_@~U-B6^)JSnyTF8`eJvJ-{06!VlTAWiz^%akFRsf z#kLZ$+M4&$=NG?Y?58hM2m4QcHFo{bm0MEPoO#!~?z3~Bq~xxXU%vj)l^xNsSljlu zl`9|2<-es^PxWm1@#|fC=c#*Q?K zQR>L;qu&2NgQ2bw1nhAIs7q?vC_%RHqXtYnTF^s-Fc0csBS^v4r@O(?e`ItR9D}3r z{oojmrVfAuzeOCVO0jHzeDnbBqGd8%BSl90Lb)1QjcVdTt+=){7HW8S*0QOF255Su Rh6=TY3blrc#Tu5>;9sKSyNCb) literal 0 HcmV?d00001 diff --git a/test/api/fonts/SourceHanSans-Regular.41,4C2E.retaingids.otf b/test/api/fonts/SourceHanSans-Regular.41,4C2E.retaingids.otf index 906bdbefd595a64a682884a2ffd18b7592f7d530..fa2a0e4469e99944f90be57b6e70da09eee8e138 100644 GIT binary patch delta 605 zcmYk3%WD%+6vn@E=aJ5Inlz=-P1?pZ7O9Vc6bfn=QlYwNjWi`xUDzQVI*W`GYpemm z2!f#aKxX4Yve52SsHBTR!0M)}`~h7Sf*@UX6LC||l_@wd_kO=~?ws?Txtk~U2kZI8 z#XKxLfr86dW@po%c4jO9Z9r?}3wEyf)SLwL4UR1r^9xs%d#n&sdFd(nPUYS7^c=3~F#_Sfl-_mBh@Z)Rq zg|Z~Vj@F9HmhvUN5gho<@A??kRpl2}#2vmLepqJ!p7ozS#Bht_q#B&sqwz=+&f|Ba z1>!h}w1PP_BCY;+Mne@7QCw#Q6cFG6)=+{QUNlF;mQf7@W3F!jE><~HhJ&>*XV~HG Sp1tsEcp*Zm7p6}c@ch1cF;681wWwO}} z99)5hBmL=g$M(7B-vBHD@=InU*`2#)?+5f%_9k+f;Q{R|D;R@(Gf$WN^4-*lcIGVe zR59;QTA%Z4ynm6or^tpAv)*w3HM3VNRjPIpH<&*$yCuImRE9js+W5scecCVO_w6~x z!%RjoTAn#yS-*~Mz#e6zW0nV6m)kt%Dzi7s1H;eog83e^duOSbJP_qP;;^$*l~azV z%KaE@0phRvi0}A`b&6Apa#W?D;nN%i<6>(qcif-$K}3fBu;;;{Fp!Xsy;pzg8YB+~ zX%GS$ArxXm5=Gnh_722p!PynZHhzt4Yl+j%O*+U_SLCYR2-7V^DwixU-QMgiw?GPq z^9eqQh$xCPjiXvY1W)A4#P9mNdLTWoFWc|J3r=k9lB>d~MfzgjkE@NUzJqE~`-(|1 z&d10X>x8NR|J#4zVPK4V6tdWS&uc>yx|lY!z!uV*TEif@O&$7gk3@wgn!b)sT0uW% wP{zd|WxWjyt1B{$JPNpgDfl=SJTixZUb7NJ&CVcV_qD2&DqWzmaow%zU&gX^bpQYW diff --git a/test/api/test-subset-glyf.c b/test/api/test-subset-glyf.c index 4671156f9..dd9833c58 100644 --- a/test/api/test-subset-glyf.c +++ b/test/api/test-subset-glyf.c @@ -305,6 +305,30 @@ test_subset_glyf_retain_gids (void) hb_face_destroy (face_ac); } +static void +test_subset_glyf_retain_gids_truncates (void) +{ + hb_face_t *face_abc = hb_test_open_font_file ("fonts/Roboto-Regular.abc.ttf"); + hb_face_t *face_a = hb_test_open_font_file ("fonts/Roboto-Regular.a.retaingids.ttf"); + + hb_set_t *codepoints = hb_set_create(); + hb_face_t *face_abc_subset; + hb_set_add (codepoints, 97); + + hb_subset_input_t *input = hb_subset_test_create_input (codepoints); + hb_subset_input_set_retain_gids (input, true); + face_abc_subset = hb_subset_test_create_subset (face_abc, input); + hb_set_destroy (codepoints); + + hb_subset_test_check (face_a, face_abc_subset, HB_TAG ('g','l','y','f')); + hb_subset_test_check (face_a, face_abc_subset, HB_TAG ('l','o','c', 'a')); + check_maxp_num_glyphs(face_abc_subset, 2, true); + + hb_face_destroy (face_abc_subset); + hb_face_destroy (face_abc); + hb_face_destroy (face_a); +} + // TODO(grieger): test for long loca generation. int @@ -322,6 +346,7 @@ main (int argc, char **argv) hb_test_add (test_subset_glyf_with_gsub); hb_test_add (test_subset_glyf_without_gsub); hb_test_add (test_subset_glyf_retain_gids); + hb_test_add (test_subset_glyf_retain_gids_truncates); return hb_test_run(); } diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints-retain-gids.61.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints-retain-gids.61.ttf index 1a0d5bdd085330849db8bd8ab36627d1a2cd4c40..128eae01645604031f9a5fe2619c0339f481c2e1 100644 GIT binary patch delta 179 zcmaFCdWUs_xZ(i@28M*>+{6L~X~x$K3``0@enfg=aRCDdgD{YPVWNe6Vhm8wEF&W| zk!u(0A_fM=IY7QjMs7(3`!j}%K>idUpCczfIg!Bz$YNj&0TOJvi4_G5DhyA7d=nsF zAulmEm1#TIXP}`KK)yvmesRhFT!s`Nf5XHbjf_l_tr!(~fvSO$Ov*y+2mfxJoWp23 Pc_pI~Bh%(Hj53S>!xbuY delta 191 zcmcb^`hs+{6L~X~x$K3`{yeenfg=aRCDdgD{YPXQG9CVggXmEF&W| zk!u(0Vg?4r6+pg9Ms7(3`!j}%K>iFMpD!mrIgz1)!3M|=0rI(W6DtZB)EJ%u`6fWV zLSABSD${nZ&p<<4fP9OB{Nj@TxeO^l{+@|D8W~w8TQMpM+JFpTU<6_&Wg&LgKMyBo WFq*Ohxgaok4x=(7^X3DLGK>K9t}9{y diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints-retain-gids.62.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.drop-hints-retain-gids.62.ttf index 257184b921d6d2fd75aece3078232cc0ee06e89a..2d2b65b0d2ba55182f69c318c72a3d06ca15d7dd 100644 GIT binary patch delta 177 zcmX@XdVqC;xZ)B928M*>+{6L~8OHYv3`{IQenfg=aRCDdgD{Z4Wuk?Aq76{cEF&W| zk!u(0Vg?4r1|VN0Be$f2gOlL{kY57i^W@|wCjx05Am0Q?bL1vg6fmeVJO%PafP96# z#N1S-?OdOMhQq0(f|Me delta 185 zcmX@WdV+O=xZ)ZH28M*>+{6L~8OHYv3`{&genfg=aRCDdgD{Z4XQG9Cq61LSEF&W| zk!u(05(Wmw4j^A8Be$f2gOlL{kY54h3*_V{Co<>&Ap@fckk6HySW&>B#_$x#7Xk7W z@)C1XnYMF%1{#_I~o2L=YlJ?V+X1q>Vv!a(^iKzW|@oXWJYj*ogk_8%brl97^I!O68vb3_p)yO!6d-~0P)yH A`v3p{ delta 297 zcmZqRo4_|gyuO2hfgvF|H?e?0n(;LQ1Je&6KO(uTL_vE6`&Vv!VC=TEI@gl^qk7Hu#S&tC2viUP6CN705saMj&QV7P4zOsykVQ$&?+)1%b&COv;SRlWUmLIXQrC NX9bCEe!(Qc0sss*M&1Ab diff --git a/test/subset/data/expected/basics/Roboto-Regular.abc.retain-gids.62.ttf b/test/subset/data/expected/basics/Roboto-Regular.abc.retain-gids.62.ttf index 4ff6e338c3364cdbf3df4b6c8061b3fe7e3a1915..eb84f9c9f6476def8c8c9485cd25becc45c6067f 100644 GIT binary patch delta 242 zcmcb^dxdv`xT6mP14BY`Zejt04C8wS2BtkgenfIviGubD_PGoUY%)N8NLoR9ZuyUd z)eH>GA`A?Sd(sn&3m7;Ugn{xWCPv8DuK_9&$Vg30`IB|23aH=-kZ+a&6yVy$x)^Av z29U3kky}#1!O8Fe$Ojq9larsE2&ChI>hAz)j@-nG0w!Z-PLKsazCvDNZYtAuuFpVA z3V?izg8br=|G5k)K>iAld_hra!J@QZCxPa%T$uRdBqQ_WLyXGYj6gXiWue3y%OfX$ SVYHlV$fU%`yg7uag9QNJ5GG7Joid(sn&3m7;Ugn{xGCPv8DZviS2$Vg30`IB|23aH=(kZ+a&6yVy$x&&yb z0g$hfky}#1!O8Fe$X5WV&&f|tWQYes2F5!;K38sHMFEouGbhLbAYUObF*lWIJJ)BR zB^5xvML~XX$^Tr26d->CNWP#bwO~=&uaiLYSZ+-Gagvc`@*zfLexP{_j6lq!ER-m* Y?C0bUjF!wm?qm%nWk#0GK1>}f02Vtw-2eap