From c370da45ff0dd64c2868be313e640272931cffed Mon Sep 17 00:00:00 2001 From: Qunxin Liu Date: Wed, 22 Jan 2020 11:36:15 -0800 Subject: [PATCH] [subset] Cmap table: remove encodingRecord entry for empty cmap4 subtable --- src/hb-ot-cmap-table.hh | 10 +++++---- test/api/fonts/Roboto-Regular.empty.ttf | Bin 0 -> 1456 bytes test/api/test-subset-cmap.c | 21 ++++++++++++++++++ .../Mplus1p-Regular.default.25771.ttf | Bin 0 -> 1976 bytes .../Mplus1p-Regular.drop-hints.25771.ttf | Bin 0 -> 1248 bytes test/subset/data/tests/japanese.tests | 1 + 6 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 test/api/fonts/Roboto-Regular.empty.ttf create mode 100644 test/subset/data/expected/japanese/Mplus1p-Regular.default.25771.ttf create mode 100644 test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.25771.ttf diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index 13e8b3c2e..38dca26ba 100644 --- a/src/hb-ot-cmap-table.hh +++ b/src/hb-ot-cmap-table.hh @@ -238,16 +238,18 @@ struct CmapSubtableFormat4 void serialize (hb_serialize_context_t *c, Iterator it) { - unsigned table_initpos = c->length (); - if (unlikely (!c->extend_min (*this))) return; - this->format = 4; - auto format4_iter = + it | hb_filter ([&] (const hb_pair_t _) { return _.first <= 0xFFFF; }) ; + if (format4_iter.len () == 0) return; + + unsigned table_initpos = c->length (); + if (unlikely (!c->extend_min (*this))) return; + this->format = 4; + //serialize endCode[] HBUINT16 *endCode = serialize_endcode_array (c, format4_iter); if (unlikely (!endCode)) return; diff --git a/test/api/fonts/Roboto-Regular.empty.ttf b/test/api/fonts/Roboto-Regular.empty.ttf new file mode 100644 index 0000000000000000000000000000000000000000..fbd4fbac0327ff4bea25234f056c585b4168cb95 GIT binary patch literal 1456 zcmZuw&2Jl35TCcZ{@B=!?P97VOOjpOv`M_KLx`dhEY%1*ZHQ=0Y@yw%G&Z(lCyKFY zoHkT^81WUYpaF?fQHAKCLU7>4LW+ZW$RQU_2t*J44{|_)0|*qgF*9~rm5-6;H}jh} zGn)4_4;TP=pavpTW|HC2s{QS+Fme|)oh@Z5Xi?aC1Sxx|ss_JwTt}Wpo|>-|N|*mi ze~tWG)LVtjas{052!Kd+?!wY*^Jr1T24OK*T9qZqcEH`md?t5y@uw@uYj`|f#6ZV) zwl9$HAU|3xRaeCiA%}byxwKTyX3(ODuOmpM%xXn=LX?sJf?RziQ_2gUy1MYljr?S# zyj*RTs9uWEdF5iha$|n)d*m2nQy@z3vyTDiv0bx0iIM)c6@P?z0Sid~Urx`=oQ7x< z#SZ%b^Nwo*sK7p_Y-z&Ak*N5hB*SnWYGA=C{EU;Fg>&!$q~S#v6C!X6>TnfyFw4K6 z2EXtbsG4|yCI8n z7ebursv2L2ah48oLFa5(3vp3bC%HHVTZ1(p(<=$<1#JP-AerPGFQo{e# z>fu=0$DNm__LTkSE+(*E_kh?L7CLx|NMk?2zBM^%;UP!8*Y=1Wkhe9=1XiD^#&U6)Sa5 iAJr24O3>ejd2D literal 0 HcmV?d00001 diff --git a/test/api/test-subset-cmap.c b/test/api/test-subset-cmap.c index f9f8f5472..a6c24fccf 100644 --- a/test/api/test-subset-cmap.c +++ b/test/api/test-subset-cmap.c @@ -113,6 +113,26 @@ test_subset_cmap4_no_exceeding_maximum_codepoint (void) hb_face_destroy (face_origin); } +static void +test_subset_cmap_empty_tables (void) +{ + hb_face_t *face_abc = hb_test_open_font_file ("fonts/Roboto-Regular.abc.ttf"); + hb_face_t *face_empty = hb_test_open_font_file ("fonts/Roboto-Regular.empty.ttf"); + + hb_set_t *codepoints = hb_set_create (); + hb_face_t *face_abc_subset; + hb_set_add (codepoints, 100); + hb_set_add (codepoints, 101); + face_abc_subset = hb_subset_test_create_subset (face_abc, hb_subset_test_create_input (codepoints)); + hb_set_destroy (codepoints); + + hb_subset_test_check (face_empty, face_abc_subset, HB_TAG ('c','m','a','p')); + + hb_face_destroy (face_abc_subset); + hb_face_destroy (face_abc); + hb_face_destroy (face_empty); +} + // TODO(rsheeter) test cmap to no codepoints int @@ -124,6 +144,7 @@ main (int argc, char **argv) hb_test_add (test_subset_cmap_noop); hb_test_add (test_subset_cmap_non_consecutive_glyphs); hb_test_add (test_subset_cmap4_no_exceeding_maximum_codepoint); + hb_test_add (test_subset_cmap_empty_tables); return hb_test_run(); } diff --git a/test/subset/data/expected/japanese/Mplus1p-Regular.default.25771.ttf b/test/subset/data/expected/japanese/Mplus1p-Regular.default.25771.ttf new file mode 100644 index 0000000000000000000000000000000000000000..423b406e4c0e25d2639ce4fd34186d8747bd6e8a GIT binary patch literal 1976 zcmaJ?TWnNC82;z%6=>=9UR=~UoR$K6w(WN5g_Oe5)@^zVn}wFMwZv}Qr7hWZ*KTRJ zh#~O;IRc{TgP0hM@y3H;N=@Lw1dJxW;DaJyNQ^%CfDf8z;w?hgZ%$W5Vw}yH`M>}F z{@cu)J;aE}gUL>`b60JB)5zlQM9LVn1EW*%G!Bcg`z65;>j%UcE0p zK2`93?K`l4izhK2&!n?ivJttSh21@#JhboWy{8Wou{_{w6N&hk=fs&c-~v+P1QaV? zp)0^4;L3@q*@KSVv=z7+*quy`#%UiUV!vT>PQ?$VSt~pdM1$;Klw^v?**=zLq6Aso=dRL16R%=pIud61%^L4QI@90%Ro2&BgGVg>^Iq!6DFYvV%d0yY~?nu>aWGTSjJf7V4*4s0iTlJm0 z+uBm`Rhw)bso{;`;iZoTHaI#Q1wPi=(NFSR75a?I=osZeVtC51OV|fY(n{9eN{JP` zc5CnU@17{w`m^G*-I1p2^;_1;^;V(nT=vw`dB+iZ5YR1ka5-%AqKVO;KEuzEV!P(dXlwLRk#k zPWI?*1;vTUnVu_L?g>d?e z)|jO`8slFGR$Noz7fk23MV`+u6ul>EJf_7|zp&|(6{Zp6*R)V{8Oekzm#g!5Jt~r{ z()s6BJ9#><6)xY9!Fi_^j_>CN9~)T?A$j>SGg5Ptcbeh2W^z-r(rJRCh6sU){$yGa zN=N{o)mEm~n-!|+!H@)(M6427}*DHJ`>01DN@T73WT{hdhHVjWGG$K|$lk7=e$@QAV1dli-v zeUU;e)Yis&E_-N{tXY!#Q8_oGhBkugwKgvnrnO<`Ls8=*acUoJyT~}hBKW9SlUQq2 ziioAUfEN3L$&X8SnPs07>=g9~cf?p=>~w4)Ebof&;G&g8AsmZ6jDsCAVxq)Hl&#GE zqPUgY$`7O}hvfC8e0n4I{xIuZlW(VdgIqw%vW?bJK~A>c$8o?nkkdQC*oHTQ*;l~3 zm-=!tBM+U;$qKEe^Euguf4fUL*?u3#K@ZU%IlYq}VWoZPu3Z=>Lf!BlsVPF#xvAHEDUsEPuuPe?Oc6zKC*UpON3D{~Qe8O~rNx d-=ZzBGY{F0-#bf#wmaF4*#`Tf)cwnk{Rs*)v6cV; literal 0 HcmV?d00001 diff --git a/test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.25771.ttf b/test/subset/data/expected/japanese/Mplus1p-Regular.drop-hints.25771.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d735936169fe45e8ce1648c12d9542f2012b8e4c GIT binary patch literal 1248 zcmaJ>U27Cq7=F*0k6k~~-Hm3KHez?(e7Z@@>}EI08coa+K@tp_Y-p;OF;>LHxciGnw^~1En4>|1b!a8C9jt)+lG_m2jJekaqP&+ zgBOnjzr_8#kkh~NpSk=g5&IoHRe-SSDm_KMAH1P3T{)_Z&~|VyxYsZzbvgn>>^F4k zw0_j0Cbl2^K6tpOPv>Sciwp4o1Z~kW%N6?+#WB8^Pk0vfJwN*&gFgXpm_>a#!moqF zPbzV$x96l^r6_Hn4AHtoQuQ>axRZ^hCEHpfoQI=N#it63zi}lp{Z}r_j+*lc|YV6KwW5?Zl zrLLZ~y(7DJnfjW|QpTKU9hj*8l5J5kiZ8}`GNUB+iPIkx#9pm+7zDR5my35Pe9U*_ z_Q3;-hkV;#^O&?GTnq7S8$^5&kZ#%+s&mQ-IRPs6!D-B(2%PmIUrtn?(YSKOzVN1? zoLDiIm<5y0vCE_Yp5@}rpI?sb6={rnRlY{yoJ*X0MCsK|{pD^b77kOdjV2wiD>N=A zSnotFd-~^Ju8HAviG;PdM04hh$cT@9MCtybwidhQx0p^ zzFdCB&`VlJXG+VbcbjJ3$PJjqN;&N~G^^cpWOJqRlvxZr&K1w7pG>mo7?o&>@>HM- zh4B$|Vi_r*5hyvtA&Q|NhRdX{p-eiyKAJ%+Kr2z1I^eR%fL4ZA1KtN`9^4=u4h@b@ zRMnuRX*aS=AOoHOpdu=jq5oS$RA^sOBMY|}Ys$$Gqr9*A@jUDR{w$)|--&Phe;dR9 fhf7QN#<$@)^OJP??KK*gmh4tLDbEY-KY8pO%*5a& literal 0 HcmV?d00001 diff --git a/test/subset/data/tests/japanese.tests b/test/subset/data/tests/japanese.tests index b4fe387cf..d923491be 100644 --- a/test/subset/data/tests/japanese.tests +++ b/test/subset/data/tests/japanese.tests @@ -12,5 +12,6 @@ acek あいうえおか あいう珠度輸 𝜕𝟘AB +𥝱