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,94 @@
1
+ from . import DefaultTable
2
+ from fontTools.misc import sstruct
3
+ from fontTools.misc.textTools import bytesjoin
4
+ from fontTools.ttLib.tables.TupleVariation import (
5
+ compileTupleVariationStore,
6
+ decompileTupleVariationStore,
7
+ TupleVariation,
8
+ )
9
+
10
+
11
+ # https://www.microsoft.com/typography/otspec/cvar.htm
12
+ # https://www.microsoft.com/typography/otspec/otvarcommonformats.htm
13
+ # https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6cvar.html
14
+
15
+ CVAR_HEADER_FORMAT = """
16
+ > # big endian
17
+ majorVersion: H
18
+ minorVersion: H
19
+ tupleVariationCount: H
20
+ offsetToData: H
21
+ """
22
+
23
+ CVAR_HEADER_SIZE = sstruct.calcsize(CVAR_HEADER_FORMAT)
24
+
25
+
26
+ class table__c_v_a_r(DefaultTable.DefaultTable):
27
+ """Control Value Table (CVT) variations table
28
+
29
+ The ``cvar`` table contains variations for the values in a ``cvt``
30
+ table.
31
+
32
+ See also https://learn.microsoft.com/en-us/typography/opentype/spec/cvar
33
+ """
34
+
35
+ dependencies = ["cvt ", "fvar"]
36
+
37
+ def __init__(self, tag=None):
38
+ DefaultTable.DefaultTable.__init__(self, tag)
39
+ self.majorVersion, self.minorVersion = 1, 0
40
+ self.variations = []
41
+
42
+ def compile(self, ttFont, useSharedPoints=False):
43
+ tupleVariationCount, tuples, data = compileTupleVariationStore(
44
+ variations=[v for v in self.variations if v.hasImpact()],
45
+ pointCount=len(ttFont["cvt "].values),
46
+ axisTags=[axis.axisTag for axis in ttFont["fvar"].axes],
47
+ sharedTupleIndices={},
48
+ useSharedPoints=useSharedPoints,
49
+ )
50
+ header = {
51
+ "majorVersion": self.majorVersion,
52
+ "minorVersion": self.minorVersion,
53
+ "tupleVariationCount": tupleVariationCount,
54
+ "offsetToData": CVAR_HEADER_SIZE + len(tuples),
55
+ }
56
+ return b"".join([sstruct.pack(CVAR_HEADER_FORMAT, header), tuples, data])
57
+
58
+ def decompile(self, data, ttFont):
59
+ axisTags = [axis.axisTag for axis in ttFont["fvar"].axes]
60
+ header = {}
61
+ sstruct.unpack(CVAR_HEADER_FORMAT, data[0:CVAR_HEADER_SIZE], header)
62
+ self.majorVersion = header["majorVersion"]
63
+ self.minorVersion = header["minorVersion"]
64
+ assert self.majorVersion == 1, self.majorVersion
65
+ self.variations = decompileTupleVariationStore(
66
+ tableTag=self.tableTag,
67
+ axisTags=axisTags,
68
+ tupleVariationCount=header["tupleVariationCount"],
69
+ pointCount=len(ttFont["cvt "].values),
70
+ sharedTuples=None,
71
+ data=data,
72
+ pos=CVAR_HEADER_SIZE,
73
+ dataPos=header["offsetToData"],
74
+ )
75
+
76
+ def fromXML(self, name, attrs, content, ttFont):
77
+ if name == "version":
78
+ self.majorVersion = int(attrs.get("major", "1"))
79
+ self.minorVersion = int(attrs.get("minor", "0"))
80
+ elif name == "tuple":
81
+ valueCount = len(ttFont["cvt "].values)
82
+ var = TupleVariation({}, [None] * valueCount)
83
+ self.variations.append(var)
84
+ for tupleElement in content:
85
+ if isinstance(tupleElement, tuple):
86
+ tupleName, tupleAttrs, tupleContent = tupleElement
87
+ var.fromXML(tupleName, tupleAttrs, tupleContent)
88
+
89
+ def toXML(self, writer, ttFont):
90
+ axisTags = [axis.axisTag for axis in ttFont["fvar"].axes]
91
+ writer.simpletag("version", major=self.majorVersion, minor=self.minorVersion)
92
+ writer.newline()
93
+ for var in self.variations:
94
+ var.toXML(writer, axisTags)
@@ -0,0 +1,56 @@
1
+ from fontTools.misc.textTools import safeEval
2
+ from . import DefaultTable
3
+ import sys
4
+ import array
5
+
6
+
7
+ class table__c_v_t(DefaultTable.DefaultTable):
8
+ """Control Value Table
9
+
10
+ The Control Value Table holds a list of values that can be referenced
11
+ by TrueType font instructions.
12
+
13
+ See also https://learn.microsoft.com/en-us/typography/opentype/spec/cvt
14
+ """
15
+
16
+ def decompile(self, data, ttFont):
17
+ values = array.array("h")
18
+ values.frombytes(data)
19
+ if sys.byteorder != "big":
20
+ values.byteswap()
21
+ self.values = values
22
+
23
+ def compile(self, ttFont):
24
+ if not hasattr(self, "values"):
25
+ return b""
26
+ values = self.values[:]
27
+ if sys.byteorder != "big":
28
+ values.byteswap()
29
+ return values.tobytes()
30
+
31
+ def toXML(self, writer, ttFont):
32
+ for i, value in enumerate(self.values):
33
+ writer.simpletag("cv", value=value, index=i)
34
+ writer.newline()
35
+
36
+ def fromXML(self, name, attrs, content, ttFont):
37
+ if not hasattr(self, "values"):
38
+ self.values = array.array("h")
39
+ if name == "cv":
40
+ index = safeEval(attrs["index"])
41
+ value = safeEval(attrs["value"])
42
+ for i in range(1 + index - len(self.values)):
43
+ self.values.append(0)
44
+ self.values[index] = value
45
+
46
+ def __len__(self):
47
+ return len(self.values)
48
+
49
+ def __getitem__(self, index):
50
+ return self.values[index]
51
+
52
+ def __setitem__(self, index, value):
53
+ self.values[index] = value
54
+
55
+ def __delitem__(self, index):
56
+ del self.values[index]
@@ -0,0 +1,15 @@
1
+ from .otBase import BaseTTXConverter
2
+
3
+
4
+ class table__f_e_a_t(BaseTTXConverter):
5
+ """Feature name table
6
+
7
+ The feature name table is an AAT (Apple Advanced Typography) table for
8
+ storing font features, settings, and their human-readable names. It should
9
+ not be confused with the ``Feat`` table or the OpenType Layout ``GSUB``/``GPOS``
10
+ tables.
11
+
12
+ See also https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6feat.html
13
+ """
14
+
15
+ pass
@@ -0,0 +1,62 @@
1
+ from . import DefaultTable
2
+ from . import ttProgram
3
+
4
+
5
+ class table__f_p_g_m(DefaultTable.DefaultTable):
6
+ """Font Program table
7
+
8
+ The ``fpgm`` table typically contains function defintions that are
9
+ used by font instructions. This Font Program is similar to the Control
10
+ Value Program that is stored in the ``prep`` table, but
11
+ the ``fpgm`` table is only executed one time, when the font is first
12
+ used.
13
+
14
+ See also https://learn.microsoft.com/en-us/typography/opentype/spec/fpgm
15
+ """
16
+
17
+ def decompile(self, data, ttFont):
18
+ program = ttProgram.Program()
19
+ program.fromBytecode(data)
20
+ self.program = program
21
+
22
+ def compile(self, ttFont):
23
+ if hasattr(self, "program"):
24
+ return self.program.getBytecode()
25
+ return b""
26
+
27
+ def toXML(self, writer, ttFont):
28
+ self.program.toXML(writer, ttFont)
29
+
30
+ def fromXML(self, name, attrs, content, ttFont):
31
+ program = ttProgram.Program()
32
+ program.fromXML(name, attrs, content, ttFont)
33
+ self.program = program
34
+
35
+ def __bool__(self):
36
+ """
37
+ >>> fpgm = table__f_p_g_m()
38
+ >>> bool(fpgm)
39
+ False
40
+ >>> p = ttProgram.Program()
41
+ >>> fpgm.program = p
42
+ >>> bool(fpgm)
43
+ False
44
+ >>> bc = bytearray([0])
45
+ >>> p.fromBytecode(bc)
46
+ >>> bool(fpgm)
47
+ True
48
+ >>> p.bytecode.pop()
49
+ 0
50
+ >>> bool(fpgm)
51
+ False
52
+ """
53
+ return hasattr(self, "program") and bool(self.program)
54
+
55
+ __nonzero__ = __bool__
56
+
57
+
58
+ if __name__ == "__main__":
59
+ import sys
60
+ import doctest
61
+
62
+ sys.exit(doctest.testmod().failed)
@@ -0,0 +1,261 @@
1
+ from fontTools.misc import sstruct
2
+ from fontTools.misc.fixedTools import (
3
+ fixedToFloat as fi2fl,
4
+ floatToFixed as fl2fi,
5
+ floatToFixedToStr as fl2str,
6
+ strToFixedToFloat as str2fl,
7
+ )
8
+ from fontTools.misc.textTools import Tag, bytesjoin, safeEval
9
+ from fontTools.ttLib import TTLibError
10
+ from . import DefaultTable
11
+ import struct
12
+
13
+
14
+ # Apple's documentation of 'fvar':
15
+ # https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6fvar.html
16
+
17
+ FVAR_HEADER_FORMAT = """
18
+ > # big endian
19
+ version: L
20
+ offsetToData: H
21
+ countSizePairs: H
22
+ axisCount: H
23
+ axisSize: H
24
+ instanceCount: H
25
+ instanceSize: H
26
+ """
27
+
28
+ FVAR_AXIS_FORMAT = """
29
+ > # big endian
30
+ axisTag: 4s
31
+ minValue: 16.16F
32
+ defaultValue: 16.16F
33
+ maxValue: 16.16F
34
+ flags: H
35
+ axisNameID: H
36
+ """
37
+
38
+ FVAR_INSTANCE_FORMAT = """
39
+ > # big endian
40
+ subfamilyNameID: H
41
+ flags: H
42
+ """
43
+
44
+
45
+ class table__f_v_a_r(DefaultTable.DefaultTable):
46
+ """FonT Variations table
47
+
48
+ The ``fvar`` table contains records of the variation axes and of the
49
+ named instances in a variable font.
50
+
51
+ See also https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6fvar.html
52
+ """
53
+
54
+ dependencies = ["name"]
55
+
56
+ def __init__(self, tag=None):
57
+ DefaultTable.DefaultTable.__init__(self, tag)
58
+ self.axes = []
59
+ self.instances = []
60
+
61
+ def compile(self, ttFont):
62
+ instanceSize = sstruct.calcsize(FVAR_INSTANCE_FORMAT) + (len(self.axes) * 4)
63
+ includePostScriptNames = any(
64
+ instance.postscriptNameID != 0xFFFF for instance in self.instances
65
+ )
66
+ if includePostScriptNames:
67
+ instanceSize += 2
68
+ header = {
69
+ "version": 0x00010000,
70
+ "offsetToData": sstruct.calcsize(FVAR_HEADER_FORMAT),
71
+ "countSizePairs": 2,
72
+ "axisCount": len(self.axes),
73
+ "axisSize": sstruct.calcsize(FVAR_AXIS_FORMAT),
74
+ "instanceCount": len(self.instances),
75
+ "instanceSize": instanceSize,
76
+ }
77
+ result = [sstruct.pack(FVAR_HEADER_FORMAT, header)]
78
+ result.extend([axis.compile() for axis in self.axes])
79
+ axisTags = [axis.axisTag for axis in self.axes]
80
+ for instance in self.instances:
81
+ result.append(instance.compile(axisTags, includePostScriptNames))
82
+ return bytesjoin(result)
83
+
84
+ def decompile(self, data, ttFont):
85
+ header = {}
86
+ headerSize = sstruct.calcsize(FVAR_HEADER_FORMAT)
87
+ header = sstruct.unpack(FVAR_HEADER_FORMAT, data[0:headerSize])
88
+ if header["version"] != 0x00010000:
89
+ raise TTLibError("unsupported 'fvar' version %04x" % header["version"])
90
+ pos = header["offsetToData"]
91
+ axisSize = header["axisSize"]
92
+ for _ in range(header["axisCount"]):
93
+ axis = Axis()
94
+ axis.decompile(data[pos : pos + axisSize])
95
+ self.axes.append(axis)
96
+ pos += axisSize
97
+ instanceSize = header["instanceSize"]
98
+ axisTags = [axis.axisTag for axis in self.axes]
99
+ for _ in range(header["instanceCount"]):
100
+ instance = NamedInstance()
101
+ instance.decompile(data[pos : pos + instanceSize], axisTags)
102
+ self.instances.append(instance)
103
+ pos += instanceSize
104
+
105
+ def toXML(self, writer, ttFont):
106
+ for axis in self.axes:
107
+ axis.toXML(writer, ttFont)
108
+ for instance in self.instances:
109
+ instance.toXML(writer, ttFont)
110
+
111
+ def fromXML(self, name, attrs, content, ttFont):
112
+ if name == "Axis":
113
+ axis = Axis()
114
+ axis.fromXML(name, attrs, content, ttFont)
115
+ self.axes.append(axis)
116
+ elif name == "NamedInstance":
117
+ instance = NamedInstance()
118
+ instance.fromXML(name, attrs, content, ttFont)
119
+ self.instances.append(instance)
120
+
121
+ def getAxes(self):
122
+ return {a.axisTag: (a.minValue, a.defaultValue, a.maxValue) for a in self.axes}
123
+
124
+
125
+ class Axis(object):
126
+ def __init__(self):
127
+ self.axisTag = None
128
+ self.axisNameID = 0
129
+ self.flags = 0
130
+ self.minValue = -1.0
131
+ self.defaultValue = 0.0
132
+ self.maxValue = 1.0
133
+
134
+ def compile(self):
135
+ return sstruct.pack(FVAR_AXIS_FORMAT, self)
136
+
137
+ def decompile(self, data):
138
+ sstruct.unpack2(FVAR_AXIS_FORMAT, data, self)
139
+
140
+ def toXML(self, writer, ttFont):
141
+ name = (
142
+ ttFont["name"].getDebugName(self.axisNameID) if "name" in ttFont else None
143
+ )
144
+ if name is not None:
145
+ writer.newline()
146
+ writer.comment(name)
147
+ writer.newline()
148
+ writer.begintag("Axis")
149
+ writer.newline()
150
+ for tag, value in [
151
+ ("AxisTag", self.axisTag),
152
+ ("Flags", "0x%X" % self.flags),
153
+ ("MinValue", fl2str(self.minValue, 16)),
154
+ ("DefaultValue", fl2str(self.defaultValue, 16)),
155
+ ("MaxValue", fl2str(self.maxValue, 16)),
156
+ ("AxisNameID", str(self.axisNameID)),
157
+ ]:
158
+ writer.begintag(tag)
159
+ writer.write(value)
160
+ writer.endtag(tag)
161
+ writer.newline()
162
+ writer.endtag("Axis")
163
+ writer.newline()
164
+
165
+ def fromXML(self, name, _attrs, content, ttFont):
166
+ assert name == "Axis"
167
+ for tag, _, value in filter(lambda t: type(t) is tuple, content):
168
+ value = "".join(value)
169
+ if tag == "AxisTag":
170
+ self.axisTag = Tag(value)
171
+ elif tag in {"Flags", "MinValue", "DefaultValue", "MaxValue", "AxisNameID"}:
172
+ setattr(
173
+ self,
174
+ tag[0].lower() + tag[1:],
175
+ str2fl(value, 16) if tag.endswith("Value") else safeEval(value),
176
+ )
177
+
178
+
179
+ class NamedInstance(object):
180
+ def __init__(self):
181
+ self.subfamilyNameID = 0
182
+ self.postscriptNameID = 0xFFFF
183
+ self.flags = 0
184
+ self.coordinates = {}
185
+
186
+ def compile(self, axisTags, includePostScriptName):
187
+ result = [sstruct.pack(FVAR_INSTANCE_FORMAT, self)]
188
+ for axis in axisTags:
189
+ fixedCoord = fl2fi(self.coordinates[axis], 16)
190
+ result.append(struct.pack(">l", fixedCoord))
191
+ if includePostScriptName:
192
+ result.append(struct.pack(">H", self.postscriptNameID))
193
+ return bytesjoin(result)
194
+
195
+ def decompile(self, data, axisTags):
196
+ sstruct.unpack2(FVAR_INSTANCE_FORMAT, data, self)
197
+ pos = sstruct.calcsize(FVAR_INSTANCE_FORMAT)
198
+ for axis in axisTags:
199
+ value = struct.unpack(">l", data[pos : pos + 4])[0]
200
+ self.coordinates[axis] = fi2fl(value, 16)
201
+ pos += 4
202
+ if pos + 2 <= len(data):
203
+ self.postscriptNameID = struct.unpack(">H", data[pos : pos + 2])[0]
204
+ else:
205
+ self.postscriptNameID = 0xFFFF
206
+
207
+ def toXML(self, writer, ttFont):
208
+ name = (
209
+ ttFont["name"].getDebugName(self.subfamilyNameID)
210
+ if "name" in ttFont
211
+ else None
212
+ )
213
+ if name is not None:
214
+ writer.newline()
215
+ writer.comment(name)
216
+ writer.newline()
217
+ psname = (
218
+ ttFont["name"].getDebugName(self.postscriptNameID)
219
+ if "name" in ttFont
220
+ else None
221
+ )
222
+ if psname is not None:
223
+ writer.comment("PostScript: " + psname)
224
+ writer.newline()
225
+ if self.postscriptNameID == 0xFFFF:
226
+ writer.begintag(
227
+ "NamedInstance",
228
+ flags=("0x%X" % self.flags),
229
+ subfamilyNameID=self.subfamilyNameID,
230
+ )
231
+ else:
232
+ writer.begintag(
233
+ "NamedInstance",
234
+ flags=("0x%X" % self.flags),
235
+ subfamilyNameID=self.subfamilyNameID,
236
+ postscriptNameID=self.postscriptNameID,
237
+ )
238
+ writer.newline()
239
+ for axis in ttFont["fvar"].axes:
240
+ writer.simpletag(
241
+ "coord",
242
+ axis=axis.axisTag,
243
+ value=fl2str(self.coordinates[axis.axisTag], 16),
244
+ )
245
+ writer.newline()
246
+ writer.endtag("NamedInstance")
247
+ writer.newline()
248
+
249
+ def fromXML(self, name, attrs, content, ttFont):
250
+ assert name == "NamedInstance"
251
+ self.subfamilyNameID = safeEval(attrs["subfamilyNameID"])
252
+ self.flags = safeEval(attrs.get("flags", "0"))
253
+ if "postscriptNameID" in attrs:
254
+ self.postscriptNameID = safeEval(attrs["postscriptNameID"])
255
+ else:
256
+ self.postscriptNameID = 0xFFFF
257
+
258
+ for tag, elementAttrs, _ in filter(lambda t: type(t) is tuple, content):
259
+ if tag == "coord":
260
+ value = str2fl(elementAttrs["value"], 16)
261
+ self.coordinates[elementAttrs["axis"]] = value
@@ -0,0 +1,63 @@
1
+ from fontTools.misc.textTools import safeEval
2
+ from . import DefaultTable
3
+ import struct
4
+
5
+
6
+ GASP_SYMMETRIC_GRIDFIT = 0x0004
7
+ GASP_SYMMETRIC_SMOOTHING = 0x0008
8
+ GASP_DOGRAY = 0x0002
9
+ GASP_GRIDFIT = 0x0001
10
+
11
+
12
+ class table__g_a_s_p(DefaultTable.DefaultTable):
13
+ """Grid-fitting and Scan-conversion Procedure table
14
+
15
+ The ``gasp`` table defines the preferred rasterization settings for
16
+ the font when rendered on monochrome and greyscale output devices.
17
+
18
+ See also https://learn.microsoft.com/en-us/typography/opentype/spec/gasp
19
+ """
20
+
21
+ def decompile(self, data, ttFont):
22
+ self.version, numRanges = struct.unpack(">HH", data[:4])
23
+ assert 0 <= self.version <= 1, "unknown 'gasp' format: %s" % self.version
24
+ data = data[4:]
25
+ self.gaspRange = {}
26
+ for i in range(numRanges):
27
+ rangeMaxPPEM, rangeGaspBehavior = struct.unpack(">HH", data[:4])
28
+ self.gaspRange[int(rangeMaxPPEM)] = int(rangeGaspBehavior)
29
+ data = data[4:]
30
+ assert not data, "too much data"
31
+
32
+ def compile(self, ttFont):
33
+ version = 0 # ignore self.version
34
+ numRanges = len(self.gaspRange)
35
+ data = b""
36
+ items = sorted(self.gaspRange.items())
37
+ for rangeMaxPPEM, rangeGaspBehavior in items:
38
+ data = data + struct.pack(">HH", rangeMaxPPEM, rangeGaspBehavior)
39
+ if rangeGaspBehavior & ~(GASP_GRIDFIT | GASP_DOGRAY):
40
+ version = 1
41
+ data = struct.pack(">HH", version, numRanges) + data
42
+ return data
43
+
44
+ def toXML(self, writer, ttFont):
45
+ items = sorted(self.gaspRange.items())
46
+ for rangeMaxPPEM, rangeGaspBehavior in items:
47
+ writer.simpletag(
48
+ "gaspRange",
49
+ [
50
+ ("rangeMaxPPEM", rangeMaxPPEM),
51
+ ("rangeGaspBehavior", rangeGaspBehavior),
52
+ ],
53
+ )
54
+ writer.newline()
55
+
56
+ def fromXML(self, name, attrs, content, ttFont):
57
+ if name != "gaspRange":
58
+ return
59
+ if not hasattr(self, "gaspRange"):
60
+ self.gaspRange = {}
61
+ self.gaspRange[safeEval(attrs["rangeMaxPPEM"])] = safeEval(
62
+ attrs["rangeGaspBehavior"]
63
+ )
@@ -0,0 +1,13 @@
1
+ from .otBase import BaseTTXConverter
2
+
3
+
4
+ # https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6gcid.html
5
+ class table__g_c_i_d(BaseTTXConverter):
6
+ """Glyph ID to CID table
7
+
8
+ The AAT ``gcid`` table stores glyphID-to-CID mappings.
9
+
10
+ See also https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6gcid.html
11
+ """
12
+
13
+ pass