From 68b03397a0872d10d3627cea2b92ae36bd59183c Mon Sep 17 00:00:00 2001 From: Radek Czajka Date: Mon, 18 Oct 2010 15:54:30 +0200 Subject: [PATCH] embed fonts in epub, stripped to used chars --- font-optimizer/.hg/00changelog.i | Bin 0 -> 57 bytes font-optimizer/.hg/branch | 1 + font-optimizer/.hg/branchheads.cache | 2 + font-optimizer/.hg/dirstate | Bin 0 -> 4501 bytes font-optimizer/.hg/hgrc | 2 + font-optimizer/.hg/requires | 3 + font-optimizer/.hg/store/00changelog.i | Bin 0 -> 6541 bytes font-optimizer/.hg/store/00manifest.i | Bin 0 -> 7321 bytes font-optimizer/.hg/store/data/.hgignore.i | Bin 0 -> 99 bytes .../.hg/store/data/_font/_e_o_t_wrapper.pm.i | Bin 0 -> 2657 bytes .../.hg/store/data/_font/_subsetter.pm.i | Bin 0 -> 20611 bytes .../_font/_subsetter/_normalization_data.pm.i | Bin 0 -> 13845 bytes .../data/_font/_subsetter/create-data.pl.i | Bin 0 -> 1430 bytes .../.hg/store/data/_l_i_c_e_n_s_e.i | Bin 0 -> 726 bytes .../.hg/store/data/_r_e_a_d_m_e.txt.i | Bin 0 -> 594 bytes .../.hg/store/data/convert-eot.pl.i | Bin 0 -> 579 bytes .../store/data/ext/_font-_t_t_f/.cvsignore.i | Bin 0 -> 81 bytes .../data/ext/_font-_t_t_f/_c_o_p_y_i_n_g.i | Bin 0 -> 3165 bytes .../store/data/ext/_font-_t_t_f/_changes.i | Bin 0 -> 222 bytes .../_font-_t_t_f/_m_a_n_i_f_e_s_t._s_k_i_p.i | Bin 0 -> 215 bytes .../data/ext/_font-_t_t_f/_makefile._p_l.i | Bin 0 -> 1497 bytes .../ext/_font-_t_t_f/_r_e_a_d_m_e._t_x_t.i | Bin 0 -> 1496 bytes .../store/data/ext/_font-_t_t_f/_t_o_d_o.i | Bin 0 -> 261 bytes .../ext/_font-_t_t_f/lib/_font/_t_t_f.pm.i | Bin 0 -> 490 bytes .../lib/_font/_t_t_f/_a_a_t_kern.pm.i | Bin 0 -> 1007 bytes .../lib/_font/_t_t_f/_a_a_tutils.pm.i | Bin 0 -> 3920 bytes .../lib/_font/_t_t_f/_anchor.pm.i | Bin 0 -> 1564 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_bsln.pm.i | Bin 0 -> 1226 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_changes.i | Bin 0 -> 1101 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_cmap.pm.i | Bin 0 -> 5070 bytes .../lib/_font/_t_t_f/_coverage.pm.i | Bin 0 -> 2543 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_cvt__.pm.i | Bin 0 -> 725 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_delta.pm.i | Bin 0 -> 1319 bytes .../lib/_font/_t_t_f/_dumper.pm.i | Bin 0 -> 1118 bytes .../lib/_font/_t_t_f/_e_b_d_t.pm.i | Bin 0 -> 2122 bytes .../lib/_font/_t_t_f/_e_b_l_c.pm.i | Bin 0 -> 1743 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_fdsc.pm.i | Bin 0 -> 865 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_feat.pm.i | Bin 0 -> 1413 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_fmtx.pm.i | Bin 0 -> 848 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_font.pm.i | Bin 0 -> 7998 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_fpgm.pm.i | Bin 0 -> 806 bytes .../lib/_font/_t_t_f/_g_d_e_f.pm.i | Bin 0 -> 2347 bytes .../lib/_font/_t_t_f/_g_p_o_s.pm.i | Bin 0 -> 4850 bytes .../lib/_font/_t_t_f/_g_s_u_b.pm.i | Bin 0 -> 2293 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_glyf.pm.i | Bin 0 -> 1258 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_glyph.pm.i | Bin 0 -> 6657 bytes .../lib/_font/_t_t_f/_gr_feat.pm.i | Bin 0 -> 1938 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_hdmx.pm.i | Bin 0 -> 1293 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_head.pm.i | Bin 0 -> 2251 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_hhea.pm.i | Bin 0 -> 1282 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_hmtx.pm.i | Bin 0 -> 1622 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_kern.pm.i | Bin 0 -> 2356 bytes .../lib/_font/_t_t_f/_kern/_class_array.pm.i | Bin 0 -> 1060 bytes .../_t_t_f/_kern/_compact_class_array.pm.i | Bin 0 -> 560 bytes .../lib/_font/_t_t_f/_kern/_ordered_list.pm.i | Bin 0 -> 879 bytes .../lib/_font/_t_t_f/_kern/_state_table.pm.i | Bin 0 -> 1078 bytes .../lib/_font/_t_t_f/_kern/_subtable.pm.i | Bin 0 -> 1213 bytes .../lib/_font/_t_t_f/_l_t_s_h.pm.i | Bin 0 -> 708 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_loca.pm.i | Bin 0 -> 1789 bytes .../lib/_font/_t_t_f/_manual.pod.i | Bin 0 -> 3830 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_maxp.pm.i | Bin 0 -> 1539 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_mort.pm.i | Bin 0 -> 780 bytes .../lib/_font/_t_t_f/_mort/_chain.pm.i | Bin 0 -> 1528 bytes .../lib/_font/_t_t_f/_mort/_contextual.pm.i | Bin 0 -> 1342 bytes .../lib/_font/_t_t_f/_mort/_insertion.pm.i | Bin 0 -> 1481 bytes .../lib/_font/_t_t_f/_mort/_ligature.pm.i | Bin 0 -> 2071 bytes .../_font/_t_t_f/_mort/_noncontextual.pm.i | Bin 0 -> 771 bytes .../_font/_t_t_f/_mort/_rearrangement.pm.i | Bin 0 -> 899 bytes .../lib/_font/_t_t_f/_mort/_subtable.pm.i | Bin 0 -> 1452 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_name.pm.i | Bin 0 -> 9792 bytes .../lib/_font/_t_t_f/_o_s__2.pm.i | Bin 0 -> 2880 bytes .../lib/_font/_t_t_f/_o_t_tags.pm.i | Bin 0 -> 6368 bytes .../lib/_font/_t_t_f/_old_cmap.pm.i | Bin 0 -> 2925 bytes .../lib/_font/_t_t_f/_old_mort.pm.i | Bin 0 -> 4892 bytes .../lib/_font/_t_t_f/_p_c_l_t.pm.i | Bin 0 -> 1082 bytes .../lib/_font/_t_t_f/_p_s_names.pm.i | Bin 0 -> 28095 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_post.pm.i | Bin 0 -> 3337 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_prep.pm.i | Bin 0 -> 770 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_prop.pm.i | Bin 0 -> 1251 bytes .../lib/_font/_t_t_f/_segarr.pm.i | Bin 0 -> 2556 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_sill.pm.i | Bin 0 -> 1129 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_table.pm.i | Bin 0 -> 3265 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_ttc.pm.i | Bin 0 -> 1659 bytes .../lib/_font/_t_t_f/_ttopen.pm.i | Bin 0 -> 9985 bytes .../lib/_font/_t_t_f/_useall.pm.i | Bin 0 -> 381 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_utils.pm.i | Bin 0 -> 5841 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_vhea.pm.i | Bin 0 -> 1300 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_vmtx.pm.i | Bin 0 -> 780 bytes .../_font-_t_t_f/lib/_font/_t_t_f/_win32.pm.i | Bin 0 -> 531 bytes .../lib/_font/_t_t_f/_x_m_lparse.pm.i | Bin 0 -> 1978 bytes .../data/ext/_font-_t_t_f/lib/ttfmod.pl.i | Bin 0 -> 2361 bytes .../data/ext/_font-_t_t_f/t/_o_f_l.txt.i | Bin 0 -> 2058 bytes .../store/data/ext/_font-_t_t_f/t/tags.t.i | Bin 0 -> 285 bytes .../data/ext/_font-_t_t_f/t/testfont.ttf.i | Bin 0 -> 18700 bytes .../store/data/ext/_font-_t_t_f/t/ttfcopy.t.i | Bin 0 -> 279 bytes font-optimizer/.hg/store/data/gen-tests.pl.i | Bin 0 -> 3373 bytes .../.hg/store/data/list-features.pl.i | Bin 0 -> 569 bytes .../.hg/store/data/modify-names.pl.i | Bin 0 -> 1975 bytes .../.hg/store/data/obfuscate-font.pl.i | Bin 0 -> 1432 bytes .../.hg/store/data/obfuscate-names.pl.i | Bin 0 -> 1147 bytes font-optimizer/.hg/store/data/subset.pl.i | Bin 0 -> 3010 bytes .../.hg/store/data/t/subsetter.pl.i | Bin 0 -> 616 bytes font-optimizer/.hg/store/fncache | 94 + font-optimizer/.hg/store/undo | Bin 0 -> 3869 bytes font-optimizer/.hg/tags.cache | 2 + font-optimizer/.hg/undo.branch | 1 + font-optimizer/.hg/undo.desc | 3 + font-optimizer/.hg/undo.dirstate | 0 font-optimizer/.hgignore | 4 + font-optimizer/Font/EOTWrapper.pm | 141 + font-optimizer/Font/Subsetter.pm | 1606 ++++++ .../Font/Subsetter/NormalizationData.pm | 1377 +++++ font-optimizer/Font/Subsetter/create-data.pl | 100 + font-optimizer/LICENSE | 21 + font-optimizer/README.txt | 23 + font-optimizer/convert-eot.pl | 62 + font-optimizer/ext/Font-TTF/.cvsignore | 2 + font-optimizer/ext/Font-TTF/COPYING | 76 + font-optimizer/ext/Font-TTF/Changes | 6 + font-optimizer/ext/Font-TTF/MANIFEST.SKIP | 26 + font-optimizer/ext/Font-TTF/Makefile.PL | 108 + font-optimizer/ext/Font-TTF/README.TXT | 99 + font-optimizer/ext/Font-TTF/TODO | 5 + font-optimizer/ext/Font-TTF/lib/Font/TTF.pm | 24 + .../ext/Font-TTF/lib/Font/TTF/AATKern.pm | 140 + .../ext/Font-TTF/lib/Font/TTF/AATutils.pm | 689 +++ .../ext/Font-TTF/lib/Font/TTF/Anchor.pm | 216 + .../ext/Font-TTF/lib/Font/TTF/Bsln.pm | 163 + .../ext/Font-TTF/lib/Font/TTF/Changes | 108 + .../ext/Font-TTF/lib/Font/TTF/Cmap.pm | 612 +++ .../ext/Font-TTF/lib/Font/TTF/Coverage.pm | 323 ++ .../ext/Font-TTF/lib/Font/TTF/Cvt_.pm | 81 + .../ext/Font-TTF/lib/Font/TTF/Delta.pm | 173 + .../ext/Font-TTF/lib/Font/TTF/Dumper.pm | 79 + .../ext/Font-TTF/lib/Font/TTF/EBDT.pm | 285 ++ .../ext/Font-TTF/lib/Font/TTF/EBLC.pm | 228 + .../ext/Font-TTF/lib/Font/TTF/Fdsc.pm | 125 + .../ext/Font-TTF/lib/Font/TTF/Feat.pm | 191 + .../ext/Font-TTF/lib/Font/TTF/Fmtx.pm | 108 + .../ext/Font-TTF/lib/Font/TTF/Font.pm | 767 +++ .../ext/Font-TTF/lib/Font/TTF/Fpgm.pm | 87 + .../ext/Font-TTF/lib/Font/TTF/GDEF.pm | 313 ++ .../ext/Font-TTF/lib/Font/TTF/GPOS.pm | 701 +++ .../ext/Font-TTF/lib/Font/TTF/GSUB.pm | 246 + .../ext/Font-TTF/lib/Font/TTF/Glyf.pm | 158 + .../ext/Font-TTF/lib/Font/TTF/Glyph.pm | 847 ++++ .../ext/Font-TTF/lib/Font/TTF/GrFeat.pm | 249 + .../ext/Font-TTF/lib/Font/TTF/Hdmx.pm | 149 + .../ext/Font-TTF/lib/Font/TTF/Head.pm | 250 + .../ext/Font-TTF/lib/Font/TTF/Hhea.pm | 159 + .../ext/Font-TTF/lib/Font/TTF/Hmtx.pm | 214 + .../ext/Font-TTF/lib/Font/TTF/Kern.pm | 296 ++ .../Font-TTF/lib/Font/TTF/Kern/ClassArray.pm | 153 + .../lib/Font/TTF/Kern/CompactClassArray.pm | 93 + .../Font-TTF/lib/Font/TTF/Kern/OrderedList.pm | 108 + .../Font-TTF/lib/Font/TTF/Kern/StateTable.pm | 143 + .../Font-TTF/lib/Font/TTF/Kern/Subtable.pm | 175 + .../ext/Font-TTF/lib/Font/TTF/LTSH.pm | 88 + .../ext/Font-TTF/lib/Font/TTF/Loca.pm | 183 + .../ext/Font-TTF/lib/Font/TTF/Manual.pod | 214 + .../ext/Font-TTF/lib/Font/TTF/Maxp.pm | 177 + .../ext/Font-TTF/lib/Font/TTF/Mort.pm | 108 + .../ext/Font-TTF/lib/Font/TTF/Mort/Chain.pm | 196 + .../Font-TTF/lib/Font/TTF/Mort/Contextual.pm | 157 + .../Font-TTF/lib/Font/TTF/Mort/Insertion.pm | 179 + .../Font-TTF/lib/Font/TTF/Mort/Ligature.pm | 246 + .../lib/Font/TTF/Mort/Noncontextual.pm | 95 + .../lib/Font/TTF/Mort/Rearrangement.pm | 107 + .../Font-TTF/lib/Font/TTF/Mort/Subtable.pm | 200 + .../ext/Font-TTF/lib/Font/TTF/Name.pm | 782 +++ .../ext/Font-TTF/lib/Font/TTF/OS_2.pm | 354 ++ .../ext/Font-TTF/lib/Font/TTF/OTTags.pm | 706 +++ .../ext/Font-TTF/lib/Font/TTF/OldCmap.pm | 358 ++ .../ext/Font-TTF/lib/Font/TTF/OldMort.pm | 706 +++ .../ext/Font-TTF/lib/Font/TTF/PCLT.pm | 121 + .../ext/Font-TTF/lib/Font/TTF/PSNames.pm | 4447 +++++++++++++++++ .../ext/Font-TTF/lib/Font/TTF/Post.pm | 306 ++ .../ext/Font-TTF/lib/Font/TTF/Prep.pm | 89 + .../ext/Font-TTF/lib/Font/TTF/Prop.pm | 154 + .../ext/Font-TTF/lib/Font/TTF/Segarr.pm | 376 ++ .../ext/Font-TTF/lib/Font/TTF/Sill.pm | 114 + .../ext/Font-TTF/lib/Font/TTF/Table.pm | 382 ++ .../ext/Font-TTF/lib/Font/TTF/Ttc.pm | 164 + .../ext/Font-TTF/lib/Font/TTF/Ttopen.pm | 1223 +++++ .../ext/Font-TTF/lib/Font/TTF/Useall.pm | 54 + .../ext/Font-TTF/lib/Font/TTF/Utils.pm | 630 +++ .../ext/Font-TTF/lib/Font/TTF/Vhea.pm | 159 + .../ext/Font-TTF/lib/Font/TTF/Vmtx.pm | 86 + .../ext/Font-TTF/lib/Font/TTF/Win32.pm | 33 + .../ext/Font-TTF/lib/Font/TTF/XMLparse.pm | 176 + font-optimizer/ext/Font-TTF/lib/ttfmod.pl | 174 + font-optimizer/ext/Font-TTF/t/OFL.txt | 94 + font-optimizer/ext/Font-TTF/t/tags.t | 11 + font-optimizer/ext/Font-TTF/t/testfont.ttf | Bin 0 -> 35624 bytes font-optimizer/ext/Font-TTF/t/ttfcopy.t | 15 + font-optimizer/gen-tests.pl | 235 + font-optimizer/list-features.pl | 52 + font-optimizer/modify-names.pl | 209 + font-optimizer/obfuscate-font.pl | 114 + font-optimizer/subset.pl | 131 + font-optimizer/t/subsetter.pl | 47 + librarian/epub.py | 55 +- librarian/epub/style.css | 28 +- librarian/fonts/DejaVuSerif-Bold.ttf | Bin 0 -> 307596 bytes librarian/fonts/DejaVuSerif-BoldItalic.ttf | Bin 0 -> 295360 bytes librarian/fonts/DejaVuSerif-Italic.ttf | Bin 0 -> 303004 bytes librarian/fonts/DejaVuSerif.ttf | Bin 0 -> 330052 bytes 207 files changed, 26941 insertions(+), 11 deletions(-) create mode 100644 font-optimizer/.hg/00changelog.i create mode 100644 font-optimizer/.hg/branch create mode 100644 font-optimizer/.hg/branchheads.cache create mode 100644 font-optimizer/.hg/dirstate create mode 100644 font-optimizer/.hg/hgrc create mode 100644 font-optimizer/.hg/requires create mode 100644 font-optimizer/.hg/store/00changelog.i create mode 100644 font-optimizer/.hg/store/00manifest.i create mode 100644 font-optimizer/.hg/store/data/.hgignore.i create mode 100644 font-optimizer/.hg/store/data/_font/_e_o_t_wrapper.pm.i create mode 100644 font-optimizer/.hg/store/data/_font/_subsetter.pm.i create mode 100644 font-optimizer/.hg/store/data/_font/_subsetter/_normalization_data.pm.i create mode 100644 font-optimizer/.hg/store/data/_font/_subsetter/create-data.pl.i create mode 100644 font-optimizer/.hg/store/data/_l_i_c_e_n_s_e.i create mode 100644 font-optimizer/.hg/store/data/_r_e_a_d_m_e.txt.i create mode 100644 font-optimizer/.hg/store/data/convert-eot.pl.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/.cvsignore.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/_c_o_p_y_i_n_g.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/_changes.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/_m_a_n_i_f_e_s_t._s_k_i_p.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/_makefile._p_l.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/_r_e_a_d_m_e._t_x_t.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/_t_o_d_o.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_a_a_t_kern.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_a_a_tutils.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_anchor.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_bsln.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_changes.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_cmap.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_coverage.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_cvt__.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_delta.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_dumper.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_e_b_d_t.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_e_b_l_c.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_fdsc.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_feat.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_fmtx.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_font.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_fpgm.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_g_d_e_f.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_g_p_o_s.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_g_s_u_b.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_glyf.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_glyph.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_gr_feat.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_hdmx.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_head.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_hhea.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_hmtx.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_kern.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_kern/_class_array.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_kern/_compact_class_array.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_kern/_ordered_list.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_kern/_state_table.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_kern/_subtable.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_l_t_s_h.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_loca.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_manual.pod.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_maxp.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_mort.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_mort/_chain.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_mort/_contextual.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_mort/_insertion.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_mort/_ligature.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_mort/_noncontextual.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_mort/_rearrangement.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_mort/_subtable.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_name.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_o_s__2.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_o_t_tags.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_old_cmap.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_old_mort.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_p_c_l_t.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_p_s_names.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_post.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_prep.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_prop.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_segarr.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_sill.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_table.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_ttc.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_ttopen.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_useall.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_utils.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_vhea.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_vmtx.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_win32.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_x_m_lparse.pm.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/ttfmod.pl.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/t/_o_f_l.txt.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/t/tags.t.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/t/testfont.ttf.i create mode 100644 font-optimizer/.hg/store/data/ext/_font-_t_t_f/t/ttfcopy.t.i create mode 100644 font-optimizer/.hg/store/data/gen-tests.pl.i create mode 100644 font-optimizer/.hg/store/data/list-features.pl.i create mode 100644 font-optimizer/.hg/store/data/modify-names.pl.i create mode 100644 font-optimizer/.hg/store/data/obfuscate-font.pl.i create mode 100644 font-optimizer/.hg/store/data/obfuscate-names.pl.i create mode 100644 font-optimizer/.hg/store/data/subset.pl.i create mode 100644 font-optimizer/.hg/store/data/t/subsetter.pl.i create mode 100644 font-optimizer/.hg/store/fncache create mode 100644 font-optimizer/.hg/store/undo create mode 100644 font-optimizer/.hg/tags.cache create mode 100644 font-optimizer/.hg/undo.branch create mode 100644 font-optimizer/.hg/undo.desc create mode 100644 font-optimizer/.hg/undo.dirstate create mode 100644 font-optimizer/.hgignore create mode 100644 font-optimizer/Font/EOTWrapper.pm create mode 100644 font-optimizer/Font/Subsetter.pm create mode 100644 font-optimizer/Font/Subsetter/NormalizationData.pm create mode 100644 font-optimizer/Font/Subsetter/create-data.pl create mode 100644 font-optimizer/LICENSE create mode 100644 font-optimizer/README.txt create mode 100755 font-optimizer/convert-eot.pl create mode 100644 font-optimizer/ext/Font-TTF/.cvsignore create mode 100644 font-optimizer/ext/Font-TTF/COPYING create mode 100644 font-optimizer/ext/Font-TTF/Changes create mode 100644 font-optimizer/ext/Font-TTF/MANIFEST.SKIP create mode 100644 font-optimizer/ext/Font-TTF/Makefile.PL create mode 100644 font-optimizer/ext/Font-TTF/README.TXT create mode 100644 font-optimizer/ext/Font-TTF/TODO create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/AATKern.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/AATutils.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Anchor.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Bsln.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Changes create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Cmap.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Coverage.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Cvt_.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Delta.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Dumper.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/EBDT.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/EBLC.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Fdsc.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Feat.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Fmtx.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Font.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Fpgm.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/GDEF.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/GPOS.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/GSUB.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Glyf.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Glyph.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/GrFeat.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Hdmx.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Head.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Hhea.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Hmtx.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Kern.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Kern/ClassArray.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Kern/CompactClassArray.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Kern/OrderedList.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Kern/StateTable.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Kern/Subtable.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/LTSH.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Loca.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Manual.pod create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Maxp.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Chain.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Contextual.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Insertion.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Ligature.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Noncontextual.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Rearrangement.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Subtable.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Name.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/OS_2.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/OTTags.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/OldCmap.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/OldMort.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/PCLT.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/PSNames.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Post.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Prep.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Prop.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Segarr.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Sill.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Table.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Ttc.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Ttopen.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Useall.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Utils.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Vhea.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Vmtx.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/Win32.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/Font/TTF/XMLparse.pm create mode 100644 font-optimizer/ext/Font-TTF/lib/ttfmod.pl create mode 100644 font-optimizer/ext/Font-TTF/t/OFL.txt create mode 100644 font-optimizer/ext/Font-TTF/t/tags.t create mode 100644 font-optimizer/ext/Font-TTF/t/testfont.ttf create mode 100644 font-optimizer/ext/Font-TTF/t/ttfcopy.t create mode 100644 font-optimizer/gen-tests.pl create mode 100755 font-optimizer/list-features.pl create mode 100755 font-optimizer/modify-names.pl create mode 100755 font-optimizer/obfuscate-font.pl create mode 100755 font-optimizer/subset.pl create mode 100644 font-optimizer/t/subsetter.pl create mode 100644 librarian/fonts/DejaVuSerif-Bold.ttf create mode 100644 librarian/fonts/DejaVuSerif-BoldItalic.ttf create mode 100644 librarian/fonts/DejaVuSerif-Italic.ttf create mode 100644 librarian/fonts/DejaVuSerif.ttf diff --git a/font-optimizer/.hg/00changelog.i b/font-optimizer/.hg/00changelog.i new file mode 100644 index 0000000000000000000000000000000000000000..d3a8311050e54c57c5be7cfe169e60a95768812c GIT binary patch literal 57 zcmWN_K?=Yi38!fY?&IW0yE~64i;V+I_I9Cid8|uszmzQYCx=OIG{| zE0%l#zrjZUW49aI*SB(3iF41~$DDia_1(qpkG;XKuen%SBzY1Xw@wcmW{YUi2z(9 z7|V4@m;;zcl}M)KGYz7cDz;evy4=eaXy+54lihJtTD~rVD z(2($s{Veq{4QXEYa=#LdP({%dqHcwV=#a*O0Hu9bIk-Z!vP{l$E?RE(stO-cnSGH> zLQ|;i5ssfu&5ZCI;#03Z;F3=k_bI2o8RZ>)YV4eH5<)(oG<*sXNL>NsaIprc^9cPE>I%DAWZiO`M37QK?*`Al4aFAS1losS|YqZYLQCBiOoRjAdNm;Ch*`!@|QB+ed#z} zP^gKwt2Yf01xeRr9&{#x&}#E3X$khCIzg~rnNNA~=OO5RXQdDH~Ljr_^VRHsGa&_n`-gyqMGswx>xi|yJiQI%-+Oh=z zsjB|8Kbsi3<0{U<#I6$uiDxv_4dC#rb}DoqLS)5?{bJ4l9LC?H1Rl%Q&2Im_{9R>zT`cq$){zQN;f{V&=E;>O49O0g!vu%%yQ25WJUi2i7N)k literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/hgrc b/font-optimizer/.hg/hgrc new file mode 100644 index 0000000..5945460 --- /dev/null +++ b/font-optimizer/.hg/hgrc @@ -0,0 +1,2 @@ +[paths] +default = http://bitbucket.org/philip/font-optimizer diff --git a/font-optimizer/.hg/requires b/font-optimizer/.hg/requires new file mode 100644 index 0000000..5175383 --- /dev/null +++ b/font-optimizer/.hg/requires @@ -0,0 +1,3 @@ +revlogv1 +store +fncache diff --git a/font-optimizer/.hg/store/00changelog.i b/font-optimizer/.hg/store/00changelog.i new file mode 100644 index 0000000000000000000000000000000000000000..589167b1fc2df728c5edc96033eb3bb0e0778103 GIT binary patch literal 6541 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 literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/_font/_subsetter.pm.i b/font-optimizer/.hg/store/data/_font/_subsetter.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..5d17c4e0fadbd4c76c5799f128e0945c087da903 GIT binary patch literal 20611 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 literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/_font/_subsetter/create-data.pl.i b/font-optimizer/.hg/store/data/_font/_subsetter/create-data.pl.i new file mode 100644 index 0000000000000000000000000000000000000000..5ba74517d9dbfc842d449ce3573e32d9646811c3 GIT binary patch literal 1430 zcmV;H1!?*K0RRC200000009&L00Dmh0000000092|NsC0|Ns9FtVGsg=WV8(`ty=( zi}46IKtI?300000000000001ZoNbU#OT$1A#qawmrXi37maHBEB^#v&?NJZnsZGl^ znYOFRZrDFGD*D;oHhK}~G6V1Nd(86|!8#)w$B7U3Nf;&7!E!qQ$}a04j`WJ2_S3i>yQ_Y@N5 ztzn(qu>nn2up*!5bLN$7v_bZK-YuR(ayPmJw1HM4#4}D#N7*5yRlL8=;DbPzz+5yT z#}1uzz&N82Z}~-1I6CmELu(;!Rz(d$wLjPF3)rS&lX2=GT16CIv{Y$A6AHZ;;D}=y zZ!`K!hd_@4;HsW5QIMjVu2saz=btXKQ0_IqeE$tgW^xw*000016aWAK00aU601NB@ z00000000dD00030|Ns9$LO2Sr?=_uWgxyI)Iq~4krG&cx00000000000001ZoW)k# zj@vd6^*$BQ9~6C=XjMo;w05@X)4IC|kYa(nqMvR{Nm!RthcNXKl7#I;Nq`# zRHyJ=qpL=PP#4ZAz-k`>i{dDm&*$q1pX_p8bI>^l0;;4aHSE#aJbHWm8cK`Iw2&pp zjag8-7G>5VInMR~uTrL28~YDCegwQu;aZd_Bsr^DqIs<_ph$8^SSc}gRul(Fc_O!! z#Bze2(7D8HS$S|;cUr>Gu_%N-fMyxE-)yA3azl)Df<&C8v)O0A8S6W9Z~eZnsS;CH z7aLJi5L&^O?ZuWtpY@^Bp?npMV1%jn05w1Bl0*}UFuf5~zlTdu6{ZM_Mf6BlaC-f1 zkmNPwd=Fl-da(|dJwnx}yk#(gRc{bso)ySCjSzp`8`FhZJs#tA@Dr8*zE3_O@b@r@ z*@iqimfLqVGAdz19YQ)lVyU(5EeU{W>J!975@`fgF_77mDc&*Ug++VQO2d-dcU2hO zpsUN`#EoEwCL+rdpwlc)1DpVfnTTA2Mbgd-4|LtyKV*-nC2`|HuA`v?9u)ki6 z0}HxrBMljlr2;N8NpBNG;pNo@HbtWghj zBNb`sqwHi+unIRD|G?`5Di04Ev+oqniqW1{QL9UPAmOZ(noRLjQyL#V2vzdEraomg zub|*%rgM093Fow9o=9wT;-!)+N|16j3DH{0m8kjXl#B3u@INw@rYyKp|71T;^L;m^ zBang_@}S>!;O@BmHE>lT)wyzmPbjoyhwcB<*aNjI2`sKBi6j z|Iq%Y3GzSC%)hRNtEm`L!NI+0m$Z}+i_GobMEL&B+A(`snOAmGiuVD9c31A4Dhd3E zN)9hcNnhWq@+xGo14_{gdgs(|1H%;(^p-pA?UmweY{N59L*47wbLfZf%UDi<3a zbXJiOUBZJ77o{g6I1j_AUtdMH`#O8tcOBUHL&bL6+-t6zx-h>X#O+(^b literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/_l_i_c_e_n_s_e.i b/font-optimizer/.hg/store/data/_l_i_c_e_n_s_e.i new file mode 100644 index 0000000000000000000000000000000000000000..d0cc9aa675514851f82e4b132f3877055dd38098 GIT binary patch literal 726 zcmV;{0xA6f0RRC20000000Nc(00dM30000000030|NsC0|NsBY54(9nUgToAQf1Ls zsD?%+ku9O0z57>;IPFR)ta@v22FzkLB#~p5atw(f zu0kByrig#vnZWL9D@BUtdFFl0v@s4pXS3_|I(38TgS+_JOr1Z?I$L9H!t8A0w?{D@ z+JUi!8*bj7+6YheGkkw}`2j_1J3D}`Zk_Xt6~>=!2-fvr1GL7Q!wpWp>Z55AIC^8i z9ieV3e=-R~2UUNA!T5j!?hq^6+x`R<)TqR;Gqy+*+%aA&Z?L(6Dg;;C3i+UM_2q2( zSVhu1+Rg-cimic3`IwkIk0On!I%a#IxA!Nw+Ss~F1aCt0wkD1QY+rYmhCIAKcNW)h zSD^7Reqcy?37CL@Y*={klC7JZLd zKi!QzWPPB8#>a{RA=lQOzb3JP9WTB|Ni)tg4p%lR{xNkVgxZg;>)e&1)vj+WB?>!++Q!d})xqHWsP})& zDeA8Ul=({UxDp^sC{+F?mtqMMUSd5-U?=rD-)g`P#WTH!d<8t)!!MaF6A-@(CCUKsV$K_x{=WE-ItYb^O(rc&<{wvsv{&Q-2} zL&24ni*3pk6kAo~r9k;5(q=MSDO3>~k?AR_A_n3O3n&azEg zTx3b3=p^3PkFs5OEl(0n@;yF1!*dJ*FG*;mzsRQg{4OeEzTp*pOxQs)!>c1t3C?!* zk>L^VZRGrA7%lm_jpLIsXNREI0BPbBGeYb^9A!uxe`714M~UTjr4GTu&CVs!#&AUz zIG>-PCyyB@NHlr0-Xm`*aaKyD6o44~to?avGRg|0XiNhI>mM=ojVv(m4%VUZfZ>AX~w0wbHuFvXA)wa{i_C z(l+DWi2v2ptClW(>%cmB*rNix+c9~CYnhV3DpnD59Y`A}-sK1%qBQFgD)?TkVpE?XZ?nxofF< zqp-hW1IwEhOaUj7PRC=fbaI^*AJ{a{2toe2t zQN1UHhuU9XTE&O2uRqjf#S5e;w)C0?QAuDHrK82_@?v(jVOV~Mg~S1xN#N$RQX6lP gFS#7Di<8%%4WYNB0veToY~yi($Wo5=Ke;YJ8?s<-`#h%-@i*cqti;rwB@>CtTP-8YO%rG-JeP= zh1{Clry5bggg;|CR}z!ua-LFT;-NN_WfaRYdkup(i{%epwj|N>+;UVcCB7=TrO>Vv zavIacbQS#MO$&b*&}p@h2v=7(i+RqjmHfpuLdEfka|xsbrF;Y;pTYE6?OM%^;VxjH z)EuNjFkRa!jr?&IGxpt-Tb>bhbO|eJKqzS*U?pVRVJ#X?ch%wWz}Uh=Y(ES11G<6vvq1Qev%R;%`qEpm`wbBhREpdy z;4(i1iGPi1O=@F|9&C(Km~oMCIbkPC?XcHC1;lepR*ENTLeO}SSi zkdJ#G?HNSueLq&)*X2J7>L+9fDV*Ba8Wevay`QZVK42ZC!m9_}_5fm|Y)E8Js9D(c z4~aeS#+;Y(OfTsi8aa^~=Q$(AkIQ MpQoE^a0o9K0A0Nn7ytkO literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/_c_o_p_y_i_n_g.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/_c_o_p_y_i_n_g.i new file mode 100644 index 0000000000000000000000000000000000000000..d0f0482e5da8193d6f38d3f1226f9d462956dae9 GIT binary patch literal 3165 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 DZl@*) literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/_changes.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/_changes.i new file mode 100644 index 0000000000000000000000000000000000000000..e022e4af990876315bb8c0e181dbf5365c95edc8 GIT binary patch literal 222 zcmZQzWME`~fO$Y_CzQ?j9}1G@oxUi);H)Jt@9)qbJU@Q0m&(aP)qtsrIikH6xeh5v zxV^9KdcR32}##;Vn&SJ4C F1pt%bU6=p> literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/_m_a_n_i_f_e_s_t._s_k_i_p.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/_m_a_n_i_f_e_s_t._s_k_i_p.i new file mode 100644 index 0000000000000000000000000000000000000000..57b5f9dfccbd35f8e94410e407b87f8ca9ea926f GIT binary patch literal 215 zcmZQzWME`~faySLFO<#r9}0floX;M?A8D|t{h-E)mRrR-OajGFHDIb@j%uGb*I@%5 zm+!mWHka16m)#9rxO&2a_@<8fh%U|8FK?!5HaTA6>E9^0w(X~te{#yh5ZASq5B^p0 zwfjo%s(11JGGW4;w%eT-vpL>7C_k}!IM17VL(G#U^Gt2d2%7aI2CU8$)<~NCip4I% xL}*3k(@jyC44=#Q>}LD@yh=svgVMb)BW=TzrfYgsS8F{LiCxF0sw-oSf&5~ literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/_makefile._p_l.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/_makefile._p_l.i new file mode 100644 index 0000000000000000000000000000000000000000..e0087070b97c47aee3d6a1dc02f440e49aac1144 GIT binary patch literal 1497 zcmV;~1t$6c0RRC20000000o%<01FcU0000000061|NsC0|NsB6O78r?NT-iuvVZxB6>okc%b2QKOzr(A@(~1s8ReYC%JeRLyS3M*9cK~o zKE0DX)UlA538`~12QnOtug-dZFH%xbo`Kt!m=ksfE(LS((;k_Y{l0fO{CIZIKXyi@ zV-jc_jnnfSU0_90>I_5sQF7X(0wf3!5wg2temuUo>S*#1bClnMCD9ja+{GVzKZHN>FvFJbO=X^8aut;*X#5jJ zAf6?WHdYq!R|D(BH(PgI9$oa#hfiF$_x~>w5og#Q%^ID9tKrGuLI<3OT(V-Ux`Gy? zeZexXHd-~}m=LY)X2yPeVk zZYkWNNvuFk_TZq1S9%RF0i1?0Hb{2wp-vddI?S^BUAz@}`1fxuB!m!^)xEl1ITMvJ zg@l*+a)eRUGySoS1SE?YjnP(Jfvx)Tt}1at$Z#SY2=R7hBBm8BVp>FKw19;>=t*AA zP*v2Etu}7^RFwo4P=ZA$rYw=&mTFsJEz6j3N0q0NaNk9tM1oB$yLWau9Ah;*WS1y8 z(l#!qvgQT6eQO>Mh9>4^eO~}0%f<%Qs^@*j7|GV`{A_T1bTVj=e|~&%>cGf!d!zP} zgNvh+)83it<41ILxgw3wPD@wHt^DDJxF)wGx4)i9y+TOL%fbYXkCC}{)}G^F`mB`u zWAyn@segfH7swJ8@^k>h!PU_TMquq5211}_PGita{QMrMLAg##iN54mj=!waVr%OP z{{3DvWNzlq$I_vX>qaHPeWidYy$7R=B_x*vRIbwBw328|K7J%Ut7k zt8%@xAy}$;_!ue>+?Y-jiGU7HJyLwrv1I8PmVti8(B$F~`~1rNEHQZC7GX}oQ;GTxcOg%4 z%3(-6QEP*mgUS@>9ZKLx!m*1>0?Rd3&o!kf%9=-1kNS4YQ6L7eL{hhm#u`Ov7)`;7 z!4_4AVQviaSOpMq}=KWzU_hOT%r~HWx#g z;KsEM-CrQ%N7JxKX;!9S9$?WgB3wkI7Z4ST6`McfR-pkci>sshMlb73g6H{5uaKjd z7`IFxz@LTOk1%HHFIQ1t@mwqR6yMrhQ0G?MXs{Fljj=g<6&&5g+%f(G6zEHKko(II literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/_r_e_a_d_m_e._t_x_t.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/_r_e_a_d_m_e._t_x_t.i new file mode 100644 index 0000000000000000000000000000000000000000..8cc6335350943170a6901669ff6730db981232b9 GIT binary patch literal 1496 zcmV;}1t$1aRE7`?9)AFz0Q+NetWF z)(t~IOSDadA_bDNs}=q4JC~GPyX}Srfh_THcwgsS5~aVfbeisMUTN8<8*4(pKbzfj z4mt;CD=G5VG&I3sIt$7g9*!G|xPcbd(acqHR+s!?0$tjw}U)2b}33!WTMFw&*c z*-UzmcM>M=9BiBl{9zXqR=iznyWxQ#=34qb-CkYabm?~dIK^}N{-R5x+4QbUkJDFg zx-`BV&AOd~x!0ykSs_Y1*P%;`+-G=7!SCg==+aWxi!QD5;v=5022cFpSpE;F3=i5GUW`C=Lzz zRXnD)6=lLuZn3<;X+WvNiV-#{tVoa#z!fh4D%3pNIlxNaq@za{k}jNB%NKmaz|`cc zY>yOSPGDnly3(@eHy1bT_3KpYtWc(w{<6}J3P4w$YoJ(@*RQ9n(VjHO&H78nE? zM>1?AqkRGKElSu}#z;lT{I8InooMjuyLRqyL1$l2o}SxMn&ZR4DjQ3PA}%CdlP#8YFToubZqWtsE*BMaw7`9>}*W!5az zlJ#YW-BA4)XD+l{!OFnSMPb1D06O`!d~!Xwy1#A=iHu_<-RnGCQk1bNif75Id*e|Q z9v#pr1be7!h-r#Vso^({-*qCgg}g0f(v+qHtOSA@Wx&@^x#GyDbF`W}0h_nh_vk~@ z6QYR>l=^{I&&l`xzZpv7$@R_f_p?_kYJltMSwl*v*?{tsCZjO7bK zP?;*3R=6AR^@M}qgTt+?a%@7DcG2-1VuC5@)~U9gTCSo%0?ONyT@wcHXLpYi9=HdE zVep;x&nSw~&*}RqegEQ>?pe1y=arYXtP|w^p4V^R{uCuQt)ilKXGB<<1?CrUy-z)whKn{qe8yieki#-#zm+ z%D%ORyxOnyR=id{yv0Xz!k-nokue+G%?>H4I|OfjT#|El?$#&F-)|)poqn_Lar@#w zf{I?10qHfz*DBwgYf#o!>Jqen8qdPK$c@J7cO+gN;{MpS{?2O;j@5dJJNCvbonJXu w>V@y*)??3($Lwy?pTe&vvSh{o$>-(c0)q>y+KW;HrxhHKvh?@2TA2A10NCbuPyhe` literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..8b3c87806184e48b291c2bd68d020b78adf4e98e GIT binary patch literal 490 zcmV6HM7#>4xaNZB=S|b7BJ3XC6xlto|PbHP=j99 zp-~h}{#MZI19VYMCiND)Y4kQWBC`MQK$9UueL!oUmXe>BTG zUkI5GX{~&1l<#<-fXlPYSl{GCjWMo*>0tSZvlOX$5wK@gqZ4bPQ8+bmF<3tD7{?86S@ zR)*|YKZ;kw<>P`PpAfo}?pVr{GJ6Mw$-x`o1~*dUJSr{xu8J#eo#4ObXzHm8k$R(Y gUY?00000000000001ZoV`}xZ`v>re$QWVLUe#sSi7eQT2!XetsDKJ2DC}* zgwo(Z)L>_}(-tBA_nn+J^#_06S!bhcDv*8MYlT`jK2|1 zdyaFuAl~d4t_N2`$JzCOHsA{MQhE;&$s?|Y<1aVoF7EwAI!+=82+2cV_VoJ6;{tv^ zH_tBJK`VV^p-*HOiJhl-Qc`J9$9KDK@}N_|tQ9JpDtyaptc)#F(+8-_cAw+QaqjS6 zfLxHY1_-HSup~>yS0;avJb-pyJAl9C3Yv96qM(JxoK1WBq5jiP+kJO(JG|?5RR}PS zp)x^=v=KANA!eRDgnF>RKbkB}1)`M#q5%v4}z|UW)F<^M6zkud3bUNF(DLvca zuJpK6rKpT0iK1q9P=45J_2g_tgwCbn%4b*^_AD-C5=Z2c&dAGlQ6twaS7ox2tC*-{ z3<|u1qnD$jz}(Ds_UOB}+1h;{GnS;OQOl{N=~{>9h^EXyS*y(JMp0K|qmnK55C&ye z)Kch4eb1F=VdvZq?uOUn6e;aN;}<7l0cXWU9~P0R)5fv;dfmu9Gc>d9S$;idQ<51= zq%PKRzVlELTWhE^4}uU^B*dp20?wA1_>^)UR^YRE71FsaMFiYdqSn!l9Btv{sx;|9 zLNRe+DNJ2UuCHwYR8i0?lo)fI8%@=Lx0a|Xq$qqZ^0-ZU%d|nRE!${`sy;2qG}lw6 zI?W;_`&O+5^1Dcu9&M}QH0PYeoCrdt?iyf0aUV9x8tQE{XJzVfx0lqyThFzIJ3hae zj2k9kMuL!%nX=jgPG=DyohgBE5Zu#BVqcqG`>*aTj2E0*oGXTA$uj3t1JuJ!*f&!uz@ggP3jS5wuVpthIF zSB5AiO!)Y|R%_|WIL(sPmeNEl#rm8H;Yv(uxf^a7_ao$Ex8nH9iCl^<=DDIdA#i@w@REMki)F#qF60qYmTqeg|Aa&}hAR)v~V| dNxuipHP8sh>n?Fe*kRNC-Cd6@3sH{ literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_a_a_tutils.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_a_a_tutils.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..81cb366f9add782a28515af824883457c2eeb1aa GIT binary patch literal 3920 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 literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_anchor.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_anchor.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..831f79c7767022e3724809d3a8fc79ce2e8ce822 GIT binary patch literal 1564 zcmV+%2IKhv0RRC20000000rCt01|uv0000000061|NsC0|Ns9s?h)hh*AgGL?`|P& zGvhnXoVS($00000000000001ZoV{58PuoTm|J{GZTZEKE3jtCzP0%11&=sjbMd;K@ zlOkiE<69lu^PSUpssH!AcXxKqi3w#t3_)_fd*8o&?wQo}zPd98?~+)aoIF0hJ2|0i`#3**&={_FpD(du@n&C^7oJT6Oisx#6-=1bv?O!xcT^abARVJ zk0Gnrd=~JS32K)pJ5giX$WbSEV$3(87$n4C%FI~qnf!Zc@jH5OIfT=ktIyN z!94du;3#q7@`#KWAiWpmibklzH9NQhBwFJo`$>iru4H21xZvg4f*DiX*ax;?G1|J| z9s`jwj|bd?dE(mzKro7g6f)$pmu2Do5M6m*|+|TxsuA-k|5RNVu}FLM>!Tubhw|2Mu#KT*!}Nb(ff=dO?#DctA(V4=AY%$dwE(8Obu((=nrb_}-U z-Ujm%R(PGH+v~^o_g9n|FUKHIbOe#gQ?<5={FCI7z$Va~BZ%2IjC97ROt3!j(bRDz zOXN?AXypL@%nRu4d66qbAI2a;9-xZ)K(HvF{nh!jL>;tGEh9jk3_x?9I^|kFYW913 zLD+Yk2V6E%8f3{_r=3%=1{^~YV(sFWEAaq7RMv+;?PnijvqUVAjw@9gW=~vZZdNF5 znrDC|l)F(>CjTQ9Xa8)~#X{_s z1E`-1dL|n&@zYO6}yZS`njr%LrY7;bwV-az16>0gh%^l*pZc6Schx=vT087Dszh6<`nK^)`w!8ZBKKU@|82EOr)dlq(rTWLODo(NV~s+F3u(cx$tI*dODXMe^WtBy^fnA=cS_6~q=$GNSL+v(!5kJnhY zd`rw5+S`DrQD0SAzz}+ELSYFs-@Vq9gAH5Cb^W}ENU!$0*x`5aKl@$0&hH<)&|hoC zT)#+mp0S_c$8J^9^laNLtsdACR5Sz?I|UUx1RZRJtOaEbG|X6}^@v%?tY45XKH&@U zgX7$~_$nR4`$T-j*-t-B_0zfF(J;woLzplIAKqG1E-la0tGSn?MaE~L`X7oDagW8q Op8Sq*TKgAI!DJv#1OpEM literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_bsln.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_bsln.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..da72a7f7be15f4e952f1530d259e9b13aeac3d4e GIT binary patch literal 1226 zcmV;*1U35r0RRC20000000fEv01gxY0000000061|NsC0|Ns94^3sOR+xM2EiT^V# z#HICIT~5IO00000000000001ZoV{0VZ{j!*{+?ekVp9cH1#P>h(+Rd*=@we{T3SK4 z`_NX%5C@_LhfSPvsN%oxIF1u1Q1&XVjt^1n8PCfz<7dc<%$~`dLN8#v*|hCmvw0Eu ztYsKy3rd_57<6vChEWnj9WF>jeUDM#Wa?A!7!Yt#D?51E9eo}4@9qBGAlvH?Ms{cL zwF`fDhW*aPO?QMMkJBZ*&@l1>rk4M@LAWGbEgkBT*yqY;zU^}osa3?CD}S?EsP&Bd z_kqWFrr-y`bG+&mEX%ztz}v2UeRnCMn#HISM-hel-Ap%MDabgwL&^oAXI4-*gB+2Gd>CIGmlqClRH#KBHk!<< zq958y5g$wbimr8cDy`n3PAbkhlb1!r#_&{Y*wMnNxaeyNx)T16FC^Xh8;v{o&| zFEvY>EzNJs*cPZHh`E5IW*Gm3NQOF}Ae$had-z5@+zr7EgJnuEqO{Wu%!1X%V{@Hu z&|sNuB(rFglRR`H$yi2(gFWigDAEcqYA7g0na&z(7p#n5%0TGKJHTmdwF>dBRK?A| z*EwgWZii?~v6JY(wSczJfNwO{jzDak?jyyY-nDX}Wlplx_u@Um>Mr6XVRZp*Qt^PT-Wa+^p=aH3LLG1mssBbn)$`kJ%Ju1jYE@w;=gD6s&DFww=mE$PaLl>0H7Et{J zjRt%!_}Sy@ksmot%=jphIZuw2n|k}foID+8*iX|82V_YnRdZ5^i&nBVSr?59fQ?(XfO}SYT?abhHObg>Xi5WU@f+;37g}96tB00FDyvoGBeu` z=JYAy>Jy|*^$Bt@zQXU1L4Z7!{PD^JoiTo!3=QL3z|b6F@E2Xf%@?(t;PO23{6-MY o+YJ~|ibCyULcF#`5tGRsdh-Pb!W_f*FpmfWZ781q0kCr$lw96ang9R* literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_changes.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_changes.i new file mode 100644 index 0000000000000000000000000000000000000000..ba56a59851a4ea027a3bf510516f5261c7e8328c GIT binary patch literal 1101 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 Fzzfz8>~{bF literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_cvt__.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_cvt__.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..c9d031384ff34023e1ca1b1172cb8a9b12292a32 GIT binary patch literal 725 zcmV;`0xJCg0RRC20000000NZ&00i3r0000000061|NsC0|NsADEw>N%|EFM>9?)`E zRX)~B47&;d00000000000001ZoPAW=ZsITyefL+4x~PFwi(s`+&>~Vww@8In5O}F7 zEY7QX$H}@7SR1_2FI23!DzK;|l1GG;NCp(@$qXNsh*r4q7GyU`IqT+0e-#1<= zo?WshUnI#lXv7GayLTze)E`64k!>V5+lmTSBIYbK%}|Td`nv{)nEz9uN*SN29k=>7 z*5~I?`?32PuoZk{=UCrE~2%4K#ovdRgssYDpW-(rQ$`p z4=16GvraZRYsKkL{Jf6YC zUep6`{nBF2A|^+JweN$ zO(A2`w`Z?0?u<-z-8sjg#1mtm(3BCFDSB)5M`%7!<6Ofd|Gn~5Uw{(fYItIE+wCa49~qTZ+>uCKjJw9<>& z#Wp|;xR{O(;5c%*u0Puhs3i#2OsnRUmwE=_=}Y4>qBmG!Z9{APt!oxas-K>zQRLBF3)leAq%1PP+errvtze&PyD; zg)n8Is>z1g;-qLS+!P{DE5q;`I_{$o8FqrO@$}bVq`W#jk}PVhTN4}1j_ti4yzWrU!Qy{`tOjku!c%&lF-jQ z`Z+FIfcViU@CHyrqx5xK`D@SKmYXf{l@B|o#txW31x`id7S1PcoaO~?LZNL}D3yB$ zQp@)nWfsB?!F!X#k(N`%5oaQd=!IAzj^nPP454z&X`PT0Jj-NBdkekc@rMSjq1D4K zH}uHjY?0%FqY=b7x{5s0cIRtw*_hfyrw_;q^f1Sr4#LjC>soHR7h02w;>6JJpBE`^ z5ER+7*%((816ut1^6SPVA)y`9#A%^&h}>+y->X-C&1Suy1uOrxZflimQb^$q zgEu;``<^|G{!yLU#w#+h-3y&c)^|iIs%Eh2K-Z-?fM8b+@xFuhZL>{8A{8x`ZKfX@ z9Q6GNr&^}nteAG;MhN&i@YYB=j%@42 dS-vdfbY}Nsmg37sX>7}GUA-Qr`ag-{p8MGZhc*BJ literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_dumper.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_dumper.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..6f21a21dced125b81f0ab571cd14f9b7ec7b371f GIT binary patch literal 1118 zcmV-k1flx?0RRC20000000bTY00=q&0000000061|NsC0|NsBq$>s=AJkyU?bk~TE z3ybQ}aPG?h00000000000001ZoPAYoZ`(Ey{?1=mEY-h&4*-e@tNmm0~V#FS{ zBFzF?qAb=DDf7jik$S&`|S>Uwf{HyTezw>OPO1$W1KSl~v0GXhTu zI&dPbOP6z-lT@XsVfe=O;LltrRNYYDoQ6!!5rAp$AlK_q>jvyvn?(n#E`^gN-lYR+ zAs0oJ`GU;76>vqV@0o)HK#Z~npY&R+gz2!7s||68p!MvlNL zNtGeq3`tCmj@DT03e#1t!`8V>awr8?JDX>r2$fp!RUmQ579rNTE_Q5E8cOaQDz4GA z$Ji9*l{b~foI<>qYN=C?26)04QVn0dt^1BrH6MUfE4_G8g1|1$GFcFKh|4ZyWkIjP zy_v5lL@9_$IAd5Q>K8?#G5gdf7>9QiwkGoi?M&xcP`t3ZiQIzAi_1^f2hd&L5tb3| z!57v5GhFe)hs1buB7Y?kf;P=JI__%U0~X&2UKAU!x%NehC0vL)szj?mCYrEb8ws3v z#~2X=+bt6}WG~4wti>yCEG*aY`SoAp+q)^8k0uv50Y)snL|R|}Q)%N!n*?x5s)t8F z#l2lE*$o~ESh<0BR3H?^AtN|FgMJ6jvRs{;|Oi8cb9KMwbz z2#MQR2lSGnMl-eUnG);xo-iJEt0Tg(zdQWM zEH^ci+QYDVrc`U*-hsQPmUwI@u4nBb6cr;$H~tEsS8zY1`6jKq{v)k-{Ey z|FB}YjQcykV_}M=*G@pU3%0=N#^FS25-$ama-KVw37AR6%_i)pUX4Ukei{I&G{+Qi zvrX@AKMxODL$+OGW^ax_v7_x8QVEhdD kJ#ssmZK*^Lp{)Jm7iA*q)xp?r?_W&$*=}n80|CX2mGsyO)&Kwi literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_e_b_d_t.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_e_b_d_t.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..b189d1c2c99b2acca52956fdb21ed8006d8eb379 GIT binary patch literal 2122 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 literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_fdsc.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_fdsc.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..0cdb3e46f73c7054933df532e02305a8dbbaff15 GIT binary patch literal 865 zcmV-n1D^Z<0RRC20000000SWa00;2^0000000061|NsC0|Ns9Sh+`RvhVT6=jw(=yG>|&&ima@(z{=KA#K(3s z3Au?wq6CN9rWHc`_Z=IOIIwjq7m<_W^Yxwwdrkd>E*T6muG;O{Y|w5G0_l5%Tt$oq zmoVx+^a(jJL(@1wk4ay|Yn2HJiaw)Rh!+$z1f-0$NfpWtz!dfBAD6;elX@6!w8ccx9=RB!eDscclKUxJ+yI5{mJ$0 z@H^)?8fT9|P>02wuMwWc#mj}Rh$^>Ca~8-L!VJIq5i~BL)q>5@eU!VqaFFCAhUqvj z=B+}F%_xJ_YByb|@dx${4yS48xbWpXF|;fFgk?WE{=ky4XxL>occ_rZ zukb0@l9^D|U8h(bBG(qDNFBbTp^A$QOAgm!pF=aYkg=?PV8>8lL2)d@U@_Kfi6lgu z73EE>yrDy|wP2EQMHR{lSy+-|<6uI)0|+!FC#Q!_Sve-0>8$rSpE)@f0SjY}Cofv_ zeQ%G|tIVaA{9`n6h}9*w^rfvjqOfsM-aFvbrGqupgI`<^A+ZOM?5!E^ixo@puzz3l z@c*LkEr^SmUwWjtoNne{@n#xjoI%2~S6&#pbG)@CgnY|5RT1UzoxQ^S=lpenuh%k8 rTbWpPS}@m3g z;CPq=9Y_;#a&#v<9!CA`-Ia8wlMD@MnMA&qeY6N(D;GH623mR zPA?`y_c-6TvU8(?P~vjTza~Lk*_zV1aEmnIglyC|U7hw(W)H*EzRHs^j@{`zv~_wWA_PG>8UwcyW(Z@%xAL@Y-Rxr zOt|gmk`#H<#5%B!vPIaCNgHmpDoDUD(EawN+wHpW(+PClEhaScw1rI-o)`ayO)Uo| zJqX!r*M+p=EzQwO?Q+~`U}Q7J#27qt(d^;zkSkuVtz-BZL7 zyqw9hnzhUsQ_R|-scV5@bJdVp#}A1Jxs(=EM03RIISseKpL?+*q;psqsq(hmvH5BO zCm%C%V9F~k$x}HkbaFyo*>rqXrrUnG1I?^-KP9Yk+qN1>Qp9UGKv*!4j8wPn&6({9{YBs=f44wKFMDr>G6`XH~p@Gnn^;I6wU}BDc36xGJ>u%$oP~ ztWk~#Qdk(%SHl*Xn44Z9r&+Uu4ygN|8DRn>Bl{G*{VpE~6+cmMD{KsuvudTnNqLvS zES}cxHI_#Lf}Czc+xE4s(n@0%s@5&aC|ca86v4aw{FX&ac`s&G92J}W|6vnvtAF=) z8Kz%{?zg3I&n2L{#CNz98Pnl%xoo)RGsZ%>U4hBXDzaC8pufNQ6+afok>Kz}M32I3 z3~%s5^4f8Jj|5Xb6YvLrgpY6abcWMY8HAlEUJW`h;T$*Z?|d8%h~uz`?w{gd{r>m|*vOx8nXaz9 literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_fmtx.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_fmtx.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..eab522eac6a85435b6df09a1b361a0148c21c67d GIT binary patch literal 848 zcmV-W1F!r50RRC20000000R&J00$QU0000000061|NsC0|NsBdAGPh%1eOJlb{Z*O zUU!Hx-aLQ+00000000000001ZoPCu|bJ{QvhVS|nJE!1yV_?Zv7qjZP8qaAq08mruw5><=lZ2WNY!U_ zQi5LNu0=@34MjTu?wFR`RiNopz;;7!T7&C;=V92n?-4TexdQx9P<*}!SR4y0u6_6$ zDGf?fF`;szKrNWdJRuXf^{-eB11UAN$8qu*&XyR88sfY*{q#Y17A zr@?yRcf^Ff*jGQ4{2xx222JLLl4XnyPcxaZT~o>QEhc=+-lU2pIW>0=WE0a~G_f2? z9$2klQs7-{czb_?RaM)_b*k>f7;CYp=cLojkjI;tISGT`oF1)aSt&{9I z;_{%WLqjoENLfdk2MPyRv8s{H4net;IL74d^mAL>IjGj~C3hZM_uykkH*sWJ5WC%D zx8?S(cgOJK2*WcIaoDPNoNpyRYTrlxbYjy86+Piv=9;|P;Q1Qz&g>kVC4OD}attyK zoD+ID;{8%VD_nu|X;0mn&Z=-(u)(pGxl&>U9E)8WcQD(yZC6F!*-QL(_~SO`ff3H2 z^thdbxdeOB5DDCH3MS0s0ym>GgVR%U7Yt5L_OY>&dUa+SOztdW&xUNsb}e6mql-0Z zmOSa>9nT3r+5cSV5aw(i$~92+_J+6X-ypOSDTImzo+-FKuI!Bysts~GGZRp(4Mq>G zez|N$0|LhWL{h}gc${g?QMKEu(rbBBNz1>P~|9*%uNzK4Qpp9=WFR?xjlUdQ-aS3I}~<+OGI1IEyq{_n!a an%!*%k>pcf1OEGvfV)hn6te#bU>_@>MUP+r literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_font.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_font.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..6749bda557aad6a40581abc5f4ee8bd42934bab8 GIT binary patch literal 7998 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 AF#rGn literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_fpgm.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_fpgm.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..7a3472b680259526bcdf105c3e0c2628d3afb9d9 GIT binary patch literal 806 zcmV+>1KIol0RRC20000000QO!00rs*0000000061|NsC0|Ns9c{X>t3)wou7Dn+cB z0i?r{qA3JtC#?(rF0*mWw4H}l?tsOOq13L znZ!w~CU$B&rKn=ReRoNq8ER40#J+d$?%i{oasQD=0{u*zMTWkjZ}blPlK zs11bFsH29Y!gb1>)Cwr#Vr>OA?+a^%g_YsY0)*0e6ob=L&|n0xoWqJ8Y}d~nV>xD7 zXQc1?#rrci7M|9v;mv#mji2M$9CfsDcE!d8g=&NIs9lQgkcjAZy4~*CZrWd<;Z6ny z-x!|->A#vV_77%d9Q8MbF)oe6jzRorsm{#*kwJEp) ztpu#4i$S`*M4PV)LiWl4e~snu?w_)yCGz&`o3G6R+1#QIl(79zgwEaaB~4ll9|s^_ z+%Yr)k-50d*j?_j+*v3N((VLt3%@3}^)4!gs*!X9t%emzh(w2!SbwdVBoa50keCEy>i}u~)p%>L*L%r2E0z_W7ui`nhkDRfw3|-BR_bXMd7BCqi41*w^ zph=aQ?P9+qulcxh& kFc$)D&+E4_z7C2@jXrWCqu2q*u_w|O%GNKhe`6)mlxn(yZU6uP literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_g_d_e_f.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_g_d_e_f.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..7ee4f49c88c7a34105bd78020dd9fba42db06ee3 GIT binary patch literal 2347 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 Y`IPdyAOBj0+oW9NZ?r`?r|!N!B_DgS?rro z#qb!K2@Hq5M8*a2)3d=z|KfUh(Yx}za}kdsspn*LcF&YFkxFGGn2u2}GzzI$Ho60+ znWU$*@0&pjwY29ko3XnTg8A6S#nh_=fzD&xp8A#e;+>3?xXQXKaV*Ov@;M#|g@q=`bE6 z%~1cN(E8$PFzjBPoWXD1{zdnfFJ}YK8=_Q&Kqx+liYcvCw3tc|+KM<1zaf3J%$H9k z?^x3ub-Z)b9Udhw1Ffb^l!?fxh)w8g(24ZJAoNKMW@ZhgJ1D98CR5nKL1^R@x+mnK zyW#KGXCx|$gMVy6)=oUoMa9fx2b~aQ?6gtnqt94>w6Dljqq{IhOHJ9M9_m1kEEDua zDrWhz6fw4+i}TN1oUyf+u)so)84<=MfpGIUnk5rWnx!&{gfE#KGV~|;s{2_^FRIY9 z0+gsmp*BR*nFkQ3cpGSGEQ2g=lOI$%l4%>w;1#S8B9>XsNz`y6QzB4e-cLIub5jYe z5mBzd6rrq(ICJDZ*0TdlG)W>hI8xRK)@WqGX`LQP%afomQIDNmB2_PuoF*7XO;jtu zDWZ`w3}eMUaSN?9gieet3Obr=v4Pm5r~keg3@sjVk?wKtXk=rD*02H)@_i7xjU|=6 zVgZvuvF|Zu<J&5-Cb-RJL&cNXM^kB)hTDQVGq7^ zfA8H4f&AfeTA-pxJ=!cmnT*nrb{^m?K@cjX7sk%qt2|BGc`hMrZbE%x$CX)JxT=&p z=hkw$8(jzs$7W{}&n?)(@iv}2c<$n}U3|9N*@itF@8Ni_vyFSp;^Lw39P=M~%U&U> zJ8^4CvzlX^|M+vVc8t{#^Lmg)(X8zv#O5R#XIkofOt`i+vz!97j5YcqRZ|XEk1f+F z9C>**Jnx;N#}56>cplPY0Q=^E$4FDdpO4Msi$S+#AC)T3jR_;Y^wicNY$IqB9Mbls z*;d|VY{8mYKT2_Qhc&;s7EIc(W}S-z3~Bkj<#}EGfNA4?W)oVL$kc`d=Xk-ccN$7p z9D^{DuG%08Y(Mgjf){!YK5;g^$AGqXHkI;5%qEG_j2z@kEM`UerMpgUFQf{&@ZJ-H zYl^vZjk*AopS77{Ex9XH(pD$5%kka8d;* zR%Md*)zQJAXgq&)+;2-;upc6++Hj02Xd2TQOzD?%0bjG2?x*=c=YtT>aX2c;aI915 zlY8kw7&z77@DTP|{OqX+LDqq+=cL$iWawy?MIeO`Ja;#7f=Q^^7;H6g3ip&YFe}^x zpJ2OHJbkLf`y#`w(te(2wHBEz^LpmdGssBGS9IE2rBiO!1>N2aw%=9wSzcL;ajl(( zXv=N*>8Fxucj2$Upk!!g={%AM04KfQ&idV75ln;*!lw&6mZn(~)lPcXxZwZne*jV0-K1-p7*ZN_=f+Vfpg% z`c?Bp%}X1qaWMDVYB9H71E~}7(RWG{ z7lTzx`M^03K5&xSSd7@$BKi%{T&w1ihw1nM_tfjkE?Y<=ueh%4seh3pVILZz(OTut zoxca*zwf64`pr6<{(m{J(9*oF<+7$Ll%gNAtXZ8@J2h*XR6vX3`j%3+ih9%0fOS;7 zPJKEohFz^+NGT}DZ5tZgslE*31;Wp74-?D!hr^)AU<>Q!UG-~;Zm~w@C9+ZqV}s3N zvs(Um&&r;N`msC5vb2(gukqn(ehc;~N-lr{RYWE4#a@#eXI{ z)Il9X?zZ9w#{SDn=0~0Dm+38Fhs#syVwSYxI*Ls9s5ybcRt*=yi+#w8mRbdxoeF4H zRVoV|SFk8gzNuansnKR3^h};63C{0{b`AE3d=SPWay5iEfBiZqw{e@-aGK+i=RPTQ zZ-(c+zUN(v)PymdEBzp2uy=R%?pTLWN2TKq45Y077lVdJ3@KkFvy}c5L$$_>LZ9kh PJT9sQWx)RcJ5Qs2uIX^y literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_glyf.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_glyf.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..0d9f502e7793f9866dd82e92c0890968bbbac0f5 GIT binary patch literal 1258 zcmV-EmlMcilX zC=qRN7CMJHR~D>>iLhvCf{t0L^(#mV`Rt<}a091@jkq&d zHfgoFS~gK>mYC-1v7z$m(*R9dm}}Lv@FLKCCUz)T0b?1*_@*L(8+I;)qDaS5P0$HO zS~}3PnKoifVQqLPsf1frqc@jn3K7qZz`!wi)c1jr84P5eNo&!i&Mjmd?Pg?3!GF22 zEYh=uw}0T|0jUVyvQb;B1gPW>P&DSr_iLOEOrF zKgsWXQ6da*;`JESvkP~@Rz*pxbP+UpCR|3&L=nw<|CPkL1&N}R8%L#_qM9d&QkhHu zgn-xiBN|}k1H7gSXf=#T<2L#_e(t+P_s^{o zZQ=IhZg@Q+=6VKum;DVXT5GP*%6?_1&sOYRu*jxXBTm|k{ey@h6^LFOnOFg?XrdX` zM%kuurE|P;8SNp7(kM^4!<&N=bB0EUXr&-l3$!`N3P6&Xuz98e2KNuQ!@FKDWC*!R1=3^_p+eVLN3YvqUJr@_(9-`F zwJCp_(Y=&gJM%f9-WP9+0Kz2Q0^t3yVx1OtciT?RV?~z|Z#JYf7O_;we3wIK@Ys+~ z{Zg>9*ctfAQoD(v-#m;iZ%!R)iU_xu37A&4i;Q-UYHSX#17@qOR8CwmmQAU~;%%fa zb#&(1+(pw0<_8GS+rbyS+Mlrc`E8oE8WFZC0)=E5iw-#BWTEgbi=(|4*LLp1+s zYvD$d$=9O~XR_z{&IY5&bq%XGW7(v*XMGSOc;Y1B<^&4<%R1`+Df*V<=>Iden%PA9 z+0>BR8CG9G`cSlL2;U9_`voojy}EohmS?tV*7C_7{Kc)!4ASG4z9h7n>C_!7JVM-f z4(KS#vue3ZlXdgkBr>*@0@gb%c;Lh+IobsA9ell-zk<9t-kU+Qh`&-Oc=Wvz$bZSZ2whD)SI{GRp4 zr>gF%zIV&xvO}_H=BG~xLRa`c7h(l-*5NJdzu#)AdC zDm_=_#>oR7@9r48!sf*3{!N=#JQw=6Xa9C=WZKo)1W&m_z~y13gXnSKh8!KOGdW2t U@sp)863XC7r#!~|1Xq3m8v>_oMF0Q* literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_glyph.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_glyph.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..59cfdd543b83931ccbf35ed5dedb3d3bbfb68495 GIT binary patch literal 6657 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 Lh^q3x5K08AwN%~p literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_gr_feat.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_gr_feat.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..390bb2ddcae033f29a0478b2c8ff50375530a62e GIT binary patch literal 1938 zcmV;D2W|KO0RRC20000000&Y402ZtO0000000061|NsC0|Ns9gG=*cDy#RI00h7>9r$Y)yT0+Ym1%`y{ z2g+oWSizn;a%wre9L@dq+m&Tob`oIPUS^WWl6JK(&%VeLHvG!2IUGhJ+1cs!4tI7w z#D|>i>K_)Pj-(kSscjG{1% zZUb?Rqj;Qgd{bdz+j;vt9gd7*1tygA@4> zMj^Y-Hh6r*reR{+B$R#t$&-XcE1#%mQ7ux16e;fmcFh7IlT-|u#I&SjLk*dQ<+i?(UUa3VX=g7xApy_Zrg38>xNG+k|2~g9rJI~ATBNS$OO1V zl(0)Ys*7$0mTg!~Huqv2+4ed9%G5jBgD{Gtv6?|r7zH62JBeV-$5DKr2`;AtP#hj? zYkUv&RmsDViwE!bTY5$_d>>6kvH{tnBr&X*<5+;Af?$*mHuoMJ#nhQ04?WerIP0A6 z?9g=ILp(<@n8d`ao>Oa3I9cumLk;KQc$~NhCkGo_R^eiH>Ua<~R_hB8H+Z*_Gm7LZ}4?&^@gr>?YX(R#{ z2&&s4@quNyf;xtC(^Y}u!AW#Nu}nn567fF0i zu}?FaNU>6RXA63MAk&>$uww91HfbP3kC+DHhJ}<~R4VZd62&J^KoW*N6W1s(p6@fv zBaz6D+@ih8S$%R&2^;X@h2a=lZXjID8ECd<$bh~)#3*0M42gTUiSxrUA7^0sId>mF z$}M7ePJ~w^f-;sVx~@P<@Ohd>=AR-7O45SzY=N@5~ zB5{me!hjDW48mw2BO*2q(xpI!ik@!Svr-LG-gCl0_g^!Yv~?Uo4vf3{Ls%1be#qBQTjcQc>p<@ts6sj9K3|A}* zO)$ZXU+u(3L5wM!x+^pUwO+^xr{^+59h199d3nIGy>yA=4~YZci8TFaf+D;qZzvjy zVfYSn8?sn+q2Q8!O8P#hxR)FTTWMxGGmErca8KpP((cS$l0z1<7{2m*32Oy#jU6h- zXd| zijYy9U`xZ`EmicvtZMo+ahMHKnH{bRewVanup++(ld5$TIG&QeUlF*U+kK|eroXv2 z!7Eu(F9>fCRc7;VUKvW69^ukZ#oS<1LTh!clJJ+5tc(#Atuq=+EK>e-%)}-oeAPb3 zd_qm0NLWJgqOZ@{B{wf)iq%tvjNoWiC&OZekm+quJ*xd?oq@CVdFQ0(%nER~vV8{K z$VVcl+dDYD=s8(2L!Sl$yJuW|UL9LrfO12R>NV{oSi?SI4K>ox*};jlrN{pjaMq;r zMP&J7aq3uD7;5=r4XZNlSH}3;3T`3;bdL_(G#Wq%Q%Y^rsEb_ z(mZGhLNqhOdPWPL6B=M9cmDCb;|iFOEA>j zTQxWpDg@zlG^)AjyB@=o8zoz~3SQ0PmFT;R4_({->6aA0=mo{EcscRh7ZaHU+84c# zr{}ia4w3I?7JE>~{sE!krEmHEj08)N5&Xq(9jT17H5t2Gc9(NFervozq~RXDw}oLe YxyN?IPn5i2Fyun&Lsez^5BS#NU$j!Hg#Z8m literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_hdmx.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_hdmx.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..df875b22cd0901ef0b8565e185fb8f097d2deee0 GIT binary patch literal 1293 zcmV+o1@ig;0RRC20000000hkd01Ep60000000061|NsC0|NsB}x={a+c6L2qEAn+w z79xK0pNS#>00000000000001ZoTXN6Z{j!*{_bBfVzZm%x}~(&lTJ`7*e=~7wX_1d zx>MUjA#sSW!O6uAg+ux8H+EhK-EO}e5{YAvXP#%~@k{Ku&(4CvWyEE>J)K^*+gILl z-65nKP{%ulQU7K@$g5#EgsUiF|6;Ebf=5@(rLd$jVXmlVejQ9M#>2bm@ODJVG@u}z zc}T&HxL`sGh5=1)JW=$A4Zcu%` z4&Wq-v(asDLPN+8l)Ob8irkFA)OVoHi!U~meK>rx?*MJgCyXd-?ThS7`qN~lj0%3W-?2?6{W z{^9x73^2=Pwlx%p?7`5;W;|U!sW3>zW0FN&Il~AHxpI7QAvMF5lQ5ME^w^D7G=WoW zFo|?V>5>q9%&~Kq^gP>&+#Kala6EyV!Sw3(D-!FvsU##76ojHBJGzZg1pM=2^@fwa zje=2c=&GKYTBgdi8ZDg~^6)&t79nGN3Z0I;Zj8$aJV!bzO6tlqp`wh9#RWZUt8=v6 zfMp08`Zfma%{seIKTutIOr;U)bUC~pm|4vPv$*&SIi+qna) z3iq8R0;_ChJB$h)B1(CTm9iR~j~Y30doTLd#3GxS!mcJ35tYy_gJEy0gUsQq7{&I% zfvrvQ{JsURNK7@Xm&Xpt#XgQYmR!VW`%oF{%;F5JD;B$maAMm}`Rr`Rr9-lP@kFWA zWhUe{m2oO_3GMGenyCz!YH(Q>5zc+K@pT%sTa7a zeu)*cgbPg6N~_guX8%iRy`lt*gvQp6ZOR}jiTaciA8=t7Br!jg7*}gZ?7{ivOf7KcWrf?7AH=1XfX*c9x(zw zVV7m#u~2MLc3r)dr?)h$T)$Q^vv*5h2UJPl*Gr*{q6qLwJF;rjRZi^AyA1!hxt`IG zE-B{H!1Gtqwcb!^ECYO_0`a+W!j#sQ?W-m0K**%TR4frHNanF{Q|Dfb@zyCI0_Mva z^Y>Bw)|EKxmifQBk&&oWgqIXS& z);xdYjoO0Q+qx0$hi&dZ(>(`WIQi|(O?)p-ouj&5acO3aCj1>SZkb?e+2>v#&}p-& zUBk(#7JOp|DEk?Yqk>2c{7y8-yNl(Q`)_!)7^#cPGml<)HPFAuYsZ+78z+%?NxO=~ zGwwn8*DU|)2^Kb^WYL5PrEq;#yKt!HxlWfG#hZjJ0*SXkkA$c-t}bBBQdIu|_sle> Duwr>f literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_head.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_head.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..2a27c089937f81fb12af5a201b9f0683e6e1daa8 GIT binary patch literal 2251 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 Zp9o_FKAs3C;P7CJuS0GA{sd~ibem=*IS&8; literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_hhea.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_hhea.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..2048db237647fdc180b1be908f4f4f9582ecd60b GIT binary patch literal 1282 zcmV+d1^xN}0RRC20000000hDS01T-B0000000061|NsC0|NsAalm%c89y*i;&2&9y3?7>E<2rJz**Px zPH|Wq!?=Gl@Vp8e+Axfz_y?&hgdqxY37S2IJlDGzOutS>ceBy$*z;zAP=J37lvpL9 z=2jS9gbv{ERB2F}MGGbu3RJ@9!WVo2A|mRX!!whDT;+Z!2CKfulVQWKMiRha9dMXzDoa5%v zlOs>WQ?N&0quyYxd8Ey9&Lr2cH-p*m_5!^;ou}IKQpFK66wzHXM}!pocxjxCrhWJo(F+mDGc!Jj$d8*CP|1I! zLY6{3BUG)00`*>tP@#e`c1mWeDrl}?9Az5j`1K6_I-K@!Q9rU&7YIvMj+}?2LeGLz zp;p3Vxl_m84_HP0K-cjnQH{6rio&JRN2~y$y^YP6 zS7_9hM^Jml?;O7Zg^1zD5;+2c@VSdrIDy(PyVw{~>lD5;jj**vpMtR_>SAmkM!4I< zrOBN}ZD-=on)sgWSt3FUj=yJzFv-i;8qx^MRKbG#7{vwDmhkZ-{YD%oQwq8z3KhkVAAQ3HXy(lHd){VV?J|DbEgId_v2k6Ft_St4 z_08;j1i$_6cBe3qyLlK$5rH>ie`ST;EEw%pA&XOu!3&z6_e~1Ti?|_b419qzj(rz9 zwlCwA0}`Ele1&RDguSz=kaobL#=&qb0}0J?&{Irx-^I95P66vuw$nlRym$;K*e!Cx0r$dq z&g$E|R!PNHl8Z>S-m0nxr7cEpAZqnCbt{yo5~BEq!iudE8d2gZ*LkZ|qYzD7t!jTp z$jQF-aO1AO`j)zJp^suriek8|iU_}ev2~)|Bavnm zE+X_1+qW~w!|dHtw$5IPLX>ZoYR*Vw&kzfDipfTIFe62ilZ=jV5}F8SNkv)}wAZ#< zJM-D{B$IhVJv(f!NRytWH{Cr|O0w$H#B?q6qmqjU-Y8ZQUD+4id#zYmxhGqAw^$K8 zXZQc~Rhu)r7P{B&j=Q_}=lT5=K0e1W-s8(Ceu;8M{~jNv6VJP0Qe(#(#%jqUu&W2V sI#VM26w9YiFy$PsPYSO|n)Xax(9I*sXTX01yini;s){$!zZ+n<5gwXty8r+H literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_hmtx.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_hmtx.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..ccebc5b493459bd9aa010bbb8af2be4611f0b9c9 GIT binary patch literal 1622 zcmV-c2C4Y~0RRC20000000tHS01>hP0000000061|NsC0|NsBja!&|;LkkdpM7eBE z#PMyP@n5F^00000000000001ZoW)peZ`(Ey{;pqf_0q{kY^P0MHpFpIH+7o;c_|WS z8?Y7uZBY^ty|^Of#Phu0zB^KqDc4DxVZ-tvlK66b?(VsVq^E3h!vYTP(?spS!SK2-=1)NP928JkNO&yD9Gye`nx8OB9>ldu?9LWD_*F;fKdR!|&4PT7Pb zhIEFAUgC>TJT9Z{ID^C(hlxo>=}SEw^}v@#B00X_z_+r8M#f06Dmtgb(b4%k3`u{I zE62g~pdT0v)zk0jse~`L%{RxFgI3SU_?KK{HExb55J*lM0eu>~-ih;y<#u69bq+Fo zbDRtOZz#AS5kv~zhgQHB7->Olig}!7^AfAf$DnO39KgSL4$UpeBfo_(-dy)qjY%Gd zZJH$#O!WL zPaN`r!oHeh249nLjVv(85MZN7egj`I#|^}~G+thBaNk>eY+aAbfk3s{f!5FLr-={c~YuX+=SFI;Qb9Bq}zyw<{NeZ#lQS5mo7%m6Nhj z6SD))KR@V=<^F%?eUafJ6jlWz#%hN-WYHv#m_k`+0TX&(08=s~*-?rTRF-uiAE@pr zs!WPPLW8Z{z(M`yUAWK;ljx(zeS%EG%>EHFsl|58aSNh2cWpVafPIH31g*zbuPKyL zM2bQ%DDwn29ch^(a5QhNK#Xd1U{@E)K~XWCPC+Dy818v?mfS)XT$8CM7G%2zwvjWf z9;VL5rrUS5kk|>tEmLcPJ78|Ll{j*9cA@>neYJ7e~!4x+CyA zMF$1E-H_~`>pPRQHdf5dZ>J|~a!u1WDB8Ncdrq6hF!IC?*Jb)2)&ldqjAj}v(EkhK zolnhXcf0kewY8JBHkFM|ss)B@AeA{;{)^|6bQCuo`tFxlIiJXP=s|ELWzIM;dSrhZ;tKUQ3UVXs(>sgxMx~pqH_d`BTyhR4`_|o+UJrEOCh2sZi6B(; U%Y+k&2~Q;6tgDmf-(IseB^4AIo&W#< literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_kern.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_kern.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..ab7c2fa55517ccb8007bf60053de836804d40a02 GIT binary patch literal 2356 zcmV-43Cs2X0RRC20000000{H|0387U0000000061|NsC0|NsBTi~}L=qzCQjLlHrD zZzS(}ev|?L00000000000001ZoUK`VPus{A|KFeDh|Rr;d8C21bOi*#Qo2RkLPgTm zmAb3QvB&X%V`n|%&?w4xzvs;OF?JltZWk%U_MAD7-+6j6bKFN~!r((3$&-`e@WaW; zZ!C#UEvp|e$2)}E%g@)ARa=Gwpf4UxKsw`)iGuw7_2BCM=F9Nr?$)xZG~gr*0v3AU z;B^FX;<1Ez;KpIdT*+g6uxh=PpNdx^T~Y1T}JzI218NjCq2jjTuZG zuMjL3v%+d603G64bmyXogd)P{=&Ekv*qhtI@bdQR8h*dLzq$P7)Ac|@iQ=V0@(6LQ zDyj!gRe$CCgoUW}oP`Sl*C9xd^a&kEVn{B$!3!?g6nhD0 z8n~Eg4p#zm!E+}}aXVpM}5d}JiyDc~6C z3BzI-QIPBS$P^=7Ni)5Vgqlt$1gc1SUZNuT7e$s9SO$3&Pc4mws<-3`uaZEkN&b4q zpnt?(C)G>*k+Wa*SQR{L%&e^Y!rK-FvL!eK*C;Db@(g zV(!XQb&X|9z+X?Di<`lvtsfafz*mV8y!LcRCSZr7J=i93cYV>$2a6+U$%FF*uPo~x z|LdTC3gWO*`*8E= zy1g<;u;1@Pi{l5;q|1;+_#d+$|4Y(Yb$`ub@b$~}{mBW*#t|lqQN5TG`hhkrX3G zo~=kUK8lk>x@Bf~lcL9Vxz-{7R5dM7si^z9s;(A9Tl3k=E`cy130wp3Sm{*GKk4`{LE{7HAtwO2sqXTrE3F4_#(x83yOn29KU`0 z`dDL*zJk|B?~dO!sU(d7x#iO+tUNrglCFxo6&6Xc!IejwT&a+G;vV7>`@T-434TqT z@1g!m@av(bUo{$V`^#ZK>}ymN{~y)eotaT~pghwjYnfhQM1tzPN>(ajzva8H6u%}8 zu!kkb{&Ot?)eBYUVrg<*y%c_}5xnXvoEqFrNRwYjIwVFI66%?~$#qrWZALwO6(|?#vRL(>mq^ z(=_W;MwuMvh8dNa zeBfNqB2_1_Rd+<3NLaQUOeM_h@e0FYA>cntGY?*@9|gl?JBHMvYfKem)eoWD2OQ!@ zUldS-f!Hx(s>Wp5N-#8P*;uPZCG;lO!2sFTUozD7XiO&}e%!(NZz2N?AiRQORgdbW zyX0O2`kzl3__k)(3uQz6lmTQG+Osn_R6}B?^;5O^V%d3T>-EOs)wH2_ly?$*cG%Ng z>@AcmRIE)W>yi!|O8qu7#Jbcg5<0@_+Ucxyf0C0aufk?){p*ds36~cw*wBtQnvkKq zrY8mnR+^nZdc7WfcHsL)TX(CIO1bh(N%+wU@OKhEZ;ogZg=|A`^Rc9kmf<7J}6cvBFGXP2)UFY zgDJWiB=>l@Fh>MKY|}A`dfzh!h36I9aITVVBCq;E&ky-kf>yIXKZm2E^!z z%b;n_T`<|LA5UI>9e%vKx2(@jf++wWWATVXu)Z7Vy9>d?Zk$Z?sr#ohV|1X)b2VAI a@obTuxJI58a+gK)+eJ6elm7$V1vkT=%9cL> literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_kern/_class_array.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_kern/_class_array.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..f8d3ac14b0743909d6b466623b910b9a57155035 GIT binary patch literal 1060 zcmV+<1l#)n0RRC20000000ZOz01Ny80000000061|NsC0|NsBerDdQNQ@kq=ltCKA zaTsi5Kty~100000000000001ZoV8YMkJ>m8{+?ekqMS&&ytJ!+s9-_MUD;k=wtFg| zR@$vl790|7aB{Y@6jA>BjqN0MfZeugFCUO!#?LeJ%y@9>&+q&tfs2HSZg(=d=yu-` zM!Vg=VxRLNWB#V+IQ@|Li|6oRcsX*MM@*pw)6Y7z~G#66|s``TOeC z80Yg$I8Me1aKWOv=&A9&&p7HUY+NG zj)l(z?xIm^AV?g$9;WSO8C`wh3q4U5lEIa0O?c^960l_bDO!jS*2G?$VhKVVp>p&^_mz_*;8OzCuCfr%2_=uDT$@yt5|2H9xYrm?bjf7I7k{vkx zHQiJmenKsE7h8jEBPMhy!p6=dGcR}!Zp~saj6>yhrPCNRAV+xfgxZ{s{+e8Px{6pS5671qc_o(HH;zmE4QOpHMNtZ zZS9pk<1!#^Sx$RDmc9LCJd#MmyWg6VOw173mHpLmKCws;yGLV(_8~w>yF=$^ut`_3 zQid%(NBT#OIUWwPl}}r;h!h|rDI=Uv;fpAtkOYRzrch9i{|gjh$?{4QuKK^0M9y5V zsv_<-#*tL^Q?jn+}fE{UxOQ3 z^D1>Coy#}f<0Y#7>{W}X1n(T8AF;B__6L2a*8X>#cmV&1X?ZOyv;CHG>`Lu5+Go&i zL;Z<4W_Osq*poFrP8Q^A|EBf_zo|)L3}@z<2BKO!n%UP@HD#;G98lu{oAi+Q-j6H9 zaGwu4g$uf)X(r2^-2;(y(Abh~cPtb8`sQ~)Y*Lb607gWH&t4_2c?&m`spC91kLf?B zukrEwA)y5BXtJi|#&C)cHle-U+bT_Bll$P zh-o0IdcP|G00000000000001ZoVAlpZ<|06hVT0;Mv*1kQf(I$~M?caeRlv&8 z+Q48|hF!Y5)Iv`FduA7G)B2EJ$^mxYnRj@0U@D$$_!{9xNgD)ld=mt>sAUjbsaF?Nw7PtV~#yt`)XeFsdS)4+?+svF7%Q$Jh&Tp(mhLm0+~;&<2a*N3Z! z_DO9Ss||v&S|oPn*T1E@Rutw$rSf$fV9o{?uD}U?)DcltMsy%? z%XSRtDjOIL5_f_zc^9kMQ8id(PTakc%c*T1DH^kb>E)%$ z`)?do+mWls*pn6(`%FZ{Arl4mi70qvB<-~Qw(`l?U8kCk> zp(Lp6NZ#l5rT&eU!h=c~OS;b@4%&^zy%e%hbQr}~56gH6we;UR#Y{*{U9|gGP7h88 z^gOnyu*1=4Ynqp#o0^je8@877<7|Fjexcd9R}x_()m9z?;gaU+k+JVea+`Arx44BL ypZ41oZ5KuqQ>EAQDMW}A?9GT<&i$|^s%o@Y=N7n3Ss@aXM#%Ma-_JLlB1Z`fNf2%T literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_kern/_ordered_list.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_kern/_ordered_list.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..1ee7c8afc28ebdf6a318dae4ccfba5354e17df67 GIT binary patch literal 879 zcmV-#1Caax0RRC20000000S=o00&V30000000061|NsC0|NsA;k`hs9*#s#CRbNDp7eox4cVqpNm0%zI)(DkFCk0pa#DwxgYd%WxS^FMFi zrD$ihA*9v}v{5|6ly>};Dh>ZV$J3ALEb*>R?uFr{e&t2@+D{O>48|7V72`B8LR5n6 zK(J@BBY?ln7UHw4q+0i3Dl5aK&xe{ER@_msW@s^C)HY=$%ZyZLE9*}So*SE}78SNp+!Ofg z^<64k*fw)zAu;UBgHMEAz-U%Ld=A4Qgp>*RZJc8GCNSKyELm!T-CaOsVCHj9Yhu=g7E|bWaJ>dC!j|b-Fxf^8sK>t{xpVPJ$Tb;1FOMc zvUBU))}jWv`J@*|amV7z+ALAm*eXcKKZ+aH?E>rp3OO%Xw+F(SAGbl9wX4S|rkxh4 z6gFM_LRnkjM=rR?Wvnw=Qgx{2nU;l1I z>uK6luR6sOwcKvI(k~DAtrf6Z(<$4uw3{O>JgisZ){Zq6zo<7<3~X;YK@_VL(|9_l zy(mED2eG;mt?Etn@AcLHkVtCtnU)8UtRqe=>CdyP=*6{@7Z?_$^LICkd4y-tT`?<` zbAgvI&K@1Q>F$*7&FQM2F&a78oQiiL_PW@WmX^W*I znK5~S!u68?00000000000001ZoP}0xZ`w!@{_bC~RksS>i+i5zW8O0p_USPcjkF!c4qd$J7=|ZHW*z;gpEea<@IRv0mo!C zS}=#(U zOUc4slQPjp=xEHq9Z+41;UF-1E%XXt+Ts4tdj5h5^bw1)Ku2tzge{D=NY(_V4jN=E zFc;WadB~g=K$&uuh#NQ?Ubv>+wT>;ZYN^WdXN?04Gk3-+w|5EkS}AZ0vwh#qh+m<> z;q72BsA5PoTR%Bug$tk#dZUAsVS;`R4(~J*z)WR+F@ckp&X=8W3)6P%Q(owA|Bp4Z zC_Ke@Yw9ieQ-$p0qYUFZpMS6y^JQD7*n40_=CB$$r{_HqL(oC5E7&|kNDVHAeNT2E z8fJqwpw-3LlpkJgG|kV{fzxlHVn2s9zA!#a7Kpn*hP*<$TdJ2sG$-R0y~!gLIEhK+ zh>5x9C^f7Sq!we{MNYBwkna@-HKfu*Ez~HV>r@xL<=x5{0!%gx#_>YqijdX&A0^C& ztIaP_+c3VwK4e%D0+0a*xjQ-u&zSANV}{7!i!NB-)eQFuR9O$IpiGJ|YhD90FgOdvtr1Ep1p% wsUP&Bcw_a@0%I_izU=s`CB8>j(e63+Hy%R{SsQ`B!i4%{)610Y7uX2~#w`8=KL7v# literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_kern/_subtable.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_kern/_subtable.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..a171a022d10bb4b1e89f58891a790803074ec304 GIT binary patch literal 1213 zcmV;u1VZ}&0RRC20000000eyi01d+c0000000061|NsC0|NsAtkKyqe60oTgf!t4` zcVjPk^`=Vz00000000000001ZoUK=FbDKsG{?4!1DoTLHQf${BI#R?~apX3QV|yaG z{Sap~XE+2kI_Po4_Bj0a?j3M|-m1>T=&J&_Rio-8Pw$4m?cv)TDz@R4#h z7)-M}LGB_tG>lO|iFX8-<4+UA*b0OmNCD{QG)pLVBa)`z#~jAvnWp+Qnf-qCeu~d- zCJZA>5iNM=ilJIJY}|-2O4p>wmDL*`t_FkiP#u-if3lEoaOaA9lvD2_OwqPzjH}QI3Ux%ZRdt2&zNvZy#y9 zXsZ-SN$8^?X#hqeIJBWKuLvt3a+(uUK{N;Zz zuGWkuuHt(dCnAhl8QvsI11&l*F@Yjf{t^+ghR2CdO^p1boL)s7%< z1jeZ1T!BoP2~z@9PKN7%qTmZiv0kN7eWYgBF|zcWI1^Ua4{XEui-&@yAOZ@-)Dtlf z@NpVd!%emy;+wr!wx}O8JHOdOiV91X3wb6#=sAK$k!9-{QI=QH?X{Ejz7BueZ7qI1 zDoa9UOS9+_$~WRqR`JcE*{pKBWT6kR{w-{)5MPa4ri)*<~u@!=BNmvgn#8d6TX~JnrnNT$V zv0t}Nvtg1rUF(>Q%_4!#K7i}-=gH;F%v(!|s_IQnCy)9eqh6uj8qiYEbL4SXhB{qE zmG^TEQXia(41WYEguZ=MVD=vXZJ*?mRVPZ`9MjqRtDBh#8B3^{G=v0&^y{0y0=9t*yy%{Ve2?$ z|eD_zZs!9Z@jjpFYCD$snrA?%iRDt&8 zbgCR;z$zHdHpxX1|9)!-lybT}5aXTMS!OT=4L@ki;4v3^G6{mm$z&P$^C=-W38UL9 z@SJCtkU<$PVaWxf5`siBmE`FbG~J}EqdmC({d(~dELI*NbF3@S34^p@>5diU5*Q5= zh|@!njIkeAz#DK;uncxIEg4V^`-CHmk{W0!$e5NqRIp)Tp0%A#19swI7sWK_9Ik*z zKw-$Fk`bEj=|Q#ZZv2Jk2ab2|!ke>RICo3e$5Osy60UKb%CkTqT#f7`@rZB=fd1{?|CFFU~KT(LB=vGweI`nee;W~;7U z-X1Nq>T$7jt*QqRWfot+`Ic%kf!RL6{nrm6=tUu?^!tQcbr3u}Qh+{%lq5Yh
W*ze#6A&fieh^3-=5PTg=f8x}8t@s%i?epU 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 literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_mort.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_mort.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..2d39c9580612b745ce59cf796022acff86eb25d0 GIT binary patch literal 780 zcmV+n1M~a<0RRC20000000PVa00!*<0000000061|NsC0|NsA|FQe03PH(gIvj6l# zK_VuSD1J2n00000000000001ZoQ+lAZ`v>re$QWVnwTI`LF%5Sup-z>yKaRd2-?Fo zAvZWAYOpigX@x5O_nqzhaN43R50>rk?tJ&%XD27o1KCly;!FiW7+wXzj0-jNyo-dA z?K#XRv#IC3fT0i9*&$D0Mitp}ktbZH5)`@5D5MMs#OP4Rm`%g4cb6+%M+NQ{l7dts zjqn&fe?u}wsFIh(Js9I>5AfR`px2Q!i+wz1ycsr|TcXaO6DK&Z zVs8?XzQxU8y!xZndNExFfer~=U}#kcWXeV z^<%W+ipUJE9BQpp=|I6UDy1V0&0H;vR`Xs}K5WF33)Fc}i(%nN;SKf3h-5_66#IU8 zQmu#@aiq}MGz3=7Xwz%Yw*)WrTq37Qu_vsr3o<+lnhPo^Q$%4hz~iO|F0m%m|4~~O zXfEDKA}bzaN>u9-Rw~pB4K{@0!bWYpb1qMNYq0j#3)kCu0J^L2@@^e=t7Nw{P8r>5 z)O`sI12Hzywhi9Lzu24YJbBMgNadeRZrbRy`Mmj)d|qGUFJR6Yg$Kr;SPe|p_;zL8rg13% literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_mort/_chain.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_mort/_chain.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..2ec826080ffddc00873078bc572693efb825f548 GIT binary patch literal 1528 zcmV70RRC20000000p=J025gN0000000061|NsC0|Ns9ckC5#VNjq@C+H1YK z$Xu66BWdFR00000000000001ZoTXT8Z`(Ey{;pqf^Xy7O?Z7Dptgsg^S(|KK-K3}; z>_b}^tW4QjWJ(a}rh)7Kz9T70)Qg>L6A)M=kN1AhosyE^j;ttLB}|M)^ZC_i^e)Np z_0^h0Z0tB^Yf6@5?_6yegiis#<>2<@k?>Haum4jGQ2vj&C zCKA}tO_Dv>UXV9zH{{%rMcoBUB8$!A-%uM`8@$(t(-*$Y ziiTtxi>sKdct2+~rEDeExMEk7h;2qM8RiF-=gdS`#Ra3jxMeA(s@IuLXR{7c)N~6g z9PrM^&($D!r*Lx85aok*#8CqZBXS}0hm`gUkuxep#8$XLnbg>rxQuwQtQ#?#O{b+1 zMn<~jYdEi&(pSk+&>VYQfr`0ibvA*D!cSwtwKZ;ygE8`HOtd2k9=2be#vu1y!NKAn90MSP8eYqh4G-nE3KJm_#q@ITV|u50bAmL+I@*5qVl3%9dubNY!M# zrACGoJcHr4;c)nKUKn)~koF*q4kiJrEvTos9@P(bv=x>*g$xUkT2FT_yubKxc|CU( zfIsPio7}el|_Q;?x1r4djo+GSpki3 zH-j)sHhH@MY~5cTAV|^&ta`h7Aj3y{#}gZd4XGvaa~t@*?xM}rNVceX)NVp)hMmuo z74*K+G8WAk_hHxv9*~%1Ey!COluG$y_z}{W1azImOX)Rql}@(O_5xe#EF0~nuBvGa zN>v5trLj3O7aKXs7Hb2Vd%v0DmPWh{=p+Y|D~-!VD0LE6V~N9`73cBMRQ~BmJzDP2 zsCV6|&I!JMocR;#q*@zVn68fZ@||NrthXD&1`@(lkz_Q@D5p#i5hVG1wWCI3oQP{w)+B3%HlvuGOj9WT zNNbd1o>t{$)IzU={env`^}*_yQUMr2?S60g@|%`y zAJm0bLm*ccAT{U6gLpswFQtyUe-b$%^p*%Qx~lOVMqmv}xjB8XN1uEX5ySX*;!IJOnB?D@x1qB9*ItG1On3T>P87j_FVnVv&vHPSYgekF0^I~!X} z4W-WIJ(*efc&$pg__d#9gstcXbHr_rhx-c0efmvoNqmT68m*KA4xDcp=E{Mq*9jX0 zj|zChIL%ZFHwjEj&ome)qd!U)eU=lb=iV~Y`aBo2S)SmJ>$|qQ{%9q$=mn< literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_mort/_contextual.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_mort/_contextual.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..d3668802f73194b806ea2a74ea0636e7664998bd GIT binary patch literal 1342 zcmV-E1;P3N0RRC20000000jO301of~0000000061|NsC0|NsA+1R^`>gIbuU>r{!s zf|@4E+m(3$00000000000001ZoTXP=bJ|7}e%G%!RdA6Uz&O*+cu=9H4Q|uKaVOxu z*dC1nE6`X-L|SUQ4*$L9>_u8hCUII#g0+`(|IW9oO)$R=mJH6)gbxO@+1X%lo@V&^ zD^9R`z71l}vW6=bERNy*_=`Sv3ZKE@2fG=uSYRwz54%znRkJ;m{S z%Pni0Gst-s&ABJu{|>SoKHWK|Z>D2cP8o(Tc@*c3SyaD$azXkzRj$b8Hy4A!Swtg? zY`~DLRh88R(GLsbfrQ;zj~3vwegLO6kApn#Kx+|YY|f)J!S^(aSi%D}LZLGj@NLG< z;$WG(XzbMYN)0)SLz
  • rcB-+%~6&Bh%#5l7<^?Q_ghnX~~+)Z7o@wZwT)&NAy=_ z1!Kxss8Zy@=g(?h#*Qh)Eh73(v9MDJc?B)r9cB1tSs(B>2fkt;u@ogdg*98J*@MOp z)kSQ6tfmzehpR@y7Xf$WP|vk;Ob45h`Y8_(xI+@`jyQ{B$MtH}W>jw>K`)p}%%>YcO6vJfmg2145`f-yLIX|I|V2abCbzie>#~d(?W<83*S3%+&6s^dZy7o zOs7%k)Gm&*EO=0EKIoNou-Qb(QVfOX+hl`W;MfU0Ho>{b5v3=N))A+AUi~Kv9a-k? z=&>EMWXV_U9g@Y#jmim<0}JLWa8Ao)md!x+0|9e#pyiVmHE!>`Vw<5vt-7_2YWYGQ zex{!;Ca&Tm9AS}QfSFjZuvELV%3oOv9f^VhhB5?=3$MCGVnptc@3jre1G(j@D8eCD zpv02m9|@!;Y8t7Q#d6&nuM&P~x!z`EmCQJ<*-v`5-cx2fReK5-swi^$F5JV9u1DKm zz$OmnY?a0fhU`u!f`MEURwk-UP*no0_HQYUPDqS7H4Li~iCWZ4sLFx@(35Q}qF3uh z+ds(~!qL4}W!X)m8WdGRI@YCCja*|DSqvfBAR*myq`=dQ*<^^ zJQ&Re8%d-(-^3Azqs~#8106w$Y@){}v>-a+k*I}z0^3HG=_8xq@MRIkPFwO6sT6Tm znP^`&G+UTxDjB4jaDz!s3qcdVq9Tos{r`uFG=Z?g`ld#*;(bXz=)m61JdKeda59GG1~D+N|o*k=oaZ{S6FKV7?E%9<*L4 z0TcM8@({K2YYAOASPZD-zU!GSBIU~?t2?@C`Nmmd^qAOCKW0gVXo)J1$T@B2*EEqTtT5D8-r~B zHGbFLUDeiaifAyN9(ZXU8|x#AEc3oDN1EXmQYo~D3*0avU;u7x>% Af&c&j literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_mort/_insertion.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_mort/_insertion.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..05e84e1d47ff9c18c3cde1829b0fa209900260af GIT binary patch literal 1481 zcmV;)1vdHs0RRC20000000oHv01+hs0000000061|NsC0|NsB=a9h*E9Sez^(nsTi~viMaF+JO_%AK?C1~}t3SdiJ?hjOzyCoGfELBc5Z?|N{WGk1ftk;CM=p+7DdIj&4kRWrB z1JBRdy1YBO6px78yT!&fi~bQb($*lskzsto-we_v0huQuO=Gwx_i^%+=LV09IK0u_ zion6L=J2_nI&zw?HS#1Jr#_}+pNq8yDTyN6$*v?$q0`7@?>Rju2+s;3!3XGY^tuQ> zCgGGDI~AK#q1Q$r7mg}sHA7J<=OIf^eYPw#G|KhNnOHl-pDn>2mYT|Z;vxYL7`J%Z z8f+{vv$j3;$WWsG60a%0nr&w?KY;h>{YX3q1_OBGg0}8;0>{x{8otQMQdc%twH4-i z&~8J=spNhbpc2KJ>&EmJ2H;iCiB#heV1(S+weTDkwzLKu!YwKutNQr(!*qN+QEb-` zd4NQwxKOj?pa@jeXd0(5CqYQbTn!Qr-iCv1cin)0t2JA~P>rh#*K4{$=Cw_FU~+=N zti7$P6&CMO#r^+%JyX!OH;J2yv_^r5&_%jbIjlHBM9I~hl{o+fpe@NqSeoq@WL0BC?!8fx_)mMaN(ZY- zbNB0H+sTP=9R5w}TqqqUBx}?u3{ZGfixBsEJ=0!DLHTFvjObz&=F-ld>~wUOiYqFw z1i#+Xf5$5h0!9SMs;3X(EpkiA;Kg~)%sfLcg&5oU4ya+!lDzgnD7z{hNea?6xw)yO z-*Vdz`*4KTvY8+G2^yVc`1WPbk=>x=F&*=$y4l-=o{ywWePF97OyQOLO3|A=I(_(u zKSx1O+j>TK=H_hFTXN13(AVDWEmH8ickqVOb+L#&9az@40CogmiPfoNWm%$C`i|T0 zB=&oM1shCIAYTv^egY4=BI-(v1fOnm=c!S6Vc;tk^2Y|lSs)d;-l_7HR@5a+Rcp7* z@C*~{7908Ob@g1eMmi1;zgkfV!FH31r5X<>*b4H_33>Q;K4##%=sgXAq|KIMhsJm6n(z4+A%vSjm#cl9t6PQqESVFH@pnX>g$30bt6uRYIm_KF?s6MI`1`-<10;vBolnsc|w@W(Mr(vlEG zJ@XetR&5dPDb_9i>Vnxfd7&~AxHj>RC@F68AER??D>x1JZl%LY%}(JEbV;ZDx5Lj@ zzm5&#V~pf`N8<-tY>ciZrC&h0fjq$ZyL>vu>5zp{J5CmZHjD|uP32zz jd^iyQnV7|^rzBh~Q}F5Bh{746EToHe&LaN;8#BO~V29XG literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_mort/_ligature.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_mort/_ligature.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..c36b90225dd622651d0a223d1444c46a46c97e6b GIT binary patch literal 2071 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

    u?n#N_yO{m4@CaBP>#BCCgc3Rr8#i zwfcE`vSOe6T(eTr;q$e|G8bd!GNhfsu99vjAE{2#9H2wV`dt5I~`xg-AH;Rr3o>|!f{Z=*w<;;v5 zxRX^Ea^#Z%WLuQXHU_3-$8BDSF{qz16670gu{tQ{GPZg(2}|r5uM$bNi;hKf3Z>7m z4_PK}?Le#tH{tA#yM=nbkg)Zp17AmJfD`J)!C@DZJQt6T``M&BiQK*2!hw$s1PWer zC=7xW^9^RaL5 zsz6^oIbT#*zkiWVOMc03S`>p>2J%po#~BIu!My#U;n43FeV%~d@3;B+c+l^&ak3nT z*-F35$4#Q&Ebx5X=Hn*4ZpX$}tI?q32Tr2e%p^I6oxF#aZ2oDt)9vs`&jM0+KAl>U z3z6kGz9xyyX0zYS0jn(#S_OgQCpO5ba-C+c<%crb5znQ|Q0WJHLOl_&g?X!JALf#o zlE=e_JcEKm5(O`t>aw|9#u_cm-BSqZ;(REwCefMp@sqa6-)>FY&dgxKSr}h7lblYY z8LwlJ0%^-BkEh*J`il}^?ugW~!2oeB5ZWSP7tkt~3-wmF*DC}-xuI_ixox(ZtC@KZ z!vrC>O~m3Haup;N1^_e=?bJ>8w{#x(dTJ8g8#M(wj}DvEi8M zE1h;Ao}{FtJIKeCIn0zB$+D1wJ_43KgH)K3C%;SqfmQ@-ANCsc3eSAshKb#UY z^O+JJX{F86Gg^0#e5S~po2w6&|I4_3vvYeEI}vTA=r1xrF=ooyx#J~_GSHgN7i>0JhfXT>&e0_VOpKA zuuQfXr9UyDf;lL9!gxZ4Oz#jJMuc@uf>=5CX>o~cS*{Z~5%w!ZBg!hlF;8%m2Sm)I zRV3SF+hiMpajx-co1VrXBG)EqrOB#%mWHwji5vRLWiONn4yFB6Ca6!7ta z_``-TlrOw~I1oAtWNIdFWU?kXO=L30=o21oZ3)qEg&>e6`kN(q$hEV+e`IvWfZEfV zFV`-pJ)QVc_tM;`d|5$F3oVM0sP`TT{^gF2@de%=OTN;)0C?W>RfCr8wq#|!rc-`d zx!aSmyZtj?Ck)=b?a=LI&g+(M8nAuU5XoplHxhPu!HAuk8uT`XJePCEsVBZ|Ao@uY zPl-USEsr}si`3zSGu);n9V0(y(n}^MN^FKo=03dt_?o=INR5rZ3IAHJ=$8aM|*T0k!p! z&*v}A?Ki&GGc=EUtz$s$k&xc081#I}mkq-Iw&8nq1DoIYw0vnU{~~l?W~N6MX2QL} z1)Pw*pPS#oZ3*P6dA@t~4&7Z=ygc)ARp**l=bCynpspJ3cgU|@PzLzt#*e3~vA<4N z&E>;Y^Lfb^4a|Gk^M!_i_6-)(8Ak&)s^-Ww6S(LFT-298w0?9)hSZnkxo?U4uFai{ z?5;KIaf!V6x%sv+;G#KM%>ieO+VuR)S4TQ8eL63n-}q|LK)`ptYJh!w<~s&4pNwMe z8pPZ+iuriFvdB9vIBBsVV>I5^<<(gFu)IUIV4(GM#q0gys(D;qH`iCq=iRlOwpY!i zdOdm#S=AvUX8Cnyy=bIhnq@84?RQ{3Mn>Oh-YTmRY;F$Fwo5w zKiW`yxrXfB9TGKA5Py$o7OFQNiZ}{+T7h;wcqwv%|CTp(9#Jl`)FPTMfJ+7 z+%2!{Vta@3go{KWrK{;07d%Jn$E#hRmnVZUycoE?(Xy)!xKy~bjW%R(gHOxv1`L)4 zJ=hya-(ZEl80o9QYz{k=Vx8NFi34Ns%{>4>wAZ;oBJoMG5=u6-2vrSzqbPM zD|8O1k5{Pw##Z~))mD$-0e^dIjdjbXE5ZJGI--R3lA(O(+kHdW+oPQCpKS1-neuq| zmu57mc)$E)4ldu(6lT3ch06n~$C&#y`raJT_il^6)oV!o`hF#&dxp@$JmEEe z;4xg)F%KKO2Cv`Xl`nYB5syCM@4ue-(sFmyft<(?UU)=R7W2GE-&?%!6@z*@VX(Mo zi_uco`uYbv`*31tP6Mr8Xn4f9sej@rc;X6=s?Yjz70-La+p8FrmuK{S_lUkv>qdg}u)QKL0O1CB;H_5m6Ta literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_o_s__2.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_o_s__2.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..680915c8446187b4d1828d5da7abcf4116f180ca GIT binary patch literal 2880 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 literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_o_t_tags.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_o_t_tags.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..35d40fd4c5a036b086cc03024e7526af7f5d0301 GIT binary patch literal 6368 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 X^4VO-x9BdnnHK?QOWglIWosjD`bdg4 literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_old_mort.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_old_mort.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..85694934858c221bdb1640fc8cc053490e455a3f GIT binary patch literal 4892 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 OO^Gdm{{J6|i?3Wm*K-E| literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_p_c_l_t.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_p_c_l_t.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..8d8f7e3499c303e3fae545b837638f460ca9a51c GIT binary patch literal 1082 zcmV-A1jYLR0RRC20000000a5}00?*h0000000061|NsC0|Ns9|n6K+!%4G5Q zPhd5@oHKT$hCcYejm~g$ND)HPgXIq~R*qlh>)Flndb7M*F}8^?_wY6lsd#JPk!ztc z1F66O4V+*1$plP_fe1waLWW8w+zKTJu&g&MLX98{>`+KGzT9>Q!X1bcq;h*Wva{BpVzGm!7(!oNllER%5`e4S=itFu=F`&;QYU7G>YlreG zOCC`B?X|E$`Q%!ob`Aw>cM`Ctb zW}ARUn`uH-Ykn|Hg^)=jc9Oafl<)w;xajo&k&f4U7D*StJJLwajPY{tz-T7Q`Q7SwKa@o3+6>KHIqHitrV8M zc&p?9oz}hwtw;I>^c7^}6mA4`T7r7<=ZK_m3az(wi@fOl7(R5paURQk8o|2cOD(=% zQnverr%T6LPiW0mL^mt z122R=omefS?Xid zW$aE1i%kd#FBqR;sh!^2)P?H5u}L606JDgC5m3v1gJuD_=H0fdXw#^iI$iN9wK6J0&DF})8o(;FE559Gy%aE8bN Axc~qF literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_p_s_names.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_p_s_names.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..6f687e28bb04a680e23f314d0ba241ab5aae650b GIT binary patch literal 28095 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 AaR2}S literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_post.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_post.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..43aea9463240ee0f62f0f77b5f21bedd5f103a5e GIT binary patch literal 3337 zcmV+k4fgT?0RRC20000001U|h03?_I0000000061|NsC0|Ns9ipLn^?ecARtmD^5j z$p7Swy)pm*00000000000001ZoV{B4SKCMu{#}1XP2w5w1eh^N-p)YC;1DPAEZ2g` zoO!&q)V6z(B}E6|F#g~7t1exZIWl>>%S({dU0vr_)zuP_axc_a)0;3zx3&g@H(OiB zVUlh;&dx+DuS193gP!9wrfHqtg}#?iI?==fi5r_Jr9e$}LZdJyt=tKX{aG|AIlbS?6~}6}M#C)S0TX!o zTJtpxDZL8GH{iZO0|*+K7@G3{84;bND)3b7)l6_$2O;wG$OPJ>;mi^b;!F=_QMF3A zCfW@HkKE9z9*0v)Jc7R*&&1kI{n>`&?1$ln3C5H~q{KL(RZZ^^j8}4(69{#XO@}&$ z;tm{Z^dmG#E@^wCk%RArN>zv}Mt! zB09CiDa=bK98qVDHt}!cIekM<#kuVEOC2XB4CvX0bDBj_7^gN^#W2%D2*MCSk8Tu! zWfEz3L9>HXtBj^A1;2(?L3Ya$ib@oK=a%CTep-=r%nr3i>o0Fs7&$BRo0a$7{gwG2 ztucJ`VOt3Keu?gMaMC|~dx~3OG_O$JKRg|D5BGZXzI)Q|zS{4dI?n4%vx1%(jdZMo zl#*GJ>M8s0l4Ds-_-1NSmBI(f8iyY!Wu$Tt!Yuc?Q-lN#x>Uv&hlc=8kj9};R}6C2 zbRiZlJT`={Vw0vifai8Xc$=Q##y}TpH4<}cD+o8AJ5GNDV1kwQ{iK=OTU#OG3DH@i zYr<#~Spx%=#|W^o3?LsgDvA;ZnyjQbbm|e`C{#fd9A^)r6xbj$$!2Drkv5AKkPI2k zkaI#A4mWG&!6Q0w*m8C@tE_BVl>+l{I!+g|k|cBuLU5^bxwr7ADJ)@TTpNJEi5X8c z94>lYnRH@HjV%E-xncVhtQh(T0^E_z0#^uOEh{oa`GmKjfae(oKrQ?W6~=Isz06I+ zct#ZziW+0=LZ=|l@%|=^rz+*5V;_Mr-?-gi?8|co*Tz29!%!=HaTLyUF9Hqd*~Q5l zgE$C{j(%87zLHHh) zCiL-Yb+>=orQIRWbk4Z^y1E+~%{xKseedKHI|H>Cz_e?J&rL82t7YwNC)OV`RMk49 z2kc3aRvSG_jh`UDh20KywrT0-F+eghfQ|3Z5QzxYTBQia$hzI8Kq_G}T(_i_bvB+l zjx}e84Qna_9qYR9(5iLaN)^f#+IdMUqm?z8s0Fn#vlL#LPnPD(KsN~LA(yHBVyYhe z=2Q&^cdqK(xu~3BPn2P{zS=+{0r0dDWWJBA3Z^RNT`|^a79+VLY3yt%ksb=4Gi2@*z#6H_Keg!Bu1Jxb*+MxJwbkm}eZ7Zmwilf&s$ z(FBRF1LkN#j}p}B34PLWNMWFD`+z-G^KPESXdh5p5_4@OB-nui(w1?65P+YLeJ8kPuiygI;0~yrhi!}Cv-{! zI-~dW3;jyJ(eE^jQE+r>ZR6S_D(9nxovs0>V;4K1g-GIt$e3}gxHi&|T=EDu(U_zV z82UF|kWW(zD5Qu!QcUQND5FcdqHCJbCo4hcQe%0lNkguAn!27r=}S<)yD?YUJy&}M z5wk*i3iUzLp^zSxq-W)w5(9Z+lA}un8 zNDQ487-m;sW5TK_P(H*?9_z8;MVcGVXeJ>@W94a1B@!(vTaXnNf!!V*2~tp$OkmQP zh(IDBrI8Jc)&;Q2!weXoW~@qzBFX&@B^mO@>Ke&@Mv>vojUDf!XY)o#0nP|PU$%^txoP!3)MBcNTKOUu(~-S^GlCHzz3T!6x36`SV=`WvLcEHkzk*y zaT)Z?rSZ7?{-gt(u4ZLSek<=rNFwV z3C)?%oYnZ8$&AMVOcF!2DGAC{xiKe4tc6UuY_jDog&?m3lPnmkIGg$k&0;u44ZlDG z%S-nKalTwmWiXM;?{fJhmth=U=zxn{4_zKkR#wb!qV-HJgGm^3zsA2Mf2NtAnh0G4 zWG0ynOU(O6bghqQ`Xb^YJ^}JYVmgy9AC+0W({oV?np{+y8 zMGI8N-ILzofDhjg7V)*DIA@Li%ugci+#oZeRYYL5w52Wyu-bSIf8bov#OyNEH=qBo zZPCy!i7N7%2g(;2<^%h%01iKI-%ek9p;4!{a5bf`N}NBmtd=K&@;SE8Lmf(3ufhoxza6VF?rhp3tkXtBng*fC) zr`^6I0(V6WK4HdxFL1@8FN|DOEL%u3~o6r6AmrTAaMwXm;hYk7qb!7WL9x!9UVV$)F z@7!YNUY-(5WKBM;MRf&m61W1PO!%1w{hxxuQOG?G&$Sok7A1*2x8+@FWD$WM8hN*{ zw3a=$ER@_^Ts~iTLN4hqQnSj{<;rlEhKp;ys4z5Z!lFgKv()bXj`K@w zQhqUSU&RLcYU$gB^ewhm$@>=I3I|nFd>UzXFksbeV7MKbEOjwP>VB~~*SmwVbtn`q z{8M!yoFxmL%HQcxKEL^Bw7RXwH;X`+Z_`&xF{>cLO{hU0*c4n}&kHd{VYIs24Fxxs(+Wqv z^nrY~PP|VY`ic{;q12s9tjbI0pU@g@@mu6FSoMUfTGc4#eVLonqbzOorbSn3yV%>% z|8SrB%Lbk>u>#1g^@fTx#ZBO+&N+-Bp=o!B!Q9d?l)Q~7k<&}bb^;C)doH6u6_kur* zf?0hJuJOL@WkNDBqqMdY-zUAfYv=C_@+Ity(WE%`%eH>+hF-UN_q<*0zmQ1!BbEJ* zZQF}M_ID12oa@rMoTOQTABjmXtlM7x89ch{?bYpjdj+nWTe#M}z~97!bY*TO*^mA^ zE6aFUp|SBWVOG8qWr{X!S>x}TDpxS-RDa~~>WsgZH~xa)TgN#J(X&^7&SC!;;936Z zv;4-L^XQ%p-W{Dd&H;ZD20F+66XS1$@pywywWj?SwNIpc`_c-jK40(~ TY2Uay;5XMB1v38w+9c`BXfr{_bCKtC#?(rF0*GGP;g#mHL8snI^3h zGRcuxP3+Wm+MImH~>i6N~e0({Y zUf$jaF^!c2`bkKYR;f%NNTj267;;o?e9YqlS4M|~@^X>jAuMuVdJz-jls9%Imc|kb zBIs8cg3`23OO9;uv2n;O19T1@EUbJ)KyC6U25&f_CCj#+7SRoIFGNmW&RZ4uZZUt9 z*1^M5V{kb+gW9j*ctUkFOIxK=Gp`ayoh)Fd>`*aIxd`$RTYo~dTkUrHg!aldeSw-k z>RXx#F{Xb<1t5gdOUNB}+1@DO5xrW#c<5B!cBE#B=3D8Ivt`nUntG$Ha1?=0z%i< z&8q7^aL0GL@%2-!Nn=T|%0=lAH8~xdG}`zr`4dD1(>*=+jrb}YoTwA4uW zY1}=%edTIit_DseEn}k=Oc3F!S1FCB{o;uVOt!Kriakhbd!ho=uKE=H2Y!vcA7iOBkiY$;r`P;|TV`E|EDl$R%8Gait)?!JuXxA#}F{5nBv5>to;_tv79em@f)!;hEd#dtQf zlu3hPAv`~>Sck)Ta?~-STf#X)E3-jg=GDA&iJz4Ne+o6x9&r3Jj0gNjd|g^#EEohd zV0@SN9VaVDgI^86U$BE_EvCL>VVR3%@6EU&q6Ia_wKQ9XIocIOQ%++V%D4>vEI9p3 z)3yh*#dP%0?aG?KIMx;k50w*_kOn#~7SF<88_46M0+8j+V-VF>VV^TiO!tMw6TQ zZDWt}KdYdlf%Do>DKN61S2z-+dQd^?TLtY6qZF4Rq5`u)uN;!KqC&DkPfOD?FsZIA zmI%2(%P_uj+#R~SP+Yi$J^Z2`S~)nJ1)1I?*SNjbEZTYDR#zV;JQSZ2T1A1XyEo`H zap^KDG?uptN$Ar!*7%TYNkOS~W{Gvt6|iJ*sfv0;PL!s~h~oxpN`*~zeO1_KK@;

    g4i`k-NP2HNF2aVbM>V7eA++~4wh2qicqL;%3bC> zYljA!C|SGEj2Rd33N-@f{Q=Zgu$LEF4D}mAv()KP*}aTECHe0Ev=z_ zb_(s47V-(Y9Pqxa2my7as{m~mVi)1j(uZb|+nfo`!Y%mJ5pBWR+}pasY*qZJT?WWN z-9O}H<*jkP5R~hVQ6e7$B+PF8cU%zDh;SmpTR$Cl z;nN_%O?lk;)s-hSUUpQs-lu1CNE5+{Z{`x_Dc-dd_-~RX_#Nz@w%u{Q%d@*_F2Y>F z-%L1BR2DH7TFmceX*0`=Cw)LMIX)v2bh!_TX=k==_YNanl2Kfa{q)ONC4*A%>9JrU z1a1`^BGgCb*!Ed>?JH5!v#Kg z9}MFkhT2B#;a~a!cjx(ViNlN7^G_Jx4o+Z3DLS=Rs{930RRC200000013PR03~7o0000000061|NsC0|NsBw-i6z3I$yp^fe&yg z?y$1xrTowU00000000000001Zob6ieQ`&D&~OlUfnQu9s(L? zt_?_5&5@-2!vS&r;(ZMy8Vpn#Tjnkf3|MvvL)h={@9!U=-&(36w0C#AuzN~hA$`&R%iT`q+P~GkzIPmo zWxJ*1Kcd6fX(D(kXb*6-wv%?Vr}9aJ#=mJ=rUE)0&0^0C@H1aQyQRIYgK~|=gM3tp zU_yhpcPJN)l3SsUG~R`FA|`I;moH#12keD8En2E~JmKhpzCX4?B3p9EF0`Z?qdO)_ zbYX--uG30K4>G{LO(BhP=fSX4i#di1x;c=~1w4j(kuHS@8Bx`kgy_)}=hjUupMF6U z9h{yPVmT8!C*T*0aVfN}%;Lg%&gs!2^u^>@QO3Y%>%;j3COkk+D3mu7-XjSpDH=lo zZS8mrZ^B9XYg+!`HDUyz!EIv_UKs|q>l|$I4$+(`9zDQ68y&h$xr3eBHhbxgT z66?dEi-#;~DKCfwJ)>XT{mPaUJt5n3HItLH=nJ%IjSsZlnx4e8$6a!lDef?SlY8sO za*|Kf14aP)P!4FfBn8a?r^C?@T03L9+}rCos+>M!_Xe#ZL$nVq2fzLb?Q8{jGeleB zh@%+aw&b1hS$#3sKrNp8p<9ZQ? zRzxe$kmMox-c)3+$XL3gPbL&*$Ew6w6e}7HYSZI|nzcuIzglL$nifF5+6l`~UoeBJ zs+Luo(gM&PJ(rC4(#_N>S}?y_&$MiS&C-9PX^a?JIZ<)dbq+G9QMfgC#<<`?oxnNK zXndDH9T{V{3);Mx0BVd99lOOyc`lhyKkglqp>vs!t<39es^UO;qCK)XpW=Dn1#^)w z(P;>l9228Xk-r=94?%f6;7PkO$J&+U8)ug&(7l#trQkFc8>$b>1hK$37n>l6mXyoM z_Hm??#A=w89mQ6`{t3$YhR%FG4c}%9b!wT{MtD zw5JPNNY+t8kZVZ|2W={A%f9Hl0?ACddg8%CC@gS)p^_*UA*X^~ikRJ_IrNtJwwBVM z6EC+QGt5c_?Ryn7TCQ<|PAa;XkuOaqXlJ~5!2hU*>{xtc9o9zLTHr&gpc{@mCN53j z!V%_tv!q=>NB5R+*G0pU*GpwFSLyWRGQgmc8j5-BsF)lL?+%ncJLtuDOgPelIcZV4 z4F$Tq#vYh^lNpZ-3+{}!6**U5r^jVeFn+CLP5!g?-FF1_cCkDslOIy>K55qnV6 zp#kQPM&LZT@ zTj8>Vz2W9`ox5)r4k&5gW|ryqX&F36^qQh(OJJ1^Ufc2?AZp1}*}lC(`o?*i6e=P+ z6Gz4JR4+{HPgyp|H^S+jlXV-gu5MhR2HImu26BsV+cG1or_x{5z$Ohc_Fg1Yf|B71 zdbOnGIm2)Pm8FBcQJgW8_%i;8oBcr5vBU`^v$i;e>KfJ^IOBuleL*>{dHKU_?<* zvJ1DZK!kUASh&#r-9?-O;h6{!BBy%5G}^K@=KTtS$m1IA>+?e#CsCY`Pq?pq`G*kv?a1Hot)qY$mv=wzsqLARqs zaLJh^|bSs2BG8z`p#vq$-(dtAd)V>d!0c&G9sc_uT zcR;Vzc5Cb1=)mU<+{l(?sN-xvkMfLmSkJzihok6J9esV;ris-Upbw$DCgq1Ec?;`o zuvi5ER#?2kdgVaBt=PYYb^85gD;5o1okQ7gz15sM7tK>JTe(tyM@1^AYLkqc;aJl? z=UtX2H!b;Gr&F%k#ocde$52S2o8q6_{kvKsO~f2QbS;@)>0$dajNZ=B+cx~GKsP%*gUl!08cBkGn|i1q+{e z$G8^#r9^646{aIEQ`=@ypwh)e_uFx78ddrZM!}!iHtlS}4L>vK=1gk0xdCmx&TLtW zid^ma#X3>G({+Ho_9Z|KVQ)@c&66GG&Y)Q-8R`b|7QUUkD(6Cu`)a8w+LtF+tkvA_ zZhD=7K~?mEA6XVR*s+qlH=C_Qyva&?TZn&j!TdhOZ{2>r`gHK`R7@f)RZTC7@kser zh!|^GEOnuzpIg`;vbf@->9!ppO?`=7X-V|Y4{q;V*%0)rj#iu~M`API6bf39 zdJb*m=ib#3#acBCwSH$;c;Dh%)%5v>7k;WyQjO*|R92hkN=nk3W)!2M?a6=Uytf`>?W7pX_|ICD2PcOxZ(ew0l6a4iH}92I^pLYK!H5RerUIi2aZ SP>cd0RETyQg83gOG5nJhkm_Op literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_sill.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_sill.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..c30cc856f3089bb2b96e8fb63280db0dda9b650d GIT binary patch literal 1129 zcmV-v1eW^%0RRC20000000b!j01E2>0000000061|NsC0|NsAEg=3PTITXZsWy(-f zE8=QbZ}-Un00000000000001ZoRwB>Pa`)F{=UCr#DTKg3tWQufRYB0(ojX>Qba;k zi6Z1=y;)y2-e7y-B9#B$8SndEQe7<}ytZfNnP;A{vtf%BTXMLKrRnu%v)f*8Dx#?G zID?QgzYCM$*OB8iw&4{1P;3(l!y#gFnUIS$+iZkff?@NB7xur8rZ*4c``P%7dSzuYrqdJV(BU_!lwwc?{OMc!&4yqHhnyw0ZucVPQaN-Q~?uLLmuIrvWsH5 zq~sTgahycg%JyhPr2CHIuZd8#9ZMlr^m;rU!T?_1-R7o;yE>U8bmluB4&YdC!96DU z9-3Ug^vgx8K^u+*{(U1mT2~w)OR(ob1exXO)kn*^Z0)?%K3kqX-j5!7J=%KlnSof< zJY-HwCt3AdJB*3Z2@zs{d6XNhi+l7oJ!(T45k1;~)=3a!6s*p%0JjTgXPJX+d;+nQ zcmn3}GSR@LQCmPjT>92JrJ~3@qJoiw0RP27pt&I|Nrq#1AtfR~BDGO&0}xRLzrZDY zh6~T@=kdGe*h`n_8$tuj^GjmtvwInNH3-B$H2c>)_Rh;LqFOCu=kq zz-4K>A_)6Bv1l|*(6#v_GU8evZqFb*z1k=tjZ3NAXWfOP+F*@tJj_VuwNT^=TpcR| z?jcgVHncu>Ti(9jvns~KGhVNMu>Lq+?RI5`E8wrGw^C-6{8E9lv|}xW^|r2B3GPquV1A9n3PS{ZAfZa*?k~@srs9w_)}uo=%dXNMb)ogn^135h4Zr7vcFXpOX6audoT2=hMtNtIU6xz{fhvC<<>#Y}lQq^h4K zy<{7Zmupb|w{Q+v1cRZji|VU-TfNRlAq literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_table.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_table.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..3ca1604cb1d992d886b94f5fdc737a28afe90497 GIT binary patch literal 3265 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 literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_ttc.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_ttc.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..366ba1a7e531d1dc03a5dda412b59cfdb25a0035 GIT binary patch literal 1659 zcmV->288(l0RRC20000000uh%01l`C0000000061|NsC0|Ns9Z<>9}s{b@%f2M`8V zdd(jhLz&$G00000000000001ZoRwE?ZyGre{_bDl%OM5S1f^9!l_V-n$rY(36`_?* zr&DEiy{s>by|KNaDCNK3GhQz&q`mf#0)CtE%ri5OC#6X4#6t3Gqy4K_v)MJid@^9{ zB9|h4&L_hUBgXc3`6-{-O8Rvv`IRXOnRsP1PYU7OR`BiU_G&u*I2+$g7#jwG83`mi z0p+-8&rP;Fmf=Rn6&5uns*p5Z$%UBJ7GSTd^Wp+dT&iyCD2SuiP4EHJ=r99xDi((?yY zT?*?}QWe71X22Iu$Sp-GNwzewyit-V>vo>6xtafiQN+zknCs}M@{JYr2S}+&`;T%vD(I-eJZJ{}c=%;4$)WCE?3LCb@>xY)t5dtF(HN3UJ z92d7(fp=T9M#ESxt`{7XBFVuO^HVBnVjqgbwzReu#~6GV&EDO-1@IS1~JLI zVCF*VTAYqqsvb~3SrafpO#7W+_4yPcA@keOQ2N0X521ML-GD_*#WsS0Sop$FvMo0@du9HPZi;tVuVwMwhG_7<&gwh3n zHCXh*MtuQ&a2oOr#;2EBu9~BG4&a@ytcIdgW`nKJTb=O;DXY}r=i)47eYhEKXJEpBo!Xuc%R@K zwTf?DE%B}JSD2&;ZE%|Ij1tdZM8~^_vUFpmQT}(`qv6ZRiz6&Uq*2t4aFZ~kg3Eh; zgx~CF@ZAeZH9tS+&Ar42-HxKt9Kc$B9!}8k*|R4}2S-{~O<)or1Q|5CRnUCGU-o)~ zD6(iFfTMlnPYQ7Ps!xx=r?s4zi@pv-p_b(ir8rXEL1 z>Rg&mFFY$d8cooAh{Q{)(8nc?h_KcjR6AraTD8ncA4nKCEFhi>Y5^e)A~1&K@--W=A^UhN_{5Jc5R z6Lxg1(F--Djgv|P=S~XM!N$$tP+x10w02u_a8^uau<%9js@KlmI-U2^|91pcT52;z z-Qk69p+wMOhpKy(R&;+m%vt=KG@IW1$=Fq4kcBRE+4N3AoStt-yj{6=Y#NdO;Nygp z#q~Wdj{d~L+-%#IH=q7M?=mr=^Tbv;Hlas<-g{h FjStgqD~|vG literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_ttopen.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_ttopen.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..bb07642b8d0f2414c8c1a72cf190a2a5715bba74 GIT binary patch literal 9985 zcmV+cC;r#~0RRC20000004Biz0G$&60000000061|NsC0|NsBfE+AJ#(v`FTg6(3{ z{mQ0|bJb}800000000000001Zob7#UbK6F;=x5_s%t~65j3q`=ysnfKIaVAw@wv9; z(qngTd3{tM2}-a)fD3?GaxI9>)BKc;wl-5Iv!+66?K0(J^x9-Nb$@2XIzDe^-T7kDwO_O0dPKTAK3;Z~O3FwIi^Yy#av%_~UkHlXOPhKDX^ycU^iq7Eu zG{@}^6LAxlDeY7gW7wuB6f$^CfN~;YF)Sw2Ecpy59BfUB(F~qkrAZl=!>hYKELPkk zrFaUzq;)b8e@)6NEpl8bt>E3fj$u85`-UIkV)!R75(DPMI4j~Bw>K@)ycYRvGDu1_ zBjZ}a&e*L)mR7Y$@!hMqy22^>3Cwy~^~F&@ zlQ0sB@wiHAF)oVk#&@_A4G_|~s!O0!CAtZU&{N=(I;naMz5pa6 zH0nhbM`o%3Gj8CxC?c8EYZ=*lDwVWhl<|AgpYP}dsSpg<|N51%s9f< zMDv5i4Y^6vb3Dt3ikQ5F;@OBN-UM#Q?({Q*_S+P|$u+C?4Ln=NCqEyZNQhFP+Asz> z0(Wl}ARp|EYYFg_r0#CwBP z!D>jwtC(NgLyy;Cb6Y#2zz=VMm-Y0ojtf-RLArdNFabge-4uR7Rj$>W+LJX)>?gyGsF?>Tp2KpJx2&Y zs*`N2#GO5?B5z=cAc;un$Pc9zS3{J@jEfBHGFhj(oDK2W-eL2Q|CrQU*q=l$WyTbF}pIZ;NgC6|C1Kq1uNClOt2Y-o*s zeEfgT--o2Z)}tu!3GpKPo!UC{>pl-VPMKQk^}C;s{w`NC=y6#?bDjDaaq04%XyLnP z0pB4**jz`8^&7Ivn+d30$GRB=koYJ7X-0tYCXHQ%fxfWO{P)RpHXsSIl*UIS%@f%y2ZUE|&|3bgO@*9eoB`Dbpf0rQfButWR&2T& zw3CCzPGWN_>Leh?vWs^W-y{)C#dKgR$7C}aeUu>02MKPfWPcVHAArt@*%AFA<3^)w*Wt=quVZKs& z7Pi3J7*5Z;!IN`1?z6D;(Mnf|Mi#O^x?Cd3k_q@D$~0K7G^SUMCmTIRmUcDIbzGsG zkrKom>7W5az*4BzlRT)bmg73bdDH-_vGMLD{++AChV`5<&;#x>o@E3lHuwEae3l#6 zlQ@T+Dp-Axu%{is4s9-4x*f~i$-NyK28^afRiy)1Y64zyIz_pngBP=+RveS~PC7i& zrDkRz#$_-f2Mp~qn&TC66Yx8ly6fbw^1-oeRg|-CQ6d3zu#8CH&?JD^&fskfi~#@6 zDvNhC%1~2BT2s?6r0NhLy*Fvt8crR;XwH4l6q|uMdikq&hy}O&pEEK#Fu7bE7(B^F z@?b3Kh1{thBTfg26#f+0u6vn|dYdw=Mjs5}|2;aAsNhE3WTeXFf~djA$U$-i-l2`h zzBo-1-qHnHV-m1Y0-MSZP0^Jk_b45Yfi(f63bSZ*S;QuB2|C6&m?uZhnZX>xf+&(^ zL`4)y9ZHg`4f)4Z3J3BB1iMl%3WVd+vxmUI@&@iiEme$R0(^&{i6rAmpG}I|O5hy6 zArPKS(?q~ti@%);U*WA>GP zE|Y17wz@#)uu9Mrmk}J)Mag;&fph z9wgfsDOV=~Tfj&cOSa}IoFivUmZKlB$LPE7j{3J3U%aYZ&{7N5VnQKCCrrHM4uAfS z^V614Zj7<#%Z&I};SPgN_##og>4CEOnIthD&7+0ee0litSG7Yhge-d;=2Omo6dmf6 z2OnDGNux_q`MBw_R?@KHFL2_&DoXfel-#64HJ}$cAsNXkc%IOR)aNH+AW#$DDYqY) za5|Z;VmL#ECFx-YN3y$UmIGf*$Fq#xXj%o;FXa{FSsFfP7~)D>;l`OJ8YGu#p0gHo z0aYm!4(b}$TTwqBX0s8UZBT76?Ksd+=ScSP?d9T}_l&p_*1^_3qOfXG>9@B>XTKi* z41#ztoYhf;%E(Sp;!FF@PtR*`0lZINN{aFWl)GWgzk@7Q;-9zO7q3qbd;3v@|B3_r zq`6d2rAv1O=D#o`6GbQR|H?WLPGeT>=wX#brjL$_Vd3v9N_V=*)~QIfS3D!q3ipwK zpUIu*ZlF`#1K3_%?3)iqalI)vQur@}|B6$Y2-zrJCG@0t0}37ft>a7he{PuOzolLD};@J#N?oO{qEK4H%FbhHDm&d zx`Wut;vgC&ADo`QKRVgl!~LV}E|Ypz=KPRngTvbZ4iE6QnS4sI*%u6$Wi@`3F(-pU1A!0IZPJlTwz*k9f z%?J@sG+1gE&F$@~&xsrW^-MyX8*nZ3-FH+Fxig2s_mTt~nT>igB)sM`@r_(hPL5i- zyOF{i+xx(9;s^N{|9JAGM`M^-A9W?SNpdS_2vi83QOUG| z0@=s_SWYkVbGZcm51dO{NgVt?G5NOJ|K`WuKdOuFKSob_8{ZZ^Gw@#UFtM>C`eIF7 ztieCsja@+fPH$h#&B!FH67RkK0lu@nrbo`BM~qMfo5jhvicQshe=K=+JTjG!r!%le z-52*XtfP|{o%x(aS7K)#DN;~io1p7nf@3W1C*S^O|NiN``{N$q08#KG;9$-N)<17# ziaw88I54yo!;p`f-0`$00q@#xQjDG?E?4rUId#`%Rc}Uq1-N0i7eJYe*%Q(}=sCYp zbAHt5Sr_l*(Jv^O?GmU|#Bv$rkt;}{u8(LHLOo)U4Dxylq>u-EWjSOfKG2xqk8SSj zy1XR?#%3hWy)vg?u(;CW3s+!RV)P`-ejYy-e{$8sg}oRF^iug;AWuz^QS0W(=i1st zV~-AB|7O{eHcfE!DA7L8=ghl(I&0&w2MgxLlhY@TlJ=4GqEYCU(R^ zBgL^d!42B3;G?;wG0O=)dk}tX%99+;ayX*M6SQOICDvS$ghbE7uEQLQq|jpnOBnUb zHnZCgLm;SP5i))LV=a%H%A*ptFj`XmT|=rv&`2ln8*P!=xZH69KTKk95(3_z<86G{ zxcE31t@ib+@j-|c7LnH8D4sjS!OFv%!{F7&!(w{p&=KdHFF~gx#rT4QllempiNEV6 z{4Ki;4%3gD+p{*-*jL+z$cZ|{!htl8v+T|aXf8Ow@cD4L^F&TwyX&;bDWm~xVE9Oh z9Bq6lb`g<>!QOmqDESM}egVGT*Y@AHU9fP#rE>i@Yt4_grDWt}&Jh>U)PgSGyc!pP zCc&_sRxTaP{j)NG(|B)@{_yb$Z`i71JGal74Iit4{qOB*6b`c@zdTkhha5lHsdQ>g;DLRX6-I_kwWt9HgeuW28*B4zmN(ryP2wM6gvo zLV2ZlWYxmB1y8YX19YHu@*E2f4kM~_rktFrb>-X)g=#BV+Y%$1IsEJd{J0v6;@VX1 zja8Kera(r5|jH16`c}m5}_G9+#?Qy3v#pYa} z%Ed8Efk@Zj=Oe3rnRl3CkQ7;zV(p`p@+vXq(o}jCOIBiCd|#>(0IX=u1Za=gAtPX{ z8F}6mGQ{hIpHmqP#-P5ADs$AKmO`!0c`Cy4LKW-3z?i5VLQe7#+9((gcqKa&2xQ9; zH2#B+2PsWH)5hFZ7dn)zcu%`sIs%QNL-FTz@k$1G%i1Yt^c;_6UNpMfG|R%s+@C|< z`23@zG||?WSjUoOO@v7LpyZh^c}a#$5Cc}*h{by~rF~Gek=i_75+z>* zUsJAPE4EqpNQ8$b56`?!ithx#@b;ME$ln3WeL0vc$>f;)Oq} zCZPnlP5vL*QfUWtHAlb_nqK}mvt%>y;v7+lM@;$ye{J%J@5(!@vH-+JXw(a7k|5P4 zyJi3I39*)HY{4S?O)St$?uf=b-iV&J{C$HxiLdZH}?qd zXw)?sJa2N;gQyFiJ+%(FI`+MS(p|E&BR)?ckf?bb=aEky_-K8( z-;CyAk+(>5wK}*A`Wik%zo;iZt2g+C-{8r&(#&=2U0-oE7mw>1TIoS{w&CNcygi#! zTchYFhHx}%i$S#L$rOAd6j!&g@&gV(3s|e|T%^%udGi#tqcf=obb|?H9NcF@`ro=Z zrRdKa4${2AU;x#iwezV8MgK;|%!BM0Aj+dh>jFP5#u7>dl3>Kcmx^7zk$D4`Hq!C- zK-c7;!#zbQc}zZ=aFmbigGsh{QG0~hkJ>LHMMzTou)eL_ERvB_P^JK|@zbwjcYFKk z*7kQ>+fVgd>*94KFUyogG1&}Ol4CfiQ>%-So90@Wx*k;~6TX;g&8wo691^@OWn85fSZTYc5a zGA2|xn5Egs?6uNqJ$ovXn}J1Caz@IP&dwN;i^fkohCVegM58Go)gtHqXir<^q|#tV zn;O$@c5J0t&~EX$?gCi-dmxSGeN2|kMR!~D`~1PyP7fw+6?YpAME9e=pIwB{=s3wi zlmGP95p|!mbz*zc;9^^52k`qdUuOZ=*tZ&hcbZ_dc;eSm=U!WhyXz)v5PNvY?&SHq z&L+A73TTzwvVt_~$NlRI1#w-xNig_LX_jeG(R~e!(9=x~)$GF4nW(mINo}(*$z0FK zT#&(@Ii%3~dcC=0Qam!Do^2Msps&!%O{?4Eh%TQk6uqrg2=O{4vP=$~=&tMP3N-71N z<2B>vq^@tG4zDKnHC1I|OQtY6cY-OEp}Kt%nnMB2@mP ziOV+s8-E_gXl%un+CS8`0Xr8|(uC*U3cR%p8k^Pp#aHAfTIm5Ajw%(<4kCMeLQCVS zyq2@O&cFM|okgb1*Nhi-hTa%8>GY9ZYl#~?YhSXH?{>V475+r-@kgif?fkITZmeN@ zQFK^c>)r|a`pmGH<(#0iQnfmJ&pkK1&K>L(6_HF1Qc{(ADfGp;%+zCwu;(N}B|w2h zsDw}^L+P?OqnKOeRR#6EOKX0`p)W7sQx_Pck>}pP`#%Sb zoHE1ErQwalFm@|CdPmV*1gtaXN)@>$eg(B@@)-`z)q?lrys&(;@?{c#ep%!-_$`gP z4zg4V`A9-)E~Tn0un7Yf4d^ykHcG5n8+frXB4ZS9<7*^uX|?vC!W0V?__q|0b@4LJ zhSdHBXQc~r*i(v%O$sL9ta@tz&@1uXvH0_lAIP!-GEK(8bh5-jiQ)5TofQG<|779t2&r%+P>43kh#-e>Ej2*=4;Se27n;JaL#F zH?7*ypvQ+SLdtzd*CREX$6(V)IYDq0vfTf??ee|l_a{empS$OuOxky$fW`0=;BLZk z`MC|b{4BgtKV?8O8vdmu=Otx?>EGw}Lx0YdjzqTW5H;4@rw`}!e@BIomQ14PT-Li$m&`RN>`IEXSgzsB|Zr`b#;zrTXF&>_R%3W_RN7 z=buko76!FMdPLs%tg$3|RKZfJuFTvX@3a1tC|#yIrL(}{VtFF$y4Hnf>S^V9gg3>9 z?zJ``@MXzuLF6QHg>94Q>UOc`_$9OtWVwK?u?ejgdOEue-#`^&AI(EtMi@d7-U z6zcl{80KaXuSGoRX_KkmJHW%U!b9>;(Xsn8qh1w1iVn`%5qpb<(g++%@9Z)1_WeET z3NN|-Qr9mE=2n+Jq7M&dlA;_5vn; z)2(4@M!qF6Oz~9ct$SL~&I+}>Vm^1%c#dWd4xvzU%OfgpF^gMJ_zA~KUgNl*``B+8 zjiIiW;EU9{_cK6?QZfb4O17w?mwgBjdy_j06KzWvm;=N0XYEJ}jv$CO7WUg{rK4SSNB<$XThFxbM8JDxU&-lvPr=!eNGP;+;;CfplhryoP%v+t>s9}J za6rmD&crL(pt%x{#oMI5D!`0#142HiRM_5yJ~l0%26y&(7m-1oGpKJZw@;@w+g87p zNcI)eUJl=c0;2*aY7L8S7EQr~DPM4^izytPZjy}K+~^YOJB!(3;OATGQ9nA)v*zpM zJWo?@ET+#@xQ^`=AV|$p>e9p^l_hZQS<^O%cj!RKJ}BxKcpx28MF(|W^sY(}rn(#S z&jknnb@br^PVsgqf&vq1#qab~s}rv~B)Ux0?WK~D@(LK3)PfZV;l4Z=1e0n5+gC>^ zb`q`fj%=7s7cpX127T{(11%dkt?OOL67&}Mo7jfU_Cj$^4h!Qec*d;DMp?PzvdOiT z?@*VR`li^}xV!e}zprgtp-vjvbNv+`KleBbnFUje*)pgtR;Ll7qiwVs04>lDXX`nz zbk|@>-B%i4`5`=F4?Srs><4l|cdPOvizk6=FNVP1Nq3_dP`n%e&;)Ih*y{v5B5Wah zZDJhY>g&voY-I#&1G6T>x)QRhQ>6KpdIC2ac&PxoOrNHux!&?OWZ5fBujiG%G(x9S zgxL8G4Gw6@g;jrK*=ExO-MTaC5fqz_mDQDL!DL0}sI{@~BzhBPsc9uTnw7C?sP0VP z<4(fd?l)46&M8Dk8rZoMqd?$AO!vNVN~b3ns{(+L+X2mNlzY%}E*+^QXT)ZMyaWeV zIrji^eNN%aG96yCRzFLVy}grUj3{)aUNVR+^g&h$#9_BR-w@tpmh?a2k zi$>^lJK9v8k^qqCGRZ+c!Oog(^lfZ3+md6$U$?2F3QAK(T{ht)>107=ST|)qO*lM{ z5XVrKB9cuARi8-<(bTQiEEf-GS`e#kUe{eSOD8GpEJEK3Y&LhgH;RZ+7lHsM zSXR@LA!$N zT-Z8;P5Y+!^G!0Wl!do4TNWfHo`6g5YlodtC9zA?pOw^THm>n5eeJk#6y~)M;uWVM zP~^&OJ^!#{6)-gF8S(MMq3vJrFF=Ma!k{d?gDD<-=aHXpQ_j3i}7X(SbW~TbHqM<7i^o8zf+@jBU*G4SGSWjQ;|Kk#W`A75!ot z`}2J--21_S_zT7TU}5ot_^xRzXe2&^fx8PUZ~`4zEUs4PH)?jw1!@i}$w-0TZWBLV z$qrX$I6XBxryZ|z$UJHTQqJ(h52&Ji8wjeynfeiLUM@N$j+rYw9L_o zXwl~Iho{bcp5u6(p=OxlZ2b}xr~oT+6t2OE_YG$7tw2-HG`lk*sHmcP%jq66Bs*>y zWDxFv1U*P{Y&0$v5}&8ArN@V$lsIA_*>3*vV~~x$kli{(r;W9qeRW6SS-Yd4zjNV> zoCPXAU_v?za1R-+&%^5cJFU*?opo?itLknK1W@IN9&=&n7dbiULYUKbgy`>zXq$Pm z93_(mPX5YwSNpIst01i+md}m_@hq< zLb)|9em^5q`Z0t~_G5fF8%|+!=l{0e__M{{cvHRV>P(qMcZ{XWdGLwim~NGslORL`1R8A3)W>KcPu-jVtSxUc@FO7%9jO_9$(4n zi`O~cSfI)wB*}D&?Xu|0r3nc6<;GO1gJ$O`tsN=2&39X3PF{TtHeXCQQ(25)Hl$Jo z1NeDFse9{7k*h*?%%#$WMM)BD=UdPhcV>6Z)~{cfA@Ru~3*fv&NiiM|ITb&W36oDU zVJ}}C>7+bo%?@;}Gum=v%%5UL%?h;He?9A=rPtoU4n5T2kU*8ZOyXfLDZ|*oXv$7& zGzGzxxk`1rp0HzonOu#x@$l=-bOD?dr_lGIY>e*eo8*flY$OT|O|JF?U_G-mqaUSQ zbx(ivrdD2s12OgzPt6j`aP$2l+&o(iH_!fH%sd1;R`9L`LtkyFz%tK%j~!XjH+!w` zAF$RErr6oFeF8Up1R}9)Sy7Nw)`^hTHFYVqZ>D zRsX7bNO=W~eWTiyO~p#9i*+${Wdj||f1CO%a zW9WIKUgrjwZ?)D%Zrusd?g_~v&Pclr?yw0h{y5s>>B_;80B(?I^xX=IYCytGCX#w0 zj}~+44Y8Ev)z6E-41t|2G!zft&Tog?nL;7O>el-e_l`e-3Osk^Wu;eEmy8z}MF|y7 zEiyQI#xKG#9p_E+#m48WVXU2KK}3GRq}Q+pWpG zCET?n`Rs0l(roO_uLojzpnAxFSUj+T&@G&*jZ6*FECt2+4oY`Zon`Krb9iy6q8y24 zetIR)0$j9|a~>S7Z1D#Og#GBzqr8ycb}c&C=&6If#^^i6#_4BZx=DdI<%>~5#rbd! z?ZOFm0I0YVYw37RP`xD9(d%m?$qg1clm5UebCys#%hKiiUK?xeYSz*<$fb!l{wOLq zxyGdweyz9mocx$CuWH~QNPd5McS9=B=WR(#&GJqC3%GjOwq%seCzMp(D^Q9@{x{l_ z4v%@eGHPl0zP?D#b#TMJF8kB@FZgBmlpJ^pzoa00;+rUXSBTq~ZlY3bi!PdQKNJ{H ziLQGi6Hp_IBJeib@Tw>)-1tp8R0DcZJS+>m9F>mgUQ4a|MsfU!r{(W7f`#=(E^e7< z^^3x9IVzKBLd~D>N_~P~5rtP{#otoA!J{jK0d9FIOf{Xspwj@bqj!IJe)j9}Nff=s z=3Tk?wWzL>T<~8P{MU;r&H6=o*%zltBHsL9aSQ(XT*mLFcV&8cMHgA347QzDb{#OB LYoh-TJ$_TI7s+p~ literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_useall.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_useall.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..727a333e4122cf6100b1575872afe98a8cd356ca GIT binary patch literal 381 zcmZQzWME_f14dg02A1~_HUr~-C@|%|%V+1w{@StCbyIEE7sqI$$IVbRV5(wH>lDZQ zCI^Am_kX(nwSMbRKicFQ=o7hjmY|!$&D4|c629CQU+j5#kLkS==K1OA_x2f7)p_UY z7p@7BI-a`xtB%zF!%uYB8(vcnz_M62-N(trIw}pNJ7yzR-13 zZXi=kw7AjnMV2=|86Vwp!`M3OL*=HT?FS0B^qkhR%CcF1gs-R0ccygIo6{l6Je3>x zeJ4m9DlI>_J@zu|((UIHo-MyNYtMXZ_v`6Q*=(zxEL~S%YQ65W-h`*S7l{b*&HgFS z@ASxVjzse>C>P)#|cKH`94Pty7e|yLq?yw)Jtb9}k=SylkFh Vk?=kC^Y)}KcHMQ1E&pbm0RYJcuWSGS literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_utils.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_utils.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..5bf96125a656f464d5d9aecee83c9bfbab2fae7e GIT binary patch literal 5841 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 K(fBvm_~)dAk$A8G literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_win32.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_win32.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..25b56282c94a31eb9c3721387e8076c19b606229 GIT binary patch literal 531 zcmV+u0_^<&0RRC20000000Gkg00S)m0000000061|NsC0|NsBSWul9l$G?Ps=tWV# zq1b9~?Xo}s00000000000001ZoMlpBZ<{a>{m!pAb!-NyEL-}`C~Q%btX11YYEi0b zR1u{|ikjfeHp@`TetXY`maRjw@SWe?y?b}NG#qP)+^R?fiz`nENAE3gwP3_gO_aXV9Vna7?FUx2|pX25|lpAamWR8nH8mnc;s%EVAo?5}bX*T#1Y z?uPm^KRS8q$*DEJ#gblY)IgbJ4Y?Fskewiq3kfNh5D+=&heAP_ZqbIhod2(E5G{6C z_MK9tjzw4O#SEfvsF&%cLgiU{W+nzeB{9t&h%9(YNDY)l!TW;+HNM5PGWW6?PDWFU z2_nKaKR(@tuc#7#YpBW%D)j<~(H~HQ#EWHxalOODcLxLE_c2x>%GvKg5J}t&)4Psv zS7&&83`g#CzC5r!jjxcb8Q5hw`X`x@aP)S8f=IM#nPI@wlO@_meK?pcYP{E(**@Q7 VwX85z*!ml%ah%Vg^9%}U?#@GH|3d%( literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_x_m_lparse.pm.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/lib/_font/_t_t_f/_x_m_lparse.pm.i new file mode 100644 index 0000000000000000000000000000000000000000..2bbc5ae1d1898e907de88abb76132ab57b18732a GIT binary patch literal 1978 zcmV;r2SxY*0RRC20000000(*i02I*x0000000061|NsC0|NsBllUc(fgVvg`E#@!p z$+0Q2%sCPO00000000000001ZoV{3WZ`;Tb{?1>qMb%0=$V!6iheCqgq<6laf#wCV zQCyLx!HQg&JX2g|cWFfsbicjN%5wlqEPJ7(#Ki|B4cYAZ2Bm$qt_R!Jea%iIin|4QQ zae1nDaaF0US2j55)0a&-8Lekx^y>ZJ{_)}Y$LTVtUR>$MP5kl;T8_|uyuSV6{mr|( zo40S0gp-rZYa2oqr zlPccMRIRE^Rp}02kse1*ZFN&-Vr2ksCcK?wo9psuO;_Cv5-?JeyP2q!t|7QBTn_j7 zjEy7bcax-&azcRPeazU+b&0-?{hXlMqx{GLev)*69Z2Y zin=P*Mj^msqf%8oDl-<_yhw8a_&}ytzpB)QC4yROYl~I66G0x1s~C~BE=#?o1a6eI zKw=jliiT0~Cp;8RZOHXc)=A?cUA!b6m&&q4(zZErNJk?N!pVD~)3h;mE^b^`iX0~g zgI}|RL@T*bOeWfq&Y5D>IAuLgi~@lw@hHp2v!&8FUQ#ILU3f@;ADlfyC(=?=w!RVF z5t*3e3e4gdFiGRW30dg-WW5F3AXPGAZ!_@c=wbtQuY-ey z4V+&~lv6)KMU@q4tVa|=6hebbVVl-%PIZxR2&kSsO;o{bWcM3mh+UCoI{0RkLLGS- zW+gKSXo6tkEu)@M8yeL~)_py&Jx|LvYoie6m^OJ|q``}gG!HgbvTA`G?Ppl(^$LH) zJb8nnA}3*R2*X@V_%L)D?=2`h9+NamE~BO*sT#!d5LG*$M!2%tvFRjv6`p|0at%27 zK>V^ju{W?eE8_j4%PfD>CdyybeYbGId(JgD73 zIpfCYQ%UiihUJ(eF1>g%HI>pLG>@_(hkfY8K?O+8}AcZLmcQtFhWQ*fM43%a2aS=S|38C3@2lKtA)*ls;c8@U=AZks4- z6|wJdR6R42BQt!FI^qM2tIFa64Q~5p(l+=M^yNl}I&Vz4mVKk1u|~pbmO5BBd;wH; z6h~^xvIXmDhZxyfqn`x3++lrW8C^d|J>WB6PJH84sHh!zLh&CCf4{pXlusq8C&dPY zZaVWLM5;G6mA=ReT&5XYFq(qw>Xc34l=+uFyv1B4rXHmTla9q zoUzNkWMaF;HBaQA*l1BVs9bK~Xr*kCyA#1aOrY4rd>kr1>=sX;C}x@E@=>=;pccQ`B)(*3UmZ#JXNBkB{J#b)zebL z4>7S-5p|AjipHoCF*3bQ>u2EC*LOd^{SnjoW!eA|iJlMh%f$GxpQe7y!pbbYC??w? z#Wp=ZLPLDsPF~*Jz7j95e|h)z{T&V4{QZ)4qB2&)zF&{yJ4xGS)sFMYo+tRtPGGRt zl#J1u#*iu0UVaL%2E0qkSUgAGc}ZZw5Firv{aRdJ2~wYlF&*K*)6*fodSLV73eE3l zaI!=OCgWS8C`%Gr4>Eo{93aIAG!uWIa<&ognOq0W=nK)advy%RuPYYq@VOm)4;NRM za3|xogvQh0K>SeoOY&qyl-TPpS;~)>I|hteCVX2I(^+=TX6Yd=haWKN_Np^mhA9q)&K3AvF%4 z`rICLa{j3!knRf{df$TK;N0ltw90AkChMzp$|OoX*+*dLavQd_H8qNOi|EfBKHAxDdG(G9!>n9wkVG%|*&t9HptqZds{#!RBQaBb;J$ zSuh^O3#Ox4$~~>kC(05gOP!aR=_1M$pe=b~kQCFBWqjp%4LzAJibuCrAEOS-3;9DN zh_nEq;7~D(>(-6$~7ob$y~{`5_-`{=|_~7 z;1y6F#U@z$uF6>fa*2#Hk+D3A@4%;Q8Nm-N8)?m~4-zz=i5Kt(nS&&m7jnsdz4-9! zZ|@P}^Vr#+cOe_Z>+!o0AM?PV->_mun6E6P9lp8Gbu<<6F?%y2h9@iep(MXaF=fd`?6GO3Grr+oU!1NiO6Js$wDsOo#!Hoi*2nTZpy{ z!=jR=V$O^KEm30SX*N=e7d*ZL3`}UYf(S-^xY91Q1;sijiyX)z&GF~xkW{OM#E`=p z*yF?7Ayhy#)lZ+loDbigUG+_>HWT8RD#>NGvKSqJ@#y~T`0eQI!`rjE^&@sTVKbqh z77HRcF4G9Za3*efmI$70)&}=b0l@mGgwm9s5li9KTT+3B0tz_6@q0Wn{%9mO7g?0L zs57O8Ln1+XLYJi!nD{PYWB~?~^ZQSO@ynM-g#57(w6sPw83niD+)>bXkP zwt}?#?DyXx^EhjN$!yBzhVeHC^Q}#k(W~Ih_LQiBG@u)|wQ5>%@FlLj|Jo_p#KkkQ zFqR9-yUoQCwU$ww-+4_&@UL&6Q9}Q{3+3cy0bdT-cvA7dG+Nk_gXg@k%zA{9nZjLW z=+|ER{wQk)#4M-05SjKK@TXJjI7$Gl4u;BReIqDT7Qz8ojiwC#zG99&{@ma1w_K(? z__u8Zp{{^_f8V7ahv8^#)x!sI9-L~?QM;nje*{UsOOf^3C-_+$1SYt+xClY}6~P8W z0K~@moPEA}_x|#dwVx^WY;=784Q<*iM!@#C#?+Ja1!T^835T+TiAwnI8S9xWYt^lq@q3NbJTWvEjvK~Zzk&7w9nVa3FfPY&S-24ZO8_Cg0S45jPMMO0h9&|u z71ubFs@^j=wbZ>|sW3aVrnGqj5H~7M1rf!+y%#4h4y;?@@G%IQT5;)m%&(JcQp|@R zlxLEw3W5-}*~VL83#H!*Pz&#e+OMwW%N#?Gg1o{B0uUb)FJ}C7(EN*0gf%8Cg>`iM>G)ZyLWKr&<0GL~1*^c> zswy35u`4$Y`O1#btY`zGFo&)!?WD3%{kNlBWC_2wL2f1b>jJ%|;zqCs={ugV{m_)7 zYqkg7r3(B`O;r&1$wGH_baB`=eh+Q=bvzu_0>CRMSP#!Ykp8yA0@ilxyevrf5M(aZ5CFyRryMM{C0d{A%WNHj`zRz`z!#BG0kYf|E0jRW7o= zbq{8`q4OHX{<(en?7>nWoCcq#=Hp;64RRq2x7uo=qubV&Zm#xUSetJYo&Qf1C&mKC zn$#}wwN(1U*lT0gXg@Z#o9#MV4RjR{5~xPHAieFxH5UbB6gml39K+7;j3gkTI|;q9 zC_+7D*CuP_1gz7okU_#}#Ta_EE+SYeWt!9t;w@Xpg^ZfiDpSWqFRV&&R4SNBL6bz5 zG``K}5b;}+&r?sw?q4PpE5E;DBUbr)zro))!Wb`a2z(kYtpfu*wL$6jQCie%>i>z- z(lBP!3W#y#&JwaYgY4?r7$vk0{Xw8KNkVc25!Clf8gz1@7O;2G?>Lo;Z*+b0&GbV* z=e0U?!-%!t-5JtKfZYJAioblbQwA=TeiVAJ88>d4XCjwkZ}g<;+&2JwlQT9^qQ~Ux zQe0J&z^j`~AV)?Gq`_X#_$7K0l|f1j{g&`lQI)rEJ=Uc8?;Z-|$-()6`yRir12JHVU;q3C~ fe?wUYN$711Z+l6(T&}%PejRvVV^r|J^4DmC_n3S- literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/t/_o_f_l.txt.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/t/_o_f_l.txt.i new file mode 100644 index 0000000000000000000000000000000000000000..0b8fb4b42baba3549803c3a90bcb946952d8cc83 GIT binary patch literal 2058 zcmV+l2=(^>0RRC20000000+td01=J=0000000061|NsC0|NsAcjdjh%$7O@J^neW; zq(!adr%!?a00000000000001ZoTXP?kDE#oeMjOyl;&ZTk(kL%_TIfx-iVDe=-Sv9 zGs)%=LwnpCpxJKl#Q%Ozb%Q^X)qX@#f}8HDQ>UsZbxO(%4dcTzQZ75Lt(>~@q2BlKRBG*eASNnQ*4^xVnHP$o?0 zd%lw zVtxd@C=ftuYgxTvl-?lFd*VEFicBZ#zREkWq;yrj%2N1VDfZyAtp!fOOra_esWh^` z7qn$ttycdKMP~wQqi_2wbXO7s9y=P!bZE9+b^xWQf}~q>bn9R<_UMV6t5DO)H9_#GQZ2 zx1AGf-z$!@!@#!95aMwTmUtmCCq~)3rildw>cN5twk~G_PKs7js@2F&-M`G^T)rmhYu_J*gNf zSKB206-A7PWcJKK6buL~A=d zFTOSE6`k-R2CfEO#J&@fThjQQtLF>c+BJ>4YFuXtY#q~N8T!pJbR~R8nS!;GXazqS zQfS}0Hbn=AX;m3F$ zXI}%F#aY5eXRsR5DonF@@;nbyT0N($B|byLWD2`UoXk?Vi55|k;g&MPUU0@fV2E*3>Gz#Z1xn>|Yn^9)}0z@Uz%&VXH82|tP literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/t/tags.t.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/t/tags.t.i new file mode 100644 index 0000000000000000000000000000000000000000..4181bf2bcbc73365e215b259c5698490f2540c2f GIT binary patch literal 285 zcmZQzWME`~fV&I~j8#xJ<9{eno}sp#XXny4%J)S(GtR8r)Gg~U4XOrARm^GaJGidN zK*05T-BFz@jYsBMpD}i1HI=HI_-bF)RX3I#cV5LmyIob(^w00eTK;{W@!l-PSyS!= zt-rWqRwJixpYW+-DNY6Bj2|zZw}0pPt74{@yzenf&&TGr(|4Q11gDl4AN!+YqH(bN z>FGGPLuU7$q?oSu>w8#W`8PG9RpBOsZl!$>wGJ~KVJ(=gb%^gl_lgFl`-`4W zl6n3vX;0DdxR*tLCHEARuYc0{IU>AoRZRK*47bUpYb9l$`pT$A98}+Z!f7}27 literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/t/testfont.ttf.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/t/testfont.ttf.i new file mode 100644 index 0000000000000000000000000000000000000000..57ac10e6cd43dd302fab074dcfdad01a64287f1d GIT binary patch literal 18700 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 literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/ext/_font-_t_t_f/t/ttfcopy.t.i b/font-optimizer/.hg/store/data/ext/_font-_t_t_f/t/ttfcopy.t.i new file mode 100644 index 0000000000000000000000000000000000000000..5ce2b98a6cbc6f2072f6b81c997703262d2367f7 GIT binary patch literal 279 zcmZQzWME`~fa?qlj8RZF<9{e9(GR`#*KLQBg5!;gSC%}^_~o5b1XTm3D(2+&`*t5P z5NLbJCp$i+f8Tw#F4C)>HM4wPxt(2_>z8#I zRA8)4>Ennj; zpC4Ov?%6^K_ft#OI8FGR>gh8-aHi5!Oa4WHFJ50uu`?@RjC#NCn`ODiEunS7C6OA% z0^Ql?`d{Vv`~PWO7cDrCPxx@{=LGram50BG%e?e>PrJx`+fhA)wpEg P_X)lnKUrHQ<}L&P(R6;+ literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/gen-tests.pl.i b/font-optimizer/.hg/store/data/gen-tests.pl.i new file mode 100644 index 0000000000000000000000000000000000000000..815d80025ca64a7370d96970bb2740b3786ad00a GIT binary patch literal 3373 zcmXw5cRUpS|Gz`_<`A;?-g}QCduI#TvuslK$UcNS5l&prNamfgN5Tn*;*4aEI6LK+ zexL92kLUCGc)wq-f1d9@-cJA!00jI4(KY};NAdq2fPeiT{2I=&wL2tVnwTF6_wRSV zcn*l){cq-lSs=Pl*q+LKK>A_>qf!spn zonqS;Bbe8Up6eyY>*>ez!4*NJ!BJY=;xg_;x64c)2eiI-DW@StjWnWpac-E6` zCmC0@5qCbRxxv{`L;N0>L{4R!Ch5s^VnSmn4hx|W9hIMg{M;kwkT~`U%1c3z1e6XU4Bxga}c%KohvmwOT>aOB0|jWJZ0XS;#?_mmQvst`!=53>A&n^*EKpo-)Q#6=&IXqVk}~w#JmWTa3j?0>Xdr((6u|3uL-)9Y z)Hi>%!RsYGY)ELlGDt>gSZg)z$S)5^X-I4bjYn+uDIZ{gfeP`NW1?|wni)3 z%v!N@?bbDY0Dd!|bb$PnN75zgKevgoZskE29`_ms=OGgOp8nX%TQrD)m0FS5L|M51 zB&kLu3%=D38tyKF`>aRx`2JozNv_1lazSb@SgWawMB2;?iDV_koqW`mjB#`>kK0>v z&E(8Q$Cehp5L~x5sL9)lswdg7f4o|q!M$`wUC}=K7p3Rgh3Kj%Yk0hf1_I3aF)K~sqf)&!^HQWqR*g>)#79g!z^A?z_#l)%Yw8};%Uw%&F=RA(K?-KtFsVa+(qp3EddclRUT9Pk@cv@OjSJ z8Oh6jk1uuPa0nHOlwx2penr3l)?@d3zS#G{ID{Wq+bP1AOaiJNd;c9;`7w zZ{7U-3;Zqk`!X#2h$m!rU#;`WIj(F!ju!JagkL90f;pP?Ue+D5V#qg!Jl+D%t=bZF zrbUROc5O%!w06QgOE{G~xn{M%!=L5*)Iz&R&|<7_bsXk}-y!OgFY?LLs`);KvcjDs z^KQ$+Y=03piwT7NOx-Sy-`p@T;4mV^i=qBX@*#IrFMM8!uZYTEe%_DS;Iea#vE8Sm z06&otF8;>u(QNb1!j=9+s7YZFeRl6O@dgIA)nM&>3==9*l_qJx4(DNc#b6w#YfPcU zdp3a6OiW=mr6`espu&bFEw{R`>KG!bBQ(jK;W7an#E@M;mCo*2pCQrRWkq<5vm;!v ze>gW2oj`nV4_c{X+foM3iHH}`y&!7zADALvW!Owr78aZx80`X+^h60h7yHOX_LE@W z$ng`^*>W{9-DhY=oua5LYoe&pmn#KI7UK5$*i(2-KC9*OQUFsQ|QLdpg>tCb& zjg<5vm=~z)J;lO1rhj=iDLcA(=exIg{iJy8DL0R$MV*h%kR0`{bB+ z#N*Zd@L^DqBmZO0EOjlX+01BN-dUQuZfpJ3LR@2VbyfXdsc2*=6 z%S6|BIbH%vzAn5qxqu0b7K;Hwb5fJ z2Q=QDkrjTsfI4gu(-nq4YXZU#B}& zPgqXRupghDcZ=zg7cBK!JWQ)N=5~4LI*F#nZN2VA?z3zps0{Ep?%;dhq3a;_m z0fQfIzWbYw0001~000o>jr)sRH*`}Lf*@EfNh&rm3;U2qT5+2Ek#sIqH+TO-1QcdG zcE4YODT8gtfE<>>(7ChJ)GlyN7%u=5X@Yq9<<%Rdi^1d%KE&BL>zDO0&Q--Dg(J4R z6SD)Qa1@-smfV-I6s(WeOePL_qpN23Kr{{4p~rdjrEG!IbSbv+O6tfn!?`p_>TS-i9jf3v{PENqZpN)?+b-=Dni_Q zm`|$e{}nCbi+|zB{*9CMznBRBD)1)GOv-ZR9JXD*&ru1<8d~{IJVARS|BLcQBcN_B z%kx9s-A}UP;xtWw6g5>azQTM47=!Sfkfm^Yd#7UZWum~`S3xF$X}c#tfaV=?)0;&S zu^Yy_1^}3eZroq|eb2uKe}Qbpzq3qb8J2B`|E6~DmiFqWHO#+>|0n|5Vl@^pr9mx6 zOij97fEy;@)!a8RC$Oq0EVD)sfDm8dFHLn>qM;&9vk$|K%wd|W5m`H)h z%qxU;td2|Kyet_cUSlX?_F;( zM)wf1vAC`j1T(ix($BINAoiW$i}(>ExUk5`gKy{Z@j9U)Gf>Q?i#@Bb(0A1Bms6Bl znCgAU$YuUuNUUgRNRF46TRyo5zpe5`VzVhhFkz%({z)hOGdx{ls~GE2&3NGKqOa>` zT8N87672;B-V(Mxs&mh~xZk=|HkC-YRsASE(4rag+XF7nH!#2M3TZR*5o>Ho!I?0^ z$%JRcesy&iLZ?*LG5h0x2I@OW*N!m;KR4;!oGolmFaf^#lI_$ zsV)*vu{;DYZ$Y!_v+ssb=R-*qO1jtfYB*#FLCt##JR(tPBJLeyz8|gvLXD*2_7utk z+5%)k`oXJ8T;O2d@R7yz^cZ3axsf_2`4^NecWvus#>diqViDrCSdm7vY8mO}L@UeU zD8Dk=+Hx*s)OP3+>Jy`s5B=aRR}~v>MczSYm+g{IlTu>Hb!tiO7Cr2~rJQGnkbx@( holr6OI^cwRFo~#gWUICFuFklcq0%$p!HoLu{{h`8O~(KL literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/list-features.pl.i b/font-optimizer/.hg/store/data/list-features.pl.i new file mode 100644 index 0000000000000000000000000000000000000000..1b72a5db27ee2b02c4062f2963ae1a59ecb7db9c GIT binary patch literal 569 zcmV-90>=FS0RRC20000000H>`00W@_00000000vI|NsC0|NsAXa7e(~r+^Anz!&FY z^sG0Pj;=QV00000000000001ZoMlo?Z`wc*z3;D>P*>Oj;vn^82MU#dOH`@=y@V8* zcgW{i~zL21cfbZG7OND3}e z71pkd@1cta?ayv?u=58_-yn=A=4zm|IBnS&I=UR zxkMgwgw9M#GL4`11s5R!I5(X$^=C6p+Gq2eTs#vZFvWGW&k)>HVgWHGTwvUGombzIbxRYZWc%09s>&@eARatAdo-S6^6{V$ZGe>{G z|K)Dqk6$X!h21vpd0!p>G=`0k_>!lBD~#L20Uf2FK7@`A&~1sjo$#ta-FQkvcZSy< zK?e^!sU;|*JFR-X>zJZcugxs`mgnrQ*!f?d`CC*#$JuQ~r+=D1tDCe#m6&0q(46L9 HCIk$C5)BF1 literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/modify-names.pl.i b/font-optimizer/.hg/store/data/modify-names.pl.i new file mode 100644 index 0000000000000000000000000000000000000000..dfd59249b5c62a6dd5fa3aa5af85fd1962669db2 GIT binary patch literal 1975 zcmV;o2T1q;0RRC20000000(yf02i+S00000000;N|NsC0|NsA6k7{>KvBAd|03iXk z5k{+RbYvm`00000000000001ZoXuEmZ`(!^{?1=9RTPjyNzroqp^#$3LE{|yr2!JB zC?Kf@O|GPEsU^)_S{79Gx8KYzDJ>~lX?u6L3PHkM&OGzF&kpnItFV+s_`pS&vm%Ay z`?n6jD<~xcwPLh}MH($ZW^nWN>}l5xRvgR6=tVe6>)O|RCGC>K$z%A&$anB+@wTxi7_>WPUY zD}u5}8?uLul*dd+WoB(MTIZZ-psvvnRR{*bbOqBJRq z);X>f=DihU5c5QDZ8p+Ir{xiMFriAkwkt7l`u1|ySWWx)^F7w8e-DeSfQ#X<|Ej6% ztRpTw#C6aLtXP`Et_lkq4&J=E{qTO`+^w(yRhFf=ojqX1lUmznPff$Pf-6%WKU7Svr=L=sEDT+ z&jTW9Z}HGzgT|4D!B7&@8DIQ4Z^afQ!!8#wg{i?7S(;`W%r(?87{`ng=YB@QU4 zw*46$o-XG{Z=y7XEH+`q*ix9XgZ!UMIc&IESN5iY&OF+kBdxZ3pK=|hH9H<%Oc8G+b~lyXK_e|hAXw!hmH7UZ2f8?)@2Uf}pQ6_MD2n#bNtC`YdsI={$8sw0G@%mQ zpt4Rsfx%(@QYNJ~6BYnc*WSy@zR9Am)8HF-2d9WH1CSB4)uD2z+Nkkv?=+vx z-+Td{$W*OmCxxad=zSjvSHXfK_h}JgbBkiYZQZ%pKrS{RPX;s5n^cytVRgs;Dl<`u z+8wKV=-8#EMgIU9dehmgHy?zvS$`BR+izzDz9>5O1@4QEeTDn#bRVreUt9#U=g|Uf zNqzS$z@3$^FTVZR^&u+~K>Msx#3{7I%sf8sdW6y29}c9})aOyQ4`k~U-lSYG**sN( zC)IhdGip~vOHuAy=Qp^f`e?%*!B~w%^-Y;r;!UAd+g+cRa#eZb+vV|EWkuBaVCas) z9iB*8=Iqw8CaK=;&o~o<9?~?>DkhDa^!PtJIl|3d!y9e

    e*}J9JZoD zf5qs}tD|7Sq^kT~;YbOdma`Luqx2QX6<;WW(d;vP%O1fEo?JXKP_ODS)NQw(6~M^q zAYiGq(efsm4)7GKj@v>yws)NYAEw|M0GOXKNkip{36r$zE4UeAQ}hgPY()w5F7 zA#1LR&UC)uJNZ>#?WBD+2s5$%Bjc!C`_rN5vHImmzWFakGCCJZC3E>#%ckA8q8<4a zPCIJWNzZgJQRDuUXZ1f`)&0bEo)(5HJPDMP!|HM{Xs+#)9XVBhVBXUQCE7DzmwKgn z*6_oDYUl>S?biR71lJkX)<)8X6V9M_TNL<6?}_>>kumhY>Q&IKo2_6`QoX4!%6Lt2 z))}_DLN^V*#*yh_u6w7OF06~Xx}LkbuL0CW3CFv^h>lvbs5PKB#&RO_)8SJW0K1}d zG_>xylR%*Ni77ppRhJ4m(A5ReP&NX09U$uF1CjBr0@Mg_U3 zM7AYHk_S&R0r=<4cTr_Te{YGiUGjy_XkQb^t}omT6`LZJdrdy4V6BZN`4%i?5oKZT J{2L-y$6kWF;>7>} literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/obfuscate-font.pl.i b/font-optimizer/.hg/store/data/obfuscate-font.pl.i new file mode 100644 index 0000000000000000000000000000000000000000..7853c729494f7962bd11228a3eae6104aef2a99f GIT binary patch literal 1432 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 p={ikl zHT=E*!!IK#p&!<&K!X_#SpQj}{5m&0e{X7l(+|?%rxzburXjTfD`)YM4(FGTAhm2U z##L{L1%+dm*?zp5ZK2`0zni|vl1#Is(m4+1SiJH5aDmk*!2iO%y7mdt-SojR(Y$8$ zSx#(s*c@YTT&OTtA5{!(^1wZDqbS=CQdqxd)`9t)h2zAh4fcvzHKJt&(LMUgEmTXX zB)7W;4AF-3l3)#L*P5}L@L6rv#TL&UqM92l$)aXsuZS=L48@tU7A`7*W#)>rkH+oB zeoCG7xqKcT&Ysb#&gRa$ut8d!xG5M7FvH zEf&3nxo_k7W{%IME^P&?rN6B5>6q>$i|%;k|i&gm7=&fCgSj?Hg!VrL#t(K9Um7=B~l#HFv%%ua~edeJP65!`(T{NLwX8 z+i0jB@<1$+?K)tuDk56K7eJ5+0A%vlRe8?+ieAX{a29Y~lU?Nehiu62H9CbQ_}ZWqz>*TJyS z@KaTJ?sP%u?Yf+zZDjrJsnvlfrgp4ua zcVQpQcIZfDJTMWiU?q6e!_u*`)WJKLGd|qDH^3~&K$*(KU!u$N%$`XlF5|CJaOhHB z=`Ps?6H%cg#b-y#v!Z_=aO0#?5;+Z=UJ09Tc27D|@H6waW$E zm5FYNFlKqY7a8yJdVzhIdPCwx4DS)`z(PrFFhqj=6zY2P+xY>xG}NDEUY6{nTpOXX z#6*0+F=BQuL}gp-@jy6O3lNFghm5jUC(z zw#@TCdfA6$Oq*PW_H`cQ?*7CeH(Gf+=G;V#x^huc+7Lt|HmNE;du7_})C?gL9ZX>S zfQTJm5-9wts!aeOH@tEHKzgZH2T6;ftS}fTGDd(o5=K7@R;*7+*t=~A($Z22k2#Pc=Yvi>}-|2)QYtywps)huNk!52%;Im#rkU$*V4 z-yCl^r}idvIF?UWi5MrLjJ7x?6b!mor?C z$0g@scEv{4YxlZbx1-kSC-JW=hZns<@ZU`0jc0-&0HCbJyGxK=E+YJP_%Zva1E3XpQUs1bBMA;B|`P$%E*0eOhzaCfhfsSU4uI{|;kxCkMtuBrXVyC4${MM85Z*);~hBE@f`9d;{vYz^U1 zF&*^+p50!YvQy=PzUEno!fc^&l{;qUUC})*k$R7{U2KmJvTacOPtu;mIh^F1qr%G} z<_#;>VhTRn-!ze{Q6j({b9~_{YVIojP1^1~ah~4^;ZldE=;+ighu<*WU zdNCSo5h*LpHYnGG!GWaiX=#fn(JO(EXR@!mKWG;f5dF&i1>1yn-hDyd-xxwY*H^tQ zX!1+TO&o?~f{=9`8tf<0@HU0j>>HA8-(l~MHK-b{3HCW(9A0N!5ebdoG2-@WF_pTP zNrHfch-4}-PmpkQvMO%5&+3?LijT%y&^RYZoUcOGv!Cl ztz)%FKMlg=D}tFG2%v{C8-AEJBBQP}u!tbG0)ET=l0M1>&Z) ziT)M!=3u@FC(PQ>Q5GGpnJ|iqV?|*i3`~3dEq(9i(^7M0PP9HwIpGgJ)8f9nf9g2F zt8Lv7>Pwy~w(~p1a9&x2mhtNbi{jfj zXd4g1SOVMh%c;3IaAuc0~zwM=(vjBDVB1cR=Xd>R$XzN(@gLz dR!Oa9Slx-GL^<;OL>6AU^0~_`s(||T{{Wb;W?=vT literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/data/t/subsetter.pl.i b/font-optimizer/.hg/store/data/t/subsetter.pl.i new file mode 100644 index 0000000000000000000000000000000000000000..122eaa28ec17b9c0692fdef1102de1e19c65d7d5 GIT binary patch literal 616 zcmV-u0+;;&0RRC20000000Jlg00vP200000000gD|NsC0|Ns9l+CfK%$Ef#V!5rBV z(%XJZh3P2(00000000000001ZoV`>{Z`&{oz2{eOP6|6i8pr9d4;R~|KyK@0>8(H@ z+svZHkvvJR(*^$Tqa|ngT($v2eKAGyJ(1?4yRX7ht1#grEKud0PN@;JQ9L!b)~=Wm zTzu8HE;L1L;`p;v2;Zwf$XSsy(Qkt}Pr%2u2`5sR>*;h7lE-&EjVq47l!-=TP&wy= z;Hk_oj_;*fv7G-vV(QvUz$}=73W19>FEfO6!4yjgszD%Tn892sTPjrtsT5DB40(-& z`^jCW39g=@M+p#gfF6%~17|$0G2PnyalIMcj7Ie?=+6AWk$k9K;C=g!2moE+(y#&D zzM?Nkg+Rs`D%4!>J6T#9bY$A1$2Tp@JI8X6ok;@;=CV3=vP3=|&=7n}cb>)~&T{{1 zEyB0a5ern@EdBw1+{_ODr#1*Tj>d_@F`A=Ma@Fa>#)j?qwt|6=H1_ILMs4C%BM(hU zJH+)TTo+7avx*54#>{2}jUf6C)<`5+u>z#Z2B3?a8wkUJ)y%er=8?;wXTh7^tR8^Z z*x(HVU6A(79Q>=%o3&54S%2t}URzOuPdVQtoqeEabI}G)F;GJ(3YIRxe|YV;w+}tv zYpbj;)_S@@WKQl}o0poPBzWmY>ci#MMX9(f_5Nxzg~B)6rO(c-F>BZNrDW2;D8(Im zWHn!qC?Y$Q-{|M>voB6?PpDcd1513?Z4<}CZLgxyl7(sWE4)14Iqlm2pYTu8D(YOb C&MDgf literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/store/fncache b/font-optimizer/.hg/store/fncache new file mode 100644 index 0000000..f8f8690 --- /dev/null +++ b/font-optimizer/.hg/store/fncache @@ -0,0 +1,94 @@ +data/.hgignore.i +data/Font/EOTWrapper.pm.i +data/Font/Subsetter.pm.i +data/Font/Subsetter/NormalizationData.pm.i +data/Font/Subsetter/create-data.pl.i +data/LICENSE.i +data/README.txt.i +data/convert-eot.pl.i +data/ext/Font-TTF/.cvsignore.i +data/ext/Font-TTF/COPYING.i +data/ext/Font-TTF/Changes.i +data/ext/Font-TTF/MANIFEST.SKIP.i +data/ext/Font-TTF/Makefile.PL.i +data/ext/Font-TTF/README.TXT.i +data/ext/Font-TTF/TODO.i +data/ext/Font-TTF/lib/Font/TTF.pm.i +data/ext/Font-TTF/lib/Font/TTF/AATKern.pm.i +data/ext/Font-TTF/lib/Font/TTF/AATutils.pm.i +data/ext/Font-TTF/lib/Font/TTF/Anchor.pm.i +data/ext/Font-TTF/lib/Font/TTF/Bsln.pm.i +data/ext/Font-TTF/lib/Font/TTF/Changes.i +data/ext/Font-TTF/lib/Font/TTF/Cmap.pm.i +data/ext/Font-TTF/lib/Font/TTF/Coverage.pm.i +data/ext/Font-TTF/lib/Font/TTF/Cvt_.pm.i +data/ext/Font-TTF/lib/Font/TTF/Delta.pm.i +data/ext/Font-TTF/lib/Font/TTF/Dumper.pm.i +data/ext/Font-TTF/lib/Font/TTF/EBDT.pm.i +data/ext/Font-TTF/lib/Font/TTF/EBLC.pm.i +data/ext/Font-TTF/lib/Font/TTF/Fdsc.pm.i +data/ext/Font-TTF/lib/Font/TTF/Feat.pm.i +data/ext/Font-TTF/lib/Font/TTF/Fmtx.pm.i +data/ext/Font-TTF/lib/Font/TTF/Font.pm.i +data/ext/Font-TTF/lib/Font/TTF/Fpgm.pm.i +data/ext/Font-TTF/lib/Font/TTF/GDEF.pm.i +data/ext/Font-TTF/lib/Font/TTF/GPOS.pm.i +data/ext/Font-TTF/lib/Font/TTF/GSUB.pm.i +data/ext/Font-TTF/lib/Font/TTF/Glyf.pm.i +data/ext/Font-TTF/lib/Font/TTF/Glyph.pm.i +data/ext/Font-TTF/lib/Font/TTF/GrFeat.pm.i +data/ext/Font-TTF/lib/Font/TTF/Hdmx.pm.i +data/ext/Font-TTF/lib/Font/TTF/Head.pm.i +data/ext/Font-TTF/lib/Font/TTF/Hhea.pm.i +data/ext/Font-TTF/lib/Font/TTF/Hmtx.pm.i +data/ext/Font-TTF/lib/Font/TTF/Kern.pm.i +data/ext/Font-TTF/lib/Font/TTF/Kern/ClassArray.pm.i +data/ext/Font-TTF/lib/Font/TTF/Kern/CompactClassArray.pm.i +data/ext/Font-TTF/lib/Font/TTF/Kern/OrderedList.pm.i +data/ext/Font-TTF/lib/Font/TTF/Kern/StateTable.pm.i +data/ext/Font-TTF/lib/Font/TTF/Kern/Subtable.pm.i +data/ext/Font-TTF/lib/Font/TTF/LTSH.pm.i +data/ext/Font-TTF/lib/Font/TTF/Loca.pm.i +data/ext/Font-TTF/lib/Font/TTF/Manual.pod.i +data/ext/Font-TTF/lib/Font/TTF/Maxp.pm.i +data/ext/Font-TTF/lib/Font/TTF/Mort.pm.i +data/ext/Font-TTF/lib/Font/TTF/Mort/Chain.pm.i +data/ext/Font-TTF/lib/Font/TTF/Mort/Contextual.pm.i +data/ext/Font-TTF/lib/Font/TTF/Mort/Insertion.pm.i +data/ext/Font-TTF/lib/Font/TTF/Mort/Ligature.pm.i +data/ext/Font-TTF/lib/Font/TTF/Mort/Noncontextual.pm.i +data/ext/Font-TTF/lib/Font/TTF/Mort/Rearrangement.pm.i +data/ext/Font-TTF/lib/Font/TTF/Mort/Subtable.pm.i +data/ext/Font-TTF/lib/Font/TTF/Name.pm.i +data/ext/Font-TTF/lib/Font/TTF/OS_2.pm.i +data/ext/Font-TTF/lib/Font/TTF/OTTags.pm.i +data/ext/Font-TTF/lib/Font/TTF/OldCmap.pm.i +data/ext/Font-TTF/lib/Font/TTF/OldMort.pm.i +data/ext/Font-TTF/lib/Font/TTF/PCLT.pm.i +data/ext/Font-TTF/lib/Font/TTF/PSNames.pm.i +data/ext/Font-TTF/lib/Font/TTF/Post.pm.i +data/ext/Font-TTF/lib/Font/TTF/Prep.pm.i +data/ext/Font-TTF/lib/Font/TTF/Prop.pm.i +data/ext/Font-TTF/lib/Font/TTF/Segarr.pm.i +data/ext/Font-TTF/lib/Font/TTF/Sill.pm.i +data/ext/Font-TTF/lib/Font/TTF/Table.pm.i +data/ext/Font-TTF/lib/Font/TTF/Ttc.pm.i +data/ext/Font-TTF/lib/Font/TTF/Ttopen.pm.i +data/ext/Font-TTF/lib/Font/TTF/Useall.pm.i +data/ext/Font-TTF/lib/Font/TTF/Utils.pm.i +data/ext/Font-TTF/lib/Font/TTF/Vhea.pm.i +data/ext/Font-TTF/lib/Font/TTF/Vmtx.pm.i +data/ext/Font-TTF/lib/Font/TTF/Win32.pm.i +data/ext/Font-TTF/lib/Font/TTF/XMLparse.pm.i +data/ext/Font-TTF/lib/ttfmod.pl.i +data/ext/Font-TTF/t/OFL.txt.i +data/ext/Font-TTF/t/tags.t.i +data/ext/Font-TTF/t/testfont.ttf.i +data/ext/Font-TTF/t/ttfcopy.t.i +data/gen-tests.pl.i +data/list-features.pl.i +data/modify-names.pl.i +data/obfuscate-font.pl.i +data/obfuscate-names.pl.i +data/subset.pl.i +data/t/subsetter.pl.i diff --git a/font-optimizer/.hg/store/undo b/font-optimizer/.hg/store/undo new file mode 100644 index 0000000000000000000000000000000000000000..d1ad357ca235cf737ffbce63202213b38f1d3c59 GIT binary patch literal 3869 zcmbVPZEu?}5Z>qgm*8mo1qqNQDha5#?e?j1zz}N&Bm1b5{rVkbQXmuE(T{M?`R=jr zb-Bz=qAsO2rKi3uzb==Rs8t~y^q;u^!Mszc%Gy|Y`?WDOurTJYRy2*YUQ^x4()Q>i zz=tAsFt!p}{T8519iXWX&S9CA0_39e$ZPb?T(tAULmJ+GJcX-ZA9`>eP{>UEE-fsi zfswL21M9dfINvZYdw2IlM*u%ge(nwrH&bJ2f01rNx?df3n=s{G`nXG`Fyfail$Kr+ zO(6bq<3IQWfX6{RA=2vDb7jbNbkQRgLlj%B_@lHn9o>S`jtZ}{lNpE3v?pt)sc!fm zzQc&0Ux|k3t#2@ZL@BB8cX%U01F7#KfBG7Nwz^NZX>hm>IMIi29r;A)CU+SXiWy6V zR&b_5F<+_BrmTq2hajY8#X}OO)Kk;vH5IBa1s&R)s93w9zrr@JsIRb)UD87V{$?hVta9>mfyXx)I02;44Z(WHjJwRRuz1g-uuBY zGyPP()~hILV__2=~VcmaH4xp&8 z6c5*>Q9%P1Z=&(0bSH-{{RWHFy%-n8qMOIi(nQ4vhO*2wm*Fv`tQUZ~m?eW%PGh57 x6gaM6aU4sKg(@zK`kGh+6>}_FmvxI_@5b=7o9JIP*RQ7|WcsX literal 0 HcmV?d00001 diff --git a/font-optimizer/.hg/tags.cache b/font-optimizer/.hg/tags.cache new file mode 100644 index 0000000..b27879b --- /dev/null +++ b/font-optimizer/.hg/tags.cache @@ -0,0 +1,2 @@ +28 136826b53242c388267996d1febb0fea90193a06 + diff --git a/font-optimizer/.hg/undo.branch b/font-optimizer/.hg/undo.branch new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/font-optimizer/.hg/undo.branch @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/font-optimizer/.hg/undo.desc b/font-optimizer/.hg/undo.desc new file mode 100644 index 0000000..4f5da8a --- /dev/null +++ b/font-optimizer/.hg/undo.desc @@ -0,0 +1,3 @@ +0 +pull +http://bitbucket.org/philip/font-optimizer diff --git a/font-optimizer/.hg/undo.dirstate b/font-optimizer/.hg/undo.dirstate new file mode 100644 index 0000000..e69de29 diff --git a/font-optimizer/.hgignore b/font-optimizer/.hgignore new file mode 100644 index 0000000..5fe60d8 --- /dev/null +++ b/font-optimizer/.hgignore @@ -0,0 +1,4 @@ +~$ +^testoutput/ +^testfonts/ +^tmp/ diff --git a/font-optimizer/Font/EOTWrapper.pm b/font-optimizer/Font/EOTWrapper.pm new file mode 100644 index 0000000..297b930 --- /dev/null +++ b/font-optimizer/Font/EOTWrapper.pm @@ -0,0 +1,141 @@ +# Copyright (c) 2009 Philip Taylor +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, +# copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following +# conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. + +package Font::EOTWrapper; + +use strict; +use warnings; + +use Font::TTF::Font; +use Encode; + +use constant TTEMBED_SUBSET => 0x00000001; +use constant TTEMBED_TTCOMPRESSED => 0x00000004; +use constant TTEMBED_XORENCRYPTDATA => 0x10000000; +use constant DEFAULT_CHARSET => 0x01; + +sub convert { + my ($in_fn, $out_fn) = @_; + + my $font_data = do { + open my $fh, $in_fn or die "Failed to open $in_fn: $!"; + binmode $fh; + local $/; + <$fh> + }; + + my $font = Font::TTF::Font->open($in_fn) or die "Failed to open $in_fn: $!"; + + open my $out, '>', $out_fn or die "Failed to open $out_fn: $!"; + binmode $out; + + $font->{name}->read if $font->{name}; + + my $os2 = $font->{'OS/2'}; + $os2->read; + + my $rootString = ''; + + my $header = ''; + $header .= pack V => length($font_data); + $header .= pack V => 0x00020001; + $header .= pack V => TTEMBED_SUBSET; + $header .= pack C10 => map $os2->{$_}, qw(bFamilyType bSerifStyle bWeight bProportion bContrast bStrokeVariation bArmStyle bLetterform bMidline bXheight); + $header .= pack C => DEFAULT_CHARSET; + $header .= pack C => (($os2->{fsSelection} & 1) ? 1 : 0); + $header .= pack V => $os2->{usWeightClass}; + $header .= pack v => $os2->{fsType}; + $header .= pack v => 0x504C; + $header .= pack VVVV => map $os2->{$_}, qw(ulUnicodeRange1 ulUnicodeRange2 ulUnicodeRange3 ulUnicodeRange4); + $header .= pack VV => map $os2->{$_}, qw(ulCodePageRange1 ulCodePageRange2); + $header .= pack V => $font->{head}{checkSumAdjustment}; + $header .= pack VVVV => 0, 0, 0, 0; + $header .= pack v => 0; + $header .= pack 'v/a*' => encode 'utf-16le' => $font->{name}->find_name(1); # family name + $header .= pack v => 0; + $header .= pack 'v/a*' => encode 'utf-16le' => $font->{name}->find_name(2); # style name + $header .= pack v => 0; + $header .= pack 'v/a*' => encode 'utf-16le' => $font->{name}->find_name(5); # version name + $header .= pack v => 0; + $header .= pack 'v/a*' => encode 'utf-16le' => $font->{name}->find_name(4); # full name + $header .= pack v => 0; + $header .= pack 'v/a*' => encode 'utf-16le' => $rootString; + + $out->print(pack V => 4 + length($header) + length($font_data)); + $out->print($header); + $out->print($font_data); + + $font->release; +} + +sub extract { + my ($in_fn, $out_fn) = @_; + + my $eot_data = do { + open my $fh, $in_fn or die "Failed to open $in_fn: $!"; + binmode $fh; + local $/; + <$fh> + }; + + die "Error: EOT too small" if length $eot_data < 16; + + my ($eot_size, $font_data_size, $version, $flags) = unpack VVVV => substr $eot_data, 0, 16; + + die "Error: Invalid EOTSize ($eot_size, should be ".(length $eot_data).")" if $eot_size != length $eot_data; + die "Error: Invalid Version ($version)" if not ($version == 0x00020000 or $version == 0x00020001 or $version == 0x00020002); + die "Error: Can't handle compressed fonts" if $flags & TTEMBED_TTCOMPRESSED; + + # Skip the header fields + my $rest = substr $eot_data, 16+66; + + my ($family_name, $style_name, $version_name, $full_name, $rest2) = unpack 'v/a* xx v/a* xx v/a* xx v/a* a*' => $rest; + + my $font_data; + if ($version == 0x00020000) { # not 0x00010000 - spec is wrong (http://lists.w3.org/Archives/Public/www-font/2009JulSep/0862.html) + $font_data = $rest2; + } elsif ($version == 0x00020001) { + my ($root, $data) = unpack 'xx v/a* a*' => $rest2; + $font_data = $data; + } elsif ($version == 0x00020002) { + my ($root, $root_checksum, $eudc_codepage, $signature, $eudc_flags, $eudc_font, $data) + = unpack 'xx v/a* V V xx v/a* V v/a* a*' => $rest2; + $font_data = $data; + } + + if ($flags & TTEMBED_XORENCRYPTDATA) { + $font_data ^= ("\x50" x length $font_data); + } + + open my $fh, '>', $out_fn or die "Failed to open $out_fn: $!"; + binmode $fh; + print $fh $font_data; +} + +# sub rootStringChecksum { +# my $s = 0; +# $s += $_ for unpack 'C*', $_[0]; +# return $s ^ 0x50475342; +# } + +1; diff --git a/font-optimizer/Font/Subsetter.pm b/font-optimizer/Font/Subsetter.pm new file mode 100644 index 0000000..cd1c40c --- /dev/null +++ b/font-optimizer/Font/Subsetter.pm @@ -0,0 +1,1606 @@ +# Copyright (c) 2009 Philip Taylor +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, +# copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following +# conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. + +package Font::Subsetter; + +use strict; +use warnings; + +use Carp; +use Unicode::Normalize(); +use Digest::SHA qw(sha1_hex); +use Encode; + +use Font::TTF; +use Font::TTF::Font; + +if ($Font::TTF::VERSION =~ /^0\.([0-3].|4[0-5])$/) { + die "You are using an old version of Font::TTF ($Font::TTF::VERSION) - you need at least v0.46, and preferably the latest SVN trunk from ."; +} + +# Tables can be: +# REQUIRED - will fail if it's not present +# FORBIDDEN - will fail if it's present +# OPTIONAL - will be accepted regardless of whether it's there or not +# IGNORED - like OPTIONAL, but no processing will take place +# UNFINISHED - will emit a warning if it's present, because the code doesn't handle it properly yet +# DROP - will be deleted from the font +# The default for unmentioned tables is FORBIDDEN +my %font_tables = ( + 'cmap' => ['REQUIRED'], + 'head' => ['REQUIRED'], + 'hhea' => ['REQUIRED'], + 'hmtx' => ['REQUIRED'], + 'maxp' => ['REQUIRED'], + 'name' => ['REQUIRED'], + 'OS/2' => ['REQUIRED'], + 'post' => ['REQUIRED'], + # TrueType outlines: + 'cvt ' => ['IGNORED'], + 'fpgm' => ['IGNORED'], + 'glyf' => ['IGNORED'], + 'loca' => ['OPTIONAL'], + 'prep' => ['OPTIONAL'], + # PostScript outlines: (TODO: support these?) + 'CFF ' => ['FORBIDDEN'], + 'VORG' => ['FORBIDDEN'], + # Bitmap glyphs: (TODO: support these?) + 'EBDT' => ['DROP', 'embedded bitmap glyphs will be lost'], + 'EBLC' => ['DROP', 'embedded bitmap glyphs will be lost'], + 'EBSC' => ['DROP', 'embedded bitmap glyphs will be lost'], + # Advanced typographic tables: + 'BASE' => ['UNFINISHED'], + 'GDEF' => ['OPTIONAL'], + 'GPOS' => ['OPTIONAL'], + 'GSUB' => ['OPTIONAL'], + 'JSTF' => ['UNFINISHED'], + # OpenType tables: + 'DSIG' => ['DROP'], # digital signature - don't need it here + 'gasp' => ['IGNORED'], + 'hdmx' => ['OPTIONAL'], + 'kern' => ['OPTIONAL'], + 'LTSH' => ['OPTIONAL'], + 'PCLT' => ['UNFINISHED'], + 'VDMX' => ['IGNORED'], + 'vhea' => ['UNFINISHED'], + 'vmtx' => ['UNFINISHED'], + # SIL Graphite tables: + 'Feat' => ['DROP'], + 'Silf' => ['DROP'], + 'Sill' => ['DROP'], + 'Silt' => ['DROP'], + 'Glat' => ['DROP'], + 'Gloc' => ['DROP'], + # FontForge tables: + 'PfEd' => ['DROP'], + 'FFTM' => ['DROP'], + # Apple Advanced Typography tables: + # (These get dropped because it's better to use cross-platform features instead) + 'feat' => ['DROP'], + 'morx' => ['DROP'], + 'prop' => ['DROP'], + # Undocumented(?) extension for some kind of maths stuff + 'MATH' => ['DROP'], +); + +sub check_tables { + my ($self) = @_; + my $font = $self->{font}; + + my @tables = grep /^[^ ]...$/, sort keys %$font; + for (@tables) { + my $t = $font_tables{$_}; + if (not $t) { + die "Uses unrecognised table '$_'\n"; + } else { + my $status = $t->[0]; + if ($status eq 'FORBIDDEN') { + die "Uses forbidden table '$_'\n"; + } elsif ($status eq 'UNFINISHED') { + warn "Uses unhandled table '$_'\n"; + } elsif ($status eq 'DROP') { + my $note = ($t->[1] ? ' - '.$t->[1] : ''); + warn "Dropping table '$_'$note\n"; + delete $font->{$_}; + } elsif ($status eq 'OPTIONAL') { + } elsif ($status eq 'IGNORED') { + } elsif ($status eq 'REQUIRED') { + } else { + die "Invalid table status $status"; + } + } + } + # TODO: check required tables are present + # TODO: check TrueType or PostScript tables are present +} + +sub read_tables { + my ($self) = @_; + my $font = $self->{font}; + + # Read all the tables that will be needed in the future. + # (In particular, read them before modifying numGlyphs, + # beacuse they often depend on that value.) + for (qw( + cmap hmtx name OS/2 post + glyf loca + BASE GDEF GPOS GSUB JSTF + hdmx kern LTSH + )) { + $font->{$_}->read if $font->{$_}; + } +} + +sub find_codepoint_glyph_mappings { + my ($self) = @_; + my $font = $self->{font}; + + # Find the glyph->codepoint mappings + + my %glyphs; + for my $table (@{$font->{cmap}{Tables}}) { + for my $cp (keys %{$table->{val}}) { + + my $ucp; # Unicode code point + + if ($table->{Platform} == 0 # Unicode + or ($table->{Platform} == 3 and # Windows + ($table->{Encoding} == 1 or # Unicode BMP + $table->{Encoding} == 10)) # Unicode full + ) { + $ucp = $cp; + } elsif ($table->{Platform} == 1 # Mac + and $table->{Encoding} == 0) # Roman + { + $ucp = ord(decode('MacRoman', pack C => $cp)); + } else { + # This table might not map directly onto Unicode codepoints, + # so warn about it + warn "Unrecognised cmap table type (platform $table->{Platform}, encoding $table->{Encoding}) - ignoring its character/glyph mappings\n"; + next; + } + + my $g = $table->{val}{$cp}; # glyph id + $glyphs{$g}{$ucp} = 1; + } + } + $self->{glyphs} = \%glyphs; +} + +sub expand_wanted_chars { + my ($self, $chars) = @_; + # OS X browsers (via ATSUI?) appear to convert text into + # NFC before rendering it. + # So input like "i{combining grave}" is converted to "{i grave}" + # before it's even passed to the font's substitution tables. + # So if @chars contains i and {combining grave}, then we have to + # add {i grave} because that might get used. + # + # So... Include all the unchanged characters. Also include the NFC + # of each character. Then use NormalizationData to add any characters + # that can result from NFCing a string of the wanted characters. + + if (0) { # change to 1 to disable all this fancy stuff + my %cs = map { ord $_ => 1 } split '', $chars; + return %cs; + } + + my %cs = map { ord $_ => 1, ord Unicode::Normalize::NFC($_) => 1 } split '', $chars; + require Font::Subsetter::NormalizationData; + my %new_cs; + for my $c (@Font::Subsetter::NormalizationData::data) { + # Skip this if we've already got the composed character + next if $cs{$c->[0]}; + # Skip this if we don't have all the decomposed characters + next if grep !$cs{$_}, @{$c}[1..$#$c]; + # Otherwise we want the composed character + $new_cs{$c->[0]} = 1; + } + $cs{$_} = 1 for keys %new_cs; + return %cs; +} + +sub want_feature { + my ($self, $wanted, $feature) = @_; + # If no feature list was specified, accept all features + return 1 if not $wanted; + # Otherwise find the four-character tag + $feature =~ /^(\w{4})( _\d+)?$/ or die "Unrecognised feature tag syntax '$feature'"; + return $wanted->{$1} if exists $wanted->{$1}; + return $wanted->{DEFAULT} if exists $wanted->{DEFAULT}; + return 1; +} + +sub find_wanted_lookup_ids { + my ($self, $table) = @_; + + # If we wanted to include all lookups: + # return 0..$#{$table->{LOOKUP}}; + # but actually we only want ones used by wanted features + + my %lookups; + for my $feat_tag (@{$table->{FEATURES}{FEAT_TAGS}}) { + next if not $self->want_feature($self->{features}, $feat_tag); + for (@{$table->{FEATURES}{$feat_tag}{LOOKUPS}}) { + $lookups{$_} = 1; + } + } + + # Iteratively add any chained lookups + my $changed = 1; + while ($changed) { + $changed = 0; + for my $lookup_id (0..$#{$table->{LOOKUP}}) { + next unless $lookups{$lookup_id}; + my $lookup = $table->{LOOKUP}[$lookup_id]; + for my $sub (@{$lookup->{SUB}}) { + if ($sub->{ACTION_TYPE} eq 'l') { + for my $rule (@{$sub->{RULES}}) { + for my $chain (@$rule) { + for my $action (@{$chain->{ACTION}}) { + for (0..@$action/2-1) { + # action is array of (offset, lookup) + $changed = 1 if not $lookups{$action->[$_*2+1]}; + $lookups{$action->[$_*2+1]} = 1; + } + } + } + } + } + } + } + } + + my @keys = sort { $a <=> $b } keys %lookups; + return @keys; +} + +sub find_wanted_glyphs { + my ($self, $chars) = @_; + my $font = $self->{font}; + + my %wanted_chars = $self->expand_wanted_chars($chars); + $self->{wanted_glyphs} = {}; + + # http://www.microsoft.com/typography/otspec/recom.htm suggests that fonts + # should include .notdef, .null, CR, space; so include them all here, if they + # are already defined + if ($font->{post}{VAL}) { + for my $gid (0..$#{$font->{loca}{glyphs}}) { + my $name = $font->{post}{VAL}[$gid]; + if ($name and ($name eq '.notdef' or $name eq '.null' or $name eq 'CR' or $name eq 'space')) { + $self->{wanted_glyphs}{$gid} = 1; + } + } + } else { + # If post.FormatType == 3 then we don't have any glyph names + # so just assume it's the first four + $self->{wanted_glyphs}{$_} = 1 for 0..3; + } + + # We want any glyphs used directly by any characters we want + for my $gid (keys %{$self->{glyphs}}) { + for my $cp (keys %{$self->{glyphs}{$gid}}) { + $self->{wanted_glyphs}{$gid} = 1 if $wanted_chars{$cp}; + } + } + + # Iteratively find new glyphs, until convergence + my @newly_wanted_glyphs = keys %{$self->{wanted_glyphs}}; + while (@newly_wanted_glyphs) { + my @new_glyphs; + + if ($font->{GSUB}) { + + # Handle ligatures and similar things + # (e.g. if we want 'f' and 'i', we want the 'fi' ligature too) + # (NOTE: a lot of this code is duplicating the form of + # fix_gsub, so they ought to be kept roughly in sync) + # + # TODO: There's probably loads of bugs in here, so it + # should be checked and tested more + + for my $lookup_id ($self->find_wanted_lookup_ids($font->{GSUB})) { + my $lookup = $font->{GSUB}{LOOKUP}[$lookup_id]; + for my $sub (@{$lookup->{SUB}}) { + + # Handle the glyph-delta case + if ($sub->{ACTION_TYPE} eq 'o') { + my $adj = $sub->{ADJUST}; + if ($adj >= 32768) { $adj -= 65536 } # fix Font::TTF::Bug (http://rt.cpan.org/Ticket/Display.html?id=42727) + my @covs = $self->coverage_array($sub->{COVERAGE}); + for (@covs) { + # If we want the coveraged glyph, we also want + # that glyph plus delta + if ($self->{wanted_glyphs}{$_}) { + my $new = $_ + $adj; + next if $self->{wanted_glyphs}{$new}; + push @new_glyphs, $new; + $self->{wanted_glyphs}{$new} = 1; + } + } + next; + } + + # Collect the rules which might match initially something + my @rulesets; + if ($sub->{RULES}) { + if (($lookup->{TYPE} == 5 or $lookup->{TYPE} == 6) + and $sub->{FORMAT} == 2) { + # RULES corresponds to class values + # TODO: ought to filter this by classes that contain wanted glyphs + push @rulesets, @{$sub->{RULES}}; + } elsif (($lookup->{TYPE} == 5 or $lookup->{TYPE} == 6) + and $sub->{FORMAT} == 3) { + # COVERAGE is empty; accept all the RULEs, and + # we'll look inside their MATCHes later + push @rulesets, @{$sub->{RULES}}; + } else { + # COVERAGE lists glyphs, and there's a RULE for + # each, so extract the RULEs for wanted COVERAGE + # values + my @covs = $self->coverage_array($sub->{COVERAGE}); + die unless @{$sub->{RULES}} == @covs; + for my $i (0..$#covs) { + if ($self->{wanted_glyphs}{$covs[$i]}) { + push @rulesets, $sub->{RULES}[$i]; + } + } + } + } + + # Collect the rules whose MATCH matches + my @rules; + RULE: for my $rule (map @$_, @rulesets) { + if (not defined $sub->{MATCH_TYPE}) { + # No extra matching other than COVERAGE, + # so just accept this rule + } elsif ($sub->{MATCH_TYPE} eq 'g') { + # RULES->MATCH/PRE/POST are arrays of glyphs that must all match + for my $c (qw(MATCH PRE POST)) { + next unless $rule->{$c}; + next RULE if grep { not $self->{wanted_glyphs}{$_} } @{$rule->{$c}}; + } + } elsif ($sub->{MATCH_TYPE} eq 'o') { + # RULES->MATCH/PRE/POST are arrays of coverage tables, + # and at least one glyph from each table must match + die unless @{$sub->{RULES}} == 1; + die unless @{$sub->{RULES}[0]} == 1; + for my $c (qw(MATCH PRE POST)) { + next unless $sub->{RULES}[0][0]{$c}; + for (@{$sub->{RULES}[0][0]{$c}}) { + my $matched = 0; + for (keys %{$_->{val}}) { + if ($self->{wanted_glyphs}{$_}) { + $matched = 1; + last; + } + } + next RULE if not $matched; + } + } + } elsif ($sub->{MATCH_TYPE} eq 'c') { + # TODO: only includes rules using classes that contain + # wanted glyphs. + # For now, just conservatively accept everything. + } else { + die "Invalid MATCH_TYPE"; + } + push @rules, $rule; + } + + # Find the glyphs in the relevant actions + for my $rule (@rules) { + if ($sub->{ACTION_TYPE} eq 'g') { + die unless $rule->{ACTION}; + for my $new (@{$rule->{ACTION}}) { + next if $self->{wanted_glyphs}{$new}; + push @new_glyphs, $new; + $self->{wanted_glyphs}{$new} = 1; +# warn "adding $new"; + } + } elsif ($sub->{ACTION_TYPE} eq 'l') { + # do nothing - this is just a lookup to run some other rules + } elsif ($sub->{ACTION_TYPE} eq 'a') { + # do nothing - we don't want the alternative glyphs + } else { + die "Invalid ACTION_TYPE"; + } + } + } + } + } + + @newly_wanted_glyphs = @new_glyphs; + } + + # Now we want to add glyphs that are used for composite rendering, + # which don't participate in any GSUB behaviour + @newly_wanted_glyphs = keys %{$self->{wanted_glyphs}}; + while (@newly_wanted_glyphs) { + my @new_glyphs; + + if ($font->{loca}) { + # If we want a composite glyph, we want all of its + # component glyphs too + # (e.g. á is the 'a' glyph plus the acute glyph): + for my $gid (@newly_wanted_glyphs) { + my $glyph = $font->{loca}{glyphs}[$gid]; + next unless $glyph; + $glyph->read; + next unless $glyph->{numberOfContours} == -1; + $glyph->read_dat; + for (@{$glyph->{comps}}) { + next if $self->{wanted_glyphs}{$_->{glyph}}; + push @new_glyphs, $_->{glyph}; + $self->{wanted_glyphs}{$_->{glyph}} = 1; + } + $glyph->update; + } + } + + @newly_wanted_glyphs = @new_glyphs; + } +} + +sub update_classdef_table { + my ($self, $table) = @_; + die "Expected table" if not $table; + die "Expected classdef" if $table->{cover}; + my @vals; + for my $gid (keys %{$table->{val}}) { + next if not $self->{wanted_glyphs}{$gid}; + my $v = $table->{val}{$gid}; + push @vals, $self->{glyph_id_old_to_new}{$gid}, $v; + } + my $ret = new Font::TTF::Coverage(0, @vals); + # Font::TTF bug (http://rt.cpan.org/Ticket/Display.html?id=42716): + # 'max' is not set by new(), so do it manually: + my $max = 0; + for (values %{$ret->{val}}) { $max = $_ if $_ > $max } + $ret->{max} = $max; + return $ret; +} + +# Returns a map such that map[old_class_value] = new_class_value +# (or undef if the class is removed) +# This differs from update_classdef_table in that it can +# reorder and optimise the class ids +sub update_mapped_classdef_table { + my ($self, $table) = @_; + die "Expected table" if not $table; + die "Expected classdef" if $table->{cover}; + my @vals; + my %used_classes; + $used_classes{0} = 1; # 0 is implicitly in every classdef + for my $gid (keys %{$table->{val}}) { + next if not $self->{wanted_glyphs}{$gid}; + my $v = $table->{val}{$gid}; + push @vals, $self->{glyph_id_old_to_new}{$gid}, $v; + $used_classes{$v} = 1; + } + + my @map_new_to_old = sort { $a <=> $b } keys %used_classes; + my @map_old_to_new; + $map_old_to_new[$map_new_to_old[$_]] = $_ for 0..$#map_new_to_old; + + # Update the class numbers + for (0..@vals/2-1) { + $vals[$_*2+1] = $map_old_to_new[$vals[$_*2+1]]; + } + + my $ret = new Font::TTF::Coverage(0, @vals); + # Font::TTF bug (http://rt.cpan.org/Ticket/Display.html?id=42716): + # 'max' is not set by new(), so do it manually: + my $max = 0; + for (values %{$ret->{val}}) { $max = $_ if $_ > $max } + $ret->{max} = $max; + return ($ret, \@map_old_to_new, \@map_new_to_old); +} + +# Removes unwanted glyphs from a coverage table, for +# cases where nobody else is referring to indexes in this table +sub update_coverage_table { + my ($self, $table) = @_; + die "Expected table" if not $table; + die "Expected cover" if not $table->{cover}; + my @vals = keys %{$table->{val}}; + @vals = grep $self->{wanted_glyphs}{$_}, @vals; + @vals = sort { $a <=> $b } @vals; + @vals = map $self->{glyph_id_old_to_new}{$_}, @vals; + return new Font::TTF::Coverage(1, @vals); +} + +# Returns a map such that map[new_coverage_index] = old_coverage_index +sub update_mapped_coverage_table { + my ($self, $table) = @_; + die "Expected table" if not $table; + die "Expected coverage" if not $table->{cover}; + + my @map; + my @new_vals; + # Get the covered values (in order) + my @vals = $self->coverage_array($table); + for my $i (0..$#vals) { + # Create a new list of all the wanted values + if ($self->{wanted_glyphs}{$vals[$i]}) { + push @new_vals, $self->{glyph_id_old_to_new}{$vals[$i]}; + push @map, $i; + } + } + return (new Font::TTF::Coverage(1, @new_vals), @map); +} + +sub coverage_array { + my ($self, $table) = @_; + Carp::confess "Expected table" if not $table; + return sort { $table->{val}{$a} <=> $table->{val}{$b} } keys %{$table->{val}}; +} + +sub empty_coverage { + my ($self, $table) = @_; + Carp::confess "Expected table" if not $table; + return 1 if not $table->{val}; + return 1 if not keys %{$table->{val}}; + return 0; +} + +# Update the loca table to delete unwanted glyphs. +# Must be called before all the other fix_* methods. +sub remove_unwanted_glyphs { + my ($self) = @_; + my $font = $self->{font}; + + return unless $font->{loca}; + + my %glyph_id_old_to_new; + my %glyph_id_new_to_old; + + my $glyphs = $font->{loca}{glyphs}; + my @new_glyphs; + for my $i (0..$#$glyphs) { + if ($self->{wanted_glyphs}{$i}) { + push @new_glyphs, $glyphs->[$i]; + $glyph_id_old_to_new{$i} = $#new_glyphs; + $glyph_id_new_to_old{$#new_glyphs} = $i; + } + } + $font->{loca}{glyphs} = \@new_glyphs; + $font->{maxp}{numGlyphs} = scalar @new_glyphs; + + $self->{glyph_id_old_to_new} = \%glyph_id_old_to_new; + $self->{glyph_id_new_to_old} = \%glyph_id_new_to_old; +} + + +# Only the platform=3 encoding=1 cmap is really needed +# (for Windows, OS X, Linux), so save space (and potentially +# enhance cross-platformness) by stripping out all the others. +# (But keep platform=3 encoding=10 too, for UCS-4 characters.) +# (And Opera 10 on OS X wants one with platform=0 too.) +sub strip_cmap { + my ($self) = @_; + my $font = $self->{font}; + + if (not grep { $_->{Platform} == 3 and $_->{Encoding} == 1 } @{$font->{cmap}{Tables}}) { + warn "No cmap found with platform=3 encoding=1 - the font is likely to not work on Windows.\n"; + # Stop now, instead of stripping out all of the cmap tables + return; + } + + my @matched_tables = grep { + ($_->{Platform} == 3 and ($_->{Encoding} == 1 || $_->{Encoding} == 10)) + or ($_->{Platform} == 0) + } @{$font->{cmap}{Tables}}; + + $font->{cmap}{Tables} = \@matched_tables; +} + +# Only the platform=3 encoding=1 names are really needed +# (for Windows, OS X, Linux), so save space (and potentially +# enhance cross-platformness) by stripping out all the others. +sub strip_name { + my ($self) = @_; + my $font = $self->{font}; + + for my $id (0..$#{$font->{name}{strings}}) { + my $str = $font->{name}{strings}[$id]; + next if not $str; + my $plat = 3; + my $enc = 1; + my $langs = $str->[$plat][$enc]; + if (not $langs) { + warn "No name found with id=$id with platform=3 encoding=1 - the font is likely to not work on Windows.\n" + unless $id == 18; # warn except for some Mac-specific names + return; + } + $font->{name}{strings}[$id] = []; + $font->{name}{strings}[$id][$plat][$enc] = $langs; + # NOTE: this keeps all the languages for each string, which is + # potentially wasteful if there are lots (but in practice most fonts + # seem to only have English) + } +} + +sub fix_cmap { + my ($self) = @_; + my $font = $self->{font}; + + # Delete mappings for unwanted glyphs + + for my $table (@{$font->{cmap}{Tables}}) { + # (Already warned about unrecognised table types + # in find_codepoint_glyph_mappings) + my %new_vals; + for my $cp (keys %{$table->{val}}) { + my $gid = $table->{val}{$cp}; + if ($self->{wanted_glyphs}{$gid}) { + $new_vals{$cp} = $self->{glyph_id_old_to_new}{$gid}; + } + } + $table->{val} = \%new_vals; + if ($table->{Format} == 0) { + @{$table->{val}}{0..255} = map { defined($_) ? $_ : 0 } @{$table->{val}}{0..255}; + } + } +} + +sub fix_head { + # TODO: Should think about: + # created + # modified + # xMin (depends on glyph data) + # yMin (depends on glyph data) + # xMax (depends on glyph data) + # yMax (depends on glyph data) +} + +sub fix_hhea { + # TODO: Should think about: + # advanceWidthMax (depends on hmtx) + # minLeftSideBearing (depends on hmtx) + # minRightSideBearing (depends on hmtx) + # xMaxExtent (depends on hmtx) +} + +sub fix_hmtx { + my ($self) = @_; + my $font = $self->{font}; + + # Map the advance/lsb arrays from old to new glyph ids + my @new_advances; + my @new_lsbs; + for my $gid (0..$font->{maxp}{numGlyphs}-1) { + push @new_advances, $font->{hmtx}{advance}[$self->{glyph_id_new_to_old}{$gid}]; + push @new_lsbs, $font->{hmtx}{lsb}[$self->{glyph_id_new_to_old}{$gid}]; + } + $font->{hmtx}{advance} = \@new_advances; + $font->{hmtx}{lsb} = \@new_lsbs; +} + +sub fix_maxp { # Must come after loca, prep, fpgm + my ($self) = @_; + my $font = $self->{font}; + + # Update some of the 'max' values that Font::TTF + # is capable of updating + $font->{maxp}->update; +} + +sub fix_os_2 { # Must come after cmap, hmtx, hhea, GPOS, GSUB + my ($self) = @_; + my $font = $self->{font}; + + # Update some of the metric values that Font::TTF + # is capable of updating + $font->{'OS/2'}->update; + + if ($font->{'OS/2'}{Version} >= 2) { + # TODO: handle cases where these are non-default + warn "Unexpected defaultChar $font->{'OS/2'}{defaultChar}\n" + unless $font->{'OS/2'}{defaultChar} == 0; + warn "Unexpected breakChar $font->{'OS/2'}{breakChar}\n" + unless $font->{'OS/2'}{breakChar} == 0x20; + } +} + +sub fix_post { + my ($self) = @_; + my $font = $self->{font}; + + if ($font->{post}{FormatType} == 0) { + warn "Invalid 'post' table type. (If you're using the obfuscate-font.pl script, make sure it comes *after* the subsetting.)\n"; + } + + # Update PostScript name mappings for new glyph ids + if ($font->{post}{VAL}) { + my @new_vals; + for my $gid (0..$font->{maxp}{numGlyphs}-1) { + push @new_vals, $font->{post}{VAL}[$self->{glyph_id_new_to_old}{$gid}]; + } + $font->{post}{VAL} = \@new_vals; + } +} + + + + +sub fix_loca { + my ($self) = @_; + my $font = $self->{font}; + + # remove_unwanted_glyphs has already removed some + # of the glyph data from this table + + # Update references inside composite glyphs + for my $glyph (@{$font->{loca}{glyphs}}) { + next unless $glyph; + $glyph->read; + next unless $glyph->{numberOfContours} == -1; + $glyph->read_dat; + for (@{$glyph->{comps}}) { + # (find_unwanted_glyphs guarantees that the + # component glyphs will be present) + $_->{glyph} = $self->{glyph_id_old_to_new}{$_->{glyph}}; + } + } +} + + + +sub fix_gdef { + my ($self) = @_; + my $font = $self->{font}; + + if ($font->{GDEF}{GLYPH}) { + $font->{GDEF}{GLYPH} = $self->update_classdef_table($font->{GDEF}{GLYPH}); + if ($self->empty_coverage($font->{GDEF}{GLYPH})) { + delete $font->{GDEF}{GLYPH}; + } + } + + if ($font->{GDEF}{MARKS}) { + $font->{GDEF}{MARKS} = $self->update_classdef_table($font->{GDEF}{MARKS}); + if ($self->empty_coverage($font->{GDEF}{MARKS})) { + delete $font->{GDEF}{MARKS}; + } + } + + if ($font->{GDEF}{ATTACH}) { + die "TODO" if $font->{GDEF}{ATTACH}{POINTS}; + $font->{GDEF}{ATTACH}{COVERAGE} = $self->update_coverage_table($font->{GDEF}{ATTACH}{COVERAGE}); + if ($self->empty_coverage($font->{GDEF}{ATTACH}{COVERAGE})) { + delete $font->{GDEF}{ATTACH}; + } + } + + if ($font->{GDEF}{LIG}) { + + if ($font->{GDEF}{LIG}{LIGS}) { + die "GDEF LIG LIGS != COVERAGE" if + @{$font->{GDEF}{LIG}{LIGS}} != keys %{$font->{GDEF}{LIG}{COVERAGE}{val}}; + + my @coverage_map; + ($font->{GDEF}{LIG}{COVERAGE}, @coverage_map) = $self->update_mapped_coverage_table($font->{GDEF}{LIG}{COVERAGE}); + $font->{GDEF}{LIG}{LIGS} = [ map $font->{GDEF}{LIG}{LIGS}[$_], @coverage_map ]; + + } else { + $font->{GDEF}{LIG}{COVERAGE} = $self->update_coverage_table($font->{GDEF}{LIG}{COVERAGE}); + } + + if ($self->empty_coverage($font->{GDEF}{LIG}{COVERAGE})) { + delete $font->{GDEF}{LIG}; + } + } + +} + +sub fix_ttopen { + my ($self, $table, $inner) = @_; + + my @lookups; + my %lookup_map; + for my $lookup_id ($self->find_wanted_lookup_ids($table)) { + my $lookup = $table->{LOOKUP}[$lookup_id]; + my @subtables; + for my $sub (@{$lookup->{SUB}}) { + if ($inner->($lookup, $sub)) { + push @subtables, $sub; + } + } + + # Only keep lookups that have some subtables + if (@subtables) { + $lookup->{SUB} = \@subtables; + push @lookups, $lookup; + $lookup_map{$lookup_id} = $#lookups; + } + } + + $table->{LOOKUP} = \@lookups; + + # Update lookup references inside actions + for my $lookup (@{$table->{LOOKUP}}) { + for my $sub (@{$lookup->{SUB}}) { + if ($sub->{ACTION_TYPE} eq 'l') { + for my $rule (@{$sub->{RULES}}) { + for my $chain (@$rule) { + my @actions; + for my $action (@{$chain->{ACTION}}) { + my @steps; + for (0..@$action/2-1) { + # action is array of (offset, lookup) + # so just update the lookup + if (exists $lookup_map{$action->[$_*2+1]}) { + push @steps, ($action->[$_*2], $lookup_map{$action->[$_*2+1]}); + } + } + push @actions, \@steps; + } + $chain->{ACTION} = \@actions; + } + } + } + } + } + + # Remove all features that are not wanted + # and update all references to those features (in the languages list), + # and update the features' lookup references + + my @features; # array of [tag, feature] + my %kept_features; + for my $feat_tag (@{$table->{FEATURES}{FEAT_TAGS}}) { + next unless $self->want_feature($self->{features}, $feat_tag); # drop unwanted features + my $feat = $table->{FEATURES}{$feat_tag}; + $feat->{LOOKUPS} = [ map { exists $lookup_map{$_} ? ($lookup_map{$_}) : () } @{$feat->{LOOKUPS}} ]; + next unless @{$feat->{LOOKUPS}}; # drop empty features to save some space + push @features, [ $feat_tag, $feat ]; + $kept_features{$feat_tag} = 1; + } + + $table->{FEATURES} = { + FEAT_TAGS => [map $_->[0], @features], + map +($_->[0] => $_->[1]), @features, + }; + + # Remove any references from scripts to features that no longer exist + for my $script_tag (keys %{$table->{SCRIPTS}}) { + my $script = $table->{SCRIPTS}{$script_tag}; + for my $tag ('DEFAULT', @{$script->{LANG_TAGS}}) { + next if $script->{$tag}{' REFTAG'}; # ignore langs that are just copies of another + $script->{$tag}{FEATURES} = [ + grep $kept_features{$_}, @{$script->{$tag}{FEATURES}} + ]; + + } + } + + # TODO: it'd be nice to delete languages that have no features + +} + +sub fix_gpos { + my ($self) = @_; + my $font = $self->{font}; + + $self->fix_ttopen($font->{GPOS}, + sub { + my ($lookup, $sub) = @_; + + # There's always a COVERAGE here first. + # (If it's empty, the client will skip the entire subtable, + # so we could delete it entirely, but that would involve updating + # the FEATURES->*->LOOKUPS lists too, so don't do that yet.) + # + # The rest depends on Type: + # + # Lookup Type 1 (Single Adjustment Positioning Subtable): + # Format 1: Just COVERAGE, applies same value to all + # Format 2: Just COVERAGE, RULES[n] gives value for each + # + # Lookup Type 2 (Pair Adjustment Positioning Subtable): + # Format 1: COVERAGE gives first glyph, RULES[n][m]{MATCH}[0] gives second glyph + # Format 2: COVERAGE gives first glyph, CLASS gives first glyph class, MATCH[0] gives second glyph class + # + # Lookup Type 3 (Cursive Attachment Positioning Subtable): + # Format 1: Just COVERAGE, RULES[n] gives value for each + # + # Lookup Type 4 (MarkToBase Attachment Positioning Subtable): + # Format 1: MATCH[0] gives mark coverage, COVERAGE gives base coverage, MARKS[n] per mark, RULES[n] per base + # + # Lookup Type 5 (MarkToLigature Attachment Positioning Subtable): + # Format 1: pretty much the same as 4, but s/base/ligature/ + # + # Lookup Type 6 (MarkToMark Attachment Positioning Subtable): + # Format 1: pretty much the same as 4, but s/base/mark/ + # + # Lookup Type 7 (Contextual Positioning Subtables): + # Format 1: COVERAGE gives first glyph, RULES[n][m]{MATCH}[o] gives next glyphs + # Format 2: COVERAGE gives first glyph, CLASS gives classes to glyphs, RULES[n] is per class + # Format 3: COVERAGE absent, RULES[0][0]{MATCH}[o] gives glyph coverages + # + # Lookup Type 8 (Chaining Contextual Positioning Subtable): + # Format 1: COVERAGE gives first glyph, RULES[n][m]{PRE/MATCH/POST} give context glyphs + # Format 2: COVERAGE gives first glyph, PRE_CLASS/CLASS/POST_CLASS give classes + # Format 3: COVERAGE absent, RULES[0][0]{PRE/MATCH/POST}[o] give coverages + # + # Lookup Type 9 (Extension Positioning): + # Not supported + + die if $lookup->{TYPE} >= 9; + + # Update the COVERAGE table, and remember some mapping + # information to update things that refer to the table + my @coverage_map; + my $old_coverage_count; + if ($sub->{COVERAGE}) { + $old_coverage_count = scalar keys %{$sub->{COVERAGE}{val}}; + ($sub->{COVERAGE}, @coverage_map) = $self->update_mapped_coverage_table($sub->{COVERAGE}); + + # If there's no coverage left, then drop this subtable + return 0 if $self->empty_coverage($sub->{COVERAGE}); + } + + if ($sub->{RULES} and $sub->{COVERAGE} and not + # Skip cases where RULES is indexed by CLASS, not COVERAGE + (($lookup->{TYPE} == 2 or + $lookup->{TYPE} == 7 or + $lookup->{TYPE} == 8) + and $sub->{FORMAT} == 2) + ) { + # There's a RULES array per COVERAGE entry, so + # shuffle them around to match the new COVERAGE + if (@{$sub->{RULES}} != $old_coverage_count) { + die "Internal error: RULES ($sub->{RULES}) does not match COVERAGE ($sub->{COVERAGE}) -- " + . @{$sub->{RULES}} . " vs $old_coverage_count."; + } + $sub->{RULES} = [ map $sub->{RULES}[$_], @coverage_map ]; + } + + if (not defined $sub->{MATCH_TYPE} or $sub->{MATCH_TYPE} eq 'g') { + if ($sub->{MATCH}) { + die unless @{$sub->{MATCH}} == 1; + die unless $sub->{MARKS}; + die unless @{$sub->{MARKS}} == keys %{$sub->{MATCH}[0]{val}}; + my @match_map; + ($sub->{MATCH}[0], @match_map) = $self->update_mapped_coverage_table($sub->{MATCH}[0]); + + # If there's no coverage left, then drop this subtable + return 0 if $self->empty_coverage($sub->{MATCH}[0]); + + # Update MARKS to correspond to the new MATCH coverage + $sub->{MARKS} = [ map $sub->{MARKS}[$_], @match_map ]; + } + + # RULES->MATCH is an array of glyphs, so translate them all + for (@{$sub->{RULES}}) { + for (@$_) { + $_->{MATCH} = [ map $self->{glyph_id_old_to_new}{$_}, + grep $self->{wanted_glyphs}{$_}, @{$_->{MATCH}} ]; + } + } + } elsif ($sub->{MATCH_TYPE}) { + if ($sub->{MATCH_TYPE} eq 'o') { + # RULES->MATCH/PRE/POST are arrays of coverage tables, so translate them all + die unless @{$sub->{RULES}} == 1; + die unless @{$sub->{RULES}[0]} == 1; + my $r = $sub->{RULES}[0][0]; + for my $c (qw(MATCH PRE POST)) { + $r->{$c} = [ map $self->update_coverage_table($_), @{$r->{$c}} ] if $r->{$c}; + } + } elsif ($sub->{MATCH_TYPE} eq 'c') { + die "Didn't expect any rule matches" if grep $_->{MATCH}, map @$_, @{$sub->{RULES}}; + die unless @{$sub->{MATCH}} == 1; + + my $class_map; + ($sub->{CLASS}, undef, $class_map) = $self->update_mapped_classdef_table($sub->{CLASS}); + # Special case: If this results in an empty CLASS, it'll + # break in FF3.5 on Linux, so assign all the COVERAGE glyphs onto + # class 1 and update $class_map appropriately + if ($sub->{CLASS}{max} == 0) { + $sub->{CLASS} = new Font::TTF::Coverage(0, map +($_ => 1), keys %{$sub->{COVERAGE}{val}}); + $class_map = [0, 0]; # just duplicate class 0 into class 1 (this is a bit inefficient) + } + + $sub->{RULES} = [ @{$sub->{RULES}}[@$class_map] ]; + + # Update the MATCH classdef table + my $match_map; + ($sub->{MATCH}[0], undef, $match_map) = $self->update_mapped_classdef_table($sub->{MATCH}[0]); + + # If the MATCH table is now empty, drop this lookup + # (else FF3.5 on Linux drops the GPOS table entirely) + return 0 if @$match_map <= 1; + + # RULES[n] is a list of substitutions per MATCH class, so + # update all those lists for the new classdef + $sub->{RULES} = [ map { [ @{$_}[@$match_map] ] } @{$sub->{RULES}} ]; + + } else { + die "Invalid MATCH_TYPE"; + } + } + + if (($lookup->{TYPE} == 7 or + $lookup->{TYPE} == 8) + and $sub->{FORMAT} == 2) { + # Update some class tables + for my $c (qw(CLASS PRE_CLASS POST_CLASS)) { + $sub->{$c} = $self->update_classdef_table($sub->{$c}) if $sub->{$c}; + } + } + + return 1; + } + ); +} + +sub fix_gsub { + my ($self) = @_; + my $font = $self->{font}; + + $self->fix_ttopen($font->{GSUB}, + sub { + my ($lookup, $sub) = @_; + + # There's always a COVERAGE here first. + # (If it's empty, the client will skip the entire subtable, + # so we could delete it entirely, but that would involve updating + # the FEATURES->*->LOOKUPS lists and Contextual subtable indexes + # too, so don't do that yet.) + # + # The rest depends on Type: + # + # Lookup Type 1 (Single Substitution Subtable): + # Format 1: Just COVERAGE, and ADJUST gives glyph id delta + # Format 2: Just COVERAGE, then RULES[n]{ACTION}[0] gives replacement glyph for each + # + # Lookup Type 2 (Multiple Substitution Subtable): + # Format 1: Just COVERAGE, then RULES[n]{ACTION} gives replacement glyphs (must be at least 1) + # + # Lookup Type 3 (Alternate Substitution Subtable): + # Format 1: Just COVERAGE, then RULES[n]{ACTION} gives alternate glyphs + # [This can just be deleted since we have no way to use those glyphs] + # + # Lookup Type 4 (Ligature Substitution Subtable): + # Format 1: COVERAGE gives first glyph, RULES[n]{MATCH}[m] gives next glyphs to match, RULES[n]{ACTION}[0] gives replacement glyph + # + # Lookup Type 5 (Contextual Substitution Subtable): + # Format *: like type 7 in GPOS, but ACTION gives indexes into GSUB{LOOKUP} + # + # Lookup Type 6 (Chaining Contextual Substitution Subtable): + # Format *: like type 8 in GPOS, but ACTION gives indexes into GSUB{LOOKUP} + # + # Lookup Type 7 (Extension Substitution): + # Blah + + die if $lookup->{TYPE} >= 7; + + # Update the COVERAGE table, and remember some mapping + # information to update things that refer to the table + my @coverage_map; + my $old_coverage_count; + if ($sub->{COVERAGE}) { + $old_coverage_count = scalar keys %{$sub->{COVERAGE}{val}}; + ($sub->{COVERAGE}, @coverage_map) = $self->update_mapped_coverage_table($sub->{COVERAGE}); + + # If there's no coverage left, then drop this subtable + return 0 if $self->empty_coverage($sub->{COVERAGE}); + } + + if ($sub->{ACTION_TYPE} eq 'o') {; + my $adj = $sub->{ADJUST}; + if ($adj >= 32768) { $adj -= 65536 } # fix Font::TTF::Bug (http://rt.cpan.org/Ticket/Display.html?id=42727) + my @covs = $self->coverage_array($sub->{COVERAGE}); + if (@covs == 0) { + # Nothing's covered, but deleting this whole subtable is + # non-trivial so just zero it out + $sub->{ADJUST} = 0; + } elsif (@covs == 1) { + my $gid_base = $covs[0]; + my $old_gid_base = $self->{glyph_id_new_to_old}{$gid_base}; + my $old_gid = $old_gid_base + $adj; + $sub->{ADJUST} = $self->{glyph_id_old_to_new}{$old_gid} - $gid_base; + } else { + # The glyphs are probably all reordered, so we can't just + # adjust ADJUST. + # So switch this to a format 2 table: + $sub->{FORMAT} = 2; + $sub->{ACTION_TYPE} = 'g'; + delete $sub->{ADJUST}; + my @gids; + for (@covs) { + push @gids, $self->{glyph_id_old_to_new}{$self->{glyph_id_new_to_old}{$_} + $adj}; + } + $sub->{RULES} = [ map [{ACTION => [$_]}], @gids ]; + } + # Stop and keep this table, since done everything that's needed + return 1; + } + die if $sub->{ADJUST}; + + if ($sub->{RULES} and not + # Skip cases where RULES is indexed by CLASS, not COVERAGE, + # and cases where there's no COVERAGE at all + (($lookup->{TYPE} == 5 or $lookup->{TYPE} == 6) + and ($sub->{FORMAT} == 2 or $sub->{FORMAT} == 3)) + ) { + # There's a RULES array per COVERAGE entry, so + # shuffle them around to match the new COVERAGE + die unless @{$sub->{RULES}} == $old_coverage_count; + $sub->{RULES} = [ map $sub->{RULES}[$_], @coverage_map ]; + } + + # TODO: refactor + if ($sub->{MATCH_TYPE}) { + # Fix all the glyph indexes + if ($sub->{MATCH_TYPE} eq 'g') { + # RULES->MATCH/PRE/POST are arrays of glyphs, so translate them all, + # and if they rely on any unwanted glyphs then drop the rule entirely + for my $i (0..$#{$sub->{RULES}}) { + my $ruleset = $sub->{RULES}[$i]; + my @rules; + RULE: for my $rule (@$ruleset) { + for my $c (qw(MATCH PRE POST)) { + next unless $rule->{$c}; + next RULE if grep { not $self->{wanted_glyphs}{$_} } @{$rule->{$c}}; + $rule->{$c} = [ map $self->{glyph_id_old_to_new}{$_}, @{$rule->{$c}} ] + } + push @rules, $rule; + } + if (not @rules) { + # XXX: This is a really horrid hack. + # The proper solution is to delete the ruleset, + # and adjust COVERAGE to match. + push @rules, { ACTION => [0], MATCH => [-1] }; + } + $sub->{RULES}[$i] = \@rules; + } + } elsif ($sub->{MATCH_TYPE} eq 'o') { + # RULES->MATCH/PRE/POST are arrays of coverage tables, so translate them all + die unless @{$sub->{RULES}} == 1; + die unless @{$sub->{RULES}[0]} == 1; + my $r = $sub->{RULES}[0][0]; + for my $c (qw(MATCH PRE POST)) { + $r->{$c} = [ map $self->update_coverage_table($_), @{$r->{$c}} ] if $r->{$c}; + } + } elsif ($sub->{MATCH_TYPE} eq 'c') { + # RULES refers to class values, which haven't changed at all, + # so we don't need to update those values + } else { + die "Invalid MATCH_TYPE"; + } + } + + my %class_maps; + for my $c (qw(CLASS PRE_CLASS POST_CLASS)) { + ($sub->{$c}, $class_maps{$c}) = $self->update_mapped_classdef_table($sub->{$c}) if $sub->{$c}; + } + + + if ($sub->{MATCH_TYPE} and $sub->{MATCH_TYPE} eq 'c') { + # To make things work in Pango, we need to change all the + # class numbers so there aren't gaps: + my %classes = ( + MATCH => 'CLASS', + PRE => 'PRE_CLASS', + POST => 'POST_CLASS', + ); + my @rules; + for my $rule (@{$sub->{RULES}}) { + my @chains; + CHAIN: for my $chain (@$rule) { + for my $c (qw(MATCH PRE POST)) { + next unless $chain->{$c}; + my $map = $class_maps{$classes{$c}} or die "Got a $c but no $classes{$c}"; + # If any of the values are for a class that no longer has + # any entries, we should drop this whole chain because + # there's no chance it's going to match + next CHAIN if grep { not defined $map->[$_] } @{$chain->{$c}}; + # Otherwise just update the class numbers + $chain->{$c} = [ map $map->[$_], @{$chain->{$c}} ]; + } + push @chains, $chain; + } + push @rules, \@chains; + } + $sub->{RULES} = \@rules; + # If all the rules are empty, drop this whole subtable (which maybe is + # needed to avoid https://bugzilla.mozilla.org/show_bug.cgi?id=475242 ?) + return 0 if not grep @$_, @{$sub->{RULES}}; + } + + if ($sub->{ACTION_TYPE}) { + if ($sub->{ACTION_TYPE} eq 'g') { + for (@{$sub->{RULES}}) { + for (@$_) { + $_->{ACTION} = [ map $self->{glyph_id_old_to_new}{$_}, + grep $self->{wanted_glyphs}{$_}, @{$_->{ACTION}} ]; + } + } + } elsif ($sub->{ACTION_TYPE} eq 'l') { + # nothing to change here + } elsif ($sub->{ACTION_TYPE} eq 'a') { + # We don't want to bother with alternate glyphs at all, + # so just delete everything. + # (We need to have empty rules, and can't just delete them + # entirely, else FontTools becomes unhappy.) + # (TODO: Maybe we do want alternate glyphs? + # If so, be sure to update find_wanted_glyphs too) + for (@{$sub->{RULES}}) { + for (@$_) { + $_->{ACTION} = []; + } + } + } elsif ($sub->{ACTION_TYPE} eq 'o') { + die "Should have handled ACTION_TYPE o earlier"; + } else { + die "Invalid ACTION_TYPE"; + } + } + + return 1; + } + ); +} + +# Fold certain GSUB features into the cmap table +sub fold_gsub { + my ($self, $features) = @_; + + my $font = $self->{font}; + my $table = $font->{GSUB}; + + # Find the lookup IDs corresponding to the desired features + + my %wanted = (DEFAULT => 0); + $wanted{$_} = 1 for @$features; + + my %lookups; + for my $feat_tag (@{$table->{FEATURES}{FEAT_TAGS}}) { + next if not $self->want_feature(\%wanted, $feat_tag); + for (@{$table->{FEATURES}{$feat_tag}{LOOKUPS}}) { + $lookups{$_} = $feat_tag; + } + } + + # Find the glyph mapping from those lookups + + my %glyph_map; # (old glyph id => new glyph id) + + for my $lookup_id (0..$#{$table->{LOOKUP}}) { + next unless exists $lookups{$lookup_id}; + my $lookup = $table->{LOOKUP}[$lookup_id]; + if ($lookup->{TYPE} != 1) { + warn "GSUB lookup $lookup_id (from feature '$lookups{$lookup_id}') is not a 'single' type lookup (type=$lookup->{TYPE}), and cannot be applied.\n"; + next; + } + + # For each glyph, only the first substitution per lookup is applied, + # so we build a map of the firsts for this lookup (then fold it into + # the global map later) + my %lookup_glyph_map; + + for my $sub (@{$lookup->{SUB}}) { + my @covs = $self->coverage_array($sub->{COVERAGE}); + if ($sub->{ACTION_TYPE} eq 'o') { + my $adj = $sub->{ADJUST}; + if ($adj >= 32768) { $adj -= 65536 } # fix Font::TTF::Bug (http://rt.cpan.org/Ticket/Display.html?id=42727) + for my $i (0..$#covs) { + my $old = $covs[$i]; + my $new = $old + $adj; + $lookup_glyph_map{$old} = $new if not exists $lookup_glyph_map{$old}; + } + } elsif ($sub->{ACTION_TYPE} eq 'g') { + next if @covs == 0 and not $sub->{RULES}; + die unless @{$sub->{RULES}} == @covs; + for my $i (0..$#covs) { + my $old = $covs[$i]; + die unless @{$sub->{RULES}[$i]} == 1; + die unless @{$sub->{RULES}[$i][0]{ACTION}} == 1; + my $new = $sub->{RULES}[$i][0]{ACTION}[0]; + $lookup_glyph_map{$old} = $new; + } + } else { + die "Invalid ACTION_TYPE $sub->{ACTION_TYPE}"; + } + } + + # Fold the lookup's glyph map into the global glyph map + for my $gid (keys %lookup_glyph_map) { + # Add any new substitutions + $glyph_map{$gid} = $lookup_glyph_map{$gid} if not exists $glyph_map{$gid}; + } + for my $gid (keys %glyph_map) { + # Handle chained substitutions + $glyph_map{$gid} = $lookup_glyph_map{$glyph_map{$gid}} if exists $lookup_glyph_map{$glyph_map{$gid}}; + } + } + + # Apply the glyph mapping to cmap + + for my $table (@{$font->{cmap}{Tables}}) { + for my $cp (keys %{$table->{val}}) { + my $gid = $table->{val}{$cp}; + $table->{val}{$cp} = $glyph_map{$gid} if exists $glyph_map{$gid}; + } + } +} + +sub fix_hdmx { + my ($self) = @_; + my $font = $self->{font}; + + for my $ppem (grep /^\d+$/, keys %{$font->{hdmx}}) { + my @new_widths; + for my $gid (0..$font->{maxp}{numGlyphs}-1) { + push @new_widths, $font->{hdmx}{$ppem}[$self->{glyph_id_new_to_old}{$gid}]; + } + $font->{hdmx}{$ppem} = \@new_widths; + } +} + +sub fix_kern { + my ($self) = @_; + my $font = $self->{font}; + + # We don't handle version 1 kern tables yet, so just drop them entirely. + # http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6kern.html + # https://bugzilla.mozilla.org/show_bug.cgi?id=487549 + if ($font->{kern}{Version} != 0) { + warn "Unhandled kern table version $font->{kern}{Version} - deleting all kerning data\n"; + delete $font->{kern}; + return; + } + + for my $table (@{$font->{kern}{tables}}) { + if ($table->{type} == 0) { + my %kern; + for my $l (keys %{$table->{kern}}) { + next unless $self->{wanted_glyphs}{$l}; + for my $r (keys %{$table->{kern}{$l}}) { + next unless $self->{wanted_glyphs}{$r}; + $kern{$self->{glyph_id_old_to_new}{$l}}{$self->{glyph_id_old_to_new}{$r}} = $table->{kern}{$l}{$r}; + } + } + $table->{kern} = \%kern; + } elsif ($table->{type} == 2) { + die "kern table type 2 not supported yet"; + } else { + die "Invalid kern table type"; + } + } +} + +sub fix_ltsh { + my ($self) = @_; + my $font = $self->{font}; + + my @glyphs; + for my $gid (0..$font->{maxp}{numGlyphs}-1) { + push @glyphs, $font->{LTSH}{glyphs}[$self->{glyph_id_new_to_old}{$gid}]; + } + $font->{LTSH}{glyphs} = \@glyphs; +} + +sub delete_copyright { + my ($self) = @_; + my $font = $self->{font}; + # XXX - shouldn't be deleting copyright text + $font->{name}{strings}[0] = undef; + $font->{name}{strings}[10] = undef; + $font->{name}{strings}[13] = undef; +} + +sub change_name { + my ($self, $uid) = @_; + my $font = $self->{font}; + + for (1,3,4,6) { + my $str = $font->{name}{strings}[$_]; + for my $plat (0..$#$str) { + next unless $str->[$plat]; + for my $enc (0..$#{$str->[$plat]}) { + next unless $str->[$plat][$enc]; + for my $lang (keys %{$str->[$plat][$enc]}) { + next unless exists $str->[$plat][$enc]{$lang}; + $str->[$plat][$enc]{$lang} = "$uid - subset of " . $str->[$plat][$enc]{$lang}; + } + } + } + } +} + +sub license_desc_subst { + my ($self, $new) = @_; + my $font = $self->{font}; + + my $str = $font->{name}{strings}[13]; + for my $plat (0..$#$str) { + next unless $str->[$plat]; + for my $enc (0..$#{$str->[$plat]}) { + next unless $str->[$plat][$enc]; + for my $lang (keys %{$str->[$plat][$enc]}) { + next unless exists $str->[$plat][$enc]{$lang}; + $str->[$plat][$enc]{$lang} =~ s/\$\{LICENSESUBST\}/$new/g; + } + } + } +} + +# IE silently rejects non-CFF fonts if the Font Family Name is not a prefix of +# the Full Font Name. This can occur when automatically converting CFF fonts +# to non-CFF fonts, so it's useful to check and fix it here. +sub fix_full_font_name { + my ($self, $new) = @_; + my $font = $self->{font}; + + my $str1 = $font->{name}{strings}[1]; + for my $plat (0..$#$str1) { + next unless $str1->[$plat]; + for my $enc (0..$#{$str1->[$plat]}) { + next unless $str1->[$plat][$enc]; + for my $lang (keys %{$str1->[$plat][$enc]}) { + next unless exists $str1->[$plat][$enc]{$lang}; + my $name = $str1->[$plat][$enc]{$lang}; + my $fullname = $font->{name}{strings}[4][$plat][$enc]{$lang}; + if (substr($fullname, 0, length $name) ne $name) { + warn "Full Name ('$fullname') does not start with Family Name ('$name') and will break in IE - fixing automatically\n"; + $font->{name}{strings}[4][$plat][$enc]{$lang} = $name; + } + } + } + } +} + +sub new { + my $class = shift; + my $self = {}; + bless $self, $class; + return $self; +} + +sub preload { + my ($self, $filename) = @_; + my $font = Font::TTF::Font->open($filename) or die "Failed to open $filename: $!"; + $self->{font} = $font; + $self->read_tables; +} + +sub subset { + my ($self, $filename, $chars, $options) = @_; + + $self->{features} = $options->{features}; + + my $uid = substr(sha1_hex("$filename $chars"), 0, 16); + + if (not $self->{font}) { + $self->preload($filename); + } + + my $font = $self->{font}; + + $self->check_tables; + + $self->{num_glyphs_old} = $font->{maxp}{numGlyphs}; + + $self->fold_gsub($options->{fold_features}) + if $options->{fold_features}; + + my $fsType = $font->{'OS/2'}{fsType}; + warn "fsType is $fsType - subsetting and embedding might not be permitted by the license\n" if $fsType != 0; + + $self->strip_cmap; + $self->strip_name; + + $self->find_codepoint_glyph_mappings; + $self->find_wanted_glyphs($chars); + $self->remove_unwanted_glyphs; + + $self->fix_cmap; + $self->fix_head; + $self->fix_hhea; + $self->fix_hmtx; + # name: nothing to fix (though maybe could be optimised?) + $self->fix_post; + + # cvt_: nothing to fix + # fpgm: nothing to fix + # glyf: just a stub, in Font::TTF + $self->fix_loca; + # prep: nothing to fix + + # BASE: TODO + $self->fix_gdef if $font->{GDEF}; + $self->fix_gpos if $font->{GPOS}; + $self->fix_gsub if $font->{GSUB}; + # JSTF: TODO + + $self->fix_hdmx if $font->{hdmx}; + $self->fix_kern if $font->{kern}; + $self->fix_ltsh if $font->{LTSH}; + + $self->fix_maxp; # Must come after loca, prep, fpgm + $self->fix_os_2; # Must come after cmap, hmtx, hhea, GPOS, GSUB + + $self->fix_full_font_name; + + $self->change_name($uid); + + $self->license_desc_subst($options->{license_desc_subst}) + if defined $options->{license_desc_subst}; + + $self->{num_glyphs_new} = $font->{maxp}{numGlyphs}; +} + +sub num_glyphs_old { + my ($self) = @_; + return $self->{num_glyphs_old}; +} + +sub num_glyphs_new { + my ($self) = @_; + return $self->{num_glyphs_new}; +} + +sub glyph_names { + my ($self) = @_; + my $font = $self->{font}; + if (@{$font->{post}{VAL}}) { + return @{$font->{post}{VAL}}; + } + my $n = $#{$font->{loca}{glyphs}}; + return join ' ', map { chr($_) =~ /[a-zA-Z0-9- \|]/ ? "'".chr($_)."'" : sprintf 'U+%04x', $_ } map { keys %{$self->{glyphs}{$_}} } + map $self->{glyph_id_new_to_old}{$_}, 0..$n; +} + +sub feature_status { + my ($self) = @_; + my $font = $self->{font}; + my %feats; + my @feats; + for my $table (grep defined, $font->{GPOS}, $font->{GSUB}) { + for my $feature (@{$table->{FEATURES}{FEAT_TAGS}}) { + $feature =~ /^(\w{4})( _\d+)?$/ or die "Unrecognised feature tag syntax '$feature'"; + my $tag = $1; + next if $feats{$tag}++; + push @feats, $tag; + } + } + return @feats; +} + +sub write { + my ($self, $fh) = @_; + my $font = $self->{font}; + $font->out($fh) or die $!; +} + +sub release { + my ($self) = @_; + my $font = $self->{font}; + $font->release; +} + +1; diff --git a/font-optimizer/Font/Subsetter/NormalizationData.pm b/font-optimizer/Font/Subsetter/NormalizationData.pm new file mode 100644 index 0000000..dca81d6 --- /dev/null +++ b/font-optimizer/Font/Subsetter/NormalizationData.pm @@ -0,0 +1,1377 @@ +package Font::Subsetter::NormalizationData; +use strict; +use warnings; +our @data = ( +[192,65,768], +[193,65,769], +[194,65,770], +[195,65,771], +[196,65,776], +[197,65,778], +[199,67,807], +[200,69,768], +[201,69,769], +[202,69,770], +[203,69,776], +[204,73,768], +[205,73,769], +[206,73,770], +[207,73,776], +[209,78,771], +[210,79,768], +[211,79,769], +[212,79,770], +[213,79,771], +[214,79,776], +[217,85,768], +[218,85,769], +[219,85,770], +[220,85,776], +[221,89,769], +[224,97,768], +[225,97,769], +[226,97,770], +[227,97,771], +[228,97,776], +[229,97,778], +[231,99,807], +[232,101,768], +[233,101,769], +[234,101,770], +[235,101,776], +[236,105,768], +[237,105,769], +[238,105,770], +[239,105,776], +[241,110,771], +[242,111,768], +[243,111,769], +[244,111,770], +[245,111,771], +[246,111,776], +[249,117,768], +[250,117,769], +[251,117,770], +[252,117,776], +[253,121,769], +[255,121,776], +[256,65,772], +[257,97,772], +[258,65,774], +[259,97,774], +[260,65,808], +[261,97,808], +[262,67,769], +[263,99,769], +[264,67,770], +[265,99,770], +[266,67,775], +[267,99,775], +[268,67,780], +[269,99,780], +[270,68,780], +[271,100,780], +[274,69,772], +[275,101,772], +[276,69,774], +[277,101,774], +[278,69,775], +[279,101,775], +[280,69,808], +[281,101,808], +[282,69,780], +[283,101,780], +[284,71,770], +[285,103,770], +[286,71,774], +[287,103,774], +[288,71,775], +[289,103,775], +[290,71,807], +[291,103,807], +[292,72,770], +[293,104,770], +[296,73,771], +[297,105,771], +[298,73,772], +[299,105,772], +[300,73,774], +[301,105,774], +[302,73,808], +[303,105,808], +[304,73,775], +[308,74,770], +[309,106,770], +[310,75,807], +[311,107,807], +[313,76,769], +[314,108,769], +[315,76,807], +[316,108,807], +[317,76,780], +[318,108,780], +[323,78,769], +[324,110,769], +[325,78,807], +[326,110,807], +[327,78,780], +[328,110,780], +[332,79,772], +[333,111,772], +[334,79,774], +[335,111,774], +[336,79,779], +[337,111,779], +[340,82,769], +[341,114,769], +[342,82,807], +[343,114,807], +[344,82,780], +[345,114,780], +[346,83,769], +[347,115,769], +[348,83,770], +[349,115,770], +[350,83,807], +[351,115,807], +[352,83,780], +[353,115,780], +[354,84,807], +[355,116,807], +[356,84,780], +[357,116,780], +[360,85,771], +[361,117,771], +[362,85,772], +[363,117,772], +[364,85,774], +[365,117,774], +[366,85,778], +[367,117,778], +[368,85,779], +[369,117,779], +[370,85,808], +[371,117,808], +[372,87,770], +[373,119,770], +[374,89,770], +[375,121,770], +[376,89,776], +[377,90,769], +[378,122,769], +[379,90,775], +[380,122,775], +[381,90,780], +[382,122,780], +[416,79,795], +[417,111,795], +[431,85,795], +[432,117,795], +[461,65,780], +[462,97,780], +[463,73,780], +[464,105,780], +[465,79,780], +[466,111,780], +[467,85,780], +[468,117,780], +[469,85,776,772], +[469,220,772], +[470,117,776,772], +[470,252,772], +[471,85,776,769], +[471,220,769], +[472,117,776,769], +[472,252,769], +[473,85,776,780], +[473,220,780], +[474,117,776,780], +[474,252,780], +[475,85,776,768], +[475,220,768], +[476,117,776,768], +[476,252,768], +[478,65,776,772], +[478,196,772], +[479,97,776,772], +[479,228,772], +[480,65,775,772], +[480,550,772], +[481,97,775,772], +[481,551,772], +[482,198,772], +[483,230,772], +[486,71,780], +[487,103,780], +[488,75,780], +[489,107,780], +[490,79,808], +[491,111,808], +[492,79,808,772], +[492,332,808], +[492,490,772], +[493,111,808,772], +[493,333,808], +[493,491,772], +[494,439,780], +[495,658,780], +[496,106,780], +[500,71,769], +[501,103,769], +[504,78,768], +[505,110,768], +[506,65,778,769], +[506,197,769], +[507,97,778,769], +[507,229,769], +[508,198,769], +[509,230,769], +[510,216,769], +[511,248,769], +[512,65,783], +[513,97,783], +[514,65,785], +[515,97,785], +[516,69,783], +[517,101,783], +[518,69,785], +[519,101,785], +[520,73,783], +[521,105,783], +[522,73,785], +[523,105,785], +[524,79,783], +[525,111,783], +[526,79,785], +[527,111,785], +[528,82,783], +[529,114,783], +[530,82,785], +[531,114,785], +[532,85,783], +[533,117,783], +[534,85,785], +[535,117,785], +[536,83,806], +[537,115,806], +[538,84,806], +[539,116,806], +[542,72,780], +[543,104,780], +[550,65,775], +[551,97,775], +[552,69,807], +[553,101,807], +[554,79,776,772], +[554,214,772], +[555,111,776,772], +[555,246,772], +[556,79,771,772], +[556,213,772], +[557,111,771,772], +[557,245,772], +[558,79,775], +[559,111,775], +[560,79,775,772], +[560,558,772], +[561,111,775,772], +[561,559,772], +[562,89,772], +[563,121,772], +[901,168,769], +[902,913,769], +[904,917,769], +[905,919,769], +[906,921,769], +[908,927,769], +[910,933,769], +[911,937,769], +[912,953,776,769], +[912,970,769], +[938,921,776], +[939,933,776], +[940,945,769], +[941,949,769], +[942,951,769], +[943,953,769], +[944,965,776,769], +[944,971,769], +[970,953,776], +[971,965,776], +[972,959,769], +[973,965,769], +[974,969,769], +[979,978,769], +[980,978,776], +[1024,1045,768], +[1025,1045,776], +[1027,1043,769], +[1031,1030,776], +[1036,1050,769], +[1037,1048,768], +[1038,1059,774], +[1049,1048,774], +[1081,1080,774], +[1104,1077,768], +[1105,1077,776], +[1107,1075,769], +[1111,1110,776], +[1116,1082,769], +[1117,1080,768], +[1118,1091,774], +[1142,1140,783], +[1143,1141,783], +[1217,1046,774], +[1218,1078,774], +[1232,1040,774], +[1233,1072,774], +[1234,1040,776], +[1235,1072,776], +[1238,1045,774], +[1239,1077,774], +[1242,1240,776], +[1243,1241,776], +[1244,1046,776], +[1245,1078,776], +[1246,1047,776], +[1247,1079,776], +[1250,1048,772], +[1251,1080,772], +[1252,1048,776], +[1253,1080,776], +[1254,1054,776], +[1255,1086,776], +[1258,1256,776], +[1259,1257,776], +[1260,1069,776], +[1261,1101,776], +[1262,1059,772], +[1263,1091,772], +[1264,1059,776], +[1265,1091,776], +[1266,1059,779], +[1267,1091,779], +[1268,1063,776], +[1269,1095,776], +[1272,1067,776], +[1273,1099,776], +[1570,1575,1619], +[1571,1575,1620], +[1572,1608,1620], +[1573,1575,1621], +[1574,1610,1620], +[1728,1749,1620], +[1730,1729,1620], +[1747,1746,1620], +[2345,2344,2364], +[2353,2352,2364], +[2356,2355,2364], +[2507,2503,2494], +[2508,2503,2519], +[2888,2887,2902], +[2891,2887,2878], +[2892,2887,2903], +[2964,2962,3031], +[3018,3014,3006], +[3019,3015,3006], +[3020,3014,3031], +[3144,3142,3158], +[3264,3263,3285], +[3271,3270,3285], +[3272,3270,3286], +[3274,3270,3266], +[3275,3270,3266,3285], +[3275,3274,3285], +[3402,3398,3390], +[3403,3399,3390], +[3404,3398,3415], +[3546,3545,3530], +[3548,3545,3535], +[3549,3545,3535,3530], +[3549,3548,3530], +[3550,3545,3551], +[4134,4133,4142], +[7680,65,805], +[7681,97,805], +[7682,66,775], +[7683,98,775], +[7684,66,803], +[7685,98,803], +[7686,66,817], +[7687,98,817], +[7688,67,807,769], +[7688,262,807], +[7688,199,769], +[7689,99,807,769], +[7689,263,807], +[7689,231,769], +[7690,68,775], +[7691,100,775], +[7692,68,803], +[7693,100,803], +[7694,68,817], +[7695,100,817], +[7696,68,807], +[7697,100,807], +[7698,68,813], +[7699,100,813], +[7700,69,772,768], +[7700,274,768], +[7701,101,772,768], +[7701,275,768], +[7702,69,772,769], +[7702,274,769], +[7703,101,772,769], +[7703,275,769], +[7704,69,813], +[7705,101,813], +[7706,69,816], +[7707,101,816], +[7708,69,807,774], +[7708,276,807], +[7708,552,774], +[7709,101,807,774], +[7709,277,807], +[7709,553,774], +[7710,70,775], +[7711,102,775], +[7712,71,772], +[7713,103,772], +[7714,72,775], +[7715,104,775], +[7716,72,803], +[7717,104,803], +[7718,72,776], +[7719,104,776], +[7720,72,807], +[7721,104,807], +[7722,72,814], +[7723,104,814], +[7724,73,816], +[7725,105,816], +[7726,73,776,769], +[7726,207,769], +[7727,105,776,769], +[7727,239,769], +[7728,75,769], +[7729,107,769], +[7730,75,803], +[7731,107,803], +[7732,75,817], +[7733,107,817], +[7734,76,803], +[7735,108,803], +[7736,76,803,772], +[7736,7734,772], +[7737,108,803,772], +[7737,7735,772], +[7738,76,817], +[7739,108,817], +[7740,76,813], +[7741,108,813], +[7742,77,769], +[7743,109,769], +[7744,77,775], +[7745,109,775], +[7746,77,803], +[7747,109,803], +[7748,78,775], +[7749,110,775], +[7750,78,803], +[7751,110,803], +[7752,78,817], +[7753,110,817], +[7754,78,813], +[7755,110,813], +[7756,79,771,769], +[7756,213,769], +[7757,111,771,769], +[7757,245,769], +[7758,79,771,776], +[7758,213,776], +[7759,111,771,776], +[7759,245,776], +[7760,79,772,768], +[7760,332,768], +[7761,111,772,768], +[7761,333,768], +[7762,79,772,769], +[7762,332,769], +[7763,111,772,769], +[7763,333,769], +[7764,80,769], +[7765,112,769], +[7766,80,775], +[7767,112,775], +[7768,82,775], +[7769,114,775], +[7770,82,803], +[7771,114,803], +[7772,82,803,772], +[7772,7770,772], +[7773,114,803,772], +[7773,7771,772], +[7774,82,817], +[7775,114,817], +[7776,83,775], +[7777,115,775], +[7778,83,803], +[7779,115,803], +[7780,83,769,775], +[7780,346,775], +[7781,115,769,775], +[7781,347,775], +[7782,83,780,775], +[7782,352,775], +[7783,115,780,775], +[7783,353,775], +[7784,83,803,775], +[7784,7776,803], +[7784,7778,775], +[7785,115,803,775], +[7785,7777,803], +[7785,7779,775], +[7786,84,775], +[7787,116,775], +[7788,84,803], +[7789,116,803], +[7790,84,817], +[7791,116,817], +[7792,84,813], +[7793,116,813], +[7794,85,804], +[7795,117,804], +[7796,85,816], +[7797,117,816], +[7798,85,813], +[7799,117,813], +[7800,85,771,769], +[7800,360,769], +[7801,117,771,769], +[7801,361,769], +[7802,85,772,776], +[7802,362,776], +[7803,117,772,776], +[7803,363,776], +[7804,86,771], +[7805,118,771], +[7806,86,803], +[7807,118,803], +[7808,87,768], +[7809,119,768], +[7810,87,769], +[7811,119,769], +[7812,87,776], +[7813,119,776], +[7814,87,775], +[7815,119,775], +[7816,87,803], +[7817,119,803], +[7818,88,775], +[7819,120,775], +[7820,88,776], +[7821,120,776], +[7822,89,775], +[7823,121,775], +[7824,90,770], +[7825,122,770], +[7826,90,803], +[7827,122,803], +[7828,90,817], +[7829,122,817], +[7830,104,817], +[7831,116,776], +[7832,119,778], +[7833,121,778], +[7835,383,775], +[7840,65,803], +[7841,97,803], +[7842,65,777], +[7843,97,777], +[7844,65,770,769], +[7844,194,769], +[7845,97,770,769], +[7845,226,769], +[7846,65,770,768], +[7846,194,768], +[7847,97,770,768], +[7847,226,768], +[7848,65,770,777], +[7848,194,777], +[7849,97,770,777], +[7849,226,777], +[7850,65,770,771], +[7850,194,771], +[7851,97,770,771], +[7851,226,771], +[7852,65,803,770], +[7852,194,803], +[7852,7840,770], +[7853,97,803,770], +[7853,226,803], +[7853,7841,770], +[7854,65,774,769], +[7854,258,769], +[7855,97,774,769], +[7855,259,769], +[7856,65,774,768], +[7856,258,768], +[7857,97,774,768], +[7857,259,768], +[7858,65,774,777], +[7858,258,777], +[7859,97,774,777], +[7859,259,777], +[7860,65,774,771], +[7860,258,771], +[7861,97,774,771], +[7861,259,771], +[7862,65,803,774], +[7862,258,803], +[7862,7840,774], +[7863,97,803,774], +[7863,259,803], +[7863,7841,774], +[7864,69,803], +[7865,101,803], +[7866,69,777], +[7867,101,777], +[7868,69,771], +[7869,101,771], +[7870,69,770,769], +[7870,202,769], +[7871,101,770,769], +[7871,234,769], +[7872,69,770,768], +[7872,202,768], +[7873,101,770,768], +[7873,234,768], +[7874,69,770,777], +[7874,202,777], +[7875,101,770,777], +[7875,234,777], +[7876,69,770,771], +[7876,202,771], +[7877,101,770,771], +[7877,234,771], +[7878,69,803,770], +[7878,202,803], +[7878,7864,770], +[7879,101,803,770], +[7879,234,803], +[7879,7865,770], +[7880,73,777], +[7881,105,777], +[7882,73,803], +[7883,105,803], +[7884,79,803], +[7885,111,803], +[7886,79,777], +[7887,111,777], +[7888,79,770,769], +[7888,212,769], +[7889,111,770,769], +[7889,244,769], +[7890,79,770,768], +[7890,212,768], +[7891,111,770,768], +[7891,244,768], +[7892,79,770,777], +[7892,212,777], +[7893,111,770,777], +[7893,244,777], +[7894,79,770,771], +[7894,212,771], +[7895,111,770,771], +[7895,244,771], +[7896,79,803,770], +[7896,212,803], +[7896,7884,770], +[7897,111,803,770], +[7897,244,803], +[7897,7885,770], +[7898,79,795,769], +[7898,211,795], +[7898,416,769], +[7899,111,795,769], +[7899,243,795], +[7899,417,769], +[7900,79,795,768], +[7900,210,795], +[7900,416,768], +[7901,111,795,768], +[7901,242,795], +[7901,417,768], +[7902,79,795,777], +[7902,7886,795], +[7902,416,777], +[7903,111,795,777], +[7903,7887,795], +[7903,417,777], +[7904,79,795,771], +[7904,213,795], +[7904,416,771], +[7905,111,795,771], +[7905,245,795], +[7905,417,771], +[7906,79,795,803], +[7906,7884,795], +[7906,416,803], +[7907,111,795,803], +[7907,7885,795], +[7907,417,803], +[7908,85,803], +[7909,117,803], +[7910,85,777], +[7911,117,777], +[7912,85,795,769], +[7912,218,795], +[7912,431,769], +[7913,117,795,769], +[7913,250,795], +[7913,432,769], +[7914,85,795,768], +[7914,217,795], +[7914,431,768], +[7915,117,795,768], +[7915,249,795], +[7915,432,768], +[7916,85,795,777], +[7916,7910,795], +[7916,431,777], +[7917,117,795,777], +[7917,7911,795], +[7917,432,777], +[7918,85,795,771], +[7918,360,795], +[7918,431,771], +[7919,117,795,771], +[7919,361,795], +[7919,432,771], +[7920,85,795,803], +[7920,7908,795], +[7920,431,803], +[7921,117,795,803], +[7921,7909,795], +[7921,432,803], +[7922,89,768], +[7923,121,768], +[7924,89,803], +[7925,121,803], +[7926,89,777], +[7927,121,777], +[7928,89,771], +[7929,121,771], +[7936,945,787], +[7937,945,788], +[7938,945,787,768], +[7938,7936,768], +[7939,945,788,768], +[7939,7937,768], +[7940,945,787,769], +[7940,7936,769], +[7941,945,788,769], +[7941,7937,769], +[7942,945,787,834], +[7942,7936,834], +[7943,945,788,834], +[7943,7937,834], +[7944,913,787], +[7945,913,788], +[7946,913,787,768], +[7946,7944,768], +[7947,913,788,768], +[7947,7945,768], +[7948,913,787,769], +[7948,7944,769], +[7949,913,788,769], +[7949,7945,769], +[7950,913,787,834], +[7950,7944,834], +[7951,913,788,834], +[7951,7945,834], +[7952,949,787], +[7953,949,788], +[7954,949,787,768], +[7954,7952,768], +[7955,949,788,768], +[7955,7953,768], +[7956,949,787,769], +[7956,7952,769], +[7957,949,788,769], +[7957,7953,769], +[7960,917,787], +[7961,917,788], +[7962,917,787,768], +[7962,7960,768], +[7963,917,788,768], +[7963,7961,768], +[7964,917,787,769], +[7964,7960,769], +[7965,917,788,769], +[7965,7961,769], +[7968,951,787], +[7969,951,788], +[7970,951,787,768], +[7970,7968,768], +[7971,951,788,768], +[7971,7969,768], +[7972,951,787,769], +[7972,7968,769], +[7973,951,788,769], +[7973,7969,769], +[7974,951,787,834], +[7974,7968,834], +[7975,951,788,834], +[7975,7969,834], +[7976,919,787], +[7977,919,788], +[7978,919,787,768], +[7978,7976,768], +[7979,919,788,768], +[7979,7977,768], +[7980,919,787,769], +[7980,7976,769], +[7981,919,788,769], +[7981,7977,769], +[7982,919,787,834], +[7982,7976,834], +[7983,919,788,834], +[7983,7977,834], +[7984,953,787], +[7985,953,788], +[7986,953,787,768], +[7986,7984,768], +[7987,953,788,768], +[7987,7985,768], +[7988,953,787,769], +[7988,7984,769], +[7989,953,788,769], +[7989,7985,769], +[7990,953,787,834], +[7990,7984,834], +[7991,953,788,834], +[7991,7985,834], +[7992,921,787], +[7993,921,788], +[7994,921,787,768], +[7994,7992,768], +[7995,921,788,768], +[7995,7993,768], +[7996,921,787,769], +[7996,7992,769], +[7997,921,788,769], +[7997,7993,769], +[7998,921,787,834], +[7998,7992,834], +[7999,921,788,834], +[7999,7993,834], +[8000,959,787], +[8001,959,788], +[8002,959,787,768], +[8002,8000,768], +[8003,959,788,768], +[8003,8001,768], +[8004,959,787,769], +[8004,8000,769], +[8005,959,788,769], +[8005,8001,769], +[8008,927,787], +[8009,927,788], +[8010,927,787,768], +[8010,8008,768], +[8011,927,788,768], +[8011,8009,768], +[8012,927,787,769], +[8012,8008,769], +[8013,927,788,769], +[8013,8009,769], +[8016,965,787], +[8017,965,788], +[8018,965,787,768], +[8018,8016,768], +[8019,965,788,768], +[8019,8017,768], +[8020,965,787,769], +[8020,8016,769], +[8021,965,788,769], +[8021,8017,769], +[8022,965,787,834], +[8022,8016,834], +[8023,965,788,834], +[8023,8017,834], +[8025,933,788], +[8027,933,788,768], +[8027,8025,768], +[8029,933,788,769], +[8029,8025,769], +[8031,933,788,834], +[8031,8025,834], +[8032,969,787], +[8033,969,788], +[8034,969,787,768], +[8034,8032,768], +[8035,969,788,768], +[8035,8033,768], +[8036,969,787,769], +[8036,8032,769], +[8037,969,788,769], +[8037,8033,769], +[8038,969,787,834], +[8038,8032,834], +[8039,969,788,834], +[8039,8033,834], +[8040,937,787], +[8041,937,788], +[8042,937,787,768], +[8042,8040,768], +[8043,937,788,768], +[8043,8041,768], +[8044,937,787,769], +[8044,8040,769], +[8045,937,788,769], +[8045,8041,769], +[8046,937,787,834], +[8046,8040,834], +[8047,937,788,834], +[8047,8041,834], +[8048,945,768], +[8050,949,768], +[8052,951,768], +[8054,953,768], +[8056,959,768], +[8058,965,768], +[8060,969,768], +[8064,945,787,837], +[8064,8115,787], +[8064,7936,837], +[8065,945,788,837], +[8065,8115,788], +[8065,7937,837], +[8066,945,787,768,837], +[8066,8115,787,768], +[8066,8064,768], +[8066,7936,837,768], +[8066,7936,768,837], +[8066,7938,837], +[8067,945,788,768,837], +[8067,8115,788,768], +[8067,8065,768], +[8067,7937,837,768], +[8067,7937,768,837], +[8067,7939,837], +[8068,945,787,769,837], +[8068,8115,787,769], +[8068,8064,769], +[8068,7936,837,769], +[8068,7936,769,837], +[8068,7940,837], +[8069,945,788,769,837], +[8069,8115,788,769], +[8069,8065,769], +[8069,7937,837,769], +[8069,7937,769,837], +[8069,7941,837], +[8070,945,787,834,837], +[8070,8115,787,834], +[8070,8064,834], +[8070,7936,837,834], +[8070,7936,834,837], +[8070,7942,837], +[8071,945,788,834,837], +[8071,8115,788,834], +[8071,8065,834], +[8071,7937,837,834], +[8071,7937,834,837], +[8071,7943,837], +[8072,913,787,837], +[8072,8124,787], +[8072,7944,837], +[8073,913,788,837], +[8073,8124,788], +[8073,7945,837], +[8074,913,787,768,837], +[8074,8124,787,768], +[8074,8072,768], +[8074,7944,837,768], +[8074,7944,768,837], +[8074,7946,837], +[8075,913,788,768,837], +[8075,8124,788,768], +[8075,8073,768], +[8075,7945,837,768], +[8075,7945,768,837], +[8075,7947,837], +[8076,913,787,769,837], +[8076,8124,787,769], +[8076,8072,769], +[8076,7944,837,769], +[8076,7944,769,837], +[8076,7948,837], +[8077,913,788,769,837], +[8077,8124,788,769], +[8077,8073,769], +[8077,7945,837,769], +[8077,7945,769,837], +[8077,7949,837], +[8078,913,787,834,837], +[8078,8124,787,834], +[8078,8072,834], +[8078,7944,837,834], +[8078,7944,834,837], +[8078,7950,837], +[8079,913,788,834,837], +[8079,8124,788,834], +[8079,8073,834], +[8079,7945,837,834], +[8079,7945,834,837], +[8079,7951,837], +[8080,951,787,837], +[8080,8131,787], +[8080,7968,837], +[8081,951,788,837], +[8081,8131,788], +[8081,7969,837], +[8082,951,787,768,837], +[8082,8131,787,768], +[8082,8080,768], +[8082,7968,837,768], +[8082,7968,768,837], +[8082,7970,837], +[8083,951,788,768,837], +[8083,8131,788,768], +[8083,8081,768], +[8083,7969,837,768], +[8083,7969,768,837], +[8083,7971,837], +[8084,951,787,769,837], +[8084,8131,787,769], +[8084,8080,769], +[8084,7968,837,769], +[8084,7968,769,837], +[8084,7972,837], +[8085,951,788,769,837], +[8085,8131,788,769], +[8085,8081,769], +[8085,7969,837,769], +[8085,7969,769,837], +[8085,7973,837], +[8086,951,787,834,837], +[8086,8131,787,834], +[8086,8080,834], +[8086,7968,837,834], +[8086,7968,834,837], +[8086,7974,837], +[8087,951,788,834,837], +[8087,8131,788,834], +[8087,8081,834], +[8087,7969,837,834], +[8087,7969,834,837], +[8087,7975,837], +[8088,919,787,837], +[8088,8140,787], +[8088,7976,837], +[8089,919,788,837], +[8089,8140,788], +[8089,7977,837], +[8090,919,787,768,837], +[8090,8140,787,768], +[8090,8088,768], +[8090,7976,837,768], +[8090,7976,768,837], +[8090,7978,837], +[8091,919,788,768,837], +[8091,8140,788,768], +[8091,8089,768], +[8091,7977,837,768], +[8091,7977,768,837], +[8091,7979,837], +[8092,919,787,769,837], +[8092,8140,787,769], +[8092,8088,769], +[8092,7976,837,769], +[8092,7976,769,837], +[8092,7980,837], +[8093,919,788,769,837], +[8093,8140,788,769], +[8093,8089,769], +[8093,7977,837,769], +[8093,7977,769,837], +[8093,7981,837], +[8094,919,787,834,837], +[8094,8140,787,834], +[8094,8088,834], +[8094,7976,837,834], +[8094,7976,834,837], +[8094,7982,837], +[8095,919,788,834,837], +[8095,8140,788,834], +[8095,8089,834], +[8095,7977,837,834], +[8095,7977,834,837], +[8095,7983,837], +[8096,969,787,837], +[8096,8179,787], +[8096,8032,837], +[8097,969,788,837], +[8097,8179,788], +[8097,8033,837], +[8098,969,787,768,837], +[8098,8179,787,768], +[8098,8096,768], +[8098,8032,837,768], +[8098,8032,768,837], +[8098,8034,837], +[8099,969,788,768,837], +[8099,8179,788,768], +[8099,8097,768], +[8099,8033,837,768], +[8099,8033,768,837], +[8099,8035,837], +[8100,969,787,769,837], +[8100,8179,787,769], +[8100,8096,769], +[8100,8032,837,769], +[8100,8032,769,837], +[8100,8036,837], +[8101,969,788,769,837], +[8101,8179,788,769], +[8101,8097,769], +[8101,8033,837,769], +[8101,8033,769,837], +[8101,8037,837], +[8102,969,787,834,837], +[8102,8179,787,834], +[8102,8096,834], +[8102,8032,837,834], +[8102,8032,834,837], +[8102,8038,837], +[8103,969,788,834,837], +[8103,8179,788,834], +[8103,8097,834], +[8103,8033,837,834], +[8103,8033,834,837], +[8103,8039,837], +[8104,937,787,837], +[8104,8188,787], +[8104,8040,837], +[8105,937,788,837], +[8105,8188,788], +[8105,8041,837], +[8106,937,787,768,837], +[8106,8188,787,768], +[8106,8104,768], +[8106,8040,837,768], +[8106,8040,768,837], +[8106,8042,837], +[8107,937,788,768,837], +[8107,8188,788,768], +[8107,8105,768], +[8107,8041,837,768], +[8107,8041,768,837], +[8107,8043,837], +[8108,937,787,769,837], +[8108,8188,787,769], +[8108,8104,769], +[8108,8040,837,769], +[8108,8040,769,837], +[8108,8044,837], +[8109,937,788,769,837], +[8109,8188,788,769], +[8109,8105,769], +[8109,8041,837,769], +[8109,8041,769,837], +[8109,8045,837], +[8110,937,787,834,837], +[8110,8188,787,834], +[8110,8104,834], +[8110,8040,837,834], +[8110,8040,834,837], +[8110,8046,837], +[8111,937,788,834,837], +[8111,8188,788,834], +[8111,8105,834], +[8111,8041,837,834], +[8111,8041,834,837], +[8111,8047,837], +[8112,945,774], +[8113,945,772], +[8114,945,768,837], +[8114,8115,768], +[8114,8048,837], +[8115,945,837], +[8116,945,769,837], +[8116,8115,769], +[8116,940,837], +[8118,945,834], +[8119,945,834,837], +[8119,8115,834], +[8119,8118,837], +[8120,913,774], +[8121,913,772], +[8122,913,768], +[8124,913,837], +[8129,168,834], +[8130,951,768,837], +[8130,8131,768], +[8130,8052,837], +[8131,951,837], +[8132,951,769,837], +[8132,8131,769], +[8132,942,837], +[8134,951,834], +[8135,951,834,837], +[8135,8131,834], +[8135,8134,837], +[8136,917,768], +[8138,919,768], +[8140,919,837], +[8141,8127,768], +[8142,8127,769], +[8143,8127,834], +[8144,953,774], +[8145,953,772], +[8146,953,776,768], +[8146,970,768], +[8150,953,834], +[8151,953,776,834], +[8151,970,834], +[8152,921,774], +[8153,921,772], +[8154,921,768], +[8157,8190,768], +[8158,8190,769], +[8159,8190,834], +[8160,965,774], +[8161,965,772], +[8162,965,776,768], +[8162,971,768], +[8164,961,787], +[8165,961,788], +[8166,965,834], +[8167,965,776,834], +[8167,971,834], +[8168,933,774], +[8169,933,772], +[8170,933,768], +[8172,929,788], +[8173,168,768], +[8178,969,768,837], +[8178,8179,768], +[8178,8060,837], +[8179,969,837], +[8180,969,769,837], +[8180,8179,769], +[8180,974,837], +[8182,969,834], +[8183,969,834,837], +[8183,8179,834], +[8183,8182,837], +[8184,927,768], +[8186,937,768], +[8188,937,837], +[8602,8592,824], +[8603,8594,824], +[8622,8596,824], +[8653,8656,824], +[8654,8660,824], +[8655,8658,824], +[8708,8707,824], +[8713,8712,824], +[8716,8715,824], +[8740,8739,824], +[8742,8741,824], +[8769,8764,824], +[8772,8771,824], +[8775,8773,824], +[8777,8776,824], +[8800,61,824], +[8802,8801,824], +[8813,8781,824], +[8814,60,824], +[8815,62,824], +[8816,8804,824], +[8817,8805,824], +[8820,8818,824], +[8821,8819,824], +[8824,8822,824], +[8825,8823,824], +[8832,8826,824], +[8833,8827,824], +[8836,8834,824], +[8837,8835,824], +[8840,8838,824], +[8841,8839,824], +[8876,8866,824], +[8877,8872,824], +[8878,8873,824], +[8879,8875,824], +[8928,8828,824], +[8929,8829,824], +[8930,8849,824], +[8931,8850,824], +[8938,8882,824], +[8939,8883,824], +[8940,8884,824], +[8941,8885,824], +[12364,12363,12441], +[12366,12365,12441], +[12368,12367,12441], +[12370,12369,12441], +[12372,12371,12441], +[12374,12373,12441], +[12376,12375,12441], +[12378,12377,12441], +[12380,12379,12441], +[12382,12381,12441], +[12384,12383,12441], +[12386,12385,12441], +[12389,12388,12441], +[12391,12390,12441], +[12393,12392,12441], +[12400,12399,12441], +[12401,12399,12442], +[12403,12402,12441], +[12404,12402,12442], +[12406,12405,12441], +[12407,12405,12442], +[12409,12408,12441], +[12410,12408,12442], +[12412,12411,12441], +[12413,12411,12442], +[12436,12358,12441], +[12446,12445,12441], +[12460,12459,12441], +[12462,12461,12441], +[12464,12463,12441], +[12466,12465,12441], +[12468,12467,12441], +[12470,12469,12441], +[12472,12471,12441], +[12474,12473,12441], +[12476,12475,12441], +[12478,12477,12441], +[12480,12479,12441], +[12482,12481,12441], +[12485,12484,12441], +[12487,12486,12441], +[12489,12488,12441], +[12496,12495,12441], +[12497,12495,12442], +[12499,12498,12441], +[12500,12498,12442], +[12502,12501,12441], +[12503,12501,12442], +[12505,12504,12441], +[12506,12504,12442], +[12508,12507,12441], +[12509,12507,12442], +[12532,12454,12441], +[12535,12527,12441], +[12536,12528,12441], +[12537,12529,12441], +[12538,12530,12441], +[12542,12541,12441], +); + +1; diff --git a/font-optimizer/Font/Subsetter/create-data.pl b/font-optimizer/Font/Subsetter/create-data.pl new file mode 100644 index 0000000..e0a38fb --- /dev/null +++ b/font-optimizer/Font/Subsetter/create-data.pl @@ -0,0 +1,100 @@ +use strict; +use warnings; + +use Unicode::Normalize; + +print <) { + my @c = split /;/, $_; + # Find characters which canonically decompose (without any + # compatibility tag "") + next unless $c[5] and $c[5] !~ /^[ord($1)-ord('a')]/eg; $_ } split / /, $cs2; + # If NFC didn't collapse everything into single characters, this string is not interesting + next if grep length != 1, @x; + # If the string doesn't NFC into the desired character, it's not interesting + next unless Unicode::Normalize::NFC(join '', @x) eq chr hex $c[0]; + # This string is good + push @data, [hex $c[0], map ord, @x]; + } + } + } elsif (@norm == 4) { + my ($a, $b, $c, $d) = @norm; + for my $cs (permut([$a, $b, $c, $d], [])) { + for my $cs2 ('ab c d', 'a bc d', 'a b cd', 'ab cd', 'abc d', 'a bcd') { + my @x = map Unicode::Normalize::NFC($_), map { s/(.)/$cs->[ord($1)-ord('a')]/eg; $_ } split / /, $cs2; + next if grep length != 1, @x; + next unless Unicode::Normalize::NFC(join '', @x) eq chr hex $c[0]; + push @data, [hex $c[0], map ord, @x]; + } + } + } elsif (@norm > 4) { + die "\@norm too big"; + } +} + +print uniq(map "[".join(',', @$_)."],\n", @data); + +print < \$verbose, + 'ttf-to-eot' => \$ttf_to_eot, + 'eot-to-ttf' => \$eot_to_ttf, + ) or help(); + + @ARGV == 2 or help(); + + my ($input_file, $output_file) = @ARGV; + + if ($ttf_to_eot and $eot_to_ttf) { + help(); + } + + if (not ($ttf_to_eot or $eot_to_ttf)) { + if ($input_file =~ /\.[ot]tf$/i and $output_file =~ /\.eot$/i) { + $ttf_to_eot = 1; + } elsif ($input_file =~ /\.eot$/i and $output_file =~ /\.[ot]tf$/i) { + $eot_to_ttf = 1; + } else { + help(); + } + } + + if ($ttf_to_eot) { + Font::EOTWrapper::convert($input_file, $output_file); + } elsif ($eot_to_ttf) { + Font::EOTWrapper::extract($input_file, $output_file); + } +} diff --git a/font-optimizer/ext/Font-TTF/.cvsignore b/font-optimizer/ext/Font-TTF/.cvsignore new file mode 100644 index 0000000..459bc9c --- /dev/null +++ b/font-optimizer/ext/Font-TTF/.cvsignore @@ -0,0 +1,2 @@ +*.gz +MANIFEST diff --git a/font-optimizer/ext/Font-TTF/COPYING b/font-optimizer/ext/Font-TTF/COPYING new file mode 100644 index 0000000..cbda892 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/COPYING @@ -0,0 +1,76 @@ + +Artistic License 2.0 + +Copyright (c) 2000-2006, The Perl Foundation. + +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. +Preamble + +This license establishes the terms under which a given free software Package may be copied, modified, distributed, and/or redistributed. The intent is that the Copyright Holder maintains some artistic control over the development of that Package while still keeping the Package available as open source and free software. + +You are always permitted to make arrangements wholly outside of this license directly with the Copyright Holder of a given Package. If the terms of this license do not permit the full use that you propose to make of the Package, you should contact the Copyright Holder and seek a different licensing arrangement. +Definitions + +"Copyright Holder" means the individual(s) or organization(s) named in the copyright notice for the entire Package. + +"Contributor" means any party that has contributed code or other material to the Package, in accordance with the Copyright Holder's procedures. + +"You" and "your" means any person who would like to copy, distribute, or modify the Package. + +"Package" means the collection of files distributed by the Copyright Holder, and derivatives of that collection and/or of those files. A given Package may consist of either the Standard Version, or a Modified Version. + +"Distribute" means providing a copy of the Package or making it accessible to anyone else, or in the case of a company or organization, to others outside of your company or organization. + +"Distributor Fee" means any fee that you charge for Distributing this Package or providing support for this Package to another party. It does not mean licensing fees. + +"Standard Version" refers to the Package if it has not been modified, or has been modified only in ways explicitly requested by the Copyright Holder. + +"Modified Version" means the Package, if it has been changed, and such changes were not explicitly requested by the Copyright Holder. + +"Original License" means this Artistic License as Distributed with the Standard Version of the Package, in its current version or as it may be modified by The Perl Foundation in the future. + +"Source" form means the source code, documentation source, and configuration files for the Package. + +"Compiled" form means the compiled bytecode, object code, binary, or any other form resulting from mechanical transformation or translation of the Source form. +Permission for Use and Modification Without Distribution + +(1) You are permitted to use the Standard Version and create and use Modified Versions for any purpose without restriction, provided that you do not Distribute the Modified Version. +Permissions for Redistribution of the Standard Version + +(2) You may Distribute verbatim copies of the Source form of the Standard Version of this Package in any medium without restriction, either gratis or for a Distributor Fee, provided that you duplicate all of the original copyright notices and associated disclaimers. At your discretion, such verbatim copies may or may not include a Compiled form of the Package. + +(3) You may apply any bug fixes, portability changes, and other modifications made available from the Copyright Holder. The resulting Package will still be considered the Standard Version, and as such will be subject to the Original License. +Distribution of Modified Versions of the Package as Source + +(4) You may Distribute your Modified Version as Source (either gratis or for a Distributor Fee, and with or without a Compiled form of the Modified Version) provided that you clearly document how it differs from the Standard Version, including, but not limited to, documenting any non-standard features, executables, or modules, and provided that you do at least ONE of the following: + +(a) make the Modified Version available to the Copyright Holder of the Standard Version, under the Original License, so that the Copyright Holder may include your modifications in the Standard Version. +(b) ensure that installation of your Modified Version does not prevent the user installing or running the Standard Version. In addition, the Modified Version must bear a name that is different from the name of the Standard Version. +(c) allow anyone who receives a copy of the Modified Version to make the Source form of the Modified Version available to others under +(i) the Original License or +(ii) a license that permits the licensee to freely copy, modify and redistribute the Modified Version using the same licensing terms that apply to the copy that the licensee received, and requires that the Source form of the Modified Version, and of any works derived from it, be made freely available in that license fees are prohibited but Distributor Fees are allowed. +Distribution of Compiled Forms of the Standard Version or Modified Versions without the Source + +(5) You may Distribute Compiled forms of the Standard Version without the Source, provided that you include complete instructions on how to get the Source of the Standard Version. Such instructions must be valid at the time of your distribution. If these instructions, at any time while you are carrying out such distribution, become invalid, you must provide new instructions on demand or cease further distribution. If you provide valid instructions or cease distribution within thirty days after you become aware that the instructions are invalid, then you do not forfeit any of your rights under this license. + +(6) You may Distribute a Modified Version in Compiled form without the Source, provided that you comply with Section 4 with respect to the Source of the Modified Version. +Aggregating or Linking the Package + +(7) You may aggregate the Package (either the Standard Version or Modified Version) with other packages and Distribute the resulting aggregation provided that you do not charge a licensing fee for the Package. Distributor Fees are permitted, and licensing fees for other components in the aggregation are permitted. The terms of this license apply to the use and Distribution of the Standard or Modified Versions as included in the aggregation. + +(8) You are permitted to link Modified and Standard Versions with other works, to embed the Package in a larger work of your own, or to build stand-alone binary or bytecode versions of applications that include the Package, and Distribute the result without restriction, provided the result does not expose a direct interface to the Package. +Items That are Not Considered Part of a Modified Version + +(9) Works (including, but not limited to, modules and scripts) that merely extend or make use of the Package, do not, by themselves, cause the Package to be a Modified Version. In addition, such works are not considered parts of the Package itself, and are not subject to the terms of this license. +General Provisions + +(10) Any use, modification, and distribution of the Standard or Modified Versions is governed by this Artistic License. By using, modifying or distributing the Package, you accept this license. Do not use, modify, or distribute the Package, if you do not accept this license. + +(11) If your Modified Version has been derived from a Modified Version made by someone other than you, you are nevertheless required to ensure that your Modified Version complies with the requirements of this license. + +(12) This license does not grant you the right to use any trademark, service mark, tradename, or logo of the Copyright Holder. + +(13) This license includes the non-exclusive, worldwide, free-of-charge patent license to make, have made, use, offer to sell, sell, import and otherwise transfer the Package with respect to any patent claims licensable by the Copyright Holder that are necessarily infringed by the Package. If you institute patent litigation (including a cross-claim or counterclaim) against any party alleging that the Package constitutes direct or contributory patent infringement, then this Artistic License to you shall terminate on the date that such litigation is filed. + +(14) Disclaimer of Warranty: THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/font-optimizer/ext/Font-TTF/Changes b/font-optimizer/ext/Font-TTF/Changes new file mode 100644 index 0000000..1821632 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/Changes @@ -0,0 +1,6 @@ +0.45 + +* Introduce changelog +* tidy up 0.44 package, fix README to be more accurate +* tests failing on perl 5.8.2 and before due to no use Exporter qw(import); + Fix OTTags accordingly. diff --git a/font-optimizer/ext/Font-TTF/MANIFEST.SKIP b/font-optimizer/ext/Font-TTF/MANIFEST.SKIP new file mode 100644 index 0000000..464c50e --- /dev/null +++ b/font-optimizer/ext/Font-TTF/MANIFEST.SKIP @@ -0,0 +1,26 @@ +blib/ +\.\$\$\$ +\.tmp +\.bak +CVS/ +\.tar +\.tgz +\.old +misc/ +Build/ +exes/ +\.cvsignore +^# +\.svn/ +Makefile$ +\.par$ +-stamp$ +debian/ +pm_to_blib +\~$ +dev/ +build/ +dists/ +^libfont- +description-pak +^doc diff --git a/font-optimizer/ext/Font-TTF/Makefile.PL b/font-optimizer/ext/Font-TTF/Makefile.PL new file mode 100644 index 0000000..c0518d5 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/Makefile.PL @@ -0,0 +1,108 @@ +use ExtUtils::MakeMaker; +use Getopt::Std; + +getopts('d:rv:'); + +%pbuilderopts = ( + 'gutsy' => '--bindmounts /media/hosk_1' + ); + +$opt_v ||= 1; + +if ($^O eq 'linux' && !defined $opt_d) +{ + $opt_d = `lsb_release -c`; + $opt_d =~ s/^.*?(\w+)\s*$/$1/o; +} + +@theselibs = (grep {-f } glob("lib/Font/TTF/*"), "lib/Font/TTF.pm"); + +# incantation to enable MY::pm_to_blib later on +if ($^O eq 'MSWin32') +{ + push(@ExtUtils::MakeMaker::Overridable, qw(pm_to_blib)); + @extras = ('dist' => { 'TO_UNIX' => 'perl -Mtounix -e "tounix(\"$(DISTVNAME)\")"' }); +} + +%makeinfo = ( + NAME => 'Font::TTF', + VERSION_FROM => 'lib/Font/TTF.pm', +# VERSION => "0.38", +# HTMLLIBPODS => {map {my $t = $_; $t=~s/\..*?$/.html/o; $t='blib/Html/'.$t; $_ => $t;} @theselibs}, +# HTMLSCRIPTPODS => {map {my $t=$_; $t=~s/\..*?$/.html/o; $t='blib/Html/'.$t; $_ => $t;} @scripts}, + AUTHOR => "martin_hosken\@sil.org", + ABSTRACT => "TTF font support for Perl", + @extras + ); + +WriteMakefile(%makeinfo); + +if ($^O eq 'MSWin32') { +# incantation to solve the problem of everyone's $Config{make} being 'nmake' +# when we want 'pmake'. And $Config{} is read only. +# actually, this is just a copy of the code from ExtUtiles::MM_Win32 tidied +# up (to expose tabs) and the dependency on Config removed +sub MY::pm_to_blib +{ + my $self = shift; + my($autodir) = $self->catdir('$(INST_LIB)','auto'); + return <<"EOT"; + +pm_to_blib: \$(TO_INST_PM) +\t$self->{NOECHO}\$(PERL) \"-I\$(INST_ARCHLINE)\" \"-I\$(INST_LIB)\" \\ +\t\"-I\$(PERL_ARCHLIB)\" \"-I\$(PERL_LIB)\" -MExtUtils::Install \\ +\t-e \"pm_to_blib({ qw[\$(PM_TO_BLIB)] }, '$autodir') +\t$self->{NOECHO}\$(TOUCH) \$@ + +EOT +} + +} +elsif ($^O eq 'linux') +{ + +sub MY::postamble +{ + my ($self) = @_; + my ($res); + my ($package) = lc($self->{'NAME'}); + my ($pversion) = $self->{'VERSION'}; + my ($svn) = `svnversion`; + my ($sign) = '--auto-debsign' if ($opt_r); + my ($fpackage); + + $svn =~ s/[0-9]*://og; + $svn =~ s/\s+$//o; + $package =~ s/::/-/; + $package = "lib${package}-perl"; + $pversion .= "+$svn" unless ($opt_r); + $fpackage = "$package-$pversion"; + + $res = <<"EOT"; +deb-base: dist + rm -fr $self->{'DISTVNAME'} + rm -fr $fpackage + tar xvzf $self->{'DISTVNAME'}.tar.gz + mv $self->{'DISTVNAME'} $fpackage + tar cfz "${package}_$pversion.orig.tar.gz" $fpackage + cp -a debian $fpackage + cd $fpackage && find . -name .svn | xargs rm -rf + +# make deb builds an interim deb from svn source for release +deb: deb-base +EOT + + foreach $d (split(' ', $opt_d)) + { + $res .= <<"EOT"; + mkdir -p dists/$d + dch -D $d -v $pversion-$opt_v -m -b -c $fpackage/debian/changelog "Auto build from perl for $d" + cd $fpackage && pdebuild --buildresult ../dists/$d -- --basetgz /var/cache/pbuilder/base-$d.tgz $pbuilderopts{$d} +EOT + } + + return $res; +} + +} + diff --git a/font-optimizer/ext/Font-TTF/README.TXT b/font-optimizer/ext/Font-TTF/README.TXT new file mode 100644 index 0000000..ad6a602 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/README.TXT @@ -0,0 +1,99 @@ + Perl Module: Font::TTF + +=head1 Introduction + +Perl module for TrueType font hacking. Supports reading, processing and +writing of the following tables: GDEF, GPOS, GSUB, LTSH, OS/2, PCLT, +bsln, cmap, cvt, fdsc, feat, fpgm, glyf, hdmx, head, hhea, hmtx, kern, +loca, maxp, mort, name, post, prep, prop, vhea, vmtx and the reading and +writing of all other table types. + +In short, you can do almost anything with a standard TrueType font with +this module. Be Brave! + +Any suggestions, improvements, additions, subclasses, etc. would be gratefully +received and probably included in a future release. Please send them to me. + +This module has been tested on Win32, Unix and Mac. + +Applications that were associated with this module have been moved to Font::TTF::Scripts where great things can be done. + +=head1 SYNOPSIS + +Here is the regression test (you provide your own font). Run it once and then +again on the output of the first run. There should be no differences between +the outputs of the two runs. + + use Font::TTF::Font; + + $f = Font::TTF::Font->open($ARGV[0]); + + # force a read of all the tables + $f->tables_do(sub { $_[0]->read; }); + + # force read of all glyphs (use read_dat to use lots of memory!) + # $f->{'loca'}->glyphs_do(sub { $_[0]->read; }); + $f->{'loca'}->glyphs_do(sub { $_[0]->read_dat; }); + # NB. no need to $g->update since $_[0]->{'glyf'}->out will do it for us + + $f->out($ARGV[1]); + $f->DESTROY; # forces close of $in and maybe memory reclaim! + +=head1 Installation + +If you have received this package as part of an Activestate PPM style .zip file +then type + + ppm install Font-TTF.ppd + +Otherwise. + +To configure this module, cd to the directory that contains this README file +and type the following. + + perl Makefile.PL + +Alternatively, if you plan to install Font::TTF somewhere other than +your system's perl library directory. You can type something like this: + + perl Makefile.PL PREFIX=/home/me/perl INSTALLDIRS=perl + +Then to build you run make. + + make + +If you have write access to the perl library directories, you may then +install by typing: + + make install + +To tidy up, type: + + make realclean + +Win32 users should use pmake instead of make. Alternatively installation can be +done on Win32 by typing: + + Setup + +Or using the install feature in tools like WinZip. + +=head1 CHANGES + +=head2 Future Changes + +I do not anticipate any more restructuring changes (but reserve the right to do so). + +=head1 AUTHOR + +Martin Hosken L + +Copyright Martin Hosken 1998 and following. + +No warranty or expression of effectiveness for anything, least of all anyone's +safety, is implied in this software or documentation. + +=head2 Licensing + +The Perl TTF module is licensed under the Perl Artistic License. + diff --git a/font-optimizer/ext/Font-TTF/TODO b/font-optimizer/ext/Font-TTF/TODO new file mode 100644 index 0000000..a562dc4 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/TODO @@ -0,0 +1,5 @@ + +* update() is a mess. What is needed is a mark sweep clean algorithm where the + dirty is used only for tables that have changed. Thus if a table is updated + it could well become dirty! Also need to be able to pass a force parameter + to force a table to update and all the tables in its dependency tree. diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF.pm new file mode 100644 index 0000000..59237d3 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF.pm @@ -0,0 +1,24 @@ +package Font::TTF; + +$VERSION = '0.46'; # MJPH 26-JAN-2009 Various bug fixes, add Sill table +# $VERSION = '0.45'; # MJPH 11-JUN-2008 Packaging tidying +# $VERSION = '0.44'; # MJPH 9-JUN-2008 Various bug fixes +# $VERSION = '0.43'; # MJPH 20-NOV-2007 Add a test! +# $VERSION = '0.42'; # MJPH 11-OCT-2007 Add Volt2ttf support +# $VERSION = '0.41'; # MJPH 27-MAR-2007 Remove warnings from font copy +# Bug fixes in Ttopen, GDEF +# Remove redundant head and maxp ->reads +# $VERSION = '0.40'; # MJPH 31-JUL-2006 Add EBDT, EBLC tables +# $VERSION = 0.39; + +1; + +=head1 NAME + +Font::TTF - Perl module for TrueType Font hacking + +=head1 DESCRIPTION + +This module allows you to do almost anything to a TrueType/OpenType Font +including modify and inspect nearly all tables. + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/AATKern.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/AATKern.pm new file mode 100644 index 0000000..6aa1e62 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/AATKern.pm @@ -0,0 +1,140 @@ +package Font::TTF::AATKern; + +=head1 NAME + +Font::TTF::AATKern - AAT Kern table + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA); +use Font::TTF::Utils; +use Font::TTF::AATutils; +use Font::TTF::Kern::Subtable; + +@ISA = qw(Font::TTF::Table); + +=head2 $t->read + +Reads the table into memory + +=cut + +sub read +{ + my ($self) = @_; + + $self->SUPER::read or return $self; + + my ($dat, $fh, $numSubtables); + $fh = $self->{' INFILE'}; + + $fh->read($dat, 8); + ($self->{'version'}, $numSubtables) = TTF_Unpack("vL", $dat); + + my $subtables = []; + foreach (1 .. $numSubtables) { + my $subtableStart = $fh->tell(); + + $fh->read($dat, 8); + my ($length, $coverage, $tupleIndex) = TTF_Unpack("LSS", $dat); + my $type = $coverage & 0x00ff; + + my $subtable = Font::TTF::Kern::Subtable->create($type, $coverage, $length); + $subtable->read($fh); + + $subtable->{'tupleIndex'} = $tupleIndex if $subtable->{'variation'}; + $subtable->{' PARENT'} = $self; + push @$subtables, $subtable; + } + + $self->{'subtables'} = $subtables; + + $self; +} + +=head2 $t->out($fh) + +Writes the table to a file either from memory or by copying + +=cut + +sub out +{ + my ($self, $fh) = @_; + + return $self->SUPER::out($fh) unless $self->{' read'}; + + my $subtables = $self->{'subtables'}; + $fh->print(TTF_Pack("vL", $self->{'version'}, scalar @$subtables)); + + foreach (@$subtables) { + $_->out($fh); + } +} + +=head2 $t->print($fh) + +Prints a human-readable representation of the table + +=cut + +sub print +{ + my ($self, $fh) = @_; + + $self->read unless $self->{' read'}; + + $fh = 'STDOUT' unless defined $fh; + + $fh->printf("version %f\n", $self->{'version'}); + + my $subtables = $self->{'subtables'}; + foreach (@$subtables) { + $_->print($fh); + } +} + +sub dumpXML +{ + my ($self, $fh) = @_; + $self->read unless $self->{' read'}; + + my $post = $self->{' PARENT'}->{'post'}; + $post->read; + + $fh = 'STDOUT' unless defined $fh; + $fh->printf("\n", $self->{'version'}); + + my $subtables = $self->{'subtables'}; + foreach (@$subtables) { + $fh->printf("<%s", $_->type); + $fh->printf(" vertical=\"1\"") if $_->{'vertical'}; + $fh->printf(" crossStream=\"1\"") if $_->{'crossStream'}; + $fh->printf(" variation=\"1\"") if $_->{'variation'}; + $fh->printf(" tupleIndex=\"%s\"", $_->{'tupleIndex'}) if exists $_->{'tupleIndex'}; + $fh->printf(">\n"); + + $_->dumpXML($fh); + + $fh->printf("\n", $_->type); + } + + $fh->printf("\n"); +} + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Jonathan Kew L. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/AATutils.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/AATutils.pm new file mode 100644 index 0000000..96ceb7e --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/AATutils.pm @@ -0,0 +1,689 @@ +package Font::TTF::AATutils; + +use strict; +use vars qw(@ISA @EXPORT); +require Exporter; + +use Font::TTF::Utils; +use IO::File; + +@ISA = qw(Exporter); +@EXPORT = qw( + AAT_read_lookup + AAT_pack_lookup + AAT_write_lookup + AAT_pack_classes + AAT_write_classes + AAT_pack_states + AAT_write_states + AAT_read_state_table + AAT_read_subtable + xmldump +); + +sub xmldump +{ + my ($var, $links, $depth, $processedVars, $type) = @_; + + $processedVars = {} unless (defined $processedVars); + print("\n") if $depth == 0; # not necessarily true encoding for all text! + + my $indent = "\t" x $depth; + + my ($objType, $addr) = ($var =~ m/^.+=(.+)\((.+)\)$/); + unless (defined $type) { + if (defined $addr) { + if (defined $processedVars->{$addr}) { + if ($links) { + printf("%s%s\n", $indent, "$objType"); + } + else { + printf("%s%s\n", $indent, "$objType"); + } + return; + } + $processedVars->{$addr} = 1; + } + } + + $type = ref $var unless defined $type; + + if ($type eq 'REF') { + printf("%s\n", $indent, $$var); + } + elsif ($type eq 'SCALAR') { + printf("%s%s\n", $indent, $var); + } + elsif ($type eq 'ARRAY') { + # printf("%s\n", $indent); + foreach (0 .. $#$var) { + if (ref($var->[$_])) { + printf("%s\n", $indent, $_); + xmldump($var->[$_], $links, $depth + 1, $processedVars); + printf("%s\n", $indent); + } + else { + printf("%s%s\n", $indent, $_, $var->[$_]); + } + } + # printf("%s\n", $indent); + } + elsif ($type eq 'HASH') { + # printf("%s\n", $indent); + foreach (sort keys %$var) { + if (ref($var->{$_})) { + printf("%s\n", $indent, $_); + xmldump($var->{$_}, $links, $depth + 1, $processedVars); + printf("%s\n", $indent); + } + else { + printf("%s%s\n", $indent, $_, $var->{$_}); + } + } + # printf("%s\n", $indent); + } + elsif ($type eq 'CODE') { + printf("%s\n", $indent, $var); + } + elsif ($type eq 'GLOB') { + printf("%s\n", $indent, $var); + } + elsif ($type eq '') { + printf("%s%s\n", $indent, $var); + } + else { + if ($links) { + printf("%s\n", $indent, $type, $addr); + } + else { + printf("%s\n", $indent, $type); + } + xmldump($var, $links, $depth + 1, $processedVars, $objType); + printf("%s\n", $indent); + } +} + +=head2 ($classes, $states) = AAT_read_subtable($fh, $baseOffset, $subtableStart, $limits) + +=cut + +sub AAT_read_subtable +{ + my ($fh, $baseOffset, $subtableStart, $limits) = @_; + + my $limit = 0xffffffff; + foreach (@$limits) { + $limit = $_ if ($_ > $subtableStart and $_ < $limit); + } + die if $limit == 0xffffffff; + + my $dat; + $fh->seek($baseOffset + $subtableStart, IO::File::SEEK_SET); + $fh->read($dat, $limit - $subtableStart); + + $dat; +} + +=head2 $length = AAT_write_state_table($fh, $classes, $states, $numExtraTables, $packEntry) + +$packEntry is a subroutine for packing an entry into binary form, called as + +$dat = $packEntry($entry, $entryTable, $numEntries) + +where the entry is a comma-separated list of nextStateOffset, flags, actions + +=cut + +sub AAT_pack_state_table +{ + my ($classes, $states, $numExtraTables, $packEntry) = @_; + + my ($dat) = pack("n*", (0) x (4 + $numExtraTables)); # placeholders for stateSize, classTable, stateArray, entryTable + + my ($firstGlyph, $lastGlyph) = (0xffff, 0, 0); + my (@classTable, $i); + foreach $i (0 .. $#$classes) { + my $class = $classes->[$i]; + foreach (@$class) { + $firstGlyph = $_ if $_ < $firstGlyph; + $lastGlyph = $_ if $_ > $lastGlyph; + $classTable[$_] = $i; + } + } + + my $classTable = length($dat); + $dat .= pack("nnC*", $firstGlyph, $lastGlyph - $firstGlyph + 1, + map { defined $classTable[$_] ? $classTable[$_] : 1 } ($firstGlyph .. $lastGlyph)); + $dat .= pack("C", 0) if (($lastGlyph - $firstGlyph) & 1) == 0; # pad if odd number of glyphs + + my $stateArray = length($dat); + my (@entries, %entries); + my $state = $states->[0]; + my $stateSize = @$state; + die "stateSize below minimum allowed (4)" if $stateSize < 4; + die "stateSize (" . $stateSize . ") too small for max class number (" . $#$classes . ")" if $stateSize < $#$classes + 1; + warn "state array has unreachable columns" if $stateSize > $#$classes + 1; + + foreach (@$states) { + die "inconsistent state size" if @$_ != $stateSize; + foreach (@$_) { + my $actions = $_->{'actions'}; + my $entry = join(",", $stateArray + $_->{'nextState'} * $stateSize, $_->{'flags'}, ref($actions) eq 'ARRAY' ? @$actions : $actions); + if (not defined $entries{$entry}) { + push @entries, $entry; + $entries{$entry} = $#entries; + die "too many different state array entries" if $#entries == 256; + } + $dat .= pack("C", $entries{$entry}); + } + } + $dat .= pack("C", 0) if (@$states & 1) != 0 and ($stateSize & 1) != 0; # pad if state array size is odd + + my $entryTable = length($dat); + $dat .= map { &$packEntry($_, $entryTable, $#entries + 1) } @entries; + + my ($dat1) = pack("nnnn", $stateSize, $classTable, $stateArray, $entryTable); + substr($dat, 0, length($dat1)) = $dat1; + + return $dat; +} + +sub AAT_write_state_table +{ + my ($fh, $classes, $states, $numExtraTables, $packEntry) = @_; + + my $stateTableStart = $fh->tell(); + + $fh->print(pack("n*", (0) x (4 + $numExtraTables))); # placeholders for stateSize, classTable, stateArray, entryTable + + my ($firstGlyph, $lastGlyph) = (0xffff, 0, 0); + my (@classTable, $i); + foreach $i (0 .. $#$classes) { + my $class = $classes->[$i]; + foreach (@$class) { + $firstGlyph = $_ if $_ < $firstGlyph; + $lastGlyph = $_ if $_ > $lastGlyph; + $classTable[$_] = $i; + } + } + + my $classTable = $fh->tell() - $stateTableStart; + $fh->print(pack("nnC*", $firstGlyph, $lastGlyph - $firstGlyph + 1, + map { defined $classTable[$_] ? $classTable[$_] : 1 } ($firstGlyph .. $lastGlyph))); + $fh->print(pack("C", 0)) if (($lastGlyph - $firstGlyph) & 1) == 0; # pad if odd number of glyphs + + my $stateArray = $fh->tell() - $stateTableStart; + my (@entries, %entries); + my $state = $states->[0]; + my $stateSize = @$state; + die "stateSize below minimum allowed (4)" if $stateSize < 4; + die "stateSize (" . $stateSize . ") too small for max class number (" . $#$classes . ")" if $stateSize < $#$classes + 1; + warn "state array has unreachable columns" if $stateSize > $#$classes + 1; + + foreach (@$states) { + die "inconsistent state size" if @$_ != $stateSize; + foreach (@$_) { + my $actions = $_->{'actions'}; + my $entry = join(",", $stateArray + $_->{'nextState'} * $stateSize, $_->{'flags'}, ref($actions) eq 'ARRAY' ? @$actions : $actions); + if (not defined $entries{$entry}) { + push @entries, $entry; + $entries{$entry} = $#entries; + die "too many different state array entries" if $#entries == 256; + } + $fh->print(pack("C", $entries{$entry})); + } + } + $fh->print(pack("C", 0)) if (@$states & 1) != 0 and ($stateSize & 1) != 0; # pad if state array size is odd + + my $entryTable = $fh->tell() - $stateTableStart; + $fh->print(map { &$packEntry($_, $entryTable, $#entries + 1) } @entries); + + my $length = $fh->tell() - $stateTableStart; + $fh->seek($stateTableStart, IO::File::SEEK_SET); + $fh->print(pack("nnnn", $stateSize, $classTable, $stateArray, $entryTable)); + + $fh->seek($stateTableStart + $length, IO::File::SEEK_SET); + $length; +} + +sub AAT_pack_classes +{ + my ($classes) = @_; + + my ($firstGlyph, $lastGlyph) = (0xffff, 0, 0); + my (@classTable, $i); + foreach $i (0 .. $#$classes) { + my $class = $classes->[$i]; + foreach (@$class) { + $firstGlyph = $_ if $_ < $firstGlyph; + $lastGlyph = $_ if $_ > $lastGlyph; + $classTable[$_] = $i; + } + } + + my ($dat) = pack("nnC*", $firstGlyph, $lastGlyph - $firstGlyph + 1, + map { defined $classTable[$_] ? $classTable[$_] : 1 } ($firstGlyph .. $lastGlyph)); + $dat .= pack("C", 0) if (($lastGlyph - $firstGlyph) & 1) == 0; # pad if odd number of glyphs + + return $dat; +} + +sub AAT_write_classes +{ + my ($fh, $classes) = @_; + + $fh->print(AAT_pack_classes($fh, $classes)); +} + +sub AAT_pack_states +{ + my ($classes, $stateArray, $states, $buildEntryProc) = @_; + + my ($entries, %entryHash); + my $state = $states->[0]; + my $stateSize = @$state; + + die "stateSize below minimum allowed (4)" if $stateSize < 4; + die "stateSize (" . $stateSize . ") too small for max class number (" . $#$classes . ")" if $stateSize < $#$classes + 1; + warn "state array has unreachable columns" if $stateSize > $#$classes + 1; + + my ($dat); + foreach (@$states) { + die "inconsistent state size" if @$_ != $stateSize; + foreach (@$_) { + my $entry = join(",", $stateArray + $_->{'nextState'} * $stateSize, &$buildEntryProc($_)); + if (not defined $entryHash{$entry}) { + push @$entries, $entry; + $entryHash{$entry} = $#$entries; + die "too many different state array entries" if $#$entries == 256; + } + $dat .= pack("C", $entryHash{$entry}); + } + } + $dat .= pack("C", 0) if (@$states & 1) != 0 and ($stateSize & 1) != 0; # pad if state array size is odd + + ($dat, $stateSize, $entries); +} + +sub AAT_write_states +{ + my ($fh, $classes, $stateArray, $states, $buildEntryProc) = @_; + + my ($entries, %entryHash); + my $state = $states->[0]; + my $stateSize = @$state; + + die "stateSize below minimum allowed (4)" if $stateSize < 4; + die "stateSize (" . $stateSize . ") too small for max class number (" . $#$classes . ")" if $stateSize < $#$classes + 1; + warn "state array has unreachable columns" if $stateSize > $#$classes + 1; + + foreach (@$states) { + die "inconsistent state size" if @$_ != $stateSize; + foreach (@$_) { + my $entry = join(",", $stateArray + $_->{'nextState'} * $stateSize, &$buildEntryProc($_)); + if (not defined $entryHash{$entry}) { + push @$entries, $entry; + $entryHash{$entry} = $#$entries; + die "too many different state array entries" if $#$entries == 256; + } + $fh->print(pack("C", $entryHash{$entry})); + } + } + $fh->print(pack("C", 0)) if (@$states & 1) != 0 and ($stateSize & 1) != 0; # pad if state array size is odd + + ($stateSize, $entries); +} + +=head2 ($classes, $states, $entries) = AAT_read_state_table($fh, $numActionWords) + +=cut + +sub AAT_read_state_table +{ + my ($fh, $numActionWords) = @_; + + my $stateTableStart = $fh->tell(); + my $dat; + $fh->read($dat, 8); + my ($stateSize, $classTable, $stateArray, $entryTable) = unpack("nnnn", $dat); + + my $classes; # array of lists of glyphs + + $fh->seek($stateTableStart + $classTable, IO::File::SEEK_SET); + $fh->read($dat, 4); + my ($firstGlyph, $nGlyphs) = unpack("nn", $dat); + $fh->read($dat, $nGlyphs); + foreach (unpack("C*", $dat)) { + if ($_ != 1) { + my $class = $classes->[$_]; + push(@$class, $firstGlyph); + $classes->[$_] = $class unless defined $classes->[$_]; + } + $firstGlyph++; + } + + $fh->seek($stateTableStart + $stateArray, IO::File::SEEK_SET); + my $states; # array of arrays of hashes{nextState, flags, actions} + + my $entrySize = 4 + ($numActionWords * 2); + my $lastState = 1; + my $entries; + while ($#$states < $lastState) { + $fh->read($dat, $stateSize); + my @stateEntries = unpack("C*", $dat); + my $state; + foreach (@stateEntries) { + if (not defined $entries->[$_]) { + my $loc = $fh->tell(); + $fh->seek($stateTableStart + $entryTable + ($_ * $entrySize), IO::File::SEEK_SET); + $fh->read($dat, $entrySize); + my ($nextState, $flags, $actions); + ($nextState, $flags, @$actions) = unpack("n*", $dat); + $nextState -= $stateArray; + $nextState /= $stateSize; + $entries->[$_] = { 'nextState' => $nextState, 'flags' => $flags }; + $entries->[$_]->{'actions'} = $actions if $numActionWords > 0; + $lastState = $nextState if ($nextState > $lastState); + $fh->seek($loc, IO::File::SEEK_SET); + } + push(@$state, $entries->[$_]); + } + push(@$states, $state); + } + + ($classes, $states, $entries); +} + +=head2 ($format, $lookup) = AAT_read_lookup($fh, $valueSize, $length, $default) + +=cut + +sub AAT_read_lookup +{ + my ($fh, $valueSize, $length, $default) = @_; + + my $lookupStart = $fh->tell(); + my ($dat, $unpackChar); + if ($valueSize == 1) { + $unpackChar = "C"; + } + elsif ($valueSize == 2) { + $unpackChar = "n"; + } + elsif ($valueSize == 4) { + $unpackChar = "N"; + } + else { + die "unsupported value size"; + } + + $fh->read($dat, 2); + my $format = unpack("n", $dat); + my $lookup; + + if ($format == 0) { + $fh->read($dat, $length - 2); + my $i = -1; + $lookup = { map { $i++; ($_ != $default) ? ($i, $_) : () } unpack($unpackChar . "*", $dat) }; + } + + elsif ($format == 2) { + $fh->read($dat, 10); + my ($unitSize, $nUnits, $searchRange, $entrySelector, $rangeShift) = unpack("nnnnn", $dat); + die if $unitSize != 4 + $valueSize; + foreach (1 .. $nUnits) { + $fh->read($dat, $unitSize); + my ($lastGlyph, $firstGlyph, $value) = unpack("nn" . $unpackChar, $dat); + if ($firstGlyph != 0xffff and $value != $default) { + foreach ($firstGlyph .. $lastGlyph) { + $lookup->{$_} = $value; + } + } + } + } + + elsif ($format == 4) { + $fh->read($dat, 10); + my ($unitSize, $nUnits, $searchRange, $entrySelector, $rangeShift) = unpack("nnnnn", $dat); + die if $unitSize != 6; + foreach (1 .. $nUnits) { + $fh->read($dat, $unitSize); + my ($lastGlyph, $firstGlyph, $offset) = unpack("nnn", $dat); + if ($firstGlyph != 0xffff) { + my $loc = $fh->tell(); + $fh->seek($lookupStart + $offset, IO::File::SEEK_SET); + $fh->read($dat, ($lastGlyph - $firstGlyph + 1) * $valueSize); + my @values = unpack($unpackChar . "*", $dat); + foreach (0 .. $lastGlyph - $firstGlyph) { + $lookup->{$firstGlyph + $_} = $values[$_] if $values[$_] != $default; + } + $fh->seek($loc, IO::File::SEEK_SET); + } + } + } + + elsif ($format == 6) { + $fh->read($dat, 10); + my ($unitSize, $nUnits, $searchRange, $entrySelector, $rangeShift) = unpack("nnnnn", $dat); + die if $unitSize != 2 + $valueSize; + foreach (1 .. $nUnits) { + $fh->read($dat, $unitSize); + my ($glyph, $value) = unpack("n" . $unpackChar, $dat); + $lookup->{$glyph} = $value if $glyph != 0xffff and $value != $default; + } + } + + elsif ($format == 8) { + $fh->read($dat, 4); + my ($firstGlyph, $glyphCount) = unpack("nn", $dat); + $fh->read($dat, $glyphCount * $valueSize); + $firstGlyph--; + $lookup = { map { $firstGlyph++; $_ != $default ? ($firstGlyph, $_) : () } unpack($unpackChar . "*", $dat) }; + } + + else { + die "unknown lookup format"; + } + + $fh->seek($lookupStart + $length, IO::File::SEEK_SET); + + ($format, $lookup); +} + +=head2 AAT_write_lookup($fh, $format, $lookup, $valueSize, $default) + +=cut + +sub AAT_pack_lookup +{ + my ($format, $lookup, $valueSize, $default) = @_; + + my $packChar; + if ($valueSize == 1) { + $packChar = "C"; + } + elsif ($valueSize == 2) { + $packChar = "n"; + } + elsif ($valueSize == 4) { + $packChar = "N"; + } + else { + die "unsupported value size"; + } + + my ($dat) = pack("n", $format); + + my ($firstGlyph, $lastGlyph) = (0xffff, 0); + foreach (keys %$lookup) { + $firstGlyph = $_ if $_ < $firstGlyph; + $lastGlyph = $_ if $_ > $lastGlyph; + } + my $glyphCount = $lastGlyph - $firstGlyph + 1; + + if ($format == 0) { + $dat .= pack($packChar . "*", map { defined $lookup->{$_} ? $lookup->{$_} : defined $default ? $default : $_ } (0 .. $lastGlyph)); + } + + elsif ($format == 2) { + my $prev = $default; + my $segStart = $firstGlyph; + my $dat1; + foreach ($firstGlyph .. $lastGlyph + 1) { + my $val = $lookup->{$_}; + $val = $default unless defined $val; + if ($val != $prev) { + $dat1 .= pack("nn" . $packChar, $_ - 1, $segStart, $prev) if $prev != $default; + $prev = $val; + $segStart = $_; + } + } + $dat1 .= pack("nn" . $packChar, 0xffff, 0xffff, 0); + my $unitSize = 4 + $valueSize; + $dat .= pack("nnnnn", $unitSize, TTF_bininfo(length($dat1) / $unitSize, $unitSize)); + $dat .= $dat1; + } + + elsif ($format == 4) { + my $segArray = new Font::TTF::Segarr($valueSize); + $segArray->add_segment($firstGlyph, 1, map { $lookup->{$_} } ($firstGlyph .. $lastGlyph)); + my ($start, $end, $offset); + $offset = 12 + @$segArray * 6 + 6; # 12 is size of format word + binSearchHeader; 6 bytes per segment; 6 for terminating segment + my $dat1; + foreach (@$segArray) { + $start = $_->{'START'}; + $end = $start + $_->{'LEN'} - 1; + $dat1 .= pack("nnn", $end, $start, $offset); + $offset += $_->{'LEN'} * 2; + } + $dat1 .= pack("nnn", 0xffff, 0xffff, 0); + $dat .= pack("nnnnn", 6, TTF_bininfo(length($dat1) / 6, 6)); + $dat .= $dat1; + foreach (@$segArray) { + $dat1 = $_->{'VAL'}; + $dat .= pack($packChar . "*", @$dat1); + } + } + + elsif ($format == 6) { + die "unsupported" if $valueSize != 2; + my $dat1 = pack("n*", map { $_, $lookup->{$_} } sort { $a <=> $b } grep { $lookup->{$_} ne $default } keys %$lookup); + my $unitSize = 2 + $valueSize; + $dat .= pack("nnnnn", $unitSize, TTF_bininfo(length($dat1) / $unitSize, $unitSize)); + $dat .= $dat1; + } + + elsif ($format == 8) { + $dat .= pack("nn", $firstGlyph, $lastGlyph - $firstGlyph + 1); + $dat .= pack($packChar . "*", map { defined $lookup->{$_} ? $lookup->{$_} : defined $default ? $default : $_ } ($firstGlyph .. $lastGlyph)); + } + + else { + die "unknown lookup format"; + } + + my $padBytes = (4 - (length($dat) & 3)) & 3; + $dat .= pack("C*", (0) x $padBytes); + + return $dat; +} + +sub AAT_write_lookup +{ + my ($fh, $format, $lookup, $valueSize, $default) = @_; + + my $lookupStart = $fh->tell(); + my $packChar; + if ($valueSize == 1) { + $packChar = "C"; + } + elsif ($valueSize == 2) { + $packChar = "n"; + } + elsif ($valueSize == 4) { + $packChar = "N"; + } + else { + die "unsupported value size"; + } + + $fh->print(pack("n", $format)); + + my ($firstGlyph, $lastGlyph) = (0xffff, 0); + foreach (keys %$lookup) { + $firstGlyph = $_ if $_ < $firstGlyph; + $lastGlyph = $_ if $_ > $lastGlyph; + } + my $glyphCount = $lastGlyph - $firstGlyph + 1; + + if ($format == 0) { + $fh->print(pack($packChar . "*", map { defined $lookup->{$_} ? $lookup->{$_} : defined $default ? $default : $_ } (0 .. $lastGlyph))); + } + + elsif ($format == 2) { + my $prev = $default; + my $segStart = $firstGlyph; + my $dat; + foreach ($firstGlyph .. $lastGlyph + 1) { + my $val = $lookup->{$_}; + $val = $default unless defined $val; + if ($val != $prev) { + $dat .= pack("nn" . $packChar, $_ - 1, $segStart, $prev) if $prev != $default; + $prev = $val; + $segStart = $_; + } + } + $dat .= pack("nn" . $packChar, 0xffff, 0xffff, 0); + my $unitSize = 4 + $valueSize; + $fh->print(pack("nnnnn", $unitSize, TTF_bininfo(length($dat) / $unitSize, $unitSize))); + $fh->print($dat); + } + + elsif ($format == 4) { + my $segArray = new Font::TTF::Segarr($valueSize); + $segArray->add_segment($firstGlyph, 1, map { $lookup->{$_} } ($firstGlyph .. $lastGlyph)); + my ($start, $end, $offset); + $offset = 12 + @$segArray * 6 + 6; # 12 is size of format word + binSearchHeader; 6 bytes per segment; 6 for terminating segment + my $dat; + foreach (@$segArray) { + $start = $_->{'START'}; + $end = $start + $_->{'LEN'} - 1; + $dat .= pack("nnn", $end, $start, $offset); + $offset += $_->{'LEN'} * 2; + } + $dat .= pack("nnn", 0xffff, 0xffff, 0); + $fh->print(pack("nnnnn", 6, TTF_bininfo(length($dat) / 6, 6))); + $fh->print($dat); + foreach (@$segArray) { + $dat = $_->{'VAL'}; + $fh->print(pack($packChar . "*", @$dat)); + } + } + + elsif ($format == 6) { + die "unsupported" if $valueSize != 2; + my $dat = pack("n*", map { $_, $lookup->{$_} } sort { $a <=> $b } grep { $lookup->{$_} ne $default } keys %$lookup); + my $unitSize = 2 + $valueSize; + $fh->print(pack("nnnnn", $unitSize, TTF_bininfo(length($dat) / $unitSize, $unitSize))); + $fh->print($dat); + } + + elsif ($format == 8) { + $fh->print(pack("nn", $firstGlyph, $lastGlyph - $firstGlyph + 1)); + $fh->print(pack($packChar . "*", map { defined $lookup->{$_} ? $lookup->{$_} : defined $default ? $default : $_ } ($firstGlyph .. $lastGlyph))); + } + + else { + die "unknown lookup format"; + } + + my $length = $fh->tell() - $lookupStart; + my $padBytes = (4 - ($length & 3)) & 3; + $fh->print(pack("C*", (0) x $padBytes)); + $length += $padBytes; + + $length; +} + +1; + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Anchor.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Anchor.pm new file mode 100644 index 0000000..b901e83 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Anchor.pm @@ -0,0 +1,216 @@ +package Font::TTF::Anchor; + +=head1 NAME + +Font::TTF::Anchor - Anchor points for GPOS tables + +=head1 DESCRIPTION + +The Anchor defines an anchor point on a glyph providing various information +depending on how much is available, including such information as the co-ordinates, +a curve point and even device specific modifiers. + +=head1 INSTANCE VARIABLES + +=over 4 + +=item x + +XCoordinate of the anchor point + +=item y + +YCoordinate of the anchor point + +=item p + +Curve point on the glyph to use as the anchor point + +=item xdev + +Device table (delta) for the xcoordinate + +=item ydev + +Device table (delta) for the ycoordinate + +=item xid + +XIdAnchor for multiple master horizontal metric id + +=item yid + +YIdAnchor for multiple master vertical metric id + +=back + +=head1 METHODS + +=cut + +use strict; +use Font::TTF::Utils; + + +=head2 new + +Creates a new Anchor + +=cut + +sub new +{ + my ($class) = shift; + my ($self) = {@_}; + + bless $self, $class; +} + + +=head2 read($fh) + +Reads the anchor from the given file handle at that point. The file handle is left +at an arbitrary read point, usually the end of something! + +=cut + +sub read +{ + my ($self, $fh) = @_; + my ($dat, $loc, $fmt, $p, $xoff, $yoff); + + $fh->read($dat, 6); + $fmt = unpack('n', $dat); + if ($fmt == 4) + { ($self->{'xid'}, $self->{'yid'}) = TTF_Unpack('S2', substr($dat,2)); } + else + { ($self->{'x'}, $self->{'y'}) = TTF_Unpack('s2', substr($dat,2)); } + + if ($fmt == 2) + { + $fh->read($dat, 2); + $self->{'p'} = unpack('n', $dat); + } elsif ($fmt == 3) + { + $fh->read($dat, 4); + ($xoff, $yoff) = unpack('n2', $dat); + $loc = $fh->tell() - 10; + if ($xoff) + { + $fh->seek($loc + $xoff, 0); + $self->{'xdev'} = Font::TTF::Delta->new->read($fh); + } + if ($yoff) + { + $fh->seek($loc + $yoff, 0); + $self->{'ydev'} = Font::TTF::Delta->new->read($fh); + } + } + $self; +} + + +=head2 out($fh, $style) + +Outputs the Anchor to the given file handle at this point also addressing issues +of deltas. If $style is set, then no output is sent to the file handle. The return +value is the output string. + +=cut + +sub out +{ + my ($self, $fh, $style) = @_; + my ($xoff, $yoff, $fmt, $out); + + if (defined $self->{'xid'} || defined $self->{'yid'}) + { $out = TTF_Pack('SSS', 4, $self->{'xid'}, $self->{'yid'}); } + elsif (defined $self->{'p'}) + { $out = TTF_Pack('Ssss', 2, @{$self}{'x', 'y', 'p'}); } + elsif (defined $self->{'xdev'} || defined $self->{'ydev'}) + { + $out = TTF_Pack('Sss', 3, @{$self}{'x', 'y'}); + if (defined $self->{'xdev'}) + { + $out .= pack('n2', 10, 0); + $out .= $self->{'xdev'}->out($fh, 1); + $yoff = length($out) - 10; + } + else + { $out .= pack('n2', 0, 0); } + if (defined $self->{'ydev'}) + { + $yoff = 10 unless $yoff; + substr($out, 8, 2) = pack('n', $yoff); + $out .= $self->{'ydev'}->out($fh, 1); + } + } else + { $out = TTF_Pack('Sss', 1, @{$self}{'x', 'y'}); } + $fh->print($out) unless $style; + $out; +} + + +sub signature +{ + my ($self) = @_; + return join (",", map {"${_}=$self->{$_}"} qw(x y p xdev ydev xid yid)); +} + + +=head2 $a->out_xml($context) + +Outputs the anchor in XML + +=cut + +sub out_xml +{ + my ($self, $context, $depth) = @_; + my ($fh) = $context->{'fh'}; + my ($end); + + $fh->print("$depthprint(" p='$self->{'p'}'") if defined ($self->{'p'}); + $end = (defined $self->{'xdev'} || defined $self->{'ydev'} || defined $self->{'xid'} || defined $self->{'yid'}); + unless ($end) + { + $fh->print("/>\n"); + return $self; + } + + if (defined $self->{'xdev'}) + { + $fh->print("$depth$context->{'indent'}\n"); + $self->{'xdev'}->out_xml($context, $depth . ($context->{'indent'} x 2)); + $fh->print("$depth$context->{'indent'}\n"); + } + + if (defined $self->{'ydev'}) + { + $fh->print("$depth$context->{'indent'}\n"); + $self->{'ydev'}->out_xml($context, $depth . ($context->{'indent'} x 2)); + $fh->print("$depth$context->{'indent'}\n"); + } + + if (defined $self->{'xid'} || defined $self->{'yid'}) + { + $fh->print("$depth$context->{'indent'}print(" xid='$self->{'xid'}'") if defined ($self->{'xid'}); + $fh->print(" yid='$self->{'yid'}'") if defined ($self->{'yid'}); + $fh->print("/>\n"); + } + $fh->print("$depth\n"); + $self; +} + + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + +1; + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Bsln.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Bsln.pm new file mode 100644 index 0000000..281a512 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Bsln.pm @@ -0,0 +1,163 @@ +package Font::TTF::Bsln; + +=head1 NAME + +Font::TTF::Bsln - Baseline table in a font + +=head1 DESCRIPTION + +=head1 INSTANCE VARIABLES + +=item version + +=item xformat + +=item defaultBaseline + +=item deltas + +=item stdGlyph + +=item ctlPoints + +=item lookupFormat + +=item lookup + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA); + +use Font::TTF::AATutils; +use Font::TTF::Utils; +require Font::TTF::Table; + +@ISA = qw(Font::TTF::Table); + +=head2 $t->read + +Reads the table into memory + +=cut + +sub read +{ + my ($self) = @_; + my ($dat, $fh); + + $self->SUPER::read or return $self; + + $fh = $self->{' INFILE'}; + $fh->read($dat, 8); + my ($version, $format, $defaultBaseline) = TTF_Unpack("vSS", $dat); + + if ($format == 0 or $format == 1) { + $fh->read($dat, 64); + $self->{'deltas'} = [TTF_Unpack("s*", $dat)]; + } + elsif ($format == 2 or $format == 3) { + $fh->read($dat, 2); + $self->{'stdGlyph'} = unpack("n", $dat); + $fh->read($dat, 64); + $self->{'ctlPoints'} = unpack("n*", $dat); + } + else { + die "unknown table format"; + } + + if ($format == 1 or $format == 3) { + my $len = $self->{' LENGTH'} - ($fh->tell() - $self->{' OFFSET'}); + my ($lookupFormat, $lookup) = AAT_read_lookup($fh, 2, $len, $defaultBaseline); + $self->{'lookupFormat'} = $lookupFormat; + $self->{'lookup'} = $lookup; + } + + $self->{'version'} = $version; + $self->{'format'} = $format; + $self->{'defaultBaseline'} = $defaultBaseline; + + $self; +} + +=head2 $t->out($fh) + +Writes the table to a file either from memory or by copying + +=cut + +sub out +{ + my ($self, $fh) = @_; + + return $self->SUPER::out($fh) unless $self->{' read'}; + + my $format = $self->{'format'}; + my $defaultBaseline = $self->{'defaultBaseline'}; + $fh->print(TTF_Pack("vSS", $self->{'version'}, $format, $defaultBaseline)); + + AAT_write_lookup($fh, $self->{'lookupFormat'}, $self->{'lookup'}, 2, $defaultBaseline) if ($format == 1 or $format == 3); +} + +=head2 $t->print($fh) + +Prints a human-readable representation of the table + +=cut + +sub print +{ + my ($self, $fh) = @_; + + $self->read; + + $fh = 'STDOUT' unless defined $fh; + + my $format = $self->{'format'}; + $fh->printf("version %f\nformat %d\ndefaultBaseline %d\n", $self->{'version'}, $format, $self->{'defaultBaseline'}); + if ($format == 0 or $format == 1) { + $fh->printf("\tdeltas:\n"); + my $deltas = $self->{'deltas'}; + foreach (0 .. 31) { + $fh->printf("\t\t%d: %d%s\n", $_, $deltas->[$_], defined baselineName_($_) ? "\t# " . baselineName_($_) : ""); + } + } + if ($format == 2 or $format == 3) { + $fh->printf("\tstdGlyph = %d\n", $self->{'stdGlyph'}); + my $ctlPoints = $self->{'ctlPoints'}; + foreach (0 .. 31) { + $fh->printf("\t\t%d: %d%s\n", $_, $ctlPoints->[$_], defined baselineName_($_) ? "\t# " . baselineName_($_) : ""); + } + } + if ($format == 1 or $format == 3) { + $fh->printf("lookupFormat %d\n", $self->{'lookupFormat'}); + my $lookup = $self->{'lookup'}; + foreach (sort { $a <=> $b } keys %$lookup) { + $fh->printf("\tglyph %d: %d%s\n", $_, $lookup->{$_}, defined baselineName_($_) ? "\t# " . baselineName_($_) : ""); + } + } +} + +sub baselineName_ +{ + my ($b) = @_; + my @baselines = ( 'Roman', 'Ideographic centered', 'Ideographic low', 'Hanging', 'Math' ); + $baselines[$b]; +} + +1; + + +=head1 BUGS + +None known + +=head1 AUTHOR + +Jonathan Kew L. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Changes b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Changes new file mode 100644 index 0000000..2382b82 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Changes @@ -0,0 +1,108 @@ +Note. The version number implies a release point. Thus changes that go into a +version occur above the version number, not after it. + +* 0.05 +** cmap + debug reverse() + provide scripts as .pl instead of .bat to placate Unix world + rename makefile.pl to Makefile.PL to keep Unix happy + Add ttfremap script + +* 0.06 .. 0.08 + Fixes to get this stuff working in Unix + +* 0.09 + Never released + +* 0.10 +** cmap + Make reverse return the lowest codepoint that matches rather than + the highest +** font + Use IO::File everywhere to allow passing in of psuedo-file objects + rather than file names +** Utils + Debug FDot2.14 conversion + +* 0.11 +** cmap + Don't store empty entries in the cmap + +* 0.12 +Various changes to reduce warnings + +** glyph + Add update_bbox + Do full glyph writes if loca read rather than glyf read + Get glyph update working usefully. Clarify glyf->read + +* 0.13 + +** glyph + Debug update_bbox for compound glyphs + Add empty() to clear to unread state (allows apps to save memory) + +** OS/2 + update update() to account for new cmap structure + +** Post + Correct mu to pi in Postscript name list. The list now follows the + MS convention for good or ill. + +** Table + Add empty() to clear a table to its unread state + +** Scripts +*** psfix + Added. Creates Post table based on cmap information + +*** eurofix + Added bullet hacking and generally backwards, forwards, all + ways mapping. + +*** ttfenc + Now supports the difference between MS post name list and TeXs + +* 0.14 + + Sort out mix up over CVS mess + +* 0.15 + +** Table + read_dat no longer marks table as read + +** Cvt_ + Mark table as read when read + +** Fpgm + Mark table as read when read + +** Prep + Mark table as read when read + +** Font + Add support for Mac sfnt version code ('true') + Be stricter on out @fontlist, only output tables that exist + +* 0.16 + +** Install + add pmake support + +** glyph + tidy up pod + +** kern + tidy up pod + +** name + add utf8 support + +* 0.17 + +** Utils + Debug TTF_bininfo >>= seems to have stopped working! + +* 0.18 + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Cmap.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Cmap.pm new file mode 100644 index 0000000..bb3d63c --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Cmap.pm @@ -0,0 +1,612 @@ +package Font::TTF::Cmap; + +=head1 NAME + +Font::TTF::Cmap - Character map table + +=head1 DESCRIPTION + +Looks after the character map. For ease of use, the actual cmap is held in +a hash against codepoint. Thus for a given table: + + $gid = $font->{'cmap'}{'Tables'}[0]{'val'}{$code}; + +Note that C<$code> should be a true value (0x1234) rather than a string representation. + +=head1 INSTANCE VARIABLES + +The instance variables listed here are not preceeded by a space due to their +emulating structural information in the font. + +=over 4 + +=item Num + +Number of subtables in this table + +=item Tables + +An array of subtables ([0..Num-1]) + +=back + +Each subtables also has its own instance variables which are, again, not +preceeded by a space. + +=over 4 + +=item Platform + +The platform number for this subtable + +=item Encoding + +The encoding number for this subtable + +=item Format + +Gives the stored format of this subtable + +=item Ver + +Gives the version (or language) information for this subtable + +=item val + +A hash keyed by the codepoint value (not a string) storing the glyph id + +=back + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA); +use Font::TTF::Table; +use Font::TTF::Utils; + +@ISA = qw(Font::TTF::Table); + + +=head2 $t->read + +Reads the cmap into memory. Format 4 subtables read the whole subtable and +fill in the segmented array accordingly. + +=cut + +sub read +{ + my ($self) = @_; + my ($dat, $i, $j, $k, $id, @ids, $s); + my ($start, $end, $range, $delta, $form, $len, $num, $ver, $sg); + my ($fh) = $self->{' INFILE'}; + + $self->SUPER::read or return $self; + $fh->read($dat, 4); + $self->{'Num'} = unpack("x2n", $dat); + $self->{'Tables'} = []; + for ($i = 0; $i < $self->{'Num'}; $i++) + { + $s = {}; + $fh->read($dat, 8); + ($s->{'Platform'}, $s->{'Encoding'}, $s->{'LOC'}) = (unpack("nnN", $dat)); + $s->{'LOC'} += $self->{' OFFSET'}; + push(@{$self->{'Tables'}}, $s); + } + for ($i = 0; $i < $self->{'Num'}; $i++) + { + $s = $self->{'Tables'}[$i]; + $fh->seek($s->{'LOC'}, 0); + $fh->read($dat, 2); + $form = unpack("n", $dat); + + $s->{'Format'} = $form; + if ($form == 0) + { + my $j = 0; + + $fh->read($dat, 4); + ($len, $s->{'Ver'}) = unpack('n2', $dat); + $fh->read($dat, 256); + $s->{'val'} = {map {$j++; ($_ ? ($j - 1, $_) : ())} unpack("C*", $dat)}; + } elsif ($form == 6) + { + my ($start, $ecount); + + $fh->read($dat, 8); + ($len, $s->{'Ver'}, $start, $ecount) = unpack('n4', $dat); + $fh->read($dat, $ecount << 1); + $s->{'val'} = {map {$start++; ($_ ? ($start - 1, $_) : ())} unpack("n*", $dat)}; + } elsif ($form == 2) # Contributed by Huw Rogers + { + $fh->read($dat, 4); + ($len, $s->{'Ver'}) = unpack('n2', $dat); + $fh->read($dat, 512); + my ($j, $k, $l, $m, $n, @subHeaderKeys, @subHeaders, $subHeader); + $n = 1; + for ($j = 0; $j < 256; $j++) { + my $k = unpack('@'.($j<<1).'n', $dat)>>3; + $n = $k + 1 if $k >= $n; + $subHeaders[$subHeaderKeys[$j] = $k] ||= [ ]; + } + $fh->read($dat, $n<<3); # read subHeaders[] + for ($k = 0; $k < $n; $k++) { + $subHeader = $subHeaders[$k]; + $l = $k<<3; + @$subHeader = unpack('@'.$l.'n4', $dat); + $subHeader->[2] = unpack('s', pack('S', $subHeader->[2])) + if $subHeader->[2] & 0x8000; # idDelta + $subHeader->[3] = + ($subHeader->[3] - (($n - $k)<<3) + 6)>>1; # idRangeOffset + } + $fh->read($dat, $len - ($n<<3) - 518); # glyphIndexArray[] + for ($j = 0; $j < 256; $j++) { + $k = $subHeaderKeys[$j]; + $subHeader = $subHeaders[$k]; + unless ($k) { + $l = $j - $subHeader->[0]; + if ($l >= 0 && $l < $subHeader->[1]) { + $m = unpack('@'.(($l + $subHeader->[3])<<1).'n', $dat); + $m += $subHeader->[2] if $m; + $s->{'val'}{$j} = $m; + } + } else { + for ($l = 0; $l < $subHeader->[1]; $l++) { + $m = unpack('@'.(($l + $subHeader->[3])<<1).'n', $dat); + $m += $subHeader->[2] if $m; + $s->{'val'}{($j<<8) + $l + $subHeader->[0]} = $m; + } + } + } + } elsif ($form == 4) + { + $fh->read($dat, 12); + ($len, $s->{'Ver'}, $num) = unpack('n3', $dat); + $num >>= 1; + $fh->read($dat, $len - 14); + for ($j = 0; $j < $num; $j++) + { + $end = unpack("n", substr($dat, $j << 1, 2)); + $start = unpack("n", substr($dat, ($j << 1) + ($num << 1) + 2, 2)); + $delta = unpack("n", substr($dat, ($j << 1) + ($num << 2) + 2, 2)); + $delta -= 65536 if $delta > 32767; + $range = unpack("n", substr($dat, ($j << 1) + $num * 6 + 2, 2)); + for ($k = $start; $k <= $end; $k++) + { + if ($range == 0 || $range == 65535) # support the buggy FOG with its range=65535 for final segment + { $id = $k + $delta; } + else + { $id = unpack("n", substr($dat, ($j << 1) + $num * 6 + + 2 + ($k - $start) * 2 + $range, 2)) + $delta; } + $id -= 65536 if $id >= 65536; + $s->{'val'}{$k} = $id if ($id); + } + } + } elsif ($form == 8 || $form == 12) + { + $fh->read($dat, 10); + ($len, $s->{'Ver'}) = unpack('x2N2', $dat); + if ($form == 8) + { + $fh->read($dat, 8196); + $num = unpack("N", substr($dat, 8192, 4)); # don't need the map + } else + { + $fh->read($dat, 4); + $num = unpack("N", $dat); + } + $fh->read($dat, 12 * $num); + for ($j = 0; $j < $num; $j++) + { + ($start, $end, $sg) = unpack("N3", substr($dat, $j * 12, 12)); + for ($k = $start; $k <= $end; $k++) + { $s->{'val'}{$k} = $sg++; } + } + } elsif ($form == 10) + { + $fh->read($dat, 18); + ($len, $s->{'Ver'}, $start, $num) = unpack('x2N4', $dat); + $fh->read($dat, $num << 1); + for ($j = 0; $j < $num; $j++) + { $s->{'val'}{$start + $j} = unpack("n", substr($dat, $j << 1, 2)); } + } + } + $self; +} + + +=head2 $t->ms_lookup($uni) + +Finds a Unicode table, giving preference to the MS one, and looks up the given +Unicode codepoint in it to find the glyph id. + +=cut + +sub ms_lookup +{ + my ($self, $uni) = @_; + + $self->find_ms || return undef unless (defined $self->{' mstable'}); + return $self->{' mstable'}{'val'}{$uni}; +} + + +=head2 $t->find_ms + +Finds the a Unicode table, giving preference to the Microsoft one, and sets the C instance variable +to it if found. Returns the table it finds. + +=cut +sub find_ms +{ + my ($self) = @_; + my ($i, $s, $alt, $found); + + return $self->{' mstable'} if defined $self->{' mstable'}; + $self->read; + for ($i = 0; $i < $self->{'Num'}; $i++) + { + $s = $self->{'Tables'}[$i]; + if ($s->{'Platform'} == 3) + { + $self->{' mstable'} = $s; + last if ($s->{'Encoding'} == 10); + $found = 1 if ($s->{'Encoding'} == 1); + } elsif ($s->{'Platform'} == 0 || ($s->{'Platform'} == 2 && $s->{'Encoding'} == 1)) + { $alt = $s; } + } + $self->{' mstable'} = $alt if ($alt && !$found); + $self->{' mstable'}; +} + + +=head2 $t->ms_enc + +Returns the encoding of the microsoft table (0 => symbol, etc.). Returns undef if there is +no Microsoft cmap. + +=cut + +sub ms_enc +{ + my ($self) = @_; + my ($s); + + return $self->{' mstable'}{'Encoding'} + if (defined $self->{' mstable'} && $self->{' mstable'}{'Platform'} == 3); + + foreach $s (@{$self->{'Tables'}}) + { + return $s->{'Encoding'} if ($s->{'Platform'} == 3); + } + return undef; +} + + +=head2 $t->out($fh) + +Writes out a cmap table to a filehandle. If it has not been read, then +just copies from input file to output + +=cut + +sub out +{ + my ($self, $fh) = @_; + my ($loc, $s, $i, $base_loc, $j, @keys); + + return $self->SUPER::out($fh) unless $self->{' read'}; + + + $self->{'Tables'} = [sort {$a->{'Platform'} <=> $b->{'Platform'} + || $a->{'Encoding'} <=> $b->{'Encoding'} + || $a->{'Ver'} <=> $b->{'Ver'}} @{$self->{'Tables'}}]; + $self->{'Num'} = scalar @{$self->{'Tables'}}; + + $base_loc = $fh->tell(); + $fh->print(pack("n2", 0, $self->{'Num'})); + + for ($i = 0; $i < $self->{'Num'}; $i++) + { $fh->print(pack("nnN", $self->{'Tables'}[$i]{'Platform'}, $self->{'Tables'}[$i]{'Encoding'}, 0)); } + + for ($i = 0; $i < $self->{'Num'}; $i++) + { + $s = $self->{'Tables'}[$i]; + if ($s->{'Format'} < 8) + { @keys = sort {$a <=> $b} grep { $_ <= 0xFFFF} keys %{$s->{'val'}}; } + else + { @keys = sort {$a <=> $b} keys %{$s->{'val'}}; } + $s->{' outloc'} = $fh->tell(); + if ($s->{'Format'} < 8) + { $fh->print(pack("n3", $s->{'Format'}, 0, $s->{'Ver'})); } # come back for length + else + { $fh->print(pack("n2N2", $s->{'Format'}, 0, 0, $s->{'Ver'})); } + + if ($s->{'Format'} == 0) + { + $fh->print(pack("C256", @{$s->{'val'}}{0 .. 255})); + } elsif ($s->{'Format'} == 6) + { + $fh->print(pack("n2", $keys[0], $keys[-1] - $keys[0] + 1)); + $fh->print(pack("n*", @{$s->{'val'}}{$keys[0] .. $keys[-1]})); + } elsif ($s->{'Format'} == 2) # Contributed by Huw Rogers + { + my ($g, $k, $h, $l, $m, $n); + my (@subHeaderKeys, @subHeaders, $subHeader, @glyphIndexArray); + $n = 0; + @subHeaderKeys = (-1) x 256; + for $j (@keys) { + next unless defined($g = $s->{'val'}{$j}); + $h = int($j>>8); + $l = ($j & 0xff); + if (($k = $subHeaderKeys[$h]) < 0) { + $subHeader = [ $l, 1, 0, 0, [ $g ] ]; + $subHeaders[$k = $n++] = $subHeader; + $subHeaderKeys[$h] = $k; + } else { + $subHeader = $subHeaders[$k]; + $m = ($l - $subHeader->[0] + 1) - $subHeader->[1]; + $subHeader->[1] += $m; + push @{$subHeader->[4]}, (0) x ($m - 1), $g - $subHeader->[2]; + } + } + @subHeaderKeys = map { $_ < 0 ? 0 : $_ } @subHeaderKeys; + $subHeader = $subHeaders[0]; + $subHeader->[3] = 0; + push @glyphIndexArray, @{$subHeader->[4]}; + splice(@$subHeader, 4); + { + my @subHeaders_ = sort {@{$a->[4]} <=> @{$b->[4]}} @subHeaders[1..$#subHeaders]; + my ($f, $d, $r, $subHeader_); + for ($k = 0; $k < @subHeaders_; $k++) { + $subHeader = $subHeaders_[$k]; + $f = $r = shift @{$subHeader->[4]}; + $subHeader->[5] = join(':', + map { + $d = $_ - $r; + $r = $_; + $d < 0 ? + sprintf('-%04x', -$d) : + sprintf('+%04x', $d) + } @{$subHeader->[4]}); + unshift @{$subHeader->[4]}, $f; + } + for ($k = 0; $k < @subHeaders_; $k++) { + $subHeader = $subHeaders_[$k]; + next unless $subHeader->[4]; + $subHeader->[3] = @glyphIndexArray; + push @glyphIndexArray, @{$subHeader->[4]}; + for ($l = $k + 1; $l < @subHeaders_; $l++) { + $subHeader_ = $subHeaders_[$l]; + next unless $subHeader_->[4]; + $d = $subHeader_->[5]; + if ($subHeader->[5] =~ /\Q$d\E/) { + my $o = length($`)/6; #` + $subHeader_->[2] += + $subHeader_->[4]->[$o] - $subHeader->[4]->[0]; + $subHeader_->[3] = $subHeader->[3] + $o; + splice(@$subHeader_, 4); + } + } + splice(@$subHeader, 4); + } + } + $fh->print(pack('n*', map { $_<<3 } @subHeaderKeys)); + for ($j = 0; $j < 256; $j++) { + $k = $subHeaderKeys[$j]; + $subHeader = $subHeaders[$k]; + } + for ($k = 0; $k < $n; $k++) { + $subHeader = $subHeaders[$k]; + $fh->print(pack('n4', + $subHeader->[0], + $subHeader->[1], + $subHeader->[2] < 0 ? + unpack('S', pack('s', $subHeader->[2])) : + $subHeader->[2], + ($subHeader->[3]<<1) + (($n - $k)<<3) - 6 + )); + } + $fh->print(pack('n*', @glyphIndexArray)); + } elsif ($s->{'Format'} == 4) + { + my ($num, $sRange, $eSel, $eShift, @starts, @ends, $doff); + my (@deltas, $delta, @range, $flat, $k, $segs, $count, $newseg, $v); + + push(@keys, 0xFFFF) unless ($keys[-1] == 0xFFFF); + $newseg = 1; $num = 0; + for ($j = 0; $j <= $#keys && $keys[$j] <= 0xFFFF; $j++) + { + $v = $s->{'val'}{$keys[$j]} || 0; + if ($newseg) + { + $delta = $v; + $doff = $j; + $flat = 1; + push(@starts, $keys[$j]); + $newseg = 0; + } + $delta = 0 if ($delta + $j - $doff != $v); + $flat = 0 if ($v == 0); + if ($j == $#keys || $keys[$j] + 1 != $keys[$j+1]) + { + push (@ends, $keys[$j]); + push (@deltas, $delta ? $delta - $keys[$doff] : 0); + push (@range, $flat); + $num++; + $newseg = 1; + } + } + + ($num, $sRange, $eSel, $eShift) = Font::TTF::Utils::TTF_bininfo($num, 2); + $fh->print(pack("n4", $num * 2, $sRange, $eSel, $eShift)); + $fh->print(pack("n*", @ends)); + $fh->print(pack("n", 0)); + $fh->print(pack("n*", @starts)); + $fh->print(pack("n*", @deltas)); + + $count = 0; + for ($j = 0; $j < $num; $j++) + { + $delta = $deltas[$j]; + if ($delta != 0 && $range[$j] == 1) + { $range[$j] = 0; } + else + { + $range[$j] = ($count + $num - $j) << 1; + $count += $ends[$j] - $starts[$j] + 1; + } + } + + $fh->print(pack("n*", @range)); + + for ($j = 0; $j < $num; $j++) + { + next if ($range[$j] == 0); + $fh->print(pack("n*", map {$_ || 0} @{$s->{'val'}}{$starts[$j] .. $ends[$j]})); + } + } elsif ($s->{'Format'} == 8 || $s->{'Format'} == 12) + { + my (@jobs, $start, $current, $curr_glyf, $map); + + $current = 0; $curr_glyf = 0; + $map = "\000" x 8192; + foreach $j (@keys) + { + if ($j > 0xFFFF) + { + if (defined $s->{'val'}{$j >> 16}) + { $s->{'Format'} = 12; } + vec($map, $j >> 16, 1) = 1; + } + if ($j != $current + 1 || $s->{'val'}{$j} != $curr_glyf + 1) + { + push (@jobs, [$start, $current, $curr_glyf - ($current - $start)]) if (defined $start); + $start = $j; $current = $j; $curr_glyf = $s->{'val'}{$j}; + } + $current = $j; + $curr_glyf = $s->{'val'}{$j}; + } + push (@jobs, [$start, $current, $curr_glyf - ($current - $start)]) if (defined $start); + $fh->print($map) if ($s->{'Format'} == 8); + $fh->print(pack('N', $#jobs + 1)); + foreach $j (@jobs) + { $fh->print(pack('N3', @{$j})); } + } elsif ($s->{'Format'} == 10) + { + $fh->print(pack('N2', $keys[0], $keys[-1] - $keys[0] + 1)); + $fh->print(pack('n*', $s->{'val'}{$keys[0] .. $keys[-1]})); + } + + $loc = $fh->tell(); + if ($s->{'Format'} < 8) + { + $fh->seek($s->{' outloc'} + 2, 0); + $fh->print(pack("n", $loc - $s->{' outloc'})); + } else + { + $fh->seek($s->{' outloc'} + 4, 0); + $fh->print(pack("N", $loc - $s->{' outloc'})); + } + $fh->seek($base_loc + 8 + ($i << 3), 0); + $fh->print(pack("N", $s->{' outloc'} - $base_loc)); + $fh->seek($loc, 0); + } + $self; +} + + +=head2 $t->XML_element($context, $depth, $name, $val) + +Outputs the elements of the cmap in XML. We only need to process val here + +=cut + +sub XML_element +{ + my ($self, $context, $depth, $k, $val) = @_; + my ($fh) = $context->{'fh'}; + my ($i); + + return $self if ($k eq 'LOC'); + return $self->SUPER::XML_element($context, $depth, $k, $val) unless ($k eq 'val'); + + $fh->print("$depth\n"); + foreach $i (sort {$a <=> $b} keys %{$val}) + { $fh->printf("%s\n", $depth . $context->{'indent'}, $i, $val->{$i}); } + $fh->print("$depth\n"); + $self; +} + +=head2 @map = $t->reverse(%opt) + +Returns a reverse map of the Unicode cmap. I.e. given a glyph gives the Unicode value for it. Options are: + +=over 4 + +=item tnum + +Table number to use rather than the default Unicode table + +=item array + +Returns each element of reverse as an array since a glyph may be mapped by more +than one Unicode value. The arrays are unsorted. Otherwise store any one unicode value for a glyph. + +=back + +=cut + +sub reverse +{ + my ($self, %opt) = @_; + my ($table) = defined $opt{'tnum'} ? $self->{'Tables'}[$opt{'tnum'}] : $self->find_ms; + my (@res, $code, $gid); + + while (($code, $gid) = each(%{$table->{'val'}})) + { + if ($opt{'array'}) + { push (@{$res[$gid]}, $code); } + else + { $res[$gid] = $code unless (defined $res[$gid] && $res[$gid] > 0 && $res[$gid] < $code); } + } + @res; +} + + +=head2 is_unicode($index) + +Returns whether the table of a given index is known to be a unicode table +(as specified in the specifications) + +=cut + +sub is_unicode +{ + my ($self, $index) = @_; + my ($pid, $eid) = ($self->{'Tables'}[$index]{'Platform'}, $self->{'Tables'}[$index]{'Encoding'}); + + return ($pid == 3 || $pid == 0 || ($pid == 2 && $eid == 1)); +} + +1; + +=head1 BUGS + +=over 4 + +=item * + +No support for format 2 tables (MBCS) + +=back + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Coverage.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Coverage.pm new file mode 100644 index 0000000..909f910 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Coverage.pm @@ -0,0 +1,323 @@ +package Font::TTF::Coverage; + +=head1 NAME + +Font::TTF::Coverage - Opentype coverage and class definition objects + +=head1 DESCRIPTION + +Coverage tables and class definition objects are virtually identical concepts +in OpenType. Their difference comes purely in their storage. Therefore we can +say that a coverage table is a class definition in which the class definition +for each glyph is the corresponding index in the coverage table. The resulting +data structure is that a Coverage table has the following fields: + +=item cover + +A boolean to indicate whether this table is a coverage table (TRUE) or a +class definition (FALSE) + +=item val + +A hash of glyph ids against values (either coverage index or class value) + +=item fmt + +The storage format used is given here, but is recalculated when the table +is written out. + +=item count + +A count of the elements in a coverage table for use with add. Each subsequent +addition is added with the current count and increments the count. + +=head1 METHODS + +=cut + +=head2 new($isCover [, vals]) + +Creates a new coverage table or class definition table, depending upon the +value of $isCover. if $isCover then vals may be a list of glyphs to include in order. +If no $isCover, then vals is a hash of glyphs against class values. + +=cut + +sub new +{ + my ($class) = shift; + my ($isCover) = shift; + my ($self) = {}; + + $self->{'cover'} = $isCover; + $self->{'count'} = 0; + if ($isCover) + { + my ($v); + foreach $v (@_) + { $self->{'val'}{$v} = $self->{'count'}++; } + } + else + { + $self->{'val'} = {@_}; + foreach (values %{$self->{'val'}}) {$self->{'max'} = $_ if $_ > $self->{'max'}} + } + bless $self, $class; +} + + +=head2 read($fh) + +Reads the coverage/class table from the given file handle + +=cut + +sub read +{ + my ($self, $fh) = @_; + my ($dat, $fmt, $num, $i, $c); + + $fh->read($dat, 4); + ($fmt, $num) = unpack("n2", $dat); + $self->{'fmt'} = $fmt; + + if ($self->{'cover'}) + { + if ($fmt == 1) + { + $fh->read($dat, $num << 1); + map {$self->{'val'}{$_} = $i++} unpack("n*", $dat); + } elsif ($fmt == 2) + { + $fh->read($dat, $num * 6); + for ($i = 0; $i < $num; $i++) + { + ($first, $last, $c) = unpack("n3", substr($dat, $i * 6, 6)); + map {$self->{'val'}{$_} = $c++} ($first .. $last); + } + } + $self->{'count'} = $num; + } elsif ($fmt == 1) + { + $fh->read($dat, 2); + $first = $num; + ($num) = unpack("n", $dat); + $fh->read($dat, $num << 1); + map {$self->{'val'}{$first++} = $_; $self->{'max'} = $_ if ($_ > $self->{'max'})} unpack("n*", $dat); + } elsif ($fmt == 2) + { + $fh->read($dat, $num * 6); + for ($i = 0; $i < $num; $i++) + { + ($first, $last, $c) = unpack("n3", substr($dat, $i * 6, 6)); + map {$self->{'val'}{$_} = $c} ($first .. $last); + $self->{'max'} = $c if ($c > $self->{'max'}); + } + } + $self; +} + + +=head2 out($fh, $state) + +Writes the coverage/class table to the given file handle. If $state is 1 then +the output string is returned rather than being output to a filehandle. + +=cut + +sub out +{ + my ($self, $fh, $state) = @_; + my ($g, $eff, $grp, $out); + my ($shipout) = ($state ? sub {$out .= $_[0];} : sub {$fh->print($_[0]);}); + my (@gids) = sort {$a <=> $b} keys %{$self->{'val'}}; + + $fmt = 1; $grp = 1; $eff = 0; + for ($i = 1; $i <= $#gids; $i++) + { + if ($self->{'val'}{$gids[$i]} < $self->{'val'}{$gids[$i-1]} && $self->{'cover'}) + { + $fmt = 2; + last; + } elsif ($gids[$i] == $gids[$i-1] + 1 && ($self->{'cover'} || $self->{'val'}{$gids[$i]} == $self->{'val'}{$gids[$i-1]})) + { $eff++; } + else + { + $grp++; + $eff += $gids[$i] - $gids[$i-1] if (!$self->{'cover'}); + } + } +# if ($self->{'cover'}) + { $fmt = 2 if ($eff / $grp > 3); } +# else +# { $fmt = 2 if ($grp > 1); } + + if ($fmt == 1 && $self->{'cover'}) + { + my ($last) = 0; + &$shipout(pack('n2', 1, scalar @gids)); + &$shipout(pack('n*', @gids)); + } elsif ($fmt == 1) + { + my ($last) = $gids[0]; + &$shipout(pack("n3", 1, $last, $gids[-1] - $last + 1)); + foreach $g (@gids) + { + if ($g > $last + 1) + { &$shipout(pack('n*', (0) x ($g - $last - 1))); } + &$shipout(pack('n', $self->{'val'}{$g})); + $last = $g; + } + } else + { + my ($start, $end, $ind, $numloc, $endloc, $num); + &$shipout(pack("n2", 2, 0)); + $numloc = $fh->tell() - 2 unless $state; + + $start = 0; $end = 0; $num = 0; + while ($end < $#gids) + { + if ($gids[$end + 1] == $gids[$end] + 1 + && $self->{'val'}{$gids[$end + 1]} + == $self->{'val'}{$gids[$end]} + + ($self->{'cover'} ? 1 : 0)) + { + $end++; + next; + } + + &$shipout(pack("n3", $gids[$start], $gids[$end], + $self->{'val'}{$gids[$start]})); + $start = $end + 1; + $end++; + $num++; + } + &$shipout(pack("n3", $gids[$start], $gids[$end], + $self->{'val'}{$gids[$start]})); + $num++; + if ($state) + { substr($out, 2, 2) = pack('n', $num); } + else + { + $endloc = $fh->tell(); + $fh->seek($numloc, 0); + $fh->print(pack("n", $num)); + $fh->seek($endloc, 0); + } + } + return ($state ? $out : $self); +} + + +=head2 $c->add($glyphid[, $class]) + +Adds a glyph id to the coverage table incrementing the count so that each subsequent addition +has the next sequential number. Returns the index number of the glyphid added + +=cut + +sub add +{ + my ($self, $gid, $class) = @_; + + return $self->{'val'}{$gid} if (defined $self->{'val'}{$gid}); + if ($self->{'cover'}) + { + $self->{'val'}{$gid} = $self->{'count'}; + return $self->{'count'}++; + } + else + { + $self->{'val'}{$gid} = $class || '0'; + $self->{'max'} = $class if ($class > $self->{'max'}); + return $class; + } +} + + +=head2 $c->signature + +Returns a vector of all the glyph ids covered by this coverage table or class + +=cut + +sub signature +{ + my ($self) = @_; + my ($vec, $range, $size); + +if (0) +{ + if ($self->{'cover'}) + { $range = 1; $size = 1; } + else + { + $range = $self->{'max'}; + $size = 1; + while ($range > 1) + { + $size = $size << 1; + $range = $range >> 1; + } + $range = $self->{'max'} + 1; + } + foreach (keys %{$self->{'val'}}) + { vec($vec, $_, $size) = $self->{'val'}{$_} > $range ? $range : $self->{'val'}{$_}; } + length($vec) . ":" . $vec; +} + $vec = join(";", map{"$_,$self->{'val'}{$_}"} keys %{$self->{'val'}}); +} + +=head2 @map=$c->sort + +Sorts the coverage table so that indexes are in ascending order of glyphid. +Returns a map such that $map[$new_index]=$old_index. + +=cut + +sub sort +{ + my ($self) = @_; + my (@res, $i); + + foreach (sort {$a <=> $b} keys %{$self->{'val'}}) + { + push(@res, $self->{'val'}{$_}); + $self->{'val'}{$_} = $i++; + } + @res; +} + +=head2 $c->out_xml($context) + +Outputs this coverage/class in XML + +=cut + +sub out_xml +{ + my ($self, $context, $depth) = @_; + my ($fh) = $context->{'fh'}; + + $fh->print("$depth<" . ($self->{'cover'} ? 'coverage' : 'class') . ">\n"); + foreach $gid (sort {$a <=> $b} keys %{$self->{'val'}}) + { + $fh->printf("$depth$context->{'indent'}\n", $gid, $self->{'val'}{$gid}); + } + $fh->print("$depth{'cover'} ? 'coverage' : 'class') . ">\n"); + $self; +} + +sub release +{ } + + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + +1; + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Cvt_.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Cvt_.pm new file mode 100644 index 0000000..2a79f5b --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Cvt_.pm @@ -0,0 +1,81 @@ +package Font::TTF::Cvt_; + +=head1 NAME + +Font::TTF::Cvt_ - Control Value Table in a TrueType font + +=head1 DESCRIPTION + +This is a minimal class adding nothing beyond a table, but is a repository +for cvt type information for those processes brave enough to address hinting. + +=head1 INSTANCE VARIABLES + +=over 4 + +=item val + +This is an array of CVT values. Thus access to the CVT is via: + + $f->{'cvt_'}{'val'}[$num]; + +=back + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA $VERSION); +use Font::TTF::Utils; + +@ISA = qw(Font::TTF::Table); + +$VERSION = 0.0001; + +=head2 $t->read + +Reads the CVT table into both the tables C<' dat'> variable and the C +array. + +=cut + +sub read +{ + my ($self) = @_; + + $self->read_dat || return undef; + $self->{' read'} = 1; + $self->{'val'} = [TTF_Unpack("s*", $self->{' dat'})]; + $self; +} + + +=head2 $t->update + +Updates the RAM file copy C<' dat'> to be the same as the array. + +=cut + +sub update +{ + my ($self) = @_; + + return undef unless ($self->{' read'} && $#{$self->{'val'}} >= 0); + $self->{' dat'} = TTF_Pack("s*", @{$self->{'val'}}); + $self; +} + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Delta.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Delta.pm new file mode 100644 index 0000000..7d63757 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Delta.pm @@ -0,0 +1,173 @@ +package Font::TTF::Delta; + +=head1 NAME + +Font::TTF::Delta - Opentype Device tables + +=head1 DESCRIPTION + +Each device table corresponds to a set of deltas for a particular point over +a range of ppem values. + +=item first + +The first ppem value in the range + +=item last + +The last ppem value in the range + +=item val + +This is an array of deltas corresponding to each ppem in the range between +first and last inclusive. + +=item fmt + +This is the fmt used (log2 of number bits per value) when the device table was +read. It is recalculated on output. + +=head1 METHODS + +=cut + +use strict; +use Font::TTF::Utils; + +=head2 new + +Creates a new device table + +=cut + +sub new +{ + my ($class) = @_; + my ($self) = {}; + + bless $self, $class; +} + + +=head2 read + +Reads a device table from the given IO object at the current location + +=cut + +sub read +{ + my ($self, $fh) = @_; + my ($dat, $fmt, $num, $i, $j, $mask); + + $fh->read($dat, 6); + ($self->{'first'}, $self->{'last'}, $fmt) = TTF_Unpack("S3", $dat); + $self->{'fmt'} = $fmt; + + $fmt = 1 << $fmt; + $num = ((($self->{'last'} - $self->{'first'} + 1) * $fmt) + 15) >> 8; + $fh->read($dat, $num); + + $mask = (0xffff << (16 - $fmt)) & 0xffff; + $j = 0; + for ($i = $self->{'first'}; $i <= $self->{'last'}; $i++) + { + if ($j == 0) + { + $num = TTF_Unpack("S", substr($dat, 0, 2)); + substr($dat, 0, 2) = ''; + } + push (@{$self->{'val'}}, ($num & $mask) >> (16 - $fmt)); + $num <<= $fmt; + $j += $fmt; + $j = 0 if ($j >= 16); + } + $self; +} + + +=head2 out($fh, $style) + +Outputs a device table to the given IO object at the current location, or just +returns the data to be output if $style != 0 + +=cut + +sub out +{ + my ($self, $fh, $style) = @_; + my ($dat, $fmt, $num, $mask, $j, $f, $out); + + foreach $f (@{$self->{'val'}}) + { + my ($tfmt) = $f > 0 ? $f + 1 : -$f; + $fmt = $tfmt if $tfmt > $fmt; + } + + if ($fmt > 8) + { $fmt = 3; } + elsif ($fmt > 2) + { $fmt = 2; } + else + { $fmt = 1; } + + $out = TTF_Pack("S3", $self->{'first'}, $self->{'last'}, $fmt); + + $fmt = 1 << $fmt; + $mask = 0xffff >> (16 - $fmt); + $j = 0; $dat = 0; + foreach $f (@{$self->{'val'}}) + { + $dat |= ($f & $mask) << (16 - $fmt - $j); + $j += $fmt; + if ($j >= 16) + { + $j = 0; + $out .= TTF_Pack("S", $dat); + $dat = 0; + } + } + $out .= pack('n', $dat) if ($j > 0); + $fh->print($out) unless $style; + $out; +} + +=head2 $d->signature() + +Returns a content based identifying string for this delta for +compression purposes + +=cut + +sub signature +{ + my ($self) = @_; + return join (",", $self->{'first'}, $self->{'last'}, @{$self->{'val'}}); +} + + +=head2 $d->out_xml($context) + +Outputs a delta in XML + +=cut + +sub out_xml +{ + my ($self, $context, $depth) = @_; + my ($fh) = $context->{'fh'}; + + $fh->printf("%s\n", $depth, $self->{'first'}, $self->{'last'}); + $fh->print("$depth$context->{'indent'}" . join (' ', @{$self->{'val'}}) . "\n") if defined ($self->{'val'}); + $fh->print("$depth\n"); +} + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + +1; + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Dumper.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Dumper.pm new file mode 100644 index 0000000..7cc8699 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Dumper.pm @@ -0,0 +1,79 @@ +package Font::TTF::Dumper; + +=head1 NAME + +Font::TTF::Dumper - Debug dump of a font datastructure, avoiding recursion on ' PARENT' + +=head1 SYNOPSIS + + Font::TTF::Dumper; + + # Print a table from the font structure: + print ttfdump($font->{$tag}); + + # Print font table with name + print ttfdump($font->{'head'}, 'head'); + + # Print one glyph's data: + print ttfdump($font->{'loca'}->read->{'glyphs'}[$gid], "glyph_$gid"); + +=head1 DESCRIPTION + +Font::TTF data structures are trees created from hashes and arrays. When trying to figure +out how the structures work, sometimes it is helpful to use Data::Dumper on them. However, +many of the object structures have ' PARENT' links that refer back to the object's parent, +which means that Data::Dumper ends up dumping the whole font no matter what. + +The purpose of this module is to do just one thing: invoke Data::Dumper with a +filter that skips over the ' PARENT' element of any hash. + +To reduce output further, this module also skips over ' CACHE' elements and any +hash element whose value is a Font::TTF::Glyph or Font::TTF::Font object. +(Really should make this configurable.) + +=cut + +use strict; +use Data::Dumper; + +use vars qw(@EXPORT @ISA); +require Exporter; +@ISA = qw( Exporter ); +@EXPORT = qw( ttfdump ); + +my %skip = ( Font => 1, Glyph => 1 ); + +sub ttfdump +{ + my ($var, $name) = @_; + my $res; + + my $d = Data::Dumper->new([$var]); + $d->Names([$name]) if defined $name; + $d->Sortkeys(\&myfilter); # This is the trick to keep from dumping the whole font + $d->Indent(3); # I want array indicies + $d->Useqq(1); # Perlquote -- slower but there might be binary data. + $res = $d->Dump; + $d->DESTROY; + $res; +} + +sub myfilter +{ + my ($hash) = @_; + my @a = grep { + ($_ eq ' PARENT' || $_ eq ' CACHE') ? 0 : + ref($hash->{$_}) =~ m/^Font::TTF::(.*)$/ ? !$skip{$1} : + 1 + } (keys %{$hash}) ; + # Sort numerically if that is reasonable: + return [ sort {$a =~ /\D/ || $b =~ /\D/ ? $a cmp $b : $a <=> $b} @a ]; +} + +1; + +=head1 See also + +L + +=cut diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/EBDT.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/EBDT.pm new file mode 100644 index 0000000..257e8d7 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/EBDT.pm @@ -0,0 +1,285 @@ +package Font::TTF::EBDT; + +=head1 NAME + +Font::TTF::EBDT - Embeeded Bitmap Data Table + +=head1 DESCRIPTION + +Contains the metrics and bitmap image data. + +=head1 INSTANCE VARIABLES + +Only has 'bitmap' instance variable. It is an array of assosiative +array keyed by glyph-id. The element is an object which consists +of metric information and image data. + +=over 4 + +=item bitmap object + +=over 8 +=item format +Only 7 is supported. +=item height +=item width +=item horiBearingX +=item horiBearingY +=item horiAdvance +=item vertBearingX +=item vertBearingY +=item vertAdvance +=item imageData + +=back + +=back + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA); +require Font::TTF::Table; + +@ISA = qw(Font::TTF::Table); + + +=head2 $t->read + +Reads the embedded bitmap data from the TTF file into memory. +This routine should be called _after_ {'EBLC'}->read. + +=cut + +sub read +{ + my ($self) = shift; + my ($fh) = $self->{' INFILE'}; + my ($i, $dat); + my ($eblc) = $self->{' PARENT'}->{'EBLC'}; + my ($bst_array); + + $eblc->read; + $self->SUPER::read || return $self; + + # ebdtHeader + $fh->read($dat, 4); # version + + $bst_array = $eblc->{'bitmapSizeTable'}; + + for ($i = 0; $i < $eblc->{'Num'}; $i++) + { + my ($bst) = $bst_array->[$i]; + my ($format) = $bst->{'imageFormat'}; + my ($offset) = $bst->{'imageDataOffset'}; + my ($j); + my ($ist_array) = $eblc->{'indexSubTableArray'}[$i]; + my ($bitmap) = {}; + + die "Only EBDT format 7 is implemented." unless ($format == 7); + + $self->{'bitmap'}[$i] = $bitmap; + + for ($j = 0; $j < $bst->{'numberOfIndexSubTables'}; $j++) { + my ($ista) = $ist_array->[$j]; + my ($offsetArray) = $eblc->{'indexSubTable'}[$i][$j]; + my ($p, $o0, $c); + +# if ($fh->tell != $self->{' OFFSET'} + $offset) { +# $fh->seek($self->{' OFFSET'} + $offset, 0); +# } + + $p = 0; + $o0 = $offsetArray->[$p++]; + for ($c = $ista->{'firstGlyphIndex'}; $c <= $ista->{'lastGlyphIndex'}; $c++) + { + my ($b) = {}; + my ($o1) = $offsetArray->[$p++]; + my ($len) = $o1 - $o0 - 8; + +# if ($fh->tell != $self->{' OFFSET'} + $offset + $o0) { +# $fh->seek($self->{' OFFSET'} + $offset + $o0, 0); +# } + + $fh->read($dat, 8); + ($b->{'height'}, + $b->{'width'}, + $b->{'horiBearingX'}, + $b->{'horiBearingY'}, + $b->{'horiAdvance'}, + $b->{'vertBearingX'}, + $b->{'vertBearingY'}, + $b->{'vertAdvance'}) + = unpack("cccccccc", $dat); + + $fh->read($dat, $len); + $b->{'imageData'} = $dat; + $b->{'format'} = 7; # bitmap and bigMetrics + + $bitmap->{$c} = $b; + $o0 = $o1; + } + + $offset += $o0; + } + } + + $self; +} + + +=head2 $t->update + +Update EBLC information using EBDT data. + +=cut + +sub get_regions +{ + my (@l) = @_; + my (@r) = (); + my ($e); + my ($first); + my ($last); + + $first = $l[0]; + $last = $first - 1; + foreach $e (@l) { + if ($last + 1 != $e) { # not contiguous + $r[++$#r] = [$first, $last]; + $first = $e; + } + + $last = $e; + } + + $r[++$#r] = [$first, $last]; + @r; +} + +sub update +{ + my ($self) = @_; + my ($eblc) = $self->{' PARENT'}->{'EBLC'}; + my ($bst_array) = []; + my ($offset) = 4; + my ($i); + my ($bitmap_array) = $self->{'bitmap'}; + my ($istao) = 8 + 48 * $eblc->{'Num'}; + + $eblc->{'bitmapSizeTable'} = $bst_array; + + for ($i = 0; $i < $eblc->{'Num'}; $i++) { + my ($bst) = {}; + my ($ist_array) = []; + my ($j); + my ($bitmap) = $bitmap_array->[$i]; + my (@regions) = get_regions(sort {$a <=> $b} keys (%$bitmap)); + my ($aotis) = 8 * (1+$#regions); + + $bst->{'indexFormat'} = 1; + $bst->{'imageFormat'} = 7; + $bst->{'imageDataOffset'} = $offset; + $bst->{'numberOfIndexSubTables'} = 1+$#regions; + $bst->{'indexSubTableArrayOffset'} = $istao; + $bst->{'colorRef'} = 0; + + $bst->{'startGlyphIndex'} = $regions[0][0]; + $bst->{'endGlyphIndex'} = $regions[-1][1]; + $bst->{'bitDepth'} = 1; + $bst->{'flags'} = 1; # Horizontal + $bst_array->[$i] = $bst; + + $eblc->{'indexSubTableArray'}[$i] = $ist_array; + for ($j = 0; $j <= $#regions; $j++) { + my ($ista) = {}; + my ($offsetArray) = []; + my ($p, $o0, $c); + $ist_array->[$j] = $ista; + + $ista->{'firstGlyphIndex'} = $regions[$j][0]; + $ista->{'lastGlyphIndex'} = $regions[$j][1]; + $ista->{'additionalOffsetToIndexSubtable'} = $aotis; + $eblc->{'indexSubTable'}[$i][$j] = $offsetArray; + $p = 0; + $o0 = 0; + for ($c = $regions[$j][0]; $c <= $regions[$j][1]; $c++) { + my ($b) = $bitmap->{$c}; + + $offsetArray->[$p++] = $o0; + $o0 += 8 + length($b->{'imageData'}); + } + + $offsetArray->[$p++] = $o0; + + $aotis += ($regions[$j][1] - $regions[$j][0] + 1 + 1)*4; + $offset += $o0; + + # Do we need the element of 0x10007 and absolute offset here, + # at the end of offsetArray? +# if ($j + 1 <= $#regions) { +# $offsetArray->[$p++] = 0x10007; +# $offsetArray->[$p++] = $offset; +# $aotis += 8; +# } + } + + $istao += $aotis + 8; + $bst->{'indexTablesSize'} = $aotis + 8; + } +} + +=head2 $t->out($fh) + +Outputs the bitmap data of embedded bitmap for this font. + +=cut + +sub out +{ + my ($self, $fh) = @_; + my ($eblc) = $self->{' PARENT'}->{'EBLC'}; + my ($i); + my ($bitmap_array) = $self->{'bitmap'}; + + $fh->print(pack("N", 0x00020000)); + + for ($i = 0; $i < $eblc->{'Num'}; $i++) { + my ($j); + my ($bitmap) = $bitmap_array->[$i]; + my (@regions) = get_regions(sort {$a <=> $b} keys (%$bitmap)); + + for ($j = 0; $j <= $#regions; $j++) { + my ($c); + + for ($c = $regions[$j][0]; $c <= $regions[$j][1]; $c++) { + my ($b) = $bitmap->{$c}; + + $fh->print(pack("cccccccc", + $b->{'height'}, $b->{'width'}, + $b->{'horiBearingX'}, $b->{'horiBearingY'}, + $b->{'horiAdvance'}, $b->{'vertBearingX'}, + $b->{'vertBearingY'}, $b->{'vertAdvance'})); + $fh->print($b->{'imageData'}); + } + } + } +} + +1; + +=head1 BUGS + +Only Format 7 is implemented. XML output is not supported (yet). + +=head1 AUTHOR + +NIIBE Yutaka L. See L for copyright and +licensing. + +This was written at the CodeFest Akihabara 2006 hosted by FSIJ. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/EBLC.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/EBLC.pm new file mode 100644 index 0000000..7ba6e68 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/EBLC.pm @@ -0,0 +1,228 @@ +package Font::TTF::EBLC; + +=head1 NAME + +Font::TTF::EBLC - Embeeded Bitmap Location Table + +=head1 DESCRIPTION + +Contains the sizes and glyph ranges of bitmaps, and the offsets to +glyph bitmap data in indexSubTables for EBDT. + +Possibly contains glyph metrics information. + +=head1 INSTANCE VARIABLES +The information specified 'B<(R)>ead only' is read only, those +are calculated from EBDT, when it is 'update'-ed. + +=over 4 + +=item bitmapSizeTable +An array of tables of following information + +=over 8 +=item indexSubTableArrayOffset (R) +=item indexTablesSize (R) +=item numberOfIndexSubTables (R) +=item colorRef +=item hori +=item vert +=item startGlyphIndex (R) +=item endGlyphIndex (R) +=item ppemX +=item ppemY +=item bitDepth +=item flags +=back + +=item indexSubTableArray (R) +An array which contains range information. + +=item indexSubTable (R) +An array which contains offsets of EBDT table. + +=back + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA); +require Font::TTF::Table; + +@ISA = qw(Font::TTF::Table); + + +=head2 $t->read + +Reads the location information of embedded bitmap from the TTF file into memory + +=cut + +sub read +{ + my ($self) = @_; + my ($fh) = $self->{' INFILE'}; + my ($i, $dat); + my ($indexSubTableArrayOffset, + $indexTablesSize, + $numberOfIndexSubTables, + $colorRef); + my ($startGlyphIndex, + $endGlyphIndex, + $ppemX, $ppemY, + $bitDepth, $flags); + my (@hori, @vert); + my ($bst, $ista, $ist); + my ($j); + + $self->SUPER::read or return $self; + + # eblcHeader + $fh->read($dat, 4); + $self->{'version'} = unpack("N",$dat); + + $fh->read($dat, 4); + $self->{'Num'} = unpack("N",$dat); + + # bitmapSizeTable + for ($i = 0; $i < $self->{'Num'}; $i++) { + $fh->read($dat, 16); + ($indexSubTableArrayOffset, $indexTablesSize, + $numberOfIndexSubTables, $colorRef) = unpack("NNNN", $dat); + $fh->read($dat, 12); @hori = unpack("cccccccccccc", $dat); + $fh->read($dat, 12); @vert = unpack("cccccccccccc", $dat); + + $fh->read($dat, 8); + ($startGlyphIndex, $endGlyphIndex, + $ppemX, $ppemY, $bitDepth, $flags) = unpack("nnCCCC", $dat); + + $self->{'bitmapSizeTable'}[$i] = { + 'indexSubTableArrayOffset' => $indexSubTableArrayOffset, + 'indexTablesSize' => $indexTablesSize, + 'numberOfIndexSubTables' => $numberOfIndexSubTables, + 'colorRef' => $colorRef, + 'hori' => [@hori], + 'vert' => [@vert], + 'startGlyphIndex' => $startGlyphIndex, + 'endGlyphIndex' => $endGlyphIndex, + 'ppemX' => $ppemX, + 'ppemY' => $ppemY, + 'bitDepth' => $bitDepth, + 'flags' => $flags + }; + } + + for ($i = 0; $i < $self->{'Num'}; $i++) { + my ($count, $x); + + $bst = $self->{'bitmapSizeTable'}[$i]; + + for ($j = 0; $j < $bst->{'numberOfIndexSubTables'}; $j++) { + $ista = {}; + + # indexSubTableArray + $self->{'indexSubTableArray'}[$i][$j] = $ista; + $fh->read($dat, 8); + ($ista->{'firstGlyphIndex'}, + $ista->{'lastGlyphIndex'}, + $ista->{'additionalOffsetToIndexSubtable'}) + = unpack("nnN", $dat); + } + + # indexSubTable + # indexSubHeader + $fh->read($dat, 8); + ($bst->{'indexFormat'}, + $bst->{'imageFormat'}, + $bst->{'imageDataOffset'}) = unpack("nnN", $dat); + + die "Only indexFormat == 1 is supported" unless ($bst->{'indexFormat'} == 1); + + for ($j = 0; $j < $bst->{'numberOfIndexSubTables'}; $j++) { + $ista = $self->{'indexSubTableArray'}[$i][$j]; + $count = $ista->{'lastGlyphIndex'} - $ista->{'firstGlyphIndex'} + 1 + 1; + $fh->seek($self->{' OFFSET'} + $bst->{'indexSubTableArrayOffset'} + + $ista->{'additionalOffsetToIndexSubtable'} + 8, 0); + +# $count += 2 if $j < $bst->{'numberOfIndexSubTables'} - 1; + + $fh->read($dat, 4*$count); + + $self->{'indexSubTable'}[$i][$j] = [unpack("N*", $dat)]; + } + } + + $self; +} + +=head2 $t->out($fh) + +Outputs the location information of embedded bitmap for this font. + +=cut + +sub out +{ + my ($self, $fh) = @_; + my ($i); + my ($bst_array) = $self->{'bitmapSizeTable'}; + + $fh->print(pack("N", 0x00020000)); + $fh->print(pack("N", $self->{'Num'})); + + for ($i = 0; $i < $self->{'Num'}; $i++) { + my ($bst) = $bst_array->[$i]; + + $fh->print(pack("NNNN", + $bst->{'indexSubTableArrayOffset'}, + $bst->{'indexTablesSize'}, + $bst->{'numberOfIndexSubTables'}, + $bst->{'colorRef'})); + $fh->print(pack("cccccccccccc", @{$bst->{'hori'}})); + $fh->print(pack("cccccccccccc", @{$bst->{'vert'}})); + $fh->print(pack("nnCCCC", $bst->{'startGlyphIndex'}, + $bst->{'endGlyphIndex'}, $bst->{'ppemX'}, + $bst->{'ppemY'}, $bst->{'bitDepth'}, $bst->{'flags'})); + } + + for ($i = 0; $i < $self->{'Num'}; $i++) { + my ($bst) = $bst_array->[$i]; + my ($j); + + for ($j = 0; $j < $bst->{'numberOfIndexSubTables'}; $j++) { + my ($ista) = $self->{'indexSubTableArray'}[$i][$j]; + + $fh->print("nnN", + $ista->{'firstGlyphIndex'}, + $ista->{'lastGlyphIndex'}, + $ista->{'additionalOffsetToIndexSubtable'}); + } + + $fh->print(pack("nnN", $bst->{'indexFormat'}, $bst->{'imageFormat'}, + $bst->{'imageDataOffset'})); + + die "Only indexFormat == 1 is supported" unless ($bst->{'indexFormat'} == 1); + + for ($j = 0; $j < $bst->{'numberOfIndexSubTables'}; $j++) { + $fh->print(pack("N*", $self->{'indexSubTable'}[$i][$j])); + } + } +} + +1; + +=head1 BUGS + +Only indexFormat ==1 is implemented. XML output is not supported (yet). + +=head1 AUTHOR + +NIIBE Yutaka L. See L for copyright and +licensing. + +This was written at the CodeFest Akihabara 2006 hosted by FSIJ. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Fdsc.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Fdsc.pm new file mode 100644 index 0000000..3a81a11 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Fdsc.pm @@ -0,0 +1,125 @@ +package Font::TTF::Fdsc; + +=head1 NAME + +Font::TTF::Fdsc - Font Descriptors table in a font + +=head1 DESCRIPTION + +=head1 INSTANCE VARIABLES + +=item version + +=item descriptors + +Hash keyed by descriptor tags + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA %fields); +use Font::TTF::Utils; + +@ISA = qw(Font::TTF::Table); + +=head2 $t->read + +Reads the table into memory + +=cut + +sub read +{ + my ($self) = @_; + my ($dat, $fh, $numDescs, $tag, $descs); + + $self->SUPER::read or return $self; + + $fh = $self->{' INFILE'}; + $fh->read($dat, 4); + $self->{'version'} = TTF_Unpack("v", $dat); + + $fh->read($dat, 4); + + foreach (1 .. unpack("N", $dat)) { + $fh->read($tag, 4); + $fh->read($dat, 4); + $descs->{$tag} = ($tag eq 'nalf') ? unpack("N", $dat) : TTF_Unpack("f", $dat); + } + + $self->{'descriptors'} = $descs; + + $self; +} + + +=head2 $t->out($fh) + +Writes the table to a file either from memory or by copying + +=cut + +sub out +{ + my ($self, $fh) = @_; + my ($descs); + + return $self->SUPER::out($fh) unless $self->{' read'}; + + $fh->print(TTF_Pack("v", $self->{'version'})); + + $descs = $self->{'descriptors'} or {}; + + $fh->print(pack("N", scalar keys %$descs)); + foreach (sort keys %$descs) { + $fh->print($_); + $fh->print(($_ eq 'nalf') ? pack("N", $descs->{$_}) : TTF_Pack("f", $descs->{$_})); + } + + $self; +} + +=head2 $t->print($fh) + +Prints a human-readable representation of the table + +=cut + +sub print +{ + my ($self, $fh) = @_; + my ($descs, $k); + + $self->read; + + $fh = 'STDOUT' unless defined $fh; + + $descs = $self->{'descriptors'}; + foreach $k (sort keys %$descs) { + if ($k eq 'nalf') { + $fh->printf("Descriptor '%s' = %d\n", $k, $descs->{$k}); + } + else { + $fh->printf("Descriptor '%s' = %f\n", $k, $descs->{$k}); + } + } + + $self; +} + +1; + + +=head1 BUGS + +None known + +=head1 AUTHOR + +Jonathan Kew L. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Feat.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Feat.pm new file mode 100644 index 0000000..c837f41 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Feat.pm @@ -0,0 +1,191 @@ +package Font::TTF::Feat; + +=head1 NAME + +Font::TTF::Feat - Font Features + +=head1 DESCRIPTION + +=head1 INSTANCE VARIABLES + +=over 4 + +=item version + +=item features + +An array of hashes of the following form + +=over 8 + +=item feature + +feature id number + +=item name + +name index in name table + +=item exclusive + +exclusive flag + +=item settings + +hash of setting number against name string index + +=back + +=back + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA); + +use Font::TTF::Utils; + +require Font::TTF::Table; + +@ISA = qw(Font::TTF::Table); + +=head2 $t->read + +Reads the features from the TTF file into memory + +=cut + +sub read +{ + my ($self) = @_; + my ($featureCount, $features); + + $self->SUPER::read_dat or return $self; + + ($self->{'version'}, $featureCount) = TTF_Unpack("vS", $self->{' dat'}); + + $features = []; + foreach (1 .. $featureCount) { + my ($feature, $nSettings, $settingTable, $featureFlags, $nameIndex) + = TTF_Unpack("SSLSS", substr($self->{' dat'}, $_ * 12, 12)); + push @$features, + { + 'feature' => $feature, + 'name' => $nameIndex, + 'exclusive' => (($featureFlags & 0x8000) != 0), + 'settings' => { TTF_Unpack("S*", substr($self->{' dat'}, $settingTable, $nSettings * 4)) } + }; + } + $self->{'features'} = $features; + + delete $self->{' dat'}; # no longer needed, and may become obsolete + + $self; +} + +=head2 $t->out($fh) + +Writes the features to a TTF file + +=cut + +sub out +{ + my ($self, $fh) = @_; + my ($features, $numFeatures, $settings, $featuresData, $settingsData); + + return $self->SUPER::out($fh) unless $self->{' read'}; + + $features = $self->{'features'}; + $numFeatures = @$features; + + foreach (@$features) { + $settings = $_->{'settings'}; + $featuresData .= TTF_Pack("SSLSS", + $_->{'feature'}, + scalar keys %$settings, + 12 + 12 * $numFeatures + length $settingsData, + ($_->{'exclusive'} ? 0x8000 : 0x0000), + $_->{'name'}); + foreach (sort {$a <=> $b} keys %$settings) { + $settingsData .= TTF_Pack("SS", $_, $settings->{$_}); + } + } + + $fh->print(TTF_Pack("vSSL", $self->{'version'}, $numFeatures, 0, 0)); + $fh->print($featuresData); + $fh->print($settingsData); + + $self; +} + +=head2 $t->print($fh) + +Prints a human-readable representation of the table + +=cut + +sub print +{ + my ($self, $fh) = @_; + my ($names, $features, $settings); + + $self->read; + + $names = $self->{' PARENT'}->{'name'}; + $names->read; + + $fh = 'STDOUT' unless defined $fh; + + $features = $self->{'features'}; + foreach (@$features) { + $fh->printf("Feature %d, %s, name %d # '%s'\n", + $_->{'feature'}, + ($_->{'exclusive'} ? "exclusive" : "additive"), + $_->{'name'}, + $names->{'strings'}[$_->{'name'}][1][0]{0}); + $settings = $_->{'settings'}; + foreach (sort { $a <=> $b } keys %$settings) { + $fh->printf("\tSetting %d, name %d # '%s'\n", + $_, $settings->{$_}, $names->{'strings'}[$settings->{$_}][1][0]{0}); + } + } + + $self; +} + +sub settingName +{ + my ($self, $feature, $setting) = @_; + + $self->read; + + my $names = $self->{' PARENT'}->{'name'}; + $names->read; + + my $features = $self->{'features'}; + my ($featureEntry) = grep { $_->{'feature'} == $feature } @$features; + my $featureName = $names->{'strings'}[$featureEntry->{'name'}][1][0]{0}; + my $settingName = $featureEntry->{'exclusive'} + ? $names->{'strings'}[$featureEntry->{'settings'}->{$setting}][1][0]{0} + : $names->{'strings'}[$featureEntry->{'settings'}->{$setting & ~1}][1][0]{0} + . (($setting & 1) == 0 ? " On" : " Off"); + + ($featureName, $settingName); +} + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Jonathan Kew L. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Fmtx.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Fmtx.pm new file mode 100644 index 0000000..a9311df --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Fmtx.pm @@ -0,0 +1,108 @@ +package Font::TTF::Fmtx; + +=head1 NAME + +Font::TTF::Fmtx - Font Metrics table + +=head1 DESCRIPTION + +This is a simple table with just standards specified instance variables + +=head1 INSTANCE VARIABLES + + version + glyphIndex + horizontalBefore + horizontalAfter + horizontalCaretHead + horizontalCaretBase + verticalBefore + verticalAfter + verticalCaretHead + verticalCaretBase + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA %fields @field_info); + +require Font::TTF::Table; +use Font::TTF::Utils; + +@ISA = qw(Font::TTF::Table); +@field_info = ( + 'version' => 'v', + 'glyphIndex' => 'L', + 'horizontalBefore' => 'c', + 'horizontalAfter' => 'c', + 'horizontalCaretHead' => 'c', + 'horizontalCaretBase' => 'c', + 'verticalBefore' => 'c', + 'verticalAfter' => 'c', + 'verticalCaretHead' => 'c', + 'verticalCaretBase' => 'c'); + +sub init +{ + my ($k, $v, $c, $i); + for ($i = 0; $i < $#field_info; $i += 2) + { + ($k, $v, $c) = TTF_Init_Fields($field_info[$i], $c, $field_info[$i + 1]); + next unless defined $k && $k ne ""; + $fields{$k} = $v; + } +} + + +=head2 $t->read + +Reads the table into memory as instance variables + +=cut + +sub read +{ + my ($self) = @_; + my ($dat); + + $self->SUPER::read or return $self; + init unless defined $fields{'glyphIndex'}; + $self->{' INFILE'}->read($dat, 16); + + TTF_Read_Fields($self, $dat, \%fields); + $self; +} + + +=head2 $t->out($fh) + +Writes the table to a file either from memory or by copying. + +=cut + +sub out +{ + my ($self, $fh) = @_; + + return $self->SUPER::out($fh) unless $self->{' read'}; + + $fh->print(TTF_Out_Fields($self, \%fields, 16)); + $self; +} + + +1; + + +=head1 BUGS + +None known + +=head1 AUTHOR + +Jonathan Kew L. See L for copyright and +licensing. + +=cut diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Font.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Font.pm new file mode 100644 index 0000000..8f5cc50 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Font.pm @@ -0,0 +1,767 @@ +package Font::TTF::Font; + +=head1 NAME + +Font::TTF::Font - Memory representation of a font + +=head1 SYNOPSIS + +Here is the regression test (you provide your own font). Run it once and then +again on the output of the first run. There should be no differences between +the outputs of the two runs. + + $f = Font::TTF::Font->open($ARGV[0]); + + # force a read of all the tables + $f->tables_do(sub { $_[0]->read; }); + + # force read of all glyphs (use read_dat to use lots of memory!) + # $f->{'loca'}->glyphs_do(sub { $_[0]->read; }); + $f->{'loca'}->glyphs_do(sub { $_[0]->read_dat; }); + # NB. no need to $g->update since $f->{'glyf'}->out will do it for us + + $f->out($ARGV[1]); + $f->release; # clear up memory forcefully! + +=head1 DESCRIPTION + +A Truetype font consists of a header containing a directory of tables which +constitute the rest of the file. This class holds that header and directory and +also creates objects of the appropriate type for each table within the font. +Note that it does not read each table into memory, but creates a short reference +which can be read using the form: + + $f->{$tablename}->read; + +Classes are included that support many of the different TrueType tables. For +those for which no special code exists, the table type C is used, which +defaults to L. The current tables which are supported are: + + table Font::TTF::Table - for unknown tables + EBDT Font::TTF::EBDT + EBLC Font::TTF::EBLC + Feat Font::TTF::GrFeat + GDEF Font::TTF::GDEF + GPOS Font::TTF::GPOS + GSUB Font::TTF::GSUB + LTSH Font::TTF::LTSH + OS/2 Font::TTF::OS_2 + PCLT Font::TTF::PCLT + Sill Font::TTF::Sill + bsln Font::TTF::Bsln + cmap Font::TTF::Cmap - see also Font::TTF::OldCmap + cvt Font::TTF::Cvt_ + fdsc Font::TTF::Fdsc + feat Font::TTF::Feat + fmtx Font::TTF::Fmtx + fpgm Font::TTF::Fpgm + glyf Font::TTF::Glyf - see also Font::TTF::Glyph + hdmx Font::TTF::Hdmx + head Font::TTF::Head + hhea Font::TTF::Hhea + hmtx Font::TTF::Hmtx + kern Font::TTF::Kern - see alternative Font::TTF::AATKern + loca Font::TTF::Loca + maxp Font::TTF::Maxp + mort Font::TTF::Mort - see also Font::TTF::OldMort + name Font::TTF::Name + post Font::TTF::Post + prep Font::TTF::Prep + prop Font::TTF::Prop + vhea Font::TTF::Vhea + vmtx Font::TTF::Vmtx + +Links are: + +L +L L L +L L L L +L L L L L L +L L L L L +L L L L L +L L L L L +L L L L L +L L L + + +=head1 INSTANCE VARIABLES + +Instance variables begin with a space (and have lengths greater than the 4 +characters which make up table names). + +=over + +=item nocsum + +This is used during output to disable the creation of the file checksum in the +head table. For example, during DSIG table creation, this flag will be set to +ensure that the file checksum is left at zero. + +=item noharmony + +If set, do not harmonize the script and lang trees of GPOS and GSUB tables. See L for more info. + +=item fname (R) + +Contains the filename of the font which this object was read from. + +=item INFILE (P) + +The file handle which reflects the source file for this font. + +=item OFFSET (P) + +Contains the offset from the beginning of the read file of this particular +font directory, thus providing support for TrueType Collections. + +=back + +=head1 METHODS + +=cut + +use IO::File; + +use strict; +use vars qw(%tables $VERSION $dumper); +use Symbol(); + +require 5.004; + +$VERSION = 0.38; # MJPH 2-FEB-2008 Add Sill table +# $VERSION = 0.37; # MJPH 7-OCT-2005 Force hhea update if dirty, give more OS/2 stuff in update +# $VERSION = 0.36; # MJPH 19-AUG-2005 Change cmap::reverse api to be opts based +# $VERSION = 0.35; # MJPH 4-MAY-2004 Various fixes to OpenType stuff, separate off scripts +# $VERSION = 0.34; # MJPH 22-MAY-2003 Update PSNames to latest AGL +# $VERSION = 0.33; # MJPH 9-OCT-2002 Support CFF OpenType (just by version=='OTTO'?!) +# $VERSION = 0.32; # MJPH 2-OCT-2002 Bug fixes to TTFBuilder, new methods and some +# extension table support in Ttopen and Coverage +# $VERSION = 0.31; # MJPH 1-JUL-2002 fix read format 12 cmap (bart@cs.pdx.edu) +# improve surrogate support in ttfremap +# fix return warn to return warn,undef +# ensure correct indexToLocFormat +# $VERSION = 0.30; # MJPH 28-MAY-2002 add updated release +# $VERSION = 0.29; # MJPH 9-APR-2002 update ttfbuilder, sort out surrogates +# $VERSION = 0.28; # MJPH 13-MAR-2002 update ttfbuilder, add Font::TTF::Cmap::ms_enc() +# $VERSION = 0.27; # MJPH 6-FEB-2002 update ttfbuilder, support no fpgm, no more __DATA__ +# $VERSION = 0.26; # MJPH 19-SEP-2001 Update ttfbuilder +# $VERSION = 0.25; # MJPH 18-SEP-2001 problems in update of head +# $VERSION = 0.24; # MJPH 1-AUG-2001 Sort out update +# $VERSION = 0.23; # GST 30-MAY-2001 Memory leak fixed +# $VERSION = 0.22; # MJPH 09-APR-2001 Ensure all of AAT stuff included +# $VERSION = 0.21; # MJPH 23-MAR-2001 Improve Opentype support +# $VERSION = 0.20; # MJPH 13-JAN-2001 Add XML output and some of XML input, AAT & OT tables +# $VERSION = 0.19; # MJPH 29-SEP-2000 Add cmap::is_unicode, debug makefile.pl +# $VERSION = 0.18; # MJPH 21-JUL-2000 Debug Utils::TTF_bininfo +# $VERSION = 0.17; # MJPH 16-JUN-2000 Add utf8 support to names +# $VERSION = 0.16; # MJPH 26-APR-2000 Mark read tables as read, tidy up POD +# $VERSION = 0.15; # MJPH 5-FEB-2000 Ensure right versions released +# $VERSION = 0.14; # MJPH 11-SEP-1999 Sort out Unixisms, agian! +# $VERSION = 0.13; # MJPH 9-SEP-1999 Add empty, debug update_bbox +# $VERSION = 0.12; # MJPH 22-JUL-1999 Add update_bbox +# $VERSION = 0.11; # MJPH 7-JUL-1999 Don't store empties in cmaps +# $VERSION = 0.10; # MJPH 21-JUN-1999 Use IO::File +# $VERSION = 0.09; # MJPH 9-JUN-1999 Add 5.004 require, minor tweeks in cmap +# $VERSION = 0.08; # MJPH 19-MAY-1999 Sort out line endings for Unix +# $VERSION = 0.07; # MJPH 28-APR-1999 Get the regression tests to work +# $VERSION = 0.06; # MJPH 26-APR-1999 Start to add to CVS, correct MANIFEST.SKIP +# $VERSION = 0.05; # MJPH 13-APR-1999 See changes for 0.05 +# $VERSION = 0.04; # MJPH 13-MAR-1999 Tidy up Tarball +# $VERSION = 0.03; # MJPH 9-MAR-1999 Move to Font::TTF for CPAN +# $VERSION = 0.02; # MJPH 12-FEB-1999 Add support for ' nocsum' for DSIGS +# $VERSION = 0.0001; + +%tables = ( + 'table' => 'Font::TTF::Table', + 'EBDT' => 'Font::TTF::EBDT', + 'EBLC' => 'Font::TTF::EBLC', + 'Feat' => 'Font::TTF::GrFeat', + 'GDEF' => 'Font::TTF::GDEF', + 'GPOS' => 'Font::TTF::GPOS', + 'GSUB' => 'Font::TTF::GSUB', + 'LTSH' => 'Font::TTF::LTSH', + 'OS/2' => 'Font::TTF::OS_2', + 'PCLT' => 'Font::TTF::PCLT', + 'Sill' => 'Font::TTF::Sill', + 'bsln' => 'Font::TTF::Bsln', + 'cmap' => 'Font::TTF::Cmap', + 'cvt ' => 'Font::TTF::Cvt_', + 'fdsc' => 'Font::TTF::Fdsc', + 'feat' => 'Font::TTF::Feat', + 'fmtx' => 'Font::TTF::Fmtx', + 'fpgm' => 'Font::TTF::Fpgm', + 'glyf' => 'Font::TTF::Glyf', + 'hdmx' => 'Font::TTF::Hdmx', + 'head' => 'Font::TTF::Head', + 'hhea' => 'Font::TTF::Hhea', + 'hmtx' => 'Font::TTF::Hmtx', + 'kern' => 'Font::TTF::Kern', + 'loca' => 'Font::TTF::Loca', + 'maxp' => 'Font::TTF::Maxp', + 'mort' => 'Font::TTF::Mort', + 'name' => 'Font::TTF::Name', + 'post' => 'Font::TTF::Post', + 'prep' => 'Font::TTF::Prep', + 'prop' => 'Font::TTF::Prop', + 'vhea' => 'Font::TTF::Vhea', + 'vmtx' => 'Font::TTF::Vmtx', + ); + +# This is special code because I am fed up of every time I x a table in the debugger +# I get the whole font printed. Thus substitutes my 3 line change to dumpvar into +# the debugger. Clunky, but nice. You are welcome to a copy if you want one. + +BEGIN { + my ($p); + + foreach $p (@INC) + { + if (-f "$p/mydumpvar.pl") + { + $dumper = 'mydumpvar.pl'; + last; + } + } + $dumper ||= 'dumpvar.pl'; +} + +sub main::dumpValue +{ do $dumper; &main::dumpValue; } + + +=head2 Font::TTF::Font->AddTable($tablename, $class) + +Adds the given class to be used when representing the given table name. It also +'requires' the class for you. + +=cut + +sub AddTable +{ + my ($class, $table, $useclass) = @_; + + $tables{$table} = $useclass; +# $useclass =~ s|::|/|oig; +# require "$useclass.pm"; +} + + +=head2 Font::TTF::Font->Init + +For those people who like making fonts without reading them. This subroutine +will require all the table code for the various table types for you. Not +needed if using Font::TTF::Font::read before using a table. + +=cut + +sub Init +{ + my ($class) = @_; + my ($t); + + foreach $t (values %tables) + { + $t =~ s|::|/|oig; + require "$t.pm"; + } +} + +=head2 Font::TTF::Font->new(%props) + +Creates a new font object and initialises with the given properties. This is +primarily for use when a TTF is embedded somewhere. Notice that the properties +are automatically preceded by a space when inserted into the object. This is in +order that fields do not clash with tables. + +=cut + +sub new +{ + my ($class, %props) = @_; + my ($self) = {}; + + bless $self, $class; + + foreach (keys %props) + { $self->{" $_"} = $props{$_}; } + $self; +} + + +=head2 Font::TTF::Font->open($fname) + +Reads the header and directory for the given font file and creates appropriate +objects for each table in the font. + +=cut + +sub open +{ + my ($class, $fname) = @_; + my ($fh); + my ($self) = {}; + + unless (ref($fname)) + { + $fh = IO::File->new($fname) or return undef; + binmode $fh; + } else + { $fh = $fname; } + + $self->{' INFILE'} = $fh; + $self->{' fname'} = $fname; + $self->{' OFFSET'} = 0; + bless $self, $class; + + $self->read; +} + +=head2 $f->read + +Reads a Truetype font directory starting from the current location in the file. +This has been separated from the C function to allow support for embedded +TTFs for example in TTCs. Also reads the C and C tables immediately. + +=cut + +sub read +{ + my ($self) = @_; + my ($fh) = $self->{' INFILE'}; + my ($dat, $i, $ver, $dir_num, $type, $name, $check, $off, $len, $t); + + $fh->seek($self->{' OFFSET'}, 0); + $fh->read($dat, 12); + ($ver, $dir_num) = unpack("Nn", $dat); + $ver == 1 << 16 || $ver == unpack('N', 'OTTO') || $ver == 0x74727565 or return undef; # support Mac sfnts + + for ($i = 0; $i < $dir_num; $i++) + { + $fh->read($dat, 16) || die "Reading table entry"; + ($name, $check, $off, $len) = unpack("a4NNN", $dat); + $self->{$name} = $self->{' PARENT'}->find($self, $name, $check, $off, $len) && next + if (defined $self->{' PARENT'}); + $type = $tables{$name} || 'Font::TTF::Table'; + $t = $type; + if ($^O eq "MacOS") + { $t =~ s/^|::/:/oig; } + else + { $t =~ s|::|/|oig; } + require "$t.pm"; + $self->{$name} = $type->new(PARENT => $self, + NAME => $name, + INFILE => $fh, + OFFSET => $off, + LENGTH => $len, + CSUM => $check); + } + + foreach $t ('head', 'maxp') + { $self->{$t}->read if defined $self->{$t}; } + + $self; +} + + +=head2 $f->out($fname [, @tablelist]) + +Writes a TTF file consisting of the tables in tablelist. The list is checked to +ensure that only tables that exist are output. (This means that you can't have +non table information stored in the font object with key length of exactly 4) + +In many cases the user simply wants to output all the tables in alphabetical order. +This can be done by not including a @tablelist, in which case the subroutine will +output all the defined tables in the font in alphabetical order. + +Returns $f on success and undef on failure, including warnings. + +All output files must include the C table. + +=cut + +sub out +{ + my ($self, $fname, @tlist) = @_; + my ($fh); + my ($dat, $numTables, $sRange, $eSel); + my (%dir, $k, $mloc, $count); + my ($csum, $lsum, $msum, $loc, $oldloc, $len, $shift); + + unless (ref($fname)) + { + $fh = IO::File->new("+>$fname") || return warn("Unable to open $fname for writing"), undef; + binmode $fh; + } else + { $fh = $fname; } + + $self->{' oname'} = $fname; + $self->{' outfile'} = $fh; + + if ($self->{' wantsig'}) + { + $self->{' nocsum'} = 1; +# $self->{'head'}{'checkSumAdjustment'} = 0; + $self->{' tempDSIG'} = $self->{'DSIG'}; + $self->{' tempcsum'} = $self->{'head'}{' CSUM'}; + delete $self->{'DSIG'}; + @tlist = sort {$self->{$a}{' OFFSET'} <=> $self->{$b}{' OFFSET'}} + grep (length($_) == 4 && defined $self->{$_}, keys %$self) if ($#tlist < 0); + } + elsif ($#tlist < 0) + { @tlist = sort keys %$self; } + + @tlist = grep(length($_) == 4 && defined $self->{$_}, @tlist); + $numTables = $#tlist + 1; + $numTables++ if ($self->{' wantsig'}); + + ($numTables, $sRange, $eSel, $shift) = Font::TTF::Utils::TTF_bininfo($numTables, 16); + $dat = pack("Nnnnn", 1 << 16, $numTables, $sRange, $eSel, $shift); + $fh->print($dat); + $msum = unpack("%32N*", $dat); + +# reserve place holders for each directory entry + foreach $k (@tlist) + { + $dir{$k} = pack("A4NNN", $k, 0, 0, 0); + $fh->print($dir{$k}); + } + + $fh->print(pack('A4NNN', '', 0, 0, 0)) if ($self->{' wantsig'}); + + $loc = $fh->tell(); + if ($loc & 3) + { + $fh->print(substr("\000" x 4, $loc & 3)); + $loc += 4 - ($loc & 3); + } + + foreach $k (@tlist) + { + $oldloc = $loc; + $self->{$k}->out($fh); + $loc = $fh->tell(); + $len = $loc - $oldloc; + if ($loc & 3) + { + $fh->print(substr("\000" x 4, $loc & 3)); + $loc += 4 - ($loc & 3); + } + $fh->seek($oldloc, 0); + $csum = 0; $mloc = $loc; + while ($mloc > $oldloc) + { + $count = ($mloc - $oldloc > 4096) ? 4096 : $mloc - $oldloc; + $fh->read($dat, $count); + $csum += unpack("%32N*", $dat); +# this line ensures $csum stays within 32 bit bounds, clipping as necessary + if ($csum > 0xffffffff) { $csum -= 0xffffffff; $csum--; } + $mloc -= $count; + } + $dir{$k} = pack("A4NNN", $k, $csum, $oldloc, $len); + $msum += $csum + unpack("%32N*", $dir{$k}); + while ($msum > 0xffffffff) { $msum -= 0xffffffff; $msum--; } + $fh->seek($loc, 0); + } + + unless ($self->{' nocsum'}) # assuming we want a file checksum + { +# Now we need to sort out the head table's checksum + if (!defined $dir{'head'}) + { # you have to have a head table + $fh->close(); + return warn("No 'head' table to output in $fname"), undef; + } + ($csum, $loc, $len) = unpack("x4NNN", $dir{'head'}); + $fh->seek($loc + 8, 0); + $fh->read($dat, 4); + $lsum = unpack("N", $dat); + if ($lsum != 0) + { + $csum -= $lsum; + if ($csum < 0) { $csum += 0xffffffff; $csum++; } + $msum -= $lsum * 2; # twice (in head and in csum) + while ($msum < 0) { $msum += 0xffffffff; $msum++; } + } + $lsum = 0xB1B0AFBA - $msum; + $fh->seek($loc + 8, 0); + $fh->print(pack("N", $lsum)); + $dir{'head'} = pack("A4NNN", 'head', $csum, $loc, $len); + } elsif ($self->{' wantsig'}) + { + if (!defined $dir{'head'}) + { # you have to have a head table + $fh->close(); + return warn("No 'head' table to output in $fname"), undef; + } + ($csum, $loc, $len) = unpack("x4NNN", $dir{'head'}); + $fh->seek($loc + 8, 0); + $fh->print(pack("N", 0)); +# $dir{'head'} = pack("A4NNN", 'head', $self->{' tempcsum'}, $loc, $len); + } + +# Now we can output the directory again + if ($self->{' wantsig'}) + { @tlist = sort @tlist; } + $fh->seek(12, 0); + foreach $k (@tlist) + { $fh->print($dir{$k}); } + $fh->print(pack('A4NNN', '', 0, 0, 0)) if ($self->{' wantsig'}); + $fh->close(); + $self; +} + + +=head2 $f->out_xml($filename [, @tables]) + +Outputs the font in XML format + +=cut + +sub out_xml +{ + my ($self, $fname, @tlist) = @_; + my ($fh, $context, $numTables, $k); + + $context->{'indent'} = ' ' x 4; + + unless (ref($fname)) + { + $fh = IO::File->new("+>$fname") || return warn("Unable to open $fname"), undef; + binmode $fh; + } else + { $fh = $fname; } + + unless (scalar @tlist > 0) + { + @tlist = sort keys %$self; + @tlist = grep(length($_) == 4 && defined $self->{$_}, @tlist); + } + $numTables = $#tlist + 1; + + $context->{'fh'} = $fh; + $fh->print("\n"); + $fh->print("\n\n"); + + foreach $k (@tlist) + { + $fh->print("
    \n"); + $self->{$k}->out_xml($context, $context->{'indent'}); + $fh->print("
    \n"); + } + + $fh->print("\n"); + $fh->close; + $self; +} + + +=head2 $f->XML_start($context, $tag, %attrs) + +Handles start messages from the XML parser. Of particular interest to us are and +. + +=cut + +sub XML_start +{ + my ($self, $context, $tag, %attrs) = @_; + my ($name, $type, $t); + + if ($tag eq 'font') + { $context->{'tree'}[-1] = $self; } + elsif ($tag eq 'table') + { + $name = $attrs{'name'}; + unless (defined $self->{$name}) + { + $type = $tables{$name} || 'Font::TTF::Table'; + $t = $type; + if ($^O eq "MacOS") + { $t =~ s/^|::/:/oig; } + else + { $t =~ s|::|/|oig; } + require "$t.pm"; + $self->{$name} = $type->new('PARENT' => $self, 'NAME' => $name, 'read' => 1); + } + $context->{'receiver'} = ($context->{'tree'}[-1] = $self->{$name}); + } + $context; +} + + +sub XML_end +{ + my ($self) = @_; + my ($context, $tag, %attrs) = @_; + my ($i); + + return undef unless ($tag eq 'table' && $attrs{'name'} eq 'loca'); + if (defined $context->{'glyphs'} && $context->{'glyphs'} ne $self->{'loca'}{'glyphs'}) + { + for ($i = 0; $i <= $#{$context->{'glyphs'}}; $i++) + { $self->{'loca'}{'glyphs'}[$i] = $context->{'glyphs'}[$i] if defined $context->{'glyphs'}[$i]; } + $context->{'glyphs'} = $self->{'loca'}{'glyphs'}; + } + return undef; +} + +=head2 $f->update + +Sends update to all the tables in the font and then resets all the isDirty +flags on each table. The data structure in now consistent as a font (we hope). + +=cut + +sub update +{ + my ($self) = @_; + + $self->tables_do(sub { $_[0]->update; }); + + $self; +} + +=head2 $f->dirty + +Dirties all the tables in the font + +=cut + +sub dirty +{ $_[0]->tables_do(sub { $_[0]->dirty; }); $_[0]; } + +=head2 $f->tables_do(&func [, tables]) + +Calls &func for each table in the font. Calls the table in alphabetical sort +order as per the order in the directory: + + &func($table, $name); + +May optionally take a list of table names in which case func is called +for each of them in the given order. +=cut + +sub tables_do +{ + my ($self, $func, @tables) = @_; + my ($t); + + foreach $t (@tables ? @tables : sort grep {length($_) == 4} keys %$self) + { &$func($self->{$t}, $t); } + $self; +} + + +=head2 $f->release + +Releases ALL of the memory used by the TTF font and all of its component +objects. After calling this method, do B expect to have anything left in +the C object. + +B, that it is important that you call this method on any +C object when you wish to destruct it and free up its memory. +Internally, we track things in a structure that can result in circular +references, and without calling 'C' these will not properly get +cleaned up by Perl. Once you've called this method, though, don't expect to be +able to do anything else with the C object; it'll have B +internal state whatsoever. + +B As part of the brute-force cleanup done here, this method +will throw a warning message whenever unexpected key values are found within +the C object. This is done to help ensure that any unexpected +and unfreed values are brought to your attention so that you can bug us to keep +the module updated properly; otherwise the potential for memory leaks due to +dangling circular references will exist. + +=cut + +sub release +{ + my ($self) = @_; + +# delete stuff that we know we can, here + + my @tofree = map { delete $self->{$_} } keys %{$self}; + + while (my $item = shift @tofree) + { + my $ref = ref($item); + if (UNIVERSAL::can($item, 'release')) + { $item->release(); } + elsif ($ref eq 'ARRAY') + { push( @tofree, @{$item} ); } + elsif (UNIVERSAL::isa($ref, 'HASH')) + { release($item); } + } + +# check that everything has gone - it better had! + foreach my $key (keys %{$self}) + { warn ref($self) . " still has '$key' key left after release.\n"; } +} + +1; + +=head1 BUGS + +Bugs abound aplenty I am sure. There is a lot of code here and plenty of scope. +The parts of the code which haven't been implemented yet are: + +=over 4 + +=item Post + +Version 4 format types are not supported yet. + +=item Cmap + +Format type 2 (MBCS) has not been implemented yet and therefore may cause +somewhat spurious results for this table type. + +=item Kern + +Only type 0 & type 2 tables are supported (type 1 & type 3 yet to come). + +=item TTC + +The current Font::TTF::Font::out method does not support the writing of TrueType +Collections. + +=back + +In addition there are weaknesses or features of this module library + +=over 4 + +=item * + +There is very little (or no) error reporting. This means that if you have +garbled data or garbled data structures, then you are liable to generate duff +fonts. + +=item * + +The exposing of the internal data structures everywhere means that doing +radical re-structuring is almost impossible. But it stop the code from becoming +ridiculously large. + +=back + +Apart from these, I try to keep the code in a state of "no known bugs", which +given the amount of testing this code has had, is not a guarantee of high +quality, yet. + +For more details see the appropriate class files. + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org + +Copyright Martin Hosken 1998. + +No warranty or expression of effectiveness, least of all regarding anyone's +safety, is implied in this software or documentation. + +=head2 Licensing + +The Perl TTF module is licensed under the Perl Artistic License. + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Fpgm.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Fpgm.pm new file mode 100644 index 0000000..4cc7709 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Fpgm.pm @@ -0,0 +1,87 @@ +package Font::TTF::Fpgm; + +=head1 NAME + +Font::TTF::Fpgm - Font program in a TrueType font. Called when a font is loaded + +=head1 DESCRIPTION + +This is a minimal class adding nothing beyond a table, but is a repository +for fpgm type information for those processes brave enough to address hinting. + +=cut + +use strict; +use vars qw(@ISA $VERSION); + +@ISA = qw(Font::TTF::Table); + +$VERSION = 0.0001; + +=head2 $t->read + +Reading this table is simply a process of reading all the data into the RAM +copy. Nothing more is done with it. + +=cut + +sub read +{ + $_[0]->read_dat; + $_[0]->{' read'} = 1; +} + +=head2 $t->out_xml($context, $depth) + +Outputs Fpgm program as XML + +=cut + +sub out_xml +{ + my ($self, $context, $depth) = @_; + my ($fh) = $context->{'fh'}; + my ($dat); + + $self->read; + $dat = Font::TTF::Utils::XML_binhint($self->{' dat'}); + $dat =~ s/\n(?!$)/\n$depth$context->{'indent'}/omg; + $fh->print("$depth\n"); + $fh->print("$depth$context->{'indent'}$dat"); + $fh->print("$depth\n"); + $self; +} + + +=head2 $t->XML_end($context, $tag, %attrs) + +Parse all that hinting code + +=cut + +sub XML_end +{ + my ($self) = shift; + my ($context, $tag, %attrs) = @_; + + if ($tag eq 'code') + { + $self->{' dat'} = Font::TTF::Utils::XML_hintbin($context->{'text'}); + return $context; + } else + { return $self->SUPER::XML_end(@_); } +} + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/GDEF.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/GDEF.pm new file mode 100644 index 0000000..9519ee8 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/GDEF.pm @@ -0,0 +1,313 @@ +package Font::TTF::GDEF; + +=head1 NAME + +Font::TTF::GDEF - Opentype GDEF table support + +=head1 DESCRIPTION + +The GDEF table contains various global lists of information which are apparantly +used in other places in an OpenType renderer. But precisely where is open to +speculation... + +=head1 INSTANCE VARIABLES + +There are 4 tables in the GDEF table, each with their own structure: + +=over 4 + +=item GLYPH + +This is an L Class Definition table containing information +as to what type each glyph is. + +=item ATTACH + +The attach table consists of a coverage table and then attachment points for +each glyph in the coverage table: + +=over 8 + +=item COVERAGE + +This is a coverage table + +=item POINTS + +This is an array of point elements. Each element is an array of curve points +corresponding to the attachment points on that glyph. The order of the curve points +in the array corresponds to the attachment point number specified in the MARKS +coverage table (see below). + +=back + +=item LIG + +This contains the ligature caret positioning information for ligature glyphs + +=over 8 + +=item COVERAGE + +A coverage table to say which glyphs are ligatures + +=item LIGS + +An array of elements for each ligature. Each element is an array of information +for each caret position in the ligature (there being number of components - 1 of +these, generally) + +=over 12 + +=item FMT + +This is the format of the information and is important to provide the semantics +for the value. This value must be set correctly before output + +=item VAL + +The value which has meaning according to FMT + +=item DEVICE + +For FMT = 3, a device table is also referenced which is stored here + +=back + +=back + +=item MARKS + +Due to confusion in the GDEF specification, this field is currently withdrawn until +the confusion is resolved. That way, perhaps this stuff will work! + +This class definition table stores the mark attachment point numbers for each +attachment mark, to indicate which attachment point the mark attaches to on its +base glyph. + +=back + + +=head1 METHODS + +=cut + +use strict; +use Font::TTF::Table; +use Font::TTF::Utils; +use Font::TTF::Ttopen; +use vars qw(@ISA $new_gdef); + +@ISA = qw(Font::TTF::Table); +$new_gdef = 1; + +=head2 $t->read + +Reads the table into the data structure + +=cut + +sub read +{ + my ($self) = @_; + my ($fh) = $self->{' INFILE'}; + my ($boff) = $self->{' OFFSET'}; + my ($dat, $goff, $loff, $aoff, $moff, $r, $s, $bloc); + + $self->SUPER::read or return $self; + $bloc = $fh->tell(); + if ($new_gdef) + { + $fh->read($dat, 12); + ($self->{'Version'}, $goff, $aoff, $loff, $moff) = TTF_Unpack('fS4', $dat); + } + else + { + $fh->read($dat, 10); + ($self->{'Version'}, $goff, $aoff, $loff) = TTF_Unpack('fS3', $dat); + } + + if ($goff > 0) + { + $fh->seek($goff + $boff, 0); + $self->{'GLYPH'} = Font::TTF::Coverage->new(0)->read($fh); + } + + if ($new_gdef && $moff > 0 && $moff < $self->{' LENGTH'}) + { + $fh->seek($moff + $boff, 0); + $self->{'MARKS'} = Font::TTF::Coverage->new(0)->read($fh); + } + + if ($aoff > 0) + { + my ($off, $gcount, $pcount); + + $fh->seek($aoff + $boff, 0); + $fh->read($dat, 4); + ($off, $gcount) = TTF_Unpack('SS', $dat); + $fh->read($dat, $gcount << 1); + + $fh->seek($aoff + $boff + $off, 0); + $self->{'ATTACH'}{'COVERAGE'} = Font::TTF::Coverage->new(1)->read($fh); + + foreach $r (TTF_Unpack('S*', $dat)) + { + unless ($r) + { + push (@{$self->{'ATTACH'}{'POINTS'}}, []); + next; + } + $fh->seek($aoff + $boff + $r, 0); + $fh->read($dat, 2); + $pcount = TTF_Unpack('S', $dat); + $fh->read($dat, $pcount << 1); + push (@{$self->{'ATTACH'}{'POINTS'}}, [TTF_Unpack('S*', $dat)]); + } + } + + if ($loff > 0) + { + my ($lcount, $off, $ccount, $srec, $comp); + + $fh->seek($loff + $boff, 0); + $fh->read($dat, 4); + ($off, $lcount) = TTF_Unpack('SS', $dat); + $fh->read($dat, $lcount << 1); + + $fh->seek($off + $loff + $boff, 0); + $self->{'LIG'}{'COVERAGE'} = Font::TTF::Coverage->new(1)->read($fh); + + foreach $r (TTF_Unpack('S*', $dat)) + { + $fh->seek($r + $loff + $boff, 0); + $fh->read($dat, 2); + $ccount = TTF_Unpack('S', $dat); + $fh->read($dat, $ccount << 1); + + $srec = []; + foreach $s (TTF_Unpack('S*', $dat)) + { + $comp = {}; + $fh->seek($s + $r + $loff + $boff, 0); + $fh->read($dat, 4); + ($comp->{'FMT'}, $comp->{'VAL'}) = TTF_Unpack('S*', $dat); + if ($comp->{'FMT'} == 3) + { + $fh->read($dat, 2); + $off = TTF_Unpack('S', $dat); + if (defined $self->{' CACHE'}{$off + $s + $r}) + { $comp->{'DEVICE'} = $self->{' CACHE'}{$off + $s + $r}; } + else + { + $fh->seek($off + $s + $r + $loff + $boff, 0); + $comp->{'DEVICE'} = Font::TTF::Delta->new->read($fh); + $self->{' CACHE'}{$off + $s + $r} = $comp->{'DEVICE'}; + } + } + push (@$srec, $comp); + } + push (@{$self->{'LIG'}{'LIGS'}}, $srec); + } + } + + $self; +} + + +=head2 $t->out($fh) + +Writes out this table. + +=cut + +sub out +{ + my ($self, $fh) = @_; + my ($goff, $aoff, $loff, $moff, @offs, $loc1, $coff, $loc); + + return $self->SUPER::out($fh) unless $self->{' read'}; + + $loc = $fh->tell(); + if ($new_gdef) + { $fh->print(TTF_Pack('fSSSS', $self->{'Version'}, 0, 0, 0, 0)); } + else + { $fh->print(TTF_Pack('fSSS', $self->{'Version'}, 0, 0, 0)); } + + if (defined $self->{'GLYPH'}) + { + $goff = $fh->tell() - $loc; + $self->{'GLYPH'}->out($fh); + } + + if (defined $self->{'ATTACH'}) + { + my ($r); + + $aoff = $fh->tell() - $loc; + $fh->print(pack('n*', (0) x ($#{$self->{'ATTACH'}{'POINTS'}} + 3))); + foreach $r (@{$self->{'ATTACH'}{'POINTS'}}) + { + push (@offs, $fh->tell() - $loc - $aoff); + $fh->print(pack('n*', $#{$r} + 1, @$r)); + } + $coff = $fh->tell() - $loc - $aoff; + $self->{'ATTACH'}{'COVERAGE'}->out($fh); + $loc1 = $fh->tell(); + $fh->seek($aoff + $loc, 0); + $fh->print(pack('n*', $coff, $#offs + 1, @offs)); + $fh->seek($loc1, 0); + } + + if (defined $self->{'LIG'}) + { + my (@reftables, $ltables, $i, $j, $out, $r, $s); + + $ltables = {}; + $loff = $fh->tell() - $loc; + $out = pack('n*', + Font::TTF::Ttopen::ref_cache($self->{'LIG'}{'COVERAGE'}, $ltables, 0), + $#{$self->{'LIG'}{'LIGS'}} + 1, + (0) x ($#{$self->{'LIG'}{'LIGS'}} + 1)); + push (@reftables, [$ltables, 0]); + $i = 0; + foreach $r (@{$self->{'LIG'}{'LIGS'}}) + { + $ltables = {}; + $loc1 = length($out); + substr($out, ($i << 1) + 4, 2) = TTF_Pack('S', $loc1); + $out .= pack('n*', $#{$r} + 1, (0) x ($#{$r} + 1)); + @offs = (); $j = 0; + foreach $s (@$r) + { + substr($out, ($j << 1) + 2 + $loc1, 2) = + TTF_Pack('S', length($out) - $loc1); + $out .= TTF_Pack('SS', $s->{'FMT'}, $s->{'VAL'}); + $out .= pack('n', Font::TTF::Ttopen::ref_cache($s->{'DEVICE'}, + $ltables, length($out))) if ($s->{'FMT'} == 3); + $j++; + } + push (@reftables, [$ltables, $loc1]); + $i++; + } + Font::TTF::Ttopen::out_final($fh, $out, \@reftables); + } + + if ($new_gdef && defined $self->{'MARKS'}) + { + $moff = $fh->tell() - $loc; + $self->{'MARKS'}->out($fh); + } + + $loc1 = $fh->tell(); + $fh->seek($loc + 4, 0); + if ($new_gdef) + { $fh->print(TTF_Pack('S4', $goff, $aoff, $loff, $moff)); } + else + { $fh->print(TTF_Pack('S3', $goff, $aoff, $loff)); } + $fh->seek($loc1, 0); + $self; +} + +1; + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/GPOS.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/GPOS.pm new file mode 100644 index 0000000..8e8b7ce --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/GPOS.pm @@ -0,0 +1,701 @@ +package Font::TTF::GPOS; + +=head1 NAME + +Font::TTF::GPOS - Support for Opentype GPOS tables in conjunction with TTOpen + +=head1 DESCRIPTION + +The GPOS table is one of the most complicated tables in the TTF spec and the +corresponding data structure abstraction is also not trivial. While much of the +structure of a GPOS is shared with a GSUB table via the L + +=head1 INSTANCE VARIABLES + +Here we describe the additions and lookup specific information for GPOS tables. +Unfortunately there is no one abstraction which seems to work comfortable for +all GPOS tables, so we will also examine how the variables are used for different +lookup types. + +The following are the values allowed in the ACTION_TYPE and MATCH_TYPE variables: + +=over 4 + +=item ACTION_TYPE + +This can take any of the following values + +=over 8 + +=item a + +The ACTION is an array of anchor tables + +=item o + +Offset. There is no RULE array. The ADJUST variable contains a value record (see +later in this description) + +=item v + +The ACTION is a value record. + +=item p + +Pair adjustment. The ACTION contains an array of two value records for the matched +two glyphs. + +=item e + +Exit and Entry records. The ACTION contains an array of two anchors corresponding +to the exit and entry anchors for the glyph. + +=item l + +Indicates a lookup based contextual rule as per the GSUB table. + +=back + +=item MATCH_TYPE + +This can take any of the following values + +=over 8 + +=item g + +A glyph array + +=item c + +An array of class values + +=item o + +An array of coverage tables + +=back + +=back + +The following variables are added for Attachment Positioning Subtables: + +=over 4 + +=item MATCH + +This contains an array of glyphs to match against for all RULES. It is much like +having the same MATCH string in all RULES. In the cases it is used so far, it only +ever contains one element. + +=item MARKS + +This contains a Mark array consisting of each element being a subarray of two +elements: + +=over 8 + +=item CLASS + +The class that this mark uses on its base + +=item ANCHOR + +The anchor with which to attach this mark glyph + +=back + +The base table for mark to base, ligature or mark attachment positioning is +structured with the ACTION containing an array of anchors corresponding to each +attachment class. For ligatures, there is more than one RULE in the RULE array +corresponding to each glyph in the coverage table. + +=back + +Other variables which are provided for informational purposes are: + +=over 4 + +=item VFMT + +Value format for the adjustment of the glyph matched by the coverage table. + +=item VFMT2 + +Value format used in pair adjustment for the second glyph in the pair + +=back + +=head2 Value Records + +There is a subtype used in GPOS tables called a value record. It is used to adjust +the position of a glyph from its default position. The value record is variable +length with a bitfield at the beginning to indicate which of the following +entries are included. The bitfield is not stored since it is recalculated at +write time. + +=over 4 + +=item XPlacement + +Horizontal adjustment for placement (not affecting other unattached glyphs) + +=item YPlacement + +Vertical adjustment for placement (not affecting other unattached glyphs) + +=item XAdvance + +Adjust the advance width glyph (used only in horizontal writing systems) + +=item YAdvance + +Adjust the vertical advance (used only in vertical writing systems) + +=item XPlaDevice + +Device table for device specific adjustment of horizontal placement + +=item YPlaDevice + +Device table for device specific adjustment of vertical placement + +=item XAdvDevice + +Device table for device specific adjustment of horizontal advance + +=item YAdDevice + +Device table for device specific adjustment of vertical advance + +=item XIdPlacement + +Horizontal placement metric id (for Multiple Master fonts - but that's all I know!) + +=item YIdPlacement + +Vertical placement metric id + +=item XIdAdvance + +Horizontal advance metric id + +=item YIdAdvance + +Vertical advance metric id + +=back + +=head1 CORRESPONDANCE TO LAYOUT TYPES + +Here is what is stored in the ACTION_TYPE and MATCH_TYPE for each of the known +GPOS subtable types: + + 1.1 1.2 2.1 2.2 3 4 5 6 7.1 7.2 7.3 8.1 8.2 8.3 + ACTION_TYPE o v p p e a a a l l l l l l + MATCH_TYPE g c g c o g c o + + +=head1 METHODS + +=cut + +use strict; +use Font::TTF::Ttopen; +use Font::TTF::Delta; +use Font::TTF::Anchor; +use Font::TTF::Utils; +use vars qw(@ISA); + +@ISA = qw(Font::TTF::Ttopen); + + +=head2 read_sub + +Reads the subtable into the data structures + +=cut + +sub read_sub +{ + my ($self, $fh, $main_lookup, $sindex) = @_; + my ($type) = $main_lookup->{'TYPE'}; + my ($loc) = $fh->tell(); + my ($lookup) = $main_lookup->{'SUB'}[$sindex]; + my ($dat, $mcount, $scount, $i, $j, $count, $fmt, $fmt2, $cover, $srec, $subst); + my ($c1, $c2, $s, $moff, $boff); + + + if ($type == 8) + { + $fh->read($dat, 4); + ($fmt, $cover) = TTF_Unpack('S2', $dat); + if ($fmt < 3) + { + $fh->read($dat, 2); + $count = TTF_Unpack('S', $dat); + } + } else + { + $fh->read($dat, 6); + ($fmt, $cover, $count) = TTF_Unpack("S3", $dat); + } + unless ($fmt == 3 && ($type == 7 || $type == 8)) + { $lookup->{'COVERAGE'} = $self->read_cover($cover, $loc, $lookup, $fh, 1); } + + $lookup->{'FORMAT'} = $fmt; + if ($type == 1 && $fmt == 1) + { + $lookup->{'VFMT'} = $count; + $lookup->{'ADJUST'} = $self->read_value($count, $loc, $lookup, $fh); + $lookup->{'ACTION_TYPE'} = 'o'; + } elsif ($type == 1 && $fmt == 2) + { + $lookup->{'VFMT'} = $count; + $fh->read($dat, 2); + $mcount = unpack('n', $dat); + for ($i = 0; $i < $mcount; $i++) + { push (@{$lookup->{'RULES'}}, [{'ACTION' => + [$self->read_value($count, $loc, $lookup, $fh)]}]); } + $lookup->{'ACTION_TYPE'} = 'v'; + } elsif ($type == 2 && $fmt == 1) + { + $lookup->{'VFMT'} = $count; + $fh->read($dat, 4); + ($fmt2, $mcount) = unpack('n2', $dat); + $lookup->{'VFMT2'} = $fmt2; + $fh->read($dat, $mcount << 1); + foreach $s (unpack('n*', $dat)) + { + $fh->seek($loc + $s, 0); + $fh->read($dat, 2); + $scount = TTF_Unpack('S', $dat); + $subst = []; + for ($i = 0; $i < $scount; $i++) + { + $srec = {}; + $fh->read($dat, 2); + $srec->{'MATCH'} = [TTF_Unpack('S', $dat)]; + $srec->{'ACTION'} = [$self->read_value($count, $loc, $lookup, $fh), + $self->read_value($fmt2, $loc, $lookup, $fh)]; + push (@$subst, $srec); + } + push (@{$lookup->{'RULES'}}, $subst); + } + $lookup->{'ACTION_TYPE'} = 'p'; + $lookup->{'MATCH_TYPE'} = 'g'; + } elsif ($type == 2 && $fmt == 2) + { + $fh->read($dat, 10); + ($lookup->{'VFMT2'}, $c1, $c2, $mcount, $scount) = TTF_Unpack('S*', $dat); + $lookup->{'CLASS'} = $self->read_cover($c1, $loc, $lookup, $fh, 0); + $lookup->{'MATCH'} = [$self->read_cover($c2, $loc, $lookup, $fh, 0)]; + $lookup->{'VFMT'} = $count; + for ($i = 0; $i < $mcount; $i++) + { + $subst = []; + for ($j = 0; $j < $scount; $j++) + { + $srec = {}; + $srec->{'ACTION'} = [$self->read_value($lookup->{'VFMT'}, $loc, $lookup, $fh), + $self->read_value($lookup->{'VFMT2'}, $loc, $lookup, $fh)]; + push (@$subst, $srec); + } + push (@{$lookup->{'RULES'}}, $subst); + } + $lookup->{'ACTION_TYPE'} = 'p'; + $lookup->{'MATCH_TYPE'} = 'c'; + } elsif ($type == 3 && $fmt == 1) + { + $fh->read($dat, $count << 2); + for ($i = 0; $i < $count; $i++) + { push (@{$lookup->{'RULES'}}, [{'ACTION' => + [$self->read_anchor(TTF_Unpack('S', substr($dat, $i << 2, 2)), + $loc, $lookup, $fh), + $self->read_anchor(TTF_Unpack('S', substr($dat, ($i << 2) + 2, 2)), + $loc, $lookup, $fh)]}]); } + $lookup->{'ACTION_TYPE'} = 'e'; + } elsif ($type == 4 || $type == 5 || $type == 6) + { + my (@offs, $mloc, $thisloc, $ncomp, $k); + + $lookup->{'MATCH'} = [$lookup->{'COVERAGE'}]; + $lookup->{'COVERAGE'} = $self->read_cover($count, $loc, $lookup, $fh, 1); + $fh->read($dat, 6); + ($mcount, $moff, $boff) = TTF_Unpack('S*', $dat); + $fh->seek($loc + $moff, 0); + $fh->read($dat, 2); + $count = TTF_Unpack('S', $dat); + for ($i = 0; $i < $count; $i++) + { + $fh->read($dat, 4); + push (@{$lookup->{'MARKS'}}, [TTF_Unpack('S', $dat), + $self->read_anchor(TTF_Unpack('S', substr($dat, 2, 2)) + $moff, + $loc, $lookup, $fh)]); + } + $fh->seek($loc + $boff, 0); + $fh->read($dat, 2); + $count = TTF_Unpack('S', $dat); + $mloc = $fh->tell() - 2; + $thisloc = $mloc; + if ($type == 5) + { + $fh->read($dat, $count << 1); + @offs = TTF_Unpack('S*', $dat); + } + for ($i = 0; $i < $count; $i++) + { + if ($type == 5) + { + $thisloc = $mloc + $offs[$i]; + $fh->seek($thisloc, 0); + $fh->read($dat, 2); + $ncomp = TTF_Unpack('S', $dat); + } else + { $ncomp = 1; } + for ($j = 0; $j < $ncomp; $j++) + { + $subst = []; + $fh->read($dat, $mcount << 1); + for ($k = 0; $k < $mcount; $k++) + { push (@$subst, $self->read_anchor(TTF_Unpack('S', substr($dat, $k << 1, 2)) + $thisloc - $loc, + $loc, $lookup, $fh)); } + + push (@{$lookup->{'RULES'}[$i]}, {'ACTION' => $subst}); + } + } + $lookup->{'ACTION_TYPE'} = 'a'; + } elsif ($type == 7 || $type == 8) + { $self->read_context($lookup, $fh, $type - 2, $fmt, $cover, $count, $loc); } + $lookup; +} + + +=head2 $t->extension + +Returns the table type number for the extension table + +=cut + +sub extension +{ return 9; } + + +=head2 $t->out_sub + +Outputs the subtable to the given filehandle + +=cut + +sub out_sub +{ + my ($self, $fh, $main_lookup, $index, $ctables, $base) = @_; + my ($type) = $main_lookup->{'TYPE'}; + my ($lookup) = $main_lookup->{'SUB'}[$index]; + my ($fmt) = $lookup->{'FORMAT'}; + my ($out, $r, $s, $t, $i, $j, $vfmt, $vfmt2, $loc1); + my ($num) = $#{$lookup->{'RULES'}} + 1; + my ($mtables) = {}; + my (@reftables); + + if ($type == 1 && $fmt == 1) + { + $out = pack('n2', $fmt, Font::TTF::Ttopen::ref_cache($lookup->{'COVERAGE'}, $ctables, 2 + $base)); + $vfmt = $self->fmt_value($lookup->{'ADJUST'}); + $out .= pack('n', $vfmt) . $self->out_value($lookup->{'ADJUST'}, $vfmt, $ctables, 6 + $base); + } elsif ($type == 1 && $fmt == 2) + { + $vfmt = 0; + foreach $r (@{$lookup->{'RULES'}}) + { $vfmt |= $self->fmt_value($r->[0]{'ACTION'}[0]); } + $out = pack('n4', $fmt, Font::TTF::Ttopen::ref_cache($lookup->{'COVERAGE'}, $ctables, 2 + $base), + $vfmt, $#{$lookup->{'RULES'}} + 1); + foreach $r (@{$lookup->{'RULES'}}) + { $out .= $self->out_value($r->[0]{'ACTION'}[0], $vfmt, $ctables, length($out) + $base); } + } elsif ($type == 2 && $fmt < 3) + { + $vfmt = 0; + $vfmt2 = 0; + foreach $r (@{$lookup->{'RULES'}}) + { + foreach $t (@$r) + { + $vfmt |= $self->fmt_value($t->{'ACTION'}[0]); + $vfmt2 |= $self->fmt_value($t->{'ACTION'}[1]); + } + } + if ($fmt == 1) + { + # start PairPosFormat1 subtable + $out = pack('n5', + $fmt, + Font::TTF::Ttopen::ref_cache($lookup->{'COVERAGE'}, $ctables, 2 + $base), + $vfmt, + $vfmt2, + $#{$lookup->{'RULES'}} + 1); # PairSetCount + my $off = 0; + $off += length($out); + $off += 2 * ($#{$lookup->{'RULES'}} + 1); # there will be PairSetCount offsets here + my $pairsets = ''; + my (%cache); + foreach $r (@{$lookup->{'RULES'}}) # foreach PairSet table + { + # write offset to this PairSet at end of PairPosFormat1 table + if (defined $cache{"$r"}) + { $out .= pack('n', $cache{"$r"}); } + else + { + $out .= pack('n', $off); + $cache{"$r"} = $off; + + # generate PairSet itself (using $off as eventual offset within PairPos subtable) + my $pairset = pack('n', $#{$r} + 1); # PairValueCount + foreach $t (@$r) # foreach PairValueRecord + { + $pairset .= pack('n', $t->{'MATCH'}[0]); # SecondGlyph - MATCH has only one entry + $pairset .= + $self->out_value($t->{'ACTION'}[0], $vfmt, $ctables, $off + length($pairset) + $base); + $pairset .= + $self->out_value($t->{'ACTION'}[1], $vfmt2, $ctables, $off + length($pairset) + $base); + } + $off += length($pairset); + $pairsets .= $pairset; + } + } + $out .= $pairsets; + die "internal error: PairPos size not as calculated" if (length($out) != $off); + } else + { + $out = pack('n8', $fmt, Font::TTF::Ttopen::ref_cache($lookup->{'COVERAGE'}, $ctables, 2 + $base), + $vfmt, $vfmt2, + Font::TTF::Ttopen::ref_cache($lookup->{'CLASS'}, $ctables, 8 + $base), + Font::TTF::Ttopen::ref_cache($lookup->{'MATCH'}[0], $ctables, 10 + $base), + $lookup->{'CLASS'}{'max'} + 1, $lookup->{'MATCH'}[0]{'max'} + 1); + + for ($i = 0; $i <= $lookup->{'CLASS'}{'max'}; $i++) + { + for ($j = 0; $j <= $lookup->{'MATCH'}[0]{'max'}; $j++) + { + $out .= $self->out_value($lookup->{'RULES'}[$i][$j]{'ACTION'}[0], $vfmt, $ctables, length($out) + $base); + $out .= $self->out_value($lookup->{'RULES'}[$i][$j]{'ACTION'}[1], $vfmt2, $ctables, length($out) + $base); + } + } + } + } elsif ($type == 3 && $fmt == 1) + { + $out = pack('n3', $fmt, Font::TTF::Ttopen::ref_cache($lookup->{'COVERAGE'}, $ctables, 2 + $base), + $#{$lookup->{'RULES'}} + 1); + foreach $r (@{$lookup->{'RULES'}}) + { + $out .= pack('n2', Font::TTF::Ttopen::ref_cache($r->[0]{'ACTION'}[0], $ctables, length($out) + $base), + Font::TTF::Ttopen::ref_cache($r->[0]{'ACTION'}[1], $ctables, length($out) + 2 + $base)); + } + } elsif ($type == 4 || $type == 5 || $type == 6) + { + my ($loc_off, $loc_t, $ltables); + + $out = pack('n7', $fmt, Font::TTF::Ttopen::ref_cache($lookup->{'MATCH'}[0], $ctables, 2 + $base), + Font::TTF::Ttopen::ref_cache($lookup->{'COVERAGE'}, $ctables, 4 + $base), + $#{$lookup->{'RULES'}[0][0]{'ACTION'}} + 1, 12, ($#{$lookup->{'MARKS'}} + 4) << 2, + $#{$lookup->{'MARKS'}} + 1); + foreach $r (@{$lookup->{'MARKS'}}) + { $out .= pack('n2', $r->[0], Font::TTF::Ttopen::ref_cache($r->[1], $mtables, length($out) + 2)); } + push (@reftables, [$mtables, 12]); + + $loc_t = length($out); + substr($out, 10, 2) = pack('n', $loc_t); + $out .= pack('n', $#{$lookup->{'RULES'}} + 1); + if ($type == 5) + { + $loc1 = length($out); + $out .= pack('n*', (0) x ($#{$lookup->{'RULES'}} + 1)); + } + $ltables = {}; + for ($i = 0; $i <= $#{$lookup->{'RULES'}}; $i++) + { + if ($type == 5) + { + $ltables = {}; + $loc_t = length($out); + substr($out, $loc1 + ($i << 1), 2) = TTF_Pack('S', $loc_t - $loc1 + 2); + } + + $r = $lookup->{'RULES'}[$i]; + $out .= pack('n', $#{$r} + 1) if ($type == 5); + foreach $t (@$r) + { + foreach $s (@{$t->{'ACTION'}}) + { $out .= pack('n', Font::TTF::Ttopen::ref_cache($s, $ltables, length($out))); } + } + push (@reftables, [$ltables, $loc_t]) if ($type == 5); + } + push (@reftables, [$ltables, $loc_t]) unless ($type == 5); + $out = Font::TTF::Ttopen::out_final($fh, $out, \@reftables, 1); + } elsif ($type == 7 || $type == 8) + { $out = $self->out_context($lookup, $fh, $type - 2, $fmt, $ctables, $out, $num, $base); } +# push (@reftables, [$ctables, 0]); + $out; +} + + +=head2 $t->read_value($format, $base, $lookup, $fh) + +Reads a value record from the current location in the file, according to the +format given. + +=cut + +sub read_value +{ + my ($self, $fmt, $base, $lookup, $fh) = @_; + my ($flag) = 1; + my ($res) = {}; + my ($s, $i, $dat); + + $s = 0; + for ($i = 0; $i < 12; $i++) + { + $s++ if ($flag & $fmt); + $flag <<= 1; + } + + $fh->read($dat, $s << 1); + $flag = 1; $i = 0; + foreach $s (qw(XPlacement YPlacement XAdvance YAdvance)) + { + $res->{$s} = TTF_Unpack('s', substr($dat, $i++ << 1, 2)) if ($fmt & $flag); + $flag <<= 1; + } + + foreach $s (qw(XPlaDevice YPlaDevice XAdvDevice YAdvDevice)) + { + if ($fmt & $flag) + { $res->{$s} = $self->read_delta(TTF_Unpack('S', substr($i++ << 1, 2)), + $base, $lookup, $fh); } + $flag <<= 1; + } + + foreach $s (qw(XIdPlacement YIdPlacement XIdAdvance YIdAdvance)) + { + $res->{$s} = TTF_Unpack('S', substr($dat, $i++ << 1, 2)) if ($fmt & $flag); + $flag <<= 1; + } + $res; +} + + +=head2 $t->read_delta($offset, $base, $lookup, $fh) + +Reads a delta (device table) at the given offset if it hasn't already been read. +Store the offset and item in the lookup cache ($lookup->{' CACHE'}) + +=cut + +sub read_delta +{ + my ($self, $offset, $base, $lookup, $fh) = @_; + my ($loc) = $fh->tell(); + my ($res, $str); + + return undef unless $offset; + $str = sprintf("%X", $base + $offset); + return $lookup->{' CACHE'}{$str} if defined $lookup->{' CACHE'}{$str}; + $fh->seek($base + $offset, 0); + $res = Font::TTF::Delta->new->read($fh); + $fh->seek($loc, 0); + $lookup->{' CACHE'}{$str} = $res; + return $res; +} + + +=head2 $t->read_anchor($offset, $base, $lookup, $fh) + +Reads an Anchor table at the given offset if it hasn't already been read. + +=cut + +sub read_anchor +{ + my ($self, $offset, $base, $lookup, $fh) = @_; + my ($loc) = $fh->tell(); + my ($res, $str); + + return undef unless $offset; + $str = sprintf("%X", $base + $offset); + return $lookup->{' CACHE'}{$str} if defined $lookup->{' CACHE'}{$str}; + $fh->seek($base + $offset, 0); + $res = Font::TTF::Anchor->new->read($fh); + $fh->seek($loc, 0); + $lookup->{' CACHE'}{$str} = $res; + return $res; +} + + +=head2 $t->fmt_value + +Returns the value format for a given value record + +=cut + +sub fmt_value +{ + my ($self, $value) = @_; + my ($fmt) = 0; + my ($n); + + foreach $n (reverse qw(XPlacement YPlacement XAdvance YAdvance XPlaDevice YPlaDevice + XAdvDevice YAdvDevice XIdPlacement YIdPlacement XIdAdvance + YIdAdvance)) + { + $fmt <<= 1; + $fmt |= 1 if (defined $value->{$n} && (ref $value->{$n} || $value->{$n})); + } + $fmt; +} + + +=head2 $t->out_value + +Returns the output string for the outputting of the value for a given format. Also +updates the offset cache for any device tables referenced. + +=cut + +sub out_value +{ + my ($self, $value, $fmt, $tables, $offset) = @_; + my ($n, $flag, $out); + + $flag = 1; + foreach $n (qw(XPlacement YPlacement XAdvance YAdvance)) + { + $out .= pack('n', $value->{$n}) if ($flag & $fmt); + $flag <<= 1; + } + foreach $n (qw(XPlaDevice YPlaDevice XAdvDevice YAdvDevice)) + { + if ($flag & $fmt) + { + $out .= pack('n', Font::TTF::Ttopen::ref_cache( + $value->{$n}, $tables, $offset + length($out))); + } + $flag <<= 1; + } + foreach $n (qw(XIdPlacement YIdPlacement XIdAdvance YIdAdvance)) + { + $out .= pack('n', $value->{$n}) if ($flag & $fmt); + $flag <<= 1; + } + $out; +} + + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + +1; + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/GSUB.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/GSUB.pm new file mode 100644 index 0000000..abf0f13 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/GSUB.pm @@ -0,0 +1,246 @@ +package Font::TTF::GSUB; + +=head1 NAME + +Font::TTF::GSUB - Module support for the GSUB table in conjunction with TTOpen + +=head1 DESCRIPTION + +Handles the GSUB subtables in relation to Ttopen tables. Due to the variety of +different lookup types, the data structures are not all that straightforward, +although I have tried to make life easy for myself when using this! + +=head1 INSTANCE VARIABLES + +The structure of a GSUB table is the same as that given in L. +Here we give some of the semantics specific to GSUB lookups. + +=over 4 + +=item ACTION_TYPE + +This is a string taking one of 4 values indicating the nature of the information +in the ACTION array of the rule: + +=over 8 + +=item g + +The action contains a string of glyphs to replace the match string by + +=item l + +The action array contains a list of lookups and offsets to run, in order, on +the matched string + +=item a + +The action array is an unordered set of optional replacements for the matched +glyph. The application should make the selection somehow. + +=item o + +The action array is empty (in fact there is no rule array for this type of +rule) and the ADJUST value should be added to the glyph id to find the replacement +glyph id value + +=back + +=item MATCH_TYPE + +This indicates which type of information the various MATCH arrays (MATCH, PRE, +POST) hold in the rule: + +=over 8 + +=item g + +The array holds a string of glyph ids which should match exactly + +=item c + +The array holds a sequence of class definitions which each glyph should +correspondingly match to + +=item o + +The array holds offsets to coverage tables + +=back + +=back + +=head1 CORRESPONDANCE TO LAYOUT TYPES + +The following table gives the values for ACTION_TYPE and MATCH_TYPE for each +of the 11 different lookup types found in the GSUB table definition I have: + + 1.1 1.2 2 3 4 5.1 5.2 5.3 6.1 6.2 6.3 + ACTION_TYPE o g g a g l l l l l l + MATCH_TYPE g g c o g c o + +Hopefully, the rest of the uses of the variables should make sense from this +table. + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA); +use Font::TTF::Utils; +use Font::TTF::Ttopen; + +@ISA = qw(Font::TTF::Ttopen); + +=head2 $t->read_sub($fh, $lookup, $index) + +Asked by the superclass to read in from the given file the indexth subtable from +lookup number lookup. The file is positioned ready for the read. + +=cut + +sub read_sub +{ + my ($self, $fh, $main_lookup, $sindex) = @_; + my ($type) = $main_lookup->{'TYPE'}; + my ($loc) = $fh->tell(); + my ($lookup) = $main_lookup->{'SUB'}[$sindex]; + my ($dat, $s, @subst, $t, $fmt, $cover, $count, $mcount, $scount, $i, $gid); + my (@srec); + + if ($type == 6) + { + $fh->read($dat, 4); + ($fmt, $cover) = TTF_Unpack('S2', $dat); + if ($fmt < 3) + { + $fh->read($dat, 2); + $count = TTF_Unpack('S', $dat); + } + } else + { + $fh->read($dat, 6); + ($fmt, $cover, $count) = TTF_Unpack("S3", $dat); + } + unless ($fmt == 3 && ($type == 5 || $type == 6)) + { $lookup->{'COVERAGE'} = $self->read_cover($cover, $loc, $lookup, $fh, 1); } + + $lookup->{'FORMAT'} = $fmt; + if ($type == 1 && $fmt == 1) + { + $count -= 65536 if ($count > 32767); + $lookup->{'ADJUST'} = $count; + $lookup->{'ACTION_TYPE'} = 'o'; + } elsif ($type == 1 && $fmt == 2) + { + $fh->read($dat, $count << 1); + @subst = TTF_Unpack('S*', $dat); + foreach $s (@subst) + { push(@{$lookup->{'RULES'}}, [{'ACTION' => [$s]}]); } + $lookup->{'ACTION_TYPE'} = 'g'; + } elsif ($type == 2 || $type == 3) + { + $fh->read($dat, $count << 1); # number of offsets + foreach $s (TTF_Unpack('S*', $dat)) + { + $fh->seek($loc + $s, 0); + $fh->read($dat, 2); + $t = TTF_Unpack('S', $dat); + $fh->read($dat, $t << 1); + push(@{$lookup->{'RULES'}}, [{'ACTION' => [TTF_Unpack('S*', $dat)]}]); + } + $lookup->{'ACTION_TYPE'} = ($type == 2 ? 'g' : 'a'); + } elsif ($type == 4) + { + $fh->read($dat, $count << 1); + foreach $s (TTF_Unpack('S*', $dat)) + { + @subst = (); + $fh->seek($loc + $s, 0); + $fh->read($dat, 2); + $t = TTF_Unpack('S', $dat); + $fh->read($dat, $t << 1); + foreach $t (TTF_Unpack('S*', $dat)) + { + $fh->seek($loc + $s + $t, 0); + $fh->read($dat, 4); + ($gid, $mcount) = TTF_Unpack('S2', $dat); + $fh->read($dat, ($mcount - 1) << 1); + push(@subst, {'ACTION' => [$gid], 'MATCH' => [TTF_Unpack('S*', $dat)]}); + } + push(@{$lookup->{'RULES'}}, [@subst]); + } + $lookup->{'ACTION_TYPE'} = 'g'; + $lookup->{'MATCH_TYPE'} = 'g'; + } elsif ($type == 5 || $type == 6) + { $self->read_context($lookup, $fh, $type, $fmt, $cover, $count, $loc); } + $lookup; +} + + +=head2 $t->extension + +Returns the table type number for the extension table + +=cut + +sub extension +{ return 7; } + + +=head2 $t->out_sub($fh, $lookup, $index) + +Passed the filehandle to output to, suitably positioned, the lookup and subtable +index, this function outputs the subtable to $fh at that point. + +=cut + +sub out_sub +{ + my ($self, $fh, $main_lookup, $index, $ctables, $base) = @_; + my ($type) = $main_lookup->{'TYPE'}; + my ($lookup) = $main_lookup->{'SUB'}[$index]; + my ($fmt) = $lookup->{'FORMAT'}; + my ($out, $r, $t, $i, $j, $offc, $offd, $numd); + my ($num) = $#{$lookup->{'RULES'}} + 1; + + if ($type == 1) + { + $out = pack("nn", $fmt, Font::TTF::Ttopen::ref_cache($lookup->{'COVERAGE'}, $ctables, 2 + $base)); + if ($fmt == 1) + { $out .= pack("n", $lookup->{'ADJUST'}); } + else + { + $out .= pack("n", $num); + foreach $r (@{$lookup->{'RULES'}}) + { $out .= pack("n", $r->[0]{'ACTION'}[0]); } + } + } elsif ($type == 2 || $type == 3) + { + $out = pack("nnn", $fmt, Font::TTF::Ttopen::ref_cache($lookup->{'COVERAGE'}, $ctables, 2 + $base), + $num); + $out .= pack('n*', (0) x $num); + $offc = length($out); + for ($i = 0; $i < $num; $i++) + { + $out .= pack("n*", $#{$lookup->{'RULES'}[$i][0]{'ACTION'}} + 1, + @{$lookup->{'RULES'}[$i][0]{'ACTION'}}); + substr($out, ($i << 1) + 6, 2) = pack('n', $offc); + $offc = length($out); + } + } elsif ($type == 4 || $type == 5 || $type == 6) + { $out = $self->out_context($lookup, $fh, $type, $fmt, $ctables, $out, $num, $base); } +# Font::TTF::Ttopen::out_final($fh, $out, [[$ctables, 0]]); + $out; +} + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + +1; + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Glyf.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Glyf.pm new file mode 100644 index 0000000..e0268f3 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Glyf.pm @@ -0,0 +1,158 @@ +package Font::TTF::Glyf; + +=head1 NAME + +Font::TTF::Glyf - The Glyf data table + +=head1 DESCRIPTION + +This is a stub table. The real data is held in the loca table. If you want to get a glyf +look it up in the loca table as C<$f->{'loca'}{'glyphs'}[$num]>. It won't be here! + +The difference between reading this table as opposed to the loca table is that +reading this table will cause updated glyphs to be written out rather than just +copying the glyph information from the input file. This causes font writing to be +slower. So read the glyf as opposed to the loca table if you want to change glyf +data. Read the loca table only if you are just wanting to read the glyf information. + +This class is used when writing the glyphs though. + +=head1 METHODS + +=cut + + +use strict; +use vars qw(@ISA); +@ISA = qw(Font::TTF::Table); + +=head2 $t->read + +Reads the C table instead! + +=cut + +sub read +{ + my ($self) = @_; + + $self->{' PARENT'}{'loca'}->read; + $self->{' read'} = 1; + $self; +} + + +=head2 $t->out($fh) + +Writes out all the glyphs in the parent's location table, calculating a new +output location for each one. + +=cut + +sub out +{ + my ($self, $fh) = @_; + my ($i, $loca, $offset, $numGlyphs); + + return $self->SUPER::out($fh) unless $self->{' read'}; + + $loca = $self->{' PARENT'}{'loca'}{'glyphs'}; + $numGlyphs = $self->{' PARENT'}{'maxp'}{'numGlyphs'}; + + $offset = 0; + for ($i = 0; $i < $numGlyphs; $i++) + { + next unless defined $loca->[$i]; + $loca->[$i]->update; + $loca->[$i]{' OUTLOC'} = $offset; + $loca->[$i]->out($fh); + $offset += $loca->[$i]{' OUTLEN'}; + } + $self->{' PARENT'}{'head'}{'indexToLocFormat'} = ($offset >= 0x20000); + $self; +} + + +=head2 $t->out_xml($context, $depth) + +Outputs all the glyphs in the glyph table just where they are supposed to be output! + +=cut + +sub out_xml +{ + my ($self, $context, $depth) = @_; + my ($fh) = $context->{'fh'}; + my ($loca, $i, $numGlyphs); + + $loca = $self->{' PARENT'}{'loca'}{'glyphs'}; + $numGlyphs = $self->{' PARENT'}{'maxp'}{'numGlyphs'}; + + for ($i = 0; $i < $numGlyphs; $i++) + { + $context->{'gid'} = $i; + $loca->[$i]->out_xml($context, $depth) if (defined $loca->[$i]); + } + + $self; +} + + +=head2 $t->XML_start($context, $tag, %attrs) + +Pass control to glyphs as they occur + +=cut + +sub XML_start +{ + my ($self) = shift; + my ($context, $tag, %attrs) = @_; + + if ($tag eq 'glyph') + { + $context->{'tree'}[-1] = Font::TTF::Glyph->new(read => 2, PARENT => $self->{' PARENT'}); + $context->{'receiver'} = $context->{'tree'}[-1]; + } +} + + +=head2 $t->XML_end($context, $tag, %attrs) + +Collect up glyphs and put them into the loca table + +=cut + +sub XML_end +{ + my ($self) = shift; + my ($context, $tag, %attrs) = @_; + + if ($tag eq 'glyph') + { + unless (defined $context->{'glyphs'}) + { + if (defined $self->{' PARENT'}{'loca'}) + { $context->{'glyphs'} = $self->{' PARENT'}{'loca'}{'glyphs'}; } + else + { $context->{'glyphs'} = []; } + } + $context->{'glyphs'}[$attrs{'gid'}] = $context->{'tree'}[-1]; + return $context; + } else + { return $self->SUPER::XML_end(@_); } +} + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Glyph.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Glyph.pm new file mode 100644 index 0000000..28233cf --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Glyph.pm @@ -0,0 +1,847 @@ +package Font::TTF::Glyph; + +=head1 NAME + +Font::TTF::Glyph - Holds a single glyph's information + +=head1 DESCRIPTION + +This is a single glyph description as held in a TT font. On creation only its +header is read. Thus you can get the bounding box of each glyph without having +to read all the other information. + +=head1 INSTANCE VARIABLES + +In addition to the named variables in a glyph header (C etc.), there are +also all capital instance variables for holding working information, mostly +from the location table. + +The standard attributes each glyph has are: + + numberOfContours + xMin + yMin + xMax + yMax + +There are also other, derived, instance variables for each glyph which are read +when the whole glyph is read (via C): + +=over 4 + +=item instLen + +Number of bytes in the hinting instructions (Warning this variable is deprecated, +use C{'hints'})> instead). + +=item hints + +The string containing the hinting code for the glyph + +=back + +In addition there are other attribute like instance variables for simple glyphs: + +=over 4 + +For each contour there is: + +=over 4 + +=item endPoints + +An array of endpoints for each contour in the glyph. There are +C contours in a glyph. The number of points in a glyph is +equal to the highest endpoint of a contour. + +=back + +There are also a number of arrays indexed by point number + +=over 4 + +=item flags + +The flags associated with reading this point. The flags for a point are +recalculated for a point when it is Cd. Thus the flags are not very +useful. The only important bit is bit 0 which indicates whether the point is +an 'on' curve point, or an 'off' curve point. + +=item x + +The absolute x co-ordinate of the point. + +=item y + +The absolute y co-ordinate of the point + +=back + +=back + +For composite glyphs there are other variables + +=over 4 + +=item metric + +This holds the component number (not its glyph number) of the component from +which the metrics for this glyph should be taken. + +=item comps + +This is an array of hashes for each component. Each hash has a number of +elements: + +=over 4 + +=item glyph + +The glyph number of the glyph which comprises this component of the composite. +NOTE: In some badly generated fonts, C may contain a numerical value +but that glyph might not actually exist in the font file. This could +occur in any glyph, but is particularly likely for glyphs that have +no strokes, such as SPACE, U+00A0 NO-BREAK SPACE, or +U+200B ZERO WIDTH SPACE. + +=item args + +An array of two arguments which may be an x, y co-ordinate or two attachment +points (one on the base glyph the other on the component). See flags for details. + +=item flag + +The flag for this component + +=item scale + +A 4 number array for component scaling. This allows stretching, rotating, etc. +Note that scaling applies to placement co-ordinates (rather than attachment points) +before locating rather than after. + +=back + +=item numPoints + +This is a generated value which contains the number of components read in for this +compound glyph. + +=back + +The private instance variables are: + +=over 4 + +=item INFILE (P) + +The input file form which to read any information + +=item LOC (P) + +Location relative to the start of the glyf table in the read file + +=item BASE (P) + +The location of the glyf table in the read file + +=item LEN (P) + +This is the number of bytes required by the glyph. It should be kept up to date +by calling the C method whenever any of the glyph content changes. + +=item OUTLOC (P) + +Location relative to the start of the glyf table. This variable is only active +whilst the output process is going on. It is used to inform the location table +where the glyph's location is, since the glyf table is output before the loca +table due to alphabetical ordering. + +=item OUTLEN (P) + +This indicates the length of the glyph data when it is output. This more +accurately reflects the internal memory form than the C variable which +only reflects the read file length. The C variable is only set after +calling C or C. + +=back + +=head2 Editing + +If you want to edit a glyph in some way, then you should read_dat the glyph, then +make your changes and then update the glyph or set the $g->{' isdirty'} variable. +It is the application's duty to ensure that the following instance variables are +correct, from which update will calculate the rest, including the bounding box +information. + + numPoints + numberOfContours + endPoints + x, y, flags (only flags bit 0) + instLen + hints + +For components, the numPoints, x, y, endPoints & flags are not required but +the following information is required for each component. + + flag (bits 2, 10, 11, 12) + glyph + args + scale + metric (glyph instance variable) + + +=head1 METHODS + +=cut + +use strict; +use vars qw(%fields @field_info); +use Font::TTF::Utils; +use Font::TTF::Table; + +@field_info = ( + 'numberOfContours' => 's', + 'xMin' => 's', + 'yMin' => 's', + 'xMax' => 's', + 'yMax' => 's'); + +sub init +{ + my ($k, $v, $c, $i); + for ($i = 0; $i < $#field_info; $i += 2) + { + ($k, $v, $c) = TTF_Init_Fields($field_info[$i], $c, $field_info[$i + 1]); + next unless defined $k && $k ne ""; + $fields{$k} = $v; + } +} + + +=head1 Font::TTF::Glyph->new(%parms) + +Creates a new glyph setting various instance variables + +=cut + +sub new +{ + my ($class, %parms) = @_; + my ($self) = {}; + my ($p); + + bless $self, $class; + foreach $p (keys %parms) + { $self->{" $p"} = $parms{$p}; } + init unless defined $fields{'xMin'}; + $self; +} + + +=head2 $g->read + +Reads the header component of the glyph (bounding box, etc.) and also the +glyph content, but into a data field rather than breaking it down into +its constituent structures. Use read_dat for this. + +=cut + +sub read +{ + my ($self) = @_; + my ($fh) = $self->{' INFILE'}; + my ($dat); + + return $self if $self->{' read'}; + $self->{' read'} = 1; + $fh->seek($self->{' LOC'} + $self->{' BASE'}, 0); + $fh->read($self->{' DAT'}, $self->{' LEN'}); + TTF_Read_Fields($self, $self->{' DAT'}, \%fields); + $self; +} + + +=head2 $g->read_dat + +Reads the contents of the glyph (components and curves, etc.) from the memory +store C into structures within the object. Then, to indicate where the +master form of the data is, it deletes the C instance variable. + +=cut + +sub read_dat +{ + my ($self) = @_; + my ($dat, $num, $max, $i, $flag, $len, $val, $val1, $fp); + + return $self if (defined $self->{' read'} && $self->{' read'} > 1); + $self->read unless $self->{' read'}; + $dat = $self->{' DAT'}; + $fp = 10; + $num = $self->{'numberOfContours'}; + if ($num > 0) + { + $self->{'endPoints'} = [unpack("n*", substr($dat, $fp, $num << 1))]; + $fp += $num << 1; + $max = 0; + foreach (@{$self->{'endPoints'}}) + { $max = $_ if $_ > $max; } +# print STDERR join(",", unpack('C*', $self->{" DAT"})); +# printf STDERR ("(%d,%d in %d=%d @ %d)", scalar @{$self->{'endPoints'}}, $max, length($dat), $self->{' LEN'}, $fp); + $max++ if (@{$self->{'endPoints'}}); + $self->{'numPoints'} = $max; + $self->{'instLen'} = unpack("n", substr($dat, $fp)); + $self->{'hints'} = substr($dat, $fp + 2, $self->{'instLen'}); + $fp += 2 + $self->{'instLen'}; +# read the flags array + for ($i = 0; $i < $max; $i++) + { + $flag = unpack("C", substr($dat, $fp++)); + $self->{'flags'}[$i] = $flag; + if ($flag & 8) + { + $len = unpack("C", substr($dat, $fp++)); + while ($len-- > 0) + { + $i++; + $self->{'flags'}[$i] = $flag; + } + } + } +#read the x array + for ($i = 0; $i < $max; $i++) + { + $flag = $self->{'flags'}[$i]; + if ($flag & 2) + { + $val = unpack("C", substr($dat, $fp++)); + $val = -$val unless ($flag & 16); + } elsif ($flag & 16) + { $val = 0; } + else + { + $val = TTF_Unpack("s", substr($dat, $fp)); + $fp += 2; + } + $self->{'x'}[$i] = $i == 0 ? $val : $self->{'x'}[$i - 1] + $val; + } +#read the y array + for ($i = 0; $i < $max; $i++) + { + $flag = $self->{'flags'}[$i]; + if ($flag & 4) + { + $val = unpack("C", substr($dat, $fp++)); + $val = -$val unless ($flag & 32); + } elsif ($flag & 32) + { $val = 0; } + else + { + $val = TTF_Unpack("s", substr($dat, $fp)); + $fp += 2; + } + $self->{'y'}[$i] = $i == 0 ? $val : $self->{'y'}[$i - 1] + $val; + } + } + +# compound glyph + elsif ($num < 0) + { + $flag = 1 << 5; # cheat to get the loop going + for ($i = 0; $flag & 32; $i++) + { + ($flag, $self->{'comps'}[$i]{'glyph'}) = unpack("n2", substr($dat, $fp)); + $fp += 4; + $self->{'comps'}[$i]{'flag'} = $flag; + if ($flag & 1) # ARGS1_AND_2_ARE_WORDS + { + $self->{'comps'}[$i]{'args'} = [TTF_Unpack("s2", substr($dat, $fp))]; + $fp += 4; + } else + { + $self->{'comps'}[$i]{'args'} = [unpack("c2", substr($dat, $fp))]; + $fp += 2; + } + + if ($flag & 8) + { + $val = TTF_Unpack("F", substr($dat, $fp)); + $fp += 2; + $self->{'comps'}[$i]{'scale'} = [$val, 0, 0, $val]; + } elsif ($flag & 64) + { + ($val, $val1) = TTF_Unpack("F2", substr($dat, $fp)); + $fp += 4; + $self->{'comps'}[$i]{'scale'} = [$val, 0, 0, $val1]; + } elsif ($flag & 128) + { + $self->{'comps'}[$i]{'scale'} = [TTF_Unpack("F4", substr($dat, $fp))]; + $fp += 8; + } + $self->{'metric'} = $i if ($flag & 512); + } + $self->{'numPoints'} = $i; + if ($flag & 256) # HAVE_INSTRUCTIONS + { + $self->{'instLen'} = unpack("n", substr($dat, $fp)); + $self->{'hints'} = substr($dat, $fp + 2, $self->{'instLen'}); + $fp += 2 + $self->{'instLen'}; + } + } + return undef if ($fp > length($dat)); + $self->{' read'} = 2; + $self; +} + + +=head2 $g->out($fh) + +Writes the glyph data to outfile + +=cut + +sub out +{ + my ($self, $fh) = @_; + + $self->read unless $self->{' read'}; + $self->update if $self->{' isDirty'}; + $fh->print($self->{' DAT'}); + $self->{' OUTLEN'} = length($self->{' DAT'}); + $self; +} + + +=head2 $g->out_xml($context, $depth) + +Outputs an XML description of the glyph + +=cut + +sub out_xml +{ + my ($self, $context, $depth) = @_; + my ($addr) = ($self =~ m/\((.+)\)$/o); + my ($k, $ndepth); + + if ($context->{'addresses'}{$addr}) + { + $context->{'fh'}->printf("%s\n", $depth, $context->{'gid'}, $addr); + return $self; + } + else + { + $context->{'fh'}->printf("%s\n", $depth, $context->{'gid'}, $addr); + } + + $ndepth = $depth . $context->{'indent'}; + $self->read_dat; + foreach $k (sort grep {$_ !~ m/^\s/o} keys %{$self}) + { + $self->XML_element($context, $ndepth, $k, $self->{$k}); + } + $context->{'fh'}->print("$depth\n"); + delete $context->{'done_points'}; + $self; +} + + +sub XML_element +{ + my ($self, $context, $depth, $key, $val) = @_; + my ($fh) = $context->{'fh'}; + my ($dind) = $depth . $context->{'indent'}; + my ($i); + + if ($self->{'numberOfContours'} >= 0 && ($key eq 'x' || $key eq 'y' || $key eq 'flags')) + { + return $self if ($context->{'done_points'}); + $context->{'done_points'} = 1; + + $fh->print("$depth\n"); + for ($i = 0; $i <= $#{$self->{'flags'}}; $i++) + { $fh->printf("%s\n", $dind, + $self->{'x'}[$i], $self->{'y'}[$i], $self->{'flags'}[$i]); } + $fh->print("$depth\n"); + } + elsif ($key eq 'hints') + { + my ($dat); + $fh->print("$depth\n"); +# Font::TTF::Utils::XML_hexdump($context, $depth . $context->{'indent'}, $self->{'hints'}); + $dat = Font::TTF::Utils::XML_binhint($self->{'hints'}) || ""; + $dat =~ s/\n(?!$)/\n$depth$context->{'indent'}/mg; + $fh->print("$depth$context->{'indent'}$dat"); + $fh->print("$depth\n"); + } + else + { return Font::TTF::Table::XML_element(@_); } + + $self; +} + + +=head2 $g->update + +Generates a C<$self->{'DAT'}> from the internal structures, if the data has +been read into structures in the first place. If you are building a glyph +from scratch you will need to set the instance variable C<' read'> to 2 (or +something > 1) for the update to work. + +=cut + +sub update +{ + my ($self) = @_; + my ($dat, $loc, $len, $flag, $x, $y, $i, $comp, $num); + + return $self unless (defined $self->{' read'} && $self->{' read'} > 1); + $self->update_bbox; + $self->{' DAT'} = TTF_Out_Fields($self, \%fields, 10); + $num = $self->{'numberOfContours'}; + if ($num > 0) + { + $self->{' DAT'} .= pack("n*", @{$self->{'endPoints'}}); + $len = $self->{'instLen'}; + $self->{' DAT'} .= pack("n", $len); + $self->{' DAT'} .= pack("a" . $len, substr($self->{'hints'}, 0, $len)) if ($len > 0); + for ($i = 0; $i < $self->{'numPoints'}; $i++) + { + $flag = $self->{'flags'}[$i] & 1; + if ($i == 0) + { + $x = $self->{'x'}[$i]; + $y = $self->{'y'}[$i]; + } else + { + $x = $self->{'x'}[$i] - $self->{'x'}[$i - 1]; + $y = $self->{'y'}[$i] - $self->{'y'}[$i - 1]; + } + $flag |= 16 if ($x == 0); + $flag |= 32 if ($y == 0); + if (($flag & 16) == 0 && $x < 256 && $x > -256) + { + $flag |= 2; + $flag |= 16 if ($x >= 0); + } + if (($flag & 32) == 0 && $y < 256 && $y > -256) + { + $flag |= 4; + $flag |= 32 if ($y >= 0); + } + $self->{' DAT'} .= pack("C", $flag); # sorry no repeats + $self->{'flags'}[$i] = $flag; + } + for ($i = 0; $i < $self->{'numPoints'}; $i++) + { + $flag = $self->{'flags'}[$i]; + $x = $self->{'x'}[$i] - (($i == 0) ? 0 : $self->{'x'}[$i - 1]); + if (($flag & 18) == 0) + { $self->{' DAT'} .= TTF_Pack("s", $x); } + elsif (($flag & 18) == 18) + { $self->{' DAT'} .= pack("C", $x); } + elsif (($flag & 18) == 2) + { $self->{' DAT'} .= pack("C", -$x); } + } + for ($i = 0; $i < $self->{'numPoints'}; $i++) + { + $flag = $self->{'flags'}[$i]; + $y = $self->{'y'}[$i] - (($i == 0) ? 0 : $self->{'y'}[$i - 1]); + if (($flag & 36) == 0) + { $self->{' DAT'} .= TTF_Pack("s", $y); } + elsif (($flag & 36) == 36) + { $self->{' DAT'} .= pack("C", $y); } + elsif (($flag & 36) == 4) + { $self->{' DAT'} .= pack("C", -$y); } + } + } + + elsif ($num < 0) + { + for ($i = 0; $i <= $#{$self->{'comps'}}; $i++) + { + $comp = $self->{'comps'}[$i]; + $flag = $comp->{'flag'} & 7158; # bits 2,10,11,12 + $flag |= 1 unless ($comp->{'args'}[0] > -129 && $comp->{'args'}[0] < 128 + && $comp->{'args'}[1] > -129 && $comp->{'args'}[1] < 128); + if (defined $comp->{'scale'}) + { + if ($comp->{'scale'}[1] == 0 && $comp->{'scale'}[2] == 0) + { + if ($comp->{'scale'}[0] == $comp->{'scale'}[3]) + { $flag |= 8 unless ($comp->{'scale'}[0] == 0 + || $comp->{'scale'}[0] == 1); } + else + { $flag |= 64; } + } else + { $flag |= 128; } + } + + $flag |= 512 if (defined $self->{'metric'} && $self->{'metric'} == $i); + if ($i == $#{$self->{'comps'}}) + { $flag |= 256 if (defined $self->{'instLen'} && $self->{'instLen'} > 0); } + else + { $flag |= 32; } + + $self->{' DAT'} .= pack("n", $flag); + $self->{' DAT'} .= pack("n", $comp->{'glyph'}); + $comp->{'flag'} = $flag; + + if ($flag & 1) + { $self->{' DAT'} .= TTF_Pack("s2", @{$comp->{'args'}}); } + else + { $self->{' DAT'} .= pack("CC", @{$comp->{'args'}}); } + + if ($flag & 8) + { $self->{' DAT'} .= TTF_Pack("F", $comp->{'scale'}[0]); } + elsif ($flag & 64) + { $self->{' DAT'} .= TTF_Pack("F2", $comp->{'scale'}[0], $comp->{'scale'}[3]); } + elsif ($flag & 128) + { $self->{' DAT'} .= TTF_Pack("F4", @{$comp->{'scale'}}); } + } + if (defined $self->{'instLen'} && $self->{'instLen'} > 0) + { + $len = $self->{'instLen'}; + $self->{' DAT'} .= pack("n", $len); + $self->{' DAT'} .= pack("a" . $len, substr($self->{'hints'}, 0, $len)); + } + } + my ($olen) = length($self->{' DAT'}); + $self->{' DAT'} .= ("\000") x (4 - ($olen & 3)) if ($olen & 3); + $self->{' OUTLEN'} = length($self->{' DAT'}); + $self->{' read'} = 2; # changed from 1 to 2 so we don't read_dat() again +# we leave numPoints and instLen since maxp stats use this + $self; +} + + +=head2 $g->update_bbox + +Updates the bounding box for this glyph according to the points in the glyph + +=cut + +sub update_bbox +{ + my ($self) = @_; + my ($num, $maxx, $minx, $maxy, $miny, $i, $comp, $x, $y, $compg); + + return $self unless $self->{' read'} > 1; # only if read_dat done + $miny = $minx = 65537; $maxx = $maxy = -65537; + $num = $self->{'numberOfContours'}; + if ($num > 0) + { + for ($i = 0; $i < $self->{'numPoints'}; $i++) + { + ($x, $y) = ($self->{'x'}[$i], $self->{'y'}[$i]); + + $maxx = $x if ($x > $maxx); + $minx = $x if ($x < $minx); + $maxy = $y if ($y > $maxy); + $miny = $y if ($y < $miny); + } + } + + elsif ($num < 0) + { + foreach $comp (@{$self->{'comps'}}) + { + my ($gnx, $gny, $gxx, $gxy); + my ($sxx, $sxy, $syx, $syy); + + my $otherg = $self->{' PARENT'}{'loca'}{'glyphs'}[$comp->{'glyph'}]; + # work around bad fonts: see documentation for 'comps' above + next unless (defined $otherg); + $compg = $otherg->read->update_bbox; + ($gnx, $gny, $gxx, $gxy) = @{$compg}{'xMin', 'yMin', 'xMax', 'yMax'}; + if (defined $comp->{'scale'}) + { + ($sxx, $sxy, $syx, $syy) = @{$comp->{'scale'}}; + ($gnx, $gny, $gxx, $gxy) = ($gnx*$sxx+$gny*$syx + $comp->{'args'}[0], + $gnx*$sxy+$gny*$syy + $comp->{'args'}[1], + $gxx*$sxx+$gxy*$syx + $comp->{'args'}[0], + $gxx*$sxy+$gxy*$syy + $comp->{'args'}[1]); + } elsif ($comp->{'args'}[0] || $comp->{'args'}[1]) + { + $gnx += $comp->{'args'}[0]; + $gny += $comp->{'args'}[1]; + $gxx += $comp->{'args'}[0]; + $gxy += $comp->{'args'}[1]; + } + ($gnx, $gxx) = ($gxx, $gnx) if $gnx > $gxx; + ($gny, $gxy) = ($gxy, $gny) if $gny > $gxy; + $maxx = $gxx if $gxx > $maxx; + $minx = $gnx if $gnx < $minx; + $maxy = $gxy if $gxy > $maxy; + $miny = $gny if $gny < $miny; + } + } + $self->{'xMax'} = $maxx; + $self->{'xMin'} = $minx; + $self->{'yMax'} = $maxy; + $self->{'yMin'} = $miny; + $self; +} + + +=head2 $g->maxInfo + +Returns lots of information about a glyph so that the C table can update +itself. Returns array containing contributions of this glyph to maxPoints, maxContours, +maxCompositePoints, maxCompositeContours, maxSizeOfInstructions, maxComponentElements, +and maxComponentDepth. + +=cut + +sub maxInfo +{ + my ($self) = @_; + my (@res, $i, @n); + + $self->read_dat; # make sure we've read some data + $res[4] = length($self->{'hints'}) if defined $self->{'hints'}; + $res[6] = 1; + if ($self->{'numberOfContours'} > 0) + { + $res[0] = $self->{'numPoints'}; + $res[1] = $self->{'numberOfContours'}; + } elsif ($self->{'numberOfContours'} < 0) + { + for ($i = 0; $i <= $#{$self->{'comps'}}; $i++) + { + my $otherg = + $self->{' PARENT'}{'loca'}{'glyphs'} + [$self->{'comps'}[$i]{'glyph'}]; + + # work around bad fonts: see documentation for 'comps' above + next unless (defined $otherg ); + + @n = $otherg->maxInfo; + + $res[2] += $n[2] == 0 ? $n[0] : $n[2]; + $res[3] += $n[3] == 0 ? $n[1] : $n[3]; + $res[5]++; + $res[6] = $n[6] + 1 if ($n[6] >= $res[6]); + } + } + @res; +} + +=head2 $g->empty + +Empties the glyph of all information to the level of not having been read. +Useful for saving memory in apps with many glyphs being read + +=cut + +sub empty +{ + my ($self) = @_; + my (%keep) = map {(" $_" => 1)} ('LOC', 'OUTLOC', 'PARENT', 'INFILE', 'BASE', + 'OUTLEN', 'LEN'); + map {delete $self->{$_} unless $keep{$_}} keys %$self; + + $self; +} + + +=head2 $g->get_points + +This method creates point information for a compound glyph. The information is +stored in the same place as if the glyph was not a compound, but since +numberOfContours is negative, the glyph is still marked as being a compound + +=cut + +sub get_points +{ + my ($self) = @_; + my ($comp, $compg, $nump, $e, $i); + + $self->read_dat; + return undef unless ($self->{'numberOfContours'} < 0); + + foreach $comp (@{$self->{'comps'}}) + { + $compg = $self->{' PARENT'}{'loca'}{'glyphs'}[$comp->{'glyph'}]; + # work around bad fonts: see documentation for 'comps' above + next unless (defined $compg ); + $compg->get_points; + + for ($i = 0; $i < $compg->{'numPoints'}; $i++) + { + my ($x, $y) = ($compg->{'x'}[$i], $compg->{'y'}[$i]); + if (defined $comp->{'scale'}) + { + ($x, $y) = ($x * $comp->{'scale'}[0] + $y * $comp->{'scale'}[2], + $x * $comp->{'scale'}[1] + $y * $comp->{'scale'}[3]); + } + if (defined $comp->{'args'}) + { ($x, $y) = ($x + $comp->{'args'}[0], $y + $comp->{'args'}[1]); } + push (@{$self->{'x'}}, $x); + push (@{$self->{'y'}}, $y); + push (@{$self->{'flags'}}, $compg->{'flags'}[$i]); + } + foreach $e (@{$compg->{'endPoints'}}) + { push (@{$self->{'endPoints'}}, $e + $nump); } + $nump += $compg->{'numPoints'}; + } + $self->{'numPoints'} = $nump; + $self; +} + + +=head2 $g->get_refs + +Returns an array of all the glyph ids that are used to make up this glyph. That +is all the compounds and their references and so on. If this glyph is not a +compound, then returns an empty array. + +Please note the warning about bad fonts that reference nonexistant glyphs +under INSTANCE VARIABLES above. This function will not attempt to +filter out nonexistant glyph numbers. + +=cut + +sub get_refs +{ + my ($self) = @_; + my (@res, $g); + + $self->read_dat; + return unless ($self->{'numberOfContours'} < 0); + foreach $g (@{$self->{'comps'}}) + { + push (@res, $g->{'glyph'}); + my $otherg = $self->{' PARENT'}{'loca'}{'glyphs'}[$g->{'glyph'}]; + # work around bad fonts: see documentation for 'comps' above + next unless (defined $otherg); + my @list = $otherg->get_refs; + push(@res, @list); + } + return @res; +} + +1; + +=head1 BUGS + +=over 4 + +=item * + +The instance variables used here are somewhat clunky and inconsistent with +the other tables. + +=item * + +C doesn't re-calculate the bounding box or C. + +=back + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/GrFeat.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/GrFeat.pm new file mode 100644 index 0000000..2732a69 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/GrFeat.pm @@ -0,0 +1,249 @@ +package Font::TTF::GrFeat; + +=head1 NAME + +Font::TTF::GrFeat - Graphite Font Features + +=head1 DESCRIPTION + +=head1 INSTANCE VARIABLES + +=over 4 + +=item version + +=item features + +An array of hashes of the following form + +=over 8 + +=item feature + +feature id number + +=item name + +name index in name table + +=item exclusive + +exclusive flag + +=item default + +the default setting number + +=item settings + +hash of setting number against name string index + +=back + +=back + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA); + +use Font::TTF::Utils; + +require Font::TTF::Table; + +@ISA = qw(Font::TTF::Table); + +=head2 $t->read + +Reads the features from the TTF file into memory + +=cut + +sub read +{ + my ($self) = @_; + my ($featureCount, $features); + + return $self if $self->{' read'}; + $self->SUPER::read_dat or return $self; + + ($self->{'version'}, $featureCount) = TTF_Unpack("vS", $self->{' dat'}); + + $features = []; + foreach (1 .. $featureCount) { + my ($feature, $nSettings, $settingTable, $featureFlags, $nameIndex, $reserved); + if ($self->{'version'} == 1) + { + ($feature, $nSettings, $settingTable, $featureFlags, $nameIndex) + = TTF_Unpack("SSLSS", substr($self->{' dat'}, $_ * 12, 12)); + #The version 1 Feat table ends with a feature (id 1) named NoName + #with zero settings but with an offset to the last entry in the setting + #array. This last setting has id 0 and an invalid name id. This last + #feature is changed to have one setting. + if ($_ == $featureCount && $nSettings == 0) {$nSettings = 1;} + } + else #version == 2 + {($feature, $nSettings, $reserved, $settingTable, $featureFlags, $nameIndex) + = TTF_Unpack("LSSLSS", substr($self->{' dat'}, 12 + ($_ - 1) * 16, 16))}; + my $feature = + { + 'feature' => $feature, + 'name' => $nameIndex, + }; + + #interpret the featureFlags & store settings + $feature->{'exclusive'} = (($featureFlags & 0x8000) != 0); + + my @settings = TTF_Unpack("S*", substr($self->{' dat'}, $settingTable, $nSettings * 4)); + if ($featureFlags & 0x4000) + {$feature->{'default'} = $featureFlags & 0x00FF;} + else + {$feature->{'default'} = @settings[0];} + $feature->{'settings'} = {@settings}; + + push(@$features, $feature); + } + + $self->{'features'} = $features; + + delete $self->{' dat'}; # no longer needed, and may become obsolete + $self->{' read'} = 1; + $self; +} + +=head2 $t->out($fh) + +Writes the features to a TTF file + +=cut + +sub out +{ + my ($self, $fh) = @_; + my ($features, $numFeatures, $settings, $featureFlags, $featuresData, $settingsData); + + return $self->SUPER::out($fh) unless $self->{' read'}; + + $features = $self->{'features'}; + $numFeatures = @$features; + $featuresData, $settingsData = ('', ''); + + foreach (@$features) { + $settings = $_->{'settings'}; + $featureFlags = ($_->{'exclusive'} ? 0x8000 : 0x0000); + +# output default setting first instead of using the featureFlags (as done below) +# $featureFlags = ($_->{'exclusive'} ? 0x8000 : 0x0000) | +# ($_->{'default'} != 0 ? 0x4000 | ($_->{'default'} & 0x00FF) +# : 0x0000); + if ($self->{'version'} == 1) + { + $featuresData .= TTF_Pack("SSLSS", + $_->{'feature'}, + scalar keys %$settings, + 12 + 12 * $numFeatures + length $settingsData, + $featureFlags, + $_->{'name'}); + } + else #version == 2 + { + $featuresData .= TTF_Pack("LSSLSS", + $_->{'feature'}, + scalar keys %$settings, + 0, + 12 + 16 * $numFeatures + length $settingsData, + $featureFlags, + $_->{'name'}); + } + + #output default setting first + #the settings may not be in their original order + my $defaultSetting = $_->{'default'}; + $settingsData .= TTF_Pack("SS", $defaultSetting, $settings->{$defaultSetting}); + foreach (sort {$a <=> $b} keys %$settings) { + if ($_ == $defaultSetting) {next;} #skip default setting + $settingsData .= TTF_Pack("SS", $_, $settings->{$_}); + } + } + + $fh->print(TTF_Pack("vSSL", $self->{'version'}, $numFeatures, 0, 0)); + $fh->print($featuresData); + $fh->print($settingsData); + + $self; +} + +=head2 $t->print($fh) + +Prints a human-readable representation of the table + +=cut + +sub print +{ + my ($self, $fh) = @_; + my ($names, $features, $settings); + + $self->read; + + $names = $self->{' PARENT'}->{'name'}; + $names->read; + + $fh = 'STDOUT' unless defined $fh; + + $features = $self->{'features'}; + foreach (@$features) { + $fh->printf("Feature %d, %s, default: %d name %d # '%s'\n", + $_->{'feature'}, + ($_->{'exclusive'} ? "exclusive" : "additive"), + $_->{'default'}, + $_->{'name'}, + $names->{'strings'}[$_->{'name'}][3][1]{1033}); + $settings = $_->{'settings'}; + foreach (sort { $a <=> $b } keys %$settings) { + $fh->printf("\tSetting %d, name %d # '%s'\n", + $_, $settings->{$_}, $names->{'strings'}[$settings->{$_}][3][1]{1033}); + } + } + + $self; +} + +sub settingName +{ + my ($self, $feature, $setting) = @_; + + $self->read; + + my $names = $self->{' PARENT'}->{'name'}; + $names->read; + + my $features = $self->{'features'}; + my ($featureEntry) = grep { $_->{'feature'} == $feature } @$features; + my $featureName = $names->{'strings'}[$featureEntry->{'name'}][3][1]{1033}; + my $settingName = $featureEntry->{'exclusive'} + ? $names->{'strings'}[$featureEntry->{'settings'}->{$setting}][3][1]{1033} + : $names->{'strings'}[$featureEntry->{'settings'}->{$setting & ~1}][3][1]{1033} + . (($setting & 1) == 0 ? " On" : " Off"); + + ($featureName, $settingName); +} + +1; + +=head1 BUGS + +The version 1 Feat table ends with a feature (id 1) named NoName +with zero settings but with an offset to the last entry in the setting +array. This last setting has id 0 and an invalid name id. This last +feature is changed to have one setting. + +=head1 AUTHOR + +Alan Ward (derived from Jonathan Kew's Feat.pm). +See L for copyright and licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Hdmx.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Hdmx.pm new file mode 100644 index 0000000..d1e47cb --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Hdmx.pm @@ -0,0 +1,149 @@ +package Font::TTF::Hdmx; + +=head1 NAME + +Font::TTF::Hdmx - Horizontal device metrics + +=head1 DESCRIPTION + +The table consists of an hash of device metric tables indexed by the ppem for +that subtable. Each subtable consists of an array of advance widths in pixels +for each glyph at that ppem (horizontally). + +=head1 INSTANCE VARIABLES + +Individual metrics are accessed using the following referencing: + + $f->{'hdmx'}{$ppem}[$glyph_num] + +In addition there is one instance variable: + +=over 4 + +=item Num + +Number of device tables. + +=back + +=head2 METHODS + +=cut + +use strict; +use vars qw(@ISA); + +@ISA = qw(Font::TTF::Table); + + +=head2 $t->read + +Reads the table into data structures + +=cut + +sub read +{ + my ($self) = @_; + my ($fh) = $self->{' INFILE'}; + my ($numg, $ppem, $i, $numt, $dat, $len); + + $numg = $self->{' PARENT'}{'maxp'}{'numGlyphs'}; + $self->SUPER::read or return $self; + + $fh->read($dat, 8); + ($self->{'Version'}, $numt, $len) = unpack("nnN", $dat); + $self->{'Num'} = $numt; + + for ($i = 0; $i < $numt; $i++) + { + $fh->read($dat, $len); + $ppem = unpack("C", $dat); + $self->{$ppem} = [unpack("C$numg", substr($dat, 2))]; + } + $self; +} + + +=head2 $t->out($fh) + +Outputs the device metrics for this font + +=cut + +sub out +{ + my ($self, $fh) = @_; + my ($numg, $i, $pad, $len, $numt, @ppem, $max); + + return $self->SUPER::out($fh) unless ($self->{' read'}); + + $numg = $self->{' PARENT'}{'maxp'}{'numGlyphs'}; + @ppem = grep(/^\d+$/, sort {$a <=> $b} keys %$self); + $pad = "\000" x (3 - ($numg + 1) % 4); + $len = $numg + 2 + length($pad); + $fh->print(pack("nnN", 0, $#ppem + 1, $len)); + for $i (@ppem) + { + $max = 0; + foreach (@{$self->{$i}}[0..($numg - 1)]) + { $max = $_ if $_ > $max; } + $fh->print(pack("C*", $i, $max, @{$self->{$i}}[0..($numg - 1)]) . $pad); + } + $self; +} + + +=head2 $t->tables_do(&func) + +For each subtable it calls &sub($ref, $ppem) + +=cut + +sub tables_do +{ + my ($self, $func) = @_; + my ($i); + + foreach $i (grep(/^\d+$/, %$self)) + { &$func($self->{$i}, $i); } + $self; +} + + +=head2 $t->XML_element($context, $depth, $key, $value) + +Outputs device metrics a little more tidily + +=cut + +sub XML_element +{ + my ($self) = shift; + my ($context, $depth, $key, $value) = @_; + my ($fh) = $context->{'fh'}; + my ($i); + + return $self->SUPER::XML_element(@_) if (ref($value) ne 'ARRAY'); + $fh->print("$depth\n"); + for ($i = 0; $i <= $#{$value}; $i += 25) + { + $fh->print("$depth$context->{'indent'}". join(' ', @{$value}[$i .. $i + 24]) . "\n"); + } + $fh->print("$depth\n"); + $self; +} + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Head.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Head.pm new file mode 100644 index 0000000..362e8e4 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Head.pm @@ -0,0 +1,250 @@ +package Font::TTF::Head; + +=head1 NAME + +Font::TTF::Head - The head table for a TTF Font + +=head1 DESCRIPTION + +This is a very basic table with just instance variables as described in the +TTF documentation, using the same names. One of the most commonly used is +C. + +=head1 INSTANCE VARIABLES + +The C table has no internal instance variables beyond those common to all +tables and those specified in the standard: + + version + fontRevision + checkSumAdjustment + magicNumber + flags + unitsPerEm + created + modified + xMin + yMin + xMax + yMax + macStyle + lowestRecPPEM + fontDirectionHint + indexToLocFormat + glyphDataFormat + +The two dates are held as an array of two unsigned longs (32-bits) + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA %fields @field_info); + +require Font::TTF::Table; +use Font::TTF::Utils; + +@ISA = qw(Font::TTF::Table); +@field_info = ( + 'version' => 'v', + 'fontRevision' => 'f', + 'checkSumAdjustment' => 'L', + 'magicNumber' => 'L', + 'flags' => 'S', + 'unitsPerEm' => 'S', + 'created' => 'L2', + 'modified' => 'L2', + 'xMin' => 's', + 'yMin' => 's', + 'xMax' => 's', + 'yMax' => 's', + 'macStyle' => 'S', + 'lowestRecPPEM' => 'S', + 'fontDirectionHint' => 's', + 'indexToLocFormat' => 's', + 'glyphDataFormat' => 's'); + +sub init +{ + my ($k, $v, $c, $i); + for ($i = 0; $i < $#field_info; $i += 2) + { + ($k, $v, $c) = TTF_Init_Fields($field_info[$i], $c, $field_info[$i + 1]); + next unless defined $k && $k ne ""; + $fields{$k} = $v; + } +} + + +=head2 $t->read + +Reads the table into memory thanks to some utility functions + +=cut + +sub read +{ + my ($self) = @_; + my ($dat); + + $self->SUPER::read || return $self; + + init unless defined $fields{'Ascender'}; + $self->{' INFILE'}->read($dat, 54); + + TTF_Read_Fields($self, $dat, \%fields); + $self; +} + + +=head2 $t->out($fh) + +Writes the table to a file either from memory or by copying. If in memory +(which is usually) the checkSumAdjustment field is set to 0 as per the default +if the file checksum is not to be considered. + +=cut + +sub out +{ + my ($self, $fh) = @_; + + return $self->SUPER::out($fh) unless $self->{' read'}; # this is never true +# $self->{'checkSumAdjustment'} = 0 unless $self->{' PARENT'}{' wantsig'}; + $fh->print(TTF_Out_Fields($self, \%fields, 54)); + $self; +} + + +=head2 $t->XML_element($context, $depth, $key, $value) + +Handles date process for the XML exporter + +=cut + +sub XML_element +{ + my ($self) = shift; + my ($context, $depth, $key, $value) = @_; + my ($fh) = $context->{'fh'}; + my ($output, @time); + my (@month) = qw(JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC); + + return $self->SUPER::XML_element(@_) unless ($key eq 'created' || $key eq 'modified'); + + @time = gmtime($self->getdate($key eq 'created')); + $output = sprintf("%d/%s/%d %d:%d:%d", $time[3], $month[$time[4]], $time[5] + 1900, + $time[2], $time[1], $time[0]); + $fh->print("$depth<$key>$output\n"); + $self; +} + + +=head2 $t->update + +Updates the head table based on the glyph data and the hmtx table + +=cut + +sub update +{ + my ($self) = @_; + my ($num, $i, $loc, $hmtx); + my ($xMin, $yMin, $xMax, $yMax, $lsbx); + + return undef unless ($self->SUPER::update); + + $num = $self->{' PARENT'}{'maxp'}{'numGlyphs'}; + return undef unless (defined $self->{' PARENT'}{'hmtx'} && defined $self->{' PARENT'}{'loca'}); + $hmtx = $self->{' PARENT'}{'hmtx'}->read; + + $self->{' PARENT'}{'loca'}->update; + $hmtx->update; # if we updated, then the flags will be set anyway. + $lsbx = 1; + for ($i = 0; $i < $num; $i++) + { + $loc = $self->{' PARENT'}{'loca'}{'glyphs'}[$i]; + next unless defined $loc; + $loc->read->update_bbox; + $xMin = $loc->{'xMin'} if ($loc->{'xMin'} < $xMin || $i == 0); + $yMin = $loc->{'yMin'} if ($loc->{'yMin'} < $yMin || $i == 0); + $xMax = $loc->{'xMax'} if ($loc->{'xMax'} > $xMax); + $yMax = $loc->{'yMax'} if ($loc->{'yMax'} > $yMax); + $lsbx &= ($loc->{'xMin'} == $hmtx->{'lsb'}[$i]); + } + $self->{'xMin'} = $xMin; + $self->{'yMin'} = $yMin; + $self->{'xMax'} = $xMax; + $self->{'yMax'} = $yMax; + if ($lsbx) + { $self->{'flags'} |= 2; } + else + { $self->{'flags'} &= ~2; } + $self; +} + + +=head2 $t->getdate($is_create) + +Converts font modification time (or creation time if $is_create is set) to a 32-bit integer as returned +from time(). Returns undef if the value is out of range, either before the epoch or after the maximum +storable time. + +=cut + +sub getdate +{ + my ($self, $is_create) = @_; + my ($arr) = $self->{$is_create ? 'created' : 'modified'}; + + $arr->[1] -= 2082844800; # seconds between 1/Jan/1904 and 1/Jan/1970 (midnight) + if ($arr->[1] < 0) + { + $arr->[1] += 0xFFFFFFF; $arr->[1]++; + $arr->[0]--; + } + return undef if $arr->[0] != 0; + return $arr->[1]; +} + + +=head2 $t->setdate($time, $is_create) + +Sets the time information for modification (or creation time if $is_create is set) according to the 32-bit +time information. + +=cut + +sub setdate +{ + my ($self, $time, $is_create) = @_; + my (@arr); + + $arr[1] = $time; + if ($arr[1] >= 0x83DA4F80) + { + $arr[1] -= 0xFFFFFFFF; + $arr[1]--; + $arr[0]++; + } + $arr[1] += 2082844800; + $self->{$is_create ? 'created' : 'modified'} = \@arr; + $self; +} + + +1; + + +=head1 BUGS + +None known + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Hhea.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Hhea.pm new file mode 100644 index 0000000..cb923b1 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Hhea.pm @@ -0,0 +1,159 @@ +package Font::TTF::Hhea; + +=head1 NAME + +Font::TTF::Hhea - Horizontal Header table + +=head1 DESCRIPTION + +This is a simplte table with just standards specified instance variables + +=head1 INSTANCE VARIABLES + + version + Ascender + Descender + LineGap + advanceWidthMax + minLeftSideBearing + minRightSideBearing + xMaxExtent + caretSlopeRise + caretSlopeRun + metricDataFormat + numberOfHMetrics + + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA %fields @field_info); + +require Font::TTF::Table; +use Font::TTF::Utils; + +@ISA = qw(Font::TTF::Table); +@field_info = ( + 'version' => 'v', + 'Ascender' => 's', + 'Descender' => 's', + 'LineGap' => 's', + 'advanceWidthMax' => 'S', + 'minLeftSideBearing' => 's', + 'minRightSideBearing' => 's', + 'xMaxExtent' => 's', + 'caretSlopeRise' => 's', + 'caretSlopeRun' => 's', + 'metricDataFormat' => '+10s', + 'numberOfHMetrics' => 'S'); + +sub init +{ + my ($k, $v, $c, $i); + for ($i = 0; $i < $#field_info; $i += 2) + { + ($k, $v, $c) = TTF_Init_Fields($field_info[$i], $c, $field_info[$i + 1]); + next unless defined $k && $k ne ""; + $fields{$k} = $v; + } +} + + +=head2 $t->read + +Reads the table into memory as instance variables + +=cut + +sub read +{ + my ($self) = @_; + my ($dat); + + $self->SUPER::read or return $self; + init unless defined $fields{'Ascender'}; + $self->{' INFILE'}->read($dat, 36); + + TTF_Read_Fields($self, $dat, \%fields); + $self; +} + + +=head2 $t->out($fh) + +Writes the table to a file either from memory or by copying. + +=cut + +sub out +{ + my ($self, $fh) = @_; + + return $self->SUPER::out($fh) unless $self->{' read'}; + + $self->{'numberOfHMetrics'} = $self->{' PARENT'}{'hmtx'}->numMetrics || $self->{'numberOfHMetrics'}; + $fh->print(TTF_Out_Fields($self, \%fields, 36)); + $self; +} + + +=head2 $t->update + +Updates various parameters in the hhea table from the hmtx table. + +=cut + +sub update +{ + my ($self) = @_; + my ($hmtx) = $self->{' PARENT'}{'hmtx'}; + my ($glyphs); + my ($num, $res); + my ($i, $maw, $mlsb, $mrsb, $mext, $aw, $lsb, $ext); + + return undef unless ($self->SUPER::update); + return undef unless (defined $hmtx && defined $self->{' PARENT'}{'loca'}); + + $hmtx->read->update; + $self->{' PARENT'}{'loca'}->read->update; + $glyphs = $self->{' PARENT'}{'loca'}{'glyphs'}; + $num = $self->{' PARENT'}{'maxp'}{'numGlyphs'}; + + for ($i = 0; $i < $num; $i++) + { + $aw = $hmtx->{'advance'}[$i]; + $lsb = $hmtx->{'lsb'}[$i]; + if (defined $glyphs->[$i]) + { $ext = $lsb + $glyphs->[$i]->read->{'xMax'} - $glyphs->[$i]{'xMin'}; } + else + { $ext = $aw; } + $maw = $aw if ($aw > $maw); + $mlsb = $lsb if ($lsb < $mlsb or $i == 0); + $mrsb = $aw - $ext if ($aw - $ext < $mrsb or $i == 0); + $mext = $ext if ($ext > $mext); + } + $self->{'advanceWidthMax'} = $maw; + $self->{'minLeftSideBearing'} = $mlsb; + $self->{'minRightSideBearing'} = $mrsb; + $self->{'xMaxExtent'} = $mext; + $self->{'numberOfHMetrics'} = $hmtx->numMetrics; + $self; +} + + +1; + + +=head1 BUGS + +None known + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Hmtx.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Hmtx.pm new file mode 100644 index 0000000..537df94 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Hmtx.pm @@ -0,0 +1,214 @@ +package Font::TTF::Hmtx; + +=head1 NAME + +Font::TTF::Hmtx - Horizontal Metrics + +=head1 DESCRIPTION + +Contains the advance width and left side bearing for each glyph. Given the +compressability of the data onto disk, this table uses information from +other tables, and thus must do part of its output during the output of +other tables + +=head1 INSTANCE VARIABLES + +The horizontal metrics are kept in two arrays by glyph id. The variable names +do not start with a space + +=over 4 + +=item advance + +An array containing the advance width for each glyph + +=item lsb + +An array containing the left side bearing for each glyph + +=back + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA); +require Font::TTF::Table; + +@ISA = qw(Font::TTF::Table); + + +=head2 $t->read + +Reads the horizontal metrics from the TTF file into memory + +=cut + +sub read +{ + my ($self) = @_; + my ($numh, $numg); + + $numh = $self->{' PARENT'}{'hhea'}->read->{'numberOfHMetrics'}; + $numg = $self->{' PARENT'}{'maxp'}{'numGlyphs'}; + $self->_read($numg, $numh, "advance", "lsb"); +} + +sub _read +{ + my ($self, $numg, $numh, $tAdv, $tLsb) = @_; + my ($fh) = $self->{' INFILE'}; + my ($i, $dat); + + $self->SUPER::read or return $self; + + for ($i = 0; $i < $numh; $i++) + { + $fh->read($dat, 4); + ($self->{$tAdv}[$i], $self->{$tLsb}[$i]) = unpack("nn", $dat); + $self->{$tLsb}[$i] -= 65536 if ($self->{$tLsb}[$i] >= 32768); + } + + $i--; + while (++$i < $numg) + { + $fh->read($dat, 2); + $self->{$tAdv}[$i] = $self->{$tAdv}[$numh - 1]; + $self->{$tLsb}[$i] = unpack("n", $dat); + $self->{$tLsb}[$i] -= 65536 if ($self->{$tLsb}[$i] >= 32768); + } + $self; +} + +=head2 $t->numMetrics + +Calculates again the number of long metrics required to store the information +here. Returns undef if the table has not been read. + +=cut + +sub numMetrics +{ + my ($self) = @_; + my ($numg) = $self->{' PARENT'}{'maxp'}{'numGlyphs'}; + my ($i); + + return undef unless $self->{' read'}; + + for ($i = $numg - 2; $i >= 0; $i--) + { last if ($self->{'advance'}[$i] != $self->{'advance'}[$i + 1]); } + + return $i + 2; +} + + +=head2 $t->out($fh) + +Writes the metrics to a TTF file. Assumes that the C has updated the +numHMetrics from here + +=cut + +sub out +{ + my ($self, $fh) = @_; + my ($numg) = $self->{' PARENT'}{'maxp'}{'numGlyphs'}; + my ($numh) = $self->{' PARENT'}{'hhea'}->read->{'numberOfHMetrics'}; + $self->_out($fh, $numg, $numh, "advance", "lsb"); +} + +sub _out +{ + my ($self, $fh, $numg, $numh, $tAdv, $tLsb) = @_; + my ($i, $lsb); + + return $self->SUPER::out($fh) unless ($self->{' read'}); + + for ($i = 0; $i < $numg; $i++) + { + $lsb = $self->{$tLsb}[$i]; + $lsb += 65536 if $lsb < 0; + if ($i >= $numh) + { $fh->print(pack("n", $lsb)); } + else + { $fh->print(pack("n2", $self->{$tAdv}[$i], $lsb)); } + } + $self; +} + + +=head2 $t->update + +Updates the lsb values from the xMin from the each glyph + +=cut + +sub update +{ + my ($self) = @_; + my ($numg) = $self->{' PARENT'}{'maxp'}{'numGlyphs'}; + my ($i); + + return undef unless ($self->SUPER::update); +# lsb & xMin must always be the same, regardless of any flags! +# return $self unless ($self->{' PARENT'}{'head'}{'flags'} & 2); # lsb & xMin the same + + $self->{' PARENT'}{'loca'}->update; + for ($i = 0; $i < $numg; $i++) + { + my ($g) = $self->{' PARENT'}{'loca'}{'glyphs'}[$i]; + if ($g) + { $self->{'lsb'}[$i] = $g->read->update_bbox->{'xMin'}; } + else + { $self->{'lsb'}[$i] = 0; } + } + $self->{' PARENT'}{'head'}{'flags'} |= 2; + $self; +} + + +=head2 $t->out_xml($context, $depth) + +Outputs the table in XML + +=cut + +sub out_xml +{ + my ($self, $context, $depth) = @_; + my ($fh) = $context->{'fh'}; + my ($numg) = $self->{' PARENT'}{'maxp'}{'numGlyphs'}; + my ($addr) = ($self =~ m/\((.+)\)$/o); + my ($i); + + if ($context->{'addresses'}{$addr}) + { + $fh->printf("%s<%s id_ref='%s'/>\n", $depth, $context->{'name'}, $addr); + return $self; + } + else + { $fh->printf("%s<%s id='%s'>\n", $depth, $context->{'name'}, $addr); } + + $self->read; + + for ($i = 0; $i < $numg; $i++) + { $fh->print("$depth$context->{'indent'}\n"); } + + $fh->print("$depth{'name'}>\n"); + $self; +} + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Kern.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Kern.pm new file mode 100644 index 0000000..80f66d9 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Kern.pm @@ -0,0 +1,296 @@ +package Font::TTF::Kern; + +=head1 NAME + +Font::TTF::Kern - Kerning tables + +=head1 DESCRIPTION + +Kerning tables are held as an ordered collection of subtables each giving +incremental information regarding the kerning of various pairs of glyphs. + +The basic structure of the kerning data structure is: + + $kern = $f->{'kern'}{'tables'}[$tnum]{'kerns'}{$leftnum}{$rightnum}; + +Due to the possible complexity of some kerning tables the above information +is insufficient. Reference also needs to be made to the type of the table and +the coverage field. + +=head1 INSTANCE VARIABLES + +The instance variables for a kerning table are relatively straightforward. + +=over 4 + +=item Version + +Version number of the kerning table + +=item Num + +Number of subtables in the kerning table + +=item tables + +Array of subtables in the kerning table + +=over 4 + +Each subtable has a number of instance variables. + +=item kern + +A two level hash array containing kerning values. The indexing is left +value and then right value. In the case of type 2 tables, the indexing +is via left class and right class. It may seem using hashes is strange, +but most tables are not type 2 and this method saves empty array values. + +=item type + +Stores the table type. Only type 0 and type 2 tables are specified for +TrueType so far. + +=item coverage + +A bit field of coverage information regarding the kerning value. See the +TrueType specification for details. + +=item Version + +Contains the version number of the table. + +=item Num + +Number of kerning pairs in this type 0 table. + +=item left + +An array indexed by glyph - left_first which returns a class number for +the glyph in type 2 tables. + +=item right + +An array indexed by glyph - right_first which returns a class number for +the glyph in type 2 tables. + +=item left_first + +the glyph number of the first element in the left array for type 2 tables. + +=item right_first + +the glyph number of the first element in the right array for type 2 tables. + +=item num_left + +Number of left classes + +=item num_right + +Number of right classes + +=back + +=back + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA); +use Font::TTF::Utils; +use Font::TTF::Table; + +@ISA = qw(Font::TTF::Table); + +=head2 $t->read + +Reads the whole kerning table into structures + +=cut + +sub read +{ + my ($self) = @_; + my ($fh) = $self->{' INFILE'}; + my ($dat, $i, $numt, $len, $cov, $t); + + $self->SUPER::read or return $self; + + $fh->read($dat, 4); + ($self->{'Version'}, $numt) = unpack("n2", $dat); + $self->{'Num'} = $numt; + + for ($i = 0; $i < $numt; $i++) + { + $t = {}; + $fh->read($dat, 6); + ($t->{'Version'}, $len, $cov) = unpack("n3", $dat); + $t->{'coverage'} = $cov & 255; + $t->{'type'} = $cov >> 8; + $fh->read($dat, $len - 6); + if ($t->{'Version'} == 0) + { + $t->{'Num'} = unpack("n", $dat); + my (@vals) = unpack("n*", substr($dat, 8, $t->{'Num'} * 6)); + for (0 .. ($t->{'Num'} - 1)) + { + my ($f, $l, $v); + $f = shift @vals; + $l = shift @vals; + $v = shift @vals; + $v -= 65536 if ($v > 32767); + $t->{'kern'}{$f}{$l} = $v; + } + } elsif ($t->{'Version'} == 2) + { + my ($wid, $off, $numg, $maxl, $maxr, $j); + + $wid = unpack("n", $dat); + $off = unpack("n", substr($dat, 2)); + ($t->{'left_first'}, $numg) = unpack("n2", substr($dat, $off)); + $t->{'left'} = [unpack("C$numg", substr($dat, $off + 4))]; + foreach (@{$t->{'left'}}) + { + $_ /= $wid; + $maxl = $_ if ($_ > $maxl); + } + $t->{'left_max'} = $maxl; + + $off = unpack("n", substr($dat, 4)); + ($t->{'right_first'}, $numg) = unpack("n2", substr($dat, $off)); + $t->{'right'} = [unpack("C$numg", substr($dat, $off + 4))]; + foreach (@{$t->{'right'}}) + { + $_ >>= 1; + $maxr = $_ if ($_ > $maxr); + } + $t->{'right_max'} = $maxr; + + $off = unpack("n", substr($dat, 6)); + for ($j = 0; $j <= $maxl; $j++) + { + my ($k) = 0; + + map { $t->{'kern'}{$j}{$k} = $_ if $_; $k++; } + unpack("n$maxr", substr($dat, $off + $wid * $j)); + } + } + push (@{$self->{'tables'}}, $t); + } + $self; +} + + +=head2 $t->out($fh) + +Outputs the kerning tables to the given file + +=cut + +sub out +{ + my ($self, $fh) = @_; + my ($i, $l, $r, $loc, $loc1, $t); + + return $self->SUPER::out($fh) unless ($self->{' read'}); + + $fh->print(pack("n2", $self->{'Version'}, $self->{'Num'})); + for ($i = 0; $i < $self->{'Num'}; $i++) + { + $t = $self->{'tables'}[$i]; + $loc = $fh->tell(); + + $fh->print(pack("nnn", $t->{'Version'}, 0, $t->{'coverage'})); + if ($t->{'Version'} == 0) + { + my ($dat); + foreach $l (sort {$a <=> $b} keys %{$t->{'kern'}}) + { + foreach $r (sort {$a <=> $b} keys %{$t->{'kern'}{$l}}) + { $dat .= TTF_Pack("SSs", $l, $r, $t->{'kern'}{$l}{$r}); } + } + $fh->print(TTF_Pack("SSSS", Font::TTF::Utils::TTF_bininfo(length($dat) / 6, 6))); + $fh->print($dat); + } elsif ($t->{'Version'} == 2) + { + my ($arr); + + $fh->print(pack("nnnn", $t->{'right_max'} << 1, 8, ($#{$t->{'left'}} + 7) << 1, + ($#{$t->{'left'}} + $#{$t->{'right'}} + 10) << 1)); + + $fh->print(pack("nn", $t->{'left_first'}, $#{$t->{'left'}} + 1)); + foreach (@{$t->{'left'}}) + { $fh->print(pack("C", $_ * (($t->{'left_max'} + 1) << 1))); } + + $fh->print(pack("nn", $t->{'right_first'}, $#{$t->{'right'}} + 1)); + foreach (@{$t->{'right'}}) + { $fh->print(pack("C", $_ << 1)); } + + $arr = "\000\000" x (($t->{'left_max'} + 1) * ($t->{'right_max'} + 1)); + foreach $l (keys %{$t->{'kern'}}) + { + foreach $r (keys %{$t->{'kern'}{$l}}) + { substr($arr, ($l * ($t->{'left_max'} + 1) + $r) << 1, 2) + = pack("n", $t->{'kern'}{$l}{$r}); } + } + $fh->print($arr); + } + $loc1 = $fh->tell(); + $fh->seek($loc + 2, 0); + $fh->print(pack("n", $loc1 - $loc)); + $fh->seek($loc1, 0); + } + $self; +} + + +=head2 $t->XML_element($context, $depth, $key, $value) + +Handles outputting the kern hash into XML a little more tidily + +=cut + +sub XML_element +{ + my ($self) = shift; + my ($context, $depth, $key, $value) = @_; + my ($fh) = $context->{'fh'}; + my ($f, $l); + + return $self->SUPER::XML_element(@_) unless ($key eq 'kern'); + $fh->print("$depth\n"); + foreach $f (sort {$a <=> $b} keys %{$value}) + { + foreach $l (sort {$a <=> $b} keys %{$value->{$f}}) + { $fh->print("$depth$context->{'indent'}\n"); } + } + $fh->print("$depth\n"); + $self; +} + +1; + +=head1 BUGS + +=over 4 + +=item * + +Only supports kerning table types 0 & 2. + +=item * + +No real support functions to I anything with the kerning tables yet. + +=back + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Kern/ClassArray.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Kern/ClassArray.pm new file mode 100644 index 0000000..ddc630e --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Kern/ClassArray.pm @@ -0,0 +1,153 @@ +package Font::TTF::Kern::ClassArray; + +=head1 NAME + +Font::TTF::Kern::ClassArray - ClassArray Kern Subtable for AAT + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA); +use Font::TTF::Utils; +use Font::TTF::AATutils; +use IO::File; + +@ISA = qw(Font::TTF::Kern::Subtable); + +sub new +{ + my ($class) = @_; + my ($self) = {}; + + $class = ref($class) || $class; + bless $self, $class; +} + +=head2 $t->read + +Reads the table into memory + +=cut + +sub read +{ + my ($self, $fh) = @_; + + my $subtableStart = $fh->tell() - 8; + my $dat; + $fh->read($dat, 8); + my ($rowWidth, $leftClassTable, $rightClassTable, $array) = unpack("nnnn", $dat); + + $fh->seek($subtableStart + $leftClassTable, IO::File::SEEK_SET); + $fh->read($dat, 4); + my ($firstGlyph, $nGlyphs) = unpack("nn", $dat); + $fh->read($dat, $nGlyphs * 2); + my $leftClasses = []; + foreach (TTF_Unpack("S*", $dat)) { + push @{$leftClasses->[($_ - $array) / $rowWidth]}, $firstGlyph++; + } + + $fh->seek($subtableStart + $rightClassTable, IO::File::SEEK_SET); + $fh->read($dat, 4); + ($firstGlyph, $nGlyphs) = unpack("nn", $dat); + $fh->read($dat, $nGlyphs * 2); + my $rightClasses = []; + foreach (TTF_Unpack("S*", $dat)) { + push @{$rightClasses->[$_ / 2]}, $firstGlyph++; + } + + $fh->seek($subtableStart + $array, IO::File::SEEK_SET); + $fh->read($dat, $self->{'length'} - $array); + + my $offset = 0; + my $kernArray = []; + while ($offset < length($dat)) { + push @$kernArray, [ TTF_Unpack("s*", substr($dat, $offset, $rowWidth)) ]; + $offset += $rowWidth; + } + + $self->{'leftClasses'} = $leftClasses; + $self->{'rightClasses'} = $rightClasses; + $self->{'kernArray'} = $kernArray; + + $fh->seek($subtableStart + $self->{'length'}, IO::File::SEEK_SET); + + $self; +} + +=head2 $t->out_sub($fh) + +Writes the table to a file + +=cut + +sub out_sub +{ +} + +=head2 $t->print($fh) + +Prints a human-readable representation of the table + +=cut + +sub print +{ + my ($self, $fh) = @_; + + my $post = $self->post(); + + $fh = 'STDOUT' unless defined $fh; + + +} + +sub dumpXML +{ + my ($self, $fh) = @_; + my $post = $self->post(); + + $fh = 'STDOUT' unless defined $fh; + $fh->printf("\n"); + $self->dumpClasses($self->{'leftClasses'}, $fh); + $fh->printf("\n"); + + $fh->printf("\n"); + $self->dumpClasses($self->{'rightClasses'}, $fh); + $fh->printf("\n"); + + $fh->printf("\n"); + my $kernArray = $self->{'kernArray'}; + foreach (0 .. $#$kernArray) { + $fh->printf("\n", $_); + my $row = $kernArray->[$_]; + foreach (0 .. $#$row) { + $fh->printf("\n", $_, $row->[$_]); + } + $fh->printf("\n"); + } + $fh->printf("\n"); +} + +sub type +{ + return 'kernClassArray'; +} + + + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Jonathan Kew L. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Kern/CompactClassArray.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Kern/CompactClassArray.pm new file mode 100644 index 0000000..ab0304a --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Kern/CompactClassArray.pm @@ -0,0 +1,93 @@ +package Font::TTF::Kern::CompactClassArray; + +=head1 NAME + +Font::TTF::Kern::CompactClassArray - Compact Class Array kern subtable for AAT + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA); +use Font::TTF::Utils; +use Font::TTF::AATutils; + +@ISA = qw(Font::TTF::Kern::Subtable); + +sub new +{ + my ($class) = @_; + my ($self) = {}; + + $class = ref($class) || $class; + bless $self, $class; +} + +=head2 $t->read + +Reads the table into memory + +=cut + +sub read +{ + my ($self, $fh) = @_; + + die "incomplete"; + + $self; +} + +=head2 $t->out($fh) + +Writes the table to a file + +=cut + +sub out_sub +{ + my ($self, $fh) = @_; + + die "incomplete"; + + $self; +} + +=head2 $t->print($fh) + +Prints a human-readable representation of the table + +=cut + +sub print +{ + my ($self, $fh) = @_; + + my $post = $self->post(); + + $fh = 'STDOUT' unless defined $fh; + + die "incomplete"; +} + + +sub type +{ + return 'kernCompactClassArray'; +} + + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Jonathan Kew L. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Kern/OrderedList.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Kern/OrderedList.pm new file mode 100644 index 0000000..41cc8c1 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Kern/OrderedList.pm @@ -0,0 +1,108 @@ +package Font::TTF::Kern::OrderedList; + +=head1 NAME + +Font::TTF::Kern::OrderedList - Ordered List Kern subtable for AAT + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA); +use Font::TTF::Utils; +use Font::TTF::AATutils; + +@ISA = qw(Font::TTF::Kern::Subtable); + +sub new +{ + my ($class, @options) = @_; + my ($self) = {}; + + $class = ref($class) || $class; + bless $self, $class; +} + +=head2 $t->read + +Reads the table into memory + +=cut + +sub read +{ + my ($self, $fh) = @_; + + my $dat; + $fh->read($dat, 8); + my ($nPairs, $searchRange, $entrySelector, $rangeShift) = unpack("nnnn", $dat); + + my $pairs = []; + foreach (1 .. $nPairs) { + $fh->read($dat, 6); + my ($left, $right, $kern) = TTF_Unpack("SSs", $dat); + push @$pairs, { 'left' => $left, 'right' => $right, 'kern' => $kern } if $kern != 0; + } + + $self->{'kernPairs'} = $pairs; + + $self; +} + +=head2 $t->out_sub($fh) + +Writes the table to a file + +=cut + +sub out_sub +{ + my ($self, $fh) = @_; + + my $pairs = $self->{'kernPairs'}; + $fh->print(pack("nnnn", TTF_bininfo(scalar @$pairs, 6))); + + foreach (sort { $a->{'left'} <=> $b->{'left'} or $a->{'right'} <=> $b->{'right'} } @$pairs) { + $fh->print(TTF_Pack("SSs", $_->{'left'}, $_->{'right'}, $_->{'kern'})); + } +} + +=head2 $t->print($fh) + +Prints a human-readable representation of the table + +=cut + +sub dumpXML +{ + my ($self, $fh) = @_; + + my $postVal = $self->post()->{'VAL'}; + + $fh = 'STDOUT' unless defined $fh; + foreach (@{$self->{'kernPairs'}}) { + $fh->printf("\n", $postVal->[$_->{'left'}], $postVal->[$_->{'right'}], $_->{'kern'}); + } +} + + +sub type +{ + return 'kernOrderedList'; +} + + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Jonathan Kew L. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Kern/StateTable.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Kern/StateTable.pm new file mode 100644 index 0000000..51d650a --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Kern/StateTable.pm @@ -0,0 +1,143 @@ +package Font::TTF::Kern::StateTable; + +=head1 NAME + +Font::TTF::Kern::StateTable - State Table Kern subtable for AAT + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA); +use Font::TTF::Utils; +use Font::TTF::AATutils; +use Font::TTF::Kern::Subtable; +use IO::File; + +@ISA = qw(Font::TTF::Kern::Subtable); + +sub new +{ + my ($class) = @_; + my ($self) = {}; + + $class = ref($class) || $class; + bless $self, $class; +} + +=head2 $t->read + +Reads the table into memory + +=cut + +sub read +{ + my ($self, $fh) = @_; + my ($dat); + + my $stTableStart = $fh->tell(); + + my ($classes, $states, $entries) = AAT_read_state_table($fh, 0); + + foreach (@$entries) { + my $flags = $_->{'flags'}; + delete $_->{'flags'}; + $_->{'push'} = 1 if $flags & 0x8000; + $_->{'noAdvance'} = 1 if $flags & 0x4000; + $flags &= ~0xC000; + if ($flags != 0) { + my $kernList = []; + $fh->seek($stTableStart + $flags, IO::File::SEEK_SET); + while (1) { + $fh->read($dat, 2); + my $k = TTF_Unpack("s", $dat); + push @$kernList, ($k & ~1); + last if ($k & 1) != 0; + } + $_->{'kernList'} = $kernList; + } + } + + $self->{'classes'} = $classes; + $self->{'states'} = $states; + $self->{'entries'} = $entries; + + $fh->seek($stTableStart - 8 + $self->{'length'}, IO::File::SEEK_SET); + + $self; +} + +=head2 $t->out_sub($fh) + +Writes the table to a file + +=cut + +sub out_sub +{ +} + +=head2 $t->print($fh) + +Prints a human-readable representation of the table + +=cut + +sub print +{ +} + +sub dumpXML +{ + my ($self, $fh) = @_; + + $fh->printf("\n"); + $self->dumpClasses($self->{'classes'}, $fh); + $fh->printf("\n"); + + $fh->printf("\n"); + my $states = $self->{'states'}; + foreach (0 .. $#$states) { + $fh->printf("\n", $_); + my $members = $states->[$_]; + foreach (0 .. $#$members) { + my $m = $members->[$_]; + $fh->printf("{'nextState'}); + $fh->printf(" push=\"1\"") if $m->{'push'}; + $fh->printf(" noAdvance=\"1\"") if $m->{'noAdvance'}; + if (exists $m->{'kernList'}) { + $fh->printf(">"); + foreach (@{$m->{'kernList'}}) { + $fh->printf("", $_); + } + $fh->printf("\n"); + } + else { + $fh->printf("/>\n"); + } + } + $fh->printf("\n"); + } + $fh->printf("\n"); +} + +sub type +{ + return 'kernStateTable'; +} + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Jonathan Kew L. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Kern/Subtable.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Kern/Subtable.pm new file mode 100644 index 0000000..b1db410 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Kern/Subtable.pm @@ -0,0 +1,175 @@ +package Font::TTF::Kern::Subtable; + +=head1 NAME + +Font::TTF::Kern::Subtable - Kern Subtable superclass for AAT + +=head1 METHODS + +=cut + +use strict; +use Font::TTF::Utils; +use Font::TTF::AATutils; +use IO::File; + +require Font::TTF::Kern::OrderedList; +require Font::TTF::Kern::StateTable; +require Font::TTF::Kern::ClassArray; +require Font::TTF::Kern::CompactClassArray; + +sub new +{ + my ($class) = @_; + my ($self) = {}; + + $class = ref($class) || $class; + + bless $self, $class; +} + +sub create +{ + my ($class, $type, $coverage, $length) = @_; + + $class = ref($class) || $class; + + my $subclass; + if ($type == 0) { + $subclass = 'Font::TTF::Kern::OrderedList'; + } + elsif ($type == 1) { + $subclass = 'Font::TTF::Kern::StateTable'; + } + elsif ($type == 2) { + $subclass = 'Font::TTF::Kern::ClassArray'; + } + elsif ($type == 3) { + $subclass = 'Font::TTF::Kern::CompactClassArray'; + } + + my @options; + push @options,'vertical' if ($coverage & 0x8000) != 0; + push @options,'crossStream' if ($coverage & 0x4000) != 0; + push @options,'variation' if ($coverage & 0x2000) != 0; + + my ($subTable) = $subclass->new(@options); + + map { $subTable->{$_} = 1 } @options; + + $subTable->{'type'} = $type; + $subTable->{'length'} = $length; + + $subTable; +} + +=head2 $t->out($fh) + +Writes the table to a file + +=cut + +sub out +{ + my ($self, $fh) = @_; + + my $subtableStart = $fh->tell(); + my $type = $self->{'type'}; + my $coverage = $type; + $coverage += 0x8000 if $self->{'vertical'}; + $coverage += 0x4000 if $self->{'crossStream'}; + $coverage += 0x2000 if $self->{'variation'}; + + $fh->print(TTF_Pack("LSS", 0, $coverage, $self->{'tupleIndex'})); # placeholder for length + + $self->out_sub($fh); + + my $length = $fh->tell() - $subtableStart; + my $padBytes = (4 - ($length & 3)) & 3; + $fh->print(pack("C*", (0) x $padBytes)); + $length += $padBytes; + $fh->seek($subtableStart, IO::File::SEEK_SET); + $fh->print(pack("N", $length)); + $fh->seek($subtableStart + $length, IO::File::SEEK_SET); +} + +=head2 $t->print($fh) + +Prints a human-readable representation of the table + +=cut + +sub post +{ + my ($self) = @_; + + my $post = $self->{' PARENT'}{' PARENT'}{'post'}; + if (defined $post) { + $post->read; + } + else { + $post = {}; + } + + return $post; +} + +sub print +{ + my ($self, $fh) = @_; + + my $post = $self->post(); + $fh = 'STDOUT' unless defined $fh; +} + +=head2 $t->print_classes($fh) + +Prints a human-readable representation of the table + +=cut + +sub print_classes +{ + my ($self, $fh) = @_; + + my $post = $self->post(); + + my $classes = $self->{'classes'}; + foreach (0 .. $#$classes) { + my $class = $classes->[$_]; + if (defined $class) { + $fh->printf("\t\tClass %d:\t%s\n", $_, join(", ", map { $_ . " [" . $post->{'VAL'}[$_] . "]" } @$class)); + } + } +} + +sub dumpClasses +{ + my ($self, $classes, $fh) = @_; + my $post = $self->post(); + + foreach (0 .. $#$classes) { + my $c = $classes->[$_]; + if ($#$c > -1) { + $fh->printf("\n", $_); + foreach (@$c) { + $fh->printf("\n", $_, $post->{'VAL'}[$_]); + } + $fh->printf("\n"); + } + } +} + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Jonathan Kew L. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/LTSH.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/LTSH.pm new file mode 100644 index 0000000..2b2dea6 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/LTSH.pm @@ -0,0 +1,88 @@ +package Font::TTF::LTSH; + +=head1 NAME + +Font::TTF::LTSH - Linear Threshold table + +=head1 DESCRIPTION + +Holds the linear threshold for each glyph. This is the ppem value at which a +glyph's metrics become linear. The value is set to 1 if a glyph's metrics are +always linear. + +=head1 INSTANCE VARIABLES + +=over 4 + +=item glyphs + +An array of ppem values. One value per glyph + +=back + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA); +use Font::TTF::Table; + +@ISA = qw(Font::TTF::Table); + +=head2 $t->read + +Reads the table + +=cut + +sub read +{ + my ($self) = @_; + my ($fh) = $self->{' INFILE'}; + my ($numg, $dat); + + $self->SUPER::read or return $self; + + $fh->read($dat, 4); + ($self->{'Version'}, $numg) = unpack("nn", $dat); + $self->{'Num'} = $numg; + + $fh->read($dat, $numg); + $self->{'glyphs'} = [unpack("C$numg", $dat)]; + $self; +} + + +=head2 $t->out($fh) + +Outputs the LTSH to the given fh. + +=cut + +sub out +{ + my ($self, $fh) = @_; + my ($numg) = $self->{' PARENT'}{'maxp'}{'numGlyphs'}; + + return $self->SUPER::out($fh) unless ($self->{' read'}); + + $fh->print(pack("nn", 0, $numg)); + $fh->print(pack("C$numg", @{$self->{'glyphs'}})); + $self; +} + + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Loca.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Loca.pm new file mode 100644 index 0000000..ca641bb --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Loca.pm @@ -0,0 +1,183 @@ +package Font::TTF::Loca; + +=head1 NAME + +Font::TTF::Loca - the Locations table, which is intimately tied to the glyf table + +=head1 DESCRIPTION + +The location table holds the directory of locations of each glyph within the +glyf table. Due to this relationship and the unimportance of the actual locations +when it comes to holding glyphs in memory, reading the location table results +in the creation of glyph objects for each glyph and stores them here. +So if you are looking for glyphs, don't look in the C table, look here +instead. + +Things get complicated if you try to change the glyph list within the one table. +The recommendation is to create another clean location object to replace this +table in the font, ensuring that the old table is read first and to transfer +or copy glyphs across from the read table to the new table. + +=head1 INSTANCE VARIABLES + +The instance variables do not start with a space + +=over 4 + +=item glyphs + +An array of glyph objects for each glyph. + +=item glyphtype + +A string containing the class name to create for each new glyph. If empty, +defaults to L. + +=back + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA); +@ISA = qw(Font::TTF::Table); + +require Font::TTF::Glyph; + + +=head2 $t->new + +Creates a new location table making sure it has a glyphs array + +=cut + +sub new +{ + my ($class) = shift; + my ($res) = $class->SUPER::new(@_); + $res->{'glyphs'} = []; + $res; +} + +=head2 $t->read + +Reads the location table creating glyph objects (L) for each glyph +allowing their later reading. + +=cut + +sub read +{ + my ($self) = @_; + my ($fh) = $self->{' INFILE'}; + my ($locFmt) = $self->{' PARENT'}{'head'}{'indexToLocFormat'}; + my ($numGlyphs) = $self->{' PARENT'}{'maxp'}{'numGlyphs'}; + my ($glyfLoc) = $self->{' PARENT'}{'glyf'}{' OFFSET'}; + my ($dat, $last, $i, $loc); + + $self->SUPER::read or return $self; + $fh->read($dat, $locFmt ? 4 : 2); + $last = unpack($locFmt ? "N" : "n", $dat); + for ($i = 0; $i < $numGlyphs; $i++) + { + $fh->read($dat, $locFmt ? 4 : 2); + $loc = unpack($locFmt ? "N" : "n", $dat); + $self->{'glyphs'}[$i] = ($self->{'glyphtype'} || "Font::TTF::Glyph")->new( + LOC => $last << ($locFmt ? 0 : 1), + OUTLOC => $last << ($locFmt ? 0 : 1), + PARENT => $self->{' PARENT'}, + INFILE => $fh, + BASE => $glyfLoc, + OUTLEN => ($loc - $last) << ($locFmt ? 0 : 1), + LEN => ($loc - $last) << ($locFmt ? 0 : 1)) if ($loc != $last); + $last = $loc; + } + $self; +} + + +=head2 $t->out($fh) + +Writes the location table out to $fh. Notice that not having read the location +table implies that the glyf table has not been read either, so the numbers in +the location table are still valid. Let's hope that C and +C haven't changed otherwise we are in big trouble. + +The function uses the OUTLOC location in the glyph calculated when the glyf +table was attempted to be output. + +=cut + +sub out +{ + my ($self, $fh) = @_; + my ($locFmt) = $self->{' PARENT'}{'head'}{'indexToLocFormat'}; + my ($numGlyphs) = $self->{' PARENT'}{'maxp'}{'numGlyphs'}; + my ($count, $i, $offset, $g); + + return $self->SUPER::out($fh) unless ($self->{' read'}); + + $count = 0; + for ($i = 0; $i < $numGlyphs; $i++) + { + $g = ($self->{'glyphs'}[$i]) || ""; + unless ($g) + { + $count++; + next; + } else + { + if ($locFmt) + { $fh->print(pack("N", $g->{' OUTLOC'}) x ($count + 1)); } + else + { $fh->print(pack("n", $g->{' OUTLOC'} >> 1) x ($count + 1)); } + $count = 0; + $offset = $g->{' OUTLOC'} + $g->{' OUTLEN'}; + } + } + $fh->print(pack($locFmt ? "N" : "n", ($locFmt ? $offset: $offset >> 1)) x ($count + 1)); +} + + +=head2 $t->out_xml($context, $depth) + +No need to output a loca table, this is dynamically generated + +=cut + +sub out_xml +{ return $_[0]; } + + +=head2 $t->glyphs_do(&func) + +Calls func for each glyph in this location table in numerical order: + + &func($glyph, $glyph_num) + +=cut + +sub glyphs_do +{ + my ($self, $func) = @_; + my ($i); + + for ($i = 0; $i <= $#{$self->{'glyphs'}}; $i++) + { &$func($self->{'glyphs'}[$i], $i) if defined $self->{'glyphs'}[$i]; } + $self; +} + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Manual.pod b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Manual.pod new file mode 100644 index 0000000..c6d2938 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Manual.pod @@ -0,0 +1,214 @@ + +=head1 NAME + +Font::TTF::Manual - Information regarding the whole module set + +=head1 INTRODUCTION + +This document looks at the whole issue of how the various modules in the +TrueType Font work together. As such it is partly information on this font +system and partly information on TrueType fonts in general. + +Due to the inter-relation between so many tables in a TrueType font, different +tables will make expectations as to which other tables exist. At the very least +a font should consist of a C table and a C table. The system has +been designed around the expectation that the necessary tables for font +rendering in the Windows environment exist. But inter table dependencies have +been kept to what are considered necessary. + +This module set is not meant as a simple to use, mindless, font editing suite, +but as a low-level, get your hands dirty, know what you are doing, set of +classes for those who understand the intricacies (and there are many) of +TrueType fonts. To this end, if you get something wrong in the data structures, +etc. then this module set won't tell you and will happily create fonts which +don't work. + +At the time of writing, not every TrueType table in existence has been +implemented! Only the core basic tables of TrueType 1.0 (i.e. no embedded bitmap +tables, no postscript type tables, no OpenType tables and no GX tables) have +been implemented. If you want to help by implementing another table or two, then +please go ahead and send me your code. For a full list of tables, see +L. + + +=head2 Design Principles + +PERL is not C++. C++ encourages methods to be written for changing and reading +each instance variable in a class. If we did this in this PERL program the +results would be rather large and slow. Instead, since most access will be read +access, we expose as much of the inner storage of an object to user access +directly via hash lookup. The advantage this gives are great. For example, by +following an instance variable chain, looking up the C parameter for a +particular glyph becomes: + + $f->{'loca'}{'glyphs'}[$glyph]{'yMax'} + +Or, if we are feeling very lazy and don't mind waiting: + + $f->{'loca'}{'glyphs'}[$f->{'cmap'}->ms_lookup(0x41)]{'yMax'} + +The disadvantage of this method is that it behoves module users to behave +themselves. Thus it does not hold your hand and ensure that if you make a change +to a table, that the table is marked as I, or that other tables are +updated accordingly. + +It is up to the application developer to understand the implications of the +changes they make to a font, and to take the necessary action to ensure that the +data they get out is what they want. Thus, you could go and change the C +value on a glyph and output a new font with this change, but it is up to you to +ensure that the font's bounding box details in the C table are correct, +and even that your changing C is well motivated. + +To help with using the system, each module (or table) will not only describe the +methods it supports, which are relatively few, but also the instance variables +it supports, which are many. Most of the variables directly reflect table +attributes as specified in the OpenType specification, available from Microsoft +(L), Adobe and Apple. A list of the names +used is also given in each module, but not necessarily with any further +description. After all, this code is not a TrueType manual as well! + + +=head2 Conventions + +There are various conventions used in this system. + +Firstly we consider the documentation conventions regarding instance variables. +Each instance variable is marked indicating whether it is a B<(P)>rivate +variable which users of the module are not expected to read and certainly not +write to or a B<(R)>ead only variable which users may well want to read but not +write to. + + +=head1 METHODS + +This section examines various methods and how the various modules work with +these methods. + + +=head2 read and read_dat + +Before the data structures for a table can be accessed, they need to be filled +in from somewhere. The usual way to do this is to read an existing TrueType +font. This may be achieved by: + + $f = Font::TTF::Font->open($filename) || die "Unable to read $filename"; + +This will open an existing font and read its directory header. Notice that at +this point, none of the tables in the font have been read. (Actually, the +C and C tables are read at this point too since they contain the +commonly required parameters of): + + $f->{'head'}{'unitsPerEm'} + $f->{'maxp'}{'numGlyphs'} + +In order to be able to access information from a table, it is first necessary to +C it. Consider trying to find the advance width of a space character +(U+0020). The following code should do it: + + $f = Font::TTF::Font->open($ARGV[0]); + $snum = $f->{'cmap'}->ms_lookup(0x0020); + $sadv = $f->{'hmtx'}{'advance'}[$snum]; + print $sadv; + +This would result in the value zero being printed, which is far from correct. +But why? The first line would correctly read the font directory. The second line +would, incidently, correctly locate the space character in the Windows cmap +(assuming a non symbol encoded font). The third line would not succeed in its +task since the C table has not been filled in from the font file. To +achieve what we want we would first need to cause it to be read: + + $f->{'hmtx'}->read; + $sadv = $f->{'hmtx'}{'advance'}[$snum]; + +Or for those who are too lazy to write multiple lines, C returns the +object it reads. Thus we could write: + + $sadv = $f->{'hmtx'}->read->{'advance'}[$snum]; + +Why, if we always have to read tables before accessing information from them, +did we not have to do this for the C table? The answer lies in the method +call. It senses that the table hasn't been read and reads it for us. This will +generally happen with all method calls, it is only when we do direct data access +that we have to take the responsibility to read the table first. + +Reading a table does not necessarily result in all the data being placed into +internal data structures. In the case of a simple table C is sufficient. +In fact, the normal case is that C reads the data from the file into +an instance variable called C<' dat'> (including the space) and not into the +data structures. + +This is true except for the C class which represents a single glyph. Here +the process is reversed. Reading a C reads the data for the glyph into +the C<' dat'> instance variable and sets various header attributes for the glyph +(C, C, etc.). The data is converted out of the variable into +data structures via the C method. + +The aim, therefore, is that C should do the natural thing (read into data +structures for those tables and elements for which it is helpful -- all except +C at present) and C should do the unnatural thing: read just +the binary data for normal tables and convert binary data to data structures for +Cs. + +In summary, therefore, use C unless you want to hack around with the +internals of glyphs in which case see L for more details. + + +=head2 update + +The aim of this method is to allow the various data elements in a C font +to update themselves. All tables know how to update themselves. All tables also +contain information which cannot be I but is new knowledge in the font. +As a result, certain tables do nothing when they are updated. We can, therefore, +build an update hierarchy of tables, with the independent tables at the bottom +and C at the top: + + +--loca + | + glyf--+--maxp + | + +---+--head + | + hmtx------+--hhea + + cmap-----OS/2 + + name-- + + post-- + +There is an important universal dependency which it is up to the user to +keep up to date. This is C which is used to iterate over all +the glyphs. Note that the glyphs themselves are not held in the C table +but in the C table, so adding glyphs, etc. automatically involves keeping +the C table up to date. + +=head2 Creating fonts + +Suppose we were creating a font from scratch. How much information do we need +to supply and how much will C do for us? + +The following information is required: + + $f->{'loca'}{'glyphs'} + $f->{'head'}{'upem'} + $f->{'maxp'}{'numGlyphs'} (doesn't come from $f->{'loca'}{'glyphs'}) + $f->{'hmtx'}{'advance'} + $f->{'post'}['format'} + $f->{'post'}{'VAL'} + $f->{'cmap'} + $f->{'name'} + +Pretty much everything else is calculated for you. Details of what is needed +for a glyph may be found in L. Once we have all the +information we need (and there is lots more that you could add) then we simply + + $f->dirty; # mark all tables dirty + $f->update; # update the font + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Maxp.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Maxp.pm new file mode 100644 index 0000000..e2d81b9 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Maxp.pm @@ -0,0 +1,177 @@ +package Font::TTF::Maxp; + +=head1 NAME + +Font::TTF::Maxp - Maximum Profile table in a font + +=head1 DESCRIPTION + +A collection of useful instance variables following the TTF standard. Probably +the most used being C. Note that this particular value is +foundational and should be kept up to date by the application, it is not updated +by C. + +Handles table versions 0.5, 1.0 + +=head1 INSTANCE VARIABLES + +No others beyond those specified in the standard: + + numGlyphs + maxPoints + maxContours + maxCompositePoints + maxCompositeContours + maxZones + maxTwilightPoints + maxStorage + maxFunctionDefs + maxInstructionDefs + maxStackElements + maxSizeOfInstructions + maxComponentElements + maxComponentDepth + + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA %fields @field_info); +use Font::TTF::Utils; + +@ISA = qw(Font::TTF::Table); +@field_info = ( + 'numGlyphs' => 'S', + 'maxPoints' => 'S', + 'maxContours' => 'S', + 'maxCompositePoints' => 'S', + 'maxCompositeContours' => 'S', + 'maxZones' => 'S', + 'maxTwilightPoints' => 'S', + 'maxStorage' => 'S', + 'maxFunctionDefs' => 'S', + 'maxInstructionDefs' => 'S', + 'maxStackElements' => 'S', + 'maxSizeOfInstructions' => 'S', + 'maxComponentElements' => 'S', + 'maxComponentDepth' => 'S'); + +sub init +{ + my ($k, $v, $c, $i); + for ($i = 0; $i < $#field_info; $i += 2) + { + ($k, $v, $c) = TTF_Init_Fields($field_info[$i], $c, $field_info[$i + 1]); + next unless defined $k && $k ne ""; + $fields{$k} = $v; + } +} + + +=head2 $t->read + +Reads the table into memory + +=cut + +sub read +{ + my ($self) = @_; + my ($dat); + + $self->SUPER::read or return $self; + + init unless defined $fields{'numGlyphs'}; # any key would do + $self->{' INFILE'}->read($dat, 4); + $self->{'version'} = TTF_Unpack("v", $dat); + + if ($self->{'version'} == 0.5) + { + $self->{' INFILE'}->read($dat, 2); + $self->{'numGlyphs'} = unpack("n", $dat); + } else + { + $self->{' INFILE'}->read($dat, 28); + TTF_Read_Fields($self, $dat, \%fields); + } + $self; +} + + +=head2 $t->out($fh) + +Writes the table to a file either from memory or by copying. + +=cut + +sub out +{ + my ($self, $fh) = @_; + + return $self->SUPER::out($fh) unless $self->{' read'}; + $fh->print(TTF_Pack("v", $self->{'version'})); + + if ($self->{'version'} == 0.5) + { $fh->print(pack("n", $self->{'numGlyphs'})); } + else + { $fh->print(TTF_Out_Fields($self, \%fields, 28)); } + $self; +} + + +=head2 $t->update + +Calculates all the maximum values for a font based on the glyphs in the font. +Only those fields which require hinting code interpretation are ignored and +left as they were read. + +=cut + +sub update +{ + my ($self) = @_; + my ($i, $num, @n, @m, $j); + my (@name) = qw(maxPoints maxContours maxCompositePoints maxCompositeContours + maxSizeOfInstructions maxComponentElements maxComponentDepth); + + return undef unless ($self->SUPER::update); + return undef if ($self->{'version'} == 0.5); # only got numGlyphs + return undef unless (defined $self->{' PARENT'}{'loca'}); + $self->{' PARENT'}{'loca'}->update; + $num = $self->{'numGlyphs'}; + + for ($i = 0; $i < $num; $i++) + { + my ($g) = $self->{' PARENT'}{'loca'}{'glyphs'}[$i] || next; + + @n = $g->maxInfo; + + for ($j = 0; $j <= $#n; $j++) + { $m[$j] = $n[$j] if $n[$j] > $m[$j]; } + } + + foreach ('prep', 'fpgm') + { $m[4] = length($self->{' PARENT'}{$_}{' dat'}) + if (defined $self->{' PARENT'}{$_} + && length($self->{' PARENT'}{$_}{' dat'}) > $m[4]); + } + + for ($j = 0; $j <= $#name; $j++) + { $self->{$name[$j]} = $m[$j]; } + $self; +} +1; + + +=head1 BUGS + +None known + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort.pm new file mode 100644 index 0000000..6e954cb --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort.pm @@ -0,0 +1,108 @@ +package Font::TTF::Mort; + +=head1 NAME + +Font::TTF::Mort - Glyph Metamorphosis table in a font + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA); +use Font::TTF::Utils; +use Font::TTF::AATutils; +use Font::TTF::Mort::Chain; + +@ISA = qw(Font::TTF::Table); + +=head2 $t->read + +Reads the table into memory + +=cut + +sub read +{ + my ($self) = @_; + my ($dat, $fh, $numChains); + + $self->SUPER::read or return $self; + + $fh = $self->{' INFILE'}; + + $fh->read($dat, 8); + ($self->{'version'}, $numChains) = TTF_Unpack("vL", $dat); + + my $chains = []; + foreach (1 .. $numChains) { + my $chain = new Font::TTF::Mort::Chain->new; + $chain->read($fh); + $chain->{' PARENT'} = $self; + push @$chains, $chain; + } + + $self->{'chains'} = $chains; + + $self; +} + +=head2 $t->out($fh) + +Writes the table to a file either from memory or by copying + +=cut + +sub out +{ + my ($self, $fh) = @_; + + return $self->SUPER::out($fh) unless $self->{' read'}; + + my $chains = $self->{'chains'}; + $fh->print(TTF_Pack("vL", $self->{'version'}, scalar @$chains)); + + foreach (@$chains) { + $_->out($fh); + } +} + +=head2 $t->print($fh) + +Prints a human-readable representation of the table + +=cut + +sub print +{ + my ($self, $fh) = @_; + + $self->read unless $self->{' read'}; + my $feat = $self->{' PARENT'}->{'feat'}; + $feat->read; + my $post = $self->{' PARENT'}->{'post'}; + $post->read; + + $fh = 'STDOUT' unless defined $fh; + + $fh->printf("version %f\n", $self->{'version'}); + + my $chains = $self->{'chains'}; + foreach (@$chains) { + $_->print($fh); + } +} + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Jonathan Kew L. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Chain.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Chain.pm new file mode 100644 index 0000000..b8e7b93 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Chain.pm @@ -0,0 +1,196 @@ +package Font::TTF::Mort::Chain; + +=head1 NAME + +Font::TTF::Mort::Chain - Chain Mort subtable for AAT + +=cut + +use strict; +use Font::TTF::Utils; +use Font::TTF::AATutils; +use Font::TTF::Mort::Subtable; +use IO::File; + +=head2 $t->new + +=cut + +sub new +{ + my ($class, %parms) = @_; + my ($self) = {}; + my ($p); + + $class = ref($class) || $class; + foreach $p (keys %parms) + { $self->{" $p"} = $parms{$p}; } + bless $self, $class; +} + +=head2 $t->read($fh) + +Reads the chain into memory + +=cut + +sub read +{ + my ($self, $fh) = @_; + my ($dat); + + my $chainStart = $fh->tell(); + $fh->read($dat, 12); + my ($defaultFlags, $chainLength, $nFeatureEntries, $nSubtables) = TTF_Unpack("LLSS", $dat); + + my $featureEntries = []; + foreach (1 .. $nFeatureEntries) { + $fh->read($dat, 12); + my ($featureType, $featureSetting, $enableFlags, $disableFlags) = TTF_Unpack("SSLL", $dat); + push @$featureEntries, { + 'type' => $featureType, + 'setting' => $featureSetting, + 'enable' => $enableFlags, + 'disable' => $disableFlags + }; + } + + my $subtables = []; + foreach (1 .. $nSubtables) { + my $subtableStart = $fh->tell(); + + $fh->read($dat, 8); + my ($length, $coverage, $subFeatureFlags) = TTF_Unpack("SSL", $dat); + my $type = $coverage & 0x0007; + + my $subtable = Font::TTF::Mort::Subtable->create($type, $coverage, $subFeatureFlags, $length); + $subtable->read($fh); + $subtable->{' PARENT'} = $self; + + push @$subtables, $subtable; + $fh->seek($subtableStart + $length, IO::File::SEEK_SET); + } + + $self->{'defaultFlags'} = $defaultFlags; + $self->{'featureEntries'} = $featureEntries; + $self->{'subtables'} = $subtables; + + $fh->seek($chainStart + $chainLength, IO::File::SEEK_SET); + + $self; +} + +=head2 $t->out($fh) + +Writes the table to a file either from memory or by copying + +=cut + +sub out +{ + my ($self, $fh) = @_; + + my $chainStart = $fh->tell(); + my ($featureEntries, $subtables) = ($_->{'featureEntries'}, $_->{'subtables'}); + $fh->print(TTF_Pack("LLSS", $_->{'defaultFlags'}, 0, scalar @$featureEntries, scalar @$subtables)); # placeholder for length + + foreach (@$featureEntries) { + $fh->print(TTF_Pack("SSLL", $_->{'type'}, $_->{'setting'}, $_->{'enable'}, $_->{'disable'})); + } + + foreach (@$subtables) { + $_->out($fh); + } + + my $chainLength = $fh->tell() - $chainStart; + $fh->seek($chainStart + 4, IO::File::SEEK_SET); + $fh->print(pack("N", $chainLength)); + $fh->seek($chainStart + $chainLength, IO::File::SEEK_SET); +} + +=head2 $t->print($fh) + +Prints a human-readable representation of the chain + +=cut + +sub feat +{ + my ($self) = @_; + + my $feat = $self->{' PARENT'}{' PARENT'}{'feat'}; + if (defined $feat) { + $feat->read; + } + else { + $feat = {}; + } + + return $feat; +} + +sub print +{ + my ($self, $fh) = @_; + + $fh->printf("version %f\n", $self->{'version'}); + + my $defaultFlags = $self->{'defaultFlags'}; + $fh->printf("chain: defaultFlags = %08x\n", $defaultFlags); + + my $feat = $self->feat(); + my $featureEntries = $self->{'featureEntries'}; + foreach (@$featureEntries) { + $fh->printf("\tfeature %d, setting %d : enableFlags = %08x, disableFlags = %08x # '%s: %s'\n", + $_->{'type'}, $_->{'setting'}, $_->{'enable'}, $_->{'disable'}, + $feat->settingName($_->{'type'}, $_->{'setting'})); + } + + my $subtables = $self->{'subtables'}; + foreach (@$subtables) { + my $type = $_->{'type'}; + my $subFeatureFlags = $_->{'subFeatureFlags'}; + $fh->printf("\n\t%s table, %s, %s, subFeatureFlags = %08x # %s (%s)\n", + subtable_type_($type), $_->{'direction'}, $_->{'orientation'}, $subFeatureFlags, + "Default " . ((($subFeatureFlags & $defaultFlags) != 0) ? "On" : "Off"), + join(", ", + map { + join(": ", $feat->settingName($_->{'type'}, $_->{'setting'}) ) + } grep { ($_->{'enable'} & $subFeatureFlags) != 0 } @$featureEntries + ) ); + + $_->print($fh); + } +} + +sub subtable_type_ +{ + my ($val) = @_; + my ($res); + + my @types = ( + 'Rearrangement', + 'Contextual', + 'Ligature', + undef, + 'Non-contextual', + 'Insertion', + ); + $res = $types[$val] or ('Undefined (' . $val . ')'); + + $res; +} + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Jonathan Kew L. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Contextual.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Contextual.pm new file mode 100644 index 0000000..fecc519 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Contextual.pm @@ -0,0 +1,157 @@ +package Font::TTF::Mort::Contextual; + +=head1 NAME + +Font::TTF::Mort::Contextual - Contextual Mort subtable for AAT + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA); +use Font::TTF::Utils; +use Font::TTF::AATutils; +use Font::TTF::Mort::Subtable; +use IO::File; + +@ISA = qw(Font::TTF::AAT::Mort::Subtable); + +sub new +{ + my ($class, $direction, $orientation, $subFeatureFlags) = @_; + my ($self) = { + 'direction' => $direction, + 'orientation' => $orientation, + 'subFeatureFlags' => $subFeatureFlags + }; + + $class = ref($class) || $class; + bless $self, $class; +} + +=head2 $t->read + +Reads the table into memory + +=cut + +sub read +{ + my ($self, $fh) = @_; + my ($dat); + + my $stateTableStart = $fh->tell(); + my ($classes, $states, $entries) = AAT_read_state_table($fh, 2); + + $fh->seek($stateTableStart, IO::File::SEEK_SET); + $fh->read($dat, 10); + my ($stateSize, $classTable, $stateArray, $entryTable, $mappingTables) = unpack("nnnnn", $dat); + my $limits = [$classTable, $stateArray, $entryTable, $mappingTables, $self->{'length'} - 8]; + + foreach (@$entries) { + my $actions = $_->{'actions'}; + foreach (@$actions) { + $_ = $_ ? $_ - ($mappingTables / 2) : undef; + } + } + + $self->{'classes'} = $classes; + $self->{'states'} = $states; + $self->{'mappings'} = [unpack("n*", AAT_read_subtable($fh, $stateTableStart, $mappingTables, $limits))]; + + $self; +} + +=head2 $t->pack_sub() + +=cut + +sub pack_sub +{ + my ($self) = @_; + + my ($dat) = pack("nnnnn", (0) x 5); # placeholders for stateSize, classTable, stateArray, entryTable, mappingTables + + my $classTable = length($dat); + my $classes = $self->{'classes'}; + $dat .= AAT_pack_classes($classes); + + my $stateArray = length($dat); + my $states = $self->{'states'}; + my ($dat1, $stateSize, $entries) = AAT_pack_states($classes, $stateArray, $states, + sub { + my $actions = $_->{'actions'}; + ( $_->{'flags'}, @$actions ) + } + ); + $dat .= $dat1; + + my $entryTable = length($dat); + my $offset = ($entryTable + 8 * @$entries) / 2; + foreach (@$entries) { + my ($nextState, $flags, @parts) = split /,/; + $dat .= pack("nnnn", $nextState, $flags, map { $_ eq "" ? 0 : $_ + $offset } @parts); + } + + my $mappingTables = length($dat); + my $mappings = $self->{'mappings'}; + $dat .= pack("n*", @$mappings); + + $dat1 = pack("nnnnn", $stateSize, $classTable, $stateArray, $entryTable, $mappingTables); + substr($dat, 0, length($dat1)) = $dat1; + + return $dat; +} + +=head2 $t->print($fh) + +Prints a human-readable representation of the table + +=cut + +sub print +{ + my ($self, $fh) = @_; + + my $post = $self->post(); + + $fh = 'STDOUT' unless defined $fh; + + $self->print_classes($fh); + + $fh->print("\n"); + my $states = $self->{'states'}; + foreach (0 .. $#$states) { + $fh->printf("\t\tState %d:", $_); + my $state = $states->[$_]; + foreach (@$state) { + my $flags; + $flags .= "!" if ($_->{'flags'} & 0x4000); + $flags .= "*" if ($_->{'flags'} & 0x8000); + my $actions = $_->{'actions'}; + $fh->printf("\t(%s%d,%s,%s)", $flags, $_->{'nextState'}, map { defined $_ ? $_ : "=" } @$actions); + } + $fh->print("\n"); + } + + $fh->print("\n"); + my $mappings = $self->{'mappings'}; + foreach (0 .. $#$mappings) { + $fh->printf("\t\tMapping %d: %d [%s]\n", $_, $mappings->[$_], $post->{'VAL'}[$mappings->[$_]]); + } +} + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Jonathan Kew L. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Insertion.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Insertion.pm new file mode 100644 index 0000000..d10018b --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Insertion.pm @@ -0,0 +1,179 @@ +package Font::TTF::Mort::Insertion; + +=head1 NAME + +Font::TTF::Mort::Insertion - Insertion Mort subtable for AAT + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA); +use Font::TTF::Utils; +use Font::TTF::AATutils; +use IO::File; + +@ISA = qw(Font::TTF::Mort::Subtable); + +sub new +{ + my ($class, $direction, $orientation, $subFeatureFlags) = @_; + my ($self) = { + 'direction' => $direction, + 'orientation' => $orientation, + 'subFeatureFlags' => $subFeatureFlags + }; + + $class = ref($class) || $class; + bless $self, $class; +} + +=head2 $t->read + +Reads the table into memory + +=cut + +sub read +{ + my ($self, $fh) = @_; + my ($dat); + + my $subtableStart = $fh->tell(); + + my $stateTableStart = $fh->tell(); + my ($classes, $states, $entries) = AAT_read_state_table($fh, 2); + + my %insertListHash; + my $insertLists; + foreach (@$entries) { + my $flags = $_->{'flags'}; + my @insertCount = (($flags & 0x03e0) >> 5, ($flags & 0x001f)); + my $actions = $_->{'actions'}; + foreach (0 .. 1) { + if ($insertCount[$_] > 0) { + $fh->seek($stateTableStart + $actions->[$_], IO::File::SEEK_SET); + $fh->read($dat, $insertCount[$_] * 2); + if (not defined $insertListHash{$dat}) { + push @$insertLists, [unpack("n*", $dat)]; + $insertListHash{$dat} = $#$insertLists; + } + $actions->[$_] = $insertListHash{$dat}; + } + else { + $actions->[$_] = undef; + } + } + } + + $self->{'classes'} = $classes; + $self->{'states'} = $states; + $self->{'insertLists'} = $insertLists; + + $self; +} + +=head2 $t->pack_sub() + +=cut + +sub pack_sub +{ + my ($self) = @_; + + my ($dat) = pack("nnnn", (0) x 4); + + my $classTable = length($dat); + my $classes = $self->{'classes'}; + $dat .= AAT_pack_classes($classes); + + my $stateArray = length($dat); + my $states = $self->{'states'}; + my ($dat1, $stateSize, $entries) = AAT_pack_states($classes, $stateArray, $states, + sub { + my $actions = $_->{'actions'}; + ( $_->{'flags'}, @$actions ) + } + ); + $dat .= $dat1; + + my $entryTable = length($dat); + my $offset = ($entryTable + 8 * @$entries); + my @insListOffsets; + my $insertLists = $self->{'insertLists'}; + foreach (@$insertLists) { + push @insListOffsets, $offset; + $offset += 2 * scalar @$_; + } + foreach (@$entries) { + my ($nextState, $flags, @lists) = split /,/; + $flags &= ~0x03ff; + $flags |= (scalar @{$insertLists->[$lists[0]]}) << 5 if $lists[0] ne ''; + $flags |= (scalar @{$insertLists->[$lists[1]]}) if $lists[1] ne ''; + $dat .= pack("nnnn", $nextState, $flags, + map { $_ eq '' ? 0 : $insListOffsets[$_] } @lists); + } + + foreach (@$insertLists) { + $dat .= pack("n*", @$_); + } + + $dat1 = pack("nnnn", $stateSize, $classTable, $stateArray, $entryTable); + substr($dat, 0, length($dat1)) = $dat1; + + return $dat; +} + +=head2 $t->print($fh) + +Prints a human-readable representation of the table + +=cut + +sub print +{ + my ($self, $fh) = @_; + + my $post = $self->post(); + + $fh = 'STDOUT' unless defined $fh; + + $self->print_classes($fh); + + $fh->print("\n"); + my $states = $self->{'states'}; + foreach (0 .. $#$states) { + $fh->printf("\t\tState %d:", $_); + my $state = $states->[$_]; + foreach (@$state) { + my $flags; + $flags .= "!" if ($_->{'flags'} & 0x4000); + $flags .= "*" if ($_->{'flags'} & 0x8000); + my $actions = $_->{'actions'}; + $fh->printf("\t(%s%d,%s,%s)", $flags, $_->{'nextState'}, map { defined $_ ? $_ : "=" } @$actions); + } + $fh->print("\n"); + } + + $fh->print("\n"); + my $insertLists = $self->{'insertLists'}; + foreach (0 .. $#$insertLists) { + my $insertList = $insertLists->[$_]; + $fh->printf("\t\tList %d: %s\n", $_, join(", ", map { $_ . " [" . $post->{'VAL'}[$_] . "]" } @$insertList)); + } +} + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Jonathan Kew L. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Ligature.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Ligature.pm new file mode 100644 index 0000000..c5cc912 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Ligature.pm @@ -0,0 +1,246 @@ +package Font::TTF::Mort::Ligature; + +=head1 NAME + +Font::TTF::Mort::Ligature - Ligature Mort subtable for AAT + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA); +use Font::TTF::Utils; +use Font::TTF::AATutils; +use IO::File; + +@ISA = qw(Font::TTF::Mort::Subtable); + +sub new +{ + my ($class, $direction, $orientation, $subFeatureFlags) = @_; + my ($self) = { + 'direction' => $direction, + 'orientation' => $orientation, + 'subFeatureFlags' => $subFeatureFlags + }; + + $class = ref($class) || $class; + bless $self, $class; +} + +=head2 $t->read + +Reads the table into memory + +=cut + +sub read +{ + my ($self, $fh) = @_; + my ($dat); + + my $stateTableStart = $fh->tell(); + my ($classes, $states, $entries) = AAT_read_state_table($fh, 0); + + $fh->seek($stateTableStart, IO::File::SEEK_SET); + $fh->read($dat, 14); + my ($stateSize, $classTable, $stateArray, $entryTable, + $ligActionTable, $componentTable, $ligatureTable) = unpack("nnnnnnn", $dat); + my $limits = [$classTable, $stateArray, $entryTable, $ligActionTable, $componentTable, $ligatureTable, $self->{'length'} - 8]; + + my %actions; + my $actionLists; + foreach (@$entries) { + my $offset = $_->{'flags'} & 0x3fff; + $_->{'flags'} &= ~0x3fff; + if ($offset != 0) { + if (not defined $actions{$offset}) { + $fh->seek($stateTableStart + $offset, IO::File::SEEK_SET); + my $actionList; + while (1) { + $fh->read($dat, 4); + my $action = unpack("N", $dat); + my ($last, $store, $component) = (($action & 0x80000000) != 0, ($action & 0xC0000000) != 0, ($action & 0x3fffffff)); + $component -= 0x40000000 if $component > 0x1fffffff; + $component -= $componentTable / 2; + push @$actionList, { 'store' => $store, 'component' => $component }; + last if $last; + } + push @$actionLists, $actionList; + $actions{$offset} = $#$actionLists; + } + $_->{'actions'} = $actions{$offset}; + } + } + + $self->{'componentTable'} = $componentTable; + my $components = [unpack("n*", AAT_read_subtable($fh, $stateTableStart, $componentTable, $limits))]; + foreach (@$components) { + $_ = ($_ - $ligatureTable) . " +" if $_ >= $ligatureTable; + } + $self->{'components'} = $components; + + $self->{'ligatureTable'} = $ligatureTable; + $self->{'ligatures'} = [unpack("n*", AAT_read_subtable($fh, $stateTableStart, $ligatureTable, $limits))]; + + $self->{'classes'} = $classes; + $self->{'states'} = $states; + $self->{'actionLists'} = $actionLists; + + $self; +} + +=head2 $t->pack_sub($fh) + +=cut + +sub pack_sub +{ + my ($self) = @_; + my ($dat); + + $dat .= pack("nnnnnnn", (0) x 7); # placeholders for stateSize, classTable, stateArray, entryTable, actionLists, components, ligatures + + my $classTable = length($dat); + my $classes = $self->{'classes'}; + $dat .= AAT_pack_classes($classes); + + my $stateArray = length($dat); + my $states = $self->{'states'}; + + my ($dat1, $stateSize, $entries) = AAT_pack_states($classes, $stateArray, $states, + sub { + ( $_->{'flags'} & 0xc000, $_->{'actions'} ) + } + ); + $dat .= $dat1; + + my $actionLists = $self->{'actionLists'}; + my %actionListOffset; + my $actionListDataLength = 0; + my @actionListEntries; + foreach (0 .. $#$entries) { + my ($nextState, $flags, $offset) = split(/,/, $entries->[$_]); + if ($offset eq "") { + $offset = undef; + } + else { + if (defined $actionListOffset{$offset}) { + $offset = $actionListOffset{$offset}; + } + else { + $actionListOffset{$offset} = $actionListDataLength; + my $list = $actionLists->[$offset]; + $actionListDataLength += 4 * @$list; + push @actionListEntries, $list; + $offset = $actionListOffset{$offset}; + } + } + $entries->[$_] = [ $nextState, $flags, $offset ]; + } + my $entryTable = length($dat); + my $ligActionLists = ($entryTable + @$entries * 4 + 3) & ~3; + foreach (@$entries) { + $_->[2] += $ligActionLists if defined $_->[2]; + $dat .= pack("nn", $_->[0], $_->[1] + $_->[2]); + } + $dat .= pack("C*", (0) x ($ligActionLists - $entryTable - @$entries * 4)); + + die "internal error" unless length($dat) == $ligActionLists; + + my $componentTable = length($dat) + $actionListDataLength; + my $actionList; + foreach $actionList (@actionListEntries) { + foreach (0 .. $#$actionList) { + my $action = $actionList->[$_]; + my $val = $action->{'component'} + $componentTable / 2; + $val += 0x40000000 if $val < 0; + $val &= 0x3fffffff; + $val |= 0x40000000 if $action->{'store'}; + $val |= 0x80000000 if $_ == $#$actionList; + $dat .= pack("N", $val); + } + } + + die "internal error" unless length($dat) == $componentTable; + + my $components = $self->{'components'}; + my $ligatureTable = $componentTable + @$components * 2; + $dat .= pack("n*", map { (index($_, '+') >= 0 ? $ligatureTable : 0) + $_ } @$components); + + my $ligatures = $self->{'ligatures'}; + $dat .= pack("n*", @$ligatures); + + $dat1 = pack("nnnnnnn", $stateSize, $classTable, $stateArray, $entryTable, $ligActionLists, $componentTable, $ligatureTable); + substr($dat, 0, length($dat1)) = $dat1; + + return $dat; +} + +=head2 $t->print($fh) + +Prints a human-readable representation of the table + +=cut + +sub print +{ + my ($self, $fh) = @_; + + my $post = $self->post(); + + $fh = 'STDOUT' unless defined $fh; + + $self->print_classes($fh); + + $fh->print("\n"); + my $states = $self->{'states'}; + foreach (0 .. $#$states) { + $fh->printf("\t\tState %d:", $_); + my $state = $states->[$_]; + foreach (@$state) { + my $flags; + $flags .= "!" if ($_->{'flags'} & 0x4000); + $flags .= "*" if ($_->{'flags'} & 0x8000); + $fh->printf("\t(%s%d,%s)", $flags, $_->{'nextState'}, defined $_->{'actions'} ? $_->{'actions'} : "="); + } + $fh->print("\n"); + } + + $fh->print("\n"); + my $actionLists = $self->{'actionLists'}; + foreach (0 .. $#$actionLists) { + $fh->printf("\t\tList %d:\t", $_); + my $actionList = $actionLists->[$_]; + $fh->printf("%s\n", join(", ", map { ($_->{'component'} . ($_->{'store'} ? "*" : "") ) } @$actionList)); + } + + my $ligatureTable = $self->{'ligatureTable'}; + + $fh->print("\n"); + my $components = $self->{'components'}; + foreach (0 .. $#$components) { + $fh->printf("\t\tComponent %d: %s\n", $_, $components->[$_]); + } + + $fh->print("\n"); + my $ligatures = $self->{'ligatures'}; + foreach (0 .. $#$ligatures) { + $fh->printf("\t\tLigature %d: %d [%s]\n", $_, $ligatures->[$_], $post->{'VAL'}[$ligatures->[$_]]); + } +} + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Jonathan Kew L. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Noncontextual.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Noncontextual.pm new file mode 100644 index 0000000..730982a --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Noncontextual.pm @@ -0,0 +1,95 @@ +package Font::TTF::Mort::Noncontextual; + +=head1 NAME + +Font::TTF::Mort::Noncontextual - Noncontextual Mort subtable for AAT + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA); +use Font::TTF::Utils; +use Font::TTF::AATutils; + +@ISA = qw(Font::TTF::Mort::Subtable); + +sub new +{ + my ($class, $direction, $orientation, $subFeatureFlags) = @_; + my ($self) = { + 'direction' => $direction, + 'orientation' => $orientation, + 'subFeatureFlags' => $subFeatureFlags + }; + + $class = ref($class) || $class; + bless $self, $class; +} + +=head2 $t->read + +Reads the table into memory + +=cut + +sub read +{ + my ($self, $fh) = @_; + my ($dat); + + my ($format, $lookup) = AAT_read_lookup($fh, 2, $self->{'length'} - 8, undef); + $self->{'format'} = $format; + $self->{'lookup'} = $lookup; + + $self; +} + +=head2 $t->pack_sub($fh) + +=cut + +sub pack_sub +{ + my ($self) = @_; + + return AAT_pack_lookup($self->{'format'}, $self->{'lookup'}, 2, undef); +} + +=head2 $t->print($fh) + +Prints a human-readable representation of the table + +=cut + +sub print +{ + my ($self, $fh) = @_; + + my $post = $self->post(); + + $fh = 'STDOUT' unless defined $fh; + + my $lookup = $self->{'lookup'}; + $fh->printf("\t\tLookup format %d\n", $self->{'format'}); + if (defined $lookup) { + foreach (sort { $a <=> $b } keys %$lookup) { + $fh->printf("\t\t\t%d [%s] -> %d [%s])\n", $_, $post->{'VAL'}[$_], $lookup->{$_}, $post->{'VAL'}[$lookup->{$_}]); + } + } +} + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Jonathan Kew L. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Rearrangement.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Rearrangement.pm new file mode 100644 index 0000000..126144f --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Rearrangement.pm @@ -0,0 +1,107 @@ +package Font::TTF::Mort::Rearrangement; + +=head1 NAME + +Font::TTF::Mort::Rearrangement - Rearrangement Mort subtable for AAT + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA); +use Font::TTF::Utils; +use Font::TTF::AATutils; + +@ISA = qw(Font::TTF::Mort::Subtable); + +sub new +{ + my ($class, $direction, $orientation, $subFeatureFlags) = @_; + my ($self) = { + 'direction' => $direction, + 'orientation' => $orientation, + 'subFeatureFlags' => $subFeatureFlags + }; + + $class = ref($class) || $class; + bless $self, $class; +} + +=head2 $t->read + +Reads the table into memory + +=cut + +sub read +{ + my ($self, $fh) = @_; + + my ($classes, $states) = AAT_read_state_table($fh, 0); + $self->{'classes'} = $classes; + $self->{'states'} = $states; + + $self; +} + +=head2 $t->pack_sub() + +=cut + +sub pack_sub +{ + my ($self) = @_; + + return AAT_pack_state_table($self->{'classes'}, $self->{'states'}, 0); +} + +=head2 $t->print($fh) + +Prints a human-readable representation of the table + +=cut + +sub print +{ + my ($self, $fh) = @_; + + my $post = $self->post(); + + $fh = 'STDOUT' unless defined $fh; + + $self->print_classes($fh); + + $fh->print("\n"); + my $states = $self->{'states'}; + my @verbs = ( "0", "Ax->xA", "xD->Dx", "AxD->DxA", + "ABx->xAB", "ABx->xBA", "xCD->CDx", "xCD->DCx", + "AxCD->CDxA", "AxCD->DCxA", "ABxD->DxAB", "ABxD->DxBA", + "ABxCD->CDxAB", "ABxCD->CDxBA", "ABxCD->DCxAB", "ABxCD->DCxBA"); + foreach (0 .. $#$states) { + $fh->printf("\t\tState %d:", $_); + my $state = $states->[$_]; + foreach (@$state) { + my $flags; + $flags .= "!" if ($_->{'flags'} & 0x4000); + $flags .= "<" if ($_->{'flags'} & 0x8000); + $flags .= ">" if ($_->{'flags'} & 0x2000); + $fh->printf("\t(%s%d,%s)", $flags, $_->{'nextState'}, $verbs[($_->{'flags'} & 0x000f)]); + } + $fh->print("\n"); + } +} + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Jonathan Kew L. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Subtable.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Subtable.pm new file mode 100644 index 0000000..4dd26e0 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Mort/Subtable.pm @@ -0,0 +1,200 @@ +package Font::TTF::Mort::Subtable; + +=head1 NAME + +Font::TTF::Mort::Subtable - Mort subtable superclass for AAT + +=head1 METHODS + +=cut + +use strict; +use Font::TTF::Utils; +use Font::TTF::AATutils; +use IO::File; + +require Font::TTF::Mort::Rearrangement; +require Font::TTF::Mort::Contextual; +require Font::TTF::Mort::Ligature; +require Font::TTF::Mort::Noncontextual; +require Font::TTF::Mort::Insertion; + +sub new +{ + my ($class) = @_; + my ($self) = {}; + + $class = ref($class) || $class; + + bless $self, $class; +} + +sub create +{ + my ($class, $type, $coverage, $subFeatureFlags, $length) = @_; + + $class = ref($class) || $class; + + my $subclass; + if ($type == 0) { + $subclass = 'Font::TTF::Mort::Rearrangement'; + } + elsif ($type == 1) { + $subclass = 'Font::TTF::Mort::Contextual'; + } + elsif ($type == 2) { + $subclass = 'Font::TTF::Mort::Ligature'; + } + elsif ($type == 4) { + $subclass = 'Font::TTF::Mort::Noncontextual'; + } + elsif ($type == 5) { + $subclass = 'Font::TTF::Mort::Insertion'; + } + + my ($self) = $subclass->new( + (($coverage & 0x4000) ? 'RL' : 'LR'), + (($coverage & 0x2000) ? 'VH' : ($coverage & 0x8000) ? 'V' : 'H'), + $subFeatureFlags + ); + + $self->{'type'} = $type; + $self->{'length'} = $length; + + $self; +} + +=head2 $t->out($fh) + +Writes the table to a file + +=cut + +sub out +{ + my ($self, $fh) = @_; + + my ($subtableStart) = $fh->tell(); + my ($type) = $self->{'type'}; + my ($coverage) = $type; + $coverage += 0x4000 if $self->{'direction'} eq 'RL'; + $coverage += 0x2000 if $self->{'orientation'} eq 'VH'; + $coverage += 0x8000 if $self->{'orientation'} eq 'V'; + + $fh->print(TTF_Pack("SSL", 0, $coverage, $self->{'subFeatureFlags'})); # placeholder for length + + my ($dat) = $self->pack_sub(); + $fh->print($dat); + + my ($length) = $fh->tell() - $subtableStart; + my ($padBytes) = (4 - ($length & 3)) & 3; + $fh->print(pack("C*", (0) x $padBytes)); + $length += $padBytes; + $fh->seek($subtableStart, IO::File::SEEK_SET); + $fh->print(pack("n", $length)); + $fh->seek($subtableStart + $length, IO::File::SEEK_SET); +} + +=head2 $t->print($fh) + +Prints a human-readable representation of the table + +=cut + +sub post +{ + my ($self) = @_; + + my ($post) = $self->{' PARENT'}{' PARENT'}{' PARENT'}{'post'}; + if (defined $post) { + $post->read; + } + else { + $post = {}; + } + + return $post; +} + +sub feat +{ + my ($self) = @_; + + return $self->{' PARENT'}->feat(); +} + +sub print +{ + my ($self, $fh) = @_; + + my ($feat) = $self->feat(); + my ($post) = $self->post(); + + $fh = 'STDOUT' unless defined $fh; + + my ($type) = $self->{'type'}; + my ($subFeatureFlags) = $self->{'subFeatureFlags'}; + my ($defaultFlags) = $self->{' PARENT'}{'defaultFlags'}; + my ($featureEntries) = $self->{' PARENT'}{'featureEntries'}; + $fh->printf("\n\t%s table, %s, %s, subFeatureFlags = %08x # %s (%s)\n", + subtable_type_($type), $_->{'direction'}, $_->{'orientation'}, $subFeatureFlags, + "Default " . ((($subFeatureFlags & $defaultFlags) != 0) ? "On" : "Off"), + join(", ", + map { + join(": ", $feat->settingName($_->{'type'}, $_->{'setting'}) ) + } grep { ($_->{'enable'} & $subFeatureFlags) != 0 } @$featureEntries + ) ); +} + +sub subtable_type_ +{ + my ($val) = @_; + my ($res); + + my (@types) = ( + 'Rearrangement', + 'Contextual', + 'Ligature', + undef, + 'Non-contextual', + 'Insertion', + ); + $res = $types[$val] or ('Undefined (' . $val . ')'); + + $res; +} + +=head2 $t->print_classes($fh) + +Prints a human-readable representation of the table + +=cut + +sub print_classes +{ + my ($self, $fh) = @_; + + my ($post) = $self->post(); + + my ($classes) = $self->{'classes'}; + foreach (0 .. $#$classes) { + my $class = $classes->[$_]; + if (defined $class) { + $fh->printf("\t\tClass %d:\t%s\n", $_, join(", ", map { $_ . " [" . $post->{'VAL'}[$_] . "]" } @$class)); + } + } +} + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Jonathan Kew L. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Name.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Name.pm new file mode 100644 index 0000000..4b1447a --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Name.pm @@ -0,0 +1,782 @@ +package Font::TTF::Name; + +=head1 NAME + +Font::TTF::Name - String table for a TTF font + +=head1 DESCRIPTION + +Strings are held by number, platform, encoding and language. Strings are +accessed as: + + $f->{'name'}{'strings'}[$number][$platform_id][$encoding_id]{$language_id} + +Notice that the language is held in an associative array due to its sparse +nature on some platforms such as Microsoft ($pid = 3). Notice also that the +array order is different from the stored array order (platform, encoding, +language, number) to allow for easy manipulation of strings by number (which is +what I guess most people will want to do). + +By default, C<$Font::TTF::Name::utf8> is set to 1, and strings will be stored as UTF8 wherever +possible. The method C can be used to find out if a string in a particular +platform and encoding will be returned as UTF8. Unicode strings are always +converted if utf8 is requested. Otherwise, strings are stored according to platform: + +You now have to set <$Font::TTF::Name::utf8> to 0 to get the old behaviour. + +=over 4 + +=item Apple Unicode (platform id = 0) + +Data is stored as network ordered UCS2. There is no encoding id for this platform +but there are language ids as per Mac language ids. + +=item Mac (platform id = 1) + +Data is stored as 8-bit binary data, leaving the interpretation to the user +according to encoding id. + +=item Unicode (platform id = 2) + +Currently stored as 16-bit network ordered UCS2. Upon release of Perl 5.005 this +will change to utf8 assuming current UCS2 semantics for all encoding ids. + +=item Windows (platform id = 3) + +As per Unicode, the data is currently stored as 16-bit network ordered UCS2. Upon +release of Perl 5.005 this will change to utf8 assuming current UCS2 semantics for +all encoding ids. + +=back + +=head1 INSTANCE VARIABLES + +=over 4 + +=item strings + +An array of arrays, etc. + +=back + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA $VERSION @apple_encs @apple_encodings $utf8 $cp_1252 @cp_1252 %win_langs %langs_win %langs_mac @ms_langids @mac_langs); +use Font::TTF::Table; +use Font::TTF::Utils; +@ISA = qw(Font::TTF::Table); + +$utf8 = 1; + +{ + my ($count, $i); + eval {require Compress::Zlib;}; + unless ($@) + { + for ($i = 0; $i <= $#apple_encs; $i++) + { + $apple_encodings[0][$i] = [unpack("n*", Compress::Zlib::uncompress(unpack("u", $apple_encs[$i])))] + if (defined $apple_encs[$i]); + foreach (0 .. 127) + { $apple_encodings[0][$i][$_] = $_; } + $count = 0; + $apple_encodings[1][$i] = {map {$_ => $count++} @{$apple_encodings[0][$i]}}; + } + $cp_1252[0] = [unpack("n*", Compress::Zlib::uncompress(unpack("u", $cp_1252)))]; + $count = 0; + $cp_1252[1] = {map({$_ => $count++} @{$cp_1252[0]})}; + } + for ($i = 0; $i < $#ms_langids; $i++) + { + if (defined $ms_langids[$i][1]) + { + my ($j); + for ($j = 0; $j < $#{$ms_langids[$i][1]}; $j++) + { + my ($v) = $ms_langids[$i][1][$j]; + if ($v =~ m/^-/o) + { $win_langs{(($j + 1) << 10) + $i} = $ms_langids[$i][0] . $v; } + else + { $win_langs{(($j + 1) << 10) + $i} = $v; } + } + } + else + { $win_langs{$i + 0x400} = $ms_langids[$i][0]; } + } + %langs_win = map {my ($t) = $win_langs{$_}; my (@res) = ($t => $_); push (@res, $t => $_) if ($t =~ s/-.*$//o && ($_ & 0xFC00) == 0x400); @res} keys %win_langs; + $i = 0; + %langs_mac = map {$_ => $i++} @mac_langs; +} + + +$VERSION = 1.1; # MJPH 17-JUN-2000 Add utf8 support +# $VERSION = 1.001; # MJPH 10-AUG-1998 Put $number first in list + +=head2 $t->read + +Reads all the names into memory + +=cut + +sub read +{ + my ($self) = @_; + my ($fh) = $self->{' INFILE'}; + my ($dat, $num, $stroff, $i, $pid, $eid, $lid, $nid, $len, $off, $here); + + $self->SUPER::read or return $self; + $fh->read($dat, 6); + ($num, $stroff) = unpack("x2nn", $dat); + for ($i = 0; $i < $num; $i++) + { + use bytes; # hack to fix bugs in 5.8.7 + read($fh, $dat, 12); + ($pid, $eid, $lid, $nid, $len, $off) = unpack("n6", $dat); + $here = $fh->tell(); + $fh->seek($self->{' OFFSET'} + $stroff + $off, 0); + $fh->read($dat, $len); + if ($utf8) + { + if ($pid == 1 && defined $apple_encodings[0][$eid]) + { $dat = TTF_word_utf8(pack("n*", map({$apple_encodings[0][$eid][$_]} unpack("C*", $dat)))); } + elsif ($pid == 2 && $eid == 2 && defined @cp_1252) + { $dat = TTF_word_utf8(pack("n*", map({$cp_1252[0][$_]} unpack("C*", $dat)))); } + elsif ($pid == 0 || $pid == 3 || ($pid == 2 && $eid == 1)) + { $dat = TTF_word_utf8($dat); } + } + $self->{'strings'}[$nid][$pid][$eid]{$lid} = $dat; + $fh->seek($here, 0); + } + $self; +} + + +=head2 $t->out($fh) + +Writes out all the strings + +=cut + +sub out +{ + my ($self, $fh) = @_; + my ($pid, $eid, $lid, $nid, $todo, @todo); + my ($len, $offset, $loc, $stroff, $endloc, $str_trans); + + return $self->SUPER::out($fh) unless $self->{' read'}; + + $loc = $fh->tell(); + $fh->print(pack("n3", 0, 0, 0)); + foreach $nid (0 .. $#{$self->{'strings'}}) + { + foreach $pid (0 .. $#{$self->{'strings'}[$nid]}) + { + foreach $eid (0 .. $#{$self->{'strings'}[$nid][$pid]}) + { + foreach $lid (sort keys %{$self->{'strings'}[$nid][$pid][$eid]}) + { + $str_trans = $self->{'strings'}[$nid][$pid][$eid]{$lid}; + if ($utf8) + { + if ($pid == 1 && defined $apple_encodings[1][$eid]) + { $str_trans = pack("C*", + map({$apple_encodings[1][$eid]{$_} || 0x3F} unpack("n*", + TTF_utf8_word($str_trans)))); } + elsif ($pid == 2 && $eid == 2 && defined @cp_1252) + { $str_trans = pack("C*", + map({$cp_1252[1][$eid]{$_} || 0x3F} unpack("n*", + TTF_utf8_word($str_trans)))); } + elsif ($pid == 2 && $eid == 0) + { $str_trans =~ s/[\xc0-\xff][\x80-\xbf]+/?/og; } + elsif ($pid == 0 || $pid == 3 || ($pid == 2 && $eid == 1)) + { $str_trans = TTF_utf8_word($str_trans); } + } + push (@todo, [$pid, $eid, $lid, $nid, $str_trans]); + } + } + } + } + + $offset = 0; + @todo = (sort {$a->[0] <=> $b->[0] || $a->[1] <=> $b->[1] || $a->[2] <=> $b->[2] + || $a->[3] <=> $b->[3]} @todo); + foreach $todo (@todo) + { + $len = length($todo->[4]); + $fh->print(pack("n6", @{$todo}[0..3], $len, $offset)); + $offset += $len; + } + + $stroff = $fh->tell() - $loc; + foreach $todo (@todo) + { $fh->print($todo->[4]); } + + $endloc = $fh->tell(); + $fh->seek($loc, 0); + $fh->print(pack("n3", 0, $#todo + 1, $stroff)); + $fh->seek($endloc, 0); + $self; +} + + +=head2 $t->XML_element($context, $depth, $key, $value) + +Outputs the string element in nice XML (which is all the table really!) + +=cut + +sub XML_element +{ + my ($self) = shift; + my ($context, $depth, $key, $value) = @_; + my ($fh) = $context->{'fh'}; + my ($nid, $pid, $eid, $lid); + + return $self->SUPER::XML_element(@_) unless ($key eq 'strings'); + + foreach $nid (0 .. $#{$self->{'strings'}}) + { + next unless ref($self->{'strings'}[$nid]); +# $fh->print("$depth\n"); + foreach $pid (0 .. $#{$self->{'strings'}[$nid]}) + { + foreach $eid (0 .. $#{$self->{'strings'}[$nid][$pid]}) + { + foreach $lid (sort {$a <=> $b} keys %{$self->{'strings'}[$nid][$pid][$eid]}) + { + my ($lang) = $self->get_lang($pid, $lid) || $lid; + $fh->printf("%s\n%s%s%s\n%s\n", + $depth, $nid, $pid, $eid, $lang, $depth, + $context->{'indent'}, $self->{'strings'}[$nid][$pid][$eid]{$lid}, $depth); + } + } + } +# $fh->print("$depth\n"); + } + $self; +} + + +=head2 $t->XML_end($context, $tag, %attrs) + +Store strings in the right place + +=cut + +sub XML_end +{ + my ($self) = shift; + my ($context, $tag, %attrs) = @_; + + if ($tag eq 'string') + { + my ($lid) = $self->find_name($attrs{'platform'}, $attrs{'language'}) || $attrs{'language'}; + $self->{'strings'}[$attrs{'id'}][$attrs{'platform'}][$attrs{'encoding'}]{$lid} + = $context->{'text'}; + return $context; + } + else + { return $self->SUPER::XML_end(@_); } +} + +=head2 is_utf8($pid, $eid) + +Returns whether a string of a given platform and encoding is going to be in UTF8 + +=cut + +sub is_utf8 +{ + my ($self, $pid, $eid) = @_; + + return ($utf8 && ($pid == 0 || $pid == 3 || ($pid == 2 && ($eid != 2 || defined @cp_1252)) + || ($pid == 1 && defined $apple_encodings[$eid]))); +} + + +=head2 find_name($nid) + +Hunts down a name in all the standard places and returns the string and for an +array context the pid, eid & lid as well + +=cut + +sub find_name +{ + my ($self, $nid) = @_; + my ($res, $pid, $eid, $lid, $look, $k); + + my (@lookup) = ([3, 1, 1033], [3, 1, -1], [3, 0, 1033], [3, 0, -1], [2, 1, -1], [2, 2, -1], [2, 0, -1], + [0, 0, 0], [1, 0, 0]); + foreach $look (@lookup) + { + ($pid, $eid, $lid) = @$look; + if ($lid == -1) + { + foreach $k (keys %{$self->{'strings'}[$nid][$pid][$eid]}) + { + if (($res = $self->{strings}[$nid][$pid][$eid]{$k}) ne '') + { + $lid = $k; + last; + } + } + } else + { $res = $self->{strings}[$nid][$pid][$eid]{$lid} } + if ($res ne '') + { return wantarray ? ($res, $pid, $eid, $lid) : $res; } + } + return ''; +} + + +=head2 set_name($nid, $str[, $lang[, @cover]]) + +Sets the given name id string to $str for all platforms and encodings that +this module can handle. If $lang is set, it is interpretted as a language +tag and if the particular language of a string is found to match, then +that string is changed, otherwise no change occurs. + +If supplied, @cover should be a list of references to two-element arrays +containing pid,eid pairs that should added to the name table if not already present. + +This function does not add any names to the table unless @cover is supplied. + +=cut + +sub set_name +{ + my ($self, $nid, $str, $lang, @cover) = @_; + my ($pid, $eid, $lid, $c); + + foreach $pid (0 .. $#{$self->{'strings'}[$nid]}) + { + my $strNL = $str; + $strNL =~ s/\n/\r\n/og if $pid == 3; + $strNL =~ s/\n/\r/og if $pid == 1; + foreach $eid (0 .. $#{$self->{'strings'}[$nid][$pid]}) + { + foreach $lid (keys %{$self->{'strings'}[$nid][$pid][$eid]}) + { + next unless (!defined $lang || $self->match_lang($pid, $lid, $lang)); + $self->{'strings'}[$nid][$pid][$eid]{$lid} = $strNL; + foreach $c (0 .. scalar @cover) + { + next unless ($cover[$c][0] == $pid && $cover[$c][1] == $eid); + delete $cover[$c]; + last; + } + } + } + } + foreach $c (@cover) + { + my ($pid, $eid) = @{$c}; + my ($lid) = $self->find_lang($pid, $lang); + my $strNL = $str; + $strNL =~ s/\n/\r\n/og if $pid == 3; + $strNL =~ s/\n/\r/og if $pid == 1; + $self->{'strings'}[$nid][$pid][$eid]{$lid} = $strNL; + } + return $self; +} + +=head2 Font::TTF::Name->match_lang($pid, $lid, $lang) + +Compares the language associated to the string of given platform and language +with the given language tag. If the language matches the tag (i.e. is equal +or more defined than the given language tag) returns true. This is calculated +by finding whether the associated language tag starts with the given language +tag. + +=cut + +sub match_lang +{ + my ($self, $pid, $lid, $lang) = @_; + my ($langid) = $self->get_lang($pid, $lid); + + return ($lid == $lang) if ($lang != 0 || $lang eq '0'); + return !index(lc($langid), lc($lang)); +} + +=head2 Font::TTF::Name->get_lang($pid, $lid) + +Returns the language tag associated with a particular platform and language id + +=cut + +sub get_lang +{ + my ($self, $pid, $lid) = @_; + + if ($pid == 3) + { return $win_langs{$lid}; } + elsif ($pid == 1) + { return $mac_langs[$lid]; } + return ''; +} + + +=head2 Font::TTF::Name->find_lang($pid, $lang) + +Looks up the language name and returns a lang id if one exists + +=cut + +sub find_lang +{ + my ($self, $pid, $lang) = @_; + + if ($pid == 3) + { return $langs_win{$lang}; } + elsif ($pid == 1) + { return $langs_mac{$lang}; } + return undef; +} + + +BEGIN { +@apple_encs = ( +<<'EOT', +M>)RES==NCW$`@.'G_S5Q*L(!#?+K1VO4:.W6IJA-:\^BM?>L>1&NP(A0Q$BL +M<*!62ZV8Z1)[K]BE$MR#O,=/7OW]7T&*6"NMI4K31EOMM)>N@XXZZ2Q#IBZZ +MZJ:['GKJ)4NVWOKHJ]\_/\!`@PR68XBAALDUW`@CC3+:&&.-,UZ>?!-,-,ED +M4TPUS70SS#3+;`7FF&N>0D7F6V"A119;8JEEEEMAI5566V.M==;;H-A&FVRV +MQ5;;_OTONJ3<%;?<5^NQ1YYXYJGG7GKME3?>>N^=#S[ZY(O/OOKNFU]^JO<[ +M!$?LLMO>$#OAH4-*4F+'[(L+E*F,6SH:%\9%]C@>1W&CN&%2:9QNO]-))5ZH +M<]9.!^/DQ/8X-V[@@#,AS0ZE+KB7R$ODA\:A26@>6H2FH9D?J17^)(I#3C@8 +MLD)V?:(^"BE.AN30,F0XK\(Y5UUVW0TW77/'W;H_;JM6HRJ1&95%M0Y'E5%5 +.5.U4]""JB`?E$` +EOT + +undef, +undef, +undef, +<<'EOT', +M>)RES[=/%```1O$WO8G_@$'J';W70Z2WHS>5WJN%8D6%D;BZ,3*P,;#C2D(8 +M,9&)08V)+4*(1((X2'(#[.:;7[[\*./_%D,L<<230"(!@B213`JII)%.!IED +MD4T.N>213P&%%%%,B!)N4LJMR[Z<"BJIHIH::JFCG@;"--)$,RVTTD8['732 +M13>WN<-=>NBECWX&&&2(848898QQ)IADBFEFF.4>]WG`0^:89X%%'O&8)SSE +M&<]9X@4O><4R*Y?_.ZRSRQ[[''#(1S[PB<]NL\D7OO&5[_S@9TR`(XXYX1=O +M.>4W9_SAG`O^7OF=O>XW*N)WV!%''7/<"2>=S?<\K5O(G[7?/Y>'``` +EOT + +<<'EOT', +M>)RED$LSEW$`A9_-^00L,H-^(=>4Y%^2J'1Q*Y+[I2(BHA`B?!%J6EM1*28S +M;9II[/PI*7*_%TUN\_*VZ%W:FN9LSYEGGD,\_Q?#$?SP)X"C!!)$,"&$$L8Q +MPCG."2(X222GB,+%:XR"42N,P5KG*-1))()H54KG.# +M--*Y20:WR"2+;'+()8]\"BBDB-O$PM +M==3SA`8::>(IS;3PC%;::'?X'^W#?&(0-Z-,,,,TL\PSQP)+K+#,*C]9XQ?K +M_.8/FVRPQ0[;[+&+S=_]_J;KX/Y6I?&U.JQ.Z[GU0@-VBNTR@;Q4G]ZI5V_U +MQG@83^-M?,PAXV6'VF'ZH&Z]4H_>J]]IO=:0W!K6B#[KBT;U56/ZIN\:UX1^ +?:%)3FM:,9C6G>2UH44M:UHI6'?)RES5=OSG$`0.$CYR.(A(3DUS]J4WOO59O6;&F+UMY[7R&(V'N^4ETZ=*"J +M:M:H=>E*0D1B)7HC1KC0[R#G^LEA,/]7((Z(EK2B-?&TH2WM:$\'.M*)SG0A +M@:YTHSL]Z$DO>M.'OO2C/P,8R*`&/X2A#&,X(QC)*$:3R!C&,H[Q3&`BDYC, +M%))(9BK3F,X,9C*+%%*9S1S22">#NN(MWO.>#.\GG(Y_YQ!>^DAT7 +M\8WZ$%$3$OC.#W(IYC=_^!N"1SWF*<]ZP1AO*:'`;*^0%V502J6'*8LRHRQR +M/.)Q3WC2TY[QG+D6FF^!19ZGR(M>BA*]3"'5(9Z8.>:YVSV-DD/CT"0T#RU" +MT]",G^YUG_L]8+$E7O6%!WUIF>4^]9K7?6R%E59YQUM6>]L:[WK/5][WH;7> +4M,X'/O&1-WSF_\` +EOT + +<<'EOT', +M>)RERT=.%5``0-&+7K'&!B(@X/L/^/3>ZZ?SZ=*K@`KVWOL:U!68.#!&8G2@ +M$Q?F5/=@SOB0XO\$$D2**:&4)&644T$E55130RUUU--`(TTTTT(K;;3302== +M=--#[[_?1S\###+$,".,DF:,<2:89(II9KC`+'/,L\`B2RRSPBIKK+/!13;9 +M8IM+7.8*.^QRE6M]SG`0]YQ&.>\)1G/.<%+WG%:][PEI0G +M/>5IL\SVC#F>-=<\\SUG@846>=Y@PFBQ)9::M,QR*ZRTRFIKK+4N!+[[CD]\ +M#I%?9O*-+XGH/N?BMON=CT7\B#MQUR5^^MY#ZH('7?:PJQYQS14/L!?S,S[$ +M=,SD*[]#DH\>==UC;K@8LD)V*`B%(3?D\2<4>=Q-3[B5R#'#66>LM\%&FVRV +GQ5;;;+?#3KOLML=>4_;9[X"##CGLB*.F'7/<"2>=)RED-DVUG$`1;=:U*Y%0C)5O^^/SSS/F>>9#"$JE7D>"D6\3S=>Q^MPU^JF +M&^M"2JJHIH9:ZJBG@4:::*:%M[32 +M1CL==_TNNNFAES[Z&6"0(889890QQIE@DG=,,% +MF;XTRVQSS#7/5[[VC<&8D?D66&C<(HLML=0RRZVPTBJ7K;;&6NNLM\%&FVRV +L):388:===MMCKP,..F2_(XXZYK#CMKGZS[YU-]QTRVUWW'7/?0]N`4(?0WT` +EOT + +<<'EOT', +M>)RED,5.0U$415=(D.X!$"ANMX^VN+M#D>+N[H4"Q5W^APF_PZ\PY.9-"`-& +MY.3LG>-"#_\3@P^'8OP$"%)"*6644T$E55130RUUU--`(TTTTT(K;;3302== +M=-OZ7OH(T<\`@PP19I@11AECG`DFF6*:&6:98YX%%EEBF15666.=#3;98IL= +M=MECGP,.B7#$,5%...6,&.=<<,D5U]QPRQWW//#($\^\\,J;G?_II)ETXS79 +M)L<$C<,['S[GYSY=?FWK6E>Z^?L'BK,:KP0E*DD>R?6E*-7E='DM9BA36A49XKI_!M<9D8J +EOT + +<<'EOT', +M>)RED,E3SW$8QU_77@<''+A]^Y5(2-F7+"%92\B^ES5ES]H,)L(8&21E*UNH +M&"8T8ZS3I(FS_T"$_`L^-^/D8)YY/^]Y/\L\"Y/Y/XN()T8"B0P@B8$,(IG! +MI#"$H0PCE>&DDG,((N99#.+VM8SP8**&0CF]C,%K:RC2*V +M4TP).]C)+G:SA[WLHY3]'.`@ASC,$-(*3WG:,R%ZSDK/!K[@1<][R2HO6^T5:ZSUJM>\[@UO +M6F>]M[SM'>]ZSX90_\"'-MIDLX^">ASPQ*?!M_C,Y[ZP->KE*U_[QK>^\WW( +CM/O!ML"=?K3#3[Z,*_AKOR]V^=5O=OO='_ZTQU^_`2-%:*`` +EOT + +undef, +undef, +undef, +undef, +undef, +undef, +undef, +undef, +undef, +<<'EOT', +M>)REC]=.E&$`1(\%&W@4004%_7:!I?>.Z-+[TJL*=K"`BH`*J,_"+2'A!7PW +MX;\2[LG<3#*9G!F2G$V!&'$***2(!,644$H9Y5102175U%!+'?4TT$@3S;30 +M2AN/:.\HSG +M+++$"U[RBM>\X2WO6&:%]WS@(Y]898W/?.$KZWQC@TVV^,X/?K+-#KO\XC=_ +M(OX!?T/"`0<=-$T+WG9 +M*U[UFNEF>%V]X4TSO666V=[VCG?-,==[WC?/?!_XT&#,N`466F3"8DLLMLD&W2#COMLML>>^V+=IX\2<7BCCGNA)-. +0.>V,L\XY[P*'[!\#D^='L@`` +EOT + +undef, +undef, +undef, +undef, +undef, +undef, +undef, +undef, +undef, +); + +$cp_1252 = ( +<<'EOT', +M>)P-SD-B'5```,#YJ6VE>DEM&[\VD]JVF?H./4'-U+93V[9M:SV;$141(Y74 +MTD@KG?0RR"B3S++(*IOL:%9-$0&YD?BH22(82XF)10.3(@U(DDB$;F_/]% +M0_Y0(!0*A4-\R!5RQ]R*BX\,#'4CB?]];B3)`@LMLM@22RVSW`HKK;):LC76 +M6F>]#3;:9+,MMMIFNQUVVF6W/?;:9[\##CKDL"-2''7,<2><=,II9YQUSGD7 +M7'3)95=<=0@` +EOT +); +#' + +@ms_langids = ( [""], + ['ar', ["-SA", "-IQ", "-EG", "-LY", "-DZ", "-MA", "-TN", + "-OM", "-YE", "-SY", "-JO", "-LB", "-KW", "-AE", + "-BH", "-QA"]], + ['bg-BG'], + ['ca-ES'], + ['zh', ['-TW', 'CN', '-HK', '-SG', '-MO']], + ["cs-CZ"], + ["da-DK"], + ["de", ["-DE", "-CH", "-AT", "-LU", "-LI"]], + ["el-GR"], + ["en", ["-US", "-UK", "-AU", "-CA", "-NZ", "-IE", "-ZA", + "-JM", "029", "-BZ", "-TT", "-ZW", "-PH", "-ID", + "-HK", "-IN", "-MY", "-SG"]], + ["es", ["-ES", "-MX", "-ES", "-GT", "-CR", "-PA", "-DO", + "-VE", "-CO", "-PE", "-AR", "-EC", "-CL", "-UY", + "-PY", "-BO", "-SV", "-HN", "-NI", "-PR", "-US"]], + ["fi-FI"], + ["fr", ["-FR", "-BE", "-CA", "-CH", "-LU", "-MC", "", + "-RE", "-CG", "-SN", "-CM", "-CI", "-ML", "-MA", + "-HT"]], + ["he-IL"], + ["hu-HU"], + ["is-IS"], +# 0010 + ["it", ["-IT", "-CH"]], + ["ja-JP"], + ["ko-KR"], + ["nl", ["-NL", "-BE"]], + ["no", ["-bok-NO", "-nyn-NO"]], + ["pl-PL"], + ["pt", ["-BR", "-PT"]], + ["rm-CH"], + ["ro", ["-RO", "_MD"]], + ["ru-RU"], + ["hr", ["-HR", "-Latn-CS", "Cyrl-CS", "-BA", "", "-Latn-BA", "-Cyrl-BA"]], + ["sk-SK"], + ["sq-AL"], + ["sv", ["-SE", "-FI"]], + ["th-TH"], + ["tr-TR"], +# 0020 + ["ur", ["-PK", "tr-IN"]], + ["id-ID"], + ["uk-UA"], + ["be-BY"], + ["sl-SL"], + ["et-EE"], + ["lv-LV"], + ["lt-LT"], + ["tg-Cyrl-TJ"], + ["fa-IR"], + ["vi-VN"], + ["hy-AM"], + ["az", ["-Latn-AZ", "-Cyrl-AZ"]], + ["eu-ES"], + ["wen". ["wen-DE", "dsb-DE"]], + ["mk-MK"], +# 0030 + ["st"], + ["ts"], + ["tn-ZA"], + ["ven"], + ["xh-ZA"], + ["zu-ZA"], + ["af-ZA"], + ["ka-GE"], + ["fo-FO"], + ["hi-IN"], + ["mt"], + ["se", ["-NO", "-SE", "-FI", "smj-NO", "smj-SE", "sma-NO", "sma-SE", + "", "smn-FI"]], + ["ga-IE"], + ["yi"], + ["ms", ["-MY", "-BN"]], + ["kk-KZ"], +# 0040 + ["ky-KG"], + ["sw-KE"], + ["tk-TM"], + ["uz", ["-Latn-UZ", "-Cyrl-UZ"]], + ["tt-RU"], + ["bn", ["-IN", "-BD"]], + ["pa", ["-IN", "-Arab-PK"]], + ["gu-IN"], + ["or-IN"], + ["ta-IN"], + ["te-IN"], + ["kn-IN"], + ["ml-IN"], + ["as-IN"], + ["mr-IN"], + ["sa-IN"], +# 0050 + ["mn", ["-Cyrl-MN", "-Mong-CN"]], + ["bo", ["-CN", "-BT"]], + ["cy-GB"], + ["km-KH"], + ["lo-LA"], + ["my"], + ["gl-ES"], + ["kok-IN"], + ["mni"], + ["sd", ["-IN", "-PK"]], + ["syr-SY"], + ["si-LK"], + ["chr"], + ["iu", ["-Cans-CA", "-Latn-CA"]], + ["am-ET"], + ["tmz", ["-Arab", "tmz-Latn-DZ"]], +# 0060 + ["ks"], + ["ne", ["-NP", "-IN"]], + ["fy-NL"], + ["ps-AF"], + ["fil-PH"], + ["dv-MV"], + ["bin-NG"], + ["fuv-NG"], + ["ha-Latn-NG"], + ["ibb-NG"], + ["yo-NG"], + ["quz", ["-BO", "-EC", "-PE"]], + ["ns-ZA"], + ["ba-RU"], + ["lb-LU"], + ["kl-GL"], +# 0070 + ["ig-NG"], + ["kau"], + ["om"], + ["ti", ["-ET". "-ER"]], + ["gn"], + ["haw"], + ["la"], + ["so"], + ["ii-CN"], + ["pap"], + ["arn-CL"], + [""], # (unassigned) + ["moh-CA"], + [""], # (unassigned) + ["br-FR"], + [""], # (unassigned) +# 0080 + ["ug-CN"], + [""], # (unassigned) + ["oc-FR"], + ["gsw-FR"], + [""], # (unassigned) + ["sah-RU"], + ["qut-GT"], + ["rw-RW"], + ["wo-SN"], + [""], # (unassigned) + [""], # (unassigned) + [""], # (unassigned) + ["gbz-AF"], +); + +@mac_langs = ( + 'en', 'fr', 'de', 'it', 'nl', 'sv', 'es', 'da', 'pt', 'no', + 'he', 'ja', 'ar', 'fi', 'el', 'is', 'mt', 'tr', 'hr', 'zh-Hant', + 'ur', 'hi', 'th', 'ko', 'lt', 'pl', 'hu', 'et', 'lv', 'se', + 'fo', 'ru' ,'zh-Hans', 'nl', 'ga', 'sq', 'ro', 'cs', 'sk', + 'sl', 'yi', 'sr', 'mk', 'bg', 'uk', 'be', 'uz', 'kk', 'az-Cyrl', + 'az-Latn', 'hy', 'ka', 'mo', 'ky', 'abh', 'tuk', 'mn-Mong', 'mn-Cyrl', 'pst', + 'ku', 'ks', 'sd', 'bo', 'ne', 'sa', 'mr', 'bn', 'as', 'gu', + 'pa', 'or', 'ml', 'kn', 'ta', 'te', 'si', 'my', 'km', 'lo', + 'vi', 'id', 'tl', 'ms-Latn', 'ms-Arab', 'am', 'ti', 'tga', 'so', 'sw', + 'rw', 'rn', 'ny', 'mg', 'eo', '', '', '', '', '', + '', '', '', '', '', '', '', '', '', '', + '', '', '', '', '', '', '', '', '', '', + '', '', '', '', '', '', '', '', 'cy', 'eu', + 'la', 'qu', 'gn', 'ay', 'tt', 'ug', 'dz', 'jv-Latn', 'su-Latn', + 'gl', 'af', 'br', 'iu', 'gd', 'gv', 'gd-IR-x-dotabove', 'to', 'el-polyton', 'kl', + 'az-Latn' +); + +} + +1; + +=head1 BUGS + +=over 4 + +=item * + +Unicode type strings will be stored in utf8 for all known platforms, +once Perl 5.6 has been released and I can find all the mapping tables, etc. + +=back + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/OS_2.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/OS_2.pm new file mode 100644 index 0000000..0092732 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/OS_2.pm @@ -0,0 +1,354 @@ +package Font::TTF::OS_2; + +=head1 NAME + +Font::TTF::OS_2 - the OS/2 table in a TTF font + +=head1 DESCRIPTION + +The OS/2 table has two versions and forms, one an extension of the other. This +module supports both forms and the switching between them. + +=head1 INSTANCE VARIABLES + +No other variables than those in table and those in the standard: + + Version + xAvgCharWidth + usWeightClass + usWidthClass + fsType + ySubscriptXSize + ySubScriptYSize + ySubscriptXOffset + ySubscriptYOffset + ySuperscriptXSize + ySuperscriptYSize + ySuperscriptXOffset + ySuperscriptYOffset + yStrikeoutSize + yStrikeoutPosition + sFamilyClass + bFamilyType + bSerifStyle + bWeight + bProportion + bContrast + bStrokeVariation + bArmStyle + bLetterform + bMidline + bXheight + ulUnicodeRange1 + ulUnicodeRange2 + ulUnicodeRange3 + ulUnicodeRange4 + achVendID + fsSelection + usFirstCharIndex + usLastCharIndex + sTypoAscender + sTypoDescender + sTypoLineGap + usWinAscent + usWinDescent + ulCodePageRange1 + ulCodePageRange2 + xHeight + CapHeight + defaultChar + breakChar + maxLookups + +Notice that versions 0, 1, 2 & 3 of the table are supported. Notice also that the +Panose variable has been broken down into its elements. + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA @fields @lens @field_info @weights); +use Font::TTF::Table; + +@ISA = qw(Font::TTF::Table); +@field_info = ( + 'xAvgCharWidth' => 's', + 'usWeightClass' => 'S', + 'usWidthClass' => 'S', + 'fsType' => 's', + 'ySubscriptXSize' => 's', + 'ySubScriptYSize' => 's', + 'ySubscriptXOffset' => 's', + 'ySubscriptYOffset' => 's', + 'ySuperscriptXSize' => 's', + 'ySuperscriptYSize' => 's', + 'ySuperscriptXOffset' => 's', + 'ySuperscriptYOffset' => 's', + 'yStrikeoutSize' => 's', + 'yStrikeoutPosition' => 's', + 'sFamilyClass' => 's', + 'bFamilyType' => 'C', + 'bSerifStyle' => 'C', + 'bWeight' => 'C', + 'bProportion' => 'C', + 'bContrast' => 'C', + 'bStrokeVariation' => 'C', + 'bArmStyle' => 'C', + 'bLetterform' => 'C', + 'bMidline' => 'C', + 'bXheight' => 'C', + 'ulUnicodeRange1' => 'L', + 'ulUnicodeRange2' => 'L', + 'ulUnicodeRange3' => 'L', + 'ulUnicodeRange4' => 'L', + 'achVendID' => 'L', + 'fsSelection' => 'S', + 'usFirstCharIndex' => 'S', + 'usLastCharIndex' => 'S', + 'sTypoAscender' => 'S', + 'sTypoDescender' => 's', + 'sTypoLineGap' => 'S', + 'usWinAscent' => 'S', + 'usWinDescent' => 'S', + '' => '', + 'ulCodePageRange1' => 'L', + 'ulCodePageRange2' => 'L', + '' => '', + 'xHeight' => 's', + 'CapHeight' => 's', + 'defaultChar' => 'S', + 'breakChar' => 'S', + 'maxLookups' => 's', + '' => '', # i.e. v3 is basically same as v2 + ); + +@weights = qw(64 14 27 35 100 20 14 42 63 3 6 35 20 56 56 17 4 49 56 71 31 10 18 3 18 2 166); + +use Font::TTF::Utils; + +sub init +{ + my ($k, $v, $c, $n, $i, $t, $j); + + $n = 0; + @lens = (76, 84, 94, 94); + for ($j = 0; $j < $#field_info; $j += 2) + { + if ($field_info[$j] eq '') + { + $n++; + next; + } + ($k, $v, $c) = TTF_Init_Fields($field_info[$j], $c, $field_info[$j+1]); + next unless defined $k && $k ne ""; + for ($i = $n; $i < 4; $i++) + { $fields[$i]{$k} = $v; } + } +} + + +=head2 $t->read + +Reads in the various values from disk (see details of OS/2 table) + +=cut + +sub read +{ + my ($self) = @_; + my ($dat, $ver); + + $self->SUPER::read or return $self; + + init unless defined $fields[2]{'xAvgCharWidth'}; + $self->{' INFILE'}->read($dat, 2); + $ver = unpack("n", $dat); + $self->{'Version'} = $ver; + if ($ver < 4) + { + $self->{' INFILE'}->read($dat, $lens[$ver]); + TTF_Read_Fields($self, $dat, $fields[$ver]); + } + $self; +} + + +=head2 $t->out($fh) + +Writes the table to a file either from memory or by copying. + +=cut + +sub out +{ + my ($self, $fh) = @_; + my ($ver); + + return $self->SUPER::out($fh) unless $self->{' read'}; + + $ver = $self->{'Version'}; + $fh->print(pack("n", $ver)); + $fh->print(TTF_Out_Fields($self, $fields[$ver], $lens[$ver])); + $self; +} + + +=head2 $t->XML_element($context, $depth, $key, $value) + +Tidies up the hex values to output them in hex + +=cut + +sub XML_element +{ + my ($self) = shift; + my ($context, $depth, $key, $value) = @_; + my ($fh) = $context->{'fh'}; + + if ($key =~ m/^ul(?:Unicode|CodePage)Range\d$/o) + { $fh->printf("%s<%s>%08X\n", $depth, $key, $value, $key); } + elsif ($key eq 'achVendID') + { $fh->printf("%s<%s name='%s'/>\n", $depth, $key, pack('N', $value)); } + else + { return $self->SUPER::XML_element(@_); } + $self; +} + + +=head2 $t->XML_end($context, $tag, %attrs) + +Now handle them on the way back in + +=cut + +sub XML_end +{ + my ($self) = shift; + my ($context, $tag, %attrs) = @_; + + if ($tag =~ m/^ul(?:Unicode|CodePage)Range\d$/o) + { return hex($context->{'text'}); } + elsif ($tag eq 'achVendID') + { return unpack('N', $attrs{'name'}); } + else + { return $self->SUPER::XML_end(@_); } +} + +=head2 $t->update + +Updates the OS/2 table by getting information from other sources: + +Updates the C and C values based on the MS table in the +cmap. + +Updates the sTypoAscender, sTypoDescender & sTypoLineGap to be the same values +as Ascender, Descender and Linegap from the hhea table (assuming it is dirty) +and also sets usWinAscent to be the sum of Ascender+Linegap and usWinDescent to +be the negative of Descender. + +=cut + +sub update +{ + my ($self) = @_; + my ($map, @keys, $table, $i, $avg, $hmtx); + + return undef unless ($self->SUPER::update); + + $self->{' PARENT'}{'cmap'}->update; + $map = $self->{' PARENT'}{'cmap'}->find_ms || return undef; + $hmtx = $self->{' PARENT'}{'hmtx'}->read; + + @keys = sort {$a <=> $b} grep {$_ < 0x10000} keys %{$map->{'val'}}; + + $self->{'usFirstCharIndex'} = $keys[0]; + $self->{'usLastCharIndex'} = $keys[-1]; + + $table = $self->{' PARENT'}{'hhea'}->read; + + # try any way we can to get some real numbers passed around! + if (($self->{'fsSelection'} & 128) != 0) + { + # assume the user knows what they are doing and has sensible values already + } + elsif ($table->{'Ascender'} != 0 || $table->{'Descender'} != 0) + { + $self->{'sTypoAscender'} = $table->{'Ascender'}; + $self->{'sTypoDescender'} = $table->{'Descender'}; + $self->{'sTypoLineGap'} = $table->{'LineGap'}; + $self->{'usWinAscent'} = $self->{'sTypoAscender'} + $self->{'sTypoLineGap'}; + $self->{'usWinDescent'} = -$self->{'sTypoDescender'}; + } + elsif ($self->{'sTypoAscender'} != 0 || $self->{'sTypoDescender'} != 0) + { + $table->{'Ascender'} = $self->{'sTypoAscender'}; + $table->{'Descender'} = $self->{'sTypoDescender'}; + $table->{'LineGap'} = $self->{'sTypoLineGap'}; + $self->{'usWinAscent'} = $self->{'sTypoAscender'} + $self->{'sTypoLineGap'}; + $self->{'usWinDescent'} = -$self->{'sTypoDescender'}; + } + elsif ($self->{'usWinAscent'} != 0 || $self->{'usWinDescent'} != 0) + { + $self->{'sTypoAscender'} = $table->{'Ascender'} = $self->{'usWinAscent'}; + $self->{'sTypoDescender'} = $table->{'Descender'} = -$self->{'usWinDescent'}; + $self->{'sTypoLineGap'} = $table->{'LineGap'} = 0; + } + + if ($self->{'Version'} < 3) + { + for ($i = 0; $i < 26; $i++) + { $avg += $hmtx->{'advance'}[$map->{'val'}{$i + 0x0061}] * $weights[$i]; } + $avg += $hmtx->{'advance'}[$map->{'val'}{0x0020}] * $weights[-1]; + $self->{'xAvgCharWidth'} = $avg / 1000; + } + elsif ($self->{'Version'} > 2) + { + $i = 0; $avg = 0; + foreach (@{$hmtx->{'advance'}}) + { + next unless ($_); + $i++; + $avg += $_; + } + $avg /= $i if ($i); + $self->{'xAvgCharWidth'} = $avg; + } + + foreach $i (keys %{$map->{'val'}}) + { + if ($i >= 0x10000) + { + $self->{'ulUnicodeRange2'} |= 0x2000000; + last; + } + } + + $self->{'Version'} = 1 if (defined $self->{'ulCodePageRange1'} && $self->{'Version'} < 1); + $self->{'Version'} = 2 if (defined $self->{'maxLookups'} && $self->{'Version'} < 2); + + if ((exists $self->{' PARENT'}{'GPOS'} && $self->{' PARENT'}{'GPOS'}{' read'}) || + (exists $self->{' PARENT'}{'GSUB'} && $self->{' PARENT'}{'GSUB'}{' read'})) + { + # one or both of GPOS & GSUB exist and have been read or modified; so update usMaxContexts + my ($lp, $ls); + $lp = $self->{' PARENT'}{'GPOS'}->maxContext if exists $self->{' PARENT'}{'GPOS'}; + $ls = $self->{' PARENT'}{'GSUB'}->maxContext if exists $self->{' PARENT'}{'GSUB'}; + $self->{'maxLookups'} = $lp > $ls ? $lp : $ls; + } + + $self; +} + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/OTTags.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/OTTags.pm new file mode 100644 index 0000000..71338e2 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/OTTags.pm @@ -0,0 +1,706 @@ +package Font::TTF::OTTags; + +=head1 NAME + +Font::TTF::OTTags - Utilities for TrueType/OpenType tags + +=head1 SYNOPSIS + + use Font::TTF::OTTags qw( %tttags %ttnames readtagsfile ); + + # Look at built-in stuff: + $script_tag = $tttags{'SCRIPT'}{'Cypriot Syllabary'}; + $lang_name = $ttnames{'LANGUAGE'}{'AFK '} + + # Read latest tags file to add to built-in definitions + readtagsfile ("C:\\Program Files\\Microsoft VOLT\\TAGS.txt"); + +First-level keys to %tttags and %ttnames are: + +=over + +'SCRIPT' -- retrieve script tag or name + +'LANGUAGE' -- retrieve language tag or name + +'FEATURE' -- retrieve feature tag or name + +=back + +Built-in data has been derived from Microsoft's tag registry at +L, +updated to draft v1.5 of the OpenType Spec. + +=head1 METHODS + +=cut + +use strict; +use vars qw( %tttags %ttnames @EXPORT_OK @ISA ); +require Exporter; +@ISA = qw( Exporter ); +@EXPORT_OK = qw( %tttags %ttnames readtagsfile); + + +%tttags = ( + +# All data below derived from VOLT 1.3 TAGS.txt file. +# For conveninence of human checking, these are now sorted alphabetically. + +'SCRIPT' => { + "Arabic" => "arab", + "Armenian" => "armn", + "Balinese" => "bali", + "Bengali v.2" => "bng2", + "Bengali" => "beng", + "Bopomofo" => "bopo", + "Braille" => "brai", + "Buginese" => "bugi", + "Buhid" => "buhd", + "Byzantine Music" => "byzm", + "CJK Ideographic" => "hani", + "Canadian Syllabics" => "cans", + "Carian" => "cari", + "Cham" => "cham", + "Cherokee" => "cher", + "Coptic" => "copt", + "Cypriot Syllabary" => "cprt", + "Cyrillic" => "cyrl", + "Default" => "DFLT", + "Deseret" => "dsrt", + "Devanagari v.2" => "dev2", + "Devanagari" => "deva", + "Ethiopic" => "ethi", + "Georgian" => "geor", + "Glagolitic" => "glag", + "Gothic" => "goth", + "Greek" => "grek", + "Gujarati v.2" => "gjr2", + "Gujarati" => "gujr", + "Gurmukhi v.2" => "gur2", + "Gurmukhi" => "guru", + "Hangul Jamo" => "jamo", + "Hangul" => "hang", + "Hanunoo" => "hano", + "Hebrew" => "hebr", + "Hiragana" => "kana", + "Javanese" => "java", + "Kannada v.2" => "knd2", + "Kannada" => "knda", + "Katakana" => "kana", + "Kayah Li" => "kali", + "Kharosthi" => "khar", + "Khmer" => "khmr", + "Lao" => "lao ", + "Latin" => "latn", + "Lepcha" => "lepc", + "Limbu" => "limb", + "Linear B" => "linb", + "Lycian" => "lyci", + "Lydian" => "lydi", + "Malayalam v.2" => "mlm2", + "Malayalam" => "mlym", + "Mathematical Alphanumeric Symbols" => "math", + "Mongolian" => "mong", + "Musical Symbols" => "musc", + "Myanmar" => "mymr", + "N'Ko" => "nko ", + "New Tai Lue" => "talu", + "Ogham" => "ogam", + "Ol Chiki" => "olck", + "Old Italic" => "ital", + "Old Persian Cuneiform" => "xpeo", + "Oriya v.2" => "ory2", + "Oriya" => "orya", + "Osmanya" => "osma", + "Phags-pa" => "phag", + "Phoenician" => "phnx", + "Rejang" => "rjng", + "Runic" => "runr", + "Saurashtra" => "saur", + "Shavian" => "shaw", + "Sinhala" => "sinh", + "Sumero-Akkadian Cuneiform" => "xsux", + "Sundanese" => "sund", + "Syloti Nagri" => "sylo", + "Syriac" => "syrc", + "Tagalog" => "tglg", + "Tagbanwa" => "tagb", + "Tai Le" => "tale", + "Tamil v.2" => "tml2", + "Tamil" => "taml", + "Telugu v.2" => "tel2", + "Telugu" => "telu", + "Thaana" => "thaa", + "Thai" => "thai", + "Tibetan" => "tibt", + "Tifinagh" => "tfng", + "Ugaritic Cuneiform" => "ugar", + "Vai" => "vai ", + "Yi" => "yi ", + }, + +'LANGUAGE' => { + "Aari" => "ARI ", + "Abaza" => "ABA ", + "Abkhazian" => "ABK ", + "Adyghe" => "ADY ", + "Afar" => "AFR ", + "Afrikaans" => "AFK ", + "Agaw" => "AGW ", + "Albanian" => "SQI ", + "Alsatian" => "ALS ", + "Altai" => "ALT ", + "Amharic" => "AMH ", + "Arabic" => "ARA ", + "Arakanese" => "ARK ", + "Armenian" => "HYE ", + "Assamese" => "ASM ", + "Athapaskan" => "ATH ", + "Avar" => "AVR ", + "Awadhi" => "AWA ", + "Aymara" => "AYM ", + "Azeri" => "AZE ", + "Badaga" => "BAD ", + "Baghelkhandi" => "BAG ", + "Balante" => "BLN ", + "Balkar" => "BAL ", + "Balochi" => "BLI ", + "Balti" => "BLT ", + "Bambara" => "BMB ", + "Bamileke" => "BML ", + "Bashkir" => "BSH ", + "Basque" => "EUQ ", + "Baule" => "BAU ", + "Belarussian" => "BEL ", + "Bemba" => "BEM ", + "Bench" => "BCH ", + "Bengali" => "BEN ", + "Berber" => "BBR ", + "Beti" => "BTI ", + "Bhili" => "BHI ", + "Bhojpuri" => "BHO ", + "Bible Cree" => "BCR ", + "Bikol" => "BIK ", + "Bilen" => "BIL ", + "Blackfoot" => "BKF ", + "Bosnian" => "BOS ", + "Brahui" => "BRH ", + "Braj Bhasha" => "BRI ", + "Breton" => "BRE ", + "Bulgarian" => "BGR ", + "Burmese" => "BRM ", + "Carrier" => "CRR ", + "Catalan" => "CAT ", + "Cebuano" => "CEB ", + "Chaha Gurage" => "CHG ", + "Chattisgarhi" => "CHH ", + "Chechen" => "CHE ", + "Cherokee" => "CHR ", + "Chichewa" => "CHI ", + "Chin" => "QIN ", + "Chinese Hong Kong" => "ZHH ", + "Chinese Phonetic" => "ZHP ", + "Chinese Simplified" => "ZHS ", + "Chinese Traditional" => "ZHT ", + "Chipewyan" => "CHP ", + "Chukchi" => "CHK ", + "Church Slavonic" => "CSL ", + "Chuvash" => "CHU ", + "Comorian" => "CMR ", + "Coptic" => "COP ", + "Corsican" => "COS ", + "Cree" => "CRE ", + "Crimean Tatar" => "CRT ", + "Croatian" => "HRV ", + "Czech" => "CSY ", + "Dangme" => "DNG ", + "Danish" => "DAN ", + "Dargwa" => "DAR ", + "Dari" => "DRI ", + "Default" => "dflt", + "Dhivehi (OBSOLETE)" => "DHV ", + "Dhivehi" => "DIV ", + "Dinka" => "DNK ", + "Djerma" => "DJR ", + "Dogri" => "DGR ", + "Dungan" => "DUN ", + "Dutch" => "NLD ", + "Dzongkha" => "DZN ", + "Eastern Cree" => "ECR ", + "Ebira" => "EBI ", + "Edo" => "EDO ", + "Efik" => "EFI ", + "English" => "ENG ", + "Erzya" => "ERZ ", + "Esperanto" => "NTO ", + "Estonian" => "ETI ", + "Even" => "EVN ", + "Evenki" => "EVK ", + "Ewe" => "EWE ", + "Faroese" => "FOS ", + "Farsi" => "FAR ", + "Fijian" => "FJI ", + "Filipino" => "PIL ", + "Finnish" => "FIN ", + "Flemish" => "FLE ", + "Fon" => "FON ", + "Forest Nenets" => "FNE ", + "French Antillean" => "FAN ", + "French" => "FRA ", + "Frisian" => "FRI ", + "Friulian" => "FRL ", + "Fulani" => "FUL ", + "Futa" => "FTA ", + "Ga" => "GAD ", + "Gaelic" => "GAE ", + "Gagauz" => "GAG ", + "Galician" => "GAL ", + "Garhwali" => "GAW ", + "Garo" => "GRO ", + "Garshuni" => "GAR ", + "Ge'ez" => "GEZ ", + "Georgian" => "KAT ", + "German" => "DEU ", + "Gilyak" => "GIL ", + "Gondi" => "GON ", + "Greek" => "ELL ", + "Greenlandic" => "GRN ", + "Guarani" => "GUA ", + "Gujarati" => "GUJ ", + "Gumuz" => "GMZ ", + "Haitian" => "HAI ", + "Halam" => "HAL ", + "Hammer-Banna" => "HBN ", + "Harari" => "HRI ", + "Harauti" => "HAR ", + "Hausa" => "HAU ", + "Hawaiin" => "HAW ", + "Hebrew" => "IWR ", + "High Mari" => "HMA ", + "Hiligaynon" => "HIL ", + "Hindi" => "HIN ", + "Hindko" => "HND ", + "Ho" => "HO ", + "Hungarian" => "HUN ", + "Icelandic" => "ISL ", + "Igbo" => "IBO ", + "Ijo" => "IJO ", + "Ilokano" => "ILO ", + "Inari Sami" => "ISM ", + "Indonesian" => "IND ", + "Ingush" => "ING ", + "Inuktitut" => "INU ", + "Irish Traditional" => "IRT ", + "Irish" => "IRI ", + "Italian" => "ITA ", + "Japanese" => "JAN ", + "Javanese" => "JAV ", + "Judezmo" => "JUD ", + "Jula" => "JUL ", + "Kabardian" => "KAB ", + "Kachchi" => "KAC ", + "Kalenjin" => "KAL ", + "Kalmyk" => "KLM ", + "Kamba" => "KMB ", + "Kannada" => "KAN ", + "Kanuri" => "KNR ", + "Karachay" => "KAR ", + "Karaim" => "KRM ", + "Karakalpak" => "KRK ", + "Karelian" => "KRL ", + "Karen" => "KRN ", + "Kashmiri" => "KSH ", + "Kazakh" => "KAZ ", + "Kebena" => "KEB ", + "Khakass" => "KHA ", + "Khanty-Kazim" => "KHK ", + "Khanty-Shurishkar" => "KHS ", + "Khanty-Vakhi" => "KHV ", + "Khasi" => "KSI ", + "Khmer" => "KHM ", + "Khowar" => "KHW ", + "Khutsuri Georgian" => "KGE ", + "Kikongo" => "KON ", + "Kikuyu" => "KIK ", + "Kildin Sami" => "KSM ", + "Kirghiz" => "KIR ", + "Kisii" => "KIS ", + "Kodagu" => "KOD ", + "Kokni" => "KKN ", + "Komi-Permyak" => "KOP ", + "Komi-Zyrian" => "KOZ ", + "Komo" => "KMO ", + "Komso" => "KMS ", + "Konkani" => "KOK ", + "Koorete" => "KRT ", + "Korean Old Hangul" => "KOH ", + "Korean" => "KOR ", + "Koryak" => "KYK ", + "Kpelle" => "KPL ", + "Krio" => "KRI ", + "Kui" => "KUI ", + "Kulvi" => "KUL ", + "Kumaoni" => "KMN ", + "Kumyk" => "KUM ", + "Kurdish" => "KUR ", + "Kurukh" => "KUU ", + "Kuy" => "KUY ", + "L-Cree" => "LCR ", + "Ladakhi" => "LDK ", + "Ladin" => "LAD ", + "Lahuli" => "LAH ", + "Lak" => "LAK ", + "Lambani" => "LAM ", + "Lao" => "LAO ", + "Latin" => "LAT ", + "Latvian" => "LVI ", + "Laz" => "LAZ ", + "Lezgi" => "LEZ ", + "Limbu" => "LMB ", + "Lingala" => "LIN ", + "Lithuanian" => "LTH ", + "Lomwe" => "LMW ", + "Low Mari" => "LMA ", + "Lower Sorbian" => "LSB ", + "Luba" => "LUB ", + "Luganda" => "LUG ", + "Luhya" => "LUH ", + "Lule Sami" => "LSM ", + "Luo" => "LUO ", + "Luxembourgish" => "LTZ ", + "Macedonian" => "MKD ", + "Maithili" => "MTH ", + "Majang" => "MAJ ", + "Makua" => "MAK ", + "Malagasy" => "MLG ", + "Malay" => "MLY ", + "Malayalam Reformed" => "MLR ", + "Malayalam Traditional" => "MAL ", + "Male" => "MLE ", + "Malinke" => "MLN ", + "Maltese" => "MTS ", + "Manchu" => "MCH ", + "Mandinka" => "MND ", + "Maninka" => "MNK ", + "Manipuri" => "MNI ", + "Mansi" => "MAN ", + "Manx Gaelic" => "MNX ", + "Maori" => "MRI ", + "Mapudungun" => "MAP ", + "Marathi" => "MAR ", + "Marwari" => "MAW ", + "Mbundu" => "MBN ", + "Me'en" => "MEN ", + "Mende" => "MDE ", + "Mizo" => "MIZ ", + "Mohawk" => "MOH ", + "Moksha" => "MOK ", + "Moldavian" => "MOL ", + "Mon" => "MON ", + "Mongolian" => "MNG ", + "Moose Cree" => "MCR ", + "Moroccan" => "MOR ", + "Mundari" => "MUN ", + "N'Ko" => "NKO ", + "N-Cree" => "NCR ", + "Naga-Assamese" => "NAG ", + "Nagari" => "NGR ", + "Nanai" => "NAN ", + "Naskapi" => "NAS ", + "Ndebele" => "NDB ", + "Ndonga" => "NDG ", + "Nepali" => "NEP ", + "Newari" => "NEW ", + "Nisi" => "NIS ", + "Niuean" => "NIU ", + "Nkole" => "NKL ", + "Nogai" => "NOG ", + "Northern Sami" => "NSM ", + "Northern Tai" => "NTA ", + "Norway House Cree" => "NHC ", + "Norwegian" => "NOR ", + "Nynorsk" => "NYN ", + "Occitan" => "OCI ", + "Oji-Cree" => "OCR ", + "Ojibway" => "OJB ", + "Oriya" => "ORI ", + "Oromo" => "ORO ", + "Ossetian" => "OSS ", + "Palaung" => "PLG ", + "Palestinian Aramaic" => "PAA ", + "Pali" => "PAL ", + "Palpa" => "PAP ", + "Pashto" => "PAS ", + "Polish" => "PLK ", + "Polytonic Greek" => "PGR ", + "Portuguese" => "PTG ", + "Provencal" => "PRO ", + "Punjabi" => "PAN ", + "R-Cree" => "RCR ", + "Rajasthani" => "RAJ ", + "Rhaeto-Romanic" => "RMS ", + "Riang" => "RIA ", + "Romanian" => "ROM ", + "Romany" => "ROY ", + "Ruanda" => "RUA ", + "Russian Buriat" => "RBU ", + "Russian" => "RUS ", + "Rusyn" => "RSY ", + "Sadri" => "SAD ", + "Samoan" => "SMO ", + "Sango" => "SGO ", + "Sanskrit" => "SAN ", + "Santali" => "SAT ", + "Saraiki" => "SRK ", + "Sayisi" => "SAY ", + "Sekota" => "SEK ", + "Selkup" => "SEL ", + "Sena" => "SNA ", + "Serbian" => "SRB ", + "Serer" => "SRR ", + "Shan" => "SHN ", + "Sibe" => "SIB ", + "Sidamo" => "SID ", + "Silte Gurage" => "SIG ", + "Sindhi" => "SND ", + "Sinhalese" => "SNH ", + "Skolt Sami" => "SKS ", + "Slavey" => "SLA ", + "Slovak" => "SKY ", + "Slovenian" => "SLV ", + "Sodo Gurage" => "SOG ", + "Somali" => "SML ", + "Soninke" => "SNK ", + "Sotho" => "SOT ", + "South Slavey" => "SSL ", + "Southern Sami" => "SSM ", + "Spanish" => "ESP ", + "Suri" => "SUR ", + "Sutu" => "SXT ", + "Svan" => "SVA ", + "Swadaya Aramaic" => "SWA ", + "Swahili" => "SWK ", + "Swazi" => "SWZ ", + "Swedish" => "SVE ", + "Syriac" => "SYR ", + "TH-Cree" => "TCR ", + "Tabasaran" => "TAB ", + "Tahitian" => "THT ", + "Tai Lue" => "XBD ", + "Tajiki" => "TAJ ", + "Tamil" => "TAM ", + "Tatar" => "TAT ", + "Telugu" => "TEL ", + "Temne" => "TMN ", + "Thai" => "THA ", + "Tibetan" => "TIB ", + "Tigre" => "TGR ", + "Tigrinya" => "TGY ", + "Todo" => "TOD ", + "Tonga" => "TNG ", + "Tongan" => "TGN ", + "Tsonga" => "TSG ", + "Tswana" => "TNA ", + "Tulu" => "TUL ", + "Tundra Nenets" => "TNE ", + "Turkish" => "TRK ", + "Turkmen" => "TKM ", + "Turoyo Aramaic" => "TUA ", + "Tuvin" => "TUV ", + "Twi" => "TWI ", + "Udmurt" => "UDM ", + "Ukrainian" => "UKR ", + "Upper Sorbian" => "USB ", + "Urdu" => "URD ", + "Uyghur" => "UYG ", + "Uzbek" => "UZB ", + "Venda" => "VEN ", + "Vietnamese" => "VIT ", + "Wa" => "WA ", + "Wagdi" => "WAG ", + "Welsh" => "WEL ", + "West-Cree" => "WCR ", + "Wolof" => "WLF ", + "Woods Cree" => "DCR ", + "Xhosa" => "XHS ", + "Y-Cree" => "YCR ", + "Yakut" => "YAK ", + "Yi Classic" => "YIC ", + "Yi Modern" => "YIM ", + "Yiddish" => "JII ", + "Yoruba" => "YBA ", + "Zande" => "ZND ", + "Zulu" => "ZUL ", + }, + +'FEATURE' => { + "Above-Base Forms" => "abvf", + "Above-Base Mark Positioning" => "abvm", + "Above-Base Substitutions" => "abvs", + "Access All Alternates" => "aalt", + "Akhands" => "akhn", + "Alternate Annotation Forms" => "nalt", + "Alternate Half Widths" => "halt", + "Alternate Vertical Half Metrics" => "vhal", + "Alternate Vertical Metrics" => "valt", + "Alternative Fractions" => "afrc", + "Below-Base Forms" => "blwf", + "Below-Base Mark Positioning" => "blwm", + "Below-Base Substitutions" => "blws", + "Capital Spacing" => "cpsp", + "Case-Sensitive Forms" => "case", + "Centered CJK Punctuation" => "cpct", + "Conjunct Forms After Ro" => "cfar", + "Conjunct Forms" => "cjct", + "Contextual Alternates" => "calt", + "Contextual Ligatures" => "clig", + "Contextual Swash" => "cswh", + "Cursive Positioning" => "curs", + "Default Processing" => "dflt", + "Denominators" => "dnom", + "Diphthongs (OBSOLETE)" => "dpng", + "Discretionary Ligatures" => "dlig", + "Distances" => "dist", + "Expert Forms" => "expt", + "Final Glyph On Line Alternates" => "falt", + "Fractions" => "frac", + "Full Widths" => "fwid", + "Glyph Composition/Decomposition" => "ccmp", + "Halant Forms" => "haln", + "Half Forms" => "half", + "Half Widths" => "hwid", + "Hangul" => "hngl", + "Historical Forms" => "hist", + "Historical Ligatures" => "hlig", + "Hojo (JIS X 0212-1990) Kanji Forms" => "hojo", + "Horizontal Kana Alternates" => "hkna", + "Initial Forms" => "init", + "Isolated Forms" => "isol", + "Italics" => "ital", + "JIS2004 Forms" => "jp04", + "JIS78 Forms" => "jp78", + "JIS83 Forms" => "jp83", + "JIS90 Forms" => "jp90", + "Justification Alternates" => "jalt", + "Kerning" => "kern", + "Leading Jamo Forms" => "ljmo", + "Left Bounds" => "lfbd", + "Lining Figures" => "lnum", + "Localized Forms" => "locl", + "Mark Positioning via Substitution" => "mset", + "Mark Positioning" => "mark", + "Mark to Mark Positioning" => "mkmk", + "Mathematical Greek" => "mgrk", + "Medial Forms #2" => "med2", + "Medial Forms" => "medi", + "NLC Kanji Forms" => "nlck", + "Nukta Forms" => "nukt", + "Numerators" => "numr", + "Oldstyle Figures" => "onum", + "Optical Bounds" => "opbd", + "Optical Size" => "size", + "Ordinals" => "ordn", + "Ornaments" => "ornm", + "Petite Capitals From Capitals" => "c2pc", + "Petite Capitals" => "pcap", + "Post-base Forms" => "pstf", + "Post-base Substitutions" => "psts", + "Pre-base Forms" => "pref", + "Pre-base Substitutions" => "pres", + "Proportional Alternate Vertical Metrics" => "vpal", + "Proportional Alternate Widths" => "palt", + "Proportional Figures" => "pnum", + "Proportional Kana" => "pkna", + "Proportional Widths" => "pwid", + "Quarter Widths" => "qwid", + "Rakar Forms" => "rkrf", + "Randomize" => "rand", + "Reph Forms" => "rphf", + "Required Ligatures" => "rlig", + "Right Bounds" => "rtbd", + "Right-To-Left Alternates" => "rtla", + "Ruby Notation Forms" => "ruby", + "Scientific Inferiors" => "sinf", + "Simplified Forms" => "smpl", + "Slashed Zero" => "zero", + "Small Capitals From Capitals" => "c2sc", + "Small Capitals" => "smcp", + "Standard Ligatures" => "liga", + "Stylistic Alternates" => "salt", + "Stylistic Set 1" => "ss01", + "Stylistic Set 10" => "ss10", + "Stylistic Set 11" => "ss11", + "Stylistic Set 12" => "ss12", + "Stylistic Set 13" => "ss13", + "Stylistic Set 14" => "ss14", + "Stylistic Set 15" => "ss15", + "Stylistic Set 16" => "ss16", + "Stylistic Set 17" => "ss17", + "Stylistic Set 18" => "ss18", + "Stylistic Set 19" => "ss19", + "Stylistic Set 2" => "ss02", + "Stylistic Set 20" => "ss20", + "Stylistic Set 3" => "ss03", + "Stylistic Set 4" => "ss04", + "Stylistic Set 5" => "ss05", + "Stylistic Set 6" => "ss06", + "Stylistic Set 7" => "ss07", + "Stylistic Set 8" => "ss08", + "Stylistic Set 9" => "ss09", + "Subscript" => "subs", + "Superscript" => "sups", + "Swash" => "swsh", + "Tabular Figures" => "tnum", + "Terminal Forms #2" => "fin2", + "Terminal Forms #3" => "fin3", + "Terminal Forms" => "fina", + "Third Widths" => "twid", + "Titling" => "titl", + "Traditional Forms" => "trad", + "Traditional Name Forms" => "tnam", + "Trailing Jamo Forms" => "tjmo", + "Unicase" => "unic", + "Vattu Variants" => "vatu", + "Vertical Alternates and Rotation" => "vrt2", + "Vertical Kana Alternates" => "vkna", + "Vertical Kerning" => "vkrn", + "Vertical Writing" => "vert", + "Vowel Jamo Forms" => "vjmo", + } +); + +{ + foreach my $s (qw ( SCRIPT LANGUAGE FEATURE ) ) + { + map { $ttnames{$s}{$tttags{$s}{$_}} = $_ } keys %{$tttags{$s}}; + } +} + + +=head2 readtagsfile ( filename ) + +Read a file in the syntax of Tags.txt (included with Microsoft VOLT) to obtain additional/replacement tag definitions. + +Returns 0 if can't open the file; else 1. + +=cut + +sub readtagsfile +{ + my $fname = shift; + open (TAGS, $fname) or return 0; + my ($what, $name, $tag); + while () + { + ($what, $name, $tag) = (m/"([^"]*)", "([^"]*)", "([^"]*)"/); #" + $ttnames{$what}{$tag} = $name; + $tttags{$what}{$name} = $tag; + } + close TAGS; + return 1; +} + + + +1; diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/OldCmap.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/OldCmap.pm new file mode 100644 index 0000000..96545e2 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/OldCmap.pm @@ -0,0 +1,358 @@ +package Font::TTF::OldCmap; + +=head1 NAME + +Font::TTF::OldCmap - Character map table + +This module is deprecated + +=head1 DESCRIPTION + +Looks after the character map. The primary structure used for handling a cmap +is the L which handles the segmented arrays of format 4 tables, +and in a simpler form for format 0 tables. + +Due to the complexity of working with segmented arrays, most of the handling of +such arrays is via methods rather than via instance variables. + +One important feature of a format 4 table is that it always contains a segment +with a final address of 0xFFFF. If you are creating a table from scratch this is +important (although L can work quite happily without it). + + +=head1 INSTANCE VARIABLES + +The instance variables listed here are not preceeded by a space due to their +emulating structural information in the font. + +=over 4 + +=item Num + +Number of subtables in this table + +=item Tables + +An array of subtables ([0..Num-1]) + +=back + +Each subtables also has its own instance variables which are, again, not +preceeded by a space. + +=over 4 + +=item Platform + +The platform number for this subtable + +=item Encoding + +The encoding number for this subtable + +=item Format + +Gives the stored format of this subtable + +=item Ver + +Gives the version (or language) information for this subtable + +=item val + +This points to a L which contains the content of the particular +subtable. + +=back + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA); +require Font::TTF::Table; +require Font::TTF::Segarr; + +@ISA = qw(Font::TTF::Table); + + +=head2 $t->read + +Reads the cmap into memory. Format 4 subtables read the whole subtable and +fill in the segmented array accordingly. + +Format 2 subtables are not read at all. + +=cut + +sub read +{ + my ($self) = @_; + my ($dat, $i, $j, $k, $id, @ids, $s); + my ($start, $end, $range, $delta, $form, $len, $num, $ver); + my ($fh) = $self->{' INFILE'}; + + $self->SUPER::read or return $self; + $fh->read($dat, 4); + $self->{'Num'} = unpack("x2n", $dat); + $self->{'Tables'} = []; + for ($i = 0; $i < $self->{'Num'}; $i++) + { + $s = {}; + $fh->read($dat, 8); + ($s->{'Platform'}, $s->{'Encoding'}, $s->{'LOC'}) = (unpack("nnN", $dat)); + $s->{'LOC'} += $self->{' OFFSET'}; + push(@{$self->{'Tables'}}, $s); + } + for ($i = 0; $i < $self->{'Num'}; $i++) + { + $s = $self->{'Tables'}[$i]; + $fh->seek($s->{'LOC'}, 0); + $fh->read($dat, 6); + ($form, $len, $ver) = (unpack("n3", $dat)); + + $s->{'Format'} = $form; + $s->{'Ver'} = $ver; + if ($form == 0) + { + $s->{'val'} = Font::TTF::Segarr->new; + $fh->read($dat, 256); + $s->{'val'}->fastadd_segment(0, 2, unpack("C*", $dat)); + $s->{'Start'} = 0; + $s->{'Num'} = 256; + } elsif ($form == 6) + { + my ($start, $ecount); + + $fh->read($dat, 4); + ($start, $ecount) = unpack("n2", $dat); + $fh->read($dat, $ecount << 1); + $s->{'val'} = Font::TTF::Segarr->new; + $s->{'val'}->fastadd_segment($start, 2, unpack("n*", $dat)); + $s->{'Start'} = $start; + $s->{'Num'} = $ecount; + } elsif ($form == 2) + { +# no idea what to do here yet + } elsif ($form == 4) + { + $fh->read($dat, 8); + $num = unpack("n", $dat); + $num >>= 1; + $fh->read($dat, $len - 14); + $s->{'val'} = Font::TTF::Segarr->new; + for ($j = 0; $j < $num; $j++) + { + $end = unpack("n", substr($dat, $j << 1, 2)); + $start = unpack("n", substr($dat, ($j << 1) + ($num << 1) + 2, 2)); + $delta = unpack("n", substr($dat, ($j << 1) + ($num << 2) + 2, 2)); + $delta -= 65536 if $delta > 32767; + $range = unpack("n", substr($dat, ($j << 1) + $num * 6 + 2, 2)); + @ids = (); + for ($k = $start; $k <= $end; $k++) + { + if ($range == 0) + { $id = $k + $delta; } + else + { $id = unpack("n", substr($dat, ($j << 1) + $num * 6 + + 2 + ($k - $start) * 2 + $range, 2)) + $delta; } + $id -= 65536 if $id > 65536; + push (@ids, $id); + } + $s->{'val'}->fastadd_segment($start, 0, @ids); + } + $s->{'val'}->tidy; + $s->{'Num'} = 0x10000; # always ends here + $s->{'Start'} = $s->{'val'}[0]{'START'}; + } + } + $self; +} + + +=head2 $t->ms_lookup($uni) + +Given a Unicode value in the MS table (Platform 3, Encoding 1) locates that +table and looks up the appropriate glyph number from it. + +=cut + +sub ms_lookup +{ + my ($self, $uni) = @_; + + $self->find_ms || return undef unless (defined $self->{' mstable'}); + return $self->{' mstable'}{'val'}->at($uni); +} + + +=head2 $t->find_ms + +Finds the Microsoft Unicode table and sets the C instance variable +to it if found. Returns the table it finds. + +=cut +sub find_ms +{ + my ($self) = @_; + my ($i, $s, $alt); + + return $self->{' mstable'} if defined $self->{' mstable'}; + $self->read; + for ($i = 0; $i < $self->{'Num'}; $i++) + { + $s = $self->{'Tables'}[$i]; + if ($s->{'Platform'} == 3) + { + $self->{' mstable'} = $s; + last if ($s->{'Encoding'} == 1); + } elsif ($s->{'Platform'} == 0 || ($s->{'Platform'} == 2 && $s->{'Encoding'} == 1)) + { $self->{' mstable'} = $s; } + } + $self->{' mstable'}; +} + + +=head2 $t->out($fh) + +Writes out a cmap table to a filehandle. If it has not been read, then +just copies from input file to output + +=cut + +sub out +{ + my ($self, $fh) = @_; + my ($loc, $s, $i, $base_loc, $j); + + return $self->SUPER::out($fh) unless $self->{' read'}; + + $base_loc = $fh->tell(); + $fh->print(pack("n2", 0, $self->{'Num'})); + + for ($i = 0; $i < $self->{'Num'}; $i++) + { $fh->print(pack("nnN", $self->{'Tables'}[$i]{'Platform'}, $self->{'Tables'}[$i]{'Encoding'}, 0)); } + + for ($i = 0; $i < $self->{'Num'}; $i++) + { + $s = $self->{'Tables'}[$i]; + $s->{'val'}->tidy; + $s->{' outloc'} = $fh->tell(); + $fh->print(pack("n3", $s->{'Format'}, 0, $s->{'Ver'})); # come back for length + if ($s->{'Format'} == 0) + { + $fh->print(pack("C256", $s->{'val'}->at(0, 256))); + } elsif ($s->{'Format'} == 6) + { + $fh->print(pack("n2", $s->{'Start'}, $s->{'Num'})); + $fh->print(pack("n*", $s->{'val'}->at($s->{'Start'}, $s->{'Num'}))); + } elsif ($s->{'Format'} == 2) + { + } elsif ($s->{'Format'} == 4) + { + my ($num, $sRange, $eSel); + my (@deltas, $delta, @range, $flat, $k, $segs, $count); + + $num = $#{$s->{'val'}} + 1; + $segs = $s->{'val'}; + for ($sRange = 1, $eSel = 0; $sRange <= $num; $eSel++) + { $sRange <<= 1;} + $eSel--; + $fh->print(pack("n4", $num * 2, $sRange, $eSel, ($num * 2) - $sRange)); + $fh->print(pack("n*", map {$_->{'START'} + $_->{'LEN'} - 1} @$segs)); + $fh->print(pack("n", 0)); + $fh->print(pack("n*", map {$_->{'START'}} @$segs)); + + for ($j = 0; $j < $num; $j++) + { + $delta = $segs->[$j]{'VAL'}[0]; $flat = 1; + for ($k = 1; $k < $segs->[$j]{'LEN'}; $k++) + { + if ($segs->[$j]{'VAL'}[$k] == 0) + { $flat = 0; } + if ($delta + $k != $segs->[$j]{'VAL'}[$k]) + { + $delta = 0; + last; + } + } + push (@range, $flat); + push (@deltas, ($delta ? $delta - $segs->[$j]{'START'} : 0)); + } + $fh->print(pack("n*", @deltas)); + + $count = 0; + for ($j = 0; $j < $num; $j++) + { + $delta = $deltas[$j]; + if ($delta != 0 && $range[$j] == 1) + { $range[$j] = 0; } + else + { + $range[$j] = ($count + $num - $j) << 1; + $count += $segs->[$j]{'LEN'}; + } + } + + $fh->print(pack("n*", @range)); + + for ($j = 0; $j < $num; $j++) + { + next if ($range[$j] == 0); + for ($k = 0; $k < $segs->[$j]{'LEN'}; $k++) + { $fh->print(pack("n", $segs->[$j]{'VAL'}[$k])); } + } + } + + $loc = $fh->tell(); + $fh->seek($s->{' outloc'} + 2, 0); + $fh->print(pack("n", $loc - $s->{' outloc'})); + $fh->seek($base_loc + 8 + ($i << 3), 0); + $fh->print(pack("N", $s->{' outloc'} - $base_loc)); + $fh->seek($loc, 0); + } + $self; +} + + +=head2 @map = $t->reverse([$num]) + +Returns a reverse map of the table of given number or the Microsoft +cmap. I.e. given a glyph gives the Unicode value for it. + +=cut + +sub reverse +{ + my ($self, $tnum) = @_; + my ($table) = defined $tnum ? $self->{'Tables'}[$tnum] : $self->find_ms; + my (@res, $i, $s, $first); + + foreach $s (@{$table->{'val'}}) + { + $first = $s->{'START'}; + map {$res[$_] = $first unless $res[$_]; $first++;} @{$s->{'VAL'}}; + } + @res; +} + +1; + +=head1 BUGS + +=over 4 + +=item * + +No support for format 2 tables (MBCS) + +=back + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/OldMort.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/OldMort.pm new file mode 100644 index 0000000..4e30f42 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/OldMort.pm @@ -0,0 +1,706 @@ +package Font::TTF::OldMort; + +=head1 NAME + +Font::TTF::OldMort - Glyph Metamorphosis table in a font + +=head1 DESCRIPTION + +=head1 INSTANCE VARIABLES + +=item version + +table version number (Fixed: currently 1.0) + +=item chains + +list of metamorphosis chains, each of which has its own fields: + +=over + +=item defaultFlags + +chain's default subfeature flags (UInt32) + +=item featureEntries + +list of feature entries, each of which has fields: + +=over + +=item type + +=item setting + +=item enable + +=item disable + +=back + +=item subtables + +list of metamorphosis subtables, each of which has fields: + +=over + +=item type + +subtable type (0: rearrangement; 1: contextual substitution; 2: ligature; +4: non-contextual substitution; 5: insertion) + +=item direction + +processing direction ('LR' or 'RL') + +=item orientation + +applies to text in which orientation ('VH', 'V', or 'H') + +=item subFeatureFlags + +the subfeature flags controlling whether the table is used (UInt32) + +=back + +Further fields depend on the type of subtable: + +=over + +Rearrangement table: + +=over + +=item classes + +array of lists of glyphs + +=item states + +array of arrays of hashes{'nextState', 'flags'} + +=back + +Contextual substitution table: + +=over + +=item classes + +array of lists of glyphs + +=item states + +array of array of hashes{'nextState', 'flags', 'actions'}, where C +is an array of two elements which are offsets to be added to [marked, current] +glyph to get index into C (or C if no mapping to be applied) + +=item mappings + +list of glyph codes mapped to through the state table mappings + +=back + +Ligature table: + +Non-contextual substitution table: + +Insertion table: + +=back + +=back + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA); +use Font::TTF::Utils; +use Font::TTF::AATutils; +use IO::File; + +@ISA = qw(Font::TTF::Table); + +=head2 $t->read + +Reads the table into memory + +=cut + +sub read +{ + my ($self) = @_; + my ($dat, $fh, $numChains); + + $self->SUPER::read or return $self; + + $fh = $self->{' INFILE'}; + + $fh->read($dat, 8); + ($self->{'version'}, $numChains) = TTF_Unpack("fL", $dat); + + my $chains = []; + foreach (1 .. $numChains) { + my $chainStart = $fh->tell(); + $fh->read($dat, 12); + my ($defaultFlags, $chainLength, $nFeatureEntries, $nSubtables) = TTF_Unpack("LLSS", $dat); + my $featureEntries = []; + foreach (1 .. $nFeatureEntries) { + $fh->read($dat, 12); + my ($featureType, $featureSetting, $enableFlags, $disableFlags) = TTF_Unpack("SSLL", $dat); + push @$featureEntries, { + 'type' => $featureType, + 'setting' => $featureSetting, + 'enable' => $enableFlags, + 'disable' => $disableFlags + }; + } + my $subtables = []; + foreach (1 .. $nSubtables) { + my $subtableStart = $fh->tell(); + $fh->read($dat, 8); + my ($length, $coverage, $subFeatureFlags) = TTF_Unpack("SSL", $dat); + my $type = $coverage & 0x0007; + + my $subtable = { + 'type' => $type, + 'direction' => (($coverage & 0x4000) ? 'RL' : 'LR'), + 'orientation' => (($coverage & 0x2000) ? 'VH' : ($coverage & 0x8000) ? 'V' : 'H'), + 'subFeatureFlags' => $subFeatureFlags + }; + + if ($type == 0) { # rearrangement + my ($classes, $states) = AAT_read_state_table($fh, 0); + $subtable->{'classes'} = $classes; + $subtable->{'states'} = $states; + } + + elsif ($type == 1) { # contextual + my $stateTableStart = $fh->tell(); + my ($classes, $states, $entries) = AAT_read_state_table($fh, 2); + + $fh->seek($stateTableStart, IO::File::SEEK_SET); + $fh->read($dat, 10); + my ($stateSize, $classTable, $stateArray, $entryTable, $mappingTables) = unpack("nnnnn", $dat); + my $limits = [$classTable, $stateArray, $entryTable, $mappingTables, $length - 8]; + + foreach (@$entries) { + my $actions = $_->{'actions'}; + foreach (@$actions) { + $_ = $_ ? $_ - ($mappingTables / 2) : undef; + } + } + + $subtable->{'classes'} = $classes; + $subtable->{'states'} = $states; + $subtable->{'mappings'} = [unpack("n*", AAT_read_subtable($fh, $stateTableStart, $mappingTables, $limits))]; + } + + elsif ($type == 2) { # ligature + my $stateTableStart = $fh->tell(); + my ($classes, $states, $entries) = AAT_read_state_table($fh, 0); + + $fh->seek($stateTableStart, IO::File::SEEK_SET); + $fh->read($dat, 14); + my ($stateSize, $classTable, $stateArray, $entryTable, + $ligActionTable, $componentTable, $ligatureTable) = unpack("nnnnnnn", $dat); + my $limits = [$classTable, $stateArray, $entryTable, $ligActionTable, $componentTable, $ligatureTable, $length - 8]; + + my %actions; + my $actionLists; + foreach (@$entries) { + my $offset = $_->{'flags'} & 0x3fff; + $_->{'flags'} &= ~0x3fff; + if ($offset != 0) { + if (not defined $actions{$offset}) { + $fh->seek($stateTableStart + $offset, IO::File::SEEK_SET); + my $actionList; + while (1) { + $fh->read($dat, 4); + my $action = unpack("N", $dat); + my ($last, $store, $component) = (($action & 0x80000000) != 0, ($action & 0xC0000000) != 0, ($action & 0x3fffffff)); + $component -= 0x40000000 if $component > 0x1fffffff; + $component -= $componentTable / 2; + push @$actionList, { 'store' => $store, 'component' => $component }; + last if $last; + } + push @$actionLists, $actionList; + $actions{$offset} = $#$actionLists; + } + $_->{'actions'} = $actions{$offset}; + } + } + + $subtable->{'componentTable'} = $componentTable; + my $components = [unpack("n*", AAT_read_subtable($fh, $stateTableStart, $componentTable, $limits))]; + foreach (@$components) { + $_ = ($_ - $ligatureTable) . " +" if $_ >= $ligatureTable; + } + $subtable->{'components'} = $components; + + $subtable->{'ligatureTable'} = $ligatureTable; + $subtable->{'ligatures'} = [unpack("n*", AAT_read_subtable($fh, $stateTableStart, $ligatureTable, $limits))]; + + $subtable->{'classes'} = $classes; + $subtable->{'states'} = $states; + $subtable->{'actionLists'} = $actionLists; + } + + elsif ($type == 4) { # non-contextual + my ($format, $lookup) = AAT_read_lookup($fh, 2, $length - 8, undef); + $subtable->{'format'} = $format; + $subtable->{'lookup'} = $lookup; + } + + elsif ($type == 5) { # insertion + my $stateTableStart = $fh->tell(); + my ($classes, $states, $entries) = AAT_read_state_table($fh, 2); + + my %insertListHash; + my $insertLists; + foreach (@$entries) { + my $flags = $_->{'flags'}; + my @insertCount = (($flags & 0x03e0) >> 5, ($flags & 0x001f)); + my $actions = $_->{'actions'}; + foreach (0 .. 1) { + if ($insertCount[$_] > 0) { + $fh->seek($stateTableStart + $actions->[$_], IO::File::SEEK_SET); + $fh->read($dat, $insertCount[$_] * 2); + if (not defined $insertListHash{$dat}) { + push @$insertLists, [unpack("n*", $dat)]; + $insertListHash{$dat} = $#$insertLists; + } + $actions->[$_] = $insertListHash{$dat}; + } + else { + $actions->[$_] = undef; + } + } + } + + $subtable->{'classes'} = $classes; + $subtable->{'states'} = $states; + $subtable->{'insertLists'} = $insertLists; + } + + else { + die "unknown subtable type"; + } + + push @$subtables, $subtable; + $fh->seek($subtableStart + $length, IO::File::SEEK_SET); + } + + push @$chains, { + 'defaultFlags' => $defaultFlags, + 'featureEntries' => $featureEntries, + 'subtables' => $subtables + }; + $fh->seek($chainStart + $chainLength, IO::File::SEEK_SET); + } + + $self->{'chains'} = $chains; + + $self; +} + +=head2 $t->out($fh) + +Writes the table to a file either from memory or by copying + +=cut + +sub out +{ + my ($self, $fh) = @_; + + return $self->SUPER::out($fh) unless $self->{' read'}; + + my $chains = $self->{'chains'}; + $fh->print(TTF_Pack("fL", $self->{'version'}, scalar @$chains)); + + foreach (@$chains) { + my $chainStart = $fh->tell(); + my ($featureEntries, $subtables) = ($_->{'featureEntries'}, $_->{'subtables'}); + $fh->print(TTF_Pack("LLSS", $_->{'defaultFlags'}, 0, scalar @$featureEntries, scalar @$subtables)); # placeholder for length + + foreach (@$featureEntries) { + $fh->print(TTF_Pack("SSLL", $_->{'type'}, $_->{'setting'}, $_->{'enable'}, $_->{'disable'})); + } + + foreach (@$subtables) { + my $subtableStart = $fh->tell(); + my $type = $_->{'type'}; + my $coverage = $type; + $coverage += 0x4000 if $_->{'direction'} eq 'RL'; + $coverage += 0x2000 if $_->{'orientation'} eq 'VH'; + $coverage += 0x8000 if $_->{'orientation'} eq 'V'; + + $fh->print(TTF_Pack("SSL", 0, $coverage, $_->{'subFeatureFlags'})); # placeholder for length + + if ($type == 0) { # rearrangement + AAT_write_state_table($fh, $_->{'classes'}, $_->{'states'}, 0); + } + + elsif ($type == 1) { # contextual + my $stHeader = $fh->tell(); + $fh->print(pack("nnnnn", (0) x 5)); # placeholders for stateSize, classTable, stateArray, entryTable, mappingTables + + my $classTable = $fh->tell() - $stHeader; + my $classes = $_->{'classes'}; + AAT_write_classes($fh, $classes); + + my $stateArray = $fh->tell() - $stHeader; + my $states = $_->{'states'}; + my ($stateSize, $entries) = AAT_write_states($fh, $classes, $stateArray, $states, + sub { + my $actions = $_->{'actions'}; + ( $_->{'flags'}, @$actions ) + } + ); + + my $entryTable = $fh->tell() - $stHeader; + my $offset = ($entryTable + 8 * @$entries) / 2; + foreach (@$entries) { + my ($nextState, $flags, @parts) = split /,/; + $fh->print(pack("nnnn", $nextState, $flags, map { $_ eq "" ? 0 : $_ + $offset } @parts)); + } + + my $mappingTables = $fh->tell() - $stHeader; + my $mappings = $_->{'mappings'}; + $fh->print(pack("n*", @$mappings)); + + my $loc = $fh->tell(); + $fh->seek($stHeader, IO::File::SEEK_SET); + $fh->print(pack("nnnnn", $stateSize, $classTable, $stateArray, $entryTable, $mappingTables)); + $fh->seek($loc, IO::File::SEEK_SET); + } + + elsif ($type == 2) { # ligature + my $stHeader = $fh->tell(); + $fh->print(pack("nnnnnnn", (0) x 7)); # placeholders for stateSize, classTable, stateArray, entryTable, actionLists, components, ligatures + + my $classTable = $fh->tell() - $stHeader; + my $classes = $_->{'classes'}; + AAT_write_classes($fh, $classes); + + my $stateArray = $fh->tell() - $stHeader; + my $states = $_->{'states'}; + + my ($stateSize, $entries) = AAT_write_states($fh, $classes, $stateArray, $states, + sub { + ( $_->{'flags'} & 0xc000, $_->{'actions'} ) + } + ); + + my $actionLists = $_->{'actionLists'}; + my %actionListOffset; + my $actionListDataLength = 0; + my @actionListEntries; + foreach (0 .. $#$entries) { + my ($nextState, $flags, $offset) = split(/,/, $entries->[$_]); + if ($offset eq "") { + $offset = undef; + } + else { + if (defined $actionListOffset{$offset}) { + $offset = $actionListOffset{$offset}; + } + else { + $actionListOffset{$offset} = $actionListDataLength; + my $list = $actionLists->[$offset]; + $actionListDataLength += 4 * @$list; + push @actionListEntries, $list; + $offset = $actionListOffset{$offset}; + } + } + $entries->[$_] = [ $nextState, $flags, $offset ]; + } + my $entryTable = $fh->tell() - $stHeader; + my $ligActionLists = ($entryTable + @$entries * 4 + 3) & ~3; + foreach (@$entries) { + $_->[2] += $ligActionLists if defined $_->[2]; + $fh->print(pack("nn", $_->[0], $_->[1] + $_->[2])); + } + $fh->print(pack("C*", (0) x ($ligActionLists - $entryTable - @$entries * 4))); + + die "internal error" if $fh->tell() != $ligActionLists + $stHeader; + + my $componentTable = $fh->tell() - $stHeader + $actionListDataLength; + my $actionList; + foreach $actionList (@actionListEntries) { + foreach (0 .. $#$actionList) { + my $action = $actionList->[$_]; + my $val = $action->{'component'} + $componentTable / 2; + $val += 0x40000000 if $val < 0; + $val &= 0x3fffffff; + $val |= 0x40000000 if $action->{'store'}; + $val |= 0x80000000 if $_ == $#$actionList; + $fh->print(pack("N", $val)); + } + } + + die "internal error" if $fh->tell() != $componentTable + $stHeader; + + my $components = $_->{'components'}; + my $ligatureTable = $componentTable + @$components * 2; + $fh->print(pack("n*", map { (index($_, '+') >= 0 ? $ligatureTable : 0) + $_ } @$components)); + + my $ligatures = $_->{'ligatures'}; + $fh->print(pack("n*", @$ligatures)); + + my $loc = $fh->tell(); + $fh->seek($stHeader, IO::File::SEEK_SET); + $fh->print(pack("nnnnnnn", $stateSize, $classTable, $stateArray, $entryTable, $ligActionLists, $componentTable, $ligatureTable)); + $fh->seek($loc, IO::File::SEEK_SET); + } + + elsif ($type == 4) { # non-contextual + AAT_write_lookup($fh, $_->{'format'}, $_->{'lookup'}, 2, undef); + } + + elsif ($type == 5) { # insertion + } + + else { + die "unknown subtable type"; + } + + my $length = $fh->tell() - $subtableStart; + my $padBytes = (4 - ($length & 3)) & 3; + $fh->print(pack("C*", (0) x $padBytes)); + $length += $padBytes; + $fh->seek($subtableStart, IO::File::SEEK_SET); + $fh->print(pack("n", $length)); + $fh->seek($subtableStart + $length, IO::File::SEEK_SET); + } + + my $chainLength = $fh->tell() - $chainStart; + $fh->seek($chainStart + 4, IO::File::SEEK_SET); + $fh->print(pack("N", $chainLength)); + $fh->seek($chainStart + $chainLength, IO::File::SEEK_SET); + } +} + +=head2 $t->print($fh) + +Prints a human-readable representation of the table + +=cut + +sub print +{ + my ($self, $fh) = @_; + + $self->read; + my $feat = $self->{' PARENT'}->{'feat'}; + $feat->read; + my $post = $self->{' PARENT'}->{'post'}; + $post->read; + + $fh = 'STDOUT' unless defined $fh; + + $fh->printf("version %f\n", $self->{'version'}); + + my $chains = $self->{'chains'}; + foreach (@$chains) { + my $defaultFlags = $_->{'defaultFlags'}; + $fh->printf("chain: defaultFlags = %08x\n", $defaultFlags); + + my $featureEntries = $_->{'featureEntries'}; + foreach (@$featureEntries) { + $fh->printf("\tfeature %d, setting %d : enableFlags = %08x, disableFlags = %08x # '%s: %s'\n", + $_->{'type'}, $_->{'setting'}, $_->{'enable'}, $_->{'disable'}, + $feat->settingName($_->{'type'}, $_->{'setting'})); + } + + my $subtables = $_->{'subtables'}; + foreach (@$subtables) { + my $type = $_->{'type'}; + my $subFeatureFlags = $_->{'subFeatureFlags'}; + $fh->printf("\n\t%s table, %s, %s, subFeatureFlags = %08x # %s (%s)\n", + subtable_type_($type), $_->{'direction'}, $_->{'orientation'}, $subFeatureFlags, + "Default " . ((($subFeatureFlags & $defaultFlags) != 0) ? "On" : "Off"), + join(", ", + map { + join(": ", $feat->settingName($_->{'type'}, $_->{'setting'}) ) + } grep { ($_->{'enable'} & $subFeatureFlags) != 0 } @$featureEntries + ) ); + + if ($type == 0) { # rearrangement + print_classes_($fh, $_, $post); + + $fh->print("\n"); + my $states = $_->{'states'}; + my @verbs = ( "0", "Ax->xA", "xD->Dx", "AxD->DxA", + "ABx->xAB", "ABx->xBA", "xCD->CDx", "xCD->DCx", + "AxCD->CDxA", "AxCD->DCxA", "ABxD->DxAB", "ABxD->DxBA", + "ABxCD->CDxAB", "ABxCD->CDxBA", "ABxCD->DCxAB", "ABxCD->DCxBA"); + foreach (0 .. $#$states) { + $fh->printf("\t\tState %d:", $_); + my $state = $states->[$_]; + foreach (@$state) { + my $flags; + $flags .= "!" if ($_->{'flags'} & 0x4000); + $flags .= "<" if ($_->{'flags'} & 0x8000); + $flags .= ">" if ($_->{'flags'} & 0x2000); + $fh->printf("\t(%s%d,%s)", $flags, $_->{'nextState'}, $verbs[($_->{'flags'} & 0x000f)]); + } + $fh->print("\n"); + } + } + + elsif ($type == 1) { # contextual + print_classes_($fh, $_, $post); + + $fh->print("\n"); + my $states = $_->{'states'}; + foreach (0 .. $#$states) { + $fh->printf("\t\tState %d:", $_); + my $state = $states->[$_]; + foreach (@$state) { + my $flags; + $flags .= "!" if ($_->{'flags'} & 0x4000); + $flags .= "*" if ($_->{'flags'} & 0x8000); + my $actions = $_->{'actions'}; + $fh->printf("\t(%s%d,%s,%s)", $flags, $_->{'nextState'}, map { defined $_ ? $_ : "=" } @$actions); + } + $fh->print("\n"); + } + + $fh->print("\n"); + my $mappings = $_->{'mappings'}; + foreach (0 .. $#$mappings) { + $fh->printf("\t\tMapping %d: %d [%s]\n", $_, $mappings->[$_], $post->{'VAL'}[$mappings->[$_]]); + } + } + + elsif ($type == 2) { # ligature + print_classes_($fh, $_, $post); + + $fh->print("\n"); + my $states = $_->{'states'}; + foreach (0 .. $#$states) { + $fh->printf("\t\tState %d:", $_); + my $state = $states->[$_]; + foreach (@$state) { + my $flags; + $flags .= "!" if ($_->{'flags'} & 0x4000); + $flags .= "*" if ($_->{'flags'} & 0x8000); + $fh->printf("\t(%s%d,%s)", $flags, $_->{'nextState'}, defined $_->{'actions'} ? $_->{'actions'} : "="); + } + $fh->print("\n"); + } + + $fh->print("\n"); + my $actionLists = $_->{'actionLists'}; + foreach (0 .. $#$actionLists) { + $fh->printf("\t\tList %d:\t", $_); + my $actionList = $actionLists->[$_]; + $fh->printf("%s\n", join(", ", map { ($_->{'component'} . ($_->{'store'} ? "*" : "") ) } @$actionList)); + } + + my $ligatureTable = $_->{'ligatureTable'}; + + $fh->print("\n"); + my $components = $_->{'components'}; + foreach (0 .. $#$components) { + $fh->printf("\t\tComponent %d: %s\n", $_, $components->[$_]); + } + + $fh->print("\n"); + my $ligatures = $_->{'ligatures'}; + foreach (0 .. $#$ligatures) { + $fh->printf("\t\tLigature %d: %d [%s]\n", $_, $ligatures->[$_], $post->{'VAL'}[$ligatures->[$_]]); + } + } + + elsif ($type == 4) { # non-contextual + my $lookup = $_->{'lookup'}; + $fh->printf("\t\tLookup format %d\n", $_->{'format'}); + if (defined $lookup) { + foreach (sort { $a <=> $b } keys %$lookup) { + $fh->printf("\t\t\t%d [%s] -> %d [%s])\n", $_, $post->{'VAL'}[$_], $lookup->{$_}, $post->{'VAL'}[$lookup->{$_}]); + } + } + } + + elsif ($type == 5) { # insertion + print_classes_($fh, $_, $post); + + $fh->print("\n"); + my $states = $_->{'states'}; + foreach (0 .. $#$states) { + $fh->printf("\t\tState %d:", $_); + my $state = $states->[$_]; + foreach (@$state) { + my $flags; + $flags .= "!" if ($_->{'flags'} & 0x4000); + $flags .= "*" if ($_->{'flags'} & 0x8000); + my $actions = $_->{'actions'}; + $fh->printf("\t(%s%d,%s,%s)", $flags, $_->{'nextState'}, map { defined $_ ? $_ : "=" } @$actions); + } + $fh->print("\n"); + } + + $fh->print("\n"); + my $insertLists = $_->{'insertLists'}; + foreach (0 .. $#$insertLists) { + my $insertList = $insertLists->[$_]; + $fh->printf("\t\tList %d: %s\n", $_, join(", ", map { $_ . " [" . $post->{'VAL'}[$_] . "]" } @$insertList)); + } + } + + else { + # unknown + } + } + } +} + +sub print_classes_ +{ + my ($fh, $subtable, $post) = @_; + + my $classes = $subtable->{'classes'}; + foreach (0 .. $#$classes) { + my $class = $classes->[$_]; + if (defined $class) { + $fh->printf("\t\tClass %d:\t%s\n", $_, join(", ", map { $_ . " [" . $post->{'VAL'}[$_] . "]" } @$class)); + } + } +} + +sub subtable_type_ +{ + my ($val) = @_; + my ($res); + + my @types = ( + 'Rearrangement', + 'Contextual', + 'Ligature', + undef, + 'Non-contextual', + 'Insertion', + ); + $res = $types[$val] or ('Undefined (' . $val . ')'); + + $res; +} + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Jonathan Kew L. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/PCLT.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/PCLT.pm new file mode 100644 index 0000000..2856c16 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/PCLT.pm @@ -0,0 +1,121 @@ +package Font::TTF::PCLT; + +=head1 NAME + +Font::TTF::PCLT - PCLT TrueType font table + +=head1 DESCRIPTION + +The PCLT table holds various pieces HP-PCL specific information. Information +here is generally not used by other software, except for the xHeight and +CapHeight which are stored here (if the table exists in a font). + +=head1 INSTANCE VARIABLES + +Only from table and the standard: + + version + FontNumber + Pitch + xHeight + Style + TypeFamily + CapHeight + SymbolSet + Typeface + CharacterComplement + FileName + StrokeWeight + WidthType + SerifStyle + +Notice that C, C and C return arrays +of unsigned characters of the appropriate length + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA %fields @field_info); + +require Font::TTF::Table; +use Font::TTF::Utils; + +@ISA = qw(Font::TTF::Table); +@field_info = ( + 'version' => 'v', + 'FontNumber' => 'L', + 'Pitch' => 'S', + 'xHeight' => 'S', + 'Style' => 'S', + 'TypeFamily' => 'S', + 'CapHeight' => 'S', + 'SymbolSet' => 'S', + 'Typeface' => 'C16', + 'CharacterComplement' => 'C8', + 'FileName' => 'C6', + 'StrokeWeight' => 'C', + 'WidthType' => 'C', + 'SerifStyle' => 'c'); + +sub init +{ + my ($k, $v, $c, $i); + for ($i = 0; $i < $#field_info; $i += 2) + { + ($k, $v, $c) = TTF_Init_Fields($field_info[$i], $c, $field_info[$i + 1]); + next unless defined $k && $k ne ""; + $fields{$k} = $v; + } +} + + +=head2 $t->read + +Reads the table into memory thanks to some utility functions + +=cut + +sub read +{ + my ($self) = @_; + my ($dat); + + $self->SUPER::read || return $self; + + init unless defined $fields{'xHeight'}; + $self->{' INFILE'}->read($dat, 54); + + TTF_Read_Fields($self, $dat, \%fields); + $self; +} + + +=head2 $t->out($fh) + +Writes the table to a file either from memory or by copying. + +=cut + +sub out +{ + my ($self, $fh) = @_; + + return $self->SUPER::out($fh) unless $self->{' read'}; + $fh->print(TTF_Out_Fields($self, \%fields, 54)); +} + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/PSNames.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/PSNames.pm new file mode 100644 index 0000000..cb4c73b --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/PSNames.pm @@ -0,0 +1,4447 @@ +package Font::TTF::PSNames; + +=head1 NAME + +Font::TTF::PSNames - Utilities for Postscript glyph name processing + +=head1 SYNOPSIS + + use Font::TTF::PSNames qw(parse lookup); + $name = lookup($uni); + $uni = parse($name); + +=head1 METHODS + +=cut + +use strict; +use vars qw(%names %agl @EXPORT_OK @ISA); +require Exporter; +@ISA = qw( Exporter ); +@EXPORT_OK = qw( parse lookup); + +# Adobe Glyph List for New Fonts +# from http://partners.adobe.com/asn/tech/type/aglfn13.txt + +%names = ( + '0020' => 'space', + '0021' => 'exclam', + '0022' => 'quotedbl', + '0023' => 'numbersign', + '0024' => 'dollar', + '0025' => 'percent', + '0026' => 'ampersand', + '0027' => 'quotesingle', + '0028' => 'parenleft', + '0029' => 'parenright', + '002A' => 'asterisk', + '002B' => 'plus', + '002C' => 'comma', + '002D' => 'hyphen', + '002E' => 'period', + '002F' => 'slash', + '0030' => 'zero', + '0031' => 'one', + '0032' => 'two', + '0033' => 'three', + '0034' => 'four', + '0035' => 'five', + '0036' => 'six', + '0037' => 'seven', + '0038' => 'eight', + '0039' => 'nine', + '003A' => 'colon', + '003B' => 'semicolon', + '003C' => 'less', + '003D' => 'equal', + '003E' => 'greater', + '003F' => 'question', + '0040' => 'at', + '0041' => 'A', + '0042' => 'B', + '0043' => 'C', + '0044' => 'D', + '0045' => 'E', + '0046' => 'F', + '0047' => 'G', + '0048' => 'H', + '0049' => 'I', + '004A' => 'J', + '004B' => 'K', + '004C' => 'L', + '004D' => 'M', + '004E' => 'N', + '004F' => 'O', + '0050' => 'P', + '0051' => 'Q', + '0052' => 'R', + '0053' => 'S', + '0054' => 'T', + '0055' => 'U', + '0056' => 'V', + '0057' => 'W', + '0058' => 'X', + '0059' => 'Y', + '005A' => 'Z', + '005B' => 'bracketleft', + '005C' => 'backslash', + '005D' => 'bracketright', + '005E' => 'asciicircum', + '005F' => 'underscore', + '0060' => 'grave', + '0061' => 'a', + '0062' => 'b', + '0063' => 'c', + '0064' => 'd', + '0065' => 'e', + '0066' => 'f', + '0067' => 'g', + '0068' => 'h', + '0069' => 'i', + '006A' => 'j', + '006B' => 'k', + '006C' => 'l', + '006D' => 'm', + '006E' => 'n', + '006F' => 'o', + '0070' => 'p', + '0071' => 'q', + '0072' => 'r', + '0073' => 's', + '0074' => 't', + '0075' => 'u', + '0076' => 'v', + '0077' => 'w', + '0078' => 'x', + '0079' => 'y', + '007A' => 'z', + '007B' => 'braceleft', + '007C' => 'bar', + '007D' => 'braceright', + '007E' => 'asciitilde', +# '00A0' => 'space', + '00A1' => 'exclamdown', + '00A2' => 'cent', + '00A3' => 'sterling', + '00A4' => 'currency', + '00A5' => 'yen', + '00A6' => 'brokenbar', + '00A7' => 'section', + '00A8' => 'dieresis', + '00A9' => 'copyright', + '00AA' => 'ordfeminine', + '00AB' => 'guillemotleft', + '00AC' => 'logicalnot', +# '00AD' => 'hyphen', + '00AE' => 'registered', + '00AF' => 'macron', + '00B0' => 'degree', + '00B1' => 'plusminus', + '00B2' => 'twosuperior', + '00B3' => 'threesuperior', + '00B4' => 'acute', + '00B5' => 'mu', + '00B6' => 'paragraph', + '00B7' => 'periodcentered', + '00B8' => 'cedilla', + '00B9' => 'onesuperior', + '00BA' => 'ordmasculine', + '00BB' => 'guillemotright', + '00BC' => 'onequarter', + '00BD' => 'onehalf', + '00BE' => 'threequarters', + '00BF' => 'questiondown', + '00C0' => 'Agrave', + '00C1' => 'Aacute', + '00C2' => 'Acircumflex', + '00C3' => 'Atilde', + '00C4' => 'Adieresis', + '00C5' => 'Aring', + '00C6' => 'AE', + '00C7' => 'Ccedilla', + '00C8' => 'Egrave', + '00C9' => 'Eacute', + '00CA' => 'Ecircumflex', + '00CB' => 'Edieresis', + '00CC' => 'Igrave', + '00CD' => 'Iacute', + '00CE' => 'Icircumflex', + '00CF' => 'Idieresis', + '00D0' => 'Eth', + '00D1' => 'Ntilde', + '00D2' => 'Ograve', + '00D3' => 'Oacute', + '00D4' => 'Ocircumflex', + '00D5' => 'Otilde', + '00D6' => 'Odieresis', + '00D7' => 'multiply', + '00D8' => 'Oslash', + '00D9' => 'Ugrave', + '00DA' => 'Uacute', + '00DB' => 'Ucircumflex', + '00DC' => 'Udieresis', + '00DD' => 'Yacute', + '00DE' => 'Thorn', + '00DF' => 'germandbls', + '00E0' => 'agrave', + '00E1' => 'aacute', + '00E2' => 'acircumflex', + '00E3' => 'atilde', + '00E4' => 'adieresis', + '00E5' => 'aring', + '00E6' => 'ae', + '00E7' => 'ccedilla', + '00E8' => 'egrave', + '00E9' => 'eacute', + '00EA' => 'ecircumflex', + '00EB' => 'edieresis', + '00EC' => 'igrave', + '00ED' => 'iacute', + '00EE' => 'icircumflex', + '00EF' => 'idieresis', + '00F0' => 'eth', + '00F1' => 'ntilde', + '00F2' => 'ograve', + '00F3' => 'oacute', + '00F4' => 'ocircumflex', + '00F5' => 'otilde', + '00F6' => 'odieresis', + '00F7' => 'divide', + '00F8' => 'oslash', + '00F9' => 'ugrave', + '00FA' => 'uacute', + '00FB' => 'ucircumflex', + '00FC' => 'udieresis', + '00FD' => 'yacute', + '00FE' => 'thorn', + '00FF' => 'ydieresis', + '0100' => 'Amacron', + '0101' => 'amacron', + '0102' => 'Abreve', + '0103' => 'abreve', + '0104' => 'Aogonek', + '0105' => 'aogonek', + '0106' => 'Cacute', + '0107' => 'cacute', + '0108' => 'Ccircumflex', + '0109' => 'ccircumflex', + '010A' => 'Cdotaccent', + '010B' => 'cdotaccent', + '010C' => 'Ccaron', + '010D' => 'ccaron', + '010E' => 'Dcaron', + '010F' => 'dcaron', + '0110' => 'Dcroat', + '0111' => 'dcroat', + '0112' => 'Emacron', + '0113' => 'emacron', + '0114' => 'Ebreve', + '0115' => 'ebreve', + '0116' => 'Edotaccent', + '0117' => 'edotaccent', + '0118' => 'Eogonek', + '0119' => 'eogonek', + '011A' => 'Ecaron', + '011B' => 'ecaron', + '011C' => 'Gcircumflex', + '011D' => 'gcircumflex', + '011E' => 'Gbreve', + '011F' => 'gbreve', + '0120' => 'Gdotaccent', + '0121' => 'gdotaccent', + '0122' => 'Gcommaaccent', + '0123' => 'gcommaaccent', + '0124' => 'Hcircumflex', + '0125' => 'hcircumflex', + '0126' => 'Hbar', + '0127' => 'hbar', + '0128' => 'Itilde', + '0129' => 'itilde', + '012A' => 'Imacron', + '012B' => 'imacron', + '012C' => 'Ibreve', + '012D' => 'ibreve', + '012E' => 'Iogonek', + '012F' => 'iogonek', + '0130' => 'Idotaccent', + '0131' => 'dotlessi', + '0132' => 'IJ', + '0133' => 'ij', + '0134' => 'Jcircumflex', + '0135' => 'jcircumflex', + '0136' => 'Kcommaaccent', + '0137' => 'kcommaaccent', + '0138' => 'kgreenlandic', + '0139' => 'Lacute', + '013A' => 'lacute', + '013B' => 'Lcommaaccent', + '013C' => 'lcommaaccent', + '013D' => 'Lcaron', + '013E' => 'lcaron', + '013F' => 'Ldot', + '0140' => 'ldot', + '0141' => 'Lslash', + '0142' => 'lslash', + '0143' => 'Nacute', + '0144' => 'nacute', + '0145' => 'Ncommaaccent', + '0146' => 'ncommaaccent', + '0147' => 'Ncaron', + '0148' => 'ncaron', + '0149' => 'napostrophe', + '014A' => 'Eng', + '014B' => 'eng', + '014C' => 'Omacron', + '014D' => 'omacron', + '014E' => 'Obreve', + '014F' => 'obreve', + '0150' => 'Ohungarumlaut', + '0151' => 'ohungarumlaut', + '0152' => 'OE', + '0153' => 'oe', + '0154' => 'Racute', + '0155' => 'racute', + '0156' => 'Rcommaaccent', + '0157' => 'rcommaaccent', + '0158' => 'Rcaron', + '0159' => 'rcaron', + '015A' => 'Sacute', + '015B' => 'sacute', + '015C' => 'Scircumflex', + '015D' => 'scircumflex', + '015E' => 'Scedilla', + '015F' => 'scedilla', + '0160' => 'Scaron', + '0161' => 'scaron', + '0162' => 'Tcommaaccent', + '0163' => 'tcommaaccent', + '0164' => 'Tcaron', + '0165' => 'tcaron', + '0166' => 'Tbar', + '0167' => 'tbar', + '0168' => 'Utilde', + '0169' => 'utilde', + '016A' => 'Umacron', + '016B' => 'umacron', + '016C' => 'Ubreve', + '016D' => 'ubreve', + '016E' => 'Uring', + '016F' => 'uring', + '0170' => 'Uhungarumlaut', + '0171' => 'uhungarumlaut', + '0172' => 'Uogonek', + '0173' => 'uogonek', + '0174' => 'Wcircumflex', + '0175' => 'wcircumflex', + '0176' => 'Ycircumflex', + '0177' => 'ycircumflex', + '0178' => 'Ydieresis', + '0179' => 'Zacute', + '017A' => 'zacute', + '017B' => 'Zdotaccent', + '017C' => 'zdotaccent', + '017D' => 'Zcaron', + '017E' => 'zcaron', + '017F' => 'longs', + '0192' => 'florin', + '01A0' => 'Ohorn', + '01A1' => 'ohorn', + '01AF' => 'Uhorn', + '01B0' => 'uhorn', + '01E6' => 'Gcaron', + '01E7' => 'gcaron', + '01FA' => 'Aringacute', + '01FB' => 'aringacute', + '01FC' => 'AEacute', + '01FD' => 'aeacute', + '01FE' => 'Oslashacute', + '01FF' => 'oslashacute', + '0218' => 'Scommaaccent', + '0219' => 'scommaaccent', +# '021A' => 'Tcommaaccent', +# '021B' => 'tcommaaccent', + '02BC' => 'afii57929', + '02BD' => 'afii64937', + '02C6' => 'circumflex', + '02C7' => 'caron', +# '02C9' => 'macron', + '02D8' => 'breve', + '02D9' => 'dotaccent', + '02DA' => 'ring', + '02DB' => 'ogonek', + '02DC' => 'tilde', + '02DD' => 'hungarumlaut', + '0300' => 'gravecomb', + '0301' => 'acutecomb', + '0303' => 'tildecomb', + '0309' => 'hookabovecomb', + '0323' => 'dotbelowcomb', + '0384' => 'tonos', + '0385' => 'dieresistonos', + '0386' => 'Alphatonos', + '0387' => 'anoteleia', + '0388' => 'Epsilontonos', + '0389' => 'Etatonos', + '038A' => 'Iotatonos', + '038C' => 'Omicrontonos', + '038E' => 'Upsilontonos', + '038F' => 'Omegatonos', + '0390' => 'iotadieresistonos', + '0391' => 'Alpha', + '0392' => 'Beta', + '0393' => 'Gamma', +# '0394' => 'Delta', + '0395' => 'Epsilon', + '0396' => 'Zeta', + '0397' => 'Eta', + '0398' => 'Theta', + '0399' => 'Iota', + '039A' => 'Kappa', + '039B' => 'Lambda', + '039C' => 'Mu', + '039D' => 'Nu', + '039E' => 'Xi', + '039F' => 'Omicron', + '03A0' => 'Pi', + '03A1' => 'Rho', + '03A3' => 'Sigma', + '03A4' => 'Tau', + '03A5' => 'Upsilon', + '03A6' => 'Phi', + '03A7' => 'Chi', + '03A8' => 'Psi', +# '03A9' => 'Omega', + '03AA' => 'Iotadieresis', + '03AB' => 'Upsilondieresis', + '03AC' => 'alphatonos', + '03AD' => 'epsilontonos', + '03AE' => 'etatonos', + '03AF' => 'iotatonos', + '03B0' => 'upsilondieresistonos', + '03B1' => 'alpha', + '03B2' => 'beta', + '03B3' => 'gamma', + '03B4' => 'delta', + '03B5' => 'epsilon', + '03B6' => 'zeta', + '03B7' => 'eta', + '03B8' => 'theta', + '03B9' => 'iota', + '03BA' => 'kappa', + '03BB' => 'lambda', +# '03BC' => 'mu', + '03BD' => 'nu', + '03BE' => 'xi', + '03BF' => 'omicron', + '03C0' => 'pi', + '03C1' => 'rho', + '03C2' => 'sigma1', + '03C3' => 'sigma', + '03C4' => 'tau', + '03C5' => 'upsilon', + '03C6' => 'phi', + '03C7' => 'chi', + '03C8' => 'psi', + '03C9' => 'omega', + '03CA' => 'iotadieresis', + '03CB' => 'upsilondieresis', + '03CC' => 'omicrontonos', + '03CD' => 'upsilontonos', + '03CE' => 'omegatonos', + '03D1' => 'theta1', + '03D2' => 'Upsilon1', + '03D5' => 'phi1', + '03D6' => 'omega1', + '0401' => 'afii10023', + '0402' => 'afii10051', + '0403' => 'afii10052', + '0404' => 'afii10053', + '0405' => 'afii10054', + '0406' => 'afii10055', + '0407' => 'afii10056', + '0408' => 'afii10057', + '0409' => 'afii10058', + '040A' => 'afii10059', + '040B' => 'afii10060', + '040C' => 'afii10061', + '040E' => 'afii10062', + '040F' => 'afii10145', + '0410' => 'afii10017', + '0411' => 'afii10018', + '0412' => 'afii10019', + '0413' => 'afii10020', + '0414' => 'afii10021', + '0415' => 'afii10022', + '0416' => 'afii10024', + '0417' => 'afii10025', + '0418' => 'afii10026', + '0419' => 'afii10027', + '041A' => 'afii10028', + '041B' => 'afii10029', + '041C' => 'afii10030', + '041D' => 'afii10031', + '041E' => 'afii10032', + '041F' => 'afii10033', + '0420' => 'afii10034', + '0421' => 'afii10035', + '0422' => 'afii10036', + '0423' => 'afii10037', + '0424' => 'afii10038', + '0425' => 'afii10039', + '0426' => 'afii10040', + '0427' => 'afii10041', + '0428' => 'afii10042', + '0429' => 'afii10043', + '042A' => 'afii10044', + '042B' => 'afii10045', + '042C' => 'afii10046', + '042D' => 'afii10047', + '042E' => 'afii10048', + '042F' => 'afii10049', + '0430' => 'afii10065', + '0431' => 'afii10066', + '0432' => 'afii10067', + '0433' => 'afii10068', + '0434' => 'afii10069', + '0435' => 'afii10070', + '0436' => 'afii10072', + '0437' => 'afii10073', + '0438' => 'afii10074', + '0439' => 'afii10075', + '043A' => 'afii10076', + '043B' => 'afii10077', + '043C' => 'afii10078', + '043D' => 'afii10079', + '043E' => 'afii10080', + '043F' => 'afii10081', + '0440' => 'afii10082', + '0441' => 'afii10083', + '0442' => 'afii10084', + '0443' => 'afii10085', + '0444' => 'afii10086', + '0445' => 'afii10087', + '0446' => 'afii10088', + '0447' => 'afii10089', + '0448' => 'afii10090', + '0449' => 'afii10091', + '044A' => 'afii10092', + '044B' => 'afii10093', + '044C' => 'afii10094', + '044D' => 'afii10095', + '044E' => 'afii10096', + '044F' => 'afii10097', + '0451' => 'afii10071', + '0452' => 'afii10099', + '0453' => 'afii10100', + '0454' => 'afii10101', + '0455' => 'afii10102', + '0456' => 'afii10103', + '0457' => 'afii10104', + '0458' => 'afii10105', + '0459' => 'afii10106', + '045A' => 'afii10107', + '045B' => 'afii10108', + '045C' => 'afii10109', + '045E' => 'afii10110', + '045F' => 'afii10193', + '0462' => 'afii10146', + '0463' => 'afii10194', + '0472' => 'afii10147', + '0473' => 'afii10195', + '0474' => 'afii10148', + '0475' => 'afii10196', + '0490' => 'afii10050', + '0491' => 'afii10098', + '04D9' => 'afii10846', + '05B0' => 'afii57799', + '05B1' => 'afii57801', + '05B2' => 'afii57800', + '05B3' => 'afii57802', + '05B4' => 'afii57793', + '05B5' => 'afii57794', + '05B6' => 'afii57795', + '05B7' => 'afii57798', + '05B8' => 'afii57797', + '05B9' => 'afii57806', + '05BB' => 'afii57796', + '05BC' => 'afii57807', + '05BD' => 'afii57839', + '05BE' => 'afii57645', + '05BF' => 'afii57841', + '05C0' => 'afii57842', + '05C1' => 'afii57804', + '05C2' => 'afii57803', + '05C3' => 'afii57658', + '05D0' => 'afii57664', + '05D1' => 'afii57665', + '05D2' => 'afii57666', + '05D3' => 'afii57667', + '05D4' => 'afii57668', + '05D5' => 'afii57669', + '05D6' => 'afii57670', + '05D7' => 'afii57671', + '05D8' => 'afii57672', + '05D9' => 'afii57673', + '05DA' => 'afii57674', + '05DB' => 'afii57675', + '05DC' => 'afii57676', + '05DD' => 'afii57677', + '05DE' => 'afii57678', + '05DF' => 'afii57679', + '05E0' => 'afii57680', + '05E1' => 'afii57681', + '05E2' => 'afii57682', + '05E3' => 'afii57683', + '05E4' => 'afii57684', + '05E5' => 'afii57685', + '05E6' => 'afii57686', + '05E7' => 'afii57687', + '05E8' => 'afii57688', + '05E9' => 'afii57689', + '05EA' => 'afii57690', + '05F0' => 'afii57716', + '05F1' => 'afii57717', + '05F2' => 'afii57718', + '060C' => 'afii57388', + '061B' => 'afii57403', + '061F' => 'afii57407', + '0621' => 'afii57409', + '0622' => 'afii57410', + '0623' => 'afii57411', + '0624' => 'afii57412', + '0625' => 'afii57413', + '0626' => 'afii57414', + '0627' => 'afii57415', + '0628' => 'afii57416', + '0629' => 'afii57417', + '062A' => 'afii57418', + '062B' => 'afii57419', + '062C' => 'afii57420', + '062D' => 'afii57421', + '062E' => 'afii57422', + '062F' => 'afii57423', + '0630' => 'afii57424', + '0631' => 'afii57425', + '0632' => 'afii57426', + '0633' => 'afii57427', + '0634' => 'afii57428', + '0635' => 'afii57429', + '0636' => 'afii57430', + '0637' => 'afii57431', + '0638' => 'afii57432', + '0639' => 'afii57433', + '063A' => 'afii57434', + '0640' => 'afii57440', + '0641' => 'afii57441', + '0642' => 'afii57442', + '0643' => 'afii57443', + '0644' => 'afii57444', + '0645' => 'afii57445', + '0646' => 'afii57446', + '0647' => 'afii57470', + '0648' => 'afii57448', + '0649' => 'afii57449', + '064A' => 'afii57450', + '064B' => 'afii57451', + '064C' => 'afii57452', + '064D' => 'afii57453', + '064E' => 'afii57454', + '064F' => 'afii57455', + '0650' => 'afii57456', + '0651' => 'afii57457', + '0652' => 'afii57458', + '0660' => 'afii57392', + '0661' => 'afii57393', + '0662' => 'afii57394', + '0663' => 'afii57395', + '0664' => 'afii57396', + '0665' => 'afii57397', + '0666' => 'afii57398', + '0667' => 'afii57399', + '0668' => 'afii57400', + '0669' => 'afii57401', + '066A' => 'afii57381', + '066D' => 'afii63167', + '0679' => 'afii57511', + '067E' => 'afii57506', + '0686' => 'afii57507', + '0688' => 'afii57512', + '0691' => 'afii57513', + '0698' => 'afii57508', + '06A4' => 'afii57505', + '06AF' => 'afii57509', + '06BA' => 'afii57514', + '06D2' => 'afii57519', + '06D5' => 'afii57534', + '1E80' => 'Wgrave', + '1E81' => 'wgrave', + '1E82' => 'Wacute', + '1E83' => 'wacute', + '1E84' => 'Wdieresis', + '1E85' => 'wdieresis', + '1EF2' => 'Ygrave', + '1EF3' => 'ygrave', + '200C' => 'afii61664', + '200D' => 'afii301', + '200E' => 'afii299', + '200F' => 'afii300', + '2012' => 'figuredash', + '2013' => 'endash', + '2014' => 'emdash', + '2015' => 'afii00208', + '2017' => 'underscoredbl', + '2018' => 'quoteleft', + '2019' => 'quoteright', + '201A' => 'quotesinglbase', + '201B' => 'quotereversed', + '201C' => 'quotedblleft', + '201D' => 'quotedblright', + '201E' => 'quotedblbase', + '2020' => 'dagger', + '2021' => 'daggerdbl', + '2022' => 'bullet', + '2024' => 'onedotenleader', + '2025' => 'twodotenleader', + '2026' => 'ellipsis', + '202C' => 'afii61573', + '202D' => 'afii61574', + '202E' => 'afii61575', + '2030' => 'perthousand', + '2032' => 'minute', + '2033' => 'second', + '2039' => 'guilsinglleft', + '203A' => 'guilsinglright', + '203C' => 'exclamdbl', + '2044' => 'fraction', +# '2070' => 'zerosuperior', +# '2074' => 'foursuperior', +# '2075' => 'fivesuperior', +# '2076' => 'sixsuperior', +# '2077' => 'sevensuperior', +# '2078' => 'eightsuperior', +# '2079' => 'ninesuperior', +# '207D' => 'parenleftsuperior', +# '207E' => 'parenrightsuperior', +# '207F' => 'nsuperior', +# '2080' => 'zeroinferior', +# '2081' => 'oneinferior', +# '2082' => 'twoinferior', +# '2083' => 'threeinferior', +# '2084' => 'fourinferior', +# '2085' => 'fiveinferior', +# '2086' => 'sixinferior', +# '2087' => 'seveninferior', +# '2088' => 'eightinferior', +# '2089' => 'nineinferior', +# '208D' => 'parenleftinferior', +# '208E' => 'parenrightinferior', + '20A1' => 'colonmonetary', + '20A3' => 'franc', + '20A4' => 'lira', + '20A7' => 'peseta', + '20AA' => 'afii57636', + '20AB' => 'dong', + '20AC' => 'Euro', + '2105' => 'afii61248', + '2111' => 'Ifraktur', + '2113' => 'afii61289', + '2116' => 'afii61352', + '2118' => 'weierstrass', + '211C' => 'Rfraktur', + '211E' => 'prescription', + '2122' => 'trademark', + '2126' => 'Omega', + '212E' => 'estimated', + '2135' => 'aleph', + '2153' => 'onethird', + '2154' => 'twothirds', + '215B' => 'oneeighth', + '215C' => 'threeeighths', + '215D' => 'fiveeighths', + '215E' => 'seveneighths', + '2190' => 'arrowleft', + '2191' => 'arrowup', + '2192' => 'arrowright', + '2193' => 'arrowdown', + '2194' => 'arrowboth', + '2195' => 'arrowupdn', + '21A8' => 'arrowupdnbse', + '21B5' => 'carriagereturn', + '21D0' => 'arrowdblleft', + '21D1' => 'arrowdblup', + '21D2' => 'arrowdblright', + '21D3' => 'arrowdbldown', + '21D4' => 'arrowdblboth', + '2200' => 'universal', + '2202' => 'partialdiff', + '2203' => 'existential', + '2205' => 'emptyset', + '2206' => 'Delta', + '2207' => 'gradient', + '2208' => 'element', + '2209' => 'notelement', + '220B' => 'suchthat', + '220F' => 'product', + '2211' => 'summation', + '2212' => 'minus', +# '2215' => 'fraction', + '2217' => 'asteriskmath', +# '2219' => 'periodcentered', + '221A' => 'radical', + '221D' => 'proportional', + '221E' => 'infinity', + '221F' => 'orthogonal', + '2220' => 'angle', + '2227' => 'logicaland', + '2228' => 'logicalor', + '2229' => 'intersection', + '222A' => 'union', + '222B' => 'integral', + '2234' => 'therefore', + '223C' => 'similar', + '2245' => 'congruent', + '2248' => 'approxequal', + '2260' => 'notequal', + '2261' => 'equivalence', + '2264' => 'lessequal', + '2265' => 'greaterequal', + '2282' => 'propersubset', + '2283' => 'propersuperset', + '2284' => 'notsubset', + '2286' => 'reflexsubset', + '2287' => 'reflexsuperset', + '2295' => 'circleplus', + '2297' => 'circlemultiply', + '22A5' => 'perpendicular', + '22C5' => 'dotmath', + '2302' => 'house', + '2310' => 'revlogicalnot', + '2320' => 'integraltp', + '2321' => 'integralbt', + '2329' => 'angleleft', + '232A' => 'angleright', + '2500' => 'SF100000', + '2502' => 'SF110000', + '250C' => 'SF010000', + '2510' => 'SF030000', + '2514' => 'SF020000', + '2518' => 'SF040000', + '251C' => 'SF080000', + '2524' => 'SF090000', + '252C' => 'SF060000', + '2534' => 'SF070000', + '253C' => 'SF050000', + '2550' => 'SF430000', + '2551' => 'SF240000', + '2552' => 'SF510000', + '2553' => 'SF520000', + '2554' => 'SF390000', + '2555' => 'SF220000', + '2556' => 'SF210000', + '2557' => 'SF250000', + '2558' => 'SF500000', + '2559' => 'SF490000', + '255A' => 'SF380000', + '255B' => 'SF280000', + '255C' => 'SF270000', + '255D' => 'SF260000', + '255E' => 'SF360000', + '255F' => 'SF370000', + '2560' => 'SF420000', + '2561' => 'SF190000', + '2562' => 'SF200000', + '2563' => 'SF230000', + '2564' => 'SF470000', + '2565' => 'SF480000', + '2566' => 'SF410000', + '2567' => 'SF450000', + '2568' => 'SF460000', + '2569' => 'SF400000', + '256A' => 'SF540000', + '256B' => 'SF530000', + '256C' => 'SF440000', + '2580' => 'upblock', + '2584' => 'dnblock', + '2588' => 'block', + '258C' => 'lfblock', + '2590' => 'rtblock', + '2591' => 'ltshade', + '2592' => 'shade', + '2593' => 'dkshade', + '25A0' => 'filledbox', + '25A1' => 'H22073', + '25AA' => 'H18543', + '25AB' => 'H18551', + '25AC' => 'filledrect', + '25B2' => 'triagup', + '25BA' => 'triagrt', + '25BC' => 'triagdn', + '25C4' => 'triaglf', + '25CA' => 'lozenge', + '25CB' => 'circle', + '25CF' => 'H18533', + '25D8' => 'invbullet', + '25D9' => 'invcircle', + '25E6' => 'openbullet', + '263A' => 'smileface', + '263B' => 'invsmileface', + '263C' => 'sun', + '2640' => 'female', + '2642' => 'male', + '2660' => 'spade', + '2663' => 'club', + '2665' => 'heart', + '2666' => 'diamond', + '266A' => 'musicalnote', + '266B' => 'musicalnotedbl', + 'FB00' => 'ff', + 'FB01' => 'fi', + 'FB02' => 'fl', + 'FB03' => 'ffi', + 'FB04' => 'ffl', + 'FB1F' => 'afii57705', + 'FB2A' => 'afii57694', + 'FB2B' => 'afii57695', + 'FB35' => 'afii57723', + 'FB4B' => 'afii57700', +); + +# Adobe Glyph List 2.0 (sans those in glyph list for *new* fonts) -- thus +# these are all historic names that could occur in fonts +# from http://partners.adobe.com/asn/tech/type/glyphlist.txt + +%agl = ( + 'AEmacron' => "\x{01E2}", + 'AEsmall' => "\x{F7E6}", + 'Aacutesmall' => "\x{F7E1}", + 'Abreveacute' => "\x{1EAE}", + 'Abrevecyrillic' => "\x{04D0}", + 'Abrevedotbelow' => "\x{1EB6}", + 'Abrevegrave' => "\x{1EB0}", + 'Abrevehookabove' => "\x{1EB2}", + 'Abrevetilde' => "\x{1EB4}", + 'Acaron' => "\x{01CD}", + 'Acircle' => "\x{24B6}", + 'Acircumflexacute' => "\x{1EA4}", + 'Acircumflexdotbelow' => "\x{1EAC}", + 'Acircumflexgrave' => "\x{1EA6}", + 'Acircumflexhookabove' => "\x{1EA8}", + 'Acircumflexsmall' => "\x{F7E2}", + 'Acircumflextilde' => "\x{1EAA}", + 'Acute' => "\x{F6C9}", + 'Acutesmall' => "\x{F7B4}", + 'Acyrillic' => "\x{0410}", + 'Adblgrave' => "\x{0200}", + 'Adieresiscyrillic' => "\x{04D2}", + 'Adieresismacron' => "\x{01DE}", + 'Adieresissmall' => "\x{F7E4}", + 'Adotbelow' => "\x{1EA0}", + 'Adotmacron' => "\x{01E0}", + 'Agravesmall' => "\x{F7E0}", + 'Ahookabove' => "\x{1EA2}", + 'Aiecyrillic' => "\x{04D4}", + 'Ainvertedbreve' => "\x{0202}", + 'Amonospace' => "\x{FF21}", + 'Aringbelow' => "\x{1E00}", + 'Aringsmall' => "\x{F7E5}", + 'Asmall' => "\x{F761}", + 'Atildesmall' => "\x{F7E3}", + 'Aybarmenian' => "\x{0531}", + 'Bcircle' => "\x{24B7}", + 'Bdotaccent' => "\x{1E02}", + 'Bdotbelow' => "\x{1E04}", + 'Becyrillic' => "\x{0411}", + 'Benarmenian' => "\x{0532}", + 'Bhook' => "\x{0181}", + 'Blinebelow' => "\x{1E06}", + 'Bmonospace' => "\x{FF22}", + 'Brevesmall' => "\x{F6F4}", + 'Bsmall' => "\x{F762}", + 'Btopbar' => "\x{0182}", + 'Caarmenian' => "\x{053E}", + 'Caron' => "\x{F6CA}", + 'Caronsmall' => "\x{F6F5}", + 'Ccedillaacute' => "\x{1E08}", + 'Ccedillasmall' => "\x{F7E7}", + 'Ccircle' => "\x{24B8}", + 'Cdot' => "\x{010A}", + 'Cedillasmall' => "\x{F7B8}", + 'Chaarmenian' => "\x{0549}", + 'Cheabkhasiancyrillic' => "\x{04BC}", + 'Checyrillic' => "\x{0427}", + 'Chedescenderabkhasiancyrillic' => "\x{04BE}", + 'Chedescendercyrillic' => "\x{04B6}", + 'Chedieresiscyrillic' => "\x{04F4}", + 'Cheharmenian' => "\x{0543}", + 'Chekhakassiancyrillic' => "\x{04CB}", + 'Cheverticalstrokecyrillic' => "\x{04B8}", + 'Chook' => "\x{0187}", + 'Circumflexsmall' => "\x{F6F6}", + 'Cmonospace' => "\x{FF23}", + 'Coarmenian' => "\x{0551}", + 'Csmall' => "\x{F763}", + 'DZ' => "\x{01F1}", + 'DZcaron' => "\x{01C4}", + 'Daarmenian' => "\x{0534}", + 'Dafrican' => "\x{0189}", + 'Dcedilla' => "\x{1E10}", + 'Dcircle' => "\x{24B9}", + 'Dcircumflexbelow' => "\x{1E12}", + 'Ddotaccent' => "\x{1E0A}", + 'Ddotbelow' => "\x{1E0C}", + 'Decyrillic' => "\x{0414}", + 'Deicoptic' => "\x{03EE}", + 'Deltagreek' => "\x{0394}", + 'Dhook' => "\x{018A}", + 'Dieresis' => "\x{F6CB}", + 'DieresisAcute' => "\x{F6CC}", + 'DieresisGrave' => "\x{F6CD}", + 'Dieresissmall' => "\x{F7A8}", + 'Digammagreek' => "\x{03DC}", + 'Djecyrillic' => "\x{0402}", + 'Dlinebelow' => "\x{1E0E}", + 'Dmonospace' => "\x{FF24}", + 'Dotaccentsmall' => "\x{F6F7}", + 'Dslash' => "\x{0110}", + 'Dsmall' => "\x{F764}", + 'Dtopbar' => "\x{018B}", + 'Dz' => "\x{01F2}", + 'Dzcaron' => "\x{01C5}", + 'Dzeabkhasiancyrillic' => "\x{04E0}", + 'Dzecyrillic' => "\x{0405}", + 'Dzhecyrillic' => "\x{040F}", + 'Eacutesmall' => "\x{F7E9}", + 'Ecedillabreve' => "\x{1E1C}", + 'Echarmenian' => "\x{0535}", + 'Ecircle' => "\x{24BA}", + 'Ecircumflexacute' => "\x{1EBE}", + 'Ecircumflexbelow' => "\x{1E18}", + 'Ecircumflexdotbelow' => "\x{1EC6}", + 'Ecircumflexgrave' => "\x{1EC0}", + 'Ecircumflexhookabove' => "\x{1EC2}", + 'Ecircumflexsmall' => "\x{F7EA}", + 'Ecircumflextilde' => "\x{1EC4}", + 'Ecyrillic' => "\x{0404}", + 'Edblgrave' => "\x{0204}", + 'Edieresissmall' => "\x{F7EB}", + 'Edot' => "\x{0116}", + 'Edotbelow' => "\x{1EB8}", + 'Efcyrillic' => "\x{0424}", + 'Egravesmall' => "\x{F7E8}", + 'Eharmenian' => "\x{0537}", + 'Ehookabove' => "\x{1EBA}", + 'Eightroman' => "\x{2167}", + 'Einvertedbreve' => "\x{0206}", + 'Eiotifiedcyrillic' => "\x{0464}", + 'Elcyrillic' => "\x{041B}", + 'Elevenroman' => "\x{216A}", + 'Emacronacute' => "\x{1E16}", + 'Emacrongrave' => "\x{1E14}", + 'Emcyrillic' => "\x{041C}", + 'Emonospace' => "\x{FF25}", + 'Encyrillic' => "\x{041D}", + 'Endescendercyrillic' => "\x{04A2}", + 'Enghecyrillic' => "\x{04A4}", + 'Enhookcyrillic' => "\x{04C7}", + 'Eopen' => "\x{0190}", + 'Ercyrillic' => "\x{0420}", + 'Ereversed' => "\x{018E}", + 'Ereversedcyrillic' => "\x{042D}", + 'Escyrillic' => "\x{0421}", + 'Esdescendercyrillic' => "\x{04AA}", + 'Esh' => "\x{01A9}", + 'Esmall' => "\x{F765}", + 'Etarmenian' => "\x{0538}", + 'Ethsmall' => "\x{F7F0}", + 'Etilde' => "\x{1EBC}", + 'Etildebelow' => "\x{1E1A}", + 'Ezh' => "\x{01B7}", + 'Ezhcaron' => "\x{01EE}", + 'Ezhreversed' => "\x{01B8}", + 'Fcircle' => "\x{24BB}", + 'Fdotaccent' => "\x{1E1E}", + 'Feharmenian' => "\x{0556}", + 'Feicoptic' => "\x{03E4}", + 'Fhook' => "\x{0191}", + 'Fitacyrillic' => "\x{0472}", + 'Fiveroman' => "\x{2164}", + 'Fmonospace' => "\x{FF26}", + 'Fourroman' => "\x{2163}", + 'Fsmall' => "\x{F766}", + 'GBsquare' => "\x{3387}", + 'Gacute' => "\x{01F4}", + 'Gammaafrican' => "\x{0194}", + 'Gangiacoptic' => "\x{03EA}", + 'Gcedilla' => "\x{0122}", + 'Gcircle' => "\x{24BC}", + 'Gdot' => "\x{0120}", + 'Gecyrillic' => "\x{0413}", + 'Ghadarmenian' => "\x{0542}", + 'Ghemiddlehookcyrillic' => "\x{0494}", + 'Ghestrokecyrillic' => "\x{0492}", + 'Gheupturncyrillic' => "\x{0490}", + 'Ghook' => "\x{0193}", + 'Gimarmenian' => "\x{0533}", + 'Gjecyrillic' => "\x{0403}", + 'Gmacron' => "\x{1E20}", + 'Gmonospace' => "\x{FF27}", + 'Grave' => "\x{F6CE}", + 'Gravesmall' => "\x{F760}", + 'Gsmall' => "\x{F767}", + 'Gsmallhook' => "\x{029B}", + 'Gstroke' => "\x{01E4}", + 'HPsquare' => "\x{33CB}", + 'Haabkhasiancyrillic' => "\x{04A8}", + 'Hadescendercyrillic' => "\x{04B2}", + 'Hardsigncyrillic' => "\x{042A}", + 'Hbrevebelow' => "\x{1E2A}", + 'Hcedilla' => "\x{1E28}", + 'Hcircle' => "\x{24BD}", + 'Hdieresis' => "\x{1E26}", + 'Hdotaccent' => "\x{1E22}", + 'Hdotbelow' => "\x{1E24}", + 'Hmonospace' => "\x{FF28}", + 'Hoarmenian' => "\x{0540}", + 'Horicoptic' => "\x{03E8}", + 'Hsmall' => "\x{F768}", + 'Hungarumlaut' => "\x{F6CF}", + 'Hungarumlautsmall' => "\x{F6F8}", + 'Hzsquare' => "\x{3390}", + 'IAcyrillic' => "\x{042F}", + 'IUcyrillic' => "\x{042E}", + 'Iacutesmall' => "\x{F7ED}", + 'Icaron' => "\x{01CF}", + 'Icircle' => "\x{24BE}", + 'Icircumflexsmall' => "\x{F7EE}", + 'Icyrillic' => "\x{0406}", + 'Idblgrave' => "\x{0208}", + 'Idieresisacute' => "\x{1E2E}", + 'Idieresiscyrillic' => "\x{04E4}", + 'Idieresissmall' => "\x{F7EF}", + 'Idot' => "\x{0130}", + 'Idotbelow' => "\x{1ECA}", + 'Iebrevecyrillic' => "\x{04D6}", + 'Iecyrillic' => "\x{0415}", + 'Igravesmall' => "\x{F7EC}", + 'Ihookabove' => "\x{1EC8}", + 'Iicyrillic' => "\x{0418}", + 'Iinvertedbreve' => "\x{020A}", + 'Iishortcyrillic' => "\x{0419}", + 'Imacroncyrillic' => "\x{04E2}", + 'Imonospace' => "\x{FF29}", + 'Iniarmenian' => "\x{053B}", + 'Iocyrillic' => "\x{0401}", + 'Iotaafrican' => "\x{0196}", + 'Ismall' => "\x{F769}", + 'Istroke' => "\x{0197}", + 'Itildebelow' => "\x{1E2C}", + 'Izhitsacyrillic' => "\x{0474}", + 'Izhitsadblgravecyrillic' => "\x{0476}", + 'Jaarmenian' => "\x{0541}", + 'Jcircle' => "\x{24BF}", + 'Jecyrillic' => "\x{0408}", + 'Jheharmenian' => "\x{054B}", + 'Jmonospace' => "\x{FF2A}", + 'Jsmall' => "\x{F76A}", + 'KBsquare' => "\x{3385}", + 'KKsquare' => "\x{33CD}", + 'Kabashkircyrillic' => "\x{04A0}", + 'Kacute' => "\x{1E30}", + 'Kacyrillic' => "\x{041A}", + 'Kadescendercyrillic' => "\x{049A}", + 'Kahookcyrillic' => "\x{04C3}", + 'Kastrokecyrillic' => "\x{049E}", + 'Kaverticalstrokecyrillic' => "\x{049C}", + 'Kcaron' => "\x{01E8}", + 'Kcedilla' => "\x{0136}", + 'Kcircle' => "\x{24C0}", + 'Kdotbelow' => "\x{1E32}", + 'Keharmenian' => "\x{0554}", + 'Kenarmenian' => "\x{053F}", + 'Khacyrillic' => "\x{0425}", + 'Kheicoptic' => "\x{03E6}", + 'Khook' => "\x{0198}", + 'Kjecyrillic' => "\x{040C}", + 'Klinebelow' => "\x{1E34}", + 'Kmonospace' => "\x{FF2B}", + 'Koppacyrillic' => "\x{0480}", + 'Koppagreek' => "\x{03DE}", + 'Ksicyrillic' => "\x{046E}", + 'Ksmall' => "\x{F76B}", + 'LJ' => "\x{01C7}", + 'LL' => "\x{F6BF}", + 'Lcedilla' => "\x{013B}", + 'Lcircle' => "\x{24C1}", + 'Lcircumflexbelow' => "\x{1E3C}", + 'Ldotaccent' => "\x{013F}", + 'Ldotbelow' => "\x{1E36}", + 'Ldotbelowmacron' => "\x{1E38}", + 'Liwnarmenian' => "\x{053C}", + 'Lj' => "\x{01C8}", + 'Ljecyrillic' => "\x{0409}", + 'Llinebelow' => "\x{1E3A}", + 'Lmonospace' => "\x{FF2C}", + 'Lslashsmall' => "\x{F6F9}", + 'Lsmall' => "\x{F76C}", + 'MBsquare' => "\x{3386}", + 'Macron' => "\x{F6D0}", + 'Macronsmall' => "\x{F7AF}", + 'Macute' => "\x{1E3E}", + 'Mcircle' => "\x{24C2}", + 'Mdotaccent' => "\x{1E40}", + 'Mdotbelow' => "\x{1E42}", + 'Menarmenian' => "\x{0544}", + 'Mmonospace' => "\x{FF2D}", + 'Msmall' => "\x{F76D}", + 'Mturned' => "\x{019C}", + 'NJ' => "\x{01CA}", + 'Ncedilla' => "\x{0145}", + 'Ncircle' => "\x{24C3}", + 'Ncircumflexbelow' => "\x{1E4A}", + 'Ndotaccent' => "\x{1E44}", + 'Ndotbelow' => "\x{1E46}", + 'Nhookleft' => "\x{019D}", + 'Nineroman' => "\x{2168}", + 'Nj' => "\x{01CB}", + 'Njecyrillic' => "\x{040A}", + 'Nlinebelow' => "\x{1E48}", + 'Nmonospace' => "\x{FF2E}", + 'Nowarmenian' => "\x{0546}", + 'Nsmall' => "\x{F76E}", + 'Ntildesmall' => "\x{F7F1}", + 'OEsmall' => "\x{F6FA}", + 'Oacutesmall' => "\x{F7F3}", + 'Obarredcyrillic' => "\x{04E8}", + 'Obarreddieresiscyrillic' => "\x{04EA}", + 'Ocaron' => "\x{01D1}", + 'Ocenteredtilde' => "\x{019F}", + 'Ocircle' => "\x{24C4}", + 'Ocircumflexacute' => "\x{1ED0}", + 'Ocircumflexdotbelow' => "\x{1ED8}", + 'Ocircumflexgrave' => "\x{1ED2}", + 'Ocircumflexhookabove' => "\x{1ED4}", + 'Ocircumflexsmall' => "\x{F7F4}", + 'Ocircumflextilde' => "\x{1ED6}", + 'Ocyrillic' => "\x{041E}", + 'Odblacute' => "\x{0150}", + 'Odblgrave' => "\x{020C}", + 'Odieresiscyrillic' => "\x{04E6}", + 'Odieresissmall' => "\x{F7F6}", + 'Odotbelow' => "\x{1ECC}", + 'Ogoneksmall' => "\x{F6FB}", + 'Ogravesmall' => "\x{F7F2}", + 'Oharmenian' => "\x{0555}", + 'Ohm' => "\x{2126}", + 'Ohookabove' => "\x{1ECE}", + 'Ohornacute' => "\x{1EDA}", + 'Ohorndotbelow' => "\x{1EE2}", + 'Ohorngrave' => "\x{1EDC}", + 'Ohornhookabove' => "\x{1EDE}", + 'Ohorntilde' => "\x{1EE0}", + 'Oi' => "\x{01A2}", + 'Oinvertedbreve' => "\x{020E}", + 'Omacronacute' => "\x{1E52}", + 'Omacrongrave' => "\x{1E50}", + 'Omegacyrillic' => "\x{0460}", + 'Omegagreek' => "\x{03A9}", + 'Omegaroundcyrillic' => "\x{047A}", + 'Omegatitlocyrillic' => "\x{047C}", + 'Omonospace' => "\x{FF2F}", + 'Oneroman' => "\x{2160}", + 'Oogonek' => "\x{01EA}", + 'Oogonekmacron' => "\x{01EC}", + 'Oopen' => "\x{0186}", + 'Oslashsmall' => "\x{F7F8}", + 'Osmall' => "\x{F76F}", + 'Ostrokeacute' => "\x{01FE}", + 'Otcyrillic' => "\x{047E}", + 'Otildeacute' => "\x{1E4C}", + 'Otildedieresis' => "\x{1E4E}", + 'Otildesmall' => "\x{F7F5}", + 'Pacute' => "\x{1E54}", + 'Pcircle' => "\x{24C5}", + 'Pdotaccent' => "\x{1E56}", + 'Pecyrillic' => "\x{041F}", + 'Peharmenian' => "\x{054A}", + 'Pemiddlehookcyrillic' => "\x{04A6}", + 'Phook' => "\x{01A4}", + 'Piwrarmenian' => "\x{0553}", + 'Pmonospace' => "\x{FF30}", + 'Psicyrillic' => "\x{0470}", + 'Psmall' => "\x{F770}", + 'Qcircle' => "\x{24C6}", + 'Qmonospace' => "\x{FF31}", + 'Qsmall' => "\x{F771}", + 'Raarmenian' => "\x{054C}", + 'Rcedilla' => "\x{0156}", + 'Rcircle' => "\x{24C7}", + 'Rdblgrave' => "\x{0210}", + 'Rdotaccent' => "\x{1E58}", + 'Rdotbelow' => "\x{1E5A}", + 'Rdotbelowmacron' => "\x{1E5C}", + 'Reharmenian' => "\x{0550}", + 'Ringsmall' => "\x{F6FC}", + 'Rinvertedbreve' => "\x{0212}", + 'Rlinebelow' => "\x{1E5E}", + 'Rmonospace' => "\x{FF32}", + 'Rsmall' => "\x{F772}", + 'Rsmallinverted' => "\x{0281}", + 'Rsmallinvertedsuperior' => "\x{02B6}", + 'Sacutedotaccent' => "\x{1E64}", + 'Sampigreek' => "\x{03E0}", + 'Scarondotaccent' => "\x{1E66}", + 'Scaronsmall' => "\x{F6FD}", + 'Schwa' => "\x{018F}", + 'Schwacyrillic' => "\x{04D8}", + 'Schwadieresiscyrillic' => "\x{04DA}", + 'Scircle' => "\x{24C8}", + 'Sdotaccent' => "\x{1E60}", + 'Sdotbelow' => "\x{1E62}", + 'Sdotbelowdotaccent' => "\x{1E68}", + 'Seharmenian' => "\x{054D}", + 'Sevenroman' => "\x{2166}", + 'Shaarmenian' => "\x{0547}", + 'Shacyrillic' => "\x{0428}", + 'Shchacyrillic' => "\x{0429}", + 'Sheicoptic' => "\x{03E2}", + 'Shhacyrillic' => "\x{04BA}", + 'Shimacoptic' => "\x{03EC}", + 'Sixroman' => "\x{2165}", + 'Smonospace' => "\x{FF33}", + 'Softsigncyrillic' => "\x{042C}", + 'Ssmall' => "\x{F773}", + 'Stigmagreek' => "\x{03DA}", + 'Tcedilla' => "\x{0162}", + 'Tcircle' => "\x{24C9}", + 'Tcircumflexbelow' => "\x{1E70}", + 'Tdotaccent' => "\x{1E6A}", + 'Tdotbelow' => "\x{1E6C}", + 'Tecyrillic' => "\x{0422}", + 'Tedescendercyrillic' => "\x{04AC}", + 'Tenroman' => "\x{2169}", + 'Tetsecyrillic' => "\x{04B4}", + 'Thook' => "\x{01AC}", + 'Thornsmall' => "\x{F7FE}", + 'Threeroman' => "\x{2162}", + 'Tildesmall' => "\x{F6FE}", + 'Tiwnarmenian' => "\x{054F}", + 'Tlinebelow' => "\x{1E6E}", + 'Tmonospace' => "\x{FF34}", + 'Toarmenian' => "\x{0539}", + 'Tonefive' => "\x{01BC}", + 'Tonesix' => "\x{0184}", + 'Tonetwo' => "\x{01A7}", + 'Tretroflexhook' => "\x{01AE}", + 'Tsecyrillic' => "\x{0426}", + 'Tshecyrillic' => "\x{040B}", + 'Tsmall' => "\x{F774}", + 'Twelveroman' => "\x{216B}", + 'Tworoman' => "\x{2161}", + 'Uacutesmall' => "\x{F7FA}", + 'Ucaron' => "\x{01D3}", + 'Ucircle' => "\x{24CA}", + 'Ucircumflexbelow' => "\x{1E76}", + 'Ucircumflexsmall' => "\x{F7FB}", + 'Ucyrillic' => "\x{0423}", + 'Udblacute' => "\x{0170}", + 'Udblgrave' => "\x{0214}", + 'Udieresisacute' => "\x{01D7}", + 'Udieresisbelow' => "\x{1E72}", + 'Udieresiscaron' => "\x{01D9}", + 'Udieresiscyrillic' => "\x{04F0}", + 'Udieresisgrave' => "\x{01DB}", + 'Udieresismacron' => "\x{01D5}", + 'Udieresissmall' => "\x{F7FC}", + 'Udotbelow' => "\x{1EE4}", + 'Ugravesmall' => "\x{F7F9}", + 'Uhookabove' => "\x{1EE6}", + 'Uhornacute' => "\x{1EE8}", + 'Uhorndotbelow' => "\x{1EF0}", + 'Uhorngrave' => "\x{1EEA}", + 'Uhornhookabove' => "\x{1EEC}", + 'Uhorntilde' => "\x{1EEE}", + 'Uhungarumlautcyrillic' => "\x{04F2}", + 'Uinvertedbreve' => "\x{0216}", + 'Ukcyrillic' => "\x{0478}", + 'Umacroncyrillic' => "\x{04EE}", + 'Umacrondieresis' => "\x{1E7A}", + 'Umonospace' => "\x{FF35}", + 'Upsilonacutehooksymbolgreek' => "\x{03D3}", + 'Upsilonafrican' => "\x{01B1}", + 'Upsilondieresishooksymbolgreek' => "\x{03D4}", + 'Upsilonhooksymbol' => "\x{03D2}", + 'Ushortcyrillic' => "\x{040E}", + 'Usmall' => "\x{F775}", + 'Ustraightcyrillic' => "\x{04AE}", + 'Ustraightstrokecyrillic' => "\x{04B0}", + 'Utildeacute' => "\x{1E78}", + 'Utildebelow' => "\x{1E74}", + 'Vcircle' => "\x{24CB}", + 'Vdotbelow' => "\x{1E7E}", + 'Vecyrillic' => "\x{0412}", + 'Vewarmenian' => "\x{054E}", + 'Vhook' => "\x{01B2}", + 'Vmonospace' => "\x{FF36}", + 'Voarmenian' => "\x{0548}", + 'Vsmall' => "\x{F776}", + 'Vtilde' => "\x{1E7C}", + 'Wcircle' => "\x{24CC}", + 'Wdotaccent' => "\x{1E86}", + 'Wdotbelow' => "\x{1E88}", + 'Wmonospace' => "\x{FF37}", + 'Wsmall' => "\x{F777}", + 'Xcircle' => "\x{24CD}", + 'Xdieresis' => "\x{1E8C}", + 'Xdotaccent' => "\x{1E8A}", + 'Xeharmenian' => "\x{053D}", + 'Xmonospace' => "\x{FF38}", + 'Xsmall' => "\x{F778}", + 'Yacutesmall' => "\x{F7FD}", + 'Yatcyrillic' => "\x{0462}", + 'Ycircle' => "\x{24CE}", + 'Ydieresissmall' => "\x{F7FF}", + 'Ydotaccent' => "\x{1E8E}", + 'Ydotbelow' => "\x{1EF4}", + 'Yericyrillic' => "\x{042B}", + 'Yerudieresiscyrillic' => "\x{04F8}", + 'Yhook' => "\x{01B3}", + 'Yhookabove' => "\x{1EF6}", + 'Yiarmenian' => "\x{0545}", + 'Yicyrillic' => "\x{0407}", + 'Yiwnarmenian' => "\x{0552}", + 'Ymonospace' => "\x{FF39}", + 'Ysmall' => "\x{F779}", + 'Ytilde' => "\x{1EF8}", + 'Yusbigcyrillic' => "\x{046A}", + 'Yusbigiotifiedcyrillic' => "\x{046C}", + 'Yuslittlecyrillic' => "\x{0466}", + 'Yuslittleiotifiedcyrillic' => "\x{0468}", + 'Zaarmenian' => "\x{0536}", + 'Zcaronsmall' => "\x{F6FF}", + 'Zcircle' => "\x{24CF}", + 'Zcircumflex' => "\x{1E90}", + 'Zdot' => "\x{017B}", + 'Zdotbelow' => "\x{1E92}", + 'Zecyrillic' => "\x{0417}", + 'Zedescendercyrillic' => "\x{0498}", + 'Zedieresiscyrillic' => "\x{04DE}", + 'Zhearmenian' => "\x{053A}", + 'Zhebrevecyrillic' => "\x{04C1}", + 'Zhecyrillic' => "\x{0416}", + 'Zhedescendercyrillic' => "\x{0496}", + 'Zhedieresiscyrillic' => "\x{04DC}", + 'Zlinebelow' => "\x{1E94}", + 'Zmonospace' => "\x{FF3A}", + 'Zsmall' => "\x{F77A}", + 'Zstroke' => "\x{01B5}", + 'aabengali' => "\x{0986}", + 'aadeva' => "\x{0906}", + 'aagujarati' => "\x{0A86}", + 'aagurmukhi' => "\x{0A06}", + 'aamatragurmukhi' => "\x{0A3E}", + 'aarusquare' => "\x{3303}", + 'aavowelsignbengali' => "\x{09BE}", + 'aavowelsigndeva' => "\x{093E}", + 'aavowelsigngujarati' => "\x{0ABE}", + 'abbreviationmarkarmenian' => "\x{055F}", + 'abbreviationsigndeva' => "\x{0970}", + 'abengali' => "\x{0985}", + 'abopomofo' => "\x{311A}", + 'abreveacute' => "\x{1EAF}", + 'abrevecyrillic' => "\x{04D1}", + 'abrevedotbelow' => "\x{1EB7}", + 'abrevegrave' => "\x{1EB1}", + 'abrevehookabove' => "\x{1EB3}", + 'abrevetilde' => "\x{1EB5}", + 'acaron' => "\x{01CE}", + 'acircle' => "\x{24D0}", + 'acircumflexacute' => "\x{1EA5}", + 'acircumflexdotbelow' => "\x{1EAD}", + 'acircumflexgrave' => "\x{1EA7}", + 'acircumflexhookabove' => "\x{1EA9}", + 'acircumflextilde' => "\x{1EAB}", + 'acutebelowcmb' => "\x{0317}", + 'acutecmb' => "\x{0301}", + 'acutedeva' => "\x{0954}", + 'acutelowmod' => "\x{02CF}", + 'acutetonecmb' => "\x{0341}", + 'acyrillic' => "\x{0430}", + 'adblgrave' => "\x{0201}", + 'addakgurmukhi' => "\x{0A71}", + 'adeva' => "\x{0905}", + 'adieresiscyrillic' => "\x{04D3}", + 'adieresismacron' => "\x{01DF}", + 'adotbelow' => "\x{1EA1}", + 'adotmacron' => "\x{01E1}", + 'aekorean' => "\x{3150}", + 'aemacron' => "\x{01E3}", + 'afii08941' => "\x{20A4}", + 'afii10063' => "\x{F6C4}", + 'afii10064' => "\x{F6C5}", + 'afii10192' => "\x{F6C6}", + 'afii10831' => "\x{F6C7}", + 'afii10832' => "\x{F6C8}", + 'agujarati' => "\x{0A85}", + 'agurmukhi' => "\x{0A05}", + 'ahiragana' => "\x{3042}", + 'ahookabove' => "\x{1EA3}", + 'aibengali' => "\x{0990}", + 'aibopomofo' => "\x{311E}", + 'aideva' => "\x{0910}", + 'aiecyrillic' => "\x{04D5}", + 'aigujarati' => "\x{0A90}", + 'aigurmukhi' => "\x{0A10}", + 'aimatragurmukhi' => "\x{0A48}", + 'ainarabic' => "\x{0639}", + 'ainfinalarabic' => "\x{FECA}", + 'aininitialarabic' => "\x{FECB}", + 'ainmedialarabic' => "\x{FECC}", + 'ainvertedbreve' => "\x{0203}", + 'aivowelsignbengali' => "\x{09C8}", + 'aivowelsigndeva' => "\x{0948}", + 'aivowelsigngujarati' => "\x{0AC8}", + 'akatakana' => "\x{30A2}", + 'akatakanahalfwidth' => "\x{FF71}", + 'akorean' => "\x{314F}", + 'alef' => "\x{05D0}", + 'alefarabic' => "\x{0627}", + 'alefdageshhebrew' => "\x{FB30}", + 'aleffinalarabic' => "\x{FE8E}", + 'alefhamzaabovearabic' => "\x{0623}", + 'alefhamzaabovefinalarabic' => "\x{FE84}", + 'alefhamzabelowarabic' => "\x{0625}", + 'alefhamzabelowfinalarabic' => "\x{FE88}", + 'alefhebrew' => "\x{05D0}", + 'aleflamedhebrew' => "\x{FB4F}", + 'alefmaddaabovearabic' => "\x{0622}", + 'alefmaddaabovefinalarabic' => "\x{FE82}", + 'alefmaksuraarabic' => "\x{0649}", + 'alefmaksurafinalarabic' => "\x{FEF0}", + 'alefmaksurainitialarabic' => "\x{FEF3}", + 'alefmaksuramedialarabic' => "\x{FEF4}", + 'alefpatahhebrew' => "\x{FB2E}", + 'alefqamatshebrew' => "\x{FB2F}", + 'allequal' => "\x{224C}", + 'amonospace' => "\x{FF41}", + 'ampersandmonospace' => "\x{FF06}", + 'ampersandsmall' => "\x{F726}", + 'amsquare' => "\x{33C2}", + 'anbopomofo' => "\x{3122}", + 'angbopomofo' => "\x{3124}", + 'angkhankhuthai' => "\x{0E5A}", + 'anglebracketleft' => "\x{3008}", + 'anglebracketleftvertical' => "\x{FE3F}", + 'anglebracketright' => "\x{3009}", + 'anglebracketrightvertical' => "\x{FE40}", + 'angstrom' => "\x{212B}", + 'anudattadeva' => "\x{0952}", + 'anusvarabengali' => "\x{0982}", + 'anusvaradeva' => "\x{0902}", + 'anusvaragujarati' => "\x{0A82}", + 'apaatosquare' => "\x{3300}", + 'aparen' => "\x{249C}", + 'apostrophearmenian' => "\x{055A}", + 'apostrophemod' => "\x{02BC}", + 'apple' => "\x{F8FF}", + 'approaches' => "\x{2250}", + 'approxequalorimage' => "\x{2252}", + 'approximatelyequal' => "\x{2245}", + 'araeaekorean' => "\x{318E}", + 'araeakorean' => "\x{318D}", + 'arc' => "\x{2312}", + 'arighthalfring' => "\x{1E9A}", + 'aringbelow' => "\x{1E01}", + 'arrowdashdown' => "\x{21E3}", + 'arrowdashleft' => "\x{21E0}", + 'arrowdashright' => "\x{21E2}", + 'arrowdashup' => "\x{21E1}", + 'arrowdownleft' => "\x{2199}", + 'arrowdownright' => "\x{2198}", + 'arrowdownwhite' => "\x{21E9}", + 'arrowheaddownmod' => "\x{02C5}", + 'arrowheadleftmod' => "\x{02C2}", + 'arrowheadrightmod' => "\x{02C3}", + 'arrowheadupmod' => "\x{02C4}", + 'arrowhorizex' => "\x{F8E7}", + 'arrowleftdbl' => "\x{21D0}", + 'arrowleftdblstroke' => "\x{21CD}", + 'arrowleftoverright' => "\x{21C6}", + 'arrowleftwhite' => "\x{21E6}", + 'arrowrightdblstroke' => "\x{21CF}", + 'arrowrightheavy' => "\x{279E}", + 'arrowrightoverleft' => "\x{21C4}", + 'arrowrightwhite' => "\x{21E8}", + 'arrowtableft' => "\x{21E4}", + 'arrowtabright' => "\x{21E5}", + 'arrowupdownbase' => "\x{21A8}", + 'arrowupleft' => "\x{2196}", + 'arrowupleftofdown' => "\x{21C5}", + 'arrowupright' => "\x{2197}", + 'arrowupwhite' => "\x{21E7}", + 'arrowvertex' => "\x{F8E6}", + 'asciicircummonospace' => "\x{FF3E}", + 'asciitildemonospace' => "\x{FF5E}", + 'ascript' => "\x{0251}", + 'ascriptturned' => "\x{0252}", + 'asmallhiragana' => "\x{3041}", + 'asmallkatakana' => "\x{30A1}", + 'asmallkatakanahalfwidth' => "\x{FF67}", + 'asteriskaltonearabic' => "\x{066D}", + 'asteriskarabic' => "\x{066D}", + 'asteriskmonospace' => "\x{FF0A}", + 'asterisksmall' => "\x{FE61}", + 'asterism' => "\x{2042}", + 'asuperior' => "\x{F6E9}", + 'asymptoticallyequal' => "\x{2243}", + 'atmonospace' => "\x{FF20}", + 'atsmall' => "\x{FE6B}", + 'aturned' => "\x{0250}", + 'aubengali' => "\x{0994}", + 'aubopomofo' => "\x{3120}", + 'audeva' => "\x{0914}", + 'augujarati' => "\x{0A94}", + 'augurmukhi' => "\x{0A14}", + 'aulengthmarkbengali' => "\x{09D7}", + 'aumatragurmukhi' => "\x{0A4C}", + 'auvowelsignbengali' => "\x{09CC}", + 'auvowelsigndeva' => "\x{094C}", + 'auvowelsigngujarati' => "\x{0ACC}", + 'avagrahadeva' => "\x{093D}", + 'aybarmenian' => "\x{0561}", + 'ayin' => "\x{05E2}", + 'ayinaltonehebrew' => "\x{FB20}", + 'ayinhebrew' => "\x{05E2}", + 'babengali' => "\x{09AC}", + 'backslashmonospace' => "\x{FF3C}", + 'badeva' => "\x{092C}", + 'bagujarati' => "\x{0AAC}", + 'bagurmukhi' => "\x{0A2C}", + 'bahiragana' => "\x{3070}", + 'bahtthai' => "\x{0E3F}", + 'bakatakana' => "\x{30D0}", + 'barmonospace' => "\x{FF5C}", + 'bbopomofo' => "\x{3105}", + 'bcircle' => "\x{24D1}", + 'bdotaccent' => "\x{1E03}", + 'bdotbelow' => "\x{1E05}", + 'beamedsixteenthnotes' => "\x{266C}", + 'because' => "\x{2235}", + 'becyrillic' => "\x{0431}", + 'beharabic' => "\x{0628}", + 'behfinalarabic' => "\x{FE90}", + 'behinitialarabic' => "\x{FE91}", + 'behiragana' => "\x{3079}", + 'behmedialarabic' => "\x{FE92}", + 'behmeeminitialarabic' => "\x{FC9F}", + 'behmeemisolatedarabic' => "\x{FC08}", + 'behnoonfinalarabic' => "\x{FC6D}", + 'bekatakana' => "\x{30D9}", + 'benarmenian' => "\x{0562}", + 'bet' => "\x{05D1}", + 'betasymbolgreek' => "\x{03D0}", + 'betdagesh' => "\x{FB31}", + 'betdageshhebrew' => "\x{FB31}", + 'bethebrew' => "\x{05D1}", + 'betrafehebrew' => "\x{FB4C}", + 'bhabengali' => "\x{09AD}", + 'bhadeva' => "\x{092D}", + 'bhagujarati' => "\x{0AAD}", + 'bhagurmukhi' => "\x{0A2D}", + 'bhook' => "\x{0253}", + 'bihiragana' => "\x{3073}", + 'bikatakana' => "\x{30D3}", + 'bilabialclick' => "\x{0298}", + 'bindigurmukhi' => "\x{0A02}", + 'birusquare' => "\x{3331}", + 'blackcircle' => "\x{25CF}", + 'blackdiamond' => "\x{25C6}", + 'blackdownpointingtriangle' => "\x{25BC}", + 'blackleftpointingpointer' => "\x{25C4}", + 'blackleftpointingtriangle' => "\x{25C0}", + 'blacklenticularbracketleft' => "\x{3010}", + 'blacklenticularbracketleftvertical' => "\x{FE3B}", + 'blacklenticularbracketright' => "\x{3011}", + 'blacklenticularbracketrightvertical' => "\x{FE3C}", + 'blacklowerlefttriangle' => "\x{25E3}", + 'blacklowerrighttriangle' => "\x{25E2}", + 'blackrectangle' => "\x{25AC}", + 'blackrightpointingpointer' => "\x{25BA}", + 'blackrightpointingtriangle' => "\x{25B6}", + 'blacksmallsquare' => "\x{25AA}", + 'blacksmilingface' => "\x{263B}", + 'blacksquare' => "\x{25A0}", + 'blackstar' => "\x{2605}", + 'blackupperlefttriangle' => "\x{25E4}", + 'blackupperrighttriangle' => "\x{25E5}", + 'blackuppointingsmalltriangle' => "\x{25B4}", + 'blackuppointingtriangle' => "\x{25B2}", + 'blank' => "\x{2423}", + 'blinebelow' => "\x{1E07}", + 'bmonospace' => "\x{FF42}", + 'bobaimaithai' => "\x{0E1A}", + 'bohiragana' => "\x{307C}", + 'bokatakana' => "\x{30DC}", + 'bparen' => "\x{249D}", + 'bqsquare' => "\x{33C3}", + 'braceex' => "\x{F8F4}", + 'braceleftbt' => "\x{F8F3}", + 'braceleftmid' => "\x{F8F2}", + 'braceleftmonospace' => "\x{FF5B}", + 'braceleftsmall' => "\x{FE5B}", + 'bracelefttp' => "\x{F8F1}", + 'braceleftvertical' => "\x{FE37}", + 'bracerightbt' => "\x{F8FE}", + 'bracerightmid' => "\x{F8FD}", + 'bracerightmonospace' => "\x{FF5D}", + 'bracerightsmall' => "\x{FE5C}", + 'bracerighttp' => "\x{F8FC}", + 'bracerightvertical' => "\x{FE38}", + 'bracketleftbt' => "\x{F8F0}", + 'bracketleftex' => "\x{F8EF}", + 'bracketleftmonospace' => "\x{FF3B}", + 'bracketlefttp' => "\x{F8EE}", + 'bracketrightbt' => "\x{F8FB}", + 'bracketrightex' => "\x{F8FA}", + 'bracketrightmonospace' => "\x{FF3D}", + 'bracketrighttp' => "\x{F8F9}", + 'brevebelowcmb' => "\x{032E}", + 'brevecmb' => "\x{0306}", + 'breveinvertedbelowcmb' => "\x{032F}", + 'breveinvertedcmb' => "\x{0311}", + 'breveinverteddoublecmb' => "\x{0361}", + 'bridgebelowcmb' => "\x{032A}", + 'bridgeinvertedbelowcmb' => "\x{033A}", + 'bstroke' => "\x{0180}", + 'bsuperior' => "\x{F6EA}", + 'btopbar' => "\x{0183}", + 'buhiragana' => "\x{3076}", + 'bukatakana' => "\x{30D6}", + 'bulletinverse' => "\x{25D8}", + 'bulletoperator' => "\x{2219}", + 'bullseye' => "\x{25CE}", + 'caarmenian' => "\x{056E}", + 'cabengali' => "\x{099A}", + 'cadeva' => "\x{091A}", + 'cagujarati' => "\x{0A9A}", + 'cagurmukhi' => "\x{0A1A}", + 'calsquare' => "\x{3388}", + 'candrabindubengali' => "\x{0981}", + 'candrabinducmb' => "\x{0310}", + 'candrabindudeva' => "\x{0901}", + 'candrabindugujarati' => "\x{0A81}", + 'capslock' => "\x{21EA}", + 'careof' => "\x{2105}", + 'caronbelowcmb' => "\x{032C}", + 'caroncmb' => "\x{030C}", + 'cbopomofo' => "\x{3118}", + 'ccedillaacute' => "\x{1E09}", + 'ccircle' => "\x{24D2}", + 'ccurl' => "\x{0255}", + 'cdot' => "\x{010B}", + 'cdsquare' => "\x{33C5}", + 'cedillacmb' => "\x{0327}", + 'centigrade' => "\x{2103}", + 'centinferior' => "\x{F6DF}", + 'centmonospace' => "\x{FFE0}", + 'centoldstyle' => "\x{F7A2}", + 'centsuperior' => "\x{F6E0}", + 'chaarmenian' => "\x{0579}", + 'chabengali' => "\x{099B}", + 'chadeva' => "\x{091B}", + 'chagujarati' => "\x{0A9B}", + 'chagurmukhi' => "\x{0A1B}", + 'chbopomofo' => "\x{3114}", + 'cheabkhasiancyrillic' => "\x{04BD}", + 'checkmark' => "\x{2713}", + 'checyrillic' => "\x{0447}", + 'chedescenderabkhasiancyrillic' => "\x{04BF}", + 'chedescendercyrillic' => "\x{04B7}", + 'chedieresiscyrillic' => "\x{04F5}", + 'cheharmenian' => "\x{0573}", + 'chekhakassiancyrillic' => "\x{04CC}", + 'cheverticalstrokecyrillic' => "\x{04B9}", + 'chieuchacirclekorean' => "\x{3277}", + 'chieuchaparenkorean' => "\x{3217}", + 'chieuchcirclekorean' => "\x{3269}", + 'chieuchkorean' => "\x{314A}", + 'chieuchparenkorean' => "\x{3209}", + 'chochangthai' => "\x{0E0A}", + 'chochanthai' => "\x{0E08}", + 'chochingthai' => "\x{0E09}", + 'chochoethai' => "\x{0E0C}", + 'chook' => "\x{0188}", + 'cieucacirclekorean' => "\x{3276}", + 'cieucaparenkorean' => "\x{3216}", + 'cieuccirclekorean' => "\x{3268}", + 'cieuckorean' => "\x{3148}", + 'cieucparenkorean' => "\x{3208}", + 'cieucuparenkorean' => "\x{321C}", + 'circleot' => "\x{2299}", # Actual Adobe glyph list entry -- identified as typo, May 2008 + 'circledot' => "\x{2299}", # What it should have been + 'circlepostalmark' => "\x{3036}", + 'circlewithlefthalfblack' => "\x{25D0}", + 'circlewithrighthalfblack' => "\x{25D1}", + 'circumflexbelowcmb' => "\x{032D}", + 'circumflexcmb' => "\x{0302}", + 'clear' => "\x{2327}", + 'clickalveolar' => "\x{01C2}", + 'clickdental' => "\x{01C0}", + 'clicklateral' => "\x{01C1}", + 'clickretroflex' => "\x{01C3}", + 'clubsuitblack' => "\x{2663}", + 'clubsuitwhite' => "\x{2667}", + 'cmcubedsquare' => "\x{33A4}", + 'cmonospace' => "\x{FF43}", + 'cmsquaredsquare' => "\x{33A0}", + 'coarmenian' => "\x{0581}", + 'colonmonospace' => "\x{FF1A}", + 'colonsign' => "\x{20A1}", + 'colonsmall' => "\x{FE55}", + 'colontriangularhalfmod' => "\x{02D1}", + 'colontriangularmod' => "\x{02D0}", + 'commaabovecmb' => "\x{0313}", + 'commaaboverightcmb' => "\x{0315}", + 'commaaccent' => "\x{F6C3}", + 'commaarabic' => "\x{060C}", + 'commaarmenian' => "\x{055D}", + 'commainferior' => "\x{F6E1}", + 'commamonospace' => "\x{FF0C}", + 'commareversedabovecmb' => "\x{0314}", + 'commareversedmod' => "\x{02BD}", + 'commasmall' => "\x{FE50}", + 'commasuperior' => "\x{F6E2}", + 'commaturnedabovecmb' => "\x{0312}", + 'commaturnedmod' => "\x{02BB}", + 'compass' => "\x{263C}", + 'contourintegral' => "\x{222E}", + 'control' => "\x{2303}", + 'controlACK' => "\x{0006}", + 'controlBEL' => "\x{0007}", + 'controlBS' => "\x{0008}", + 'controlCAN' => "\x{0018}", + 'controlCR' => "\x{000D}", + 'controlDC1' => "\x{0011}", + 'controlDC2' => "\x{0012}", + 'controlDC3' => "\x{0013}", + 'controlDC4' => "\x{0014}", + 'controlDEL' => "\x{007F}", + 'controlDLE' => "\x{0010}", + 'controlEM' => "\x{0019}", + 'controlENQ' => "\x{0005}", + 'controlEOT' => "\x{0004}", + 'controlESC' => "\x{001B}", + 'controlETB' => "\x{0017}", + 'controlETX' => "\x{0003}", + 'controlFF' => "\x{000C}", + 'controlFS' => "\x{001C}", + 'controlGS' => "\x{001D}", + 'controlHT' => "\x{0009}", + 'controlLF' => "\x{000A}", + 'controlNAK' => "\x{0015}", + 'controlRS' => "\x{001E}", + 'controlSI' => "\x{000F}", + 'controlSO' => "\x{000E}", + 'controlSOT' => "\x{0002}", + 'controlSTX' => "\x{0001}", + 'controlSUB' => "\x{001A}", + 'controlSYN' => "\x{0016}", + 'controlUS' => "\x{001F}", + 'controlVT' => "\x{000B}", + 'copyrightsans' => "\x{F8E9}", + 'copyrightserif' => "\x{F6D9}", + 'cornerbracketleft' => "\x{300C}", + 'cornerbracketlefthalfwidth' => "\x{FF62}", + 'cornerbracketleftvertical' => "\x{FE41}", + 'cornerbracketright' => "\x{300D}", + 'cornerbracketrighthalfwidth' => "\x{FF63}", + 'cornerbracketrightvertical' => "\x{FE42}", + 'corporationsquare' => "\x{337F}", + 'cosquare' => "\x{33C7}", + 'coverkgsquare' => "\x{33C6}", + 'cparen' => "\x{249E}", + 'cruzeiro' => "\x{20A2}", + 'cstretched' => "\x{0297}", + 'curlyand' => "\x{22CF}", + 'curlyor' => "\x{22CE}", + 'cyrBreve' => "\x{F6D1}", + 'cyrFlex' => "\x{F6D2}", + 'cyrbreve' => "\x{F6D4}", + 'cyrflex' => "\x{F6D5}", + 'daarmenian' => "\x{0564}", + 'dabengali' => "\x{09A6}", + 'dadarabic' => "\x{0636}", + 'dadeva' => "\x{0926}", + 'dadfinalarabic' => "\x{FEBE}", + 'dadinitialarabic' => "\x{FEBF}", + 'dadmedialarabic' => "\x{FEC0}", + 'dagesh' => "\x{05BC}", + 'dageshhebrew' => "\x{05BC}", + 'dagujarati' => "\x{0AA6}", + 'dagurmukhi' => "\x{0A26}", + 'dahiragana' => "\x{3060}", + 'dakatakana' => "\x{30C0}", + 'dalarabic' => "\x{062F}", + 'dalet' => "\x{05D3}", + 'daletdagesh' => "\x{FB33}", + 'daletdageshhebrew' => "\x{FB33}", + 'dalethatafpatah' => "\x{05D3}\x{05B2}", + 'dalethatafpatahhebrew' => "\x{05D3}\x{05B2}", + 'dalethatafsegol' => "\x{05D3}\x{05B1}", + 'dalethatafsegolhebrew' => "\x{05D3}\x{05B1}", + 'dalethebrew' => "\x{05D3}", + 'dalethiriq' => "\x{05D3}\x{05B4}", + 'dalethiriqhebrew' => "\x{05D3}\x{05B4}", + 'daletholam' => "\x{05D3}\x{05B9}", + 'daletholamhebrew' => "\x{05D3}\x{05B9}", + 'daletpatah' => "\x{05D3}\x{05B7}", + 'daletpatahhebrew' => "\x{05D3}\x{05B7}", + 'daletqamats' => "\x{05D3}\x{05B8}", + 'daletqamatshebrew' => "\x{05D3}\x{05B8}", + 'daletqubuts' => "\x{05D3}\x{05BB}", + 'daletqubutshebrew' => "\x{05D3}\x{05BB}", + 'daletsegol' => "\x{05D3}\x{05B6}", + 'daletsegolhebrew' => "\x{05D3}\x{05B6}", + 'daletsheva' => "\x{05D3}\x{05B0}", + 'daletshevahebrew' => "\x{05D3}\x{05B0}", + 'dalettsere' => "\x{05D3}\x{05B5}", + 'dalettserehebrew' => "\x{05D3}\x{05B5}", + 'dalfinalarabic' => "\x{FEAA}", + 'dammaarabic' => "\x{064F}", + 'dammalowarabic' => "\x{064F}", + 'dammatanaltonearabic' => "\x{064C}", + 'dammatanarabic' => "\x{064C}", + 'danda' => "\x{0964}", + 'dargahebrew' => "\x{05A7}", + 'dargalefthebrew' => "\x{05A7}", + 'dasiapneumatacyrilliccmb' => "\x{0485}", + 'dblGrave' => "\x{F6D3}", + 'dblanglebracketleft' => "\x{300A}", + 'dblanglebracketleftvertical' => "\x{FE3D}", + 'dblanglebracketright' => "\x{300B}", + 'dblanglebracketrightvertical' => "\x{FE3E}", + 'dblarchinvertedbelowcmb' => "\x{032B}", + 'dblarrowleft' => "\x{21D4}", + 'dblarrowright' => "\x{21D2}", + 'dbldanda' => "\x{0965}", + 'dblgrave' => "\x{F6D6}", + 'dblgravecmb' => "\x{030F}", + 'dblintegral' => "\x{222C}", + 'dbllowline' => "\x{2017}", + 'dbllowlinecmb' => "\x{0333}", + 'dbloverlinecmb' => "\x{033F}", + 'dblprimemod' => "\x{02BA}", + 'dblverticalbar' => "\x{2016}", + 'dblverticallineabovecmb' => "\x{030E}", + 'dbopomofo' => "\x{3109}", + 'dbsquare' => "\x{33C8}", + 'dcedilla' => "\x{1E11}", + 'dcircle' => "\x{24D3}", + 'dcircumflexbelow' => "\x{1E13}", + 'ddabengali' => "\x{09A1}", + 'ddadeva' => "\x{0921}", + 'ddagujarati' => "\x{0AA1}", + 'ddagurmukhi' => "\x{0A21}", + 'ddalarabic' => "\x{0688}", + 'ddalfinalarabic' => "\x{FB89}", + 'dddhadeva' => "\x{095C}", + 'ddhabengali' => "\x{09A2}", + 'ddhadeva' => "\x{0922}", + 'ddhagujarati' => "\x{0AA2}", + 'ddhagurmukhi' => "\x{0A22}", + 'ddotaccent' => "\x{1E0B}", + 'ddotbelow' => "\x{1E0D}", + 'decimalseparatorarabic' => "\x{066B}", + 'decimalseparatorpersian' => "\x{066B}", + 'decyrillic' => "\x{0434}", + 'dehihebrew' => "\x{05AD}", + 'dehiragana' => "\x{3067}", + 'deicoptic' => "\x{03EF}", + 'dekatakana' => "\x{30C7}", + 'deleteleft' => "\x{232B}", + 'deleteright' => "\x{2326}", + 'deltaturned' => "\x{018D}", + 'denominatorminusonenumeratorbengali' => "\x{09F8}", + 'dezh' => "\x{02A4}", + 'dhabengali' => "\x{09A7}", + 'dhadeva' => "\x{0927}", + 'dhagujarati' => "\x{0AA7}", + 'dhagurmukhi' => "\x{0A27}", + 'dhook' => "\x{0257}", + 'dialytikatonos' => "\x{0385}", + 'dialytikatonoscmb' => "\x{0344}", + 'diamondsuitwhite' => "\x{2662}", + 'dieresisacute' => "\x{F6D7}", + 'dieresisbelowcmb' => "\x{0324}", + 'dieresiscmb' => "\x{0308}", + 'dieresisgrave' => "\x{F6D8}", + 'dihiragana' => "\x{3062}", + 'dikatakana' => "\x{30C2}", + 'dittomark' => "\x{3003}", + 'divides' => "\x{2223}", + 'divisionslash' => "\x{2215}", + 'djecyrillic' => "\x{0452}", + 'dlinebelow' => "\x{1E0F}", + 'dlsquare' => "\x{3397}", + 'dmacron' => "\x{0111}", + 'dmonospace' => "\x{FF44}", + 'dochadathai' => "\x{0E0E}", + 'dodekthai' => "\x{0E14}", + 'dohiragana' => "\x{3069}", + 'dokatakana' => "\x{30C9}", + 'dollarinferior' => "\x{F6E3}", + 'dollarmonospace' => "\x{FF04}", + 'dollaroldstyle' => "\x{F724}", + 'dollarsmall' => "\x{FE69}", + 'dollarsuperior' => "\x{F6E4}", + 'dorusquare' => "\x{3326}", + 'dotaccentcmb' => "\x{0307}", + 'dotbelowcmb' => "\x{0323}", + 'dotkatakana' => "\x{30FB}", + 'dotlessj' => "\x{F6BE}", + 'dotlessjstrokehook' => "\x{0284}", + 'dottedcircle' => "\x{25CC}", + 'doubleyodpatah' => "\x{FB1F}", + 'doubleyodpatahhebrew' => "\x{FB1F}", + 'downtackbelowcmb' => "\x{031E}", + 'downtackmod' => "\x{02D5}", + 'dparen' => "\x{249F}", + 'dsuperior' => "\x{F6EB}", + 'dtail' => "\x{0256}", + 'dtopbar' => "\x{018C}", + 'duhiragana' => "\x{3065}", + 'dukatakana' => "\x{30C5}", + 'dz' => "\x{01F3}", + 'dzaltone' => "\x{02A3}", + 'dzcaron' => "\x{01C6}", + 'dzcurl' => "\x{02A5}", + 'dzeabkhasiancyrillic' => "\x{04E1}", + 'dzecyrillic' => "\x{0455}", + 'dzhecyrillic' => "\x{045F}", + 'earth' => "\x{2641}", + 'ebengali' => "\x{098F}", + 'ebopomofo' => "\x{311C}", + 'ecandradeva' => "\x{090D}", + 'ecandragujarati' => "\x{0A8D}", + 'ecandravowelsigndeva' => "\x{0945}", + 'ecandravowelsigngujarati' => "\x{0AC5}", + 'ecedillabreve' => "\x{1E1D}", + 'echarmenian' => "\x{0565}", + 'echyiwnarmenian' => "\x{0587}", + 'ecircle' => "\x{24D4}", + 'ecircumflexacute' => "\x{1EBF}", + 'ecircumflexbelow' => "\x{1E19}", + 'ecircumflexdotbelow' => "\x{1EC7}", + 'ecircumflexgrave' => "\x{1EC1}", + 'ecircumflexhookabove' => "\x{1EC3}", + 'ecircumflextilde' => "\x{1EC5}", + 'ecyrillic' => "\x{0454}", + 'edblgrave' => "\x{0205}", + 'edeva' => "\x{090F}", + 'edot' => "\x{0117}", + 'edotbelow' => "\x{1EB9}", + 'eegurmukhi' => "\x{0A0F}", + 'eematragurmukhi' => "\x{0A47}", + 'efcyrillic' => "\x{0444}", + 'egujarati' => "\x{0A8F}", + 'eharmenian' => "\x{0567}", + 'ehbopomofo' => "\x{311D}", + 'ehiragana' => "\x{3048}", + 'ehookabove' => "\x{1EBB}", + 'eibopomofo' => "\x{311F}", + 'eightarabic' => "\x{0668}", + 'eightbengali' => "\x{09EE}", + 'eightcircle' => "\x{2467}", + 'eightcircleinversesansserif' => "\x{2791}", + 'eightdeva' => "\x{096E}", + 'eighteencircle' => "\x{2471}", + 'eighteenparen' => "\x{2485}", + 'eighteenperiod' => "\x{2499}", + 'eightgujarati' => "\x{0AEE}", + 'eightgurmukhi' => "\x{0A6E}", + 'eighthackarabic' => "\x{0668}", + 'eighthangzhou' => "\x{3028}", + 'eighthnotebeamed' => "\x{266B}", + 'eightideographicparen' => "\x{3227}", + 'eightinferior' => "\x{2088}", + 'eightmonospace' => "\x{FF18}", + 'eightoldstyle' => "\x{F738}", + 'eightparen' => "\x{247B}", + 'eightperiod' => "\x{248F}", + 'eightpersian' => "\x{06F8}", + 'eightroman' => "\x{2177}", + 'eightsuperior' => "\x{2078}", + 'eightthai' => "\x{0E58}", + 'einvertedbreve' => "\x{0207}", + 'eiotifiedcyrillic' => "\x{0465}", + 'ekatakana' => "\x{30A8}", + 'ekatakanahalfwidth' => "\x{FF74}", + 'ekonkargurmukhi' => "\x{0A74}", + 'ekorean' => "\x{3154}", + 'elcyrillic' => "\x{043B}", + 'elevencircle' => "\x{246A}", + 'elevenparen' => "\x{247E}", + 'elevenperiod' => "\x{2492}", + 'elevenroman' => "\x{217A}", + 'ellipsisvertical' => "\x{22EE}", + 'emacronacute' => "\x{1E17}", + 'emacrongrave' => "\x{1E15}", + 'emcyrillic' => "\x{043C}", + 'emdashvertical' => "\x{FE31}", + 'emonospace' => "\x{FF45}", + 'emphasismarkarmenian' => "\x{055B}", + 'enbopomofo' => "\x{3123}", + 'encyrillic' => "\x{043D}", + 'endashvertical' => "\x{FE32}", + 'endescendercyrillic' => "\x{04A3}", + 'engbopomofo' => "\x{3125}", + 'enghecyrillic' => "\x{04A5}", + 'enhookcyrillic' => "\x{04C8}", + 'enspace' => "\x{2002}", + 'eokorean' => "\x{3153}", + 'eopen' => "\x{025B}", + 'eopenclosed' => "\x{029A}", + 'eopenreversed' => "\x{025C}", + 'eopenreversedclosed' => "\x{025E}", + 'eopenreversedhook' => "\x{025D}", + 'eparen' => "\x{24A0}", + 'equalmonospace' => "\x{FF1D}", + 'equalsmall' => "\x{FE66}", + 'equalsuperior' => "\x{207C}", + 'erbopomofo' => "\x{3126}", + 'ercyrillic' => "\x{0440}", + 'ereversed' => "\x{0258}", + 'ereversedcyrillic' => "\x{044D}", + 'escyrillic' => "\x{0441}", + 'esdescendercyrillic' => "\x{04AB}", + 'esh' => "\x{0283}", + 'eshcurl' => "\x{0286}", + 'eshortdeva' => "\x{090E}", + 'eshortvowelsigndeva' => "\x{0946}", + 'eshreversedloop' => "\x{01AA}", + 'eshsquatreversed' => "\x{0285}", + 'esmallhiragana' => "\x{3047}", + 'esmallkatakana' => "\x{30A7}", + 'esmallkatakanahalfwidth' => "\x{FF6A}", + 'esuperior' => "\x{F6EC}", + 'etarmenian' => "\x{0568}", + 'etilde' => "\x{1EBD}", + 'etildebelow' => "\x{1E1B}", + 'etnahtafoukhhebrew' => "\x{0591}", + 'etnahtafoukhlefthebrew' => "\x{0591}", + 'etnahtahebrew' => "\x{0591}", + 'etnahtalefthebrew' => "\x{0591}", + 'eturned' => "\x{01DD}", + 'eukorean' => "\x{3161}", + 'euro' => "\x{20AC}", + 'evowelsignbengali' => "\x{09C7}", + 'evowelsigndeva' => "\x{0947}", + 'evowelsigngujarati' => "\x{0AC7}", + 'exclamarmenian' => "\x{055C}", + 'exclamdownsmall' => "\x{F7A1}", + 'exclammonospace' => "\x{FF01}", + 'exclamsmall' => "\x{F721}", + 'ezh' => "\x{0292}", + 'ezhcaron' => "\x{01EF}", + 'ezhcurl' => "\x{0293}", + 'ezhreversed' => "\x{01B9}", + 'ezhtail' => "\x{01BA}", + 'fadeva' => "\x{095E}", + 'fagurmukhi' => "\x{0A5E}", + 'fahrenheit' => "\x{2109}", + 'fathaarabic' => "\x{064E}", + 'fathalowarabic' => "\x{064E}", + 'fathatanarabic' => "\x{064B}", + 'fbopomofo' => "\x{3108}", + 'fcircle' => "\x{24D5}", + 'fdotaccent' => "\x{1E1F}", + 'feharabic' => "\x{0641}", + 'feharmenian' => "\x{0586}", + 'fehfinalarabic' => "\x{FED2}", + 'fehinitialarabic' => "\x{FED3}", + 'fehmedialarabic' => "\x{FED4}", + 'feicoptic' => "\x{03E5}", + 'fifteencircle' => "\x{246E}", + 'fifteenparen' => "\x{2482}", + 'fifteenperiod' => "\x{2496}", + 'finalkaf' => "\x{05DA}", + 'finalkafdagesh' => "\x{FB3A}", + 'finalkafdageshhebrew' => "\x{FB3A}", + 'finalkafhebrew' => "\x{05DA}", + 'finalkafqamats' => "\x{05DA}\x{05B8}", + 'finalkafqamatshebrew' => "\x{05DA}\x{05B8}", + 'finalkafsheva' => "\x{05DA}\x{05B0}", + 'finalkafshevahebrew' => "\x{05DA}\x{05B0}", + 'finalmem' => "\x{05DD}", + 'finalmemhebrew' => "\x{05DD}", + 'finalnun' => "\x{05DF}", + 'finalnunhebrew' => "\x{05DF}", + 'finalpe' => "\x{05E3}", + 'finalpehebrew' => "\x{05E3}", + 'finaltsadi' => "\x{05E5}", + 'finaltsadihebrew' => "\x{05E5}", + 'firsttonechinese' => "\x{02C9}", + 'fisheye' => "\x{25C9}", + 'fitacyrillic' => "\x{0473}", + 'fivearabic' => "\x{0665}", + 'fivebengali' => "\x{09EB}", + 'fivecircle' => "\x{2464}", + 'fivecircleinversesansserif' => "\x{278E}", + 'fivedeva' => "\x{096B}", + 'fivegujarati' => "\x{0AEB}", + 'fivegurmukhi' => "\x{0A6B}", + 'fivehackarabic' => "\x{0665}", + 'fivehangzhou' => "\x{3025}", + 'fiveideographicparen' => "\x{3224}", + 'fiveinferior' => "\x{2085}", + 'fivemonospace' => "\x{FF15}", + 'fiveoldstyle' => "\x{F735}", + 'fiveparen' => "\x{2478}", + 'fiveperiod' => "\x{248C}", + 'fivepersian' => "\x{06F5}", + 'fiveroman' => "\x{2174}", + 'fivesuperior' => "\x{2075}", + 'fivethai' => "\x{0E55}", + 'fmonospace' => "\x{FF46}", + 'fmsquare' => "\x{3399}", + 'fofanthai' => "\x{0E1F}", + 'fofathai' => "\x{0E1D}", + 'fongmanthai' => "\x{0E4F}", + 'forall' => "\x{2200}", + 'fourarabic' => "\x{0664}", + 'fourbengali' => "\x{09EA}", + 'fourcircle' => "\x{2463}", + 'fourcircleinversesansserif' => "\x{278D}", + 'fourdeva' => "\x{096A}", + 'fourgujarati' => "\x{0AEA}", + 'fourgurmukhi' => "\x{0A6A}", + 'fourhackarabic' => "\x{0664}", + 'fourhangzhou' => "\x{3024}", + 'fourideographicparen' => "\x{3223}", + 'fourinferior' => "\x{2084}", + 'fourmonospace' => "\x{FF14}", + 'fournumeratorbengali' => "\x{09F7}", + 'fouroldstyle' => "\x{F734}", + 'fourparen' => "\x{2477}", + 'fourperiod' => "\x{248B}", + 'fourpersian' => "\x{06F4}", + 'fourroman' => "\x{2173}", + 'foursuperior' => "\x{2074}", + 'fourteencircle' => "\x{246D}", + 'fourteenparen' => "\x{2481}", + 'fourteenperiod' => "\x{2495}", + 'fourthai' => "\x{0E54}", + 'fourthtonechinese' => "\x{02CB}", + 'fparen' => "\x{24A1}", + 'gabengali' => "\x{0997}", + 'gacute' => "\x{01F5}", + 'gadeva' => "\x{0917}", + 'gafarabic' => "\x{06AF}", + 'gaffinalarabic' => "\x{FB93}", + 'gafinitialarabic' => "\x{FB94}", + 'gafmedialarabic' => "\x{FB95}", + 'gagujarati' => "\x{0A97}", + 'gagurmukhi' => "\x{0A17}", + 'gahiragana' => "\x{304C}", + 'gakatakana' => "\x{30AC}", + 'gammalatinsmall' => "\x{0263}", + 'gammasuperior' => "\x{02E0}", + 'gangiacoptic' => "\x{03EB}", + 'gbopomofo' => "\x{310D}", + 'gcedilla' => "\x{0123}", + 'gcircle' => "\x{24D6}", + 'gdot' => "\x{0121}", + 'gecyrillic' => "\x{0433}", + 'gehiragana' => "\x{3052}", + 'gekatakana' => "\x{30B2}", + 'geometricallyequal' => "\x{2251}", + 'gereshaccenthebrew' => "\x{059C}", + 'gereshhebrew' => "\x{05F3}", + 'gereshmuqdamhebrew' => "\x{059D}", + 'gershayimaccenthebrew' => "\x{059E}", + 'gershayimhebrew' => "\x{05F4}", + 'getamark' => "\x{3013}", + 'ghabengali' => "\x{0998}", + 'ghadarmenian' => "\x{0572}", + 'ghadeva' => "\x{0918}", + 'ghagujarati' => "\x{0A98}", + 'ghagurmukhi' => "\x{0A18}", + 'ghainarabic' => "\x{063A}", + 'ghainfinalarabic' => "\x{FECE}", + 'ghaininitialarabic' => "\x{FECF}", + 'ghainmedialarabic' => "\x{FED0}", + 'ghemiddlehookcyrillic' => "\x{0495}", + 'ghestrokecyrillic' => "\x{0493}", + 'gheupturncyrillic' => "\x{0491}", + 'ghhadeva' => "\x{095A}", + 'ghhagurmukhi' => "\x{0A5A}", + 'ghook' => "\x{0260}", + 'ghzsquare' => "\x{3393}", + 'gihiragana' => "\x{304E}", + 'gikatakana' => "\x{30AE}", + 'gimarmenian' => "\x{0563}", + 'gimel' => "\x{05D2}", + 'gimeldagesh' => "\x{FB32}", + 'gimeldageshhebrew' => "\x{FB32}", + 'gimelhebrew' => "\x{05D2}", + 'gjecyrillic' => "\x{0453}", + 'glottalinvertedstroke' => "\x{01BE}", + 'glottalstop' => "\x{0294}", + 'glottalstopinverted' => "\x{0296}", + 'glottalstopmod' => "\x{02C0}", + 'glottalstopreversed' => "\x{0295}", + 'glottalstopreversedmod' => "\x{02C1}", + 'glottalstopreversedsuperior' => "\x{02E4}", + 'glottalstopstroke' => "\x{02A1}", + 'glottalstopstrokereversed' => "\x{02A2}", + 'gmacron' => "\x{1E21}", + 'gmonospace' => "\x{FF47}", + 'gohiragana' => "\x{3054}", + 'gokatakana' => "\x{30B4}", + 'gparen' => "\x{24A2}", + 'gpasquare' => "\x{33AC}", + 'gravebelowcmb' => "\x{0316}", + 'gravecmb' => "\x{0300}", + 'gravedeva' => "\x{0953}", + 'gravelowmod' => "\x{02CE}", + 'gravemonospace' => "\x{FF40}", + 'gravetonecmb' => "\x{0340}", + 'greaterequalorless' => "\x{22DB}", + 'greatermonospace' => "\x{FF1E}", + 'greaterorequivalent' => "\x{2273}", + 'greaterorless' => "\x{2277}", + 'greateroverequal' => "\x{2267}", + 'greatersmall' => "\x{FE65}", + 'gscript' => "\x{0261}", + 'gstroke' => "\x{01E5}", + 'guhiragana' => "\x{3050}", + 'gukatakana' => "\x{30B0}", + 'guramusquare' => "\x{3318}", + 'gysquare' => "\x{33C9}", + 'haabkhasiancyrillic' => "\x{04A9}", + 'haaltonearabic' => "\x{06C1}", + 'habengali' => "\x{09B9}", + 'hadescendercyrillic' => "\x{04B3}", + 'hadeva' => "\x{0939}", + 'hagujarati' => "\x{0AB9}", + 'hagurmukhi' => "\x{0A39}", + 'haharabic' => "\x{062D}", + 'hahfinalarabic' => "\x{FEA2}", + 'hahinitialarabic' => "\x{FEA3}", + 'hahiragana' => "\x{306F}", + 'hahmedialarabic' => "\x{FEA4}", + 'haitusquare' => "\x{332A}", + 'hakatakana' => "\x{30CF}", + 'hakatakanahalfwidth' => "\x{FF8A}", + 'halantgurmukhi' => "\x{0A4D}", + 'hamzaarabic' => "\x{0621}", + 'hamzadammaarabic' => "\x{0621}\x{064F}", + 'hamzadammatanarabic' => "\x{0621}\x{064C}", + 'hamzafathaarabic' => "\x{0621}\x{064E}", + 'hamzafathatanarabic' => "\x{0621}\x{064B}", + 'hamzalowarabic' => "\x{0621}", + 'hamzalowkasraarabic' => "\x{0621}\x{0650}", + 'hamzalowkasratanarabic' => "\x{0621}\x{064D}", + 'hamzasukunarabic' => "\x{0621}\x{0652}", + 'hangulfiller' => "\x{3164}", + 'hardsigncyrillic' => "\x{044A}", + 'harpoonleftbarbup' => "\x{21BC}", + 'harpoonrightbarbup' => "\x{21C0}", + 'hasquare' => "\x{33CA}", + 'hatafpatah' => "\x{05B2}", + 'hatafpatah16' => "\x{05B2}", + 'hatafpatah23' => "\x{05B2}", + 'hatafpatah2f' => "\x{05B2}", + 'hatafpatahhebrew' => "\x{05B2}", + 'hatafpatahnarrowhebrew' => "\x{05B2}", + 'hatafpatahquarterhebrew' => "\x{05B2}", + 'hatafpatahwidehebrew' => "\x{05B2}", + 'hatafqamats' => "\x{05B3}", + 'hatafqamats1b' => "\x{05B3}", + 'hatafqamats28' => "\x{05B3}", + 'hatafqamats34' => "\x{05B3}", + 'hatafqamatshebrew' => "\x{05B3}", + 'hatafqamatsnarrowhebrew' => "\x{05B3}", + 'hatafqamatsquarterhebrew' => "\x{05B3}", + 'hatafqamatswidehebrew' => "\x{05B3}", + 'hatafsegol' => "\x{05B1}", + 'hatafsegol17' => "\x{05B1}", + 'hatafsegol24' => "\x{05B1}", + 'hatafsegol30' => "\x{05B1}", + 'hatafsegolhebrew' => "\x{05B1}", + 'hatafsegolnarrowhebrew' => "\x{05B1}", + 'hatafsegolquarterhebrew' => "\x{05B1}", + 'hatafsegolwidehebrew' => "\x{05B1}", + 'hbopomofo' => "\x{310F}", + 'hbrevebelow' => "\x{1E2B}", + 'hcedilla' => "\x{1E29}", + 'hcircle' => "\x{24D7}", + 'hdieresis' => "\x{1E27}", + 'hdotaccent' => "\x{1E23}", + 'hdotbelow' => "\x{1E25}", + 'he' => "\x{05D4}", + 'heartsuitblack' => "\x{2665}", + 'heartsuitwhite' => "\x{2661}", + 'hedagesh' => "\x{FB34}", + 'hedageshhebrew' => "\x{FB34}", + 'hehaltonearabic' => "\x{06C1}", + 'heharabic' => "\x{0647}", + 'hehebrew' => "\x{05D4}", + 'hehfinalaltonearabic' => "\x{FBA7}", + 'hehfinalalttwoarabic' => "\x{FEEA}", + 'hehfinalarabic' => "\x{FEEA}", + 'hehhamzaabovefinalarabic' => "\x{FBA5}", + 'hehhamzaaboveisolatedarabic' => "\x{FBA4}", + 'hehinitialaltonearabic' => "\x{FBA8}", + 'hehinitialarabic' => "\x{FEEB}", + 'hehiragana' => "\x{3078}", + 'hehmedialaltonearabic' => "\x{FBA9}", + 'hehmedialarabic' => "\x{FEEC}", + 'heiseierasquare' => "\x{337B}", + 'hekatakana' => "\x{30D8}", + 'hekatakanahalfwidth' => "\x{FF8D}", + 'hekutaarusquare' => "\x{3336}", + 'henghook' => "\x{0267}", + 'herutusquare' => "\x{3339}", + 'het' => "\x{05D7}", + 'hethebrew' => "\x{05D7}", + 'hhook' => "\x{0266}", + 'hhooksuperior' => "\x{02B1}", + 'hieuhacirclekorean' => "\x{327B}", + 'hieuhaparenkorean' => "\x{321B}", + 'hieuhcirclekorean' => "\x{326D}", + 'hieuhkorean' => "\x{314E}", + 'hieuhparenkorean' => "\x{320D}", + 'hihiragana' => "\x{3072}", + 'hikatakana' => "\x{30D2}", + 'hikatakanahalfwidth' => "\x{FF8B}", + 'hiriq' => "\x{05B4}", + 'hiriq14' => "\x{05B4}", + 'hiriq21' => "\x{05B4}", + 'hiriq2d' => "\x{05B4}", + 'hiriqhebrew' => "\x{05B4}", + 'hiriqnarrowhebrew' => "\x{05B4}", + 'hiriqquarterhebrew' => "\x{05B4}", + 'hiriqwidehebrew' => "\x{05B4}", + 'hlinebelow' => "\x{1E96}", + 'hmonospace' => "\x{FF48}", + 'hoarmenian' => "\x{0570}", + 'hohipthai' => "\x{0E2B}", + 'hohiragana' => "\x{307B}", + 'hokatakana' => "\x{30DB}", + 'hokatakanahalfwidth' => "\x{FF8E}", + 'holam' => "\x{05B9}", + 'holam19' => "\x{05B9}", + 'holam26' => "\x{05B9}", + 'holam32' => "\x{05B9}", + 'holamhebrew' => "\x{05B9}", + 'holamnarrowhebrew' => "\x{05B9}", + 'holamquarterhebrew' => "\x{05B9}", + 'holamwidehebrew' => "\x{05B9}", + 'honokhukthai' => "\x{0E2E}", + 'hookcmb' => "\x{0309}", + 'hookpalatalizedbelowcmb' => "\x{0321}", + 'hookretroflexbelowcmb' => "\x{0322}", + 'hoonsquare' => "\x{3342}", + 'horicoptic' => "\x{03E9}", + 'horizontalbar' => "\x{2015}", + 'horncmb' => "\x{031B}", + 'hotsprings' => "\x{2668}", + 'hparen' => "\x{24A3}", + 'hsuperior' => "\x{02B0}", + 'hturned' => "\x{0265}", + 'huhiragana' => "\x{3075}", + 'huiitosquare' => "\x{3333}", + 'hukatakana' => "\x{30D5}", + 'hukatakanahalfwidth' => "\x{FF8C}", + 'hungarumlautcmb' => "\x{030B}", + 'hv' => "\x{0195}", + 'hypheninferior' => "\x{F6E5}", + 'hyphenmonospace' => "\x{FF0D}", + 'hyphensmall' => "\x{FE63}", + 'hyphensuperior' => "\x{F6E6}", + 'hyphentwo' => "\x{2010}", + 'iacyrillic' => "\x{044F}", + 'ibengali' => "\x{0987}", + 'ibopomofo' => "\x{3127}", + 'icaron' => "\x{01D0}", + 'icircle' => "\x{24D8}", + 'icyrillic' => "\x{0456}", + 'idblgrave' => "\x{0209}", + 'ideographearthcircle' => "\x{328F}", + 'ideographfirecircle' => "\x{328B}", + 'ideographicallianceparen' => "\x{323F}", + 'ideographiccallparen' => "\x{323A}", + 'ideographiccentrecircle' => "\x{32A5}", + 'ideographicclose' => "\x{3006}", + 'ideographiccomma' => "\x{3001}", + 'ideographiccommaleft' => "\x{FF64}", + 'ideographiccongratulationparen' => "\x{3237}", + 'ideographiccorrectcircle' => "\x{32A3}", + 'ideographicearthparen' => "\x{322F}", + 'ideographicenterpriseparen' => "\x{323D}", + 'ideographicexcellentcircle' => "\x{329D}", + 'ideographicfestivalparen' => "\x{3240}", + 'ideographicfinancialcircle' => "\x{3296}", + 'ideographicfinancialparen' => "\x{3236}", + 'ideographicfireparen' => "\x{322B}", + 'ideographichaveparen' => "\x{3232}", + 'ideographichighcircle' => "\x{32A4}", + 'ideographiciterationmark' => "\x{3005}", + 'ideographiclaborcircle' => "\x{3298}", + 'ideographiclaborparen' => "\x{3238}", + 'ideographicleftcircle' => "\x{32A7}", + 'ideographiclowcircle' => "\x{32A6}", + 'ideographicmedicinecircle' => "\x{32A9}", + 'ideographicmetalparen' => "\x{322E}", + 'ideographicmoonparen' => "\x{322A}", + 'ideographicnameparen' => "\x{3234}", + 'ideographicperiod' => "\x{3002}", + 'ideographicprintcircle' => "\x{329E}", + 'ideographicreachparen' => "\x{3243}", + 'ideographicrepresentparen' => "\x{3239}", + 'ideographicresourceparen' => "\x{323E}", + 'ideographicrightcircle' => "\x{32A8}", + 'ideographicsecretcircle' => "\x{3299}", + 'ideographicselfparen' => "\x{3242}", + 'ideographicsocietyparen' => "\x{3233}", + 'ideographicspace' => "\x{3000}", + 'ideographicspecialparen' => "\x{3235}", + 'ideographicstockparen' => "\x{3231}", + 'ideographicstudyparen' => "\x{323B}", + 'ideographicsunparen' => "\x{3230}", + 'ideographicsuperviseparen' => "\x{323C}", + 'ideographicwaterparen' => "\x{322C}", + 'ideographicwoodparen' => "\x{322D}", + 'ideographiczero' => "\x{3007}", + 'ideographmetalcircle' => "\x{328E}", + 'ideographmooncircle' => "\x{328A}", + 'ideographnamecircle' => "\x{3294}", + 'ideographsuncircle' => "\x{3290}", + 'ideographwatercircle' => "\x{328C}", + 'ideographwoodcircle' => "\x{328D}", + 'ideva' => "\x{0907}", + 'idieresisacute' => "\x{1E2F}", + 'idieresiscyrillic' => "\x{04E5}", + 'idotbelow' => "\x{1ECB}", + 'iebrevecyrillic' => "\x{04D7}", + 'iecyrillic' => "\x{0435}", + 'ieungacirclekorean' => "\x{3275}", + 'ieungaparenkorean' => "\x{3215}", + 'ieungcirclekorean' => "\x{3267}", + 'ieungkorean' => "\x{3147}", + 'ieungparenkorean' => "\x{3207}", + 'igujarati' => "\x{0A87}", + 'igurmukhi' => "\x{0A07}", + 'ihiragana' => "\x{3044}", + 'ihookabove' => "\x{1EC9}", + 'iibengali' => "\x{0988}", + 'iicyrillic' => "\x{0438}", + 'iideva' => "\x{0908}", + 'iigujarati' => "\x{0A88}", + 'iigurmukhi' => "\x{0A08}", + 'iimatragurmukhi' => "\x{0A40}", + 'iinvertedbreve' => "\x{020B}", + 'iishortcyrillic' => "\x{0439}", + 'iivowelsignbengali' => "\x{09C0}", + 'iivowelsigndeva' => "\x{0940}", + 'iivowelsigngujarati' => "\x{0AC0}", + 'ikatakana' => "\x{30A4}", + 'ikatakanahalfwidth' => "\x{FF72}", + 'ikorean' => "\x{3163}", + 'ilde' => "\x{02DC}", + 'iluyhebrew' => "\x{05AC}", + 'imacroncyrillic' => "\x{04E3}", + 'imageorapproximatelyequal' => "\x{2253}", + 'imatragurmukhi' => "\x{0A3F}", + 'imonospace' => "\x{FF49}", + 'increment' => "\x{2206}", + 'iniarmenian' => "\x{056B}", + 'integralbottom' => "\x{2321}", + 'integralex' => "\x{F8F5}", + 'integraltop' => "\x{2320}", + 'intisquare' => "\x{3305}", + 'iocyrillic' => "\x{0451}", + 'iotalatin' => "\x{0269}", + 'iparen' => "\x{24A4}", + 'irigurmukhi' => "\x{0A72}", + 'ismallhiragana' => "\x{3043}", + 'ismallkatakana' => "\x{30A3}", + 'ismallkatakanahalfwidth' => "\x{FF68}", + 'issharbengali' => "\x{09FA}", + 'istroke' => "\x{0268}", + 'isuperior' => "\x{F6ED}", + 'iterationhiragana' => "\x{309D}", + 'iterationkatakana' => "\x{30FD}", + 'itildebelow' => "\x{1E2D}", + 'iubopomofo' => "\x{3129}", + 'iucyrillic' => "\x{044E}", + 'ivowelsignbengali' => "\x{09BF}", + 'ivowelsigndeva' => "\x{093F}", + 'ivowelsigngujarati' => "\x{0ABF}", + 'izhitsacyrillic' => "\x{0475}", + 'izhitsadblgravecyrillic' => "\x{0477}", + 'jaarmenian' => "\x{0571}", + 'jabengali' => "\x{099C}", + 'jadeva' => "\x{091C}", + 'jagujarati' => "\x{0A9C}", + 'jagurmukhi' => "\x{0A1C}", + 'jbopomofo' => "\x{3110}", + 'jcaron' => "\x{01F0}", + 'jcircle' => "\x{24D9}", + 'jcrossedtail' => "\x{029D}", + 'jdotlessstroke' => "\x{025F}", + 'jecyrillic' => "\x{0458}", + 'jeemarabic' => "\x{062C}", + 'jeemfinalarabic' => "\x{FE9E}", + 'jeeminitialarabic' => "\x{FE9F}", + 'jeemmedialarabic' => "\x{FEA0}", + 'jeharabic' => "\x{0698}", + 'jehfinalarabic' => "\x{FB8B}", + 'jhabengali' => "\x{099D}", + 'jhadeva' => "\x{091D}", + 'jhagujarati' => "\x{0A9D}", + 'jhagurmukhi' => "\x{0A1D}", + 'jheharmenian' => "\x{057B}", + 'jis' => "\x{3004}", + 'jmonospace' => "\x{FF4A}", + 'jparen' => "\x{24A5}", + 'jsuperior' => "\x{02B2}", + 'kabashkircyrillic' => "\x{04A1}", + 'kabengali' => "\x{0995}", + 'kacute' => "\x{1E31}", + 'kacyrillic' => "\x{043A}", + 'kadescendercyrillic' => "\x{049B}", + 'kadeva' => "\x{0915}", + 'kaf' => "\x{05DB}", + 'kafarabic' => "\x{0643}", + 'kafdagesh' => "\x{FB3B}", + 'kafdageshhebrew' => "\x{FB3B}", + 'kaffinalarabic' => "\x{FEDA}", + 'kafhebrew' => "\x{05DB}", + 'kafinitialarabic' => "\x{FEDB}", + 'kafmedialarabic' => "\x{FEDC}", + 'kafrafehebrew' => "\x{FB4D}", + 'kagujarati' => "\x{0A95}", + 'kagurmukhi' => "\x{0A15}", + 'kahiragana' => "\x{304B}", + 'kahookcyrillic' => "\x{04C4}", + 'kakatakana' => "\x{30AB}", + 'kakatakanahalfwidth' => "\x{FF76}", + 'kappasymbolgreek' => "\x{03F0}", + 'kapyeounmieumkorean' => "\x{3171}", + 'kapyeounphieuphkorean' => "\x{3184}", + 'kapyeounpieupkorean' => "\x{3178}", + 'kapyeounssangpieupkorean' => "\x{3179}", + 'karoriisquare' => "\x{330D}", + 'kashidaautoarabic' => "\x{0640}", + 'kashidaautonosidebearingarabic' => "\x{0640}", + 'kasmallkatakana' => "\x{30F5}", + 'kasquare' => "\x{3384}", + 'kasraarabic' => "\x{0650}", + 'kasratanarabic' => "\x{064D}", + 'kastrokecyrillic' => "\x{049F}", + 'katahiraprolongmarkhalfwidth' => "\x{FF70}", + 'kaverticalstrokecyrillic' => "\x{049D}", + 'kbopomofo' => "\x{310E}", + 'kcalsquare' => "\x{3389}", + 'kcaron' => "\x{01E9}", + 'kcedilla' => "\x{0137}", + 'kcircle' => "\x{24DA}", + 'kdotbelow' => "\x{1E33}", + 'keharmenian' => "\x{0584}", + 'kehiragana' => "\x{3051}", + 'kekatakana' => "\x{30B1}", + 'kekatakanahalfwidth' => "\x{FF79}", + 'kenarmenian' => "\x{056F}", + 'kesmallkatakana' => "\x{30F6}", + 'khabengali' => "\x{0996}", + 'khacyrillic' => "\x{0445}", + 'khadeva' => "\x{0916}", + 'khagujarati' => "\x{0A96}", + 'khagurmukhi' => "\x{0A16}", + 'khaharabic' => "\x{062E}", + 'khahfinalarabic' => "\x{FEA6}", + 'khahinitialarabic' => "\x{FEA7}", + 'khahmedialarabic' => "\x{FEA8}", + 'kheicoptic' => "\x{03E7}", + 'khhadeva' => "\x{0959}", + 'khhagurmukhi' => "\x{0A59}", + 'khieukhacirclekorean' => "\x{3278}", + 'khieukhaparenkorean' => "\x{3218}", + 'khieukhcirclekorean' => "\x{326A}", + 'khieukhkorean' => "\x{314B}", + 'khieukhparenkorean' => "\x{320A}", + 'khokhaithai' => "\x{0E02}", + 'khokhonthai' => "\x{0E05}", + 'khokhuatthai' => "\x{0E03}", + 'khokhwaithai' => "\x{0E04}", + 'khomutthai' => "\x{0E5B}", + 'khook' => "\x{0199}", + 'khorakhangthai' => "\x{0E06}", + 'khzsquare' => "\x{3391}", + 'kihiragana' => "\x{304D}", + 'kikatakana' => "\x{30AD}", + 'kikatakanahalfwidth' => "\x{FF77}", + 'kiroguramusquare' => "\x{3315}", + 'kiromeetorusquare' => "\x{3316}", + 'kirosquare' => "\x{3314}", + 'kiyeokacirclekorean' => "\x{326E}", + 'kiyeokaparenkorean' => "\x{320E}", + 'kiyeokcirclekorean' => "\x{3260}", + 'kiyeokkorean' => "\x{3131}", + 'kiyeokparenkorean' => "\x{3200}", + 'kiyeoksioskorean' => "\x{3133}", + 'kjecyrillic' => "\x{045C}", + 'klinebelow' => "\x{1E35}", + 'klsquare' => "\x{3398}", + 'kmcubedsquare' => "\x{33A6}", + 'kmonospace' => "\x{FF4B}", + 'kmsquaredsquare' => "\x{33A2}", + 'kohiragana' => "\x{3053}", + 'kohmsquare' => "\x{33C0}", + 'kokaithai' => "\x{0E01}", + 'kokatakana' => "\x{30B3}", + 'kokatakanahalfwidth' => "\x{FF7A}", + 'kooposquare' => "\x{331E}", + 'koppacyrillic' => "\x{0481}", + 'koreanstandardsymbol' => "\x{327F}", + 'koroniscmb' => "\x{0343}", + 'kparen' => "\x{24A6}", + 'kpasquare' => "\x{33AA}", + 'ksicyrillic' => "\x{046F}", + 'ktsquare' => "\x{33CF}", + 'kturned' => "\x{029E}", + 'kuhiragana' => "\x{304F}", + 'kukatakana' => "\x{30AF}", + 'kukatakanahalfwidth' => "\x{FF78}", + 'kvsquare' => "\x{33B8}", + 'kwsquare' => "\x{33BE}", + 'labengali' => "\x{09B2}", + 'ladeva' => "\x{0932}", + 'lagujarati' => "\x{0AB2}", + 'lagurmukhi' => "\x{0A32}", + 'lakkhangyaothai' => "\x{0E45}", + 'lamaleffinalarabic' => "\x{FEFC}", + 'lamalefhamzaabovefinalarabic' => "\x{FEF8}", + 'lamalefhamzaaboveisolatedarabic' => "\x{FEF7}", + 'lamalefhamzabelowfinalarabic' => "\x{FEFA}", + 'lamalefhamzabelowisolatedarabic' => "\x{FEF9}", + 'lamalefisolatedarabic' => "\x{FEFB}", + 'lamalefmaddaabovefinalarabic' => "\x{FEF6}", + 'lamalefmaddaaboveisolatedarabic' => "\x{FEF5}", + 'lamarabic' => "\x{0644}", + 'lambdastroke' => "\x{019B}", + 'lamed' => "\x{05DC}", + 'lameddagesh' => "\x{FB3C}", + 'lameddageshhebrew' => "\x{FB3C}", + 'lamedhebrew' => "\x{05DC}", + 'lamedholam' => "\x{05DC}\x{05B9}", + 'lamedholamdagesh' => "\x{05DC}\x{05B9}\x{05BC}", + 'lamedholamdageshhebrew' => "\x{05DC}\x{05B9}\x{05BC}", + 'lamedholamhebrew' => "\x{05DC}\x{05B9}", + 'lamfinalarabic' => "\x{FEDE}", + 'lamhahinitialarabic' => "\x{FCCA}", + 'laminitialarabic' => "\x{FEDF}", + 'lamjeeminitialarabic' => "\x{FCC9}", + 'lamkhahinitialarabic' => "\x{FCCB}", + 'lamlamhehisolatedarabic' => "\x{FDF2}", + 'lammedialarabic' => "\x{FEE0}", + 'lammeemhahinitialarabic' => "\x{FD88}", + 'lammeeminitialarabic' => "\x{FCCC}", + 'lammeemjeeminitialarabic' => "\x{FEDF}\x{FEE4}\x{FEA0}", + 'lammeemkhahinitialarabic' => "\x{FEDF}\x{FEE4}\x{FEA8}", + 'largecircle' => "\x{25EF}", + 'lbar' => "\x{019A}", + 'lbelt' => "\x{026C}", + 'lbopomofo' => "\x{310C}", + 'lcedilla' => "\x{013C}", + 'lcircle' => "\x{24DB}", + 'lcircumflexbelow' => "\x{1E3D}", + 'ldotaccent' => "\x{0140}", + 'ldotbelow' => "\x{1E37}", + 'ldotbelowmacron' => "\x{1E39}", + 'leftangleabovecmb' => "\x{031A}", + 'lefttackbelowcmb' => "\x{0318}", + 'lessequalorgreater' => "\x{22DA}", + 'lessmonospace' => "\x{FF1C}", + 'lessorequivalent' => "\x{2272}", + 'lessorgreater' => "\x{2276}", + 'lessoverequal' => "\x{2266}", + 'lesssmall' => "\x{FE64}", + 'lezh' => "\x{026E}", + 'lhookretroflex' => "\x{026D}", + 'liwnarmenian' => "\x{056C}", + 'lj' => "\x{01C9}", + 'ljecyrillic' => "\x{0459}", + 'll' => "\x{F6C0}", + 'lladeva' => "\x{0933}", + 'llagujarati' => "\x{0AB3}", + 'llinebelow' => "\x{1E3B}", + 'llladeva' => "\x{0934}", + 'llvocalicbengali' => "\x{09E1}", + 'llvocalicdeva' => "\x{0961}", + 'llvocalicvowelsignbengali' => "\x{09E3}", + 'llvocalicvowelsigndeva' => "\x{0963}", + 'lmiddletilde' => "\x{026B}", + 'lmonospace' => "\x{FF4C}", + 'lmsquare' => "\x{33D0}", + 'lochulathai' => "\x{0E2C}", + 'logicalnotreversed' => "\x{2310}", + 'lolingthai' => "\x{0E25}", + 'lowlinecenterline' => "\x{FE4E}", + 'lowlinecmb' => "\x{0332}", + 'lowlinedashed' => "\x{FE4D}", + 'lparen' => "\x{24A7}", + 'lsquare' => "\x{2113}", + 'lsuperior' => "\x{F6EE}", + 'luthai' => "\x{0E26}", + 'lvocalicbengali' => "\x{098C}", + 'lvocalicdeva' => "\x{090C}", + 'lvocalicvowelsignbengali' => "\x{09E2}", + 'lvocalicvowelsigndeva' => "\x{0962}", + 'lxsquare' => "\x{33D3}", + 'mabengali' => "\x{09AE}", + 'macronbelowcmb' => "\x{0331}", + 'macroncmb' => "\x{0304}", + 'macronlowmod' => "\x{02CD}", + 'macronmonospace' => "\x{FFE3}", + 'macute' => "\x{1E3F}", + 'madeva' => "\x{092E}", + 'magujarati' => "\x{0AAE}", + 'magurmukhi' => "\x{0A2E}", + 'mahapakhhebrew' => "\x{05A4}", + 'mahapakhlefthebrew' => "\x{05A4}", + 'mahiragana' => "\x{307E}", + 'maichattawalowleftthai' => "\x{F895}", + 'maichattawalowrightthai' => "\x{F894}", + 'maichattawathai' => "\x{0E4B}", + 'maichattawaupperleftthai' => "\x{F893}", + 'maieklowleftthai' => "\x{F88C}", + 'maieklowrightthai' => "\x{F88B}", + 'maiekthai' => "\x{0E48}", + 'maiekupperleftthai' => "\x{F88A}", + 'maihanakatleftthai' => "\x{F884}", + 'maihanakatthai' => "\x{0E31}", + 'maitaikhuleftthai' => "\x{F889}", + 'maitaikhuthai' => "\x{0E47}", + 'maitholowleftthai' => "\x{F88F}", + 'maitholowrightthai' => "\x{F88E}", + 'maithothai' => "\x{0E49}", + 'maithoupperleftthai' => "\x{F88D}", + 'maitrilowleftthai' => "\x{F892}", + 'maitrilowrightthai' => "\x{F891}", + 'maitrithai' => "\x{0E4A}", + 'maitriupperleftthai' => "\x{F890}", + 'maiyamokthai' => "\x{0E46}", + 'makatakana' => "\x{30DE}", + 'makatakanahalfwidth' => "\x{FF8F}", + 'mansyonsquare' => "\x{3347}", + 'maqafhebrew' => "\x{05BE}", + 'mars' => "\x{2642}", + 'masoracirclehebrew' => "\x{05AF}", + 'masquare' => "\x{3383}", + 'mbopomofo' => "\x{3107}", + 'mbsquare' => "\x{33D4}", + 'mcircle' => "\x{24DC}", + 'mcubedsquare' => "\x{33A5}", + 'mdotaccent' => "\x{1E41}", + 'mdotbelow' => "\x{1E43}", + 'meemarabic' => "\x{0645}", + 'meemfinalarabic' => "\x{FEE2}", + 'meeminitialarabic' => "\x{FEE3}", + 'meemmedialarabic' => "\x{FEE4}", + 'meemmeeminitialarabic' => "\x{FCD1}", + 'meemmeemisolatedarabic' => "\x{FC48}", + 'meetorusquare' => "\x{334D}", + 'mehiragana' => "\x{3081}", + 'meizierasquare' => "\x{337E}", + 'mekatakana' => "\x{30E1}", + 'mekatakanahalfwidth' => "\x{FF92}", + 'mem' => "\x{05DE}", + 'memdagesh' => "\x{FB3E}", + 'memdageshhebrew' => "\x{FB3E}", + 'memhebrew' => "\x{05DE}", + 'menarmenian' => "\x{0574}", + 'merkhahebrew' => "\x{05A5}", + 'merkhakefulahebrew' => "\x{05A6}", + 'merkhakefulalefthebrew' => "\x{05A6}", + 'merkhalefthebrew' => "\x{05A5}", + 'mhook' => "\x{0271}", + 'mhzsquare' => "\x{3392}", + 'middledotkatakanahalfwidth' => "\x{FF65}", + 'middot' => "\x{00B7}", + 'mieumacirclekorean' => "\x{3272}", + 'mieumaparenkorean' => "\x{3212}", + 'mieumcirclekorean' => "\x{3264}", + 'mieumkorean' => "\x{3141}", + 'mieumpansioskorean' => "\x{3170}", + 'mieumparenkorean' => "\x{3204}", + 'mieumpieupkorean' => "\x{316E}", + 'mieumsioskorean' => "\x{316F}", + 'mihiragana' => "\x{307F}", + 'mikatakana' => "\x{30DF}", + 'mikatakanahalfwidth' => "\x{FF90}", + 'minusbelowcmb' => "\x{0320}", + 'minuscircle' => "\x{2296}", + 'minusmod' => "\x{02D7}", + 'minusplus' => "\x{2213}", + 'miribaarusquare' => "\x{334A}", + 'mirisquare' => "\x{3349}", + 'mlonglegturned' => "\x{0270}", + 'mlsquare' => "\x{3396}", + 'mmcubedsquare' => "\x{33A3}", + 'mmonospace' => "\x{FF4D}", + 'mmsquaredsquare' => "\x{339F}", + 'mohiragana' => "\x{3082}", + 'mohmsquare' => "\x{33C1}", + 'mokatakana' => "\x{30E2}", + 'mokatakanahalfwidth' => "\x{FF93}", + 'molsquare' => "\x{33D6}", + 'momathai' => "\x{0E21}", + 'moverssquare' => "\x{33A7}", + 'moverssquaredsquare' => "\x{33A8}", + 'mparen' => "\x{24A8}", + 'mpasquare' => "\x{33AB}", + 'mssquare' => "\x{33B3}", + 'msuperior' => "\x{F6EF}", + 'mturned' => "\x{026F}", + 'mu1' => "\x{00B5}", + 'muasquare' => "\x{3382}", + 'muchgreater' => "\x{226B}", + 'muchless' => "\x{226A}", + 'mufsquare' => "\x{338C}", + 'mugreek' => "\x{03BC}", + 'mugsquare' => "\x{338D}", + 'muhiragana' => "\x{3080}", + 'mukatakana' => "\x{30E0}", + 'mukatakanahalfwidth' => "\x{FF91}", + 'mulsquare' => "\x{3395}", + 'mumsquare' => "\x{339B}", + 'munahhebrew' => "\x{05A3}", + 'munahlefthebrew' => "\x{05A3}", + 'musicflatsign' => "\x{266D}", + 'musicsharpsign' => "\x{266F}", + 'mussquare' => "\x{33B2}", + 'muvsquare' => "\x{33B6}", + 'muwsquare' => "\x{33BC}", + 'mvmegasquare' => "\x{33B9}", + 'mvsquare' => "\x{33B7}", + 'mwmegasquare' => "\x{33BF}", + 'mwsquare' => "\x{33BD}", + 'nabengali' => "\x{09A8}", + 'nabla' => "\x{2207}", + 'nadeva' => "\x{0928}", + 'nagujarati' => "\x{0AA8}", + 'nagurmukhi' => "\x{0A28}", + 'nahiragana' => "\x{306A}", + 'nakatakana' => "\x{30CA}", + 'nakatakanahalfwidth' => "\x{FF85}", + 'nasquare' => "\x{3381}", + 'nbopomofo' => "\x{310B}", + 'nbspace' => "\x{00A0}", + 'ncedilla' => "\x{0146}", + 'ncircle' => "\x{24DD}", + 'ncircumflexbelow' => "\x{1E4B}", + 'ndotaccent' => "\x{1E45}", + 'ndotbelow' => "\x{1E47}", + 'nehiragana' => "\x{306D}", + 'nekatakana' => "\x{30CD}", + 'nekatakanahalfwidth' => "\x{FF88}", + 'newsheqelsign' => "\x{20AA}", + 'nfsquare' => "\x{338B}", + 'ngabengali' => "\x{0999}", + 'ngadeva' => "\x{0919}", + 'ngagujarati' => "\x{0A99}", + 'ngagurmukhi' => "\x{0A19}", + 'ngonguthai' => "\x{0E07}", + 'nhiragana' => "\x{3093}", + 'nhookleft' => "\x{0272}", + 'nhookretroflex' => "\x{0273}", + 'nieunacirclekorean' => "\x{326F}", + 'nieunaparenkorean' => "\x{320F}", + 'nieuncieuckorean' => "\x{3135}", + 'nieuncirclekorean' => "\x{3261}", + 'nieunhieuhkorean' => "\x{3136}", + 'nieunkorean' => "\x{3134}", + 'nieunpansioskorean' => "\x{3168}", + 'nieunparenkorean' => "\x{3201}", + 'nieunsioskorean' => "\x{3167}", + 'nieuntikeutkorean' => "\x{3166}", + 'nihiragana' => "\x{306B}", + 'nikatakana' => "\x{30CB}", + 'nikatakanahalfwidth' => "\x{FF86}", + 'nikhahitleftthai' => "\x{F899}", + 'nikhahitthai' => "\x{0E4D}", + 'ninearabic' => "\x{0669}", + 'ninebengali' => "\x{09EF}", + 'ninecircle' => "\x{2468}", + 'ninecircleinversesansserif' => "\x{2792}", + 'ninedeva' => "\x{096F}", + 'ninegujarati' => "\x{0AEF}", + 'ninegurmukhi' => "\x{0A6F}", + 'ninehackarabic' => "\x{0669}", + 'ninehangzhou' => "\x{3029}", + 'nineideographicparen' => "\x{3228}", + 'nineinferior' => "\x{2089}", + 'ninemonospace' => "\x{FF19}", + 'nineoldstyle' => "\x{F739}", + 'nineparen' => "\x{247C}", + 'nineperiod' => "\x{2490}", + 'ninepersian' => "\x{06F9}", + 'nineroman' => "\x{2178}", + 'ninesuperior' => "\x{2079}", + 'nineteencircle' => "\x{2472}", + 'nineteenparen' => "\x{2486}", + 'nineteenperiod' => "\x{249A}", + 'ninethai' => "\x{0E59}", + 'nj' => "\x{01CC}", + 'njecyrillic' => "\x{045A}", + 'nkatakana' => "\x{30F3}", + 'nkatakanahalfwidth' => "\x{FF9D}", + 'nlegrightlong' => "\x{019E}", + 'nlinebelow' => "\x{1E49}", + 'nmonospace' => "\x{FF4E}", + 'nmsquare' => "\x{339A}", + 'nnabengali' => "\x{09A3}", + 'nnadeva' => "\x{0923}", + 'nnagujarati' => "\x{0AA3}", + 'nnagurmukhi' => "\x{0A23}", + 'nnnadeva' => "\x{0929}", + 'nohiragana' => "\x{306E}", + 'nokatakana' => "\x{30CE}", + 'nokatakanahalfwidth' => "\x{FF89}", + 'nonbreakingspace' => "\x{00A0}", + 'nonenthai' => "\x{0E13}", + 'nonuthai' => "\x{0E19}", + 'noonarabic' => "\x{0646}", + 'noonfinalarabic' => "\x{FEE6}", + 'noonghunnaarabic' => "\x{06BA}", + 'noonghunnafinalarabic' => "\x{FB9F}", + 'noonhehinitialarabic' => "\x{FEE7}\x{FEEC}", + 'nooninitialarabic' => "\x{FEE7}", + 'noonjeeminitialarabic' => "\x{FCD2}", + 'noonjeemisolatedarabic' => "\x{FC4B}", + 'noonmedialarabic' => "\x{FEE8}", + 'noonmeeminitialarabic' => "\x{FCD5}", + 'noonmeemisolatedarabic' => "\x{FC4E}", + 'noonnoonfinalarabic' => "\x{FC8D}", + 'notcontains' => "\x{220C}", + 'notelementof' => "\x{2209}", + 'notgreater' => "\x{226F}", + 'notgreaternorequal' => "\x{2271}", + 'notgreaternorless' => "\x{2279}", + 'notidentical' => "\x{2262}", + 'notless' => "\x{226E}", + 'notlessnorequal' => "\x{2270}", + 'notparallel' => "\x{2226}", + 'notprecedes' => "\x{2280}", + 'notsucceeds' => "\x{2281}", + 'notsuperset' => "\x{2285}", + 'nowarmenian' => "\x{0576}", + 'nparen' => "\x{24A9}", + 'nssquare' => "\x{33B1}", + 'nsuperior' => "\x{207F}", + 'nuhiragana' => "\x{306C}", + 'nukatakana' => "\x{30CC}", + 'nukatakanahalfwidth' => "\x{FF87}", + 'nuktabengali' => "\x{09BC}", + 'nuktadeva' => "\x{093C}", + 'nuktagujarati' => "\x{0ABC}", + 'nuktagurmukhi' => "\x{0A3C}", + 'numbersignmonospace' => "\x{FF03}", + 'numbersignsmall' => "\x{FE5F}", + 'numeralsigngreek' => "\x{0374}", + 'numeralsignlowergreek' => "\x{0375}", + 'numero' => "\x{2116}", + 'nun' => "\x{05E0}", + 'nundagesh' => "\x{FB40}", + 'nundageshhebrew' => "\x{FB40}", + 'nunhebrew' => "\x{05E0}", + 'nvsquare' => "\x{33B5}", + 'nwsquare' => "\x{33BB}", + 'nyabengali' => "\x{099E}", + 'nyadeva' => "\x{091E}", + 'nyagujarati' => "\x{0A9E}", + 'nyagurmukhi' => "\x{0A1E}", + 'oangthai' => "\x{0E2D}", + 'obarred' => "\x{0275}", + 'obarredcyrillic' => "\x{04E9}", + 'obarreddieresiscyrillic' => "\x{04EB}", + 'obengali' => "\x{0993}", + 'obopomofo' => "\x{311B}", + 'ocandradeva' => "\x{0911}", + 'ocandragujarati' => "\x{0A91}", + 'ocandravowelsigndeva' => "\x{0949}", + 'ocandravowelsigngujarati' => "\x{0AC9}", + 'ocaron' => "\x{01D2}", + 'ocircle' => "\x{24DE}", + 'ocircumflexacute' => "\x{1ED1}", + 'ocircumflexdotbelow' => "\x{1ED9}", + 'ocircumflexgrave' => "\x{1ED3}", + 'ocircumflexhookabove' => "\x{1ED5}", + 'ocircumflextilde' => "\x{1ED7}", + 'ocyrillic' => "\x{043E}", + 'odblacute' => "\x{0151}", + 'odblgrave' => "\x{020D}", + 'odeva' => "\x{0913}", + 'odieresiscyrillic' => "\x{04E7}", + 'odotbelow' => "\x{1ECD}", + 'oekorean' => "\x{315A}", + 'ogonekcmb' => "\x{0328}", + 'ogujarati' => "\x{0A93}", + 'oharmenian' => "\x{0585}", + 'ohiragana' => "\x{304A}", + 'ohookabove' => "\x{1ECF}", + 'ohornacute' => "\x{1EDB}", + 'ohorndotbelow' => "\x{1EE3}", + 'ohorngrave' => "\x{1EDD}", + 'ohornhookabove' => "\x{1EDF}", + 'ohorntilde' => "\x{1EE1}", + 'oi' => "\x{01A3}", + 'oinvertedbreve' => "\x{020F}", + 'okatakana' => "\x{30AA}", + 'okatakanahalfwidth' => "\x{FF75}", + 'okorean' => "\x{3157}", + 'olehebrew' => "\x{05AB}", + 'omacronacute' => "\x{1E53}", + 'omacrongrave' => "\x{1E51}", + 'omdeva' => "\x{0950}", + 'omegacyrillic' => "\x{0461}", + 'omegalatinclosed' => "\x{0277}", + 'omegaroundcyrillic' => "\x{047B}", + 'omegatitlocyrillic' => "\x{047D}", + 'omgujarati' => "\x{0AD0}", + 'omonospace' => "\x{FF4F}", + 'onearabic' => "\x{0661}", + 'onebengali' => "\x{09E7}", + 'onecircle' => "\x{2460}", + 'onecircleinversesansserif' => "\x{278A}", + 'onedeva' => "\x{0967}", + 'onefitted' => "\x{F6DC}", + 'onegujarati' => "\x{0AE7}", + 'onegurmukhi' => "\x{0A67}", + 'onehackarabic' => "\x{0661}", + 'onehangzhou' => "\x{3021}", + 'oneideographicparen' => "\x{3220}", + 'oneinferior' => "\x{2081}", + 'onemonospace' => "\x{FF11}", + 'onenumeratorbengali' => "\x{09F4}", + 'oneoldstyle' => "\x{F731}", + 'oneparen' => "\x{2474}", + 'oneperiod' => "\x{2488}", + 'onepersian' => "\x{06F1}", + 'oneroman' => "\x{2170}", + 'onethai' => "\x{0E51}", + 'oogonek' => "\x{01EB}", + 'oogonekmacron' => "\x{01ED}", + 'oogurmukhi' => "\x{0A13}", + 'oomatragurmukhi' => "\x{0A4B}", + 'oopen' => "\x{0254}", + 'oparen' => "\x{24AA}", + 'option' => "\x{2325}", + 'oshortdeva' => "\x{0912}", + 'oshortvowelsigndeva' => "\x{094A}", + 'osmallhiragana' => "\x{3049}", + 'osmallkatakana' => "\x{30A9}", + 'osmallkatakanahalfwidth' => "\x{FF6B}", + 'ostrokeacute' => "\x{01FF}", + 'osuperior' => "\x{F6F0}", + 'otcyrillic' => "\x{047F}", + 'otildeacute' => "\x{1E4D}", + 'otildedieresis' => "\x{1E4F}", + 'oubopomofo' => "\x{3121}", + 'overline' => "\x{203E}", + 'overlinecenterline' => "\x{FE4A}", + 'overlinecmb' => "\x{0305}", + 'overlinedashed' => "\x{FE49}", + 'overlinedblwavy' => "\x{FE4C}", + 'overlinewavy' => "\x{FE4B}", + 'overscore' => "\x{00AF}", + 'ovowelsignbengali' => "\x{09CB}", + 'ovowelsigndeva' => "\x{094B}", + 'ovowelsigngujarati' => "\x{0ACB}", + 'paampssquare' => "\x{3380}", + 'paasentosquare' => "\x{332B}", + 'pabengali' => "\x{09AA}", + 'pacute' => "\x{1E55}", + 'padeva' => "\x{092A}", + 'pagedown' => "\x{21DF}", + 'pageup' => "\x{21DE}", + 'pagujarati' => "\x{0AAA}", + 'pagurmukhi' => "\x{0A2A}", + 'pahiragana' => "\x{3071}", + 'paiyannoithai' => "\x{0E2F}", + 'pakatakana' => "\x{30D1}", + 'palatalizationcyrilliccmb' => "\x{0484}", + 'palochkacyrillic' => "\x{04C0}", + 'pansioskorean' => "\x{317F}", + 'parallel' => "\x{2225}", + 'parenleftaltonearabic' => "\x{FD3E}", + 'parenleftbt' => "\x{F8ED}", + 'parenleftex' => "\x{F8EC}", + 'parenleftinferior' => "\x{208D}", + 'parenleftmonospace' => "\x{FF08}", + 'parenleftsmall' => "\x{FE59}", + 'parenleftsuperior' => "\x{207D}", + 'parenlefttp' => "\x{F8EB}", + 'parenleftvertical' => "\x{FE35}", + 'parenrightaltonearabic' => "\x{FD3F}", + 'parenrightbt' => "\x{F8F8}", + 'parenrightex' => "\x{F8F7}", + 'parenrightinferior' => "\x{208E}", + 'parenrightmonospace' => "\x{FF09}", + 'parenrightsmall' => "\x{FE5A}", + 'parenrightsuperior' => "\x{207E}", + 'parenrighttp' => "\x{F8F6}", + 'parenrightvertical' => "\x{FE36}", + 'paseqhebrew' => "\x{05C0}", + 'pashtahebrew' => "\x{0599}", + 'pasquare' => "\x{33A9}", + 'patah' => "\x{05B7}", + 'patah11' => "\x{05B7}", + 'patah1d' => "\x{05B7}", + 'patah2a' => "\x{05B7}", + 'patahhebrew' => "\x{05B7}", + 'patahnarrowhebrew' => "\x{05B7}", + 'patahquarterhebrew' => "\x{05B7}", + 'patahwidehebrew' => "\x{05B7}", + 'pazerhebrew' => "\x{05A1}", + 'pbopomofo' => "\x{3106}", + 'pcircle' => "\x{24DF}", + 'pdotaccent' => "\x{1E57}", + 'pe' => "\x{05E4}", + 'pecyrillic' => "\x{043F}", + 'pedagesh' => "\x{FB44}", + 'pedageshhebrew' => "\x{FB44}", + 'peezisquare' => "\x{333B}", + 'pefinaldageshhebrew' => "\x{FB43}", + 'peharabic' => "\x{067E}", + 'peharmenian' => "\x{057A}", + 'pehebrew' => "\x{05E4}", + 'pehfinalarabic' => "\x{FB57}", + 'pehinitialarabic' => "\x{FB58}", + 'pehiragana' => "\x{307A}", + 'pehmedialarabic' => "\x{FB59}", + 'pekatakana' => "\x{30DA}", + 'pemiddlehookcyrillic' => "\x{04A7}", + 'perafehebrew' => "\x{FB4E}", + 'percentarabic' => "\x{066A}", + 'percentmonospace' => "\x{FF05}", + 'percentsmall' => "\x{FE6A}", + 'periodarmenian' => "\x{0589}", + 'periodhalfwidth' => "\x{FF61}", + 'periodinferior' => "\x{F6E7}", + 'periodmonospace' => "\x{FF0E}", + 'periodsmall' => "\x{FE52}", + 'periodsuperior' => "\x{F6E8}", + 'perispomenigreekcmb' => "\x{0342}", + 'pfsquare' => "\x{338A}", + 'phabengali' => "\x{09AB}", + 'phadeva' => "\x{092B}", + 'phagujarati' => "\x{0AAB}", + 'phagurmukhi' => "\x{0A2B}", + 'phieuphacirclekorean' => "\x{327A}", + 'phieuphaparenkorean' => "\x{321A}", + 'phieuphcirclekorean' => "\x{326C}", + 'phieuphkorean' => "\x{314D}", + 'phieuphparenkorean' => "\x{320C}", + 'philatin' => "\x{0278}", + 'phinthuthai' => "\x{0E3A}", + 'phisymbolgreek' => "\x{03D5}", + 'phook' => "\x{01A5}", + 'phophanthai' => "\x{0E1E}", + 'phophungthai' => "\x{0E1C}", + 'phosamphaothai' => "\x{0E20}", + 'pieupacirclekorean' => "\x{3273}", + 'pieupaparenkorean' => "\x{3213}", + 'pieupcieuckorean' => "\x{3176}", + 'pieupcirclekorean' => "\x{3265}", + 'pieupkiyeokkorean' => "\x{3172}", + 'pieupkorean' => "\x{3142}", + 'pieupparenkorean' => "\x{3205}", + 'pieupsioskiyeokkorean' => "\x{3174}", + 'pieupsioskorean' => "\x{3144}", + 'pieupsiostikeutkorean' => "\x{3175}", + 'pieupthieuthkorean' => "\x{3177}", + 'pieuptikeutkorean' => "\x{3173}", + 'pihiragana' => "\x{3074}", + 'pikatakana' => "\x{30D4}", + 'pisymbolgreek' => "\x{03D6}", + 'piwrarmenian' => "\x{0583}", + 'plusbelowcmb' => "\x{031F}", + 'pluscircle' => "\x{2295}", + 'plusmod' => "\x{02D6}", + 'plusmonospace' => "\x{FF0B}", + 'plussmall' => "\x{FE62}", + 'plussuperior' => "\x{207A}", + 'pmonospace' => "\x{FF50}", + 'pmsquare' => "\x{33D8}", + 'pohiragana' => "\x{307D}", + 'pointingindexdownwhite' => "\x{261F}", + 'pointingindexleftwhite' => "\x{261C}", + 'pointingindexrightwhite' => "\x{261E}", + 'pointingindexupwhite' => "\x{261D}", + 'pokatakana' => "\x{30DD}", + 'poplathai' => "\x{0E1B}", + 'postalmark' => "\x{3012}", + 'postalmarkface' => "\x{3020}", + 'pparen' => "\x{24AB}", + 'precedes' => "\x{227A}", + 'primemod' => "\x{02B9}", + 'primereversed' => "\x{2035}", + 'projective' => "\x{2305}", + 'prolongedkana' => "\x{30FC}", + 'propellor' => "\x{2318}", + 'proportion' => "\x{2237}", + 'psicyrillic' => "\x{0471}", + 'psilipneumatacyrilliccmb' => "\x{0486}", + 'pssquare' => "\x{33B0}", + 'puhiragana' => "\x{3077}", + 'pukatakana' => "\x{30D7}", + 'pvsquare' => "\x{33B4}", + 'pwsquare' => "\x{33BA}", + 'qadeva' => "\x{0958}", + 'qadmahebrew' => "\x{05A8}", + 'qafarabic' => "\x{0642}", + 'qaffinalarabic' => "\x{FED6}", + 'qafinitialarabic' => "\x{FED7}", + 'qafmedialarabic' => "\x{FED8}", + 'qamats' => "\x{05B8}", + 'qamats10' => "\x{05B8}", + 'qamats1a' => "\x{05B8}", + 'qamats1c' => "\x{05B8}", + 'qamats27' => "\x{05B8}", + 'qamats29' => "\x{05B8}", + 'qamats33' => "\x{05B8}", + 'qamatsde' => "\x{05B8}", + 'qamatshebrew' => "\x{05B8}", + 'qamatsnarrowhebrew' => "\x{05B8}", + 'qamatsqatanhebrew' => "\x{05B8}", + 'qamatsqatannarrowhebrew' => "\x{05B8}", + 'qamatsqatanquarterhebrew' => "\x{05B8}", + 'qamatsqatanwidehebrew' => "\x{05B8}", + 'qamatsquarterhebrew' => "\x{05B8}", + 'qamatswidehebrew' => "\x{05B8}", + 'qarneyparahebrew' => "\x{059F}", + 'qbopomofo' => "\x{3111}", + 'qcircle' => "\x{24E0}", + 'qhook' => "\x{02A0}", + 'qmonospace' => "\x{FF51}", + 'qof' => "\x{05E7}", + 'qofdagesh' => "\x{FB47}", + 'qofdageshhebrew' => "\x{FB47}", + 'qofhatafpatah' => "\x{05E7}\x{05B2}", + 'qofhatafpatahhebrew' => "\x{05E7}\x{05B2}", + 'qofhatafsegol' => "\x{05E7}\x{05B1}", + 'qofhatafsegolhebrew' => "\x{05E7}\x{05B1}", + 'qofhebrew' => "\x{05E7}", + 'qofhiriq' => "\x{05E7}\x{05B4}", + 'qofhiriqhebrew' => "\x{05E7}\x{05B4}", + 'qofholam' => "\x{05E7}\x{05B9}", + 'qofholamhebrew' => "\x{05E7}\x{05B9}", + 'qofpatah' => "\x{05E7}\x{05B7}", + 'qofpatahhebrew' => "\x{05E7}\x{05B7}", + 'qofqamats' => "\x{05E7}\x{05B8}", + 'qofqamatshebrew' => "\x{05E7}\x{05B8}", + 'qofqubuts' => "\x{05E7}\x{05BB}", + 'qofqubutshebrew' => "\x{05E7}\x{05BB}", + 'qofsegol' => "\x{05E7}\x{05B6}", + 'qofsegolhebrew' => "\x{05E7}\x{05B6}", + 'qofsheva' => "\x{05E7}\x{05B0}", + 'qofshevahebrew' => "\x{05E7}\x{05B0}", + 'qoftsere' => "\x{05E7}\x{05B5}", + 'qoftserehebrew' => "\x{05E7}\x{05B5}", + 'qparen' => "\x{24AC}", + 'quarternote' => "\x{2669}", + 'qubuts' => "\x{05BB}", + 'qubuts18' => "\x{05BB}", + 'qubuts25' => "\x{05BB}", + 'qubuts31' => "\x{05BB}", + 'qubutshebrew' => "\x{05BB}", + 'qubutsnarrowhebrew' => "\x{05BB}", + 'qubutsquarterhebrew' => "\x{05BB}", + 'qubutswidehebrew' => "\x{05BB}", + 'questionarabic' => "\x{061F}", + 'questionarmenian' => "\x{055E}", + 'questiondownsmall' => "\x{F7BF}", + 'questiongreek' => "\x{037E}", + 'questionmonospace' => "\x{FF1F}", + 'questionsmall' => "\x{F73F}", + 'quotedblmonospace' => "\x{FF02}", + 'quotedblprime' => "\x{301E}", + 'quotedblprimereversed' => "\x{301D}", + 'quoteleftreversed' => "\x{201B}", + 'quoterightn' => "\x{0149}", + 'quotesinglemonospace' => "\x{FF07}", + 'raarmenian' => "\x{057C}", + 'rabengali' => "\x{09B0}", + 'radeva' => "\x{0930}", + 'radicalex' => "\x{F8E5}", + 'radoverssquare' => "\x{33AE}", + 'radoverssquaredsquare' => "\x{33AF}", + 'radsquare' => "\x{33AD}", + 'rafe' => "\x{05BF}", + 'rafehebrew' => "\x{05BF}", + 'ragujarati' => "\x{0AB0}", + 'ragurmukhi' => "\x{0A30}", + 'rahiragana' => "\x{3089}", + 'rakatakana' => "\x{30E9}", + 'rakatakanahalfwidth' => "\x{FF97}", + 'ralowerdiagonalbengali' => "\x{09F1}", + 'ramiddlediagonalbengali' => "\x{09F0}", + 'ramshorn' => "\x{0264}", + 'ratio' => "\x{2236}", + 'rbopomofo' => "\x{3116}", + 'rcedilla' => "\x{0157}", + 'rcircle' => "\x{24E1}", + 'rdblgrave' => "\x{0211}", + 'rdotaccent' => "\x{1E59}", + 'rdotbelow' => "\x{1E5B}", + 'rdotbelowmacron' => "\x{1E5D}", + 'referencemark' => "\x{203B}", + 'registersans' => "\x{F8E8}", + 'registerserif' => "\x{F6DA}", + 'reharabic' => "\x{0631}", + 'reharmenian' => "\x{0580}", + 'rehfinalarabic' => "\x{FEAE}", + 'rehiragana' => "\x{308C}", + 'rehyehaleflamarabic' => "\x{0631}\x{FEF3}\x{FE8E}\x{0644}", + 'rekatakana' => "\x{30EC}", + 'rekatakanahalfwidth' => "\x{FF9A}", + 'resh' => "\x{05E8}", + 'reshdageshhebrew' => "\x{FB48}", + 'reshhatafpatah' => "\x{05E8}\x{05B2}", + 'reshhatafpatahhebrew' => "\x{05E8}\x{05B2}", + 'reshhatafsegol' => "\x{05E8}\x{05B1}", + 'reshhatafsegolhebrew' => "\x{05E8}\x{05B1}", + 'reshhebrew' => "\x{05E8}", + 'reshhiriq' => "\x{05E8}\x{05B4}", + 'reshhiriqhebrew' => "\x{05E8}\x{05B4}", + 'reshholam' => "\x{05E8}\x{05B9}", + 'reshholamhebrew' => "\x{05E8}\x{05B9}", + 'reshpatah' => "\x{05E8}\x{05B7}", + 'reshpatahhebrew' => "\x{05E8}\x{05B7}", + 'reshqamats' => "\x{05E8}\x{05B8}", + 'reshqamatshebrew' => "\x{05E8}\x{05B8}", + 'reshqubuts' => "\x{05E8}\x{05BB}", + 'reshqubutshebrew' => "\x{05E8}\x{05BB}", + 'reshsegol' => "\x{05E8}\x{05B6}", + 'reshsegolhebrew' => "\x{05E8}\x{05B6}", + 'reshsheva' => "\x{05E8}\x{05B0}", + 'reshshevahebrew' => "\x{05E8}\x{05B0}", + 'reshtsere' => "\x{05E8}\x{05B5}", + 'reshtserehebrew' => "\x{05E8}\x{05B5}", + 'reversedtilde' => "\x{223D}", + 'reviahebrew' => "\x{0597}", + 'reviamugrashhebrew' => "\x{0597}", + 'rfishhook' => "\x{027E}", + 'rfishhookreversed' => "\x{027F}", + 'rhabengali' => "\x{09DD}", + 'rhadeva' => "\x{095D}", + 'rhook' => "\x{027D}", + 'rhookturned' => "\x{027B}", + 'rhookturnedsuperior' => "\x{02B5}", + 'rhosymbolgreek' => "\x{03F1}", + 'rhotichookmod' => "\x{02DE}", + 'rieulacirclekorean' => "\x{3271}", + 'rieulaparenkorean' => "\x{3211}", + 'rieulcirclekorean' => "\x{3263}", + 'rieulhieuhkorean' => "\x{3140}", + 'rieulkiyeokkorean' => "\x{313A}", + 'rieulkiyeoksioskorean' => "\x{3169}", + 'rieulkorean' => "\x{3139}", + 'rieulmieumkorean' => "\x{313B}", + 'rieulpansioskorean' => "\x{316C}", + 'rieulparenkorean' => "\x{3203}", + 'rieulphieuphkorean' => "\x{313F}", + 'rieulpieupkorean' => "\x{313C}", + 'rieulpieupsioskorean' => "\x{316B}", + 'rieulsioskorean' => "\x{313D}", + 'rieulthieuthkorean' => "\x{313E}", + 'rieultikeutkorean' => "\x{316A}", + 'rieulyeorinhieuhkorean' => "\x{316D}", + 'rightangle' => "\x{221F}", + 'righttackbelowcmb' => "\x{0319}", + 'righttriangle' => "\x{22BF}", + 'rihiragana' => "\x{308A}", + 'rikatakana' => "\x{30EA}", + 'rikatakanahalfwidth' => "\x{FF98}", + 'ringbelowcmb' => "\x{0325}", + 'ringcmb' => "\x{030A}", + 'ringhalfleft' => "\x{02BF}", + 'ringhalfleftarmenian' => "\x{0559}", + 'ringhalfleftbelowcmb' => "\x{031C}", + 'ringhalfleftcentered' => "\x{02D3}", + 'ringhalfright' => "\x{02BE}", + 'ringhalfrightbelowcmb' => "\x{0339}", + 'ringhalfrightcentered' => "\x{02D2}", + 'rinvertedbreve' => "\x{0213}", + 'rittorusquare' => "\x{3351}", + 'rlinebelow' => "\x{1E5F}", + 'rlongleg' => "\x{027C}", + 'rlonglegturned' => "\x{027A}", + 'rmonospace' => "\x{FF52}", + 'rohiragana' => "\x{308D}", + 'rokatakana' => "\x{30ED}", + 'rokatakanahalfwidth' => "\x{FF9B}", + 'roruathai' => "\x{0E23}", + 'rparen' => "\x{24AD}", + 'rrabengali' => "\x{09DC}", + 'rradeva' => "\x{0931}", + 'rragurmukhi' => "\x{0A5C}", + 'rreharabic' => "\x{0691}", + 'rrehfinalarabic' => "\x{FB8D}", + 'rrvocalicbengali' => "\x{09E0}", + 'rrvocalicdeva' => "\x{0960}", + 'rrvocalicgujarati' => "\x{0AE0}", + 'rrvocalicvowelsignbengali' => "\x{09C4}", + 'rrvocalicvowelsigndeva' => "\x{0944}", + 'rrvocalicvowelsigngujarati' => "\x{0AC4}", + 'rsuperior' => "\x{F6F1}", + 'rturned' => "\x{0279}", + 'rturnedsuperior' => "\x{02B4}", + 'ruhiragana' => "\x{308B}", + 'rukatakana' => "\x{30EB}", + 'rukatakanahalfwidth' => "\x{FF99}", + 'rupeemarkbengali' => "\x{09F2}", + 'rupeesignbengali' => "\x{09F3}", + 'rupiah' => "\x{F6DD}", + 'ruthai' => "\x{0E24}", + 'rvocalicbengali' => "\x{098B}", + 'rvocalicdeva' => "\x{090B}", + 'rvocalicgujarati' => "\x{0A8B}", + 'rvocalicvowelsignbengali' => "\x{09C3}", + 'rvocalicvowelsigndeva' => "\x{0943}", + 'rvocalicvowelsigngujarati' => "\x{0AC3}", + 'sabengali' => "\x{09B8}", + 'sacutedotaccent' => "\x{1E65}", + 'sadarabic' => "\x{0635}", + 'sadeva' => "\x{0938}", + 'sadfinalarabic' => "\x{FEBA}", + 'sadinitialarabic' => "\x{FEBB}", + 'sadmedialarabic' => "\x{FEBC}", + 'sagujarati' => "\x{0AB8}", + 'sagurmukhi' => "\x{0A38}", + 'sahiragana' => "\x{3055}", + 'sakatakana' => "\x{30B5}", + 'sakatakanahalfwidth' => "\x{FF7B}", + 'sallallahoualayhewasallamarabic' => "\x{FDFA}", + 'samekh' => "\x{05E1}", + 'samekhdagesh' => "\x{FB41}", + 'samekhdageshhebrew' => "\x{FB41}", + 'samekhhebrew' => "\x{05E1}", + 'saraaathai' => "\x{0E32}", + 'saraaethai' => "\x{0E41}", + 'saraaimaimalaithai' => "\x{0E44}", + 'saraaimaimuanthai' => "\x{0E43}", + 'saraamthai' => "\x{0E33}", + 'saraathai' => "\x{0E30}", + 'saraethai' => "\x{0E40}", + 'saraiileftthai' => "\x{F886}", + 'saraiithai' => "\x{0E35}", + 'saraileftthai' => "\x{F885}", + 'saraithai' => "\x{0E34}", + 'saraothai' => "\x{0E42}", + 'saraueeleftthai' => "\x{F888}", + 'saraueethai' => "\x{0E37}", + 'saraueleftthai' => "\x{F887}", + 'sarauethai' => "\x{0E36}", + 'sarauthai' => "\x{0E38}", + 'sarauuthai' => "\x{0E39}", + 'sbopomofo' => "\x{3119}", + 'scarondotaccent' => "\x{1E67}", + 'schwa' => "\x{0259}", + 'schwacyrillic' => "\x{04D9}", + 'schwadieresiscyrillic' => "\x{04DB}", + 'schwahook' => "\x{025A}", + 'scircle' => "\x{24E2}", + 'sdotaccent' => "\x{1E61}", + 'sdotbelow' => "\x{1E63}", + 'sdotbelowdotaccent' => "\x{1E69}", + 'seagullbelowcmb' => "\x{033C}", + 'secondtonechinese' => "\x{02CA}", + 'seenarabic' => "\x{0633}", + 'seenfinalarabic' => "\x{FEB2}", + 'seeninitialarabic' => "\x{FEB3}", + 'seenmedialarabic' => "\x{FEB4}", + 'segol' => "\x{05B6}", + 'segol13' => "\x{05B6}", + 'segol1f' => "\x{05B6}", + 'segol2c' => "\x{05B6}", + 'segolhebrew' => "\x{05B6}", + 'segolnarrowhebrew' => "\x{05B6}", + 'segolquarterhebrew' => "\x{05B6}", + 'segoltahebrew' => "\x{0592}", + 'segolwidehebrew' => "\x{05B6}", + 'seharmenian' => "\x{057D}", + 'sehiragana' => "\x{305B}", + 'sekatakana' => "\x{30BB}", + 'sekatakanahalfwidth' => "\x{FF7E}", + 'semicolonarabic' => "\x{061B}", + 'semicolonmonospace' => "\x{FF1B}", + 'semicolonsmall' => "\x{FE54}", + 'semivoicedmarkkana' => "\x{309C}", + 'semivoicedmarkkanahalfwidth' => "\x{FF9F}", + 'sentisquare' => "\x{3322}", + 'sentosquare' => "\x{3323}", + 'sevenarabic' => "\x{0667}", + 'sevenbengali' => "\x{09ED}", + 'sevencircle' => "\x{2466}", + 'sevencircleinversesansserif' => "\x{2790}", + 'sevendeva' => "\x{096D}", + 'sevengujarati' => "\x{0AED}", + 'sevengurmukhi' => "\x{0A6D}", + 'sevenhackarabic' => "\x{0667}", + 'sevenhangzhou' => "\x{3027}", + 'sevenideographicparen' => "\x{3226}", + 'seveninferior' => "\x{2087}", + 'sevenmonospace' => "\x{FF17}", + 'sevenoldstyle' => "\x{F737}", + 'sevenparen' => "\x{247A}", + 'sevenperiod' => "\x{248E}", + 'sevenpersian' => "\x{06F7}", + 'sevenroman' => "\x{2176}", + 'sevensuperior' => "\x{2077}", + 'seventeencircle' => "\x{2470}", + 'seventeenparen' => "\x{2484}", + 'seventeenperiod' => "\x{2498}", + 'seventhai' => "\x{0E57}", + 'sfthyphen' => "\x{00AD}", + 'shaarmenian' => "\x{0577}", + 'shabengali' => "\x{09B6}", + 'shacyrillic' => "\x{0448}", + 'shaddaarabic' => "\x{0651}", + 'shaddadammaarabic' => "\x{FC61}", + 'shaddadammatanarabic' => "\x{FC5E}", + 'shaddafathaarabic' => "\x{FC60}", + 'shaddafathatanarabic' => "\x{0651}\x{064B}", + 'shaddakasraarabic' => "\x{FC62}", + 'shaddakasratanarabic' => "\x{FC5F}", + 'shadedark' => "\x{2593}", + 'shadelight' => "\x{2591}", + 'shademedium' => "\x{2592}", + 'shadeva' => "\x{0936}", + 'shagujarati' => "\x{0AB6}", + 'shagurmukhi' => "\x{0A36}", + 'shalshelethebrew' => "\x{0593}", + 'shbopomofo' => "\x{3115}", + 'shchacyrillic' => "\x{0449}", + 'sheenarabic' => "\x{0634}", + 'sheenfinalarabic' => "\x{FEB6}", + 'sheeninitialarabic' => "\x{FEB7}", + 'sheenmedialarabic' => "\x{FEB8}", + 'sheicoptic' => "\x{03E3}", + 'sheqel' => "\x{20AA}", + 'sheqelhebrew' => "\x{20AA}", + 'sheva' => "\x{05B0}", + 'sheva115' => "\x{05B0}", + 'sheva15' => "\x{05B0}", + 'sheva22' => "\x{05B0}", + 'sheva2e' => "\x{05B0}", + 'shevahebrew' => "\x{05B0}", + 'shevanarrowhebrew' => "\x{05B0}", + 'shevaquarterhebrew' => "\x{05B0}", + 'shevawidehebrew' => "\x{05B0}", + 'shhacyrillic' => "\x{04BB}", + 'shimacoptic' => "\x{03ED}", + 'shin' => "\x{05E9}", + 'shindagesh' => "\x{FB49}", + 'shindageshhebrew' => "\x{FB49}", + 'shindageshshindot' => "\x{FB2C}", + 'shindageshshindothebrew' => "\x{FB2C}", + 'shindageshsindot' => "\x{FB2D}", + 'shindageshsindothebrew' => "\x{FB2D}", + 'shindothebrew' => "\x{05C1}", + 'shinhebrew' => "\x{05E9}", + 'shinshindot' => "\x{FB2A}", + 'shinshindothebrew' => "\x{FB2A}", + 'shinsindot' => "\x{FB2B}", + 'shinsindothebrew' => "\x{FB2B}", + 'shook' => "\x{0282}", + 'sigmafinal' => "\x{03C2}", + 'sigmalunatesymbolgreek' => "\x{03F2}", + 'sihiragana' => "\x{3057}", + 'sikatakana' => "\x{30B7}", + 'sikatakanahalfwidth' => "\x{FF7C}", + 'siluqhebrew' => "\x{05BD}", + 'siluqlefthebrew' => "\x{05BD}", + 'sindothebrew' => "\x{05C2}", + 'siosacirclekorean' => "\x{3274}", + 'siosaparenkorean' => "\x{3214}", + 'sioscieuckorean' => "\x{317E}", + 'sioscirclekorean' => "\x{3266}", + 'sioskiyeokkorean' => "\x{317A}", + 'sioskorean' => "\x{3145}", + 'siosnieunkorean' => "\x{317B}", + 'siosparenkorean' => "\x{3206}", + 'siospieupkorean' => "\x{317D}", + 'siostikeutkorean' => "\x{317C}", + 'sixarabic' => "\x{0666}", + 'sixbengali' => "\x{09EC}", + 'sixcircle' => "\x{2465}", + 'sixcircleinversesansserif' => "\x{278F}", + 'sixdeva' => "\x{096C}", + 'sixgujarati' => "\x{0AEC}", + 'sixgurmukhi' => "\x{0A6C}", + 'sixhackarabic' => "\x{0666}", + 'sixhangzhou' => "\x{3026}", + 'sixideographicparen' => "\x{3225}", + 'sixinferior' => "\x{2086}", + 'sixmonospace' => "\x{FF16}", + 'sixoldstyle' => "\x{F736}", + 'sixparen' => "\x{2479}", + 'sixperiod' => "\x{248D}", + 'sixpersian' => "\x{06F6}", + 'sixroman' => "\x{2175}", + 'sixsuperior' => "\x{2076}", + 'sixteencircle' => "\x{246F}", + 'sixteencurrencydenominatorbengali' => "\x{09F9}", + 'sixteenparen' => "\x{2483}", + 'sixteenperiod' => "\x{2497}", + 'sixthai' => "\x{0E56}", + 'slashmonospace' => "\x{FF0F}", + 'slong' => "\x{017F}", + 'slongdotaccent' => "\x{1E9B}", + 'smonospace' => "\x{FF53}", + 'sofpasuqhebrew' => "\x{05C3}", + 'softhyphen' => "\x{00AD}", + 'softsigncyrillic' => "\x{044C}", + 'sohiragana' => "\x{305D}", + 'sokatakana' => "\x{30BD}", + 'sokatakanahalfwidth' => "\x{FF7F}", + 'soliduslongoverlaycmb' => "\x{0338}", + 'solidusshortoverlaycmb' => "\x{0337}", + 'sorusithai' => "\x{0E29}", + 'sosalathai' => "\x{0E28}", + 'sosothai' => "\x{0E0B}", + 'sosuathai' => "\x{0E2A}", + 'spacehackarabic' => "\x{0020}", + 'spadesuitblack' => "\x{2660}", + 'spadesuitwhite' => "\x{2664}", + 'sparen' => "\x{24AE}", + 'squarebelowcmb' => "\x{033B}", + 'squarecc' => "\x{33C4}", + 'squarecm' => "\x{339D}", + 'squarediagonalcrosshatchfill' => "\x{25A9}", + 'squarehorizontalfill' => "\x{25A4}", + 'squarekg' => "\x{338F}", + 'squarekm' => "\x{339E}", + 'squarekmcapital' => "\x{33CE}", + 'squareln' => "\x{33D1}", + 'squarelog' => "\x{33D2}", + 'squaremg' => "\x{338E}", + 'squaremil' => "\x{33D5}", + 'squaremm' => "\x{339C}", + 'squaremsquared' => "\x{33A1}", + 'squareorthogonalcrosshatchfill' => "\x{25A6}", + 'squareupperlefttolowerrightfill' => "\x{25A7}", + 'squareupperrighttolowerleftfill' => "\x{25A8}", + 'squareverticalfill' => "\x{25A5}", + 'squarewhitewithsmallblack' => "\x{25A3}", + 'srsquare' => "\x{33DB}", + 'ssabengali' => "\x{09B7}", + 'ssadeva' => "\x{0937}", + 'ssagujarati' => "\x{0AB7}", + 'ssangcieuckorean' => "\x{3149}", + 'ssanghieuhkorean' => "\x{3185}", + 'ssangieungkorean' => "\x{3180}", + 'ssangkiyeokkorean' => "\x{3132}", + 'ssangnieunkorean' => "\x{3165}", + 'ssangpieupkorean' => "\x{3143}", + 'ssangsioskorean' => "\x{3146}", + 'ssangtikeutkorean' => "\x{3138}", + 'ssuperior' => "\x{F6F2}", + 'sterlingmonospace' => "\x{FFE1}", + 'strokelongoverlaycmb' => "\x{0336}", + 'strokeshortoverlaycmb' => "\x{0335}", + 'subset' => "\x{2282}", + 'subsetnotequal' => "\x{228A}", + 'subsetorequal' => "\x{2286}", + 'succeeds' => "\x{227B}", + 'suhiragana' => "\x{3059}", + 'sukatakana' => "\x{30B9}", + 'sukatakanahalfwidth' => "\x{FF7D}", + 'sukunarabic' => "\x{0652}", + 'superset' => "\x{2283}", + 'supersetnotequal' => "\x{228B}", + 'supersetorequal' => "\x{2287}", + 'svsquare' => "\x{33DC}", + 'syouwaerasquare' => "\x{337C}", + 'tabengali' => "\x{09A4}", + 'tackdown' => "\x{22A4}", + 'tackleft' => "\x{22A3}", + 'tadeva' => "\x{0924}", + 'tagujarati' => "\x{0AA4}", + 'tagurmukhi' => "\x{0A24}", + 'taharabic' => "\x{0637}", + 'tahfinalarabic' => "\x{FEC2}", + 'tahinitialarabic' => "\x{FEC3}", + 'tahiragana' => "\x{305F}", + 'tahmedialarabic' => "\x{FEC4}", + 'taisyouerasquare' => "\x{337D}", + 'takatakana' => "\x{30BF}", + 'takatakanahalfwidth' => "\x{FF80}", + 'tatweelarabic' => "\x{0640}", + 'tav' => "\x{05EA}", + 'tavdages' => "\x{FB4A}", + 'tavdagesh' => "\x{FB4A}", + 'tavdageshhebrew' => "\x{FB4A}", + 'tavhebrew' => "\x{05EA}", + 'tbopomofo' => "\x{310A}", + 'tccurl' => "\x{02A8}", + 'tcedilla' => "\x{0163}", + 'tcheharabic' => "\x{0686}", + 'tchehfinalarabic' => "\x{FB7B}", + 'tchehinitialarabic' => "\x{FB7C}", + 'tchehmedialarabic' => "\x{FB7D}", + 'tchehmeeminitialarabic' => "\x{FB7C}\x{FEE4}", + 'tcircle' => "\x{24E3}", + 'tcircumflexbelow' => "\x{1E71}", + 'tdieresis' => "\x{1E97}", + 'tdotaccent' => "\x{1E6B}", + 'tdotbelow' => "\x{1E6D}", + 'tecyrillic' => "\x{0442}", + 'tedescendercyrillic' => "\x{04AD}", + 'teharabic' => "\x{062A}", + 'tehfinalarabic' => "\x{FE96}", + 'tehhahinitialarabic' => "\x{FCA2}", + 'tehhahisolatedarabic' => "\x{FC0C}", + 'tehinitialarabic' => "\x{FE97}", + 'tehiragana' => "\x{3066}", + 'tehjeeminitialarabic' => "\x{FCA1}", + 'tehjeemisolatedarabic' => "\x{FC0B}", + 'tehmarbutaarabic' => "\x{0629}", + 'tehmarbutafinalarabic' => "\x{FE94}", + 'tehmedialarabic' => "\x{FE98}", + 'tehmeeminitialarabic' => "\x{FCA4}", + 'tehmeemisolatedarabic' => "\x{FC0E}", + 'tehnoonfinalarabic' => "\x{FC73}", + 'tekatakana' => "\x{30C6}", + 'tekatakanahalfwidth' => "\x{FF83}", + 'telephone' => "\x{2121}", + 'telephoneblack' => "\x{260E}", + 'telishagedolahebrew' => "\x{05A0}", + 'telishaqetanahebrew' => "\x{05A9}", + 'tencircle' => "\x{2469}", + 'tenideographicparen' => "\x{3229}", + 'tenparen' => "\x{247D}", + 'tenperiod' => "\x{2491}", + 'tenroman' => "\x{2179}", + 'tesh' => "\x{02A7}", + 'tet' => "\x{05D8}", + 'tetdagesh' => "\x{FB38}", + 'tetdageshhebrew' => "\x{FB38}", + 'tethebrew' => "\x{05D8}", + 'tetsecyrillic' => "\x{04B5}", + 'tevirhebrew' => "\x{059B}", + 'tevirlefthebrew' => "\x{059B}", + 'thabengali' => "\x{09A5}", + 'thadeva' => "\x{0925}", + 'thagujarati' => "\x{0AA5}", + 'thagurmukhi' => "\x{0A25}", + 'thalarabic' => "\x{0630}", + 'thalfinalarabic' => "\x{FEAC}", + 'thanthakhatlowleftthai' => "\x{F898}", + 'thanthakhatlowrightthai' => "\x{F897}", + 'thanthakhatthai' => "\x{0E4C}", + 'thanthakhatupperleftthai' => "\x{F896}", + 'theharabic' => "\x{062B}", + 'thehfinalarabic' => "\x{FE9A}", + 'thehinitialarabic' => "\x{FE9B}", + 'thehmedialarabic' => "\x{FE9C}", + 'thereexists' => "\x{2203}", + 'thetasymbolgreek' => "\x{03D1}", + 'thieuthacirclekorean' => "\x{3279}", + 'thieuthaparenkorean' => "\x{3219}", + 'thieuthcirclekorean' => "\x{326B}", + 'thieuthkorean' => "\x{314C}", + 'thieuthparenkorean' => "\x{320B}", + 'thirteencircle' => "\x{246C}", + 'thirteenparen' => "\x{2480}", + 'thirteenperiod' => "\x{2494}", + 'thonangmonthothai' => "\x{0E11}", + 'thook' => "\x{01AD}", + 'thophuthaothai' => "\x{0E12}", + 'thothahanthai' => "\x{0E17}", + 'thothanthai' => "\x{0E10}", + 'thothongthai' => "\x{0E18}", + 'thothungthai' => "\x{0E16}", + 'thousandcyrillic' => "\x{0482}", + 'thousandsseparatorarabic' => "\x{066C}", + 'thousandsseparatorpersian' => "\x{066C}", + 'threearabic' => "\x{0663}", + 'threebengali' => "\x{09E9}", + 'threecircle' => "\x{2462}", + 'threecircleinversesansserif' => "\x{278C}", + 'threedeva' => "\x{0969}", + 'threegujarati' => "\x{0AE9}", + 'threegurmukhi' => "\x{0A69}", + 'threehackarabic' => "\x{0663}", + 'threehangzhou' => "\x{3023}", + 'threeideographicparen' => "\x{3222}", + 'threeinferior' => "\x{2083}", + 'threemonospace' => "\x{FF13}", + 'threenumeratorbengali' => "\x{09F6}", + 'threeoldstyle' => "\x{F733}", + 'threeparen' => "\x{2476}", + 'threeperiod' => "\x{248A}", + 'threepersian' => "\x{06F3}", + 'threequartersemdash' => "\x{F6DE}", + 'threeroman' => "\x{2172}", + 'threethai' => "\x{0E53}", + 'thzsquare' => "\x{3394}", + 'tihiragana' => "\x{3061}", + 'tikatakana' => "\x{30C1}", + 'tikatakanahalfwidth' => "\x{FF81}", + 'tikeutacirclekorean' => "\x{3270}", + 'tikeutaparenkorean' => "\x{3210}", + 'tikeutcirclekorean' => "\x{3262}", + 'tikeutkorean' => "\x{3137}", + 'tikeutparenkorean' => "\x{3202}", + 'tildebelowcmb' => "\x{0330}", + 'tildecmb' => "\x{0303}", + 'tildedoublecmb' => "\x{0360}", + 'tildeoperator' => "\x{223C}", + 'tildeoverlaycmb' => "\x{0334}", + 'tildeverticalcmb' => "\x{033E}", + 'timescircle' => "\x{2297}", + 'tipehahebrew' => "\x{0596}", + 'tipehalefthebrew' => "\x{0596}", + 'tippigurmukhi' => "\x{0A70}", + 'titlocyrilliccmb' => "\x{0483}", + 'tiwnarmenian' => "\x{057F}", + 'tlinebelow' => "\x{1E6F}", + 'tmonospace' => "\x{FF54}", + 'toarmenian' => "\x{0569}", + 'tohiragana' => "\x{3068}", + 'tokatakana' => "\x{30C8}", + 'tokatakanahalfwidth' => "\x{FF84}", + 'tonebarextrahighmod' => "\x{02E5}", + 'tonebarextralowmod' => "\x{02E9}", + 'tonebarhighmod' => "\x{02E6}", + 'tonebarlowmod' => "\x{02E8}", + 'tonebarmidmod' => "\x{02E7}", + 'tonefive' => "\x{01BD}", + 'tonesix' => "\x{0185}", + 'tonetwo' => "\x{01A8}", + 'tonsquare' => "\x{3327}", + 'topatakthai' => "\x{0E0F}", + 'tortoiseshellbracketleft' => "\x{3014}", + 'tortoiseshellbracketleftsmall' => "\x{FE5D}", + 'tortoiseshellbracketleftvertical' => "\x{FE39}", + 'tortoiseshellbracketright' => "\x{3015}", + 'tortoiseshellbracketrightsmall' => "\x{FE5E}", + 'tortoiseshellbracketrightvertical' => "\x{FE3A}", + 'totaothai' => "\x{0E15}", + 'tpalatalhook' => "\x{01AB}", + 'tparen' => "\x{24AF}", + 'trademarksans' => "\x{F8EA}", + 'trademarkserif' => "\x{F6DB}", + 'tretroflexhook' => "\x{0288}", + 'ts' => "\x{02A6}", + 'tsadi' => "\x{05E6}", + 'tsadidagesh' => "\x{FB46}", + 'tsadidageshhebrew' => "\x{FB46}", + 'tsadihebrew' => "\x{05E6}", + 'tsecyrillic' => "\x{0446}", + 'tsere' => "\x{05B5}", + 'tsere12' => "\x{05B5}", + 'tsere1e' => "\x{05B5}", + 'tsere2b' => "\x{05B5}", + 'tserehebrew' => "\x{05B5}", + 'tserenarrowhebrew' => "\x{05B5}", + 'tserequarterhebrew' => "\x{05B5}", + 'tserewidehebrew' => "\x{05B5}", + 'tshecyrillic' => "\x{045B}", + 'tsuperior' => "\x{F6F3}", + 'ttabengali' => "\x{099F}", + 'ttadeva' => "\x{091F}", + 'ttagujarati' => "\x{0A9F}", + 'ttagurmukhi' => "\x{0A1F}", + 'tteharabic' => "\x{0679}", + 'ttehfinalarabic' => "\x{FB67}", + 'ttehinitialarabic' => "\x{FB68}", + 'ttehmedialarabic' => "\x{FB69}", + 'tthabengali' => "\x{09A0}", + 'tthadeva' => "\x{0920}", + 'tthagujarati' => "\x{0AA0}", + 'tthagurmukhi' => "\x{0A20}", + 'tturned' => "\x{0287}", + 'tuhiragana' => "\x{3064}", + 'tukatakana' => "\x{30C4}", + 'tukatakanahalfwidth' => "\x{FF82}", + 'tusmallhiragana' => "\x{3063}", + 'tusmallkatakana' => "\x{30C3}", + 'tusmallkatakanahalfwidth' => "\x{FF6F}", + 'twelvecircle' => "\x{246B}", + 'twelveparen' => "\x{247F}", + 'twelveperiod' => "\x{2493}", + 'twelveroman' => "\x{217B}", + 'twentycircle' => "\x{2473}", + 'twentyhangzhou' => "\x{5344}", + 'twentyparen' => "\x{2487}", + 'twentyperiod' => "\x{249B}", + 'twoarabic' => "\x{0662}", + 'twobengali' => "\x{09E8}", + 'twocircle' => "\x{2461}", + 'twocircleinversesansserif' => "\x{278B}", + 'twodeva' => "\x{0968}", + 'twodotleader' => "\x{2025}", + 'twodotleadervertical' => "\x{FE30}", + 'twogujarati' => "\x{0AE8}", + 'twogurmukhi' => "\x{0A68}", + 'twohackarabic' => "\x{0662}", + 'twohangzhou' => "\x{3022}", + 'twoideographicparen' => "\x{3221}", + 'twoinferior' => "\x{2082}", + 'twomonospace' => "\x{FF12}", + 'twonumeratorbengali' => "\x{09F5}", + 'twooldstyle' => "\x{F732}", + 'twoparen' => "\x{2475}", + 'twoperiod' => "\x{2489}", + 'twopersian' => "\x{06F2}", + 'tworoman' => "\x{2171}", + 'twostroke' => "\x{01BB}", + 'twothai' => "\x{0E52}", + 'ubar' => "\x{0289}", + 'ubengali' => "\x{0989}", + 'ubopomofo' => "\x{3128}", + 'ucaron' => "\x{01D4}", + 'ucircle' => "\x{24E4}", + 'ucircumflexbelow' => "\x{1E77}", + 'ucyrillic' => "\x{0443}", + 'udattadeva' => "\x{0951}", + 'udblacute' => "\x{0171}", + 'udblgrave' => "\x{0215}", + 'udeva' => "\x{0909}", + 'udieresisacute' => "\x{01D8}", + 'udieresisbelow' => "\x{1E73}", + 'udieresiscaron' => "\x{01DA}", + 'udieresiscyrillic' => "\x{04F1}", + 'udieresisgrave' => "\x{01DC}", + 'udieresismacron' => "\x{01D6}", + 'udotbelow' => "\x{1EE5}", + 'ugujarati' => "\x{0A89}", + 'ugurmukhi' => "\x{0A09}", + 'uhiragana' => "\x{3046}", + 'uhookabove' => "\x{1EE7}", + 'uhornacute' => "\x{1EE9}", + 'uhorndotbelow' => "\x{1EF1}", + 'uhorngrave' => "\x{1EEB}", + 'uhornhookabove' => "\x{1EED}", + 'uhorntilde' => "\x{1EEF}", + 'uhungarumlautcyrillic' => "\x{04F3}", + 'uinvertedbreve' => "\x{0217}", + 'ukatakana' => "\x{30A6}", + 'ukatakanahalfwidth' => "\x{FF73}", + 'ukcyrillic' => "\x{0479}", + 'ukorean' => "\x{315C}", + 'umacroncyrillic' => "\x{04EF}", + 'umacrondieresis' => "\x{1E7B}", + 'umatragurmukhi' => "\x{0A41}", + 'umonospace' => "\x{FF55}", + 'underscoremonospace' => "\x{FF3F}", + 'underscorevertical' => "\x{FE33}", + 'underscorewavy' => "\x{FE4F}", + 'uparen' => "\x{24B0}", + 'upperdothebrew' => "\x{05C4}", + 'upsilonlatin' => "\x{028A}", + 'uptackbelowcmb' => "\x{031D}", + 'uptackmod' => "\x{02D4}", + 'uragurmukhi' => "\x{0A73}", + 'ushortcyrillic' => "\x{045E}", + 'usmallhiragana' => "\x{3045}", + 'usmallkatakana' => "\x{30A5}", + 'usmallkatakanahalfwidth' => "\x{FF69}", + 'ustraightcyrillic' => "\x{04AF}", + 'ustraightstrokecyrillic' => "\x{04B1}", + 'utildeacute' => "\x{1E79}", + 'utildebelow' => "\x{1E75}", + 'uubengali' => "\x{098A}", + 'uudeva' => "\x{090A}", + 'uugujarati' => "\x{0A8A}", + 'uugurmukhi' => "\x{0A0A}", + 'uumatragurmukhi' => "\x{0A42}", + 'uuvowelsignbengali' => "\x{09C2}", + 'uuvowelsigndeva' => "\x{0942}", + 'uuvowelsigngujarati' => "\x{0AC2}", + 'uvowelsignbengali' => "\x{09C1}", + 'uvowelsigndeva' => "\x{0941}", + 'uvowelsigngujarati' => "\x{0AC1}", + 'vadeva' => "\x{0935}", + 'vagujarati' => "\x{0AB5}", + 'vagurmukhi' => "\x{0A35}", + 'vakatakana' => "\x{30F7}", + 'vav' => "\x{05D5}", + 'vavdagesh' => "\x{FB35}", + 'vavdagesh65' => "\x{FB35}", + 'vavdageshhebrew' => "\x{FB35}", + 'vavhebrew' => "\x{05D5}", + 'vavholam' => "\x{FB4B}", + 'vavholamhebrew' => "\x{FB4B}", + 'vavvavhebrew' => "\x{05F0}", + 'vavyodhebrew' => "\x{05F1}", + 'vcircle' => "\x{24E5}", + 'vdotbelow' => "\x{1E7F}", + 'vecyrillic' => "\x{0432}", + 'veharabic' => "\x{06A4}", + 'vehfinalarabic' => "\x{FB6B}", + 'vehinitialarabic' => "\x{FB6C}", + 'vehmedialarabic' => "\x{FB6D}", + 'vekatakana' => "\x{30F9}", + 'venus' => "\x{2640}", + 'verticalbar' => "\x{007C}", + 'verticallineabovecmb' => "\x{030D}", + 'verticallinebelowcmb' => "\x{0329}", + 'verticallinelowmod' => "\x{02CC}", + 'verticallinemod' => "\x{02C8}", + 'vewarmenian' => "\x{057E}", + 'vhook' => "\x{028B}", + 'vikatakana' => "\x{30F8}", + 'viramabengali' => "\x{09CD}", + 'viramadeva' => "\x{094D}", + 'viramagujarati' => "\x{0ACD}", + 'visargabengali' => "\x{0983}", + 'visargadeva' => "\x{0903}", + 'visargagujarati' => "\x{0A83}", + 'vmonospace' => "\x{FF56}", + 'voarmenian' => "\x{0578}", + 'voicediterationhiragana' => "\x{309E}", + 'voicediterationkatakana' => "\x{30FE}", + 'voicedmarkkana' => "\x{309B}", + 'voicedmarkkanahalfwidth' => "\x{FF9E}", + 'vokatakana' => "\x{30FA}", + 'vparen' => "\x{24B1}", + 'vtilde' => "\x{1E7D}", + 'vturned' => "\x{028C}", + 'vuhiragana' => "\x{3094}", + 'vukatakana' => "\x{30F4}", + 'waekorean' => "\x{3159}", + 'wahiragana' => "\x{308F}", + 'wakatakana' => "\x{30EF}", + 'wakatakanahalfwidth' => "\x{FF9C}", + 'wakorean' => "\x{3158}", + 'wasmallhiragana' => "\x{308E}", + 'wasmallkatakana' => "\x{30EE}", + 'wattosquare' => "\x{3357}", + 'wavedash' => "\x{301C}", + 'wavyunderscorevertical' => "\x{FE34}", + 'wawarabic' => "\x{0648}", + 'wawfinalarabic' => "\x{FEEE}", + 'wawhamzaabovearabic' => "\x{0624}", + 'wawhamzaabovefinalarabic' => "\x{FE86}", + 'wbsquare' => "\x{33DD}", + 'wcircle' => "\x{24E6}", + 'wdotaccent' => "\x{1E87}", + 'wdotbelow' => "\x{1E89}", + 'wehiragana' => "\x{3091}", + 'wekatakana' => "\x{30F1}", + 'wekorean' => "\x{315E}", + 'weokorean' => "\x{315D}", + 'whitebullet' => "\x{25E6}", + 'whitecircle' => "\x{25CB}", + 'whitecircleinverse' => "\x{25D9}", + 'whitecornerbracketleft' => "\x{300E}", + 'whitecornerbracketleftvertical' => "\x{FE43}", + 'whitecornerbracketright' => "\x{300F}", + 'whitecornerbracketrightvertical' => "\x{FE44}", + 'whitediamond' => "\x{25C7}", + 'whitediamondcontainingblacksmalldiamond' => "\x{25C8}", + 'whitedownpointingsmalltriangle' => "\x{25BF}", + 'whitedownpointingtriangle' => "\x{25BD}", + 'whiteleftpointingsmalltriangle' => "\x{25C3}", + 'whiteleftpointingtriangle' => "\x{25C1}", + 'whitelenticularbracketleft' => "\x{3016}", + 'whitelenticularbracketright' => "\x{3017}", + 'whiterightpointingsmalltriangle' => "\x{25B9}", + 'whiterightpointingtriangle' => "\x{25B7}", + 'whitesmallsquare' => "\x{25AB}", + 'whitesmilingface' => "\x{263A}", + 'whitesquare' => "\x{25A1}", + 'whitestar' => "\x{2606}", + 'whitetelephone' => "\x{260F}", + 'whitetortoiseshellbracketleft' => "\x{3018}", + 'whitetortoiseshellbracketright' => "\x{3019}", + 'whiteuppointingsmalltriangle' => "\x{25B5}", + 'whiteuppointingtriangle' => "\x{25B3}", + 'wihiragana' => "\x{3090}", + 'wikatakana' => "\x{30F0}", + 'wikorean' => "\x{315F}", + 'wmonospace' => "\x{FF57}", + 'wohiragana' => "\x{3092}", + 'wokatakana' => "\x{30F2}", + 'wokatakanahalfwidth' => "\x{FF66}", + 'won' => "\x{20A9}", + 'wonmonospace' => "\x{FFE6}", + 'wowaenthai' => "\x{0E27}", + 'wparen' => "\x{24B2}", + 'wring' => "\x{1E98}", + 'wsuperior' => "\x{02B7}", + 'wturned' => "\x{028D}", + 'wynn' => "\x{01BF}", + 'xabovecmb' => "\x{033D}", + 'xbopomofo' => "\x{3112}", + 'xcircle' => "\x{24E7}", + 'xdieresis' => "\x{1E8D}", + 'xdotaccent' => "\x{1E8B}", + 'xeharmenian' => "\x{056D}", + 'xmonospace' => "\x{FF58}", + 'xparen' => "\x{24B3}", + 'xsuperior' => "\x{02E3}", + 'yaadosquare' => "\x{334E}", + 'yabengali' => "\x{09AF}", + 'yadeva' => "\x{092F}", + 'yaekorean' => "\x{3152}", + 'yagujarati' => "\x{0AAF}", + 'yagurmukhi' => "\x{0A2F}", + 'yahiragana' => "\x{3084}", + 'yakatakana' => "\x{30E4}", + 'yakatakanahalfwidth' => "\x{FF94}", + 'yakorean' => "\x{3151}", + 'yamakkanthai' => "\x{0E4E}", + 'yasmallhiragana' => "\x{3083}", + 'yasmallkatakana' => "\x{30E3}", + 'yasmallkatakanahalfwidth' => "\x{FF6C}", + 'yatcyrillic' => "\x{0463}", + 'ycircle' => "\x{24E8}", + 'ydotaccent' => "\x{1E8F}", + 'ydotbelow' => "\x{1EF5}", + 'yeharabic' => "\x{064A}", + 'yehbarreearabic' => "\x{06D2}", + 'yehbarreefinalarabic' => "\x{FBAF}", + 'yehfinalarabic' => "\x{FEF2}", + 'yehhamzaabovearabic' => "\x{0626}", + 'yehhamzaabovefinalarabic' => "\x{FE8A}", + 'yehhamzaaboveinitialarabic' => "\x{FE8B}", + 'yehhamzaabovemedialarabic' => "\x{FE8C}", + 'yehinitialarabic' => "\x{FEF3}", + 'yehmedialarabic' => "\x{FEF4}", + 'yehmeeminitialarabic' => "\x{FCDD}", + 'yehmeemisolatedarabic' => "\x{FC58}", + 'yehnoonfinalarabic' => "\x{FC94}", + 'yehthreedotsbelowarabic' => "\x{06D1}", + 'yekorean' => "\x{3156}", + 'yenmonospace' => "\x{FFE5}", + 'yeokorean' => "\x{3155}", + 'yeorinhieuhkorean' => "\x{3186}", + 'yerahbenyomohebrew' => "\x{05AA}", + 'yerahbenyomolefthebrew' => "\x{05AA}", + 'yericyrillic' => "\x{044B}", + 'yerudieresiscyrillic' => "\x{04F9}", + 'yesieungkorean' => "\x{3181}", + 'yesieungpansioskorean' => "\x{3183}", + 'yesieungsioskorean' => "\x{3182}", + 'yetivhebrew' => "\x{059A}", + 'yhook' => "\x{01B4}", + 'yhookabove' => "\x{1EF7}", + 'yiarmenian' => "\x{0575}", + 'yicyrillic' => "\x{0457}", + 'yikorean' => "\x{3162}", + 'yinyang' => "\x{262F}", + 'yiwnarmenian' => "\x{0582}", + 'ymonospace' => "\x{FF59}", + 'yod' => "\x{05D9}", + 'yoddagesh' => "\x{FB39}", + 'yoddageshhebrew' => "\x{FB39}", + 'yodhebrew' => "\x{05D9}", + 'yodyodhebrew' => "\x{05F2}", + 'yodyodpatahhebrew' => "\x{FB1F}", + 'yohiragana' => "\x{3088}", + 'yoikorean' => "\x{3189}", + 'yokatakana' => "\x{30E8}", + 'yokatakanahalfwidth' => "\x{FF96}", + 'yokorean' => "\x{315B}", + 'yosmallhiragana' => "\x{3087}", + 'yosmallkatakana' => "\x{30E7}", + 'yosmallkatakanahalfwidth' => "\x{FF6E}", + 'yotgreek' => "\x{03F3}", + 'yoyaekorean' => "\x{3188}", + 'yoyakorean' => "\x{3187}", + 'yoyakthai' => "\x{0E22}", + 'yoyingthai' => "\x{0E0D}", + 'yparen' => "\x{24B4}", + 'ypogegrammeni' => "\x{037A}", + 'ypogegrammenigreekcmb' => "\x{0345}", + 'yr' => "\x{01A6}", + 'yring' => "\x{1E99}", + 'ysuperior' => "\x{02B8}", + 'ytilde' => "\x{1EF9}", + 'yturned' => "\x{028E}", + 'yuhiragana' => "\x{3086}", + 'yuikorean' => "\x{318C}", + 'yukatakana' => "\x{30E6}", + 'yukatakanahalfwidth' => "\x{FF95}", + 'yukorean' => "\x{3160}", + 'yusbigcyrillic' => "\x{046B}", + 'yusbigiotifiedcyrillic' => "\x{046D}", + 'yuslittlecyrillic' => "\x{0467}", + 'yuslittleiotifiedcyrillic' => "\x{0469}", + 'yusmallhiragana' => "\x{3085}", + 'yusmallkatakana' => "\x{30E5}", + 'yusmallkatakanahalfwidth' => "\x{FF6D}", + 'yuyekorean' => "\x{318B}", + 'yuyeokorean' => "\x{318A}", + 'yyabengali' => "\x{09DF}", + 'yyadeva' => "\x{095F}", + 'zaarmenian' => "\x{0566}", + 'zadeva' => "\x{095B}", + 'zagurmukhi' => "\x{0A5B}", + 'zaharabic' => "\x{0638}", + 'zahfinalarabic' => "\x{FEC6}", + 'zahinitialarabic' => "\x{FEC7}", + 'zahiragana' => "\x{3056}", + 'zahmedialarabic' => "\x{FEC8}", + 'zainarabic' => "\x{0632}", + 'zainfinalarabic' => "\x{FEB0}", + 'zakatakana' => "\x{30B6}", + 'zaqefgadolhebrew' => "\x{0595}", + 'zaqefqatanhebrew' => "\x{0594}", + 'zarqahebrew' => "\x{0598}", + 'zayin' => "\x{05D6}", + 'zayindagesh' => "\x{FB36}", + 'zayindageshhebrew' => "\x{FB36}", + 'zayinhebrew' => "\x{05D6}", + 'zbopomofo' => "\x{3117}", + 'zcircle' => "\x{24E9}", + 'zcircumflex' => "\x{1E91}", + 'zcurl' => "\x{0291}", + 'zdot' => "\x{017C}", + 'zdotbelow' => "\x{1E93}", + 'zecyrillic' => "\x{0437}", + 'zedescendercyrillic' => "\x{0499}", + 'zedieresiscyrillic' => "\x{04DF}", + 'zehiragana' => "\x{305C}", + 'zekatakana' => "\x{30BC}", + 'zeroarabic' => "\x{0660}", + 'zerobengali' => "\x{09E6}", + 'zerodeva' => "\x{0966}", + 'zerogujarati' => "\x{0AE6}", + 'zerogurmukhi' => "\x{0A66}", + 'zerohackarabic' => "\x{0660}", + 'zeroinferior' => "\x{2080}", + 'zeromonospace' => "\x{FF10}", + 'zerooldstyle' => "\x{F730}", + 'zeropersian' => "\x{06F0}", + 'zerosuperior' => "\x{2070}", + 'zerothai' => "\x{0E50}", + 'zerowidthjoiner' => "\x{FEFF}", + 'zerowidthnonjoiner' => "\x{200C}", + 'zerowidthspace' => "\x{200B}", + 'zhbopomofo' => "\x{3113}", + 'zhearmenian' => "\x{056A}", + 'zhebrevecyrillic' => "\x{04C2}", + 'zhecyrillic' => "\x{0436}", + 'zhedescendercyrillic' => "\x{0497}", + 'zhedieresiscyrillic' => "\x{04DD}", + 'zihiragana' => "\x{3058}", + 'zikatakana' => "\x{30B8}", + 'zinorhebrew' => "\x{05AE}", + 'zlinebelow' => "\x{1E95}", + 'zmonospace' => "\x{FF5A}", + 'zohiragana' => "\x{305E}", + 'zokatakana' => "\x{30BE}", + 'zparen' => "\x{24B5}", + 'zretroflexhook' => "\x{0290}", + 'zstroke' => "\x{01B6}", + 'zuhiragana' => "\x{305A}", + 'zukatakana' => "\x{30BA}", + ); + +# Add to this list the glyphs for new fonts (from aglfn13): + +map { $agl{$names{$_}} = pack('U',hex ($_))} (keys %names); + + +# %doubles = (map{$_ => "uni$_"} qw(0394 03A9 0162 2215 00AD 02C9 03BC 2219 00A0 0163)); + +=head2 lookup ( $usv [, $noAlt [, $noUni] ]) + +return the Adobe-recommended glyph name for a specific Unicode codepoint (integer). By default +returns C names rather than C or C names + +If C<$noAlt> is true, C and C names are returned rather than C. + +if C<$noUni> is true, returns undef if it would have to resort to C or C +style names. Essentially this represents a straight lookup in the Adobe-recommended list. + +=cut + +sub lookup +{ + my ($num, $noalt, $noUni) = @_; + my ($val) = sprintf("%04X", $num); + + if (defined $names{$val}) + { + return $names{$val} if ($noalt || $names{$val} !~ m/^(?:afii|SF)/o); + } + return undef if $noUni; + if ($num > 0xFFFF) + { return "u$val"; } + elsif ($num) + { return "uni$val"; } + else + { return ".notdef"; } +} + +=head2 parse ( $glyphname ) + +Parse an Adobe-conformant glyph name, generating a Unicode codepoint sequence equivalent to the glyph (or +glyph components, should the name represent a ligature). In scalar context, returns a reference to an +array of Unicodes (decimal). Array is empty if the glyph name is non-conformant. +In list context, the first item returned is the same array reference as above. The second item +is a reference to an array containing the extensions (if any) present on the glyph name. +The '.' that precedes each extension is not included. + +=cut + +sub parse +{ + my ($gname, @USVs, @extensions); + ($gname, @extensions) = split('\.', $_[0]); + # if name originally started with . (e.g., .null) then $gname will now be '' ... need to fix that up: + $gname = '.' . shift(@extensions) if $gname eq ''; + if (defined $gname) + { + foreach $gname (split('_', $gname)) + { + if ($gname =~ /^u[0-9a-fA-F]{4,6}$/) + { + push @USVs, hex(substr($gname, 1)); + } + elsif ($gname =~ /^uni([0-9a-fA-F]{4,4})+$/) + { + push @USVs, map {hex($_)} ($gname =~ /([0-9a-fA-F]{4,4})/g) + } + elsif (exists $agl{$gname}) + { + push @USVs, unpack ('U*', $agl{$gname}); + } + } + } + return \@USVs unless wantarray; + my @res = (\@USVs, \@extensions); + return @res; +} + +#Code used to parse Adobe's agl file and generate text for %agl initialization: +#while () { +# chomp; +# next if m/^#/; +# my ($gname, @nums) = split(/[; ]/); +# if ($#nums > 0 or !defined ($Font::TTF::PSNames::names{$nums[0]}) or $Font::TTF::PSNames::names{$nums[0]} ne $gname) +# { +# print "\t'$gname' => \""; +# map {print "\\x{$_}" } @nums; +# print "\",\n"; +# } +# } + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + +1; diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Post.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Post.pm new file mode 100644 index 0000000..4bf284e --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Post.pm @@ -0,0 +1,306 @@ +package Font::TTF::Post; + +=head1 NAME + +Font::TTF::Post - Holds the Postscript names for each glyph + +=head1 DESCRIPTION + +Holds the postscript names for glyphs. Note that they are not held as an +array, but as indexes into two lists. The first list is the standard Postscript +name list defined by the TrueType standard. The second comes from the font +directly. + +Looking up a glyph from a Postscript name or a name from a glyph number is +achieved through methods rather than variable lookup. + +This class handles PostScript table types of 1, 2, 2.5 & 3, but not version 4. +Support for version 2.5 is as per Apple spec rather than MS. + +The way to look up Postscript names or glyphs is: + + $pname = $f->{'post'}{'VAL'}[$gnum]; + $gnum = $f->{'post'}{'STRINGS'}{$pname}; + +=head1 INSTANCE VARIABLES + +Due to different systems having different limitations, there are various class +variables available to control what post table types can be written. + +=over 4 + +=item $Font::TTF::Post::no25 + +If set tells Font::TTF::Post::out to use table type 2 instead of 2.5 in case apps +can't handle version 2.5. + +=item VAL + +Contains an array indexed by glyph number of Postscript names. This is used when +writing out a font. + +=item STRINGS + +An associative array of Postscript names mapping to the highest glyph with that +name. These may not be in sync with VAL. + +=back + +In addition there are the standard introductory variables defined in the +standard: + + FormatType + italicAngle + underlinePosition + underlineThickness + isFixedPitch + minMemType42 + maxMemType42 + minMemType1 + maxMemType1 + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA @base_set %base_set %fields $VERSION $no25 @field_info @base_set); +require Font::TTF::Table; +use Font::TTF::Utils; + +$no25 = 1; # officially deprecated format 2.5 tables in MS spec 1.3 + +@ISA = qw(Font::TTF::Table); +@field_info = ( + 'FormatType' => 'f', + 'italicAngle' => 'f', + 'underlinePosition' => 's', + 'underlineThickness' => 's', + 'isFixedPitch' => 'L', + 'minMemType42' => 'L', + 'maxMemType42' => 'L', + 'minMemType1' => 'L', + 'maxMemType1' => 'L'); +@base_set = qw(.notdef .null nonmarkingreturn space exclam quotedbl numbersign dollar percent ampersand quotesingle + parenleft parenright asterisk plus comma hyphen period slash zero one two three four five six + seven eight nine colon semicolon less equal greater question at A B C D E F G H I J K L M N O P Q + R S T U V W X Y Z bracketleft backslash bracketright asciicircum underscore grave a b c d e f g h + i j k l m n o p q r s t u v w x y z braceleft bar braceright asciitilde Adieresis Aring Ccedilla + Eacute Ntilde Odieresis Udieresis aacute agrave acircumflex adieresis atilde aring ccedilla eacute + egrave ecircumflex edieresis iacute igrave icircumflex idieresis ntilde oacute ograve ocircumflex + odieresis otilde uacute ugrave ucircumflex udieresis dagger degree cent sterling section bullet + paragraph germandbls registered copyright trademark acute dieresis notequal AE Oslash infinity + plusminus lessequal greaterequal yen mu partialdiff summation product pi integral ordfeminine + ordmasculine Omega ae oslash questiondown exclamdown logicalnot radical florin approxequal + Delta guillemotleft guillemotright ellipsis nonbreakingspace Agrave Atilde Otilde OE oe endash emdash + quotedblleft quotedblright quoteleft quoteright divide lozenge ydieresis Ydieresis fraction currency + guilsinglleft guilsinglright fi fl daggerdbl periodcentered quotesinglbase quotedblbase perthousand + Acircumflex Ecircumflex Aacute Edieresis Egrave Iacute Icircumflex Idieresis Igrave Oacute Ocircumflex + apple Ograve Uacute Ucircumflex Ugrave dotlessi circumflex tilde macron breve dotaccent + ring cedilla hungarumlaut ogonek caron Lslash lslash Scaron scaron Zcaron zcaron brokenbar Eth eth + Yacute yacute Thorn thorn minus multiply onesuperior twosuperior threesuperior onehalf onequarter + threequarters franc Gbreve gbreve Idotaccent Scedilla scedilla Cacute cacute Ccaron ccaron dcroat); + +$VERSION = 0.01; # MJPH 5-AUG-1998 Re-organise data structures + +sub init +{ + my ($k, $v, $c, $i); + for ($i = 0; $i < $#field_info; $i += 2) + { + ($k, $v, $c) = TTF_Init_Fields($field_info[$i], $c, $field_info[$i + 1]); + next unless defined $k && $k ne ""; + $fields{$k} = $v; + } + $i = 0; + %base_set = map {$_ => $i++} @base_set; +} + + +=head2 $t->read + +Reads the Postscript table into memory from disk + +=cut + +sub read +{ + my ($self) = @_; + my ($dat, $dat1, $i, $off, $c, $maxoff, $form, $angle, $numGlyphs); + my ($fh) = $self->{' INFILE'}; + + $numGlyphs = $self->{' PARENT'}{'maxp'}{'numGlyphs'}; + $self->SUPER::read or return $self; + init unless ($fields{'FormatType'}); + $fh->read($dat, 32); + TTF_Read_Fields($self, $dat, \%fields); + + if (int($self->{'FormatType'} + .5) == 1) + { + for ($i = 0; $i < 258; $i++) + { + $self->{'VAL'}[$i] = $base_set[$i]; + $self->{'STRINGS'}{$base_set[$i]} = $i unless (defined $self->{'STRINGS'}{$base_set[$i]}); + } + } elsif (int($self->{'FormatType'} * 2 + .1) == 5) + { + $fh->read($dat, 2); + $numGlyphs = unpack("n", $dat); + $fh->read($dat, $numGlyphs); + for ($i = 0; $i < $numGlyphs; $i++) + { + $off = unpack("c", substr($dat, $i, 1)); + $self->{'VAL'}[$i] = $base_set[$i + $off]; + $self->{'STRINGS'}{$base_set[$i + $off]} = $i unless (defined $self->{'STRINGS'}{$base_set[$i + $off]}); + } + } elsif (int($self->{'FormatType'} + .5) == 2) + { + my (@strings); + + $fh->read($dat, ($numGlyphs + 1) << 1); + for ($i = 0; $i < $numGlyphs; $i++) + { + $off = unpack("n", substr($dat, ($i + 1) << 1, 2)); + $maxoff = $off if (!defined $maxoff || $off > $maxoff); + } + for ($i = 0; $i < $maxoff - 257; $i++) + { + $fh->read($dat1, 1); + $off = unpack("C", $dat1); + $fh->read($dat1, $off); + $strings[$i] = $dat1; + } + for ($i = 0; $i < $numGlyphs; $i++) + { + $off = unpack("n", substr($dat, ($i + 1) << 1, 2)); + if ($off > 257) + { + $self->{'VAL'}[$i] = $strings[$off - 258]; + $self->{'STRINGS'}{$strings[$off - 258]} = $i; + } + else + { + $self->{'VAL'}[$i] = $base_set[$off]; + $self->{'STRINGS'}{$base_set[$off]} = $i unless (defined $self->{'STRINGS'}{$base_set[$off]}); + } + } + } + $self; +} + + +=head2 $t->out($fh) + +Writes out a new Postscript name table from memory or copies from disk + +=cut + +sub out +{ + my ($self, $fh) = @_; + my ($i, $num); + + return $self->SUPER::out($fh) unless $self->{' read'}; + + $num = $self->{' PARENT'}{'maxp'}{'numGlyphs'}; + + init unless ($fields{'FormatType'}); + + for ($i = $#{$self->{'VAL'}}; !defined $self->{'VAL'}[$i] && $i > 0; $i--) + { pop(@{$self->{'VAL'}}); } + if ($#{$self->{'VAL'}} < 0) + { $self->{'FormatType'} = 3; } + else + { + $self->{'FormatType'} = 1; + for ($i = 0; $i < $num; $i++) + { + if (!defined $base_set{$self->{'VAL'}[$i]}) + { + $self->{'FormatType'} = 2; + last; + } + elsif ($base_set{$self->{'VAL'}[$i]} != $i) + { $self->{'FormatType'} = ($no25 ? 2 : 2.5); } + } + } + + $fh->print(TTF_Out_Fields($self, \%fields, 32)); + + return $self if (int($self->{'FormatType'} + .4) == 3); + + if (int($self->{'FormatType'} + .5) == 2) + { + my (@ind); + my ($count) = 0; + + $fh->print(pack("n", $num)); + for ($i = 0; $i < $num; $i++) + { + if (defined $base_set{$self->{'VAL'}[$i]}) + { $fh->print(pack("n", $base_set{$self->{'VAL'}[$i]})); } + else + { + $fh->print(pack("n", $count + 258)); + $ind[$count++] = $i; + } + } + for ($i = 0; $i < $count; $i++) + { + $fh->print(pack("C", length($self->{'VAL'}[$ind[$i]]))); + $fh->print($self->{'VAL'}[$ind[$i]]); + } + } elsif (int($self->{'FormatType'} * 2 + .5) == 5) + { + $fh->print(pack("n", $num)); + for ($i = 0; $i < $num; $i++) + { $fh->print(pack("c", defined $base_set{$self->{'VAL'}[$i]} ? + $base_set{$self->{'VAL'}[$i]} - $i : -$i)); } + } + + $self; +} + + +=head2 $t->XML_element($context, $depth, $key, $val) + +Outputs the names as one block of XML + +=cut + +sub XML_element +{ + my ($self) = shift; + my ($context, $depth, $key, $val) = @_; + my ($fh) = $context->{'fh'}; + my ($i); + + return $self->SUPER::XML_element(@_) unless ($key eq 'STRINGS' || $key eq 'VAL'); + return unless ($key eq 'VAL'); + + $fh->print("$depth\n"); + for ($i = 0; $i <= $#{$self->{'VAL'}}; $i++) + { $fh->print("$depth$context->{'indent'}\n"); } + $fh->print("$depth\n"); + $self; +} + +1; + +=head1 BUGS + +=over 4 + +=item * + +No support for type 4 tables + +=back + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Prep.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Prep.pm new file mode 100644 index 0000000..453cf5a --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Prep.pm @@ -0,0 +1,89 @@ +package Font::TTF::Prep; + +=head1 NAME + +Font::TTF::Prep - Preparation hinting program. Called when ppem changes + +=head1 DESCRIPTION + +This is a minimal class adding nothing beyond a table, but is a repository +for prep type information for those processes brave enough to address hinting. + +=cut + +use strict; +use vars qw(@ISA $VERSION); +use Font::TTF::Utils; + +@ISA = qw(Font::TTF::Table); + +$VERSION = 0.0001; + + +=head2 $t->read + +Reads the data using C. + +=cut + +sub read +{ + $_[0]->read_dat; + $_[0]->{' read'} = 1; +} + + +=head2 $t->out_xml($context, $depth) + +Outputs Prep program as XML + +=cut + +sub out_xml +{ + my ($self, $context, $depth) = @_; + my ($fh) = $context->{'fh'}; + my ($dat); + + $self->read; + $dat = Font::TTF::Utils::XML_binhint($self->{' dat'}); + $dat =~ s/\n(?!$)/\n$depth$context->{'indent'}/omg; + $fh->print("$depth\n"); + $fh->print("$depth$context->{'indent'}$dat"); + $fh->print("$depth\n"); + $self; +} + + +=head2 $t->XML_end($context, $tag, %attrs) + +Parse all that hinting code + +=cut + +sub XML_end +{ + my ($self) = shift; + my ($context, $tag, %attrs) = @_; + + if ($tag eq 'code') + { + $self->{' dat'} = Font::TTF::Utils::XML_hintbin($context->{'text'}); + return $context; + } else + { return $self->SUPER::XML_end(@_); } +} + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Prop.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Prop.pm new file mode 100644 index 0000000..b74c654 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Prop.pm @@ -0,0 +1,154 @@ +package Font::TTF::Prop; + +=head1 NAME + +Font::TTF::Prop - Glyph Properties table in a font + +=head1 DESCRIPTION + +=head1 INSTANCE VARIABLES + +=item version + +=item default + +=item lookup + +Hash of property values keyed by glyph number + +=item lookupFormat + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA); +use Font::TTF::Utils; +use Font::TTF::AATutils; +use Font::TTF::Segarr; + +@ISA = qw(Font::TTF::Table); + +=head2 $t->read + +Reads the table into memory + +=cut + +sub read +{ + my ($self) = @_; + my ($dat, $fh); + my ($version, $lookupPresent, $default); + + $self->SUPER::read or return $self; + + $fh = $self->{' INFILE'}; + $fh->read($dat, 8); + ($version, $lookupPresent, $default) = TTF_Unpack("vSS", $dat); + + if ($lookupPresent) { + my ($format, $lookup) = AAT_read_lookup($fh, 2, $self->{' LENGTH'} - 8, $default); + $self->{'lookup'} = $lookup; + $self->{'format'} = $format; + } + + $self->{'version'} = $version; + $self->{'default'} = $default; + + $self; +} + + +=head2 $t->out($fh) + +Writes the table to a file either from memory or by copying + +=cut + +sub out +{ + my ($self, $fh) = @_; + my ($default, $lookup); + + return $self->SUPER::out($fh) unless $self->{' read'}; + + $default = $self->{'default'}; + $lookup = $self->{'lookup'}; + $fh->print(TTF_Pack("vSS", $self->{'version'}, (defined $lookup ? 1 : 0), $default)); + + AAT_write_lookup($fh, $self->{'format'}, $lookup, 2, $default) if (defined $lookup); +} + +=head2 $t->print($fh) + +Prints a human-readable representation of the table + +=cut + +sub print +{ + my ($self, $fh) = @_; + my ($lookup); + + $self->read; + + $fh = 'STDOUT' unless defined $fh; + + $fh->printf("version %f\ndefault %04x # %s\n", $self->{'version'}, $self->{'default'}, meaning_($self->{'default'})); + $lookup = $self->{'lookup'}; + if (defined $lookup) { + $fh->printf("format %d\n", $self->{'format'}); + foreach (sort { $a <=> $b } keys %$lookup) { + $fh->printf("\t%d -> %04x # %s\n", $_, $lookup->{$_}, meaning_($lookup->{$_})); + } + } +} + +sub meaning_ +{ + my ($val) = @_; + my ($res); + + my @types = ( + "Strong left-to-right", + "Strong right-to-left", + "Arabic letter", + "European number", + "European number separator", + "European number terminator", + "Arabic number", + "Common number separator", + "Block separator", + "Segment separator", + "Whitespace", + "Other neutral"); + $res = $types[$val & 0x001f] or ("Undefined [" . ($val & 0x001f) . "]"); + + $res .= ", floater" if $val & 0x8000; + $res .= ", hang left" if $val & 0x4000; + $res .= ", hang right" if $val & 0x2000; + $res .= ", attaches on right" if $val & 0x0080; + $res .= ", pair" if $val & 0x1000; + my $pairOffset = ($val & 0x0f00) >> 8; + $pairOffset = $pairOffset - 16 if $pairOffset > 7; + $res .= $pairOffset > 0 ? " +" . $pairOffset : $pairOffset < 0 ? " " . $pairOffset : ""; + + $res; +} + +1; + + +=head1 BUGS + +None known + +=head1 AUTHOR + +Jonathan Kew L. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Segarr.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Segarr.pm new file mode 100644 index 0000000..980188d --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Segarr.pm @@ -0,0 +1,376 @@ +package Font::TTF::Segarr; + +=head1 NAME + +Font::TTF::Segarr - Segmented array + +=head1 DESCRIPTION + +Holds data either directly or indirectly as a series of arrays. This class +looks after the set of arrays and masks the individual sub-arrays, thus saving +a class, we hope. + +=head1 INSTANCE VARIABLES + +All instance variables do not start with a space. + +The segmented array is simply an array of segments + +Each segment is a more complex affair: + +=over 4 + +=item START + +In terms of the array, the address for the 0th element in this segment. + +=item LEN + +Number of elements in this segment + +=item VAL + +The array which contains the elements + +=back + +=head1 METHODS + +=cut + +use strict; +use vars qw(@types $VERSION); +$VERSION = 0.0001; + +@types = ('', 'C', 'n', '', 'N'); + +=head2 Font::TTF::Segarr->new($size) + +Creates a new segmented array with a given data size + +=cut + +sub new +{ + my ($class) = @_; + my ($self) = []; + + bless $self, (ref($class) || $class); +} + + +=head2 $s->fastadd_segment($start, $is_sparse, @dat) + +Creates a new segment and adds it to the array assuming no overlap between +the new segment and any others in the array. $is_sparse indicates whether the +passed in array contains Cs or not. If false no checking is done (which +is faster, but riskier). If equal to 2 then 0 is considered undef as well. + +Returns the number of segments inserted. + +=cut + +sub fastadd_segment +{ + my ($self) = shift; + my ($start) = shift; + my ($sparse) = shift; + my ($p, $i, $seg, @seg); + + + if ($sparse) + { + for ($i = 0; $i <= $#_; $i++) + { + if (!defined $seg && (($sparse != 2 && defined $_[$i]) || $_[$i] != 0)) + { $seg->{'START'} = $start + $i; $seg->{'VAL'} = []; } + + if (defined $seg && (($sparse == 2 && $_[$i] == 0) || !defined $_[$i])) + { + $seg->{'LEN'} = $start + $i - $seg->{'START'}; + push(@seg, $seg); + $seg = undef; + } elsif (defined $seg) + { push (@{$seg->{'VAL'}}, $_[$i]); } + } + if (defined $seg) + { + push(@seg, $seg); + $seg->{'LEN'} = $start + $i - $seg->{'START'}; + } + } else + { + $seg->{'START'} = $start; + $seg->{'LEN'} = $#_ + 1; + $seg->{'VAL'} = [@_]; + @seg = ($seg); + } + + for ($i = 0; $i <= $#$self; $i++) + { + if ($self->[$i]{'START'} > $start) + { + splice(@$self, $i, 0, @seg); + return wantarray ? @seg : scalar(@seg); + } + } + push(@$self, @seg); + return wantarray ? @seg : scalar(@seg); +} + + +=head2 $s->add_segment($start, $overwrite, @dat) + +Creates a new segment and adds it to the array allowing for possible overlaps +between the new segment and the existing ones. In the case of overlaps, elements +from the new segment are deleted unless $overwrite is set in which case the +elements already there are over-written. + +This method also checks the data coming in to see if it is sparse (i.e. contains +undef values). Gaps cause new segments to be created or not to over-write existing +values. + +=cut + +sub add_segment +{ + my ($self) = shift; + my ($start) = shift; + my ($over) = shift; + my ($seg, $i, $s, $offset, $j, $newi); + + return $self->fastadd_segment($start, $over, @_) if ($#$self < 0); + $offset = 0; + for ($i = 0; $i <= $#$self && $offset <= $#_; $i++) + { + $s = $self->[$i]; + if ($s->{'START'} <= $start + $offset) # only < for $offset == 0 + { + if ($s->{'START'} + $s->{'LEN'} > $start + $#_) + { + for ($j = $offset; $j <= $#_; $j++) + { + if ($over) + { $s->{'VAL'}[$start - $s->{'START'} + $j] = $_[$j] if defined $_[$j]; } + else + { $s->{'VAL'}[$start - $s->{'START'} + $j] ||= $_[$j] if defined $_[$j]; } + } + $offset = $#_ + 1; + last; + } elsif ($s->{'START'} + $s->{'LEN'} > $start + $offset) # is $offset needed here? + { + for ($j = $offset; $j < $s->{'START'} + $s->{'LEN'} - $start; $j++) + { + if ($over) + { $s->{'VAL'}[$start - $s->{'START'} + $j] = $_[$j] if defined $_[$j]; } + else + { $s->{'VAL'}[$start - $s->{'START'} + $j] ||= $_[$j] if defined $_[$j]; } + } + $offset = $s->{'START'} + $s->{'LEN'} - $start; + } + } else # new seg please + { + if ($s->{'START'} > $start + $#_ + 1) + { + $i += $self->fastadd_segment($start + $offset, 1, @_[$offset .. $#_]) - 1; + $offset = $#_ + 1; + } + else + { + $i += $self->fastadd_segment($start + $offset, 1, @_[$offset .. $s->{'START'} - $start]) - 1; + $offset = $s->{'START'} - $start + 1; + } + } + } + if ($offset <= $#_) + { + $seg->{'START'} = $start + $offset; + $seg->{'LEN'} = $#_ - $offset + 1; + $seg->{'VAL'} = [@_[$offset .. $#_]]; + push (@$self, $seg); + } + $self->tidy; +} + + +=head2 $s->tidy + +Merges any immediately adjacent segments + +=cut + +sub tidy +{ + my ($self) = @_; + my ($i, $sl, $s); + + for ($i = 1; $i <= $#$self; $i++) + { + $sl = $self->[$i - 1]; + $s = $self->[$i]; + if ($s->{'START'} == $sl->{'START'} + $sl->{'LEN'}) + { + $sl->{'LEN'} += $s->{'LEN'}; + push (@{$sl->{'VAL'}}, @{$s->{'VAL'}}); + splice(@$self, $i, 1); + $i--; + } + } + $self; +} + + +=head2 $s->at($addr, [$len]) + +Looks up the data held at the given address by locating the appropriate segment +etc. If $len > 1 then returns an array of values, spaces being filled with undef. + +=cut + +sub at +{ + my ($self, $addr, $len) = @_; + my ($i, $dat, $s, @res, $offset); + + $len = 1 unless defined $len; + $offset = 0; + for ($i = 0; $i <= $#$self; $i++) + { + $s = $self->[$i]; + next if ($s->{'START'} + $s->{'LEN'} < $addr + $offset); # only fires on $offset == 0 + if ($s->{'START'} > $addr + $offset) + { + push (@res, (undef) x ($s->{'START'} > $addr + $len ? + $len - $offset : $s->{'START'} - $addr - $offset)); + $offset = $s->{'START'} - $addr; + } + last if ($s->{'START'} >= $addr + $len); + + if ($s->{'START'} + $s->{'LEN'} >= $addr + $len) + { + push (@res, @{$s->{'VAL'}}[$addr + $offset - $s->{'START'} .. + $addr + $len - $s->{'START'} - 1]); + $offset = $len; + last; + } else + { + push (@res, @{$s->{'VAL'}}[$addr + $offset - $s->{'START'} .. $s->{'LEN'} - 1]); + $offset = $s->{'START'} + $s->{'LEN'} - $addr; + } + } + push (@res, (undef) x ($len - $offset)) if ($offset < $len); + return wantarray ? @res : $res[0]; +} + + +=head2 $s->remove($addr, [$len]) + +Removes the item or items from addr returning them as an array or the first +value in a scalar context. This is very like C, including padding with +undef, but it deletes stuff as it goes. + +=cut + +sub remove +{ + my ($self, $addr, $len) = @_; + my ($i, $dat, $s, @res, $offset); + + $len = 1 unless defined $len; + $offset = 0; + for ($i = 0; $i <= $#$self; $i++) + { + $s = $self->[$i]; + next if ($s->{'START'} + $s->{'LEN'} < $addr + $offset); + if ($s->{'START'} > $addr + $offset) + { + push (@res, (undef) x ($s->{'START'} > $addr + $len ? + $len - $offset : $s->{'START'} - $addr - $offset)); + $offset = $s->{'START'} - $addr; + } + last if ($s->{'START'} >= $addr + $len); + + unless ($s->{'START'} == $addr + $offset) + { + my ($seg) = {}; + + $seg->{'START'} = $s->{'START'}; + $seg->{'LEN'} = $addr + $offset - $s->{'START'}; + $seg->{'VAL'} = [splice(@{$s->{'VAL'}}, 0, $addr + $offset - $s->{'START'})]; + $s->{'LEN'} -= $addr + $offset - $s->{'START'}; + $s->{'START'} = $addr + $offset; + + splice(@$self, $i, 0, $seg); + $i++; + } + + if ($s->{'START'} + $s->{'LEN'} >= $addr + $len) + { + push (@res, splice(@{$s->{'VAL'}}, 0, $len - $offset)); + $s->{'LEN'} -= $len - $offset; + $s->{'START'} += $len - $offset; + $offset = $len; + last; + } else + { + push (@res, @{$s->{'VAL'}}); + $offset = $s->{'START'} + $s->{'LEN'} - $addr; + splice(@$self, $i, 0); + $i--; + } + } + push (@res, (undef) x ($len - $offset)) if ($offset < $len); + return wantarray ? @res : $res[0]; +} + + +=head2 $s->copy + +Deep copies this array + +=cut + +sub copy +{ + my ($self) = @_; + my ($res, $p); + + $res = []; + foreach $p (@$self) + { push (@$res, $self->copy_seg($p)); } + $res; +} + + +=head2 $s->copy_seg($seg) + +Creates a deep copy of a segment + +=cut + +sub copy_seg +{ + my ($self, $seg) = @_; + my ($p, $res); + + $res = {}; + $res->{'VAL'} = [@{$seg->{'VAL'}}]; + foreach $p (keys %$seg) + { $res->{$p} = $seg->{$p} unless defined $res->{$p}; } + $res; +} + + +1; + +=head1 BUGS + +No known bugs. + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Sill.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Sill.pm new file mode 100644 index 0000000..6a17af1 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Sill.pm @@ -0,0 +1,114 @@ +package Font::TTF::Sill; + +=head1 NAME + +Font::TTF::Sill - Graphite language mapping table + +=head1 DESCRIPTION + +=head1 INSTANCE VARIABLES + +=over 4 + +=item version + +Table version number. + +=item langs + +Contains a hash where the key is the language id and the value is an array of +language records + +=back + +=head2 Language Records + +Each language record is itself an array of two values [fid, val]. fid is the +feature id and is held as a long. + +=cut + +use Font::TTF::Utils; +require Font::TTF::Table; + +@ISA = qw(Font::TTF::Table); + +sub read +{ + my ($self) = @_; + my ($num, $i, $j); + + return $self if ($self->{' read'}); + $self->SUPER::read_dat or return $self; + + ($self->{'version'}, $num) = TTF_Unpack("vS", $self->{' dat'}); + + foreach $i (1 .. $num) # ignore bogus entry at end + { + my ($lid, $numf, $offset) = unpack("A4nn", substr($self->{' dat'}, $i * 8 + 4)); # 12 - 8 = 4 since i starts at 1. A4 strips nulls + my (@settings); + + foreach $j (1 .. $numf) + { + my ($fid, $val) = TTF_Unpack("Ls", substr($self->{' dat'}, $offset + $j * 8 - 8)); + push (@settings, [$fid, $val]); + } + $self->{'langs'}{$lid} = [@settings]; + } + delete $self->{' dat'}; + $self->{' read'} = 1; + $self; +} + +sub out +{ + my ($self, $fh) = @_; + my ($num, $range, $select, $shift) = TTF_bininfo(scalar keys %{$self->{'langs'}}, 1); + my ($offset) = $num * 8 + 20; #header = 12, dummy = 8 + my ($k, $s); + + return $self->SUPER::out($fh) unless ($self->{' read'}); + $fh->print(TTF_Pack("vSSSS", $self->{'version'}, $num, $range, $select, $shift)); + foreach $k (sort (keys %{$self->{'langs'}}), '+1') + { + my ($numf) = scalar @{$self->{'langs'}{$k}} unless ($k eq '+1'); + $fh->print(pack("a4nn", $k, $numf, $offset)); + $offset += $numf * 8; + } + + foreach $k (sort keys %{$self->{'langs'}}) + { + foreach $s (@{$self->{'langs'}{$k}}) + { $fh->print(TTF_Pack("LsS", @{$s}, 0)); } + } + $self; +} + +sub XML_element +{ + my ($self) = shift; + my ($context, $depth, $key, $dat) = @_; + my ($fh) = $context->{'fh'}; + my ($k, $s); + + return $self->SUPER::XML_element(@_) unless ($key eq 'langs'); + foreach $k (sort keys %{$self->{'langs'}}) + { + $fh->printf("%s\n", $depth, $k); + foreach $s (@{$self->{'langs'}{$k}}) + { + my ($fid) = $s->[0]; + if ($fid > 0x00FFFFFF) + { $fid = unpack("A4", pack ("N", $fid)); } + else + { $fid = sprintf("%d", $fid); } + $fh->printf("%s%s\n", + $depth, $context->{'indent'}, $fid, $s->[1]); + } + $fh->printf("%s\n", $depth); + } + $self; +} +1; + + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Table.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Table.pm new file mode 100644 index 0000000..bbdb48d --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Table.pm @@ -0,0 +1,382 @@ +package Font::TTF::Table; + +=head1 NAME + +Font::TTF::Table - Superclass for tables and used for tables we don't have a class for + +=head1 DESCRIPTION + +Looks after the purely table aspects of a TTF table, such as whether the table +has been read before, locating the file pointer, etc. Also copies tables from +input to output. + +=head1 INSTANCE VARIABLES + +Instance variables start with a space + +=over 4 + +=item read + +Flag which indicates that the table has already been read from file. + +=item dat + +Allows the creation of unspecific tables. Data is simply output to any font +file being created. + +=item INFILE + +The read file handle + +=item OFFSET + +Location of the file in the input file + +=item LENGTH + +Length in the input directory + +=item CSUM + +Checksum read from the input file's directory + +=item PARENT + +The L that table is part of + +=back + +=head1 METHODS + +=cut + +use strict; +use vars qw($VERSION); +use Font::TTF::Utils; + +$VERSION = 0.0001; + +=head2 Font::TTF::Table->new(%parms) + +Creates a new table or subclass. Table instance variables are passed in +at this point as an associative array. + +=cut + +sub new +{ + my ($class, %parms) = @_; + my ($self) = {}; + my ($p); + + $class = ref($class) || $class; + foreach $p (keys %parms) + { $self->{" $p"} = $parms{$p}; } + bless $self, $class; +} + + +=head2 $t->read + +Reads the table from the input file. Acts as a superclass to all true tables. +This method marks the table as read and then just sets the input file pointer +but does not read any data. If the table has already been read, then returns +C else returns C<$self> + +=cut + +sub read +{ + my ($self) = @_; + + return $self->read_dat if (ref($self) eq "Font::TTF::Table"); + return undef if $self->{' read'}; + $self->{' INFILE'}->seek($self->{' OFFSET'}, 0); + $self->{' read'} = 1; + $self; +} + + +=head2 $t->read_dat + +Reads the table into the C instance variable for those tables which don't +know any better + +=cut + +sub read_dat +{ + my ($self) = @_; + +# can't just $self->read here otherwise those tables which start their read sub with +# $self->read_dat are going to permanently loop + return undef if ($self->{' read'}); +# $self->{' read'} = 1; # Let read do this, now out will call us for subclasses + $self->{' INFILE'}->seek($self->{' OFFSET'}, 0); + $self->{' INFILE'}->read($self->{' dat'}, $self->{' LENGTH'}); + $self; +} + +=head2 $t->out($fh) + +Writes out the table to the font file. If there is anything in the +C instance variable then this is output, otherwise the data is copied +from the input file to the output + +=cut + +sub out +{ + my ($self, $fh) = @_; + my ($dat, $i, $len, $count); + + if (defined $self->{' dat'}) + { + $fh->print($self->{' dat'}); + return $self; + } + + return undef unless defined $self->{' INFILE'}; + $self->{' INFILE'}->seek($self->{' OFFSET'}, 0); + $len = $self->{' LENGTH'}; + while ($len > 0) + { + $count = ($len > 4096) ? 4096 : $len; + $self->{' INFILE'}->read($dat, $count); + $fh->print($dat); + $len -= $count; + } + $self; +} + + +=head2 $t->out_xml($context) + +Outputs this table in XML format. The table is first read (if not already read) and then if +there is no subclass, then the data is dumped as hex data + +=cut + +sub out_xml +{ + my ($self, $context, $depth) = @_; + my ($k); + + if (ref($self) eq __PACKAGE__) + { + $self->read_dat; + Font::TTF::Utils::XML_hexdump($context, $depth, $self->{' dat'}); + } + else + { + $self->read; + foreach $k (sort grep {$_ !~ m/^\s/o} keys %{$self}) + { + $self->XML_element($context, $depth, $k, $self->{$k}); + } + } + $self; +} + + +=head2 $t->XML_element + +Output a particular element based on its contents. + +=cut + +sub XML_element +{ + my ($self, $context, $depth, $k, $dat) = @_; + my ($fh) = $context->{'fh'}; + my ($ndepth, $d); + + return unless defined $dat; + + if (!ref($dat)) + { + $fh->printf("%s<%s>%s\n", $depth, $k, $dat, $k); + return $self; + } + + $fh->printf("%s<%s>\n", $depth, $k); + $ndepth = $depth . $context->{'indent'}; + + if (ref($dat) eq 'SCALAR') + { $self->XML_element($context, $ndepth, 'scalar', $$dat); } + elsif (ref($dat) eq 'ARRAY') + { + foreach $d (@{$dat}) + { $self->XML_element($context, $ndepth, 'elem', $d); } + } + elsif (ref($dat) eq 'HASH') + { + foreach $d (sort grep {$_ !~ m/^\s/o} keys %{$dat}) + { $self->XML_element($context, $ndepth, $d, $dat->{$d}); } + } + else + { + $context->{'name'} = ref($dat); + $context->{'name'} =~ s/^.*://o; + $dat->out_xml($context, $ndepth); + } + + $fh->printf("%s\n", $depth, $k); + $self; +} + + +=head2 $t->XML_end($context, $tag, %attrs) + +Handles the default type of for those tables which aren't subclassed + +=cut + +sub XML_end +{ + my ($self, $context, $tag, %attrs) = @_; + my ($dat, $addr); + + return undef unless ($tag eq 'data'); + $dat = $context->{'text'}; + $dat =~ s/([0-9a-f]{2})\s*/hex($1)/oig; + if (defined $attrs{'addr'}) + { $addr = hex($attrs{'addr'}); } + else + { $addr = length($self->{' dat'}); } + substr($self->{' dat'}, $addr, length($dat)) = $dat; + return $context; +} + + +=head2 $t->dirty($val) + +This sets the dirty flag to the given value or 1 if no given value. It returns the +value of the flag + +=cut + +sub dirty +{ + my ($self, $val) = @_; + my ($res) = $self->{' isDirty'}; + + $self->{' isDirty'} = defined $val ? $val : 1; + $res; +} + +=head2 $t->update + +Each table knows how to update itself. This consists of doing whatever work +is required to ensure that the memory version of the table is consistent +and that other parameters in other tables have been updated accordingly. +I.e. by the end of sending C to all the tables, the memory version +of the font should be entirely consistent. + +Some tables which do no work indicate to themselves the need to update +themselves by setting isDirty above 1. This method resets that accordingly. + +=cut + +sub update +{ + my ($self) = @_; + + if ($self->{' isDirty'}) + { + $self->read; + $self->{' isDirty'} = 0; + return $self; + } + else + { return undef; } +} + + +=head2 $t->empty + +Clears a table of all data to the level of not having been read + +=cut + +sub empty +{ + my ($self) = @_; + my (%keep); + + foreach (qw(INFILE LENGTH OFFSET CSUM PARENT)) + { $keep{" $_"} = 1; } + + map {delete $self->{$_} unless $keep{$_}} keys %$self; + $self; +} + + +=head2 $t->release + +Releases ALL of the memory used by this table, and all of its component/child +objects. This method is called automatically by +'Font::TTF::Font-Erelease' (so you don't have to call it yourself). + +B, that it is important that this method get called at some point prior +to the actual destruction of the object. Internally, we track things in a +structure that can result in circular references, and without calling +'C' these will not properly get cleaned up by Perl. Once this +method has been called, though, don't expect to be able to do anything with the +C object; it'll have B internal state whatsoever. + +B As part of the brute-force cleanup done here, this method +will throw a warning message whenever unexpected key values are found within +the C object. This is done to help ensure that any +unexpected and unfreed values are brought to your attention so that you can bug +us to keep the module updated properly; otherwise the potential for memory +leaks due to dangling circular references will exist. + +=cut + +sub release +{ + my ($self) = @_; + +# delete stuff that we know we can, here + + my @tofree = map { delete $self->{$_} } keys %{$self}; + + while (my $item = shift @tofree) + { + my $ref = ref($item); + if (UNIVERSAL::can($item, 'release')) + { $item->release(); } + elsif ($ref eq 'ARRAY') + { push( @tofree, @{$item} ); } + elsif (UNIVERSAL::isa($ref, 'HASH')) + { release($item); } + } + +# check that everything has gone - it better had! + foreach my $key (keys %{$self}) + { warn ref($self) . " still has '$key' key left after release.\n"; } +} + + +sub __dumpvar__ +{ + my ($self, $key) = @_; + + return ($key eq ' PARENT' ? '...parent...' : $self->{$key}); +} + +1; + +=head1 BUGS + +No known bugs + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Ttc.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Ttc.pm new file mode 100644 index 0000000..b3eeef0 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Ttc.pm @@ -0,0 +1,164 @@ +package Font::TTF::Ttc; + +=head1 NAME + +Font::TTF::Ttc - Truetype Collection class + +=head1 DESCRIPTION + +A TrueType collection is a collection of TrueType fonts in one file in which +tables may be shared between different directories. In order to support this, +the TTC introduces the concept of a table being shared by different TrueType +fonts. This begs the question of what should happen to the ' PARENT' property +of a particular table. It is made to point to the first directory object which +refers to it. It is therefore up to the application to sort out any confusion. +Confusion only occurs if shared tables require access to non-shared tables. +This should not happen since the shared tables are dealing with glyph +information only and the private tables are dealing with encoding and glyph +identification. Thus the general direction is from identification to glyph and +not the other way around (at least not without knowledge of the particular +context). + +=head1 INSTANCE VARIABLES + +The following instance variables are preceded by a space + +=over 4 + +=item fname (P) + +Filename for this TrueType Collection + +=item INFILE (P) + +The filehandle of this collection + +=back + +The following instance variable does not start with a space + +=over 4 + +=item directs + +An array of directories (Font::TTF::Font objects) for each sub-font in the directory + +=back + +=head1 METHODS + +=cut + +use strict; +use vars qw($VERSION); + +use IO::File; + +$VERSION = 0.0001; + +=head2 Font::TTF::Ttc->open($fname) + +Opens and reads the given filename as a TrueType Collection. Reading a collection +involves reading each of the directories which go to make up the collection. + +=cut + +sub open +{ + my ($class, $fname) = @_; + my ($self) = {}; + my ($fh); + + unless (ref($fname)) + { + $fh = IO::File->new($fname) or return undef; + binmode $fh; + } else + { $fh = $fname; } + + bless $self, $class; + $self->{' INFILE'} = $fh; + $self->{' fname'} = $fname; + $fh->seek(0, 0); + $self->read; +} + + +=head2 $c->read + +Reads a Collection by reading all the directories in the collection + +=cut + +sub read +{ + my ($self) = @_; + my ($fh) = $self->{' INFILE'}; + my ($dat, $ttc, $ver, $num, $i, $loc); + + $fh->read($dat, 12); + ($ttc, $ver, $num) = unpack("A4N2", $dat); + + return undef unless $ttc eq "ttcf"; + $fh->read($dat, $num << 2); + for ($i = 0; $i < $num; $i++) + { + $loc = unpack("N", substr($dat, $i << 2, 4)); + $self->{'directs'}[$i] = Font::TTF::Font->new('INFILE' => $fh, + 'PARENT' => $self, + 'OFFSET' => $loc) || return undef; + } + for ($i = 0; $i < $num; $i++) + { $self->{'directs'}[$i]->read; } + $self; +} + + +=head2 $c->find($direct, $name, $check, $off, $len) + +Hunts around to see if a table with the given characteristics of name, checksum, +offset and length has been associated with a directory earlier in the list. +Actually on checks the offset since no two tables can share the same offset in +a TrueType font, collection or otherwise. + +=cut + +sub find +{ + my ($self, $direct, $name, $check, $off, $len) = @_; + my ($d); + + foreach $d (@{$self->{'directs'}}) + { + return undef if $d eq $direct; + next unless defined $d->{$name}; + return $d->{$name} if ($d->{$name}{' OFFSET'} == $off); + } + undef; # wierd that the font passed is not in the list! +} + + +=head2 $c->DESTROY + +Closees any opened files by us + +=cut + +sub DESTROY +{ + my ($self) = @_; + close ($self->{' INFILE'}); + undef; +} + +=head1 BUGS + +No known bugs, but then not ever executed! + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Ttopen.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Ttopen.pm new file mode 100644 index 0000000..610a66e --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Ttopen.pm @@ -0,0 +1,1223 @@ +package Font::TTF::Ttopen; + +=head1 NAME + +Font::TTF::Ttopen - Opentype superclass for standard Opentype lookup based tables +(GSUB and GPOS) + +=head1 DESCRIPTION + +Handles all the script, lang, feature, lookup stuff for a +L/L table leaving the class specifics to the +subclass + +=head1 INSTANCE VARIABLES + +The instance variables of an opentype table form a complex sub-module hierarchy. + +=over 4 + +=item Version + +This contains the version of the table as a floating point number + +=item SCRIPTS + +The scripts list is a hash of script tags. Each script tag (of the form +$t->{'SCRIPTS'}{$tag}) has information below it. + +=over 8 + +=item OFFSET + +This variable is preceeded by a space and gives the offset from the start of the +table (not the table section) to the script table for this script + +=item REFTAG + +This variable is preceded by a space and gives a corresponding script tag to this +one such that the offsets in the file are the same. When writing, it is up to the +caller to ensure that the REFTAGs are set correctly, since these will be used to +assume that the scripts are identical. Note that REFTAG must refer to a script which +has no REFTAG of its own. + +=item DEFAULT + +This corresponds to the default language for this script, if there is one, and +contains the same information as an itemised language + +=item LANG_TAGS + +This contains an array of language tag strings (each 4 bytes) corresponding to +the languages listed by this script + +=item $lang + +Each language is a hash containing its information: + +=over 12 + +=item OFFSET + +This variable is preceeded by a a space and gives the offset from the start of +the whole table to the language table for this language + +=item REFTAG + +This variable is preceded by a space and has the same function as for the script +REFTAG, only for the languages within a script. + +=item RE-ORDER + +This indicates re-ordering information, and has not been set. The value should +always be 0. + +=item DEFAULT + +This holds the index of the default feature, if there is one, or -1 otherwise. + +=item FEATURES + +This is an array of feature tags for all the features enabled for this language + +=back + +=back + +=item FEATURES + +The features section of instance variables corresponds to the feature table in +the opentype table. + +=over 8 + +=item FEAT_TAGS + +This array gives the ordered list of feature tags for this table. It is used during +reading and writing for converting between feature index and feature tag. + +=back + +The rest of the FEATURES variable is itself a hash based on the feature tag for +each feature. Each feature has the following structure: + +=over 8 + +=item OFFSET + +This attribute is preceeded by a space and gives the offset relative to the start of the whole +table of this particular feature. + +=item PARMS + +This is an unused offset to the parameters for each feature + +=item LOOKUPS + +This is an array containing indices to lookups in the LOOKUP instance variable of the table + +=item INDEX + +This gives the feature index for this feature and is used during reading and writing for +converting between feature tag and feature index. + +=back + +=item LOOKUP + +This variable is an array of lookups in order and is indexed via the features of a language of a +script. Each lookup contains subtables and other information: + +=over 8 + +=item OFFSET + +This name is preceeded by a space and contains the offset from the start of the table to this +particular lookup + +=item TYPE + +This is a subclass specific type for a lookup. It stipulates the type of lookup and hence subtables +within the lookup + +=item FLAG + +Holds the lookup flag bits + +=item SUB + +This holds an array of subtables which are subclass specific. Each subtable must have +an OFFSET. The other variables described here are an abstraction used in both the +GSUB and GPOS tables which are the target subclasses of this class. + +=over 12 + +=item OFFSET + +This is preceeded by a space and gives the offset relative to the start of the table for this +subtable + +=item FORMAT + +Gives the sub-table sub format for this GSUB subtable. It is assumed that this +value is correct when it comes time to write the subtable. + +=item COVERAGE + +Most lookups consist of a coverage table corresponding to the first +glyph to match. The offset of this coverage table is stored here and the coverage +table looked up against the GSUB table proper. There are two lookups +without this initial coverage table which is used to index into the RULES array. +These lookups have one element in the RULES array which is used for the whole +match. + +=item RULES + +The rules are a complex array. Each element of the array corresponds to an +element in the coverage table (governed by the coverage index). If there is +no coverage table, then there is considered to be only one element in the rules +array. Each element of the array is itself an array corresponding to the +possibly multiple string matches which may follow the initial glyph. Each +element of this array is a hash with fixed keys corresponding to information +needed to match a glyph string or act upon it. Thus the RULES element is an +array of arrays of hashes which contain the following keys: + +=over 16 + +=item MATCH + +This contains a sequence of elements held as an array. The elements may be +glyph ids (gid), class ids (cids), or offsets to coverage tables. Each element +corresponds to one glyph in the glyph string. See MATCH_TYPE for details of +how the different element types are marked. + +=item PRE + +This array holds the sequence of elements preceeding the first match element +and has the same form as the MATCH array. + +=item POST + +This array holds the sequence of elements to be tested for following the match +string and is of the same form as the MATCH array. + +=item ACTION + +This array holds information regarding what should be done if a match is found. +The array may either hold glyph ids (which are used to replace or insert or +whatever glyphs in the glyph string) or 2 element arrays consisting of: + +=over 20 + +=item OFFSET + +Offset from the start of the matched string that the lookup should start at +when processing the substring. + +=item LOOKUP_INDEX + +The index to a lookup to be acted upon on the match string. + +=back + +=back + +=back + +=back + +=item CLASS + +For those lookups which use class categories rather than glyph ids for matching +this is the offset to the class definition used to categories glyphs in the +match string. + +=item PRE_CLASS + +This is the offset to the class definition for the before match glyphs + +=item POST_CLASS + +This is the offset to the class definition for the after match glyphs. + +=item ACTION_TYPE + +This string holds the type of information held in the ACTION variable of a RULE. +It is subclass specific. + +=item MATCH_TYPE + +This holds the type of information in the MATCH array of a RULE. This is subclass +specific. + +=item ADJUST + +This corresponds to a single action for all items in a coverage table. The meaning +is subclass specific. + +=item CACHE + +This key starts with a space + +A hash of other tables (such as coverage tables, classes, anchors, device tables) +based on the offset given in the subtable to that other information. +Note that the documentation is particularly +unhelpful here in that such tables are given as offsets relative to the +beginning of the subtable not the whole GSUB table. This includes those items which +are stored relative to another base within the subtable. + +=back + + +=head1 METHODS + +=cut + +use Font::TTF::Table; +use Font::TTF::Utils; +use Font::TTF::Coverage; +use strict; +use vars qw(@ISA); + +@ISA = qw(Font::TTF::Table); + +=head2 $t->read + +Reads the table passing control to the subclass to handle the subtable specifics + +=cut + +sub read +{ + my ($self) = @_; + my ($dat, $i, $l, $oScript, $oFeat, $oLook, $tag, $nScript, $off, $dLang, $nLang, $lTag); + my ($nFeat, $nLook, $nSub, $j, $temp); + my ($fh) = $self->{' INFILE'}; + my ($moff) = $self->{' OFFSET'}; + + $self->SUPER::read or return $self; + $fh->read($dat, 10); + ($self->{'Version'}, $oScript, $oFeat, $oLook) = TTF_Unpack("vSSS", $dat); + +# read features first so that in the script/lang hierarchy we can use feature tags + + $fh->seek($moff + $oFeat, 0); + $fh->read($dat, 2); + $nFeat = unpack("n", $dat); + $self->{'FEATURES'} = {}; + $l = $self->{'FEATURES'}; + $fh->read($dat, 6 * $nFeat); + for ($i = 0; $i < $nFeat; $i++) + { + ($tag, $off) = unpack("a4n", substr($dat, $i * 6, 6)); + while (defined $l->{$tag}) + { + if ($tag =~ m/(.*?)\s_(\d+)$/o) + { $tag = $1 . " _" . ($2 + 1); } + else + { $tag .= " _0"; } + } + $l->{$tag}{' OFFSET'} = $off + $oFeat; + $l->{$tag}{'INDEX'} = $i; + push (@{$l->{'FEAT_TAGS'}}, $tag); + } + + foreach $tag (grep {m/^.{4}(?:\s_\d+)?$/o} keys %$l) + { + $fh->seek($moff + $l->{$tag}{' OFFSET'}, 0); + $fh->read($dat, 4); + ($l->{$tag}{'PARMS'}, $nLook) = unpack("n2", $dat); + $fh->read($dat, $nLook * 2); + $l->{$tag}{'LOOKUPS'} = [unpack("n*", $dat)]; + } + +# Now the script/lang hierarchy + + $fh->seek($moff + $oScript, 0); + $fh->read($dat, 2); + $nScript = unpack("n", $dat); + $self->{'SCRIPTS'} = {}; + $l = $self->{'SCRIPTS'}; + $fh->read($dat, 6 * $nScript); + for ($i = 0; $i < $nScript; $i++) + { + ($tag, $off) = unpack("a4n", substr($dat, $i * 6, 6)); + $off += $oScript; + foreach (keys %$l) + { $l->{$tag}{' REFTAG'} = $_ if ($l->{$_}{' OFFSET'} == $off + && !defined $l->{$_}{' REFTAG'}); } + $l->{$tag}{' OFFSET'} = $off; + } + + foreach $tag (keys %$l) + { + next if ($l->{$tag}{' REFTAG'}); + $fh->seek($moff + $l->{$tag}{' OFFSET'}, 0); + $fh->read($dat, 4); + ($dLang, $nLang) = unpack("n2", $dat); + $l->{$tag}{'DEFAULT'}{' OFFSET'} = + $dLang + $l->{$tag}{' OFFSET'} if $dLang; + $fh->read($dat, 6 * $nLang); + for ($i = 0; $i < $nLang; $i++) + { + ($lTag, $off) = unpack("a4n", substr($dat, $i * 6, 6)); + $off += $l->{$tag}{' OFFSET'}; + $l->{$tag}{$lTag}{' OFFSET'} = $off; + foreach (@{$l->{$tag}{'LANG_TAGS'}}, 'DEFAULT') + { $l->{$tag}{$lTag}{' REFTAG'} = $_ if ($l->{$tag}{$_}{' OFFSET'} == $off + && !$l->{$tag}{$_}{' REFTAG'}); } + push (@{$l->{$tag}{'LANG_TAGS'}}, $lTag); + } + foreach $lTag (@{$l->{$tag}{'LANG_TAGS'}}, 'DEFAULT') + { + next unless defined $l->{$tag}{$lTag}; + next if ($l->{$tag}{$lTag}{' REFTAG'}); + $fh->seek($moff + $l->{$tag}{$lTag}{' OFFSET'}, 0); + $fh->read($dat, 6); + ($l->{$tag}{$lTag}{'RE-ORDER'}, $l->{$tag}{$lTag}{'DEFAULT'}, $nFeat) + = unpack("n3", $dat); + $fh->read($dat, $nFeat * 2); + $l->{$tag}{$lTag}{'FEATURES'} = [map {$self->{'FEATURES'}{'FEAT_TAGS'}[$_]} unpack("n*", $dat)]; + } + foreach $lTag (@{$l->{$tag}{'LANG_TAGS'}}, 'DEFAULT') + { + next unless $l->{$tag}{$lTag}{' REFTAG'}; + $temp = $l->{$tag}{$lTag}{' REFTAG'}; + $l->{$tag}{$lTag} = ©($l->{$tag}{$temp}); + $l->{$tag}{$lTag}{' REFTAG'} = $temp; + } + } + foreach $tag (keys %$l) + { + next unless $l->{$tag}{' REFTAG'}; + $temp = $l->{$tag}{' REFTAG'}; + $l->{$tag} = ©($l->{$temp}); + $l->{$tag}{' REFTAG'} = $temp; + } + +# And finally the lookups + + $fh->seek($moff + $oLook, 0); + $fh->read($dat, 2); + $nLook = unpack("n", $dat); + $fh->read($dat, $nLook * 2); + $i = 0; + map { $self->{'LOOKUP'}[$i++]{' OFFSET'} = $_; } unpack("n*", $dat); + + for ($i = 0; $i < $nLook; $i++) + { + $l = $self->{'LOOKUP'}[$i]; + $fh->seek($l->{' OFFSET'} + $moff + $oLook, 0); + $fh->read($dat, 6); + ($l->{'TYPE'}, $l->{'FLAG'}, $nSub) = unpack("n3", $dat); + $fh->read($dat, $nSub * 2); + $j = 0; + my @offsets = unpack("n*", $dat); + my $isExtension = ($l->{'TYPE'} == $self->extension()); + for ($j = 0; $j < $nSub; $j++) + { + $l->{'SUB'}[$j]{' OFFSET'} = $offsets[$j]; + $fh->seek($moff + $oLook + $l->{' OFFSET'} + $l->{'SUB'}[$j]{' OFFSET'}, 0); + if ($isExtension) + { + $fh->read($dat, 8); + my $longOff; + (undef, $l->{'TYPE'}, $longOff) = unpack("nnN", $dat); + $l->{'SUB'}[$j]{' OFFSET'} += $longOff; + $fh->seek($moff + $oLook + $l->{' OFFSET'} + $l->{'SUB'}[$j]{' OFFSET'}, 0); + } + $self->read_sub($fh, $l, $j); + } + } + return $self; +} + +=head2 $t->read_sub($fh, $lookup, $index) + +This stub is to allow subclasses to read subtables of lookups in a table specific manner. A +reference to the lookup is passed in along with the subtable index. The file is located at the +start of the subtable to be read + +=cut + +sub read_sub +{ } + + +=head2 $t->extension() + +Returns the lookup number for the extension table that allows access to 32-bit offsets. + +=cut + +sub extension +{ } + + +=head2 $t->out($fh) + +Writes this Opentype table to the output calling $t->out_sub for each sub table +at the appropriate point in the output. The assumption is that on entry the +number of scripts, languages, features, lookups, etc. are all resolved and +the relationships fixed. This includes a script's LANG_TAGS list and that all +scripts and languages in their respective dictionaries either have a REFTAG or contain +real data. + +=cut + +sub out +{ + my ($self, $fh) = @_; + my ($i, $j, $base, $off, $tag, $t, $l, $lTag, $oScript, @script, @tags); + my ($end, $nTags, @offs, $oFeat, $oLook, $nSub, $nSubs, $big, $out); + + return $self->SUPER::out($fh) unless $self->{' read'}; + +# First sort the features + $i = 0; + $self->{'FEATURES'}{'FEAT_TAGS'} = [sort grep {m/^.{4}(?:\s_\d+)?$/o} %{$self->{'FEATURES'}}] + if (!defined $self->{'FEATURES'}{'FEAT_TAGS'}); + foreach $t (@{$self->{'FEATURES'}{'FEAT_TAGS'}}) + { $self->{'FEATURES'}{$t}{'INDEX'} = $i++; } + + $base = $fh->tell(); + $fh->print(TTF_Pack("v", $self->{'Version'})); + $fh->print(pack("n3", 10, 0, 0)); + $oScript = $fh->tell() - $base; + @script = sort grep {length($_) == 4} keys %{$self->{'SCRIPTS'}}; + $fh->print(pack("n", $#script + 1)); + foreach $t (@script) + { $fh->print(pack("a4n", $t, 0)); } + + $end = $fh->tell(); + foreach $t (@script) + { + $fh->seek($end, 0); + $tag = $self->{'SCRIPTS'}{$t}; + next if ($tag->{' REFTAG'}); + $tag->{' OFFSET'} = tell($fh) - $base - $oScript; + $fh->print(pack("n2", 0, $#{$tag->{'LANG_TAGS'}} + 1)); + foreach $lTag (sort @{$tag->{'LANG_TAGS'}}) + { $fh->print(pack("a4n", $lTag, 0)); } + foreach $lTag (@{$tag->{'LANG_TAGS'}}, 'DEFAULT') + { + my ($def); + $l = $tag->{$lTag}; + next if (!defined $l || (defined $l->{' REFTAG'} && $l->{' REFTAG'} ne '')); + $l->{' OFFSET'} = $fh->tell() - $base - $oScript - $tag->{' OFFSET'}; + if (defined $l->{'DEFAULT'}) +# { $def = $self->{'FEATURES'}{$l->{'FEATURES'}[$l->{'DEFAULT'}]}{'INDEX'}; } + { $def = $l->{'DEFAULT'}; } + else + { $def = -1; } + $fh->print(pack("n*", $l->{'RE_ORDER'} || 0, $def, $#{$l->{'FEATURES'}} + 1, + map {$self->{'FEATURES'}{$_}{'INDEX'} || 0} @{$l->{'FEATURES'}})); + } + $end = $fh->tell(); + if ($tag->{'DEFAULT'}{' REFTAG'} || defined $tag->{'DEFAULT'}{'FEATURES'}) + { + $fh->seek($base + $oScript + $tag->{' OFFSET'}, 0); + if (defined $tag->{'DEFAULT'}{' REFTAG'}) + { + my ($ttag); + for ($ttag = $tag->{'DEFAULT'}{' REFTAG'}; defined $tag->{$ttag}{' REFTAG'}; $ttag = $tag->{$ttag}{' REFTAG'}) + { } + $off = $tag->{$ttag}{' OFFSET'}; + } + else + { $off = $tag->{'DEFAULT'}{' OFFSET'}; } + $fh->print(pack("n", $off)); + } + $fh->seek($base + $oScript + $tag->{' OFFSET'} + 4, 0); + foreach (sort @{$tag->{'LANG_TAGS'}}) + { + if (defined $tag->{$_}{' REFTAG'}) + { + my ($ttag); + for ($ttag = $tag->{$_}{' REFTAG'}; defined $tag->{$ttag}{' REFTAG'}; $ttag = $tag->{$ttag}{' REFTAG'}) + { } + $off = $tag->{$ttag}{' OFFSET'}; + } + else + { $off = $tag->{$_}{' OFFSET'}; } + $fh->print(pack("a4n", $_, $off)); + } + } + $fh->seek($base + $oScript + 2, 0); + foreach $t (@script) + { + $tag = $self->{'SCRIPTS'}{$t}; + $off = $tag->{' REFTAG'} ? $tag->{$tag->{' REFTAG'}}{' OFFSET'} : $tag->{' OFFSET'}; + $fh->print(pack("a4n", $t, $off)); + } + + $fh->seek($end, 0); + $oFeat = $end - $base; + $nTags = $#{$self->{'FEATURES'}{'FEAT_TAGS'}} + 1; + $fh->print(pack("n", $nTags)); + $fh->print(pack("a4n", " ", 0) x $nTags); + + foreach $t (@{$self->{'FEATURES'}{'FEAT_TAGS'}}) + { + $tag = $self->{'FEATURES'}{$t}; + $tag->{' OFFSET'} = tell($fh) - $base - $oFeat; + $fh->print(pack("n*", 0, $#{$tag->{'LOOKUPS'}} + 1, @{$tag->{'LOOKUPS'}})); + } + $end = $fh->tell(); + $fh->seek($oFeat + $base + 2, 0); + foreach $t (@{$self->{'FEATURES'}{'FEAT_TAGS'}}) + { $fh->print(pack("a4n", $t, $self->{'FEATURES'}{$t}{' OFFSET'})); } + + undef $big; + $fh->seek($end, 0); + $oLook = $end - $base; + + # Start Lookup List Table + $nTags = $#{$self->{'LOOKUP'}} + 1; + $fh->print(pack("n", $nTags)); + $fh->print(pack("n", 0) x $nTags); + $end = $fh->tell(); # end of LookupListTable = start of Lookups + foreach $tag (@{$self->{'LOOKUP'}}) + { $nSubs += $self->num_sub($tag); } + for ($i = 0; $i < $nTags; $i++) + { + $fh->seek($end, 0); + $tag = $self->{'LOOKUP'}[$i]; + $off = $end - $base - $oLook; # BH 2004-03-04 + # Is there room, from the start of this i'th lookup, for this and the remaining + # lookups to be wrapped in extension lookups? + if (!defined $big && $off + ($nTags - $i) * 6 + $nSubs * 10 > 65535) # BH 2004-03-04 + { + # Not enough room -- need to start an extension! + my ($k, $ext); + $ext = $self->extension(); + # Must turn previous lookup into the first extension + $i--; + $tag = $self->{'LOOKUP'}[$i]; + $end = $tag->{' OFFSET'} + $base + $oLook; + $fh->seek($end, 0); + $big = $i; + # For this and the remaining lookups, build extensions lookups + for ($j = $i; $j < $nTags; $j++) + { + $tag = $self->{'LOOKUP'}[$j]; + $nSub = $self->num_sub($tag); + $fh->print(pack("nnn", $ext, $tag->{'FLAG'}, $nSub)); + $fh->print(pack("n*", map {$_ * 8 + 6 + $nSub * 2} (0 .. $nSub-1))); # BH 2004-03-04 + $tag->{' EXT_OFFSET'} = $fh->tell(); # = first extension lookup subtable + $tag->{' OFFSET'} = $tag->{' EXT_OFFSET'} - $nSub * 2 - 6 - $base - $oLook; # offset to this extension lookup + for ($k = 0; $k < $nSub; $k++) + { $fh->print(pack('nnN', 1, $tag->{'TYPE'}, 0)); } + } + + $tag = $self->{'LOOKUP'}[$i]; + # Leave file positioned after all the extension lookups -- where the referenced lookups will start. + } + $tag->{' OFFSET'} = $off unless defined $big; # BH 2004-03-04 + $nSub = $self->num_sub($tag); + if (!defined $big) + { + $fh->print(pack("nnn", $tag->{'TYPE'}, $tag->{'FLAG'}, $nSub)); + $fh->print(pack("n", 0) x $nSub); + } + else + { $end = $tag->{' EXT_OFFSET'}; } + my (@offs, $out, @refs); + for ($j = 0; $j < $nSub; $j++) + { + my ($ctables) = {}; + my ($base) = length($out); + push(@offs, tell($fh) - $end + $base); + $out .= $self->out_sub($fh, $tag, $j, $ctables, $base); + push (@refs, [$ctables, $base]); + } + out_final($fh, $out, \@refs); + $end = $fh->tell(); + if (!defined $big) + { + $fh->seek($tag->{' OFFSET'} + $base + $oLook + 6, 0); + $fh->print(pack("n*", @offs)); + } + else + { + $fh->seek($tag->{' EXT_OFFSET'}, 0); + for ($j = 0; $j < $nSub; $j++) + { $fh->print(pack('nnN', 1, $tag->{'TYPE'}, $offs[$j] - $j * 8)); } + } + } + $fh->seek($oLook + $base + 2, 0); + $fh->print(pack("n*", map {$self->{'LOOKUP'}[$_]{' OFFSET'}} (0 .. $nTags - 1))); + $fh->seek($base + 6, 0); + $fh->print(pack('n2', $oFeat, $oLook)); + $fh->seek($end, 0); + $self; +} + + +=head2 $t->num_sub($lookup) + +Asks the subclass to count the number of subtables for a particular lookup and to +return that value. Used in out(). + +=cut + +sub num_sub +{ + my ($self, $lookup) = @_; + + return $#{$lookup->{'SUB'}} + 1; +} + + +=head2 $t->out_sub($fh, $lookup, $index) + +This stub is to allow subclasses to output subtables of lookups in a table specific manner. A +reference to the lookup is passed in along with the subtable index. The file is located at the +start of the subtable to be output + +=cut + +sub out_sub +{ } + +=head2 $t->dirty + +Setting GPOS or GSUB dirty means that OS/2 may need updating, so set it dirty. + +=cut + +sub dirty +{ + my ($self, $val) = @_; + my $res = $self->SUPER::dirty ($val); + $self->{' PARENT'}{'OS/2'}->read->dirty($val) if exists $self->{' PARENT'}{'OS/2'}; + $res; +} + +=head2 $t->maxContext + +Returns the length of the longest opentype rule in this table. + +=cut + +sub maxContext +{ + my ($self) = @_; + + # Make sure table is read + $self->read; + + # Calculate my contribution to OS/2 usMaxContext + + my ($maxcontext, $l, $s, $r, $m); + + for $l (@{$self->{'LOOKUP'}}) # Examine each lookup + { + for $s (@{$l->{'SUB'}}) # Multiple possible subtables for this lookup + { + for $r (@{$s->{'RULES'}}) # One ruleset for each covered glyph + { + for $m (@{$r}) # Multiple possible matches for this covered glyph + { + my $lgt; + $lgt++ if exists $s->{'COVERAGE'}; # Count 1 for the coverage table if it exists + for (qw(MATCH PRE POST)) + { + $lgt += @{$m->{$_}} if exists $m->{$_}; + } + $maxcontext = $lgt if $lgt > $maxcontext; + } + } + + } + } + + $maxcontext; +} + + +=head2 $t->update + +Unless $t->{' PARENT'}{' noharmony'} is true, update will make sure that GPOS and GSUB include +the same scripts and languages. Any added scripts and languages will have empty feature sets. + +=cut + +# Assumes we are called on both GSUB and GPOS. So simply ADDS scripts and languages to $self that it finds +# in the other table. + +sub update +{ + my ($self) = @_; + + return undef unless ($self->SUPER::update); + + # Enforce script/lang congruence unless asked not to: + return $self if $self->{' PARENT'}{' noharmony'}; + + # Find my sibling (GSUB or GPOS, depending on which I am) + my $sibling = ref($self) eq 'Font::TTF::GSUB' ? 'GPOS' : ref($self) eq 'Font::TTF::GPOS' ? 'GSUB' : undef; + return $self unless $sibling && exists $self->{' PARENT'}{$sibling}; + $sibling = $self->{' PARENT'}{$sibling}; + next unless defined $sibling; + + # Look through scripts defined in sibling: + for my $sTag (grep {length($_) == 4} keys %{$sibling->{'SCRIPTS'}}) + { + my $sibScript = $sibling->{'SCRIPTS'}{$sTag}; + $sibScript = $sibling->{$sibScript->{' REFTAG'}} if exists $sibScript->{' REFTAG'} && $sibScript->{' REFTAG'} ne ''; + + $self->{'SCRIPTS'}{$sTag} = {} unless defined $self->{'SCRIPTS'}{$sTag}; # Create script if not present in $self + + my $myScript = $self->{'SCRIPTS'}{$sTag}; + $myScript = $self->{$myScript->{' REFTAG'}} if exists $myScript->{' REFTAG'} && $myScript->{' REFTAG'} ne ''; + + foreach my $lTag (@{$sibScript->{'LANG_TAGS'}}) + { + # Ok, found a script/lang that is in our sibling. + next if exists $myScript->{$lTag}; # Already in $self + + # Need to create this lang: + push @{$myScript->{'LANG_TAGS'}}, $lTag; + $myScript->{$lTag} = { 'FEATURES' => [] }; + } + unless (defined $myScript->{'DEFAULT'}) + { + # Create default lang for this script. Link to 'dflt' if it exists + $myScript->{'DEFAULT'} = exists $myScript->{'dflt'} ? {' REFTAG' => 'dflt'} : { 'FEATURES' => [] }; + } + } + $self; +} + +=head1 Internal Functions & Methods + +Most of these methods are used by subclasses for handling such things as coverage +tables. + +=head2 copy($ref) + +Internal function to copy the top level of a dictionary to create a new dictionary. +Only the top level is copied. + +=cut + +sub copy +{ + my ($ref) = @_; + my ($res) = {}; + + foreach (keys %$ref) + { $res->{$_} = $ref->{$_}; } + $res; +} + + +=head2 $t->read_cover($cover_offset, $lookup_loc, $lookup, $fh, $is_cover) + +Reads a coverage table and stores the results in $lookup->{' CACHE'}, that is, if +it hasn't been read already. + +=cut + +sub read_cover +{ + my ($self, $offset, $base, $lookup, $fh, $is_cover) = @_; + my ($loc) = $fh->tell(); + my ($cover, $str); + + return undef unless $offset; + $str = sprintf("%X", $base + $offset); + return $lookup->{' CACHE'}{$str} if defined $lookup->{' CACHE'}{$str}; + $fh->seek($base + $offset, 0); + $cover = Font::TTF::Coverage->new($is_cover)->read($fh); + $fh->seek($loc, 0); + $lookup->{' CACHE'}{$str} = $cover; + return $cover; +} + + +=head2 ref_cache($obj, $cache, $offset) + +Internal function to keep track of the local positioning of subobjects such as +coverage and class definition tables, and their offsets. +What happens is that the cache is a hash of +sub objects indexed by the reference (using a string mashing of the +reference name which is valid for the duration of the reference) and holds a +list of locations in the output string which should be filled in with the +offset to the sub object when the final string is output in out_final. + +Uses tricks for Tie::Refhash + +=cut + +sub ref_cache +{ + my ($obj, $cache, $offset) = @_; + + return 0 unless defined $obj; + unless (defined $cache->{"$obj"}) + { push (@{$cache->{''}}, $obj); } + push (@{$cache->{"$obj"}}, $offset); + return 0; +} + + +=head2 out_final($fh, $out, $cache_list, $state) + +Internal function to actually output everything to the file handle given that +now we know the offset to the first sub object to be output and which sub objects +are to be output and what locations need to be updated, we can now +generate everything. $cache_list is an array of two element arrays. The first element +is a cache object, the second is an offset to be subtracted from each reference +to that object made in the cache. + +If $state is 1, then the output is not sent to the filehandle and the return value +is the string to be output. If $state is absent or 0 then output is not limited +by storing in a string first and the return value is ""; + +=cut + +sub out_final +{ + my ($fh, $out, $cache_list, $state) = @_; + my ($len) = length($out || ''); + my ($base_loc) = $state ? 0 : $fh->tell(); + my ($loc, $t, $r, $s, $master_cache, $offs, $str, %vecs); + + $fh->print($out || '') unless $state; # first output the current attempt + foreach $r (@$cache_list) + { + $offs = $r->[1]; + foreach $t (@{$r->[0]{''}}) + { + $str = "$t"; + if (!defined $master_cache->{$str}) + { + my ($vec) = $t->signature(); + if ($vecs{$vec}) + { $master_cache->{$str} = $master_cache->{$vecs{$vec}}; } + else + { + $vecs{$vec} = $str; + $master_cache->{$str} = ($state ? length($out) : $fh->tell()) + - $base_loc; + if ($state) + { $out .= $t->out($fh, 1); } + else + { $t->out($fh, 0); } + } + } + foreach $s (@{$r->[0]{$str}}) + { substr($out, $s, 2) = pack('n', $master_cache->{$str} - $offs); } + } + } + if ($state) + { return $out; } + else + { + $loc = $fh->tell(); + $fh->seek($base_loc, 0); + $fh->print($out || ''); # the corrected version + $fh->seek($loc, 0); + } +} + + +=head2 $self->read_context($lookup, $fh, $type, $fmt, $cover, $count, $loc) + +Internal method to read context (simple and chaining context) lookup subtables for +the GSUB and GPOS table types. The assumed values for $type correspond to those +for GSUB, so GPOS should adjust the values upon calling. + +=cut + +sub read_context +{ + my ($self, $lookup, $fh, $type, $fmt, $cover, $count, $loc) = @_; + my ($dat, $i, $s, $t, @subst, @srec, $mcount, $scount); + + if ($type == 5 && $fmt < 3) + { + if ($fmt == 2) + { + $fh->read($dat, 2); + $lookup->{'CLASS'} = $self->read_cover($count, $loc, $lookup, $fh, 0); + $count = TTF_Unpack('S', $dat); + } + $fh->read($dat, $count << 1); + foreach $s (TTF_Unpack('S*', $dat)) + { + if ($s == 0) + { + push (@{$lookup->{'RULES'}}, []); + next; + } + @subst = (); + $fh->seek($loc + $s, 0); + $fh->read($dat, 2); + $t = TTF_Unpack('S', $dat); + $fh->read($dat, $t << 1); + foreach $t (TTF_Unpack('S*', $dat)) + { + $fh->seek($loc + $s + $t, 0); + @srec = (); + $fh->read($dat, 4); + ($mcount, $scount) = TTF_Unpack('S2', $dat); + $mcount--; + $fh->read($dat, ($mcount << 1) + ($scount << 2)); + for ($i = 0; $i < $scount; $i++) + { push (@srec, [TTF_Unpack('S2', substr($dat, + ($mcount << 1) + ($i << 2), 4))]); } + push (@subst, {'ACTION' => [@srec], + 'MATCH' => [TTF_Unpack('S*', + substr($dat, 0, $mcount << 1))]}); + } + push (@{$lookup->{'RULES'}}, [@subst]); + } + $lookup->{'ACTION_TYPE'} = 'l'; + $lookup->{'MATCH_TYPE'} = ($fmt == 2 ? 'c' : 'g'); + } elsif ($type == 5 && $fmt == 3) + { + $fh->read($dat, ($cover << 1) + ($count << 2)); + @subst = (); @srec = (); + for ($i = 0; $i < $cover; $i++) + { push (@subst, $self->read_cover(TTF_Unpack('S', substr($dat, $i << 1, 2)), + $loc, $lookup, $fh, 1)); } + for ($i = 0; $i < $count; $i++) + { push (@srec, [TTF_Unpack('S2', substr($dat, ($count << 1) + ($i << 2), 4))]); } + $lookup->{'RULES'} = [[{'ACTION' => [@srec], 'MATCH' => [@subst]}]]; + $lookup->{'ACTION_TYPE'} = 'l'; + $lookup->{'MATCH_TYPE'} = 'o'; + } elsif ($type == 6 && $fmt < 3) + { + if ($fmt == 2) + { + $fh->read($dat, 6); + $lookup->{'PRE_CLASS'} = $self->read_cover($count, $loc, $lookup, $fh, 0) if $count; + ($i, $mcount, $count) = TTF_Unpack('S3', $dat); # messy: 2 classes & count + $lookup->{'CLASS'} = $self->read_cover($i, $loc, $lookup, $fh, 0) if $i; + $lookup->{'POST_CLASS'} = $self->read_cover($mcount, $loc, $lookup, $fh, 0) if $mcount; + } + $fh->read($dat, $count << 1); + foreach $s (TTF_Unpack('S*', $dat)) + { + if ($s == 0) + { + push (@{$lookup->{'RULES'}}, []); + next; + } + @subst = (); + $fh->seek($loc + $s, 0); + $fh->read($dat, 2); + $t = TTF_Unpack('S', $dat); + $fh->read($dat, $t << 1); + foreach $i (TTF_Unpack('S*', $dat)) + { + $fh->seek($loc + $s + $i, 0); + @srec = (); + $t = {}; + $fh->read($dat, 2); + $mcount = TTF_Unpack('S', $dat); + if ($mcount > 0) + { + $fh->read($dat, $mcount << 1); + $t->{'PRE'} = [TTF_Unpack('S*', $dat)]; + } + $fh->read($dat, 2); + $mcount = TTF_Unpack('S', $dat); + if ($mcount > 1) + { + $fh->read($dat, ($mcount - 1) << 1); + $t->{'MATCH'} = [TTF_Unpack('S*', $dat)]; + } + $fh->read($dat, 2); + $mcount = TTF_Unpack('S', $dat); + if ($mcount > 0) + { + $fh->read($dat, $mcount << 1); + $t->{'POST'} = [TTF_Unpack('S*', $dat)]; + } + $fh->read($dat, 2); + $scount = TTF_Unpack('S', $dat); + $fh->read($dat, $scount << 2); + for ($i = 0; $i < $scount; $i++) + { push (@srec, [TTF_Unpack('S2', substr($dat, $i << 2))]); } + $t->{'ACTION'} = [@srec]; + push (@subst, $t); + } + push (@{$lookup->{'RULES'}}, [@subst]); + } + $lookup->{'ACTION_TYPE'} = 'l'; + $lookup->{'MATCH_TYPE'} = ($fmt == 2 ? 'c' : 'g'); + } elsif ($type == 6 && $fmt == 3) + { + $t = {}; + unless ($cover == 0) + { + @subst = (); + $fh->read($dat, $cover << 1); + foreach $s (TTF_Unpack('S*', $dat)) + { push(@subst, $self->read_cover($s, $loc, $lookup, $fh, 1)); } + $t->{'PRE'} = [@subst]; + } + $fh->read($dat, 2); + $count = TTF_Unpack('S', $dat); + unless ($count == 0) + { + @subst = (); + $fh->read($dat, $count << 1); + foreach $s (TTF_Unpack('S*', $dat)) + { push(@subst, $self->read_cover($s, $loc, $lookup, $fh, 1)); } + $t->{'MATCH'} = [@subst]; + } + $fh->read($dat, 2); + $count = TTF_Unpack('S', $dat); + unless ($count == 0) + { + @subst = (); + $fh->read($dat, $count << 1); + foreach $s (TTF_Unpack('S*', $dat)) + { push(@subst, $self->read_cover($s, $loc, $lookup, $fh, 1)); } + $t->{'POST'} = [@subst]; + } + $fh->read($dat, 2); + $count = TTF_Unpack('S', $dat); + @subst = (); + $fh->read($dat, $count << 2); + for ($i = 0; $i < $count; $i++) + { push (@subst, [TTF_Unpack('S2', substr($dat, $i << 2, 4))]); } + $t->{'ACTION'} = [@subst]; + $lookup->{'RULES'} = [[$t]]; + $lookup->{'ACTION_TYPE'} = 'l'; + $lookup->{'MATCH_TYPE'} = 'o'; + } + $lookup; +} + + +=head2 $self->out_context($lookup, $fh, $type, $fmt, $ctables, $out, $num) + +Provides shared behaviour between GSUB and GPOS tables during output for context +(chained and simple) rules. In addition, support is provided here for type 4 GSUB +tables, which are not used in GPOS. The value for $type corresponds to the type +in a GSUB table so calling from GPOS should adjust the value accordingly. + +=cut + +sub out_context +{ + my ($self, $lookup, $fh, $type, $fmt, $ctables, $out, $num, $base) = @_; + my ($offc, $offd, $i, $j, $r, $t, $numd); + + $out ||= ''; + if (($type == 4 || $type == 5 || $type == 6) && ($fmt == 1 || $fmt == 2)) + { + my ($base_off); + + if ($fmt == 1) + { + $out = pack("nnn", $fmt, Font::TTF::Ttopen::ref_cache($lookup->{'COVERAGE'}, $ctables, 2 + $base), + $num); + $base_off = 6; + } elsif ($type == 5) + { + $out = pack("nnnn", $fmt, Font::TTF::Ttopen::ref_cache($lookup->{'COVERAGE'}, $ctables, 2 + $base), + Font::TTF::Ttopen::ref_cache($lookup->{'CLASS'}, $ctables, 4 + $base), $num); + $base_off = 8; + } elsif ($type == 6) + { + $out = pack("n6", $fmt, Font::TTF::Ttopen::ref_cache($lookup->{'COVERAGE'}, $ctables, 2 + $base), + Font::TTF::Ttopen::ref_cache($lookup->{'PRE_CLASS'}, $ctables, 4 + $base), + Font::TTF::Ttopen::ref_cache($lookup->{'CLASS'}, $ctables, 6 + $base), + Font::TTF::Ttopen::ref_cache($lookup->{'POST_CLASS'}, $ctables, 8 + $base), + $num); + $base_off = 12; + } + + $out .= pack('n*', (0) x $num); + $offc = length($out); + for ($i = 0; $i < $num; $i++) + { + $r = $lookup->{'RULES'}[$i]; + next unless exists $r->[0]{'ACTION'}; + $numd = $#{$r} + 1; + substr($out, ($i << 1) + $base_off, 2) = pack('n', $offc); + $out .= pack('n*', $numd, (0) x $numd); + $offd = length($out) - $offc; + for ($j = 0; $j < $numd; $j++) + { + substr($out, $offc + 2 + ($j << 1), 2) = pack('n', $offd); + if ($type == 4) + { + $out .= pack('n*', $r->[$j]{'ACTION'}[0], $#{$r->[$j]{'MATCH'}} + 2, + @{$r->[$j]{'MATCH'}}); + } elsif ($type == 5) + { + $out .= pack('n*', $#{$r->[$j]{'MATCH'}} + 2, + $#{$r->[$j]{'ACTION'}} + 1, + @{$r->[$j]{'MATCH'}}); + foreach $t (@{$r->[$j]{'ACTION'}}) + { $out .= pack('n2', @$t); } + } elsif ($type == 6) + { + $out .= pack('n*', $#{$r->[$j]{'PRE'}} + 1, @{$r->[$j]{'PRE'}}, + $#{$r->[$j]{'MATCH'}} + 2, @{$r->[$j]{'MATCH'}}, + $#{$r->[$j]{'POST'}} + 1, @{$r->[$j]{'POST'}}, + $#{$r->[$j]{'ACTION'}} + 1); + foreach $t (@{$r->[$j]{'ACTION'}}) + { $out .= pack('n2', @$t); } + } + $offd = length($out) - $offc; + } + $offc = length($out); + } + } elsif ($type == 5 && $fmt == 3) + { + $out .= pack('n3', $fmt, $#{$lookup->{'RULES'}[0][0]{'MATCH'}} + 1, + $#{$lookup->{'RULES'}[0][0]{'ACTION'}} + 1); + foreach $t (@{$lookup->{'RULES'}[0][0]{'MATCH'}}) + { $out .= pack('n', Font::TTF::Ttopen::ref_cache($t, $ctables, length($out) + $base)); } + foreach $t (@{$lookup->{'RULES'}[0][0]{'ACTION'}}) + { $out .= pack('n2', @$t); } + } elsif ($type == 6 && $fmt == 3) + { + $r = $lookup->{'RULES'}[0][0]; + no strict 'refs'; # temp fix - more code needed (probably "if" statements in the event 'PRE' or 'POST' are empty) + $out .= pack('n2', $fmt, defined $r->{'PRE'} ? scalar @{$r->{'PRE'}} : 0); + foreach $t (@{$r->{'PRE'}}) + { $out .= pack('n', Font::TTF::Ttopen::ref_cache($t, $ctables, length($out) + $base)); } + $out .= pack('n', defined $r->{'MATCH'} ? scalar @{$r->{'MATCH'}} : 0); + foreach $t (@{$r->{'MATCH'}}) + { $out .= pack('n', Font::TTF::Ttopen::ref_cache($t, $ctables, length($out) + $base)); } + $out .= pack('n', defined $r->{'POST'} ? scalar @{$r->{'POST'}} : 0); + foreach $t (@{$r->{'POST'}}) + { $out .= pack('n', Font::TTF::Ttopen::ref_cache($t, $ctables, length($out) + $base)); } + $out .= pack('n', defined $r->{'ACTION'} ? scalar @{$r->{'ACTION'}} : 0); + foreach $t (@{$r->{'ACTION'}}) + { $out .= pack('n2', @$t); } + } + $out; +} + +=head1 BUGS + +=over 4 + +=item * + +No way to share cachable items (coverage tables, classes, anchors, device tables) +across different lookups. The items are always output after the lookup and +repeated if necessary. Within lookup sharing is possible. + +=back + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + +1; + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Useall.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Useall.pm new file mode 100644 index 0000000..85e69dc --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Useall.pm @@ -0,0 +1,54 @@ +use Font::TTF::Sill; +use Font::TTF::Cvt_; +use Font::TTF::Fpgm; +use Font::TTF::Glyf; +use Font::TTF::Hdmx; +use Font::TTF::Kern; +use Font::TTF::Loca; +use Font::TTF::LTSH; +use Font::TTF::Name; +use Font::TTF::OS_2; +use Font::TTF::PCLT; +use Font::TTF::Post; +use Font::TTF::Prep; +use Font::TTF::Vmtx; +use Font::TTF::AATKern; +use Font::TTF::AATutils; +use Font::TTF::Anchor; +use Font::TTF::Bsln; +use Font::TTF::Delta; +use Font::TTF::Fdsc; +use Font::TTF::Feat; +use Font::TTF::GrFeat; +use Font::TTF::Fmtx; +use Font::TTF::GPOS; +use Font::TTF::Mort; +use Font::TTF::Prop; +use Font::TTF::GDEF; +use Font::TTF::Coverage; +use Font::TTF::GSUB; +use Font::TTF::Hhea; +use Font::TTF::Table; +use Font::TTF::Ttopen; +use Font::TTF::Glyph; +use Font::TTF::Head; +use Font::TTF::Hmtx; +use Font::TTF::Vhea; +use Font::TTF::Cmap; +use Font::TTF::Utils; +use Font::TTF::Maxp; +use Font::TTF::Font; +use Font::TTF::Kern::ClassArray; +use Font::TTF::Kern::CompactClassArray; +use Font::TTF::Kern::OrderedList; +use Font::TTF::Kern::StateTable; +use Font::TTF::Kern::Subtable; +use Font::TTF::Mort::Chain; +use Font::TTF::Mort::Contextual; +use Font::TTF::Mort::Insertion; +use Font::TTF::Mort::Ligature; +use Font::TTF::Mort::Noncontextual; +use Font::TTF::Mort::Rearrangement; +use Font::TTF::Mort::Subtable; + +1; diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Utils.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Utils.pm new file mode 100644 index 0000000..a849ee3 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Utils.pm @@ -0,0 +1,630 @@ +package Font::TTF::Utils; + +=head1 NAME + +Font::TTF::Utils - Utility functions to save fingers + +=head1 DESCRIPTION + +Lots of useful functions to save my fingers, especially for trivial tables + +=head1 FUNCTIONS + +The following functions are exported + +=cut + +use strict; +use vars qw(@ISA @EXPORT $VERSION @EXPORT_OK); +require Exporter; + +@ISA = qw(Exporter); +@EXPORT = qw(TTF_Init_Fields TTF_Read_Fields TTF_Out_Fields TTF_Pack + TTF_Unpack TTF_word_utf8 TTF_utf8_word TTF_bininfo); +@EXPORT_OK = (@EXPORT, qw(XML_hexdump)); +$VERSION = 0.0001; + +=head2 ($val, $pos) = TTF_Init_Fields ($str, $pos) + +Given a field description from the C section, creates an absolute entry +in the fields associative array for the class + +=cut + +sub TTF_Init_Fields +{ + my ($str, $pos, $inval) = @_; + my ($key, $val, $res, $len, $rel); + + $str =~ s/\r?\n$//o; + if ($inval) + { ($key, $val) = ($str, $inval); } + else + { ($key, $val) = split(',\s*', $str); } + return (undef, undef, 0) unless (defined $key && $key ne ""); + if ($val =~ m/^(\+?)(\d*)(\D+)(\d*)/oi) + { + $rel = $1; + if ($rel eq "+") + { $pos += $2; } + elsif ($2 ne "") + { $pos = $2; } + $val = $3; + $len = $4; + } + $len = "" unless defined $len; + $pos = 0 if !defined $pos || $pos eq ""; + $res = "$pos:$val:$len"; + if ($val eq "f" || $val eq 'v' || $val =~ m/^[l]/oi) + { $pos += 4 * ($len ne "" ? $len : 1); } + elsif ($val eq "F" || $val =~ m/^[s]/oi) + { $pos += 2 * ($len ne "" ? $len : 1); } + else + { $pos += 1 * ($len ne "" ? $len : 1); } + + ($key, $res, $pos); +} + + +=head2 TTF_Read_Fields($obj, $dat, $fields) + +Given a block of data large enough to account for all the fields in a table, +processes the data block to convert to the values in the objects instance +variables by name based on the list in the C block which has been run +through C + +=cut + +sub TTF_Read_Fields +{ + my ($self, $dat, $fields) = @_; + my ($pos, $type, $res, $f, $arrlen, $arr, $frac); + + foreach $f (keys %{$fields}) + { + ($pos, $type, $arrlen) = split(':', $fields->{$f}); + $pos = 0 if $pos eq ""; + if ($arrlen ne "") + { $self->{$f} = [TTF_Unpack("$type$arrlen", substr($dat, $pos))]; } + else + { $self->{$f} = TTF_Unpack("$type", substr($dat, $pos)); } + } + $self; +} + + +=head2 TTF_Unpack($fmt, $dat) + +A TrueType types equivalent of Perls C function. Thus $fmt consists of +type followed by an optional number of elements to read including *. The type +may be one of: + + c BYTE + C CHAR + f FIXED + F F2DOT14 + l LONG + L ULONG + s SHORT + S USHORT + v Version number (FIXED) + +Note that C, C and C are not data types but units. + +Returns array of scalar (first element) depending on context + +=cut + +sub TTF_Unpack +{ + my ($fmt, $dat) = @_; + my ($res, $frac, $i, $arrlen, $type, @res); + + while ($fmt =~ s/^([cflsv])(\d+|\*)?//oi) + { + $type = $1; + $arrlen = $2; + $arrlen = 1 if !defined $arrlen || $arrlen eq ""; + $arrlen = -1 if $arrlen eq "*"; + + for ($i = 0; ($arrlen == -1 && $dat ne "") || $i < $arrlen; $i++) + { + if ($type eq "f") + { + ($res, $frac) = unpack("nn", $dat); + substr($dat, 0, 4) = ""; + $res -= 65536 if $res > 32767; + $res += $frac / 65536.; + } + elsif ($type eq "v") + { + ($res, $frac) = unpack("nn", $dat); + substr($dat, 0, 4) = ""; + $res -= 65536 if $res > 32767; + $res = sprintf("%d.%X", $res, $frac); + } + elsif ($type eq "F") + { + $res = unpack("n", $dat); + substr($dat, 0, 2) = ""; +# $res -= 65536 if $res >= 32768; + $frac = $res & 0x3fff; + $res >>= 14; + $res -= 4 if $res > 1; +# $frac -= 16384 if $frac > 8191; + $res += $frac / 16384.; + } + elsif ($type =~ m/^[l]/oi) + { + $res = unpack("N", $dat); + substr($dat, 0, 4) = ""; + $res -= (1 << 32) if ($type eq "l" && $res >= 1 << 31); + } + elsif ($type =~ m/^[s]/oi) + { + $res = unpack("n", $dat); + substr($dat, 0, 2) = ""; + $res -= 65536 if ($type eq "s" && $res >= 32768); + } + elsif ($type eq "c") + { + $res = unpack("c", $dat); + substr($dat, 0, 1) = ""; + } + else + { + $res = unpack("C", $dat); + substr($dat, 0, 1) = ""; + } + push (@res, $res); + } + } + return wantarray ? @res : $res[0]; +} + + +=head2 $dat = TTF_Out_Fields($obj, $fields, $len) + +Given the fields table from C writes out the instance variables from +the object to the filehandle in TTF binary form. + +=cut + +sub TTF_Out_Fields +{ + my ($obj, $fields, $len) = @_; + my ($dat) = "\000" x $len; + my ($f, $pos, $type, $res, $arr, $arrlen, $frac); + + foreach $f (keys %{$fields}) + { + ($pos, $type, $arrlen) = split(':', $fields->{$f}); + if ($arrlen ne "") + { $res = TTF_Pack("$type$arrlen", @{$obj->{$f}}); } + else + { $res = TTF_Pack("$type", $obj->{$f}); } + substr($dat, $pos, length($res)) = $res; + } + $dat; +} + + +=head2 $dat = TTF_Pack($fmt, @data) + +The TrueType equivalent to Perl's C function. See details of C +for how to work the $fmt string. + +=cut + +sub TTF_Pack +{ + my ($fmt, @obj) = @_; + my ($type, $i, $arrlen, $dat, $res, $frac); + + $dat = ''; + while ($fmt =~ s/^([flscv])(\d+|\*)?//oi) + { + $type = $1; + $arrlen = $2 || ""; + $arrlen = $#obj + 1 if $arrlen eq "*"; + $arrlen = 1 if $arrlen eq ""; + + for ($i = 0; $i < $arrlen; $i++) + { + $res = shift(@obj) || 0; + if ($type eq "f") + { + $frac = int(($res - int($res)) * 65536); + $res = (int($res) << 16) + $frac; + $dat .= pack("N", $res); + } + elsif ($type eq "v") + { + if ($res =~ s/\.(\d+)$//o) + { + $frac = $1; + $frac .= "0" x (4 - length($frac)); + } + else + { $frac = 0; } + $dat .= pack('nn', $res, eval("0x$frac")); + } + elsif ($type eq "F") + { + $frac = int(($res - int($res)) * 16384); + $res = (int($res) << 14) + $frac; + $dat .= pack("n", $res); + } + elsif ($type =~ m/^[l]/oi) + { + $res += 1 << 32 if ($type eq 'L' && $res < 0); + $dat .= pack("N", $res); + } + elsif ($type =~ m/^[s]/oi) + { + $res += 1 << 16 if ($type eq 'S' && $res < 0); + $dat .= pack("n", $res); + } + elsif ($type eq "c") + { $dat .= pack("c", $res); } + else + { $dat .= pack("C", $res); } + } + } + $dat; +} + + +=head2 ($num, $range, $select, $shift) = TTF_bininfo($num) + +Calculates binary search information from a number of elements + +=cut + +sub TTF_bininfo +{ + my ($num, $block) = @_; + my ($range, $select, $shift); + + $range = 1; + for ($select = 0; $range <= $num; $select++) + { $range *= 2; } + $select--; $range /= 2; + $range *= $block; + + $shift = $num * $block - $range; + ($num, $range, $select, $shift); +} + + +=head2 TTF_word_utf8($str) + +Returns the UTF8 form of the 16 bit string, assumed to be in big endian order, +including surrogate handling + +=cut + +sub TTF_word_utf8 +{ + my ($str) = @_; + my ($res, $i); + my (@dat) = unpack("n*", $str); + + return pack("U*", @dat) if ($] >= 5.006); + for ($i = 0; $i <= $#dat; $i++) + { + my ($dat) = $dat[$i]; + if ($dat < 0x80) # Thanks to Gisle Aas for some of his old code + { $res .= chr($dat); } + elsif ($dat < 0x800) + { $res .= chr(0xC0 | ($dat >> 6)) . chr(0x80 | ($dat & 0x3F)); } + elsif ($dat >= 0xD800 && $dat < 0xDC00) + { + my ($dat1) = $dat[++$i]; + my ($top) = (($dat & 0x3C0) >> 6) + 1; + $res .= chr(0xF0 | ($top >> 2)) + . chr(0x80 | (($top & 1) << 4) | (($dat & 0x3C) >> 2)) + . chr(0x80 | (($dat & 0x3) << 4) | (($dat1 & 0x3C0) >> 6)) + . chr(0x80 | ($dat1 & 0x3F)); + } else + { $res .= chr(0xE0 | ($dat >> 12)) . chr(0x80 | (($dat >> 6) & 0x3F)) + . chr(0x80 | ($dat & 0x3F)); } + } + $res; +} + + +=head2 TTF_utf8_word($str) + +Returns the 16-bit form in big endian order of the UTF 8 string, including +surrogate handling to Unicode. + +=cut + +sub TTF_utf8_word +{ + my ($str) = @_; + my ($res); + + return pack("n*", unpack("U*", $str)) if ($^V ge v5.6.0); + $str = "$str"; # copy $str + while (length($str)) # Thanks to Gisle Aas for some of his old code + { + $str =~ s/^[\x80-\xBF]+//o; + if ($str =~ s/^([\x00-\x7F]+)//o) + { $res .= pack("n*", unpack("C*", $1)); } + elsif ($str =~ s/^([\xC0-\xDF])([\x80-\xBF])//o) + { $res .= pack("n", ((ord($1) & 0x1F) << 6) | (ord($2) & 0x3F)); } + elsif ($str =~ s/^([\0xE0-\xEF])([\x80-\xBF])([\x80-\xBF])//o) + { $res .= pack("n", ((ord($1) & 0x0F) << 12) + | ((ord($2) & 0x3F) << 6) + | (ord($3) & 0x3F)); } + elsif ($str =~ s/^([\xF0-\xF7])([\x80-\xBF])([\x80-\xBF])([\x80-\xBF])//o) + { + my ($b1, $b2, $b3, $b4) = (ord($1), ord($2), ord($3), ord($4)); + $res .= pack("n", ((($b1 & 0x07) << 8) | (($b2 & 0x3F) << 2) + | (($b3 & 0x30) >> 4)) + 0xD600); # account for offset + $res .= pack("n", ((($b3 & 0x0F) << 6) | ($b4 & 0x3F)) + 0xDC00); + } + elsif ($str =~ s/^[\xF8-\xFF][\x80-\xBF]*//o) + { } + } + $res; +} + + +=head2 XML_hexdump($context, $dat) + +Dumps out the given data as a sequence of blocks each 16 bytes wide + +=cut + +sub XML_hexdump +{ + my ($context, $depth, $dat) = @_; + my ($fh) = $context->{'fh'}; + my ($i, $len, $out); + + $len = length($dat); + for ($i = 0; $i < $len; $i += 16) + { + $out = join(' ', map {sprintf("%02X", ord($_))} (split('', substr($dat, $i, 16)))); + $fh->printf("%s%s\n", $depth, $i, $out); + } +} + + +=head2 XML_outhints + +Converts a binary string of hinting code into a textual representation + +=cut + +{ + my (@hints) = ( + ['SVTCA[0]'], ['SVTCA[1]'], ['SPVTCA[0]'], ['SPVTCA[1]'], ['SFVTCA[0]'], ['SFVTCA[1]'], ['SPVTL[0]'], ['SPVTL[1]'], + ['SFVTL[0]'], ['SFVTL[1]'], ['SPVFS'], ['SFVFS'], ['GPV'], ['GFV'], ['SVFTPV'], ['ISECT'], +# 10 + ['SRP0'], ['SRP1'], ['SRP2'], ['SZP0'], ['SZP1'], ['SZP2'], ['SZPS'], ['SLOOP'], + ['RTG'], ['RTHG'], ['SMD'], ['ELSE'], ['JMPR'], ['SCVTCI'], ['SSWCI'], ['SSW'], +# 20 + ['DUP'], ['POP'], ['CLEAR'], ['SWAP'], ['DEPTH'], ['CINDEX'], ['MINDEX'], ['ALIGNPTS'], + [], ['UTP'], ['LOOPCALL'], ['CALL'], ['FDEF'], ['ENDF'], ['MDAP[0]'], ['MDAP[1]'], +# 30 + ['IUP[0]'], ['IUP[1]'], ['SHP[0]'], ['SHP[1]'], ['SHC[0]'], ['SHC[1]'], ['SHZ[0]'], ['SHZ[1]'], + ['SHPIX'], ['IP'], ['MSIRP[0]'], ['MSIRP[1]'], ['ALIGNRP'], ['RTDG'], ['MIAP[0]'], ['MIAP[1]'], +# 40 + ['NPUSHB', -1, 1], ['NPUSHW', -1, 2], ['WS', 0, 0], ['RS', 0, 0], ['WCVTP', 0, 0], ['RCVT', 0, 0], ['GC[0]'], ['GC[1]'], + ['SCFS'], ['MD[0]'], ['MD[1]'], ['MPPEM'], ['MPS'], ['FLIPON'], ['FLIPOFF'], ['DEBUG'], +# 50 + ['LT'], ['LTEQ'], ['GT'], ['GTEQ'], ['EQ'], ['NEQ'], ['ODD'], ['EVEN'], + ['IF'], ['EIF'], ['AND'], ['OR'], ['NOT'], ['DELTAP1'], ['SDB'], ['SDS'], +# 60 + ['ADD'], ['SUB'], ['DIV'], ['MULT'], ['ABS'], ['NEG'], ['FLOOR'], ['CEILING'], + ['ROUND[0]'], ['ROUND[1]'], ['ROUND[2]'], ['ROUND[3]'], ['NROUND[0]'], ['NROUND[1]'], ['NROUND[2]'], ['NROUND[3]'], +# 70 + ['WCVTF'], ['DELTAP2'], ['DELTAP3'], ['DELTAC1'], ['DELTAC2'], ['DELTAC3'], ['SROUND'], ['S45ROUND'], + ['JROT'], ['JROF'], ['ROFF'], [], ['RUTG'], ['RDTG'], ['SANGW'], [], +# 80 + ['FLIPPT'], ['FLIPRGON'], ['FLIPRGOFF'], [], [], ['SCANCTRL'], ['SDPVTL[0]'], ['SDPVTL[1]'], + ['GETINFO'], ['IDEF'], ['ROLL'], ['MAX'], ['MIN'], ['SCANTYPE'], ['INSTCTRL'], [], +# 90 + [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], +# A0 + [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], +# B0 + ['PUSHB1', 1, 1], ['PUSHB2', 2, 1], ['PUSHB3', 3, 1], ['PUSHB4', 4, 1], ['PUSHB5', 5, 1], ['PUSHB6', 6, 1], ['PUSHB7', 7, 1], ['PUSHB8', 8, 1], + ['PUSHW1', 1, 2], ['PUSHW2', 2, 2], ['PUSHW3', 3, 2], ['PUSHW4', 4, 2], ['PUSHW5', 5, 2], ['PUSHW6', 6, 2], ['PUSHW7', 7, 2], ['PUSHW8', 8, 2], +# C0 + ['MDRP[0]'], ['MDRP[1]'], ['MDRP[2]'], ['MDRP[3]'], ['MDRP[4]'], ['MDRP[5]'], ['MDRP[6]'], ['MDRP[7]'], + ['MDRP[8]'], ['MDRP[9]'], ['MDRP[A]'], ['MDRP[B]'], ['MDRP[C]'], ['MDRP[D]'], ['MDRP[E]'], ['MDRP[F]'], +# D0 + ['MDRP[10]'], ['MDRP[11]'], ['MDRP[12]'], ['MDRP[13]'], ['MDRP[14]'], ['MDRP[15]'], ['MDRP[16]'], ['MDRP[17]'], + ['MDRP[18]'], ['MDRP[19]'], ['MDRP[1A]'], ['MDRP[1B]'], ['MDRP[1C]'], ['MDRP[1D]'], ['MDRP[1E]'], ['MDRP[1F]'], +# E0 + ['MIRP[0]'], ['MIRP[1]'], ['MIRP[2]'], ['MIRP[3]'], ['MIRP[4]'], ['MIRP[5]'], ['MIRP[6]'], ['MIRP[7]'], + ['MIRP[8]'], ['MIRP[9]'], ['MIRP[A]'], ['MIRP[B]'], ['MIRP[C]'], ['MIRP[D]'], ['MIRP[E]'], ['MIRP[F]'], +# F0 + ['MIRP[10]'], ['MIRP[11]'], ['MIRP[12]'], ['MIRP[13]'], ['MIRP[14]'], ['MIRP[15]'], ['MIRP[16]'], ['MIRP[17]'], + ['MIRP[18]'], ['MIRP[19]'], ['MIRP[1A]'], ['MIRP[1B]'], ['MIRP[1C]'], ['MIRP[1D]'], ['MIRP[1E]'], ['MIRP[1F]']); + + my ($i); + my (%hints) = map { $_->[0] => $i++ if (defined $_->[0]); } @hints; + + sub XML_binhint + { + my ($dat) = @_; + my ($len) = length($dat); + my ($res, $i, $text, $size, $num); + + for ($i = 0; $i < $len; $i++) + { + ($text, $num, $size) = @{$hints[ord(substr($dat, $i, 1))]}; + $num = 0 unless (defined $num); + $text = sprintf("UNK[%02X]", ord(substr($dat, $i, 1))) unless defined $text; + $res .= $text; + if ($num != 0) + { + if ($num < 0) + { + $i++; + my ($nnum) = unpack($num == -1 ? 'C' : 'n', substr($dat, $i, -$num)); + $i += -$num - 1; + $num = $nnum; + } + $res .= "\t" . join(' ', unpack($size == 1 ? 'C*' : 'n*', substr($dat, $i + 1, $num * $size))); + $i += $num * $size; + } + $res .= "\n"; + } + $res; + } + + sub XML_hintbin + { + my ($dat) = @_; + my ($l, $res, @words, $num); + + foreach $l (split(/\s*\n\s*/, $dat)) + { + @words = split(/\s*/, $l); + next unless (defined $hints{$words[0]}); + $num = $hints{$words[0]}; + $res .= pack('C', $num); + if ($hints[$num][1] < 0) + { + $res .= pack($hints[$num][1] == -1 ? 'C' : 'n', $#words); + $res .= pack($hints[$num][2] == 1 ? 'C*' : 'n*', @words[1 .. $#words]); + } + elsif ($hints[$num][1] > 0) + { + $res .= pack($hints[$num][2] == 1 ? 'C*' : 'n*', @words[1 .. $hints[$num][1]]); + } + } + $res; + } +} + + +=head2 make_circle($f, $cmap, [$dia, $sb, $opts]) + +Adds a dotted circle to a font. This function is very configurable. The +parameters passed in are: + +=over 4 + +=item $f + +Font to work with. This is required. + +=item $cmap + +A cmap table (not the 'val' sub-element of a cmap) to add the glyph too. Optional. + +=item $dia + +Optional diameter for the main circle. Defaults to 80% em + +=item $sb + +Side bearing. The left and right side-bearings are always the same. This value +defaults to 10% em. + +=back + +There are various options to control all sorts of interesting aspects of the circle + +=over 4 + +=item numDots + +Number of dots in the circle + +=item numPoints + +Number of curve points to use to create each dot + +=item uid + +Unicode reference to store this glyph under in the cmap. Defaults to 0x25CC + +=item pname + +Postscript name to give the glyph. Defaults to uni25CC. + +=item -dRadius + +Radius of each dot. + +=back + +=cut + +sub make_circle +{ + my ($font, $cmap, $dia, $sb, %opts) = @_; + my ($upem) = $font->{'head'}{'unitsPerEm'}; + my ($glyph) = Font::TTF::Glyph->new('PARENT' => $font, 'read' => 2); + my ($PI) = 3.1415926535; + my ($R, $r, $xorg, $yorg); + my ($i, $j, $numg, $maxp); + my ($numc) = $opts{'-numDots'} || 16; + my ($nump) = ($opts{'-numPoints'} * 2) || 8; + my ($uid) = $opts{'-uid'} || 0x25CC; + my ($pname) = $opts{'-pname'} || 'uni25CC'; + + $dia ||= $upem * .8; # .95 to fit exactly + $sb ||= $upem * .1; + $R = $dia / 2; + $r = $opts{'-dRadius'} || ($R * .1); + ($xorg, $yorg) = ($R + $r, $R); + + $xorg += $sb; + $font->{'post'}->read; + $font->{'glyf'}->read; + for ($i = 0; $i < $numc; $i++) + { + my ($pxorg, $pyorg) = ($xorg + $R * cos(2 * $PI * $i / $numc), + $yorg + $R * sin(2 * $PI * $i / $numc)); + for ($j = 0; $j < $nump; $j++) + { + push (@{$glyph->{'x'}}, int ($pxorg + ($j & 1 ? 1/cos(2*$PI/$nump) : 1) * $r * cos(2 * $PI * $j / $nump))); + push (@{$glyph->{'y'}}, int ($pyorg + ($j & 1 ? 1/cos(2*$PI/$nump) : 1) * $r * sin(2 * $PI * $j / $nump))); + push (@{$glyph->{'flags'}}, $j & 1 ? 0 : 1); + } + push (@{$glyph->{'endPoints'}}, $#{$glyph->{'x'}}); + } + $glyph->{'numberOfContours'} = $#{$glyph->{'endPoints'}} + 1; + $glyph->{'numPoints'} = $#{$glyph->{'x'}} + 1; + $glyph->update; + $numg = $font->{'maxp'}{'numGlyphs'}; + $font->{'maxp'}{'numGlyphs'}++; + + $font->{'hmtx'}{'advance'}[$numg] = int($xorg + $R + $r + $sb + .5); + $font->{'hmtx'}{'lsb'}[$numg] = int($xorg - $R - $r + .5); + $font->{'loca'}{'glyphs'}[$numg] = $glyph; + $cmap->{'val'}{$uid} = $numg if ($cmap); + $font->{'post'}{'VAL'}[$numg] = $pname; + delete $font->{'hdmx'}; + delete $font->{'VDMX'}; + delete $font->{'LTSH'}; + + $font->tables_do(sub {$_[0]->dirty;}); + $font->update; + return ($numg - 1); +} + + +1; + +=head1 BUGS + +No known bugs + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Vhea.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Vhea.pm new file mode 100644 index 0000000..2e1a49a --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Vhea.pm @@ -0,0 +1,159 @@ +package Font::TTF::Vhea; + +=head1 NAME + +Font::TTF::Vhea - Vertical Header table + +=head1 DESCRIPTION + +This is a simple table with just standards specified instance variables + +=head1 INSTANCE VARIABLES + + version + Ascender + Descender + LineGap + advanceHeightMax + minTopSideBearing + minBottomSideBearing + yMaxExtent + caretSlopeRise + caretSlopeRun + metricDataFormat + numberOfVMetrics + + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA %fields @field_info); + +require Font::TTF::Table; +use Font::TTF::Utils; + +@ISA = qw(Font::TTF::Table); +@field_info = ( + 'version' => 'v', + 'Ascender' => 's', + 'Descender' => 's', + 'LineGap' => 's', + 'advanceHeightMax' => 'S', + 'minTopSideBearing' => 's', + 'minBottomSideBearing' => 's', + 'yMaxExtent' => 's', + 'caretSlopeRise' => 's', + 'caretSlopeRun' => 's', + 'metricDataFormat' => '+10s', + 'numberOfVMetrics' => 's'); + +sub init +{ + my ($k, $v, $c, $i); + for ($i = 0; $i < $#field_info; $i += 2) + { + ($k, $v, $c) = TTF_Init_Fields($field_info[$i], $c, $field_info[$i + 1]); + next unless defined $k && $k ne ""; + $fields{$k} = $v; + } +} + + +=head2 $t->read + +Reads the table into memory as instance variables + +=cut + +sub read +{ + my ($self) = @_; + my ($dat); + + $self->SUPER::read or return $self; + init unless defined $fields{'Ascender'}; + $self->{' INFILE'}->read($dat, 36); + + TTF_Read_Fields($self, $dat, \%fields); + $self; +} + + +=head2 $t->out($fh) + +Writes the table to a file either from memory or by copying. + +=cut + +sub out +{ + my ($self, $fh) = @_; + + return $self->SUPER::out($fh) unless $self->{' read'}; + + $self->{'numberOfVMetrics'} = $self->{' PARENT'}{'vmtx'}->numMetrics || $self->{'numberOfVMetrics'}; + $fh->print(TTF_Out_Fields($self, \%fields, 36)); + $self; +} + + +=head2 $t->update + +Updates various parameters in the hhea table from the hmtx table, assuming +the C table is dirty. + +=cut + +sub update +{ + my ($self) = @_; + my ($vmtx) = $self->{' PARENT'}{'vmtx'}; + my ($glyphs); + my ($num); + my ($i, $maw, $mlsb, $mrsb, $mext, $aw, $lsb, $ext); + + return undef unless ($self->SUPER::update); + return undef unless (defined $vmtx && defined $self->{' PARENT'}{'loca'}); + $vmtx->read->update; + $self->{' PARENT'}{'loca'}->read->update; + $glyphs = $self->{' PARENT'}{'loca'}{'glyphs'}; + $num = $self->{' PARENT'}{'maxp'}{'numGlyphs'}; + + for ($i = 0; $i < $num; $i++) + { + $aw = $vmtx->{'advance'}[$i]; + $lsb = $vmtx->{'top'}[$i]; + if (defined $glyphs->[$i]) + { $ext = $lsb + $glyphs->[$i]->read->{'yMax'} - $glyphs->[$i]{'yMin'}; } + else + { $ext = $aw; } + $maw = $aw if ($aw > $maw); + $mlsb = $lsb if ($lsb < $mlsb or $i == 0); + $mrsb = $aw - $ext if ($aw - $ext < $mrsb or $i == 0); + $mext = $ext if ($ext > $mext); + } + $self->{'advanceHeightMax'} = $maw; + $self->{'minTopSideBearing'} = $mlsb; + $self->{'minBottomSideBearing'} = $mrsb; + $self->{'yMaxExtent'} = $mext; + $self->{'numberOfVMetrics'} = $vmtx->numMetrics; + $self; +} + + +1; + + +=head1 BUGS + +None known + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Vmtx.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Vmtx.pm new file mode 100644 index 0000000..b74d6df --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Vmtx.pm @@ -0,0 +1,86 @@ +package Font::TTF::Vmtx; + +=head1 NAME + +Font::TTF::Vmtx - Vertical Metrics + +=head1 DESCRIPTION + +Contains the advance height and top side bearing for each glyph. Given the +compressability of the data onto disk, this table uses information from +other tables, and thus must do part of its output during the output of +other tables + +=head1 INSTANCE VARIABLES + +The vertical metrics are kept in two arrays by glyph id. The variable names +do not start with a space + +=over 4 + +=item advance + +An array containing the advance height for each glyph + +=item top + +An array containing the top side bearing for each glyph + +=back + +=head1 METHODS + +=cut + +use strict; +use vars qw(@ISA); +require Font::TTF::Hmtx; + +@ISA = qw(Font::TTF::Hmtx); + + +=head2 $t->read + +Reads the vertical metrics from the TTF file into memory + +=cut + +sub read +{ + my ($self) = @_; + my ($numh, $numg); + + $numh = $self->{' PARENT'}{'vhea'}->read->{'numberOfVMetrics'}; + $numg = $self->{' PARENT'}{'maxp'}{'numGlyphs'}; + $self->_read($numg, $numh, "advance", "top"); +} + + +=head2 $t->out($fh) + +Writes the metrics to a TTF file. Assumes that the C has updated the +numVMetrics from here + +=cut + +sub out +{ + my ($self, $fh) = @_; + my ($numg) = $self->{' PARENT'}{'maxp'}{'numGlyphs'}; + my ($numh) = $self->{' PARENT'}{'vhea'}{'numberOfVMetrics'}; + $self->_out($fh, $numg, $numh, "advance", "top"); +} + +1; + +=head1 BUGS + +None known + +=head1 AUTHOR + +Martin Hosken Martin_Hosken@sil.org. See L for copyright and +licensing. + +=cut + diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/Win32.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Win32.pm new file mode 100644 index 0000000..bb8886e --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/Win32.pm @@ -0,0 +1,33 @@ +package Font::TTF::Win32; + +# use strict; +# use vars qw($HKEY_LOCAL_MACHINE); + +use Win32::Registry; +use Win32; +use File::Spec; +use Font::TTF::Font; + + +sub findfonts +{ + my ($sub) = @_; + my ($font_key) = 'SOFTWARE\Microsoft\Windows' . (Win32::IsWinNT() ? ' NT' : '') . '\CurrentVersion\Fonts'; + my ($regFont, $list, $l, $font, $file); + +# get entry from registry for a font of this name + $::HKEY_LOCAL_MACHINE->Open($font_key, $regFont); + $regFont->GetValues($list); + + foreach $l (sort keys %{$list}) + { + my ($fname) = $list->{$l}[0]; + next unless ($fname =~ s/\(TrueType\)$//o); + $file = File::Spec->rel2abs($list->{$l}[2], "$ENV{'windir'}/fonts"); + $font = Font::TTF::Font->open($file) || next; + &{$sub}($font, $fname); + $font->release; + } +} + +1; diff --git a/font-optimizer/ext/Font-TTF/lib/Font/TTF/XMLparse.pm b/font-optimizer/ext/Font-TTF/lib/Font/TTF/XMLparse.pm new file mode 100644 index 0000000..7b2b571 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/Font/TTF/XMLparse.pm @@ -0,0 +1,176 @@ +package Font::TTF::XMLparse; + +=head1 NAME + +Font::TTF::XMLparse - provides support for XML parsing. Requires Expat module XML::Parser::Expat + +=head1 SYNOPSIS + + use Font::TTF::Font; + use Font::TTF::XMLparse; + + $f = Font::TTF::Font->new; + read_xml($f, $ARGV[0]); + $f->out($ARGV[1]); + +=head1 DESCRIPTION + +This module contains the support routines for parsing XML and generating the +Truetype font structures as a result. The module has been separated from the rest +of the package in order to reduce the dependency that this would bring, of the +whole package on XML::Parser. This way, people without the XML::Parser can still +use the rest of the package. + +The package interacts with another package through the use of a context containing +and element 'receiver' which is an object which can possibly receive one of the +following messages: + +=over 4 + +=item XML_start + +This message is called when an open tag occurs. It is called with the context, +tag name and the attributes. The return value has no meaning. + +=item XML_end + +This messages is called when a close tag occurs. It is called with the context, +tag name and attributes (held over from when the tag was opened). There are 3 +possible return values from such a message: + +=over 8 + +=item undef + +This is the default return value indicating that default processing should +occur in which either the current element on the tree, or the text of this element +should be stored in the parent object. + +=item $context + +This magic value marks that the element should be deleted from the parent. +Nothing is stored in the parent. (This rather than '' is used to allow 0 returns.) + +=item anything + +Anything else is taken as the element content to be stored in the parent. + +=back 4 + +=back 4 + +In addition, the context hash passed to these messages contains the following +keys: + +=over 4 + +=item xml + +This is the expat xml object. The context is also available as +$context->{'xml'}{' mycontext'}. But that is a long winded way of not saying much! + +=item font + +This is the base object that was passed in for XML parsing. + +=item receiver + +This holds the current receiver of parsing events. It may be set in associated +application to adjust which objects should receive messages when. It is also stored +in the parsing stack to ensure that where an object changes it during XML_start, that +that same object that received XML_start will receive the corresponding XML_end + +=item stack + +This is the parsing stack, used internally to hold the current receiver and attributes +for each element open, as a complete hierarchy back to the root element. + +=item tree + +This element contains the storage tree corresponding to the parent of each element +in the stack. The default action is to push undef onto this stack during XML_start +and then to resolve this, either in the associated application (by changing +$context->{'tree'}[-1]) or during XML_end of a child element, by which time we know +whether we are dealing with an array or a hash or what. + +=item text + +Character processing is to insert all the characters into the text element of the +context for available use later. + +=back 4 + +=head1 METHODS + +=cut + +use XML::Parser::Expat; +require Exporter; + +use strict; +use vars qw(@ISA @EXPORT); + +@ISA = qw(Exporter); +@EXPORT = qw(read_xml); + +sub read_xml +{ + my ($font, $fname) = @_; + + my ($xml) = XML::Parser::Expat->new; + my ($context) = {'xml' => $xml, 'font' => $font}; + + $xml->setHandlers('Start' => sub { + my ($x, $tag, %attrs) = @_; + my ($context) = $x->{' mycontext'}; + my ($fn) = $context->{'receiver'}->can('XML_start'); + + push(@{$context->{'tree'}}, undef); + push(@{$context->{'stack'}}, [$context->{'receiver'}, {%attrs}]); + &{$fn}($context->{'receiver'}, $context, $tag, %attrs) if defined $fn; + }, + 'End' => sub { + my ($x, $tag) = @_; + my ($context) = $x->{' mycontext'}; + my ($fn) = $context->{'receiver'}->can('XML_end'); + my ($stackinfo) = pop(@{$context->{'stack'}}); + my ($current, $res); + + $context->{'receiver'} = $stackinfo->[0]; + $context->{'text'} =~ s/^\s*(.*?)\s*$/$1/o; + $res = &{$fn}($context->{'receiver'}, $context, $tag, %{$stackinfo->[1]}) if defined $fn; + $current = pop(@{$context->{'tree'}}); + $current = $context->{'text'} unless (defined $current); + $context->{'text'} = ''; + + if (defined $res) + { + return if ($res eq $context); + $current = $res; + } + return unless $#{$context->{'tree'}} >= 0; + if ($tag eq 'elem') + { + $context->{'tree'}[-1] = [] unless defined $context->{'tree'}[-1]; + push (@{$context->{'tree'}[-1]}, $current); + } else + { + $context->{'tree'}[-1] = {} unless defined $context->{'tree'}[-1]; + $context->{'tree'}[-1]{$tag} = $current; + } + }, + 'Char' => sub { + my ($x, $str) = @_; + $x->{' mycontext'}{'text'} .= $str; + }); + + $xml->{' mycontext'} = $context; + + $context->{'receiver'} = $font; + if (ref $fname) + { return $xml->parse($fname); } + else + { return $xml->parsefile($fname); } +} + + diff --git a/font-optimizer/ext/Font-TTF/lib/ttfmod.pl b/font-optimizer/ext/Font-TTF/lib/ttfmod.pl new file mode 100644 index 0000000..dd10f9e --- /dev/null +++ b/font-optimizer/ext/Font-TTF/lib/ttfmod.pl @@ -0,0 +1,174 @@ +# Title: TTFMOD.PL +# Author: M. Hosken +# Description: Read TTF file calling user functions for each table +# and output transformed tables to new TTF file. +# Useage: TTFMOD provides the complete control loop for processing +# the TTF files. All that the caller need supply is an +# associative array of functions to call keyed by the TTF +# table name and the two filenames. +# +# &ttfmod($infile, $outfile, *fns [, @must]); +# +# *fns is an associative array keyed by table name with +# values of the name of the subroutine in package main to +# be called to transfer the table from INFILE to OUTFILE. +# The subroutine is called with the following parameters and +# expected return values: +# +# ($len, $csum) = &sub(*INFILE, *OUTFILE, $len); +# +# INFILE and OUTFILE are the input and output streams, $len +# is the length of the table according to the directory. +# The return values are $len = new length of table to be +# given in the table directory. $csum = new value of table +# checksum. A way to test that this is correct is to +# checksum the whole file (e.g. using CSUM.BAT) and to +# ensure that the value is 0xB1B0AFBA according to a 32 bit +# checksum calculated bigendien. +# +# @must consists of a list of tables which must exist in the +# final output file, either by being there alread or by being +# inserted. +# +# Modifications: +# MJPH 1.00 22-SEP-1994 Original +# MJPH 1.1 18-MAR-1998 Added @must to ttfmod() +# MJPH 1.1.1 25-MAR-1998 Added $csum to copytab (to make reusable) + +package ttfmod; + +sub main'ttfmod { + local($infile, $outfile, *fns, @must) = @_; + + # open files as binary. Notice OUTFILE is opened for update not just write + open(INFILE, "$infile") || die "Unable top open \"$infile\" for reading"; + binmode INFILE; + open(OUTFILE, "+>$outfile") || die "Unable to open \"$outfile\" for writing"; + binmode OUTFILE; + + seek(INFILE, 0, 0); + read(INFILE, $dir_head, 12) || die "Reading table header"; + ($dir_num) = unpack("x4n", $dir_head); + print OUTFILE $dir_head; + # read and unpack table directory + for ($i = 0; $i < $dir_num; $i++) + { + read(INFILE, $dir_val, 16) || die "Reading table entry"; + $dir{unpack("a4", $dir_val)} = join(":", $i, unpack("x4NNN", $dir_val)); + print OUTFILE $dir_val; + printf STDERR "%s %08x\n", unpack("a4", $dir_val), unpack("x8N", $dir_val) + if (defined $main'opt_z); + } + foreach $n (@must) + { + next if defined $dir{$n}; + $dir{$n} = "$i:0:-1:0"; + $i++; $dir_num++; + print OUTFILE pack("a4NNN", $n, 0, -1, 0); + } + substr($dir_head, 4, 2) = pack("n", $dir_num); + $csum = unpack("%32N*", $dir_head); + $off = tell(OUTFILE); + seek(OUTFILE, 0, 0); + print OUTFILE $dir_head; + seek (OUTFILE, $off, 0); + # process tables in order they occur in the file + @dirlist = sort byoffset keys(%dir); + foreach $tab (@dirlist) + { + @tab_split = split(':', $dir{$tab}); + seek(INFILE, $tab_split[2], 0); # offset + $tab_split[2] = tell(OUTFILE); + if (defined $fns{$tab}) + { + $temp = "main'$fns{$tab}"; + ($dir_len, $sum) = &$temp(*INFILE, *OUTFILE, $tab_split[3]); + } + else + { + ($dir_len, $sum) = ©tab(*INFILE, *OUTFILE, $tab_split[3]); + } + $tab_split[3] = $dir_len; # len + $tab_split[1] = $sum; # checksum + $out_dir{$tab} = join(":", @tab_split); + } + # now output directory in same order as original directory + @dirlist = sort byindex keys(%out_dir); + foreach $tab (@dirlist) + { + @tab_split = split(':', $out_dir{$tab}); + seek (OUTFILE, 12 + $tab_split[0] * 16, 0); # directory index + print OUTFILE pack("A4N3", $tab, @tab_split[1..3]); + foreach $i (1..3, 1) # checksum directory values with csum twice + { + $csum += $tab_split[$i]; + # this line ensures $csum stays within 32 bit bounds, clipping as necessary + if ($csum > 0xffffffff) { $csum -= 0xffffffff; $csum--; } + } + # checksum the tag + $csum += unpack("N", $tab); + if ($csum > 0xffffffff) { $csum -= 0xffffffff; $csum--; } + } + # handle main checksum + @tab_split = split(':', $out_dir{"head"}); + seek(OUTFILE, $tab_split[2], 0); + read(OUTFILE, $head_head, 12); # read first bit of "head" table + @head_split = unpack("N3", $head_head); + $tab_split[1] -= $head_split[2]; # subtract old checksum + $csum -= $head_split[2] * 2; # twice because had double effect + # already + if ($csum < 0 ) { $csum += 0xffffffff; $csum++; } + $head_split[2] = 0xB1B0AFBA - $csum; # calculate new checksum + seek (OUTFILE, 12 + $tab_split[0] * 16, 0); + print OUTFILE pack("A4N3", "head", @tab_split[1..3]); + seek (OUTFILE, $tab_split[2], 0); # rewrite first bit of "head" table + print OUTFILE pack("N3", @head_split); + + # finish up + close(OUTFILE); + close(INFILE); + } + +# support function for sorting by table offset +sub byoffset { + @t1 = split(':', $dir{$a}); + @t2 = split(':', $dir{$b}); + return 1 if ($t1[2] == -1); # put inserted tables at the end + return -1 if ($t2[2] == -1); + return $t1[2] <=> $t2[2]; + } + +# support function for sorting by directory entry order +sub byindex { + $t1 = split(':', $dir{$a}, 1); + $t2 = split(':', $dir{$b}, 1); + return $t1 <=> $t2; + } + +# default table action: copies a table from input to output, recalculating +# the checksum (just to be absolutely sure). +sub copytab { + local(*INFILE, *OUTFILE, $len, $csum) = @_; + + while ($len > 0) + { + $count = ($len > 8192) ? 8192 : $len; # 8K buffering + read(INFILE, $buf, $count) == $count || die "Copying"; + $buf .= "\0" x (4 - ($count & 3)) if ($count & 3); # pad to long + print OUTFILE $buf; + $csum += unpack("%32N*", $buf); + if ($csum > 0xffffffff) { $csum -= 0xffffffff; $csum--; } + $len -= $count; + } + ($_[2], $csum); + } + +# test routine to copy file from input to output, no changes +package main; + +if ($test_package) + { + &ttfmod($ARGV[0], $ARGV[1], *dummy); + } +else + { 1; } diff --git a/font-optimizer/ext/Font-TTF/t/OFL.txt b/font-optimizer/ext/Font-TTF/t/OFL.txt new file mode 100644 index 0000000..0b4fe4b --- /dev/null +++ b/font-optimizer/ext/Font-TTF/t/OFL.txt @@ -0,0 +1,94 @@ +Copyright (c) 2005-2007, M. Hosken and SIL International, +with Reserved Font Name FontUtils Test + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/font-optimizer/ext/Font-TTF/t/tags.t b/font-optimizer/ext/Font-TTF/t/tags.t new file mode 100644 index 0000000..f50e521 --- /dev/null +++ b/font-optimizer/ext/Font-TTF/t/tags.t @@ -0,0 +1,11 @@ +use strict; + +use Test::Simple tests => 3; +use Font::TTF::OTTags qw( %tttags %ttnames readtagsfile); + +ok($tttags{'SCRIPT'}{'Cypriot Syllabary'} eq 'cprt', 'tttags{SCRIPT}'); + +ok($ttnames{'LANGUAGE'}{'AFK '} eq 'Afrikaans', 'ttnames{LANGUAGE}'); + +ok($ttnames{'LANGUAGE'}{'DHV '} eq 'Dhivehi (OBSOLETE)' && $ttnames{'LANGUAGE'}{'DIV '} eq 'Dhivehi', 'ttnames{LANGUAGE} Dhivehi'); + diff --git a/font-optimizer/ext/Font-TTF/t/testfont.ttf b/font-optimizer/ext/Font-TTF/t/testfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d1bc3cf32adfea6c4f31de0c450b302f1a3fd477 GIT binary patch literal 35624 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 2; +use File::Compare; +use Font::TTF::Font; + +$f = Font::TTF::Font->open("t/testfont.ttf"); +ok($f); +$f->tables_do(sub { $_[0]->read; }); +$f->{'loca'}->glyphs_do(sub {$_[0]->read_dat; }); +$f->out("t/temp.ttf"); +$res = compare("t/temp.ttf", "t/testfont.ttf"); +ok(!$res); +unlink "t/temp.ttf" unless ($res); + diff --git a/font-optimizer/gen-tests.pl b/font-optimizer/gen-tests.pl new file mode 100644 index 0000000..63bb153 --- /dev/null +++ b/font-optimizer/gen-tests.pl @@ -0,0 +1,235 @@ +# This script generates various 'interesting' fonts, and outputs an HTML file +# containing the subsetted fonts and the original fonts. +# View the output in browsers (preferably multiple, on multiple platforms) to +# make sure the output looks the same as the original. + +use strict; +use warnings; + +use lib 'ext/Font-TTF/lib'; +use Font::Subsetter; +use Font::EOTWrapper; +use Encode; +use Clone; + +use utf8; + +# The following fonts need to exist in a directory called 'testfonts': +my @all = qw( + GenBasR.ttf + GenR102.TTF + LinLibertine_Re-4.1.8.ttf + DoulosSILR.ttf + DejaVuSans.ttf + DejaVuSerif.ttf + calibri.ttf + FedraSansPro-Demi.ttf +); + +my $index = $ARGV[0]; +die "Run '$0', or '$0 n' where n is the number of the test to rebuild\n" + if defined $index and $index !~ /^\d+$/; + +my @tests = ( + # These aren't proper tests (they drop features that affect the rendering) + # TODO: fix them so they are proper, and test that they're really dropping the + # unneeded glyphs etc +# [ [qw(DejaVuSans.ttf FedraSansPro-Demi.ttf)], ["fluffily لا f"], [20], [qw(aalt ccmp dlig fina hlig init liga locl medi rlig salt kern mark mkmk)] ], +# [ [qw(DejaVuSans.ttf FedraSansPro-Demi.ttf)], ["fluffily لا f"], [20], [qw(liga)] ], +# [ [qw(DejaVuSans.ttf FedraSansPro-Demi.ttf)], ["fluffily لا f"], [20], [qw(fina init rlig)] ], +# [ [qw(DejaVuSans.ttf FedraSansPro-Demi.ttf)], ["fluffily لا f"], [20], [] ], + + # Basic rendering + [ [@all], ["Hello world ABC abc 123"], [20] ], + + # Substitution and NFC issues + [ [qw(GenBasR.ttf DejaVuSans.ttf FedraSansPro-Demi.ttf)], [ + "i", + "\xec", + "i\x{0300}", + "i \x{0300}", + "ixixi", + "i\x{0300}", + ], [20, 8] ], + [ [qw(DejaVuSans.ttf FedraSansPro-Demi.ttf)], [ + "s\x{0323}\x{0307}", # s, combining dot below, combining dot above + "s\x{0307}\x{0323}", # s, combining dot above, combining dot below + "\x{1e61}\x{0323}", # s with dot above, combining dot below + "\x{1e63}\x{0307}", # s with dot below, combining dot above + "\x{212b}", # angstrom + ], [20, 8] ], + + # Ligature rendering + [ [qw(LinLibertine_Re-4.1.8.ttf DejaVuSans.ttf FedraSansPro-Demi.ttf)], [ + "fluffily", + "fluffily", + "fluffily", + ], [20, 8] ], + + # GPOS issues + [ [qw(DejaVuSans.ttf FedraSansPro-Demi.ttf calibri.ttf)], + ["|VAVAV|", "ToToT", "x//x"], [20], ['kern'] ], + + # Lots of stuff + [ [@all], ["VABC(123) fTo fluffiest ffi!\@#,. \x{00e2}\x{00eb}I\x{0303}o\x{0300}u\x{030a}\x{0305}\x{0303} i\x{0331}\x{0301} \x{0d23}\x{0d4d}\x{200d} παρακαλώ хэлло 你好 表示问候 やあ التلفون הלו"], [20, 8] ], + +); + +my $common_css = <preload($fn); + $font_cache{$fn} = $s; + } + return Clone::clone($font_cache{$fn}); +} + +my %std_fonts; +# if (0) { my $j = 0; +for my $j (0..$#all) { + my $fn = $all[$j]; + (my $eot_fn = $fn) =~ s/\.[ot]tf$/.eot/i; + if (not -e "testfonts/$eot_fn") { + Font::EOTWrapper::convert("testfonts/$fn", "testfonts/$eot_fn"); + } + $common_css .= <', 'testoutput/tests.html' or die $!; + binmode $out, ':utf8'; + + print $out < + +Font tests + +EOF +} + +my $i = -1; +for my $test (@tests) { + for my $fn (@{$test->[0]}) { + for my $text (@{$test->[1]}) { + ++$i; + next if defined $index and $index != $i; + + print encode('utf-8', "$fn -- $text\n"); + + (my $text_plain = $text) =~ s/<.*?>//g; + + my $features; + if ($test->[3]) { + $features = { DEFAULT => 0 }; + $features->{$_} = 1 for @{$test->[3]}; + } + + my $s = new_font("testfonts/$fn"); + $s->subset("testfonts/$fn", $text_plain, { features => $features }); + my $path = sprintf '%03d', $i; + $s->write("testoutput/$path.ttf"); + my $old_glyphs = $s->num_glyphs_old; + my $new_glyphs = $s->num_glyphs_new; + my @glyph_names = $s->glyph_names; + $s->release; + + Font::EOTWrapper::convert("testoutput/$path.ttf", "testoutput/$path.eot"); + + my $fragment = < +\@font-face { /* for IE */ + font-family: subsetted-$i; + src: url($path.eot); +} +\@font-face { + font-family: subsetted-$i; + src: url($path.ttf) format("truetype"); +} + +EOF + + for my $size (@{$test->[2]}) { + $fragment .= <$text +
    +$text

    +EOF + } + + print $out qq{\n\n$fragment#} if not defined $index; + + open my $html, '>', "testoutput/$path.html"; + binmode $html, ':utf8'; + print $html < + +Font test $path + +$fragment +EOF + print $html qq{

    }, (join '   ', map "$_", sort @glyph_names), qq{

    }; + print $html qq{
    }, dump_sizes("testoutput/$path.ttf"), qq{
    }; + } + print $out "
    \n" if not defined $index; + } +} + +sub dump_sizes { + my ($fn) = @_; + my $font = Font::TTF::Font->open($fn) or die "Failed to open $fn: $!"; + + my $s = 0; + my $out = ''; + for (sort keys %$font) { + next if /^ /; + my $l = $font->{$_}{' LENGTH'}; + $s += $l; + $out .= "$_: $l\n"; + } + $out .= "Total: $s\n"; + return $out; +} diff --git a/font-optimizer/list-features.pl b/font-optimizer/list-features.pl new file mode 100755 index 0000000..3264a48 --- /dev/null +++ b/font-optimizer/list-features.pl @@ -0,0 +1,52 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +use lib 'ext/Font-TTF/lib'; +use Font::TTF::Font; + +use Getopt::Long; + +main(); + +sub help { + print <open($input_file) or die "Error opening $input_file: $!"; + + my %feats; + my @feats; + for my $table (grep defined, $font->{GPOS}, $font->{GSUB}) { + $table->read; + for my $feature (@{$table->{FEATURES}{FEAT_TAGS}}) { + $feature =~ /^(\w{4})( _\d+)?$/ or die "Unrecognised feature tag syntax '$feature'"; + my $tag = $1; + next if $feats{$tag}++; + push @feats, $tag; + } + } + print map "$_\n", @feats; + + $font->release; +} diff --git a/font-optimizer/modify-names.pl b/font-optimizer/modify-names.pl new file mode 100755 index 0000000..3198bee --- /dev/null +++ b/font-optimizer/modify-names.pl @@ -0,0 +1,209 @@ +#!/usr/bin/perl -CA + # use the -CA flag so @ARGV is interpreted as UTF-8 + +use strict; +use warnings; + +binmode STDOUT, ':utf8'; + +use lib 'ext/Font-TTF/lib'; +use Font::TTF::Font; + +my @name_strings = qw( + copyright + family + subfamily + unique-identifier + full-name + version + postscript + trademark + manufacturer + designer + description + vendor-url + designer-url + license + license-url + RESERVED + preferred-family + preferred-subfamily + compatible-full + sample-text + postscript-cid + wws-family + wws-subfamily +); +my %name_strings; +$name_strings{$name_strings[$_]} = $_ for 0..$#name_strings; + +main(); + +sub help { + print <{name}{strings}[$id]; + my $exists = 0; + for my $plat (0..$#$str) { + next unless $str->[$plat]; + for my $enc (0..$#{$str->[$plat]}) { + next unless $str->[$plat][$enc]; + for my $lang (keys %{$str->[$plat][$enc]}) { + next unless exists $str->[$plat][$enc]{$lang}; + my $val = $sub->($str->[$plat][$enc]{$lang}, $plat, $enc, $lang); + $str->[$plat][$enc]{$lang} = $val; + $exists = 1 + } + } + } + if (not $exists) { + warn "Can't find existing name string '$name_strings[$id]' ($id)\n"; + } +} + + +sub json_string { + my ($str) = @_; + $str =~ s/([\\"])/\\$1/g; + $str =~ s/\r/\\r/g; + $str =~ s/\n/\\n/g; + $str =~ s/\t/\\t/g; + $str =~ s/([\x00-\x1f])/sprintf '\u%04X', ord $1/eg; + return qq{"$str"}; +} + +sub print_names { + my ($font) = @_; + my @lines; + for my $nid (0..$#name_strings) { + my $name = $font->{name}->find_name($nid); + if (length $name) { + push @lines, json_string($name_strings[$nid]).': '.json_string($name); + } + } + + print "{\n"; + print join ",\n\n", @lines; + print "\n}\n"; +} + +sub parse_id { + my ($name) = @_; + if ($name =~ /^\d+$/ and $name < @name_strings) { + return int $name; + } + my $id = $name_strings{lc $name}; + return $id if defined $id; + warn "Invalid name string identifier '$name'\n\n"; + help(); +} + +sub main { + my $verbose = 0; + my $print = 0; + my @commands; + + my @args = @ARGV; + my @rest; + while (@args) { + $_ = shift @args; + if ($_ eq '-v' or $_ eq '--verbose') { + $verbose = 1; + } elsif ($_ eq '-p' or $_ eq '--print') { + $print = 1; + push @commands, [ 'print' ]; + } elsif ($_ eq '--set') { + @args >= 2 or help(); + my $id = parse_id(shift @args); + my $val = shift @args; + push @commands, [ 'set', $id, $val ]; + } elsif ($_ eq '--append') { + @args >= 2 or help(); + my $id = parse_id(shift @args); + my $val = shift @args; + push @commands, [ 'append', $id, $val ]; + } elsif ($_ eq '--subst') { + @args >= 3 or help(); + my $id = parse_id(shift @args); + my $val1 = shift @args; + my $val2 = shift @args; + push @commands, [ 'subst', $id, $val1, $val2 ]; + } else { + push @rest, $_; + } + } + + ($print and (@rest == 1 or @rest == 2)) or @rest == 2 or help(); + + my ($input_file, $output_file) = @rest; + + my $font = Font::TTF::Font->open($input_file) or die "Error opening $input_file: $!"; + + $font->{name}->read; + + for my $cmd (@commands) { + if ($cmd->[0] eq 'print') { + print_names($font); + } elsif ($cmd->[0] eq 'set') { + my $id = $cmd->[1]; + modify_name($font, $id, sub { + my ($val, $plat, $enc, $lang) = @_; + print "Setting string $id (platform=$plat encoding=$enc lang=$lang)\n" if $verbose; + return $cmd->[2]; + }); + } elsif ($cmd->[0] eq 'append') { + my $id = $cmd->[1]; + modify_name($font, $id, sub { + my ($val, $plat, $enc, $lang) = @_; + print "Appending to string $id (platform=$plat encoding=$enc lang=$lang)\n" if $verbose; + return $val . $cmd->[2]; + }); + } elsif ($cmd->[0] eq 'subst') { + my $id = $cmd->[1]; + modify_name($font, $id, sub { + my ($val, $plat, $enc, $lang) = @_; + my $pat = quotemeta($cmd->[2]); + my $n = ($val =~ s/$pat/$cmd->[3]/g) || 0; + print "Substituting string $id (platform=$plat encoding=$enc lang=$lang) - $n match(es)\n" if $verbose; + warn "No match found for substitution on string '$name_strings[$id]'\n" if not $n; + return $val; + }); + } else { + die; + } + } + + $font->out($output_file) if $output_file; + + $font->release; +} diff --git a/font-optimizer/obfuscate-font.pl b/font-optimizer/obfuscate-font.pl new file mode 100755 index 0000000..0850426 --- /dev/null +++ b/font-optimizer/obfuscate-font.pl @@ -0,0 +1,114 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +use lib 'ext/Font-TTF/lib'; +use Font::TTF::Font; + +use Getopt::Long; + +main(); + +sub help { + print <{name}{strings}[$id]; + for my $plat (0..$#$str) { + next unless $str->[$plat]; + for my $enc (0..$#{$str->[$plat]}) { + next unless $str->[$plat][$enc]; + for my $lang (keys %{$str->[$plat][$enc]}) { + next unless exists $str->[$plat][$enc]{$lang}; + if ($verbose) { + print "Setting string $_ (plat $plat, enc $enc) to \"$val\"\n"; + } + $str->[$plat][$enc]{$lang} = $val; + } + } + } +} + +sub strip_names { + my ($font, $verbose) = @_; + + print "Stripping names\n" if $verbose; + + $font->{name}->read; + + for (16, 17, 18) { + if ($verbose and $font->{name}{strings}[$_]) { + print "Deleting string $_\n"; + } + $font->{name}{strings}[$_] = undef; + } + + for (1, 3, 5) { + set_name($font, $_, '', $verbose); + } + + for (4, 6) { + set_name($font, $_, '-', $verbose); + } +} + +sub strip_post { + my ($font, $verbose) = @_; + + print "Stripping post table\n" if $verbose; + + # Replace it with the minimum necessary to work in browsers + # (particularly Opera is a bit fussy) + my $data = pack NNnnNNNNN => 0x10000, 0, 0, 0, 0, 0, 0, 0, 0; + $font->{post} = new Font::TTF::Table(dat => $data); +} + +sub main { + my $verbose = 0; + my $all; + my $names; + my $post; + + my $result = GetOptions( + 'verbose' => \$verbose, + 'all' => \$all, + 'names' => \$names, + 'post' => \$post, + ) or help(); + + @ARGV == 2 or help(); + + if (not ($all or $names or $post)) { help(); } + + my ($input_file, $output_file) = @ARGV; + + my $font = Font::TTF::Font->open($input_file) or die "Error opening $input_file: $!"; + + strip_names($font, $verbose) if $all or $names; + strip_post($font, $verbose) if $all or $post; + + $font->out($output_file); + + $font->release; +} diff --git a/font-optimizer/subset.pl b/font-optimizer/subset.pl new file mode 100755 index 0000000..fb2eb95 --- /dev/null +++ b/font-optimizer/subset.pl @@ -0,0 +1,131 @@ +#!/usr/bin/perl -CA + # use the -CA flag so @ARGV is interpreted as UTF-8 + +use strict; +use warnings; + +use lib 'ext/Font-TTF/lib'; +use Font::Subsetter; + +use Getopt::Long; + +main(); + +sub help { + print < \$chars, + 'charsfile=s' => \$charsfile, + 'verbose' => \$verbose, + 'include=s' => \$include, + 'exclude=s' => \$exclude, + 'apply=s' => \$apply, + 'licensesubst=s' => \$license_desc_subst, + ) or help(); + + if (defined $chars and defined $charsfile) { + print "ERROR: Only one of '--chars' and --charsfile' can be specified\n\n"; + help(); + } elsif (defined $chars) { + # just use $chars + } elsif (defined $charsfile) { + open my $f, '<', $charsfile or die "Failed to open $charsfile: $!"; + binmode $f, ':utf8'; + local $/; + $chars = <$f>; + } else { + $chars = 'test'; + } + + @ARGV == 2 or help(); + + my ($input_file, $output_file) = @ARGV; + + + if ($verbose) { + dump_sizes($input_file); + print "Generating subsetted font...\n\n"; + } + + my $features; + if ($include) { + $features = { DEFAULT => 0 }; + $features->{$_} = 1 for split /,/, $include; + } elsif ($exclude) { + $features = { DEFAULT => 1 }; + $features->{$_} = 0 for split /,/, $exclude; + } + + my $fold_features; + if ($apply) { + $fold_features = [ split /,/, $apply ]; + } + + my $subsetter = new Font::Subsetter(); + $subsetter->subset($input_file, $chars, { + features => $features, + fold_features => $fold_features, + license_desc_subst => $license_desc_subst, + }); + $subsetter->write($output_file); + + if ($verbose) { + print "\n"; + print "Features:\n "; + print join ' ', $subsetter->feature_status(); + print "\n\n"; + print "Included glyphs:\n "; + print join ' ', $subsetter->glyph_names(); + print "\n\n"; + dump_sizes($output_file); + } + + $subsetter->release(); +} + +sub dump_sizes { + my ($filename) = @_; + my $font = Font::TTF::Font->open($filename) or die "Failed to open $filename: $!"; + print "TTF table sizes:\n"; + my $s = 0; + for (sort keys %$font) { + next if /^ /; + my $l = $font->{$_}{' LENGTH'}; + $s += $l; + print " $_: $l\n"; + } + print "Total size: $s bytes\n\n"; + $font->release(); +} diff --git a/font-optimizer/t/subsetter.pl b/font-optimizer/t/subsetter.pl new file mode 100644 index 0000000..5cb15df --- /dev/null +++ b/font-optimizer/t/subsetter.pl @@ -0,0 +1,47 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +use Test::More qw(no_plan); + +use lib 'ext/Font-TTF/lib'; +use Font::Subsetter; +use Unicode::Normalize; + +# Test that we include characters needed for strings converted to NFC +for my $str ( + "i", + "\xec", + "i\x{0300}", + "\x{0300}i", + "\x{03b9}\x{0308}\x{0301}", # iota, combining diaeresis, combining acute + "s\x{0323}\x{0307}", # s, combining dot below, combining dot above + "s\x{0307}\x{0323}", # s, combining dot above, combining dot below + "\x{1e61}\x{0323}", # s with dot above, combining dot below + "\x{1e63}\x{0307}", # s with dot below, combining dot above + "\x{212b}", # angstrom +) { + my $subsetter = new Font::Subsetter; + my %chars = $subsetter->expand_wanted_chars($str); + for (map ord, split //, $str) { + ok($chars{$_}, "char ".(sprintf '%04x', $_)." in string '".(join ' ', map { sprintf '%04x', $_ } unpack 'U*', $str)."'"); + } + for (map ord, split //, Unicode::Normalize::NFC($str)) { + ok($chars{$_}, "NFC char ".(sprintf '%04x', $_)." in string '".(join ' ', map { sprintf '%04x', $_ } unpack 'U*', $str)."'"); + } +} + +# Test that spurious characters aren't included +for my $str ( + "a\xec", +) { + my $subsetter = new Font::Subsetter; + my %chars = $subsetter->expand_wanted_chars($str); + my %exp; + $exp{$_} = 1 for map ord, split //, $str; + $exp{$_} = 1 for map ord, split //, Unicode::Normalize::NFC($str); + for (sort keys %chars) { + ok($exp{$_}, "expected char ".(sprintf '%04x', $_)." from string '".(join ' ', map { sprintf '%04x', $_ } unpack 'U*', $str)."'"); + } +} diff --git a/librarian/epub.py b/librarian/epub.py index 84a745f..2584029 100644 --- a/librarian/epub.py +++ b/librarian/epub.py @@ -7,9 +7,12 @@ from __future__ import with_statement import os import os.path +import subprocess from copy import deepcopy from lxml import etree import zipfile +from tempfile import mkdtemp +from shutil import rmtree import sys sys.path.append('..') # for running from working copy @@ -206,6 +209,15 @@ class TOC(object): return counter +def used_chars(element): + """ Lists characters used in an ETree Element """ + print (element.text or '') + (element.tail or '') + chars = set((element.text or '') + (element.tail or '')) + for child in element: + chars = chars.union(used_chars(child)) + return chars + + def chop(main_text): """ divide main content of the XML file into chunks """ @@ -231,7 +243,7 @@ def chop(main_text): def transform_chunk(chunk_xml, chunk_no, annotations): - """ transforms one chunk, returns a HTML string and a TOC object """ + """ transforms one chunk, returns a HTML string, a TOC object and a set of used characters """ toc = TOC() for element in chunk_xml[0]: @@ -242,8 +254,10 @@ def transform_chunk(chunk_xml, chunk_no, annotations): element.set('sub', str(subnumber)) find_annotations(annotations, chunk_xml, chunk_no) replace_by_verse(chunk_xml) - output_html = etree.tostring(xslt(chunk_xml, res('xsltScheme.xsl')), pretty_print=True) - return output_html, toc + html_tree = xslt(chunk_xml, res('xsltScheme.xsl')) + chars = used_chars(html_tree.getroot()) + output_html = etree.tostring(html_tree, pretty_print=True) + return output_html, toc, chars def transform(provider, slug, output_file=None, output_dir=None): @@ -262,14 +276,19 @@ def transform(provider, slug, output_file=None, output_dir=None): # every input file will have a TOC entry, # pointing to starting chunk toc = TOC(node_name(input_xml.find('.//'+DCNS('title'))), chunk_counter) + chars = set() if first: # write book title page + html_tree = xslt(input_xml, res('xsltTitle.xsl')) + chars = used_chars(html_tree.getroot()) zip.writestr('OPS/title.html', - etree.tostring(xslt(input_xml, res('xsltTitle.xsl')), pretty_print=True)) + etree.tostring(html_tree, pretty_print=True)) elif children: # write title page for every parent + html_tree = xslt(input_xml, res('xsltChunkTitle.xsl')) + chars = used_chars(html_tree.getroot()) zip.writestr('OPS/part%d.html' % chunk_counter, - etree.tostring(xslt(input_xml, res('xsltChunkTitle.xsl')), pretty_print=True)) + etree.tostring(html_tree, pretty_print=True)) add_to_manifest(manifest, chunk_counter) add_to_spine(spine, chunk_counter) chunk_counter += 1 @@ -287,8 +306,9 @@ def transform(provider, slug, output_file=None, output_dir=None): replace_characters(main_text) for chunk_xml in chop(main_text): - chunk_html, chunk_toc = transform_chunk(chunk_xml, chunk_counter, annotations) + chunk_html, chunk_toc, chunk_chars = transform_chunk(chunk_xml, chunk_counter, annotations) toc.extend(chunk_toc) + chars = chars.union(chunk_chars) zip.writestr('OPS/part%d.html' % chunk_counter, chunk_html) add_to_manifest(manifest, chunk_counter) add_to_spine(spine, chunk_counter) @@ -297,10 +317,11 @@ def transform(provider, slug, output_file=None, output_dir=None): if children: for child in children: child_xml = etree.parse(provider.by_uri(child)) - child_toc, chunk_counter = transform_file(child_xml, chunk_counter, first=False) + child_toc, chunk_counter, chunk_chars = transform_file(child_xml, chunk_counter, first=False) toc.append(child_toc) + chars = chars.union(chunk_chars) - return toc, chunk_counter + return toc, chunk_counter, chars # read metadata from the first file input_xml = etree.parse(provider[slug]) @@ -352,7 +373,8 @@ def transform(provider, slug, output_file=None, output_dir=None): '') nav_map = toc_file[-1] - toc, chunk_counter = transform_file(input_xml) + toc, chunk_counter, chars = transform_file(input_xml) + if not toc.children: toc.add(u"Początek utworu", 1) toc_counter = toc.write_to_xml(nav_map, 2) @@ -367,8 +389,21 @@ def transform(provider, slug, output_file=None, output_dir=None): spine.append(etree.fromstring( '')) replace_by_verse(annotations) + html_tree = xslt(annotations, res("xsltAnnotations.xsl")) + chars = chars.union(used_chars(html_tree.getroot())) zip.writestr('OPS/annotations.html', etree.tostring( - xslt(annotations, res("xsltAnnotations.xsl")), pretty_print=True)) + html_tree, pretty_print=True)) + + # strip fonts + tmpdir = mkdtemp('-librarian-epub') + cwd = os.getcwd() + + os.chdir(os.path.join(os.path.dirname(os.path.realpath(__file__)), '../font-optimizer')) + for fname in 'DejaVuSerif.ttf', 'DejaVuSerif-Bold.ttf', 'DejaVuSerif-Italic.ttf', 'DejaVuSerif-BoldItalic.ttf': + subprocess.check_call(['./subset.pl', '--chars', ''.join(chars), res('../fonts/' + fname), os.path.join(tmpdir, fname)]) + zip.write(os.path.join(tmpdir, fname), os.path.join('OPS', fname)) + rmtree(tmpdir) + os.chdir(cwd) zip.writestr('OPS/content.opf', etree.tostring(opf, pretty_print=True)) contents = [] diff --git a/librarian/epub/style.css b/librarian/epub/style.css index f64978e..d05a686 100644 --- a/librarian/epub/style.css +++ b/librarian/epub/style.css @@ -1,7 +1,33 @@ +@font-face { + font-family: "DejaVu Serif"; + font-weight: normal; + font-style: normal; + src: url(DejaVuSerif.ttf); +} +@font-face { + font-family: "DejaVu Serif"; + font-weight: bold; + font-style: normal; + src: url(DejaVuSerif-Bold.ttf); +} +@font-face { + font-family: "DejaVu Serif"; + font-weight: normal; + font-style: italic; + src: url(DejaVuSerif-Italic.ttf); +} +@font-face { + font-family: "DejaVu Serif"; + font-weight: bold; + font-style: italic; + src: url(DejaVuSerif-BoldItalic.ttf); +} + + body { font-size: 12pt; - font: Georgia, "Times New Roman" , serif; + font-family: "DejaVu Serif", serif; line-height: 1.5em; margin: 0; } diff --git a/librarian/fonts/DejaVuSerif-Bold.ttf b/librarian/fonts/DejaVuSerif-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..03e1f13c41b38ed72f7af7f6430745c2c4a699a9 GIT binary patch literal 307596 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%0DtI;+rV2`Xz3GQI-+AhjCA*)kXM%O;Y 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 literal 0 HcmV?d00001 diff --git a/librarian/fonts/DejaVuSerif-BoldItalic.ttf b/librarian/fonts/DejaVuSerif-BoldItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1a3535082e188394b665cf8f872622a7ebefa675 GIT binary patch literal 295360 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

    ?`ZO&+>wVEM#fN_WlNQ2G3K%OkR? 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 z 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źWwCtyzK@09VKf;RgFDR@)xrr=G%n}Ro`uTyZR;7-Av z-oa&ld+>Ykd+>Ykd+>Ykd+>Ykd+>Ykd+>Ykd+>Ykd+>YkGx!<&41NYbgP+^ECv=ow z9)eaz20eqGLC>IP&@<>6^bC3dy?|aoFQ6CD3%xJ&zJOcO!rF{6bTF^qeRzB=4^JIm z-x%WJ^LtzCc1^^L;1_q^dpz{Qehg1kEBuOD;aAiOzoJ(76}7^zs1<%ibKqCh8o#1Z z@GBYxzoJp_D;fpAqEYZG8U??iQSdeRHTX67HTX67HTX67b+`1=5gK0FJCdkJH7%)W zNli;?T2j-JnwEH4;%SKo*@Nss_VnD-b5GAbcpf|to(Io^=fP{hYrt#hc|*?|@Eh=( z@d;yTyQFjP3+iA)0~#98(13;pG&G>00SygkXh5I=fd&K`5CCj>z2)_m*IOFc(!lo4 z`x&5?0cvSqOZ!^d*V4Y0_O-OHrF|{!8-qUve+>Q@{4w}r@Wd*s+7$9@7Xvh0y%kIZ^x)+4JP`Si%AM?O9B>5)s1?0MwQ zBX=IT^T?e??tErFW!6(>Jt24=!SgxK+lB6L&MvIIFh9u4?9sqY&5EBNjPH?Wv|1a4 zq(Mj;grr%C%U5=Gt_~MpANiElY=fLM$Vr2oG{{MVoHWQugPb(TNrRj;$Vr2oG{{L) ztB*~sW2UKf%ruBdgNQVUNP~zph)9EoG>Axph&0|W8EFqce|WD`C`*H~G$>1hvNR}5 zgR(RzOM|jBC`*H~G$>1hvNR}5gR(RzOM|jBC`*H~G>s;@X&3~Ar9oI4grz}P8ib`m zSQ><-L0Fm~f@*>mbb}By5P1W!HV|tAkv0%%15q{*Wdl(*5M|TlYJX>YXK(q^rd{;D zXFpt+WeaOt*X`Qu*~9sDyZUouYh!bLDPP~)v@Ol>^oeXgSQuV^%Bl*(qowDsZO*ot zN?tkg=7s04ZCuuyPH)=Ve*mi*utt-O{q^dJb=&r9)f*#%H~PH2b*X z?E>?4+iG9CaB2P6vj@kXJ2>{)P22DeEjaeVrhD7w}e&?gZlhyF~(FJ>Zb$QmQ z>e9y6{`zsgYxJ(Y;ASt{wW!vm*_TyUhc0amUD6m#rpLAqj=jBkd`JCqyH|GR><0(e z*6V5rZr}O_zPoPyx@iAfb1J)d_44}C>}&5d>(t+9<`Unj+2X|^Sr|S%JXACKmARpr z^@&&1Rf$LgIW~P58FoE4eD2O`tbg_u4f~3QeMQ5*qG4aru&-z!*oJ*Y1JO1RZG+Qq zaQY2SzrpD@IQ<5v-{AC{LVIxhO@WjOq*x^6O_7i{MMB;b30YHg`~^IISW!O%9zWpm z10Fv>%>il-P;O1Ed@v z{bFwOzv95BuS;~X%~0plDn&H>{bFwOzv95BiOqZ}~G0izr+ z$^oMsFvLXq2kJ}#LmZ~?9mY6dj046v!2N-`QlPFBFv@|tQh@&h z{2$=|0RIR0KfwP1{txhffd2#hA28Yhqa85X0izu-+5w{-Fxmm59jGh?DocUNQlPRF zs4N94O98zJ=uJRx0(ukBn}FT~^d_J;0lf+6O$&dw@OKM;xA1ohf4A^=3qQB;a|=JW z;^%rr>(%0*M-~S@wm9&y#et734jU1R10Pr%_{ieGM-~S@vN)_Kivu579QerMz(*Db zKC(Ehk9tMx*CO~@zm|iq^=mo!TECWquZ^AM;A=fw4!$;cmV>Vip5@?cz1J&R?-uF5 z*1P5OUv<}dMeErj?bUj=oc3xxTTXkmo-L=nTF;i#Uae=#X|L9^<+NAp*>c*e^<1xL zJzJ!`TF;i#Uae=#nJ=wp%b72&XUmx{t!K-bFRf?GnJ=y9dPVEmBK_BTww(TJJzGxy zwVo}f|60$M(|`FV%jv)TQ{BrKSyX#_`JKAg`nITk_3|Z_YrJ~-4a+rNz5GDk%MVyo ze|q_Vx|a{IsB!G&11#4#_VNLigC`$gIqi}Uuw3KV%LiDlaqOl4meU^Tf89&}ErKik zw;WvQzvbXc|1Aes`foY7(tpdrmHt~!f2IF*Fa5Wu`Rk?smTUfc>A&Tgzh3%px#q8z z{#&m3>!tseYyNuad)-UlEz%$9d)=!bXOVtrUs?AmoYlQ_)gt{+LCSLaA)T#zc&mrE zdU&gcw|aQ1hqrootB1FGc&mrEdU&gcw|aQ1hqrootB1FGc&mrEdU&gcw|aQ1hqroo ztB1FG_^OAmdibh`uX^~Zhp&40s)vty_^8);pt_eHTVz~SpsKU>8x}R+nd2&JzhTd7 zezNu(mTSFb?Kdpf_hpX1to?>Puldf}Z&A@Ue#H8Wl`%rORp>kUwUOZ z_#D?+`we?u>n%&qEC*kDW;ysA|C!@IYrj!v?Kdoful_WA zTh@NVa;?)0zhrnN!z&qH$?!^sS2Dbk;gt-pWOyaRD;ZwN@JfbPvi28shF>!LlHr#O zzhw9&!!H?r$?!{tUo!lX;g<}*WcVe+FByKx@JohIGJKNZlMJ6^_$0$889vGINrq1{ ze3Idl44-7}C+e*IghlZ{)_$VSIx%69^$q`I_$TYcgT2oB(f-16){jm+SkC&A&_*meYUjpDgG2(f-MD`VY@%cs;}G8D7uudWP3Cyq@9Z3@>MRIm62t zUe54xhL41>@9?kA!`E5+Ba85b z&cj>Ide(la&iKQOKg{^KjGxQ+xtzPX&uL-2GX%{(?knTIGVUwmzB2AB&P*8`0 zIuz8QpbiCfD5yh09SZ7DP=|s#6x5-h4h3~6s6#;=3hGc$hk`m3)S;jb1$8K>K|u`) zYEV#vf*KUmpuqkG_Aju1f&B~YUts?N`xn^1!2SjHFR*`s{R`}0VE=-|bF00^1i@zQFDUb}z7df!z!2UT~KM zcUg4Wxh^{GY*Fk}VE+R97udhR{ss0guz!L53+!KD{{s6L*uTL31@|bF2 z0{a)(zrg+l_AffkTo;{YwkWnOI?Zgk*tX!73v6Ft`vTh+*uKE_1-37+eSz%@Y+qpe z0^1kZzQFbcwlA=Kf$a-yUts$J+ZWir!1e{UFSz=Gt1qyBf&B~YUts?N`xn^1;OYym zzToN$uD;;v3$DK4>I<&EpdJPFD5yt4JqqekP>+Io6x5@j9tG7Xs766G3aU|1je=?v zRHL981y^5i^@S=#p$bu`LKLbH1=n9tn}XUD)TW>|1+^)tO+jr6YEw{~g4z_S8HH*_ zp_);sW)!Lyh3Z8?oeJtys9qGR7lo=tp=wd6S`?}lg{noNYEh_K6jZLDas`zuR4ocs zi$c|+P_-yjEechOLe-*BwJ20A3RQ|im7<`N1$`{&V?iIw9et!aQK(K7suM+Lcj}_E zJ9gpLaCw5o!G&5Jj$4bvuG->o+*%xV)fNYrWN~n576+cPIJh*6gG;hFxHOA{Yp^)D zG>e04usFChzakyASTDT3dHKNZK4w>$%`AaE1!O&59&UnV7iZba7q*t)II#1wv+KZj z?Y2C;m#_29NxLH4PL|s>$s2aZz1@@hZ|xjO^=^rwU8P1NC5D#MNQt54d}~wBUEAEA zUD~{7*C}j+DG9V|+-RpH&~k>RiSrw8U$nED)@I>K?Cc#3f<(=(j^i7&rLmlEkf>SC z;7ZIaXHX?(mf!h4+AC4BtL>OfiJIknuSCkO!ejC!QkL_6iIn9`zQo6J#!KR3IpZbq zu^fDfk6qozqLSEHPCq3!meU@Ijpg)HVq-aY5*y3G(^kWB@FYHV6(M*MAIn+95+BRK zm-tu?zQo6J@FhN$gD>&19DIq7U9HIYNpvh{{3JS-Gk$C1Q9jt+(IOCI+og>(R?KX< z8dr1V)f`b)$Q(Xrg+@iy8GJ3rXHlJ~S=2R)x|VbDHH)m4bFy5Gs>9@j9V&LmtldlV zc90AY_5>l*<7=57i$G}0Yq`d$ZrA4RD>i0-?&!+W{uTQrfFAEHzHaxO;_=d+9jV(S zd_P@b{nf0$n)O$+{%Y1=EtBMHnIwy}M<&T~+QT}nS*JDYv}T>wtkarxTC+}T)@d!1 z$Yay)~s7DjrTR{wr1VdtlK(<`Sso1 zowv3&Uf(}HJUY0(FvQ`Wl6vvd&Rg4hbipQ3j}ES18m>I|wS106hD<)ka)wMk$8s(8 zT0X~eE%jPH$8x4jKF8PcITp3#Yxx|@88Z1C%cU3fTDL?8E^S}f+t50Y*|9fCG-{b0 z%f)ZC%#P(80vtNE%#N=)gld@`%XPfhlW@{5vEJRZI~(q9?AvWT1t;%gZ(}UveJp1z zEaZJGXDsA>EN3j_eS9tNW0A3t_pzL@P{q@7#zG#*a%pER4`eyRAP;0Y!ypf2 zIm0k58cWla*~-w0u;k$S@-W8sa9AIA-!)qzcazyF(Rk=gkGE1cIpZR)WY04$@=BI7 zE;`d=IpZSFWI5v^&*ZJNsqd9%vYhFWXR;i|lV`FVe0e6z!Ix*U9DI2u%fXjtvK)M! z>G8GB^jKtGHhXwt@8F`b==%OJWL)s>xv<@$hR)bq zuh;F;x_$lb=H6Ailb`0(c!U=N{Sk&xzKVI0{xomedo&Csbo`*ZTOPh9cVl!ZNi@}}k%KB};(wo^fkD2nA zDX&U^eLbyGCBX8@@jbiy@7DURK8HE-=#@vWymso=9IYmgsqvT^ubsNR-Y#yuaj^NO z-Fk8R;>OTpYu|y9&Hl+*_h-rMpN;)_8+N@Q*Q#{zim zKfT8aaGA5^T5}#NV3#>B%zi?(wQ+sxU{7C}#wYdEwS%qw&Ffq5@HDdsLvz8ieIv68 zLvz8iJ+IZr1<&5Y&>n{NFfD>rn~!Hr*{tYYs;PM{qqUe8W{b^^ zo~`}scOPEh-Kn)=6vYWOrY$Z|&RfXfAD3!@tKbT~(YNJ1vH>Rh7bW zF;k0rx2Si^+GtVlmbKBcHd@rXWo@*n%-emuw`}*c^Y+}6-kh`eq-Alm$ajl;x5#(P zvS?MN@GZ-tT}yLM*0BxE5Zc-1ZT9uMMh6;Qq`PGnTBN&0x?7WOyHWW1<%8>bKhoXe zhFjcli)OcIc8g}WrrE>icfm8w9&&t7i)OcIc8g}WXm*Qcw`g{2nmv4e>vgpU&2G`` z7R_$a>~@;wbnxzMJ3Ne)EFe zZQ5AN9vy{5m0MJ~MU`7rxkZ&*RJlc!TU5D4m0MJ~MU~s!E*M#E3sk*Bm|KLoMVMQJ zxkZ>;gt;gt;gt@N5hcrsL1Htg=)$1iQJU%OLT7_+|_kJI9{gT0yb&Wysz zBaiQt6vk|E#%yuMY;neHaXM6>V?B4Q=Z@9TF{K?-+A&2PQ`9j<9aGdXMIBSrF-09y z)G++M`(MVwqy^dde!;^QL@E#lB34lUx)A`UI$&>{{k;?N=vE#lB34lPn&iMaO& zZ$}JT#GpkCTEw753|hpXMGRWRw?|4V5#Jv1?Gb+#@n;c#7V&41(n_SX67gpde-`m) z5q}o(XAyrEsi{P2Dv_E>q^1(_XAyrE@n;c#7V&2he-^2!L~1G#J&WjB#Ggg{S)`^C zsi{P2Dv_E>#HdATDv@16#HmG`TEwYEoLa=GMVwm1sYRVCqD3rP#G*wkTEwD7ELueWBl;iF z|A_ua^gp8i5&e(oe?LjM!`pV0q={wMT5q5lc}Pw0O_ z{}cM3(Eo(~C-gs|{|Wt1=zl{06Z)Uf|AhW0^gp5h3H?v#e?tEg`k&DMg#IV=KcW8# z{ZHtBLjM!`pV0q={wMT5q5lc}Pw0O_{}cM3(Eo(~C-gs|{|Wt1=zl{06Z)Uf|AhW0 z^gp5h3H?v#e?tEg`k&DMg#IV=KcW8#{ZHtBLjM!`pV0q={wMT5q5lc}Pw0O_{}cM3 z(Eo(~C-gs|{|Wt1=zl{06Z)Uf|AhW0^gp5h3H?v#e?tEg`k&DMg#IV=KcW8#{ZHtB zLjM!`pV0q={wMT5q5lc}Pw0O_{}cM3(Eo(~C-gs|{|Wt1=zl{06Z)Uf|AhW0^gp5h z3H?v#e?tEg`k&DMg#IV=KcW8#{ZHtBf~VFvPS-e2*EmksSf>+sVggT0;E4%5F@Yy0 z@Wce3n7|Vgcwz!iOyG$LJTU=(0{#U22|O`@CnoU31fH0{6BBr10#8ifi3vP0fhQ*L z!~~w0GQU&ibIN>9na?TnIb}Yl%;%K(oHCzN=5xw?PMOas^EqWcr_AG&d7LtjQ|52V z{7sp+Df2dE-loi3&wTXE2fu=_y9;RF)H5GF^U*UOJ@dh@CG7p$xAe?M&wTXEN6&op z%tz0B^vp-keDusm&wTLf3%kpKDlGg8!*ZQ-=$Vh6`RJLC9^UTZZGNp`pHsb)Uu)Q1 z6Lc!LhqrrpyN9=Xc)N$UxjNkLo}m3z=6zh%ZO^NnS^T_4jltsZyv3n1XmM!&+E~10 zao9Im9QG*|dB1qda=pLP`d{lb-WG>_s>NZSVsY4~SseB$7Ki>?9QG+|oyOau@H&mR z<->ei6n>}iwp{J)G@h38{nA0p`F`o(S|`75k@v~3+hu{nI9nWWEe_*nalo}W;94B| zZE?W0IP}}%;Lj`$>&)WNZ;L~}Ee?1Vhkjce+GTO*w_T11zWQxB`0BUi;H%%3gRgaF zIrv&Wxu^fDji{;>JTtp$6%k}zL{@L<) z;^I5IliAfZvj@YSciDRQ0`^*OG9vb>)=uwNIAqe4R))~6DAWpGp-~75t-@HLQxIM!yiRzX@H*jj!s~=**U`_~8HE>x7ljvv7ljvv z7ljvv7ljvv7ljvv7ljvv7ljvvmxPyumxPyumxPyumxPyumxPyumxPxFJUiHDUFqrp z&kl8E177C`yv`4JogeTzKj3wK!0Y^g*ZBdj^8;Sz2fWS?c%2{cIxjpgJTE*iJTJUP zcy>wGtVxaV8sRm5^xXZVTASV4t$KNO z@6hUr*&TTnrg!hAT1{uSN?kG@Sh1VpoWHofw^0ooG2h#bHikQ^E|6Xe-pLp3d40wCO}&=-JFm@h`=!#~$fuJ#uP?p6Wq%%T zTmK$c*d%T(AANE22ePf>cB9bqb~|9aZ}&qMb=7TkY7>HeE{|Mj-}FSp%){=WN9x7>d`bpPSdeebWHsJ?f@ z{nZoh->pPzAm z_NQm6KRf6C^o;wH-&(Hzq;r34;g277|GabmY|;JEcTQJ-ITesb}ZjQeBjYq0)zUIEUI{Jov+czF@U;mBM)z{CtuYdQizqk6= zqu)5~etpUP`s(PPoOQPr-9NtN{?W4ghd<d71Ki3L~ka#g&`{Zf^eUDlNJOKv)Ou$ta-lLy_}>d9*D zhFcxaSF0!8>dnzle)`esCvUr-u<#SFxlbF!ryq4c{;3D6AHUaq>XY|YpL)=JGA&e} zyw{}#7rRqcyx}_gba%>iH%H@nH(njJ;lZlC<-%k0Rd~=f^JlB(mh+D;SN_n|C*8`@ zVzqM4{n$qyt$wU?=O13E&YyFSf8uoY_$~Jd`^+a!yHBi+9-DU`|LBS8<7eHY%kI(D z(T{%YboHaR+{f&>kDYcOTOED$gnPuk;*s0#BlkUAedJO1BNl$-(EYG|;Sb+(4}bVX z_3(mw_~z)tC)|fuM<23RKlE|8`j_WUKVF^tq&xetd+3JyTOV*|y!#>V9<-MqJaiv? z;L+-XSKR}aJ@Baefc-6>51e!NKj`kWLB8){cdvc+-W%?;b?Nlu?j9SRdk)E-$`eG3h&Y{eC7R*{r~yj`~Kf)_SyIS EUso{4S^xk5 literal 0 HcmV?d00001 diff --git a/librarian/fonts/DejaVuSerif-Italic.ttf b/librarian/fonts/DejaVuSerif-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e26c4ac066c255e3ce55e19960c56c885187576b GIT binary patch literal 303004 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%0AA8@+ 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

    5{rO7 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%0AwGM|MS_|xAL5C&Hf!l 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