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,12 @@
1
+ from .otBase import BaseTTXConverter
2
+
3
+
4
+ class table_V_A_R_C_(BaseTTXConverter):
5
+ """Variable Components table
6
+
7
+ The ``VARC`` table contains variation information for composite glyphs.
8
+
9
+ See also https://github.com/harfbuzz/boring-expansion-spec/blob/main/VARC.md
10
+ """
11
+
12
+ pass
@@ -0,0 +1,249 @@
1
+ from . import DefaultTable
2
+ from fontTools.misc import sstruct
3
+ from fontTools.misc.textTools import safeEval
4
+ import struct
5
+
6
+ VDMX_HeaderFmt = """
7
+ > # big endian
8
+ version: H # Version number (0 or 1)
9
+ numRecs: H # Number of VDMX groups present
10
+ numRatios: H # Number of aspect ratio groupings
11
+ """
12
+ # the VMDX header is followed by an array of RatRange[numRatios] (i.e. aspect
13
+ # ratio ranges);
14
+ VDMX_RatRangeFmt = """
15
+ > # big endian
16
+ bCharSet: B # Character set
17
+ xRatio: B # Value to use for x-Ratio
18
+ yStartRatio: B # Starting y-Ratio value
19
+ yEndRatio: B # Ending y-Ratio value
20
+ """
21
+ # followed by an array of offset[numRatios] from start of VDMX table to the
22
+ # VDMX Group for this ratio range (offsets will be re-calculated on compile);
23
+ # followed by an array of Group[numRecs] records;
24
+ VDMX_GroupFmt = """
25
+ > # big endian
26
+ recs: H # Number of height records in this group
27
+ startsz: B # Starting yPelHeight
28
+ endsz: B # Ending yPelHeight
29
+ """
30
+ # followed by an array of vTable[recs] records.
31
+ VDMX_vTableFmt = """
32
+ > # big endian
33
+ yPelHeight: H # yPelHeight to which values apply
34
+ yMax: h # Maximum value (in pels) for this yPelHeight
35
+ yMin: h # Minimum value (in pels) for this yPelHeight
36
+ """
37
+
38
+
39
+ class table_V_D_M_X_(DefaultTable.DefaultTable):
40
+ """Vertical Device Metrics table
41
+
42
+ The ``VDMX`` table records changes to the vertical glyph minima
43
+ and maxima that result from Truetype instructions.
44
+
45
+ See also https://learn.microsoft.com/en-us/typography/opentype/spec/vdmx
46
+ """
47
+
48
+ def decompile(self, data, ttFont):
49
+ pos = 0 # track current position from to start of VDMX table
50
+ dummy, data = sstruct.unpack2(VDMX_HeaderFmt, data, self)
51
+ pos += sstruct.calcsize(VDMX_HeaderFmt)
52
+ self.ratRanges = []
53
+ for i in range(self.numRatios):
54
+ ratio, data = sstruct.unpack2(VDMX_RatRangeFmt, data)
55
+ pos += sstruct.calcsize(VDMX_RatRangeFmt)
56
+ # the mapping between a ratio and a group is defined further below
57
+ ratio["groupIndex"] = None
58
+ self.ratRanges.append(ratio)
59
+ lenOffset = struct.calcsize(">H")
60
+ _offsets = [] # temporarily store offsets to groups
61
+ for i in range(self.numRatios):
62
+ offset = struct.unpack(">H", data[0:lenOffset])[0]
63
+ data = data[lenOffset:]
64
+ pos += lenOffset
65
+ _offsets.append(offset)
66
+ self.groups = []
67
+ for groupIndex in range(self.numRecs):
68
+ # the offset to this group from beginning of the VDMX table
69
+ currOffset = pos
70
+ group, data = sstruct.unpack2(VDMX_GroupFmt, data)
71
+ # the group lenght and bounding sizes are re-calculated on compile
72
+ recs = group.pop("recs")
73
+ startsz = group.pop("startsz")
74
+ endsz = group.pop("endsz")
75
+ pos += sstruct.calcsize(VDMX_GroupFmt)
76
+ for j in range(recs):
77
+ vTable, data = sstruct.unpack2(VDMX_vTableFmt, data)
78
+ vTableLength = sstruct.calcsize(VDMX_vTableFmt)
79
+ pos += vTableLength
80
+ # group is a dict of (yMax, yMin) tuples keyed by yPelHeight
81
+ group[vTable["yPelHeight"]] = (vTable["yMax"], vTable["yMin"])
82
+ # make sure startsz and endsz match the calculated values
83
+ minSize = min(group.keys())
84
+ maxSize = max(group.keys())
85
+ assert (
86
+ startsz == minSize
87
+ ), "startsz (%s) must equal min yPelHeight (%s): group %d" % (
88
+ group.startsz,
89
+ minSize,
90
+ groupIndex,
91
+ )
92
+ assert (
93
+ endsz == maxSize
94
+ ), "endsz (%s) must equal max yPelHeight (%s): group %d" % (
95
+ group.endsz,
96
+ maxSize,
97
+ groupIndex,
98
+ )
99
+ self.groups.append(group)
100
+ # match the defined offsets with the current group's offset
101
+ for offsetIndex, offsetValue in enumerate(_offsets):
102
+ # when numRecs < numRatios there can more than one ratio range
103
+ # sharing the same VDMX group
104
+ if currOffset == offsetValue:
105
+ # map the group with the ratio range thas has the same
106
+ # index as the offset to that group (it took me a while..)
107
+ self.ratRanges[offsetIndex]["groupIndex"] = groupIndex
108
+ # check that all ratio ranges have a group
109
+ for i in range(self.numRatios):
110
+ ratio = self.ratRanges[i]
111
+ if ratio["groupIndex"] is None:
112
+ from fontTools import ttLib
113
+
114
+ raise ttLib.TTLibError("no group defined for ratRange %d" % i)
115
+
116
+ def _getOffsets(self):
117
+ """
118
+ Calculate offsets to VDMX_Group records.
119
+ For each ratRange return a list of offset values from the beginning of
120
+ the VDMX table to a VDMX_Group.
121
+ """
122
+ lenHeader = sstruct.calcsize(VDMX_HeaderFmt)
123
+ lenRatRange = sstruct.calcsize(VDMX_RatRangeFmt)
124
+ lenOffset = struct.calcsize(">H")
125
+ lenGroupHeader = sstruct.calcsize(VDMX_GroupFmt)
126
+ lenVTable = sstruct.calcsize(VDMX_vTableFmt)
127
+ # offset to the first group
128
+ pos = lenHeader + self.numRatios * lenRatRange + self.numRatios * lenOffset
129
+ groupOffsets = []
130
+ for group in self.groups:
131
+ groupOffsets.append(pos)
132
+ lenGroup = lenGroupHeader + len(group) * lenVTable
133
+ pos += lenGroup # offset to next group
134
+ offsets = []
135
+ for ratio in self.ratRanges:
136
+ groupIndex = ratio["groupIndex"]
137
+ offsets.append(groupOffsets[groupIndex])
138
+ return offsets
139
+
140
+ def compile(self, ttFont):
141
+ if not (self.version == 0 or self.version == 1):
142
+ from fontTools import ttLib
143
+
144
+ raise ttLib.TTLibError(
145
+ "unknown format for VDMX table: version %s" % self.version
146
+ )
147
+ data = sstruct.pack(VDMX_HeaderFmt, self)
148
+ for ratio in self.ratRanges:
149
+ data += sstruct.pack(VDMX_RatRangeFmt, ratio)
150
+ # recalculate offsets to VDMX groups
151
+ for offset in self._getOffsets():
152
+ data += struct.pack(">H", offset)
153
+ for group in self.groups:
154
+ recs = len(group)
155
+ startsz = min(group.keys())
156
+ endsz = max(group.keys())
157
+ gHeader = {"recs": recs, "startsz": startsz, "endsz": endsz}
158
+ data += sstruct.pack(VDMX_GroupFmt, gHeader)
159
+ for yPelHeight, (yMax, yMin) in sorted(group.items()):
160
+ vTable = {"yPelHeight": yPelHeight, "yMax": yMax, "yMin": yMin}
161
+ data += sstruct.pack(VDMX_vTableFmt, vTable)
162
+ return data
163
+
164
+ def toXML(self, writer, ttFont):
165
+ writer.simpletag("version", value=self.version)
166
+ writer.newline()
167
+ writer.begintag("ratRanges")
168
+ writer.newline()
169
+ for ratio in self.ratRanges:
170
+ groupIndex = ratio["groupIndex"]
171
+ writer.simpletag(
172
+ "ratRange",
173
+ bCharSet=ratio["bCharSet"],
174
+ xRatio=ratio["xRatio"],
175
+ yStartRatio=ratio["yStartRatio"],
176
+ yEndRatio=ratio["yEndRatio"],
177
+ groupIndex=groupIndex,
178
+ )
179
+ writer.newline()
180
+ writer.endtag("ratRanges")
181
+ writer.newline()
182
+ writer.begintag("groups")
183
+ writer.newline()
184
+ for groupIndex in range(self.numRecs):
185
+ group = self.groups[groupIndex]
186
+ recs = len(group)
187
+ startsz = min(group.keys())
188
+ endsz = max(group.keys())
189
+ writer.begintag("group", index=groupIndex)
190
+ writer.newline()
191
+ writer.comment("recs=%d, startsz=%d, endsz=%d" % (recs, startsz, endsz))
192
+ writer.newline()
193
+ for yPelHeight, (yMax, yMin) in sorted(group.items()):
194
+ writer.simpletag(
195
+ "record",
196
+ [("yPelHeight", yPelHeight), ("yMax", yMax), ("yMin", yMin)],
197
+ )
198
+ writer.newline()
199
+ writer.endtag("group")
200
+ writer.newline()
201
+ writer.endtag("groups")
202
+ writer.newline()
203
+
204
+ def fromXML(self, name, attrs, content, ttFont):
205
+ if name == "version":
206
+ self.version = safeEval(attrs["value"])
207
+ elif name == "ratRanges":
208
+ if not hasattr(self, "ratRanges"):
209
+ self.ratRanges = []
210
+ for element in content:
211
+ if not isinstance(element, tuple):
212
+ continue
213
+ name, attrs, content = element
214
+ if name == "ratRange":
215
+ if not hasattr(self, "numRatios"):
216
+ self.numRatios = 1
217
+ else:
218
+ self.numRatios += 1
219
+ ratio = {
220
+ "bCharSet": safeEval(attrs["bCharSet"]),
221
+ "xRatio": safeEval(attrs["xRatio"]),
222
+ "yStartRatio": safeEval(attrs["yStartRatio"]),
223
+ "yEndRatio": safeEval(attrs["yEndRatio"]),
224
+ "groupIndex": safeEval(attrs["groupIndex"]),
225
+ }
226
+ self.ratRanges.append(ratio)
227
+ elif name == "groups":
228
+ if not hasattr(self, "groups"):
229
+ self.groups = []
230
+ for element in content:
231
+ if not isinstance(element, tuple):
232
+ continue
233
+ name, attrs, content = element
234
+ if name == "group":
235
+ if not hasattr(self, "numRecs"):
236
+ self.numRecs = 1
237
+ else:
238
+ self.numRecs += 1
239
+ group = {}
240
+ for element in content:
241
+ if not isinstance(element, tuple):
242
+ continue
243
+ name, attrs, content = element
244
+ if name == "record":
245
+ yPelHeight = safeEval(attrs["yPelHeight"])
246
+ yMax = safeEval(attrs["yMax"])
247
+ yMin = safeEval(attrs["yMin"])
248
+ group[yPelHeight] = (yMax, yMin)
249
+ self.groups.append(group)
@@ -0,0 +1,165 @@
1
+ from fontTools.misc.textTools import bytesjoin, safeEval
2
+ from . import DefaultTable
3
+ import struct
4
+
5
+
6
+ class table_V_O_R_G_(DefaultTable.DefaultTable):
7
+ """Vertical Origin table
8
+
9
+ The ``VORG`` table contains the vertical origin of each glyph
10
+ in a `CFF` or `CFF2` font.
11
+
12
+ This table is structured so that you can treat it like a dictionary keyed by glyph name.
13
+
14
+ ``ttFont['VORG'][<glyphName>]`` will return the vertical origin for any glyph.
15
+
16
+ ``ttFont['VORG'][<glyphName>] = <value>`` will set the vertical origin for any glyph.
17
+
18
+ See also https://learn.microsoft.com/en-us/typography/opentype/spec/vorg
19
+ """
20
+
21
+ def decompile(self, data, ttFont):
22
+ self.getGlyphName = (
23
+ ttFont.getGlyphName
24
+ ) # for use in get/set item functions, for access by GID
25
+ (
26
+ self.majorVersion,
27
+ self.minorVersion,
28
+ self.defaultVertOriginY,
29
+ self.numVertOriginYMetrics,
30
+ ) = struct.unpack(">HHhH", data[:8])
31
+ assert (
32
+ self.majorVersion <= 1
33
+ ), "Major version of VORG table is higher than I know how to handle"
34
+ data = data[8:]
35
+ vids = []
36
+ gids = []
37
+ pos = 0
38
+ for i in range(self.numVertOriginYMetrics):
39
+ gid, vOrigin = struct.unpack(">Hh", data[pos : pos + 4])
40
+ pos += 4
41
+ gids.append(gid)
42
+ vids.append(vOrigin)
43
+
44
+ self.VOriginRecords = vOrig = {}
45
+ glyphOrder = ttFont.getGlyphOrder()
46
+ try:
47
+ names = [glyphOrder[gid] for gid in gids]
48
+ except IndexError:
49
+ getGlyphName = self.getGlyphName
50
+ names = map(getGlyphName, gids)
51
+
52
+ for name, vid in zip(names, vids):
53
+ vOrig[name] = vid
54
+
55
+ def compile(self, ttFont):
56
+ vorgs = list(self.VOriginRecords.values())
57
+ names = list(self.VOriginRecords.keys())
58
+ nameMap = ttFont.getReverseGlyphMap()
59
+ try:
60
+ gids = [nameMap[name] for name in names]
61
+ except KeyError:
62
+ nameMap = ttFont.getReverseGlyphMap(rebuild=True)
63
+ gids = [nameMap[name] for name in names]
64
+ vOriginTable = list(zip(gids, vorgs))
65
+ self.numVertOriginYMetrics = len(vorgs)
66
+ vOriginTable.sort() # must be in ascending GID order
67
+ dataList = [struct.pack(">Hh", rec[0], rec[1]) for rec in vOriginTable]
68
+ header = struct.pack(
69
+ ">HHhH",
70
+ self.majorVersion,
71
+ self.minorVersion,
72
+ self.defaultVertOriginY,
73
+ self.numVertOriginYMetrics,
74
+ )
75
+ dataList.insert(0, header)
76
+ data = bytesjoin(dataList)
77
+ return data
78
+
79
+ def toXML(self, writer, ttFont):
80
+ writer.simpletag("majorVersion", value=self.majorVersion)
81
+ writer.newline()
82
+ writer.simpletag("minorVersion", value=self.minorVersion)
83
+ writer.newline()
84
+ writer.simpletag("defaultVertOriginY", value=self.defaultVertOriginY)
85
+ writer.newline()
86
+ writer.simpletag("numVertOriginYMetrics", value=self.numVertOriginYMetrics)
87
+ writer.newline()
88
+ vOriginTable = []
89
+ glyphNames = self.VOriginRecords.keys()
90
+ for glyphName in glyphNames:
91
+ try:
92
+ gid = ttFont.getGlyphID(glyphName)
93
+ except:
94
+ assert 0, (
95
+ "VORG table contains a glyph name not in ttFont.getGlyphNames(): "
96
+ + str(glyphName)
97
+ )
98
+ vOriginTable.append([gid, glyphName, self.VOriginRecords[glyphName]])
99
+ vOriginTable.sort()
100
+ for entry in vOriginTable:
101
+ vOriginRec = VOriginRecord(entry[1], entry[2])
102
+ vOriginRec.toXML(writer, ttFont)
103
+
104
+ def fromXML(self, name, attrs, content, ttFont):
105
+ if not hasattr(self, "VOriginRecords"):
106
+ self.VOriginRecords = {}
107
+ self.getGlyphName = (
108
+ ttFont.getGlyphName
109
+ ) # for use in get/set item functions, for access by GID
110
+ if name == "VOriginRecord":
111
+ vOriginRec = VOriginRecord()
112
+ for element in content:
113
+ if isinstance(element, str):
114
+ continue
115
+ name, attrs, content = element
116
+ vOriginRec.fromXML(name, attrs, content, ttFont)
117
+ self.VOriginRecords[vOriginRec.glyphName] = vOriginRec.vOrigin
118
+ elif "value" in attrs:
119
+ setattr(self, name, safeEval(attrs["value"]))
120
+
121
+ def __getitem__(self, glyphSelector):
122
+ if isinstance(glyphSelector, int):
123
+ # its a gid, convert to glyph name
124
+ glyphSelector = self.getGlyphName(glyphSelector)
125
+
126
+ if glyphSelector not in self.VOriginRecords:
127
+ return self.defaultVertOriginY
128
+
129
+ return self.VOriginRecords[glyphSelector]
130
+
131
+ def __setitem__(self, glyphSelector, value):
132
+ if isinstance(glyphSelector, int):
133
+ # its a gid, convert to glyph name
134
+ glyphSelector = self.getGlyphName(glyphSelector)
135
+
136
+ if value != self.defaultVertOriginY:
137
+ self.VOriginRecords[glyphSelector] = value
138
+ elif glyphSelector in self.VOriginRecords:
139
+ del self.VOriginRecords[glyphSelector]
140
+
141
+ def __delitem__(self, glyphSelector):
142
+ del self.VOriginRecords[glyphSelector]
143
+
144
+
145
+ class VOriginRecord(object):
146
+ def __init__(self, name=None, vOrigin=None):
147
+ self.glyphName = name
148
+ self.vOrigin = vOrigin
149
+
150
+ def toXML(self, writer, ttFont):
151
+ writer.begintag("VOriginRecord")
152
+ writer.newline()
153
+ writer.simpletag("glyphName", value=self.glyphName)
154
+ writer.newline()
155
+ writer.simpletag("vOrigin", value=self.vOrigin)
156
+ writer.newline()
157
+ writer.endtag("VOriginRecord")
158
+ writer.newline()
159
+
160
+ def fromXML(self, name, attrs, content, ttFont):
161
+ value = attrs["value"]
162
+ if name == "glyphName":
163
+ setattr(self, name, value)
164
+ else:
165
+ setattr(self, name, safeEval(value))
@@ -0,0 +1,13 @@
1
+ from .otBase import BaseTTXConverter
2
+
3
+
4
+ class table_V_V_A_R_(BaseTTXConverter):
5
+ """Vertical Metrics Variations table
6
+
7
+ The ``VVAR`` table contains variation data for per-glyph vertical metrics
8
+ in a variable font.
9
+
10
+ See also https://learn.microsoft.com/en-us/typography/opentype/spec/vvar
11
+ """
12
+
13
+ pass
@@ -0,0 +1,98 @@
1
+ # DON'T EDIT! This file is generated by MetaTools/buildTableList.py.
2
+ def _moduleFinderHint():
3
+ """Dummy function to let modulefinder know what tables may be
4
+ dynamically imported. Generated by MetaTools/buildTableList.py.
5
+
6
+ >>> _moduleFinderHint()
7
+ """
8
+ from . import B_A_S_E_
9
+ from . import C_B_D_T_
10
+ from . import C_B_L_C_
11
+ from . import C_F_F_
12
+ from . import C_F_F__2
13
+ from . import C_O_L_R_
14
+ from . import C_P_A_L_
15
+ from . import D_S_I_G_
16
+ from . import D__e_b_g
17
+ from . import E_B_D_T_
18
+ from . import E_B_L_C_
19
+ from . import F_F_T_M_
20
+ from . import F__e_a_t
21
+ from . import G_D_E_F_
22
+ from . import G_M_A_P_
23
+ from . import G_P_K_G_
24
+ from . import G_P_O_S_
25
+ from . import G_S_U_B_
26
+ from . import G_V_A_R_
27
+ from . import G__l_a_t
28
+ from . import G__l_o_c
29
+ from . import H_V_A_R_
30
+ from . import J_S_T_F_
31
+ from . import L_T_S_H_
32
+ from . import M_A_T_H_
33
+ from . import M_E_T_A_
34
+ from . import M_V_A_R_
35
+ from . import O_S_2f_2
36
+ from . import S_I_N_G_
37
+ from . import S_T_A_T_
38
+ from . import S_V_G_
39
+ from . import S__i_l_f
40
+ from . import S__i_l_l
41
+ from . import T_S_I_B_
42
+ from . import T_S_I_C_
43
+ from . import T_S_I_D_
44
+ from . import T_S_I_J_
45
+ from . import T_S_I_P_
46
+ from . import T_S_I_S_
47
+ from . import T_S_I_V_
48
+ from . import T_S_I__0
49
+ from . import T_S_I__1
50
+ from . import T_S_I__2
51
+ from . import T_S_I__3
52
+ from . import T_S_I__5
53
+ from . import T_T_F_A_
54
+ from . import V_A_R_C_
55
+ from . import V_D_M_X_
56
+ from . import V_O_R_G_
57
+ from . import V_V_A_R_
58
+ from . import _a_n_k_r
59
+ from . import _a_v_a_r
60
+ from . import _b_s_l_n
61
+ from . import _c_i_d_g
62
+ from . import _c_m_a_p
63
+ from . import _c_v_a_r
64
+ from . import _c_v_t
65
+ from . import _f_e_a_t
66
+ from . import _f_p_g_m
67
+ from . import _f_v_a_r
68
+ from . import _g_a_s_p
69
+ from . import _g_c_i_d
70
+ from . import _g_l_y_f
71
+ from . import _g_v_a_r
72
+ from . import _h_d_m_x
73
+ from . import _h_e_a_d
74
+ from . import _h_h_e_a
75
+ from . import _h_m_t_x
76
+ from . import _k_e_r_n
77
+ from . import _l_c_a_r
78
+ from . import _l_o_c_a
79
+ from . import _l_t_a_g
80
+ from . import _m_a_x_p
81
+ from . import _m_e_t_a
82
+ from . import _m_o_r_t
83
+ from . import _m_o_r_x
84
+ from . import _n_a_m_e
85
+ from . import _o_p_b_d
86
+ from . import _p_o_s_t
87
+ from . import _p_r_e_p
88
+ from . import _p_r_o_p
89
+ from . import _s_b_i_x
90
+ from . import _t_r_a_k
91
+ from . import _v_h_e_a
92
+ from . import _v_m_t_x
93
+
94
+
95
+ if __name__ == "__main__":
96
+ import doctest, sys
97
+
98
+ sys.exit(doctest.testmod().failed)
@@ -0,0 +1,15 @@
1
+ from .otBase import BaseTTXConverter
2
+
3
+
4
+ class table__a_n_k_r(BaseTTXConverter):
5
+ """Anchor Point table
6
+
7
+ The anchor point table provides a way to define anchor points.
8
+ These are points within the coordinate space of a given glyph,
9
+ independent of the control points used to render the glyph.
10
+ Anchor points are used in conjunction with the ``kerx`` table.
11
+
12
+ See also https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6ankr.html
13
+ """
14
+
15
+ pass