fonttools 4.60.2__cp311-cp311-win32.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (353) hide show
  1. fontTools/__init__.py +8 -0
  2. fontTools/__main__.py +35 -0
  3. fontTools/afmLib.py +439 -0
  4. fontTools/agl.py +5233 -0
  5. fontTools/annotations.py +30 -0
  6. fontTools/cffLib/CFF2ToCFF.py +258 -0
  7. fontTools/cffLib/CFFToCFF2.py +305 -0
  8. fontTools/cffLib/__init__.py +3694 -0
  9. fontTools/cffLib/specializer.py +927 -0
  10. fontTools/cffLib/transforms.py +495 -0
  11. fontTools/cffLib/width.py +210 -0
  12. fontTools/colorLib/__init__.py +0 -0
  13. fontTools/colorLib/builder.py +664 -0
  14. fontTools/colorLib/errors.py +2 -0
  15. fontTools/colorLib/geometry.py +143 -0
  16. fontTools/colorLib/table_builder.py +223 -0
  17. fontTools/colorLib/unbuilder.py +81 -0
  18. fontTools/config/__init__.py +90 -0
  19. fontTools/cu2qu/__init__.py +15 -0
  20. fontTools/cu2qu/__main__.py +6 -0
  21. fontTools/cu2qu/benchmark.py +54 -0
  22. fontTools/cu2qu/cli.py +198 -0
  23. fontTools/cu2qu/cu2qu.c +15817 -0
  24. fontTools/cu2qu/cu2qu.cp311-win32.pyd +0 -0
  25. fontTools/cu2qu/cu2qu.py +563 -0
  26. fontTools/cu2qu/errors.py +77 -0
  27. fontTools/cu2qu/ufo.py +363 -0
  28. fontTools/designspaceLib/__init__.py +3343 -0
  29. fontTools/designspaceLib/__main__.py +6 -0
  30. fontTools/designspaceLib/split.py +475 -0
  31. fontTools/designspaceLib/statNames.py +260 -0
  32. fontTools/designspaceLib/types.py +147 -0
  33. fontTools/encodings/MacRoman.py +258 -0
  34. fontTools/encodings/StandardEncoding.py +258 -0
  35. fontTools/encodings/__init__.py +1 -0
  36. fontTools/encodings/codecs.py +135 -0
  37. fontTools/feaLib/__init__.py +4 -0
  38. fontTools/feaLib/__main__.py +78 -0
  39. fontTools/feaLib/ast.py +2143 -0
  40. fontTools/feaLib/builder.py +1814 -0
  41. fontTools/feaLib/error.py +22 -0
  42. fontTools/feaLib/lexer.c +17029 -0
  43. fontTools/feaLib/lexer.cp311-win32.pyd +0 -0
  44. fontTools/feaLib/lexer.py +287 -0
  45. fontTools/feaLib/location.py +12 -0
  46. fontTools/feaLib/lookupDebugInfo.py +12 -0
  47. fontTools/feaLib/parser.py +2394 -0
  48. fontTools/feaLib/variableScalar.py +118 -0
  49. fontTools/fontBuilder.py +1014 -0
  50. fontTools/help.py +36 -0
  51. fontTools/merge/__init__.py +248 -0
  52. fontTools/merge/__main__.py +6 -0
  53. fontTools/merge/base.py +81 -0
  54. fontTools/merge/cmap.py +173 -0
  55. fontTools/merge/layout.py +526 -0
  56. fontTools/merge/options.py +85 -0
  57. fontTools/merge/tables.py +352 -0
  58. fontTools/merge/unicode.py +78 -0
  59. fontTools/merge/util.py +143 -0
  60. fontTools/misc/__init__.py +1 -0
  61. fontTools/misc/arrayTools.py +424 -0
  62. fontTools/misc/bezierTools.c +39731 -0
  63. fontTools/misc/bezierTools.cp311-win32.pyd +0 -0
  64. fontTools/misc/bezierTools.py +1500 -0
  65. fontTools/misc/classifyTools.py +170 -0
  66. fontTools/misc/cliTools.py +53 -0
  67. fontTools/misc/configTools.py +349 -0
  68. fontTools/misc/cython.py +27 -0
  69. fontTools/misc/dictTools.py +83 -0
  70. fontTools/misc/eexec.py +119 -0
  71. fontTools/misc/encodingTools.py +72 -0
  72. fontTools/misc/enumTools.py +23 -0
  73. fontTools/misc/etree.py +456 -0
  74. fontTools/misc/filenames.py +245 -0
  75. fontTools/misc/filesystem/__init__.py +68 -0
  76. fontTools/misc/filesystem/_base.py +134 -0
  77. fontTools/misc/filesystem/_copy.py +45 -0
  78. fontTools/misc/filesystem/_errors.py +54 -0
  79. fontTools/misc/filesystem/_info.py +75 -0
  80. fontTools/misc/filesystem/_osfs.py +164 -0
  81. fontTools/misc/filesystem/_path.py +67 -0
  82. fontTools/misc/filesystem/_subfs.py +92 -0
  83. fontTools/misc/filesystem/_tempfs.py +34 -0
  84. fontTools/misc/filesystem/_tools.py +34 -0
  85. fontTools/misc/filesystem/_walk.py +55 -0
  86. fontTools/misc/filesystem/_zipfs.py +204 -0
  87. fontTools/misc/fixedTools.py +253 -0
  88. fontTools/misc/intTools.py +25 -0
  89. fontTools/misc/iterTools.py +12 -0
  90. fontTools/misc/lazyTools.py +42 -0
  91. fontTools/misc/loggingTools.py +543 -0
  92. fontTools/misc/macCreatorType.py +56 -0
  93. fontTools/misc/macRes.py +261 -0
  94. fontTools/misc/plistlib/__init__.py +681 -0
  95. fontTools/misc/plistlib/py.typed +0 -0
  96. fontTools/misc/psCharStrings.py +1511 -0
  97. fontTools/misc/psLib.py +398 -0
  98. fontTools/misc/psOperators.py +572 -0
  99. fontTools/misc/py23.py +96 -0
  100. fontTools/misc/roundTools.py +110 -0
  101. fontTools/misc/sstruct.py +227 -0
  102. fontTools/misc/symfont.py +242 -0
  103. fontTools/misc/testTools.py +233 -0
  104. fontTools/misc/textTools.py +156 -0
  105. fontTools/misc/timeTools.py +88 -0
  106. fontTools/misc/transform.py +516 -0
  107. fontTools/misc/treeTools.py +45 -0
  108. fontTools/misc/vector.py +147 -0
  109. fontTools/misc/visitor.py +158 -0
  110. fontTools/misc/xmlReader.py +188 -0
  111. fontTools/misc/xmlWriter.py +231 -0
  112. fontTools/mtiLib/__init__.py +1400 -0
  113. fontTools/mtiLib/__main__.py +5 -0
  114. fontTools/otlLib/__init__.py +1 -0
  115. fontTools/otlLib/builder.py +3465 -0
  116. fontTools/otlLib/error.py +11 -0
  117. fontTools/otlLib/maxContextCalc.py +96 -0
  118. fontTools/otlLib/optimize/__init__.py +53 -0
  119. fontTools/otlLib/optimize/__main__.py +6 -0
  120. fontTools/otlLib/optimize/gpos.py +439 -0
  121. fontTools/pens/__init__.py +1 -0
  122. fontTools/pens/areaPen.py +52 -0
  123. fontTools/pens/basePen.py +475 -0
  124. fontTools/pens/boundsPen.py +98 -0
  125. fontTools/pens/cairoPen.py +26 -0
  126. fontTools/pens/cocoaPen.py +26 -0
  127. fontTools/pens/cu2quPen.py +325 -0
  128. fontTools/pens/explicitClosingLinePen.py +101 -0
  129. fontTools/pens/filterPen.py +433 -0
  130. fontTools/pens/freetypePen.py +462 -0
  131. fontTools/pens/hashPointPen.py +89 -0
  132. fontTools/pens/momentsPen.c +13378 -0
  133. fontTools/pens/momentsPen.cp311-win32.pyd +0 -0
  134. fontTools/pens/momentsPen.py +879 -0
  135. fontTools/pens/perimeterPen.py +69 -0
  136. fontTools/pens/pointInsidePen.py +192 -0
  137. fontTools/pens/pointPen.py +643 -0
  138. fontTools/pens/qtPen.py +29 -0
  139. fontTools/pens/qu2cuPen.py +105 -0
  140. fontTools/pens/quartzPen.py +43 -0
  141. fontTools/pens/recordingPen.py +335 -0
  142. fontTools/pens/reportLabPen.py +79 -0
  143. fontTools/pens/reverseContourPen.py +96 -0
  144. fontTools/pens/roundingPen.py +130 -0
  145. fontTools/pens/statisticsPen.py +312 -0
  146. fontTools/pens/svgPathPen.py +310 -0
  147. fontTools/pens/t2CharStringPen.py +88 -0
  148. fontTools/pens/teePen.py +55 -0
  149. fontTools/pens/transformPen.py +115 -0
  150. fontTools/pens/ttGlyphPen.py +335 -0
  151. fontTools/pens/wxPen.py +29 -0
  152. fontTools/qu2cu/__init__.py +15 -0
  153. fontTools/qu2cu/__main__.py +7 -0
  154. fontTools/qu2cu/benchmark.py +56 -0
  155. fontTools/qu2cu/cli.py +125 -0
  156. fontTools/qu2cu/qu2cu.c +16682 -0
  157. fontTools/qu2cu/qu2cu.cp311-win32.pyd +0 -0
  158. fontTools/qu2cu/qu2cu.py +405 -0
  159. fontTools/subset/__init__.py +4096 -0
  160. fontTools/subset/__main__.py +6 -0
  161. fontTools/subset/cff.py +184 -0
  162. fontTools/subset/svg.py +253 -0
  163. fontTools/subset/util.py +25 -0
  164. fontTools/svgLib/__init__.py +3 -0
  165. fontTools/svgLib/path/__init__.py +65 -0
  166. fontTools/svgLib/path/arc.py +154 -0
  167. fontTools/svgLib/path/parser.py +322 -0
  168. fontTools/svgLib/path/shapes.py +183 -0
  169. fontTools/t1Lib/__init__.py +648 -0
  170. fontTools/tfmLib.py +460 -0
  171. fontTools/ttLib/__init__.py +30 -0
  172. fontTools/ttLib/__main__.py +148 -0
  173. fontTools/ttLib/macUtils.py +54 -0
  174. fontTools/ttLib/removeOverlaps.py +395 -0
  175. fontTools/ttLib/reorderGlyphs.py +285 -0
  176. fontTools/ttLib/scaleUpem.py +436 -0
  177. fontTools/ttLib/sfnt.py +661 -0
  178. fontTools/ttLib/standardGlyphOrder.py +271 -0
  179. fontTools/ttLib/tables/B_A_S_E_.py +14 -0
  180. fontTools/ttLib/tables/BitmapGlyphMetrics.py +64 -0
  181. fontTools/ttLib/tables/C_B_D_T_.py +113 -0
  182. fontTools/ttLib/tables/C_B_L_C_.py +19 -0
  183. fontTools/ttLib/tables/C_F_F_.py +61 -0
  184. fontTools/ttLib/tables/C_F_F__2.py +26 -0
  185. fontTools/ttLib/tables/C_O_L_R_.py +165 -0
  186. fontTools/ttLib/tables/C_P_A_L_.py +305 -0
  187. fontTools/ttLib/tables/D_S_I_G_.py +158 -0
  188. fontTools/ttLib/tables/D__e_b_g.py +35 -0
  189. fontTools/ttLib/tables/DefaultTable.py +49 -0
  190. fontTools/ttLib/tables/E_B_D_T_.py +835 -0
  191. fontTools/ttLib/tables/E_B_L_C_.py +718 -0
  192. fontTools/ttLib/tables/F_F_T_M_.py +52 -0
  193. fontTools/ttLib/tables/F__e_a_t.py +149 -0
  194. fontTools/ttLib/tables/G_D_E_F_.py +13 -0
  195. fontTools/ttLib/tables/G_M_A_P_.py +148 -0
  196. fontTools/ttLib/tables/G_P_K_G_.py +133 -0
  197. fontTools/ttLib/tables/G_P_O_S_.py +14 -0
  198. fontTools/ttLib/tables/G_S_U_B_.py +13 -0
  199. fontTools/ttLib/tables/G_V_A_R_.py +5 -0
  200. fontTools/ttLib/tables/G__l_a_t.py +235 -0
  201. fontTools/ttLib/tables/G__l_o_c.py +85 -0
  202. fontTools/ttLib/tables/H_V_A_R_.py +13 -0
  203. fontTools/ttLib/tables/J_S_T_F_.py +13 -0
  204. fontTools/ttLib/tables/L_T_S_H_.py +58 -0
  205. fontTools/ttLib/tables/M_A_T_H_.py +13 -0
  206. fontTools/ttLib/tables/M_E_T_A_.py +352 -0
  207. fontTools/ttLib/tables/M_V_A_R_.py +13 -0
  208. fontTools/ttLib/tables/O_S_2f_2.py +752 -0
  209. fontTools/ttLib/tables/S_I_N_G_.py +99 -0
  210. fontTools/ttLib/tables/S_T_A_T_.py +15 -0
  211. fontTools/ttLib/tables/S_V_G_.py +223 -0
  212. fontTools/ttLib/tables/S__i_l_f.py +1040 -0
  213. fontTools/ttLib/tables/S__i_l_l.py +92 -0
  214. fontTools/ttLib/tables/T_S_I_B_.py +13 -0
  215. fontTools/ttLib/tables/T_S_I_C_.py +14 -0
  216. fontTools/ttLib/tables/T_S_I_D_.py +13 -0
  217. fontTools/ttLib/tables/T_S_I_J_.py +13 -0
  218. fontTools/ttLib/tables/T_S_I_P_.py +13 -0
  219. fontTools/ttLib/tables/T_S_I_S_.py +13 -0
  220. fontTools/ttLib/tables/T_S_I_V_.py +26 -0
  221. fontTools/ttLib/tables/T_S_I__0.py +70 -0
  222. fontTools/ttLib/tables/T_S_I__1.py +163 -0
  223. fontTools/ttLib/tables/T_S_I__2.py +17 -0
  224. fontTools/ttLib/tables/T_S_I__3.py +22 -0
  225. fontTools/ttLib/tables/T_S_I__5.py +60 -0
  226. fontTools/ttLib/tables/T_T_F_A_.py +14 -0
  227. fontTools/ttLib/tables/TupleVariation.py +884 -0
  228. fontTools/ttLib/tables/V_A_R_C_.py +12 -0
  229. fontTools/ttLib/tables/V_D_M_X_.py +249 -0
  230. fontTools/ttLib/tables/V_O_R_G_.py +165 -0
  231. fontTools/ttLib/tables/V_V_A_R_.py +13 -0
  232. fontTools/ttLib/tables/__init__.py +98 -0
  233. fontTools/ttLib/tables/_a_n_k_r.py +15 -0
  234. fontTools/ttLib/tables/_a_v_a_r.py +193 -0
  235. fontTools/ttLib/tables/_b_s_l_n.py +15 -0
  236. fontTools/ttLib/tables/_c_i_d_g.py +24 -0
  237. fontTools/ttLib/tables/_c_m_a_p.py +1591 -0
  238. fontTools/ttLib/tables/_c_v_a_r.py +94 -0
  239. fontTools/ttLib/tables/_c_v_t.py +56 -0
  240. fontTools/ttLib/tables/_f_e_a_t.py +15 -0
  241. fontTools/ttLib/tables/_f_p_g_m.py +62 -0
  242. fontTools/ttLib/tables/_f_v_a_r.py +261 -0
  243. fontTools/ttLib/tables/_g_a_s_p.py +63 -0
  244. fontTools/ttLib/tables/_g_c_i_d.py +13 -0
  245. fontTools/ttLib/tables/_g_l_y_f.py +2311 -0
  246. fontTools/ttLib/tables/_g_v_a_r.py +340 -0
  247. fontTools/ttLib/tables/_h_d_m_x.py +127 -0
  248. fontTools/ttLib/tables/_h_e_a_d.py +130 -0
  249. fontTools/ttLib/tables/_h_h_e_a.py +147 -0
  250. fontTools/ttLib/tables/_h_m_t_x.py +164 -0
  251. fontTools/ttLib/tables/_k_e_r_n.py +289 -0
  252. fontTools/ttLib/tables/_l_c_a_r.py +13 -0
  253. fontTools/ttLib/tables/_l_o_c_a.py +70 -0
  254. fontTools/ttLib/tables/_l_t_a_g.py +72 -0
  255. fontTools/ttLib/tables/_m_a_x_p.py +147 -0
  256. fontTools/ttLib/tables/_m_e_t_a.py +112 -0
  257. fontTools/ttLib/tables/_m_o_r_t.py +14 -0
  258. fontTools/ttLib/tables/_m_o_r_x.py +15 -0
  259. fontTools/ttLib/tables/_n_a_m_e.py +1242 -0
  260. fontTools/ttLib/tables/_o_p_b_d.py +14 -0
  261. fontTools/ttLib/tables/_p_o_s_t.py +319 -0
  262. fontTools/ttLib/tables/_p_r_e_p.py +16 -0
  263. fontTools/ttLib/tables/_p_r_o_p.py +12 -0
  264. fontTools/ttLib/tables/_s_b_i_x.py +129 -0
  265. fontTools/ttLib/tables/_t_r_a_k.py +332 -0
  266. fontTools/ttLib/tables/_v_h_e_a.py +139 -0
  267. fontTools/ttLib/tables/_v_m_t_x.py +19 -0
  268. fontTools/ttLib/tables/asciiTable.py +20 -0
  269. fontTools/ttLib/tables/grUtils.py +92 -0
  270. fontTools/ttLib/tables/otBase.py +1458 -0
  271. fontTools/ttLib/tables/otConverters.py +2068 -0
  272. fontTools/ttLib/tables/otData.py +6400 -0
  273. fontTools/ttLib/tables/otTables.py +2703 -0
  274. fontTools/ttLib/tables/otTraverse.py +163 -0
  275. fontTools/ttLib/tables/sbixGlyph.py +149 -0
  276. fontTools/ttLib/tables/sbixStrike.py +177 -0
  277. fontTools/ttLib/tables/table_API_readme.txt +91 -0
  278. fontTools/ttLib/tables/ttProgram.py +594 -0
  279. fontTools/ttLib/ttCollection.py +125 -0
  280. fontTools/ttLib/ttFont.py +1148 -0
  281. fontTools/ttLib/ttGlyphSet.py +490 -0
  282. fontTools/ttLib/ttVisitor.py +32 -0
  283. fontTools/ttLib/woff2.py +1680 -0
  284. fontTools/ttx.py +479 -0
  285. fontTools/ufoLib/__init__.py +2575 -0
  286. fontTools/ufoLib/converters.py +407 -0
  287. fontTools/ufoLib/errors.py +30 -0
  288. fontTools/ufoLib/etree.py +6 -0
  289. fontTools/ufoLib/filenames.py +356 -0
  290. fontTools/ufoLib/glifLib.py +2120 -0
  291. fontTools/ufoLib/kerning.py +141 -0
  292. fontTools/ufoLib/plistlib.py +47 -0
  293. fontTools/ufoLib/pointPen.py +6 -0
  294. fontTools/ufoLib/utils.py +107 -0
  295. fontTools/ufoLib/validators.py +1208 -0
  296. fontTools/unicode.py +50 -0
  297. fontTools/unicodedata/Blocks.py +817 -0
  298. fontTools/unicodedata/Mirrored.py +446 -0
  299. fontTools/unicodedata/OTTags.py +50 -0
  300. fontTools/unicodedata/ScriptExtensions.py +832 -0
  301. fontTools/unicodedata/Scripts.py +3639 -0
  302. fontTools/unicodedata/__init__.py +306 -0
  303. fontTools/varLib/__init__.py +1600 -0
  304. fontTools/varLib/__main__.py +6 -0
  305. fontTools/varLib/avar/__init__.py +0 -0
  306. fontTools/varLib/avar/__main__.py +72 -0
  307. fontTools/varLib/avar/build.py +79 -0
  308. fontTools/varLib/avar/map.py +108 -0
  309. fontTools/varLib/avar/plan.py +1004 -0
  310. fontTools/varLib/avar/unbuild.py +271 -0
  311. fontTools/varLib/avarPlanner.py +8 -0
  312. fontTools/varLib/builder.py +215 -0
  313. fontTools/varLib/cff.py +631 -0
  314. fontTools/varLib/errors.py +219 -0
  315. fontTools/varLib/featureVars.py +703 -0
  316. fontTools/varLib/hvar.py +113 -0
  317. fontTools/varLib/instancer/__init__.py +2052 -0
  318. fontTools/varLib/instancer/__main__.py +5 -0
  319. fontTools/varLib/instancer/featureVars.py +190 -0
  320. fontTools/varLib/instancer/names.py +388 -0
  321. fontTools/varLib/instancer/solver.py +309 -0
  322. fontTools/varLib/interpolatable.py +1209 -0
  323. fontTools/varLib/interpolatableHelpers.py +399 -0
  324. fontTools/varLib/interpolatablePlot.py +1269 -0
  325. fontTools/varLib/interpolatableTestContourOrder.py +82 -0
  326. fontTools/varLib/interpolatableTestStartingPoint.py +107 -0
  327. fontTools/varLib/interpolate_layout.py +124 -0
  328. fontTools/varLib/iup.c +19815 -0
  329. fontTools/varLib/iup.cp311-win32.pyd +0 -0
  330. fontTools/varLib/iup.py +490 -0
  331. fontTools/varLib/merger.py +1717 -0
  332. fontTools/varLib/models.py +642 -0
  333. fontTools/varLib/multiVarStore.py +253 -0
  334. fontTools/varLib/mutator.py +529 -0
  335. fontTools/varLib/mvar.py +40 -0
  336. fontTools/varLib/plot.py +238 -0
  337. fontTools/varLib/stat.py +149 -0
  338. fontTools/varLib/varStore.py +739 -0
  339. fontTools/voltLib/__init__.py +5 -0
  340. fontTools/voltLib/__main__.py +206 -0
  341. fontTools/voltLib/ast.py +452 -0
  342. fontTools/voltLib/error.py +12 -0
  343. fontTools/voltLib/lexer.py +99 -0
  344. fontTools/voltLib/parser.py +664 -0
  345. fontTools/voltLib/voltToFea.py +911 -0
  346. fonttools-4.60.2.data/data/share/man/man1/ttx.1 +225 -0
  347. fonttools-4.60.2.dist-info/METADATA +2250 -0
  348. fonttools-4.60.2.dist-info/RECORD +353 -0
  349. fonttools-4.60.2.dist-info/WHEEL +5 -0
  350. fonttools-4.60.2.dist-info/entry_points.txt +5 -0
  351. fonttools-4.60.2.dist-info/licenses/LICENSE +21 -0
  352. fonttools-4.60.2.dist-info/licenses/LICENSE.external +388 -0
  353. fonttools-4.60.2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,72 @@
1
+ from fontTools.misc.textTools import bytesjoin, tobytes, safeEval
2
+ from . import DefaultTable
3
+ import struct
4
+
5
+ # https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6ltag.html
6
+
7
+
8
+ class table__l_t_a_g(DefaultTable.DefaultTable):
9
+ """Language Tag table
10
+
11
+ The AAT ``ltag`` table contains mappings between the numeric codes used
12
+ in the language field of the ``name`` table and IETF language tags.
13
+
14
+ See also https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6ltag.html
15
+ """
16
+
17
+ def __init__(self, tag=None):
18
+ DefaultTable.DefaultTable.__init__(self, tag)
19
+ self.version, self.flags = 1, 0
20
+ self.tags = []
21
+
22
+ def addTag(self, tag):
23
+ """Add 'tag' to the list of langauge tags if not already there.
24
+
25
+ Returns the integer index of 'tag' in the list of all tags.
26
+ """
27
+ try:
28
+ return self.tags.index(tag)
29
+ except ValueError:
30
+ self.tags.append(tag)
31
+ return len(self.tags) - 1
32
+
33
+ def decompile(self, data, ttFont):
34
+ self.version, self.flags, numTags = struct.unpack(">LLL", data[:12])
35
+ assert self.version == 1
36
+ self.tags = []
37
+ for i in range(numTags):
38
+ pos = 12 + i * 4
39
+ offset, length = struct.unpack(">HH", data[pos : pos + 4])
40
+ tag = data[offset : offset + length].decode("ascii")
41
+ self.tags.append(tag)
42
+
43
+ def compile(self, ttFont):
44
+ dataList = [struct.pack(">LLL", self.version, self.flags, len(self.tags))]
45
+ stringPool = ""
46
+ for tag in self.tags:
47
+ offset = stringPool.find(tag)
48
+ if offset < 0:
49
+ offset = len(stringPool)
50
+ stringPool = stringPool + tag
51
+ offset = offset + 12 + len(self.tags) * 4
52
+ dataList.append(struct.pack(">HH", offset, len(tag)))
53
+ dataList.append(tobytes(stringPool))
54
+ return bytesjoin(dataList)
55
+
56
+ def toXML(self, writer, ttFont):
57
+ writer.simpletag("version", value=self.version)
58
+ writer.newline()
59
+ writer.simpletag("flags", value=self.flags)
60
+ writer.newline()
61
+ for tag in self.tags:
62
+ writer.simpletag("LanguageTag", tag=tag)
63
+ writer.newline()
64
+
65
+ def fromXML(self, name, attrs, content, ttFont):
66
+ if not hasattr(self, "tags"):
67
+ self.tags = []
68
+ if name == "LanguageTag":
69
+ self.tags.append(attrs["tag"])
70
+ elif "value" in attrs:
71
+ value = safeEval(attrs["value"])
72
+ setattr(self, name, value)
@@ -0,0 +1,147 @@
1
+ from fontTools.misc import sstruct
2
+ from fontTools.misc.textTools import safeEval
3
+ from . import DefaultTable
4
+
5
+ maxpFormat_0_5 = """
6
+ > # big endian
7
+ tableVersion: i
8
+ numGlyphs: H
9
+ """
10
+
11
+ maxpFormat_1_0_add = """
12
+ > # big endian
13
+ maxPoints: H
14
+ maxContours: H
15
+ maxCompositePoints: H
16
+ maxCompositeContours: H
17
+ maxZones: H
18
+ maxTwilightPoints: H
19
+ maxStorage: H
20
+ maxFunctionDefs: H
21
+ maxInstructionDefs: H
22
+ maxStackElements: H
23
+ maxSizeOfInstructions: H
24
+ maxComponentElements: H
25
+ maxComponentDepth: H
26
+ """
27
+
28
+
29
+ class table__m_a_x_p(DefaultTable.DefaultTable):
30
+ """Maximum Profile table
31
+
32
+ The ``maxp`` table contains the memory requirements for the data in
33
+ the font.
34
+
35
+ See also https://learn.microsoft.com/en-us/typography/opentype/spec/maxp
36
+ """
37
+
38
+ dependencies = ["glyf"]
39
+
40
+ def decompile(self, data, ttFont):
41
+ dummy, data = sstruct.unpack2(maxpFormat_0_5, data, self)
42
+ self.numGlyphs = int(self.numGlyphs)
43
+ if self.tableVersion != 0x00005000:
44
+ dummy, data = sstruct.unpack2(maxpFormat_1_0_add, data, self)
45
+ assert len(data) == 0
46
+
47
+ def compile(self, ttFont):
48
+ if "glyf" in ttFont:
49
+ if ttFont.isLoaded("glyf") and ttFont.recalcBBoxes:
50
+ self.recalc(ttFont)
51
+ else:
52
+ pass # CFF
53
+ self.numGlyphs = len(ttFont.getGlyphOrder())
54
+ if self.tableVersion != 0x00005000:
55
+ self.tableVersion = 0x00010000
56
+ data = sstruct.pack(maxpFormat_0_5, self)
57
+ if self.tableVersion == 0x00010000:
58
+ data = data + sstruct.pack(maxpFormat_1_0_add, self)
59
+ return data
60
+
61
+ def recalc(self, ttFont):
62
+ """Recalculate the font bounding box, and most other maxp values except
63
+ for the TT instructions values. Also recalculate the value of bit 1
64
+ of the flags field and the font bounding box of the 'head' table.
65
+ """
66
+ glyfTable = ttFont["glyf"]
67
+ hmtxTable = ttFont["hmtx"]
68
+ headTable = ttFont["head"]
69
+ self.numGlyphs = len(glyfTable)
70
+ INFINITY = 100000
71
+ xMin = +INFINITY
72
+ yMin = +INFINITY
73
+ xMax = -INFINITY
74
+ yMax = -INFINITY
75
+ maxPoints = 0
76
+ maxContours = 0
77
+ maxCompositePoints = 0
78
+ maxCompositeContours = 0
79
+ maxComponentElements = 0
80
+ maxComponentDepth = 0
81
+ allXMinIsLsb = 1
82
+ for glyphName in ttFont.getGlyphOrder():
83
+ g = glyfTable[glyphName]
84
+ if g.numberOfContours:
85
+ if hmtxTable[glyphName][1] != g.xMin:
86
+ allXMinIsLsb = 0
87
+ xMin = min(xMin, g.xMin)
88
+ yMin = min(yMin, g.yMin)
89
+ xMax = max(xMax, g.xMax)
90
+ yMax = max(yMax, g.yMax)
91
+ if g.numberOfContours > 0:
92
+ nPoints, nContours = g.getMaxpValues()
93
+ maxPoints = max(maxPoints, nPoints)
94
+ maxContours = max(maxContours, nContours)
95
+ elif g.isComposite():
96
+ nPoints, nContours, componentDepth = g.getCompositeMaxpValues(
97
+ glyfTable
98
+ )
99
+ maxCompositePoints = max(maxCompositePoints, nPoints)
100
+ maxCompositeContours = max(maxCompositeContours, nContours)
101
+ maxComponentElements = max(maxComponentElements, len(g.components))
102
+ maxComponentDepth = max(maxComponentDepth, componentDepth)
103
+ if xMin == +INFINITY:
104
+ headTable.xMin = 0
105
+ headTable.yMin = 0
106
+ headTable.xMax = 0
107
+ headTable.yMax = 0
108
+ else:
109
+ headTable.xMin = xMin
110
+ headTable.yMin = yMin
111
+ headTable.xMax = xMax
112
+ headTable.yMax = yMax
113
+ self.maxPoints = maxPoints
114
+ self.maxContours = maxContours
115
+ self.maxCompositePoints = maxCompositePoints
116
+ self.maxCompositeContours = maxCompositeContours
117
+ self.maxComponentElements = maxComponentElements
118
+ self.maxComponentDepth = maxComponentDepth
119
+ if allXMinIsLsb:
120
+ headTable.flags = headTable.flags | 0x2
121
+ else:
122
+ headTable.flags = headTable.flags & ~0x2
123
+
124
+ def testrepr(self):
125
+ items = sorted(self.__dict__.items())
126
+ print(". . . . . . . . .")
127
+ for combo in items:
128
+ print(" %s: %s" % combo)
129
+ print(". . . . . . . . .")
130
+
131
+ def toXML(self, writer, ttFont):
132
+ if self.tableVersion != 0x00005000:
133
+ writer.comment("Most of this table will be recalculated by the compiler")
134
+ writer.newline()
135
+ formatstring, names, fixes = sstruct.getformat(maxpFormat_0_5)
136
+ if self.tableVersion != 0x00005000:
137
+ formatstring, names_1_0, fixes = sstruct.getformat(maxpFormat_1_0_add)
138
+ names = {**names, **names_1_0}
139
+ for name in names:
140
+ value = getattr(self, name)
141
+ if name == "tableVersion":
142
+ value = hex(value)
143
+ writer.simpletag(name, value=value)
144
+ writer.newline()
145
+
146
+ def fromXML(self, name, attrs, content, ttFont):
147
+ setattr(self, name, safeEval(attrs["value"]))
@@ -0,0 +1,112 @@
1
+ from fontTools.misc import sstruct
2
+ from fontTools.misc.textTools import bytesjoin, strjoin, readHex
3
+ from fontTools.ttLib import TTLibError
4
+ from . import DefaultTable
5
+
6
+ # Apple's documentation of 'meta':
7
+ # https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6meta.html
8
+
9
+ META_HEADER_FORMAT = """
10
+ > # big endian
11
+ version: L
12
+ flags: L
13
+ dataOffset: L
14
+ numDataMaps: L
15
+ """
16
+
17
+
18
+ DATA_MAP_FORMAT = """
19
+ > # big endian
20
+ tag: 4s
21
+ dataOffset: L
22
+ dataLength: L
23
+ """
24
+
25
+
26
+ class table__m_e_t_a(DefaultTable.DefaultTable):
27
+ """Metadata table
28
+
29
+ The ``meta`` table contains various metadata values for the font. Each
30
+ category of metadata in the table is identified by a four-character tag.
31
+
32
+ See also https://learn.microsoft.com/en-us/typography/opentype/spec/meta
33
+ """
34
+
35
+ def __init__(self, tag=None):
36
+ DefaultTable.DefaultTable.__init__(self, tag)
37
+ self.data = {}
38
+
39
+ def decompile(self, data, ttFont):
40
+ headerSize = sstruct.calcsize(META_HEADER_FORMAT)
41
+ header = sstruct.unpack(META_HEADER_FORMAT, data[0:headerSize])
42
+ if header["version"] != 1:
43
+ raise TTLibError("unsupported 'meta' version %d" % header["version"])
44
+ dataMapSize = sstruct.calcsize(DATA_MAP_FORMAT)
45
+ for i in range(header["numDataMaps"]):
46
+ dataMapOffset = headerSize + i * dataMapSize
47
+ dataMap = sstruct.unpack(
48
+ DATA_MAP_FORMAT, data[dataMapOffset : dataMapOffset + dataMapSize]
49
+ )
50
+ tag = dataMap["tag"]
51
+ offset = dataMap["dataOffset"]
52
+ self.data[tag] = data[offset : offset + dataMap["dataLength"]]
53
+ if tag in ["dlng", "slng"]:
54
+ self.data[tag] = self.data[tag].decode("utf-8")
55
+
56
+ def compile(self, ttFont):
57
+ keys = sorted(self.data.keys())
58
+ headerSize = sstruct.calcsize(META_HEADER_FORMAT)
59
+ dataOffset = headerSize + len(keys) * sstruct.calcsize(DATA_MAP_FORMAT)
60
+ header = sstruct.pack(
61
+ META_HEADER_FORMAT,
62
+ {
63
+ "version": 1,
64
+ "flags": 0,
65
+ "dataOffset": dataOffset,
66
+ "numDataMaps": len(keys),
67
+ },
68
+ )
69
+ dataMaps = []
70
+ dataBlocks = []
71
+ for tag in keys:
72
+ if tag in ["dlng", "slng"]:
73
+ data = self.data[tag].encode("utf-8")
74
+ else:
75
+ data = self.data[tag]
76
+ dataMaps.append(
77
+ sstruct.pack(
78
+ DATA_MAP_FORMAT,
79
+ {"tag": tag, "dataOffset": dataOffset, "dataLength": len(data)},
80
+ )
81
+ )
82
+ dataBlocks.append(data)
83
+ dataOffset += len(data)
84
+ return bytesjoin([header] + dataMaps + dataBlocks)
85
+
86
+ def toXML(self, writer, ttFont):
87
+ for tag in sorted(self.data.keys()):
88
+ if tag in ["dlng", "slng"]:
89
+ writer.begintag("text", tag=tag)
90
+ writer.newline()
91
+ writer.write(self.data[tag])
92
+ writer.newline()
93
+ writer.endtag("text")
94
+ writer.newline()
95
+ else:
96
+ writer.begintag("hexdata", tag=tag)
97
+ writer.newline()
98
+ data = self.data[tag]
99
+ if min(data) >= 0x20 and max(data) <= 0x7E:
100
+ writer.comment("ascii: " + data.decode("ascii"))
101
+ writer.newline()
102
+ writer.dumphex(data)
103
+ writer.endtag("hexdata")
104
+ writer.newline()
105
+
106
+ def fromXML(self, name, attrs, content, ttFont):
107
+ if name == "hexdata":
108
+ self.data[attrs["tag"]] = readHex(content)
109
+ elif name == "text" and attrs["tag"] in ["dlng", "slng"]:
110
+ self.data[attrs["tag"]] = strjoin(content).strip()
111
+ else:
112
+ raise TTLibError("can't handle '%s' element" % name)
@@ -0,0 +1,14 @@
1
+ from .otBase import BaseTTXConverter
2
+
3
+
4
+ # https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6mort.html
5
+ class table__m_o_r_t(BaseTTXConverter):
6
+ """The AAT ``mort`` table contains glyph transformations used for script shaping and
7
+ for various other optional smart features.
8
+
9
+ Note: ``mort`` has been deprecated in favor of the newer ``morx`` table.
10
+
11
+ See also https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6mort.html
12
+ """
13
+
14
+ pass
@@ -0,0 +1,15 @@
1
+ from .otBase import BaseTTXConverter
2
+
3
+
4
+ # https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6morx.html
5
+ class table__m_o_r_x(BaseTTXConverter):
6
+ """The AAT ``morx`` table contains glyph transformations used for script shaping and
7
+ for various other optional smart features, akin to ``GSUB`` and ``GPOS`` features
8
+ in OpenType Layout.
9
+
10
+ Note: ``morx`` is a replacement for the now deprecated ``mort`` table.
11
+
12
+ See also https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6morx.html
13
+ """
14
+
15
+ pass