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,352 @@
1
+ from fontTools.misc import sstruct
2
+ from fontTools.misc.textTools import byteord, safeEval
3
+ from . import DefaultTable
4
+ import pdb
5
+ import struct
6
+
7
+
8
+ METAHeaderFormat = """
9
+ > # big endian
10
+ tableVersionMajor: H
11
+ tableVersionMinor: H
12
+ metaEntriesVersionMajor: H
13
+ metaEntriesVersionMinor: H
14
+ unicodeVersion: L
15
+ metaFlags: H
16
+ nMetaRecs: H
17
+ """
18
+ # This record is followed by nMetaRecs of METAGlyphRecordFormat.
19
+ # This in turn is followd by as many METAStringRecordFormat entries
20
+ # as specified by the METAGlyphRecordFormat entries
21
+ # this is followed by the strings specifried in the METAStringRecordFormat
22
+ METAGlyphRecordFormat = """
23
+ > # big endian
24
+ glyphID: H
25
+ nMetaEntry: H
26
+ """
27
+ # This record is followd by a variable data length field:
28
+ # USHORT or ULONG hdrOffset
29
+ # Offset from start of META table to the beginning
30
+ # of this glyphs array of ns Metadata string entries.
31
+ # Size determined by metaFlags field
32
+ # METAGlyphRecordFormat entries must be sorted by glyph ID
33
+
34
+ METAStringRecordFormat = """
35
+ > # big endian
36
+ labelID: H
37
+ stringLen: H
38
+ """
39
+ # This record is followd by a variable data length field:
40
+ # USHORT or ULONG stringOffset
41
+ # METAStringRecordFormat entries must be sorted in order of labelID
42
+ # There may be more than one entry with the same labelID
43
+ # There may be more than one strign with the same content.
44
+
45
+ # Strings shall be Unicode UTF-8 encoded, and null-terminated.
46
+
47
+ METALabelDict = {
48
+ 0: "MojikumiX4051", # An integer in the range 1-20
49
+ 1: "UNIUnifiedBaseChars",
50
+ 2: "BaseFontName",
51
+ 3: "Language",
52
+ 4: "CreationDate",
53
+ 5: "FoundryName",
54
+ 6: "FoundryCopyright",
55
+ 7: "OwnerURI",
56
+ 8: "WritingScript",
57
+ 10: "StrokeCount",
58
+ 11: "IndexingRadical",
59
+ }
60
+
61
+
62
+ def getLabelString(labelID):
63
+ try:
64
+ label = METALabelDict[labelID]
65
+ except KeyError:
66
+ label = "Unknown label"
67
+ return str(label)
68
+
69
+
70
+ class table_M_E_T_A_(DefaultTable.DefaultTable):
71
+ """Glyphlets META table
72
+
73
+ The ``META`` table is used by Adobe's SING Glyphlets.
74
+
75
+ See also https://web.archive.org/web/20080627183635/http://www.adobe.com/devnet/opentype/gdk/topic.html
76
+ """
77
+
78
+ dependencies = []
79
+
80
+ def decompile(self, data, ttFont):
81
+ dummy, newData = sstruct.unpack2(METAHeaderFormat, data, self)
82
+ self.glyphRecords = []
83
+ for i in range(self.nMetaRecs):
84
+ glyphRecord, newData = sstruct.unpack2(
85
+ METAGlyphRecordFormat, newData, GlyphRecord()
86
+ )
87
+ if self.metaFlags == 0:
88
+ [glyphRecord.offset] = struct.unpack(">H", newData[:2])
89
+ newData = newData[2:]
90
+ elif self.metaFlags == 1:
91
+ [glyphRecord.offset] = struct.unpack(">H", newData[:4])
92
+ newData = newData[4:]
93
+ else:
94
+ assert 0, (
95
+ "The metaFlags field in the META table header has a value other than 0 or 1 :"
96
+ + str(self.metaFlags)
97
+ )
98
+ glyphRecord.stringRecs = []
99
+ newData = data[glyphRecord.offset :]
100
+ for j in range(glyphRecord.nMetaEntry):
101
+ stringRec, newData = sstruct.unpack2(
102
+ METAStringRecordFormat, newData, StringRecord()
103
+ )
104
+ if self.metaFlags == 0:
105
+ [stringRec.offset] = struct.unpack(">H", newData[:2])
106
+ newData = newData[2:]
107
+ else:
108
+ [stringRec.offset] = struct.unpack(">H", newData[:4])
109
+ newData = newData[4:]
110
+ stringRec.string = data[
111
+ stringRec.offset : stringRec.offset + stringRec.stringLen
112
+ ]
113
+ glyphRecord.stringRecs.append(stringRec)
114
+ self.glyphRecords.append(glyphRecord)
115
+
116
+ def compile(self, ttFont):
117
+ offsetOK = 0
118
+ self.nMetaRecs = len(self.glyphRecords)
119
+ count = 0
120
+ while offsetOK != 1:
121
+ count = count + 1
122
+ if count > 4:
123
+ pdb.set_trace()
124
+ metaData = sstruct.pack(METAHeaderFormat, self)
125
+ stringRecsOffset = len(metaData) + self.nMetaRecs * (
126
+ 6 + 2 * (self.metaFlags & 1)
127
+ )
128
+ stringRecSize = 6 + 2 * (self.metaFlags & 1)
129
+ for glyphRec in self.glyphRecords:
130
+ glyphRec.offset = stringRecsOffset
131
+ if (glyphRec.offset > 65535) and ((self.metaFlags & 1) == 0):
132
+ self.metaFlags = self.metaFlags + 1
133
+ offsetOK = -1
134
+ break
135
+ metaData = metaData + glyphRec.compile(self)
136
+ stringRecsOffset = stringRecsOffset + (
137
+ glyphRec.nMetaEntry * stringRecSize
138
+ )
139
+ # this will be the String Record offset for the next GlyphRecord.
140
+ if offsetOK == -1:
141
+ offsetOK = 0
142
+ continue
143
+
144
+ # metaData now contains the header and all of the GlyphRecords. Its length should bw
145
+ # the offset to the first StringRecord.
146
+ stringOffset = stringRecsOffset
147
+ for glyphRec in self.glyphRecords:
148
+ assert glyphRec.offset == len(
149
+ metaData
150
+ ), "Glyph record offset did not compile correctly! for rec:" + str(
151
+ glyphRec
152
+ )
153
+ for stringRec in glyphRec.stringRecs:
154
+ stringRec.offset = stringOffset
155
+ if (stringRec.offset > 65535) and ((self.metaFlags & 1) == 0):
156
+ self.metaFlags = self.metaFlags + 1
157
+ offsetOK = -1
158
+ break
159
+ metaData = metaData + stringRec.compile(self)
160
+ stringOffset = stringOffset + stringRec.stringLen
161
+ if offsetOK == -1:
162
+ offsetOK = 0
163
+ continue
164
+
165
+ if ((self.metaFlags & 1) == 1) and (stringOffset < 65536):
166
+ self.metaFlags = self.metaFlags - 1
167
+ continue
168
+ else:
169
+ offsetOK = 1
170
+
171
+ # metaData now contains the header and all of the GlyphRecords and all of the String Records.
172
+ # Its length should be the offset to the first string datum.
173
+ for glyphRec in self.glyphRecords:
174
+ for stringRec in glyphRec.stringRecs:
175
+ assert stringRec.offset == len(
176
+ metaData
177
+ ), "String offset did not compile correctly! for string:" + str(
178
+ stringRec.string
179
+ )
180
+ metaData = metaData + stringRec.string
181
+
182
+ return metaData
183
+
184
+ def toXML(self, writer, ttFont):
185
+ writer.comment(
186
+ "Lengths and number of entries in this table will be recalculated by the compiler"
187
+ )
188
+ writer.newline()
189
+ formatstring, names, fixes = sstruct.getformat(METAHeaderFormat)
190
+ for name in names:
191
+ value = getattr(self, name)
192
+ writer.simpletag(name, value=value)
193
+ writer.newline()
194
+ for glyphRec in self.glyphRecords:
195
+ glyphRec.toXML(writer, ttFont)
196
+
197
+ def fromXML(self, name, attrs, content, ttFont):
198
+ if name == "GlyphRecord":
199
+ if not hasattr(self, "glyphRecords"):
200
+ self.glyphRecords = []
201
+ glyphRec = GlyphRecord()
202
+ self.glyphRecords.append(glyphRec)
203
+ for element in content:
204
+ if isinstance(element, str):
205
+ continue
206
+ name, attrs, content = element
207
+ glyphRec.fromXML(name, attrs, content, ttFont)
208
+ glyphRec.offset = -1
209
+ glyphRec.nMetaEntry = len(glyphRec.stringRecs)
210
+ else:
211
+ setattr(self, name, safeEval(attrs["value"]))
212
+
213
+
214
+ class GlyphRecord(object):
215
+ def __init__(self):
216
+ self.glyphID = -1
217
+ self.nMetaEntry = -1
218
+ self.offset = -1
219
+ self.stringRecs = []
220
+
221
+ def toXML(self, writer, ttFont):
222
+ writer.begintag("GlyphRecord")
223
+ writer.newline()
224
+ writer.simpletag("glyphID", value=self.glyphID)
225
+ writer.newline()
226
+ writer.simpletag("nMetaEntry", value=self.nMetaEntry)
227
+ writer.newline()
228
+ for stringRec in self.stringRecs:
229
+ stringRec.toXML(writer, ttFont)
230
+ writer.endtag("GlyphRecord")
231
+ writer.newline()
232
+
233
+ def fromXML(self, name, attrs, content, ttFont):
234
+ if name == "StringRecord":
235
+ stringRec = StringRecord()
236
+ self.stringRecs.append(stringRec)
237
+ for element in content:
238
+ if isinstance(element, str):
239
+ continue
240
+ stringRec.fromXML(name, attrs, content, ttFont)
241
+ stringRec.stringLen = len(stringRec.string)
242
+ else:
243
+ setattr(self, name, safeEval(attrs["value"]))
244
+
245
+ def compile(self, parentTable):
246
+ data = sstruct.pack(METAGlyphRecordFormat, self)
247
+ if parentTable.metaFlags == 0:
248
+ datum = struct.pack(">H", self.offset)
249
+ elif parentTable.metaFlags == 1:
250
+ datum = struct.pack(">L", self.offset)
251
+ data = data + datum
252
+ return data
253
+
254
+ def __repr__(self):
255
+ return (
256
+ "GlyphRecord[ glyphID: "
257
+ + str(self.glyphID)
258
+ + ", nMetaEntry: "
259
+ + str(self.nMetaEntry)
260
+ + ", offset: "
261
+ + str(self.offset)
262
+ + " ]"
263
+ )
264
+
265
+
266
+ # XXX The following two functions are really broken around UTF-8 vs Unicode
267
+
268
+
269
+ def mapXMLToUTF8(string):
270
+ uString = str()
271
+ strLen = len(string)
272
+ i = 0
273
+ while i < strLen:
274
+ prefixLen = 0
275
+ if string[i : i + 3] == "&#x":
276
+ prefixLen = 3
277
+ elif string[i : i + 7] == "&amp;#x":
278
+ prefixLen = 7
279
+ if prefixLen:
280
+ i = i + prefixLen
281
+ j = i
282
+ while string[i] != ";":
283
+ i = i + 1
284
+ valStr = string[j:i]
285
+
286
+ uString = uString + chr(eval("0x" + valStr))
287
+ else:
288
+ uString = uString + chr(byteord(string[i]))
289
+ i = i + 1
290
+
291
+ return uString.encode("utf_8")
292
+
293
+
294
+ def mapUTF8toXML(string):
295
+ uString = string.decode("utf_8")
296
+ string = ""
297
+ for uChar in uString:
298
+ i = ord(uChar)
299
+ if (i < 0x80) and (i > 0x1F):
300
+ string = string + uChar
301
+ else:
302
+ string = string + "&#x" + hex(i)[2:] + ";"
303
+ return string
304
+
305
+
306
+ class StringRecord(object):
307
+ def toXML(self, writer, ttFont):
308
+ writer.begintag("StringRecord")
309
+ writer.newline()
310
+ writer.simpletag("labelID", value=self.labelID)
311
+ writer.comment(getLabelString(self.labelID))
312
+ writer.newline()
313
+ writer.newline()
314
+ writer.simpletag("string", value=mapUTF8toXML(self.string))
315
+ writer.newline()
316
+ writer.endtag("StringRecord")
317
+ writer.newline()
318
+
319
+ def fromXML(self, name, attrs, content, ttFont):
320
+ for element in content:
321
+ if isinstance(element, str):
322
+ continue
323
+ name, attrs, content = element
324
+ value = attrs["value"]
325
+ if name == "string":
326
+ self.string = mapXMLToUTF8(value)
327
+ else:
328
+ setattr(self, name, safeEval(value))
329
+
330
+ def compile(self, parentTable):
331
+ data = sstruct.pack(METAStringRecordFormat, self)
332
+ if parentTable.metaFlags == 0:
333
+ datum = struct.pack(">H", self.offset)
334
+ elif parentTable.metaFlags == 1:
335
+ datum = struct.pack(">L", self.offset)
336
+ data = data + datum
337
+ return data
338
+
339
+ def __repr__(self):
340
+ return (
341
+ "StringRecord [ labelID: "
342
+ + str(self.labelID)
343
+ + " aka "
344
+ + getLabelString(self.labelID)
345
+ + ", offset: "
346
+ + str(self.offset)
347
+ + ", length: "
348
+ + str(self.stringLen)
349
+ + ", string: "
350
+ + self.string
351
+ + " ]"
352
+ )
@@ -0,0 +1,13 @@
1
+ from .otBase import BaseTTXConverter
2
+
3
+
4
+ class table_M_V_A_R_(BaseTTXConverter):
5
+ """Metrics Variations table
6
+
7
+ The ``MVAR`` table contains variation information for font-wide
8
+ metrics in a variable font.
9
+
10
+ See also https://learn.microsoft.com/en-us/typography/opentype/spec/mvar
11
+ """
12
+
13
+ pass