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,141 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Optional
4
+
5
+ from fontTools.annotations import KerningPair, KerningDict, KerningGroups, IntFloat
6
+
7
+ StrDict = dict[str, str]
8
+
9
+
10
+ def lookupKerningValue(
11
+ pair: KerningPair,
12
+ kerning: KerningDict,
13
+ groups: KerningGroups,
14
+ fallback: IntFloat = 0,
15
+ glyphToFirstGroup: Optional[StrDict] = None,
16
+ glyphToSecondGroup: Optional[StrDict] = None,
17
+ ) -> IntFloat:
18
+ """Retrieve the kerning value (if any) between a pair of elements.
19
+
20
+ The elments can be either individual glyphs (by name) or kerning
21
+ groups (by name), or any combination of the two.
22
+
23
+ Args:
24
+ pair:
25
+ A tuple, in logical order (first, second) with respect
26
+ to the reading direction, to query the font for kerning
27
+ information on. Each element in the tuple can be either
28
+ a glyph name or a kerning group name.
29
+ kerning:
30
+ A dictionary of kerning pairs.
31
+ groups:
32
+ A set of kerning groups.
33
+ fallback:
34
+ The fallback value to return if no kern is found between
35
+ the elements in ``pair``. Defaults to 0.
36
+ glyphToFirstGroup:
37
+ A dictionary mapping glyph names to the first-glyph kerning
38
+ groups to which they belong. Defaults to ``None``.
39
+ glyphToSecondGroup:
40
+ A dictionary mapping glyph names to the second-glyph kerning
41
+ groups to which they belong. Defaults to ``None``.
42
+
43
+ Returns:
44
+ The kerning value between the element pair. If no kerning for
45
+ the pair is found, the fallback value is returned.
46
+
47
+ Note: This function expects the ``kerning`` argument to be a flat
48
+ dictionary of kerning pairs, not the nested structure used in a
49
+ kerning.plist file.
50
+
51
+ Examples::
52
+
53
+ >>> groups = {
54
+ ... "public.kern1.O" : ["O", "D", "Q"],
55
+ ... "public.kern2.E" : ["E", "F"]
56
+ ... }
57
+ >>> kerning = {
58
+ ... ("public.kern1.O", "public.kern2.E") : -100,
59
+ ... ("public.kern1.O", "F") : -200,
60
+ ... ("D", "F") : -300
61
+ ... }
62
+ >>> lookupKerningValue(("D", "F"), kerning, groups)
63
+ -300
64
+ >>> lookupKerningValue(("O", "F"), kerning, groups)
65
+ -200
66
+ >>> lookupKerningValue(("O", "E"), kerning, groups)
67
+ -100
68
+ >>> lookupKerningValue(("O", "O"), kerning, groups)
69
+ 0
70
+ >>> lookupKerningValue(("E", "E"), kerning, groups)
71
+ 0
72
+ >>> lookupKerningValue(("E", "O"), kerning, groups)
73
+ 0
74
+ >>> lookupKerningValue(("X", "X"), kerning, groups)
75
+ 0
76
+ >>> lookupKerningValue(("public.kern1.O", "public.kern2.E"),
77
+ ... kerning, groups)
78
+ -100
79
+ >>> lookupKerningValue(("public.kern1.O", "F"), kerning, groups)
80
+ -200
81
+ >>> lookupKerningValue(("O", "public.kern2.E"), kerning, groups)
82
+ -100
83
+ >>> lookupKerningValue(("public.kern1.X", "public.kern2.X"), kerning, groups)
84
+ 0
85
+ """
86
+ # quickly check to see if the pair is in the kerning dictionary
87
+ if pair in kerning:
88
+ return kerning[pair]
89
+ # ensure both or no glyph-to-group mappings are provided
90
+ if (glyphToFirstGroup is None) != (glyphToSecondGroup is None):
91
+ raise ValueError(
92
+ "Must provide both 'glyphToFirstGroup' and 'glyphToSecondGroup', or neither."
93
+ )
94
+ # create glyph to group mapping
95
+ if glyphToFirstGroup is None:
96
+ glyphToFirstGroup = {}
97
+ glyphToSecondGroup = {}
98
+ for group, groupMembers in groups.items():
99
+ if group.startswith("public.kern1."):
100
+ for glyph in groupMembers:
101
+ glyphToFirstGroup[glyph] = group
102
+ elif group.startswith("public.kern2."):
103
+ for glyph in groupMembers:
104
+ glyphToSecondGroup[glyph] = group
105
+ # ensure type safety for mappings
106
+ assert glyphToFirstGroup is not None
107
+ assert glyphToSecondGroup is not None
108
+ # get group names and make sure first and second are glyph names
109
+ first, second = pair
110
+ firstGroup = secondGroup = None
111
+ if first.startswith("public.kern1."):
112
+ firstGroup = first
113
+ firstGlyph = None
114
+ else:
115
+ firstGroup = glyphToFirstGroup.get(first)
116
+ firstGlyph = first
117
+ if second.startswith("public.kern2."):
118
+ secondGroup = second
119
+ secondGlyph = None
120
+ else:
121
+ secondGroup = glyphToSecondGroup.get(second)
122
+ secondGlyph = second
123
+ # make an ordered list of pairs to look up
124
+ pairs = [
125
+ (a, b)
126
+ for a in (firstGlyph, firstGroup)
127
+ for b in (secondGlyph, secondGroup)
128
+ if a is not None and b is not None
129
+ ]
130
+ # look up the pairs and return any matches
131
+ for pair in pairs:
132
+ if pair in kerning:
133
+ return kerning[pair]
134
+ # use the fallback value
135
+ return fallback
136
+
137
+
138
+ if __name__ == "__main__":
139
+ import doctest
140
+
141
+ doctest.testmod()
@@ -0,0 +1,47 @@
1
+ """DEPRECATED - This module is kept here only as a backward compatibility shim
2
+ for the old `ufoLib.plistlib` module, which was moved to :class:`fontTools.misc.plistlib`.
3
+ Please use the latter instead.
4
+ """
5
+
6
+ from fontTools.misc.plistlib import dump, dumps, load, loads
7
+ from fontTools.misc.textTools import tobytes
8
+
9
+ # The following functions were part of the old py2-like ufoLib.plistlib API.
10
+ # They are kept only for backward compatiblity.
11
+ from fontTools.ufoLib.utils import deprecated
12
+
13
+
14
+ @deprecated("Use 'fontTools.misc.plistlib.load' instead")
15
+ def readPlist(path_or_file):
16
+ did_open = False
17
+ if isinstance(path_or_file, str):
18
+ path_or_file = open(path_or_file, "rb")
19
+ did_open = True
20
+ try:
21
+ return load(path_or_file, use_builtin_types=False)
22
+ finally:
23
+ if did_open:
24
+ path_or_file.close()
25
+
26
+
27
+ @deprecated("Use 'fontTools.misc.plistlib.dump' instead")
28
+ def writePlist(value, path_or_file):
29
+ did_open = False
30
+ if isinstance(path_or_file, str):
31
+ path_or_file = open(path_or_file, "wb")
32
+ did_open = True
33
+ try:
34
+ dump(value, path_or_file, use_builtin_types=False)
35
+ finally:
36
+ if did_open:
37
+ path_or_file.close()
38
+
39
+
40
+ @deprecated("Use 'fontTools.misc.plistlib.loads' instead")
41
+ def readPlistFromString(data):
42
+ return loads(tobytes(data, encoding="utf-8"), use_builtin_types=False)
43
+
44
+
45
+ @deprecated("Use 'fontTools.misc.plistlib.dumps' instead")
46
+ def writePlistToString(value):
47
+ return dumps(value, use_builtin_types=False)
@@ -0,0 +1,6 @@
1
+ """DEPRECATED - This module is kept here only as a backward compatibility shim
2
+ for the old `ufoLib.pointPen` module, which was moved to :class:`fontTools.pens.pointPen`.
3
+ Please use the latter instead.
4
+ """
5
+
6
+ from fontTools.pens.pointPen import *
@@ -0,0 +1,107 @@
1
+ """This module contains miscellaneous helpers.
2
+
3
+ It is not considered part of the public ufoLib API. It does, however,
4
+ define the :py:obj:`.deprecated` decorator that is used elsewhere in
5
+ the module.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from typing import Optional, Type, TypeVar, Union, cast
11
+ from collections.abc import Callable
12
+ import enum
13
+ import functools
14
+ import warnings
15
+
16
+ F = TypeVar("F", bound=Callable[..., object])
17
+ FormatVersion = TypeVar("FormatVersion", bound="BaseFormatVersion")
18
+ FormatVersionInput = Optional[Union[int, tuple[int, int], FormatVersion]]
19
+
20
+ numberTypes = (int, float)
21
+
22
+
23
+ def deprecated(msg: str = "") -> Callable[[F], F]:
24
+ """Decorator factory to mark functions as deprecated with given message.
25
+
26
+ >>> @deprecated("Enough!")
27
+ ... def some_function():
28
+ ... "I just print 'hello world'."
29
+ ... print("hello world")
30
+ >>> some_function()
31
+ hello world
32
+ >>> some_function.__doc__ == "I just print 'hello world'."
33
+ True
34
+ """
35
+
36
+ def deprecated_decorator(func: F) -> F:
37
+ @functools.wraps(func)
38
+ def wrapper(*args, **kwargs):
39
+ warnings.warn(
40
+ f"{func.__name__} function is a deprecated. {msg}",
41
+ category=DeprecationWarning,
42
+ stacklevel=2,
43
+ )
44
+ return func(*args, **kwargs)
45
+
46
+ return cast(F, wrapper)
47
+
48
+ return deprecated_decorator
49
+
50
+
51
+ def normalizeFormatVersion(
52
+ value: FormatVersionInput, cls: Type[FormatVersion]
53
+ ) -> FormatVersion:
54
+ # Needed for type safety of UFOFormatVersion and GLIFFormatVersion input
55
+ if value is None:
56
+ return cls.default()
57
+ if isinstance(value, cls):
58
+ return value
59
+ if isinstance(value, int):
60
+ return cls((value, 0))
61
+ if isinstance(value, tuple) and len(value) == 2:
62
+ return cls(value)
63
+ raise ValueError(f"Unsupported format version: {value!r}")
64
+
65
+
66
+ # Base class for UFOFormatVersion and GLIFFormatVersion
67
+ class BaseFormatVersion(tuple[int, int], enum.Enum):
68
+ value: tuple[int, int]
69
+
70
+ def __new__(cls: Type[FormatVersion], value: tuple[int, int]) -> BaseFormatVersion:
71
+ return super().__new__(cls, value)
72
+
73
+ @property
74
+ def major(self) -> int:
75
+ return self.value[0]
76
+
77
+ @property
78
+ def minor(self) -> int:
79
+ return self.value[1]
80
+
81
+ @classmethod
82
+ def _missing_(cls, value: object) -> BaseFormatVersion:
83
+ # allow to initialize a version enum from a single (major) integer
84
+ if isinstance(value, int):
85
+ return cls((value, 0))
86
+ # or from None to obtain the current default version
87
+ if value is None:
88
+ return cls.default()
89
+ raise ValueError(f"{value!r} is not a valid {cls.__name__}")
90
+
91
+ def __str__(self) -> str:
92
+ return f"{self.major}.{self.minor}"
93
+
94
+ @classmethod
95
+ def default(cls: Type[FormatVersion]) -> FormatVersion:
96
+ # get the latest defined version (i.e. the max of all versions)
97
+ return max(cls.__members__.values())
98
+
99
+ @classmethod
100
+ def supported_versions(cls: Type[FormatVersion]) -> frozenset[FormatVersion]:
101
+ return frozenset(cls.__members__.values())
102
+
103
+
104
+ if __name__ == "__main__":
105
+ import doctest
106
+
107
+ doctest.testmod()