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,92 @@
1
+ from fontTools.misc import sstruct
2
+ from fontTools.misc.fixedTools import floatToFixedToStr
3
+ from fontTools.misc.textTools import safeEval
4
+ from . import DefaultTable
5
+ from . import grUtils
6
+ import struct
7
+
8
+ Sill_hdr = """
9
+ >
10
+ version: 16.16F
11
+ """
12
+
13
+
14
+ class table_S__i_l_l(DefaultTable.DefaultTable):
15
+ """Graphite Languages table
16
+
17
+ See also https://graphite.sil.org/graphite_techAbout#graphite-font-tables
18
+ """
19
+
20
+ def __init__(self, tag=None):
21
+ DefaultTable.DefaultTable.__init__(self, tag)
22
+ self.langs = {}
23
+
24
+ def decompile(self, data, ttFont):
25
+ (_, data) = sstruct.unpack2(Sill_hdr, data, self)
26
+ self.version = float(floatToFixedToStr(self.version, precisionBits=16))
27
+ (numLangs,) = struct.unpack(">H", data[:2])
28
+ data = data[8:]
29
+ maxsetting = 0
30
+ langinfo = []
31
+ for i in range(numLangs):
32
+ (langcode, numsettings, offset) = struct.unpack(
33
+ ">4sHH", data[i * 8 : (i + 1) * 8]
34
+ )
35
+ offset = int(offset / 8) - (numLangs + 1)
36
+ langcode = langcode.replace(b"\000", b"")
37
+ langinfo.append((langcode.decode("utf-8"), numsettings, offset))
38
+ maxsetting = max(maxsetting, offset + numsettings)
39
+ data = data[numLangs * 8 :]
40
+ finfo = []
41
+ for i in range(maxsetting):
42
+ (fid, val, _) = struct.unpack(">LHH", data[i * 8 : (i + 1) * 8])
43
+ finfo.append((fid, val))
44
+ self.langs = {}
45
+ for c, n, o in langinfo:
46
+ self.langs[c] = []
47
+ for i in range(o, o + n):
48
+ self.langs[c].append(finfo[i])
49
+
50
+ def compile(self, ttFont):
51
+ ldat = b""
52
+ fdat = b""
53
+ offset = len(self.langs)
54
+ for c, inf in sorted(self.langs.items()):
55
+ ldat += struct.pack(">4sHH", c.encode("utf8"), len(inf), 8 * offset + 20)
56
+ for fid, val in inf:
57
+ fdat += struct.pack(">LHH", fid, val, 0)
58
+ offset += len(inf)
59
+ ldat += struct.pack(">LHH", 0x80808080, 0, 8 * offset + 20)
60
+ return (
61
+ sstruct.pack(Sill_hdr, self)
62
+ + grUtils.bininfo(len(self.langs))
63
+ + ldat
64
+ + fdat
65
+ )
66
+
67
+ def toXML(self, writer, ttFont):
68
+ writer.simpletag("version", version=self.version)
69
+ writer.newline()
70
+ for c, inf in sorted(self.langs.items()):
71
+ writer.begintag("lang", name=c)
72
+ writer.newline()
73
+ for fid, val in inf:
74
+ writer.simpletag("feature", fid=grUtils.num2tag(fid), val=val)
75
+ writer.newline()
76
+ writer.endtag("lang")
77
+ writer.newline()
78
+
79
+ def fromXML(self, name, attrs, content, ttFont):
80
+ if name == "version":
81
+ self.version = float(safeEval(attrs["version"]))
82
+ elif name == "lang":
83
+ c = attrs["name"]
84
+ self.langs[c] = []
85
+ for element in content:
86
+ if not isinstance(element, tuple):
87
+ continue
88
+ tag, a, subcontent = element
89
+ if tag == "feature":
90
+ self.langs[c].append(
91
+ (grUtils.tag2num(a["fid"]), int(safeEval(a["val"])))
92
+ )
@@ -0,0 +1,13 @@
1
+ """ TSI{B,C,D,J,P,S,V} are private tables used by Microsoft Visual TrueType (VTT)
2
+ tool to store its table source data.
3
+
4
+ TSIB contains the source text for the ``BASE`` table.
5
+
6
+ See also https://learn.microsoft.com/en-us/typography/tools/vtt/tsi-tables
7
+ """
8
+
9
+ from .T_S_I_V_ import table_T_S_I_V_
10
+
11
+
12
+ class table_T_S_I_B_(table_T_S_I_V_):
13
+ pass
@@ -0,0 +1,14 @@
1
+ """ TSI{B,C,D,J,P,S,V} are private tables used by Microsoft Visual TrueType (VTT)
2
+ tool to store its table source data.
3
+
4
+ TSIC contains the source text for the Variation CVT window and data for
5
+ the ``cvar`` table.
6
+
7
+ See also https://learn.microsoft.com/en-us/typography/tools/vtt/tsi-tables
8
+ """
9
+
10
+ from .otBase import BaseTTXConverter
11
+
12
+
13
+ class table_T_S_I_C_(BaseTTXConverter):
14
+ pass
@@ -0,0 +1,13 @@
1
+ """ TSI{B,C,D,J,P,S,V} are private tables used by Microsoft Visual TrueType (VTT)
2
+ tool to store its table source data.
3
+
4
+ TSID contains the source text for the ``GDEF`` table.
5
+
6
+ See also https://learn.microsoft.com/en-us/typography/tools/vtt/tsi-tables
7
+ """
8
+
9
+ from .T_S_I_V_ import table_T_S_I_V_
10
+
11
+
12
+ class table_T_S_I_D_(table_T_S_I_V_):
13
+ pass
@@ -0,0 +1,13 @@
1
+ """ TSI{B,C,D,J,P,S,V} are private tables used by Microsoft Visual TrueType (VTT)
2
+ tool to store its table source data.
3
+
4
+ TSIJ contains the source text for the ``JSTF`` table.
5
+
6
+ See also https://learn.microsoft.com/en-us/typography/tools/vtt/tsi-tables
7
+ """
8
+
9
+ from .T_S_I_V_ import table_T_S_I_V_
10
+
11
+
12
+ class table_T_S_I_J_(table_T_S_I_V_):
13
+ pass
@@ -0,0 +1,13 @@
1
+ """ TSI{B,C,D,J,P,S,V} are private tables used by Microsoft Visual TrueType (VTT)
2
+ tool to store its table source data.
3
+
4
+ TSIP contains the source text for the ``GPOS`` table.
5
+
6
+ See also https://learn.microsoft.com/en-us/typography/tools/vtt/tsi-tables
7
+ """
8
+
9
+ from .T_S_I_V_ import table_T_S_I_V_
10
+
11
+
12
+ class table_T_S_I_P_(table_T_S_I_V_):
13
+ pass
@@ -0,0 +1,13 @@
1
+ """ TSI{B,C,D,J,P,S,V} are private tables used by Microsoft Visual TrueType (VTT)
2
+ tool to store its table source data.
3
+
4
+ TSIS contains the source text for the ``GSUB`` table.
5
+
6
+ See also https://learn.microsoft.com/en-us/typography/tools/vtt/tsi-tables
7
+ """
8
+
9
+ from .T_S_I_V_ import table_T_S_I_V_
10
+
11
+
12
+ class table_T_S_I_S_(table_T_S_I_V_):
13
+ pass
@@ -0,0 +1,26 @@
1
+ """ TSI{B,C,D,J,P,S,V} are private tables used by Microsoft Visual TrueType (VTT)
2
+ tool to store its table source data.
3
+
4
+ See also https://learn.microsoft.com/en-us/typography/tools/vtt/tsi-tables
5
+ """
6
+
7
+ from fontTools.misc.textTools import strjoin, tobytes, tostr
8
+ from . import asciiTable
9
+
10
+
11
+ class table_T_S_I_V_(asciiTable.asciiTable):
12
+ def toXML(self, writer, ttFont):
13
+ data = tostr(self.data)
14
+ # removing null bytes. XXX needed??
15
+ data = data.split("\0")
16
+ data = strjoin(data)
17
+ writer.begintag("source")
18
+ writer.newline()
19
+ writer.write_noindent(data.replace("\r", "\n"))
20
+ writer.newline()
21
+ writer.endtag("source")
22
+ writer.newline()
23
+
24
+ def fromXML(self, name, attrs, content, ttFont):
25
+ lines = strjoin(content).split("\n")
26
+ self.data = tobytes("\r".join(lines[1:-1]))
@@ -0,0 +1,70 @@
1
+ """TSI{0,1,2,3,5} are private tables used by Microsoft Visual TrueType (VTT)
2
+ tool to store its hinting source data.
3
+
4
+ TSI0 is the index table containing the lengths and offsets for the glyph
5
+ programs and 'extra' programs ('fpgm', 'prep', and 'cvt') that are contained
6
+ in the TSI1 table.
7
+
8
+ See also https://learn.microsoft.com/en-us/typography/tools/vtt/tsi-tables
9
+ """
10
+
11
+ import logging
12
+ import struct
13
+
14
+ from . import DefaultTable
15
+
16
+ log = logging.getLogger(__name__)
17
+
18
+ tsi0Format = ">HHL"
19
+
20
+
21
+ def fixlongs(glyphID, textLength, textOffset):
22
+ return int(glyphID), int(textLength), textOffset
23
+
24
+
25
+ class table_T_S_I__0(DefaultTable.DefaultTable):
26
+ dependencies = ["TSI1"]
27
+
28
+ def decompile(self, data, ttFont):
29
+ numGlyphs = ttFont["maxp"].numGlyphs
30
+ indices = []
31
+ size = struct.calcsize(tsi0Format)
32
+ numEntries = len(data) // size
33
+ if numEntries != numGlyphs + 5:
34
+ diff = numEntries - numGlyphs - 5
35
+ log.warning(
36
+ "Number of glyphPrograms differs from the number of glyphs in the font "
37
+ f"by {abs(diff)} ({numEntries - 5} programs vs. {numGlyphs} glyphs)."
38
+ )
39
+ for _ in range(numEntries):
40
+ glyphID, textLength, textOffset = fixlongs(
41
+ *struct.unpack(tsi0Format, data[:size])
42
+ )
43
+ indices.append((glyphID, textLength, textOffset))
44
+ data = data[size:]
45
+ assert len(data) == 0
46
+ assert indices[-5] == (0xFFFE, 0, 0xABFC1F34), "bad magic number"
47
+ self.indices = indices[:-5]
48
+ self.extra_indices = indices[-4:]
49
+
50
+ def compile(self, ttFont):
51
+ if not hasattr(self, "indices"):
52
+ # We have no corresponding table (TSI1 or TSI3); let's return
53
+ # no data, which effectively means "ignore us".
54
+ return b""
55
+ data = b""
56
+ for index, textLength, textOffset in self.indices:
57
+ data = data + struct.pack(tsi0Format, index, textLength, textOffset)
58
+ data = data + struct.pack(tsi0Format, 0xFFFE, 0, 0xABFC1F34)
59
+ for index, textLength, textOffset in self.extra_indices:
60
+ data = data + struct.pack(tsi0Format, index, textLength, textOffset)
61
+ return data
62
+
63
+ def set(self, indices, extra_indices):
64
+ # gets called by 'TSI1' or 'TSI3'
65
+ self.indices = indices
66
+ self.extra_indices = extra_indices
67
+
68
+ def toXML(self, writer, ttFont):
69
+ writer.comment("This table will be calculated by the compiler")
70
+ writer.newline()
@@ -0,0 +1,163 @@
1
+ """ TSI{0,1,2,3,5} are private tables used by Microsoft Visual TrueType (VTT)
2
+ tool to store its hinting source data.
3
+
4
+ TSI1 contains the text of the glyph programs in the form of low-level assembly
5
+ code, as well as the 'extra' programs 'fpgm', 'ppgm' (i.e. 'prep'), and 'cvt'.
6
+
7
+ See also https://learn.microsoft.com/en-us/typography/tools/vtt/tsi-tables
8
+ """
9
+
10
+ from . import DefaultTable
11
+ from fontTools.misc.loggingTools import LogMixin
12
+ from fontTools.misc.textTools import strjoin, tobytes, tostr
13
+
14
+
15
+ class table_T_S_I__1(LogMixin, DefaultTable.DefaultTable):
16
+ extras = {0xFFFA: "ppgm", 0xFFFB: "cvt", 0xFFFC: "reserved", 0xFFFD: "fpgm"}
17
+
18
+ indextable = "TSI0"
19
+
20
+ def decompile(self, data, ttFont):
21
+ totalLength = len(data)
22
+ indextable = ttFont[self.indextable]
23
+ for indices, isExtra in zip(
24
+ (indextable.indices, indextable.extra_indices), (False, True)
25
+ ):
26
+ programs = {}
27
+ for i, (glyphID, textLength, textOffset) in enumerate(indices):
28
+ if isExtra:
29
+ name = self.extras[glyphID]
30
+ else:
31
+ name = ttFont.getGlyphName(glyphID)
32
+ if textOffset > totalLength:
33
+ self.log.warning("textOffset > totalLength; %r skipped" % name)
34
+ continue
35
+ if textLength < 0x8000:
36
+ # If the length stored in the record is less than 32768, then use
37
+ # that as the length of the record.
38
+ pass
39
+ elif textLength == 0x8000:
40
+ # If the length is 32768, compute the actual length as follows:
41
+ isLast = i == (len(indices) - 1)
42
+ if isLast:
43
+ if isExtra:
44
+ # For the last "extra" record (the very last record of the
45
+ # table), the length is the difference between the total
46
+ # length of the TSI1 table and the textOffset of the final
47
+ # record.
48
+ nextTextOffset = totalLength
49
+ else:
50
+ # For the last "normal" record (the last record just prior
51
+ # to the record containing the "magic number"), the length
52
+ # is the difference between the textOffset of the record
53
+ # following the "magic number" (0xFFFE) record (i.e. the
54
+ # first "extra" record), and the textOffset of the last
55
+ # "normal" record.
56
+ nextTextOffset = indextable.extra_indices[0][2]
57
+ else:
58
+ # For all other records with a length of 0x8000, the length is
59
+ # the difference between the textOffset of the record in
60
+ # question and the textOffset of the next record.
61
+ nextTextOffset = indices[i + 1][2]
62
+ assert nextTextOffset >= textOffset, "entries not sorted by offset"
63
+ if nextTextOffset > totalLength:
64
+ self.log.warning(
65
+ "nextTextOffset > totalLength; %r truncated" % name
66
+ )
67
+ nextTextOffset = totalLength
68
+ textLength = nextTextOffset - textOffset
69
+ else:
70
+ from fontTools import ttLib
71
+
72
+ raise ttLib.TTLibError(
73
+ "%r textLength (%d) must not be > 32768" % (name, textLength)
74
+ )
75
+ text = data[textOffset : textOffset + textLength]
76
+ assert len(text) == textLength
77
+ text = tostr(text, encoding="utf-8")
78
+ if text:
79
+ programs[name] = text
80
+ if isExtra:
81
+ self.extraPrograms = programs
82
+ else:
83
+ self.glyphPrograms = programs
84
+
85
+ def compile(self, ttFont):
86
+ if not hasattr(self, "glyphPrograms"):
87
+ self.glyphPrograms = {}
88
+ self.extraPrograms = {}
89
+ data = b""
90
+ indextable = ttFont[self.indextable]
91
+ glyphNames = ttFont.getGlyphOrder()
92
+
93
+ indices = []
94
+ for i, name in enumerate(glyphNames):
95
+ if len(data) % 2:
96
+ data = (
97
+ data + b"\015"
98
+ ) # align on 2-byte boundaries, fill with return chars. Yum.
99
+ if name in self.glyphPrograms:
100
+ text = tobytes(self.glyphPrograms[name], encoding="utf-8")
101
+ else:
102
+ text = b""
103
+ textLength = len(text)
104
+ if textLength >= 0x8000:
105
+ textLength = 0x8000
106
+ indices.append((i, textLength, len(data)))
107
+ data = data + text
108
+
109
+ extra_indices = []
110
+ for code, name in sorted(self.extras.items()):
111
+ if len(data) % 2:
112
+ data = (
113
+ data + b"\015"
114
+ ) # align on 2-byte boundaries, fill with return chars.
115
+ if name in self.extraPrograms:
116
+ text = tobytes(self.extraPrograms[name], encoding="utf-8")
117
+ else:
118
+ text = b""
119
+ textLength = len(text)
120
+ if textLength >= 0x8000:
121
+ textLength = 0x8000
122
+ extra_indices.append((code, textLength, len(data)))
123
+ data = data + text
124
+ indextable.set(indices, extra_indices)
125
+ return data
126
+
127
+ def toXML(self, writer, ttFont):
128
+ names = sorted(self.glyphPrograms.keys())
129
+ writer.newline()
130
+ for name in names:
131
+ text = self.glyphPrograms[name]
132
+ if not text:
133
+ continue
134
+ writer.begintag("glyphProgram", name=name)
135
+ writer.newline()
136
+ writer.write_noindent(text.replace("\r", "\n"))
137
+ writer.newline()
138
+ writer.endtag("glyphProgram")
139
+ writer.newline()
140
+ writer.newline()
141
+ extra_names = sorted(self.extraPrograms.keys())
142
+ for name in extra_names:
143
+ text = self.extraPrograms[name]
144
+ if not text:
145
+ continue
146
+ writer.begintag("extraProgram", name=name)
147
+ writer.newline()
148
+ writer.write_noindent(text.replace("\r", "\n"))
149
+ writer.newline()
150
+ writer.endtag("extraProgram")
151
+ writer.newline()
152
+ writer.newline()
153
+
154
+ def fromXML(self, name, attrs, content, ttFont):
155
+ if not hasattr(self, "glyphPrograms"):
156
+ self.glyphPrograms = {}
157
+ self.extraPrograms = {}
158
+ lines = strjoin(content).replace("\r", "\n").split("\n")
159
+ text = "\r".join(lines[1:-1])
160
+ if name == "glyphProgram":
161
+ self.glyphPrograms[attrs["name"]] = text
162
+ elif name == "extraProgram":
163
+ self.extraPrograms[attrs["name"]] = text
@@ -0,0 +1,17 @@
1
+ """ TSI{0,1,2,3,5} are private tables used by Microsoft Visual TrueType (VTT)
2
+ tool to store its hinting source data.
3
+
4
+ TSI2 is the index table containing the lengths and offsets for the glyph
5
+ programs that are contained in the TSI3 table. It uses the same format as
6
+ the TSI0 table.
7
+
8
+ See also https://learn.microsoft.com/en-us/typography/tools/vtt/tsi-tables
9
+ """
10
+
11
+ from fontTools import ttLib
12
+
13
+ superclass = ttLib.getTableClass("TSI0")
14
+
15
+
16
+ class table_T_S_I__2(superclass):
17
+ dependencies = ["TSI3"]
@@ -0,0 +1,22 @@
1
+ """ TSI{0,1,2,3,5} are private tables used by Microsoft Visual TrueType (VTT)
2
+ tool to store its hinting source data.
3
+
4
+ TSI3 contains the text of the glyph programs in the form of 'VTTTalk' code.
5
+
6
+ See also https://learn.microsoft.com/en-us/typography/tools/vtt/tsi-tables
7
+ """
8
+
9
+ from fontTools import ttLib
10
+
11
+ superclass = ttLib.getTableClass("TSI1")
12
+
13
+
14
+ class table_T_S_I__3(superclass):
15
+ extras = {
16
+ 0xFFFA: "reserved0",
17
+ 0xFFFB: "reserved1",
18
+ 0xFFFC: "reserved2",
19
+ 0xFFFD: "reserved3",
20
+ }
21
+
22
+ indextable = "TSI2"
@@ -0,0 +1,60 @@
1
+ """TSI{0,1,2,3,5} are private tables used by Microsoft Visual TrueType (VTT)
2
+ tool to store its hinting source data.
3
+
4
+ TSI5 contains the VTT character groups.
5
+
6
+ See also https://learn.microsoft.com/en-us/typography/tools/vtt/tsi-tables
7
+ """
8
+
9
+ import array
10
+ import logging
11
+ import sys
12
+
13
+ from fontTools.misc.textTools import safeEval
14
+
15
+ from . import DefaultTable
16
+
17
+ log = logging.getLogger(__name__)
18
+
19
+
20
+ class table_T_S_I__5(DefaultTable.DefaultTable):
21
+ def decompile(self, data, ttFont):
22
+ numGlyphs = ttFont["maxp"].numGlyphs
23
+ a = array.array("H")
24
+ a.frombytes(data)
25
+ if sys.byteorder != "big":
26
+ a.byteswap()
27
+ self.glyphGrouping = {}
28
+ numEntries = len(data) // 2
29
+ if numEntries != numGlyphs:
30
+ diff = numEntries - numGlyphs
31
+ log.warning(
32
+ "Number of entries differs from the number of glyphs in the font "
33
+ f"by {abs(diff)} ({numEntries} entries vs. {numGlyphs} glyphs)."
34
+ )
35
+ for i in range(numEntries):
36
+ self.glyphGrouping[ttFont.getGlyphName(i)] = a[i]
37
+
38
+ def compile(self, ttFont):
39
+ glyphNames = ttFont.getGlyphOrder()
40
+ a = array.array("H")
41
+ for glyphName in glyphNames:
42
+ a.append(self.glyphGrouping.get(glyphName, 0))
43
+ if sys.byteorder != "big":
44
+ a.byteswap()
45
+ return a.tobytes()
46
+
47
+ def toXML(self, writer, ttFont):
48
+ names = sorted(self.glyphGrouping.keys())
49
+ for glyphName in names:
50
+ writer.simpletag(
51
+ "glyphgroup", name=glyphName, value=self.glyphGrouping[glyphName]
52
+ )
53
+ writer.newline()
54
+
55
+ def fromXML(self, name, attrs, content, ttFont):
56
+ if not hasattr(self, "glyphGrouping"):
57
+ self.glyphGrouping = {}
58
+ if name != "glyphgroup":
59
+ return
60
+ self.glyphGrouping[attrs["name"]] = safeEval(attrs["value"])
@@ -0,0 +1,14 @@
1
+ from . import asciiTable
2
+
3
+
4
+ class table_T_T_F_A_(asciiTable.asciiTable):
5
+ """ttfautohint parameters table
6
+
7
+ The ``TTFA`` table is used by the free-software `ttfautohint` program
8
+ to record the parameters that `ttfautohint` was called with when it
9
+ was used to auto-hint the font.
10
+
11
+ See also http://freetype.org/ttfautohint/doc/ttfautohint.html#miscellaneous-1
12
+ """
13
+
14
+ pass