From 5dadbb0fa096574b6bccd75cced203baf615fedf Mon Sep 17 00:00:00 2001 From: Garret Rieger Date: Tue, 17 Apr 2018 07:00:23 -0600 Subject: [PATCH] [subset] Add implementation of cmap format 12 codepoint listing. (#988) --- src/hb-ot-cmap-table.hh | 21 ++++++++- .../api/fonts/Roboto-Regular.abc.format12.ttf | Bin 0 -> 2412 bytes test/api/test-subset-codepoints.c | 44 ++++++++++++++++++ 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 test/api/fonts/Roboto-Regular.abc.format12.ttf diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index c7c5d0a97..5e71eaba9 100644 --- a/src/hb-ot-cmap-table.hh +++ b/src/hb-ot-cmap-table.hh @@ -204,6 +204,8 @@ struct CmapSubtableLongGroup { friend struct CmapSubtableFormat12; friend struct CmapSubtableFormat13; + template + friend struct CmapSubtableLongSegmented; friend struct cmap; int cmp (hb_codepoint_t codepoint) const @@ -276,6 +278,15 @@ struct CmapSubtableLongSegmented return true; } + inline void get_all_codepoints (hb_set_t *out) const + { + for (unsigned int i = 0; i < this->groups.len; i++) { + hb_set_add_range (out, + this->groups[i].startCharCode, + this->groups[i].endCharCode); + } + } + inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); @@ -690,7 +701,7 @@ struct cmap break; case 12: this->get_glyph_func = get_glyph_from; - this->get_all_codepoints_func = null_get_all_codepoints_func; + this->get_all_codepoints_func = get_all_codepoints_from; break; case 4: { @@ -757,6 +768,14 @@ struct cmap return typed_obj->get_glyph (codepoint, glyph); } + template + static inline void get_all_codepoints_from (const void *obj, + hb_set_t *out) + { + const Type *typed_obj = (const Type *) obj; + typed_obj->get_all_codepoints (out); + } + template static inline bool get_glyph_from_symbol (const void *obj, hb_codepoint_t codepoint, diff --git a/test/api/fonts/Roboto-Regular.abc.format12.ttf b/test/api/fonts/Roboto-Regular.abc.format12.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5aa63341cd5824456e79ead1306982305e693a64 GIT binary patch literal 2412 zcmZuzeQaCR6+idAXXp8YiJYSZMoFQ1Lwge3K7h)Q5iQWVy>NjjdR(#F{Ng19k> zQv#w;D3r{!ltL$@GCDL(tn1KvZP=2mofK(B(?IRUhY&$x(j@+1sA!-uR65n(InPPc zqFw8rdw%DhbMEiln|E)30e};Q1ZsDvvkL;C0?4yyt?Lf=_M0tVokiH9!_ z{RZd57;|nkI-LX=ZpQo*IBy@Fcw{74{@F?NUqGM1v3O#(*eYRup&aLxvEgVu|8k-N zWBrJOV`#8_A-s<`j<{+pk(yOrVvFc6lmEnIEXsZb%b4#C#MVS~HYs?8?dU&;Slt^< z3=8wtf8+Wt#J43Ur&IX^U@rL{nomv*Cx0<=Ky#OYx<%FpPQ&tv6@jV!!WmcD>up6^?_x5%}2Sg!eh8)01(Fp;MnEjj_ zr8W~spn@nKhPX5c31oO!YC@KUEV9KUnM}B?H-=~_fhtLeMrX|+oo zi^jQBZHzcEoQ^cA9QyTflmohtcSO9`)Zs{^Ex;v8gAwSRj$ncZRubT7m>RDJxXIt6 zayke7FaB3_?Q?c_^goiByFzDOj%&DS_0*Zt$=1-3(@0OKafs)(^$bOUb+!4F!;Wq<9Y+`K<5HG5XMwEXg)6)G@s@}hLKQ!Tl_u! zdM8r!Aw{d7*L4QC&Cly`u=_K$Y)(!0>x&)u4aXK_m>bX+p-%if8S!!r$*OY;3hvvA zjjFuK&pYN8R2bAV^$_wdLcRET2<`R;4h@iHiqOEa4u*2x(biP$RX}cldA9BLO+FW@ z^MbzZwmL%-`+nG3T}C!(_mA2e){$lk`ZugAARrH%gK_A9Ocohyn8fM``yivBpAUq30@MCBd+Tk2z z;dwZZUas5_xP(_g6@6fn+Q20p0R_KFm$@8D+3VmiFF~<+*|-5HE5M_$%mO$HkjP&W zzmT>=1=PV~S$F+LhjR;eD_s2>aOl*zyV09*d$vXlAR&;PD*zAxf~??{Feqy?25xJ_ z@JtEg)&|}8vGrRN=l}3&B|>`Mq7hTxB6;o&Dw^V&8<}}Et^|wv<>D`tu+{I zX)bd+T<+59=HL%DYig;hOsrF^Prmuu1;+mQR_dYHp+8K&z3=RYQcccw@6WVjxi?a3 z-=W_<_v^Deqto&39WU!=f0--(sjeIu-1hfB-+MpRe0b${ErxY4l688#M9-;k5o?wk zjY{oUoPD)y5rMc`wi$t$$~MU&m2I`t!0k%LxmFGrm5h50Hr>ixg0`WyNOQC}f~wO| zO9d7=%37L(lKR=wg{0;5Vv?o*vH0Ro=EFPRdgi#`xSado*nTry{nK-~k8)Q{f4q1) z=RbWBZ)JQN#7lT$>!ByBR8->Pg_BZ{n6gS)Mj#{03|^+I2f<}3kt+&!k-U*0?Qcsl zk_5-*m2KB*j8niZ7q-TZ%V$jc-roCZ?!T$!R|X-U$Nv&Y$M?-><)}0K;VOom-Wci(C3Pz_!B&t$UH1%tC-%tH1b9ZL zh93maL^QP*Jb3S6!>oq?gTqsMag{ literal 0 HcmV?d00001 diff --git a/test/api/test-subset-codepoints.c b/test/api/test-subset-codepoints.c index c4f9c0ee6..3bd1fe062 100644 --- a/test/api/test-subset-codepoints.c +++ b/test/api/test-subset-codepoints.c @@ -48,12 +48,56 @@ test_get_all_codepoints_format4 (void) hb_face_destroy (face); } +static void +test_get_all_codepoints_format12 (void) +{ + hb_face_t *face = hb_subset_test_open_font("fonts/Roboto-Regular.abc.format12.ttf"); + hb_set_t *codepoints = hb_set_create(); + + hb_subset_get_all_codepoints (face, codepoints); + + hb_codepoint_t cp = HB_SET_VALUE_INVALID; + g_assert (hb_set_next (codepoints, &cp)); + g_assert_cmpuint (0x61, ==, cp); + g_assert (hb_set_next (codepoints, &cp)); + g_assert_cmpuint (0x62, ==, cp); + g_assert (hb_set_next (codepoints, &cp)); + g_assert_cmpuint (0x63, ==, cp); + g_assert (!hb_set_next (codepoints, &cp)); + + hb_set_destroy (codepoints); + hb_face_destroy (face); +} + +static void +test_get_all_codepoints (void) +{ + hb_face_t *face = hb_subset_test_open_font("fonts/Roboto-Regular.abc.ttf"); + hb_set_t *codepoints = hb_set_create(); + + hb_subset_get_all_codepoints (face, codepoints); + + hb_codepoint_t cp = HB_SET_VALUE_INVALID; + g_assert (hb_set_next (codepoints, &cp)); + g_assert_cmpuint (0x61, ==, cp); + g_assert (hb_set_next (codepoints, &cp)); + g_assert_cmpuint (0x62, ==, cp); + g_assert (hb_set_next (codepoints, &cp)); + g_assert_cmpuint (0x63, ==, cp); + g_assert (!hb_set_next (codepoints, &cp)); + + hb_set_destroy (codepoints); + hb_face_destroy (face); +} + int main (int argc, char **argv) { hb_test_init (&argc, &argv); + hb_test_add (test_get_all_codepoints); hb_test_add (test_get_all_codepoints_format4); + hb_test_add (test_get_all_codepoints_format12); return hb_test_run(); }