fonttools 4.55.2__cp313-cp313-win_amd64.whl → 4.55.4__cp313-cp313-win_amd64.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.

Potentially problematic release.


This version of fonttools might be problematic. Click here for more details.

Files changed (104) hide show
  1. fontTools/__init__.py +1 -1
  2. fontTools/cu2qu/cu2qu.cp313-win_amd64.pyd +0 -0
  3. fontTools/feaLib/ast.py +2 -2
  4. fontTools/feaLib/builder.py +22 -3
  5. fontTools/feaLib/lexer.cp313-win_amd64.pyd +0 -0
  6. fontTools/misc/bezierTools.c +3256 -2972
  7. fontTools/misc/bezierTools.cp313-win_amd64.pyd +0 -0
  8. fontTools/misc/bezierTools.py +8 -1
  9. fontTools/misc/transform.py +13 -15
  10. fontTools/otlLib/builder.py +17 -0
  11. fontTools/pens/momentsPen.cp313-win_amd64.pyd +0 -0
  12. fontTools/pens/statisticsPen.py +5 -0
  13. fontTools/qu2cu/qu2cu.cp313-win_amd64.pyd +0 -0
  14. fontTools/ttLib/tables/B_A_S_E_.py +9 -0
  15. fontTools/ttLib/tables/C_B_D_T_.py +10 -0
  16. fontTools/ttLib/tables/C_B_L_C_.py +10 -0
  17. fontTools/ttLib/tables/C_F_F_.py +15 -0
  18. fontTools/ttLib/tables/C_F_F__2.py +13 -0
  19. fontTools/ttLib/tables/C_O_L_R_.py +9 -1
  20. fontTools/ttLib/tables/C_P_A_L_.py +9 -0
  21. fontTools/ttLib/tables/D_S_I_G_.py +7 -0
  22. fontTools/ttLib/tables/E_B_D_T_.py +8 -0
  23. fontTools/ttLib/tables/E_B_L_C_.py +8 -0
  24. fontTools/ttLib/tables/F_F_T_M_.py +10 -0
  25. fontTools/ttLib/tables/F__e_a_t.py +7 -2
  26. fontTools/ttLib/tables/G_D_E_F_.py +8 -0
  27. fontTools/ttLib/tables/G_M_A_P_.py +7 -0
  28. fontTools/ttLib/tables/G_P_K_G_.py +7 -0
  29. fontTools/ttLib/tables/G_P_O_S_.py +9 -0
  30. fontTools/ttLib/tables/G_S_U_B_.py +8 -0
  31. fontTools/ttLib/tables/G__l_a_t.py +3 -2
  32. fontTools/ttLib/tables/G__l_o_c.py +3 -2
  33. fontTools/ttLib/tables/H_V_A_R_.py +8 -0
  34. fontTools/ttLib/tables/J_S_T_F_.py +8 -0
  35. fontTools/ttLib/tables/L_T_S_H_.py +10 -0
  36. fontTools/ttLib/tables/M_A_T_H_.py +8 -0
  37. fontTools/ttLib/tables/M_E_T_A_.py +7 -0
  38. fontTools/ttLib/tables/M_V_A_R_.py +8 -0
  39. fontTools/ttLib/tables/O_S_2f_2.py +8 -1
  40. fontTools/ttLib/tables/S_I_N_G_.py +7 -0
  41. fontTools/ttLib/tables/S_T_A_T_.py +10 -0
  42. fontTools/ttLib/tables/S_V_G_.py +8 -0
  43. fontTools/ttLib/tables/S__i_l_f.py +4 -1
  44. fontTools/ttLib/tables/S__i_l_l.py +5 -0
  45. fontTools/ttLib/tables/T_S_I_B_.py +8 -0
  46. fontTools/ttLib/tables/T_S_I_C_.py +9 -0
  47. fontTools/ttLib/tables/T_S_I_D_.py +8 -0
  48. fontTools/ttLib/tables/T_S_I_J_.py +8 -0
  49. fontTools/ttLib/tables/T_S_I_P_.py +8 -0
  50. fontTools/ttLib/tables/T_S_I_S_.py +8 -0
  51. fontTools/ttLib/tables/T_S_I_V_.py +6 -0
  52. fontTools/ttLib/tables/T_S_I__0.py +2 -0
  53. fontTools/ttLib/tables/T_S_I__1.py +2 -0
  54. fontTools/ttLib/tables/T_S_I__2.py +2 -0
  55. fontTools/ttLib/tables/T_S_I__3.py +2 -0
  56. fontTools/ttLib/tables/T_S_I__5.py +2 -0
  57. fontTools/ttLib/tables/T_T_F_A_.py +9 -0
  58. fontTools/ttLib/tables/V_A_R_C_.py +7 -0
  59. fontTools/ttLib/tables/V_D_M_X_.py +8 -0
  60. fontTools/ttLib/tables/V_O_R_G_.py +8 -1
  61. fontTools/ttLib/tables/V_V_A_R_.py +8 -0
  62. fontTools/ttLib/tables/_a_n_k_r.py +3 -2
  63. fontTools/ttLib/tables/_a_v_a_r.py +3 -1
  64. fontTools/ttLib/tables/_b_s_l_n.py +9 -0
  65. fontTools/ttLib/tables/_c_i_d_g.py +7 -2
  66. fontTools/ttLib/tables/_c_m_a_p.py +2 -0
  67. fontTools/ttLib/tables/_c_v_a_r.py +8 -0
  68. fontTools/ttLib/tables/_c_v_t.py +8 -0
  69. fontTools/ttLib/tables/_f_e_a_t.py +7 -4
  70. fontTools/ttLib/tables/_f_p_g_m.py +11 -0
  71. fontTools/ttLib/tables/_f_v_a_r.py +8 -0
  72. fontTools/ttLib/tables/_g_a_s_p.py +8 -0
  73. fontTools/ttLib/tables/_g_c_i_d.py +7 -0
  74. fontTools/ttLib/tables/_g_l_y_f.py +1 -1
  75. fontTools/ttLib/tables/_g_v_a_r.py +11 -3
  76. fontTools/ttLib/tables/_h_d_m_x.py +8 -0
  77. fontTools/ttLib/tables/_h_e_a_d.py +7 -0
  78. fontTools/ttLib/tables/_h_h_e_a.py +12 -0
  79. fontTools/ttLib/tables/_h_m_t_x.py +9 -0
  80. fontTools/ttLib/tables/_k_e_r_n.py +11 -0
  81. fontTools/ttLib/tables/_l_c_a_r.py +8 -0
  82. fontTools/ttLib/tables/_l_o_c_a.py +8 -0
  83. fontTools/ttLib/tables/_l_t_a_g.py +8 -0
  84. fontTools/ttLib/tables/_m_a_x_p.py +8 -0
  85. fontTools/ttLib/tables/_m_e_t_a.py +8 -0
  86. fontTools/ttLib/tables/_m_o_r_t.py +8 -0
  87. fontTools/ttLib/tables/_m_o_r_x.py +9 -0
  88. fontTools/ttLib/tables/_n_a_m_e.py +15 -13
  89. fontTools/ttLib/tables/_o_p_b_d.py +8 -0
  90. fontTools/ttLib/tables/_p_o_s_t.py +9 -0
  91. fontTools/ttLib/tables/_p_r_e_p.py +9 -0
  92. fontTools/ttLib/tables/_p_r_o_p.py +6 -0
  93. fontTools/ttLib/tables/_s_b_i_x.py +10 -0
  94. fontTools/ttLib/tables/_t_r_a_k.py +7 -0
  95. fontTools/ttLib/tables/_v_h_e_a.py +12 -0
  96. fontTools/ttLib/tables/_v_m_t_x.py +9 -0
  97. fontTools/varLib/iup.cp313-win_amd64.pyd +0 -0
  98. {fonttools-4.55.2.dist-info → fonttools-4.55.4.dist-info}/METADATA +27 -3
  99. {fonttools-4.55.2.dist-info → fonttools-4.55.4.dist-info}/RECORD +104 -104
  100. {fonttools-4.55.2.dist-info → fonttools-4.55.4.dist-info}/WHEEL +1 -1
  101. {fonttools-4.55.2.data → fonttools-4.55.4.data}/data/share/man/man1/ttx.1 +0 -0
  102. {fonttools-4.55.2.dist-info → fonttools-4.55.4.dist-info}/LICENSE +0 -0
  103. {fonttools-4.55.2.dist-info → fonttools-4.55.4.dist-info}/entry_points.txt +0 -0
  104. {fonttools-4.55.2.dist-info → fonttools-4.55.4.dist-info}/top_level.txt +0 -0
fontTools/__init__.py CHANGED
@@ -3,6 +3,6 @@ from fontTools.misc.loggingTools import configLogger
3
3
 
4
4
  log = logging.getLogger(__name__)
5
5
 
6
- version = __version__ = "4.55.2"
6
+ version = __version__ = "4.55.4"
7
7
 
8
8
  __all__ = ["version", "log", "configLogger"]
Binary file
fontTools/feaLib/ast.py CHANGED
@@ -595,8 +595,8 @@ class MarkClassDefinition(Statement):
595
595
  class AlternateSubstStatement(Statement):
596
596
  """A ``sub ... from ...`` statement.
597
597
 
598
- ``prefix``, ``glyph``, ``suffix`` and ``replacement`` should be lists of
599
- `glyph-containing objects`_. ``glyph`` should be a `one element list`."""
598
+ ``glyph`` and ``replacement`` should be `glyph-containing objects`_.
599
+ ``prefix`` and ``suffix`` should be lists of `glyph-containing objects`_."""
600
600
 
601
601
  def __init__(self, prefix, glyph, suffix, replacement, location=None):
602
602
  Statement.__init__(self, location)
@@ -1328,9 +1328,10 @@ class Builder(object):
1328
1328
  self, location, prefix, glyphs, suffix, replacement, forceChain
1329
1329
  ):
1330
1330
  if prefix or suffix or forceChain:
1331
- chain = self.get_lookup_(location, ChainContextSubstBuilder)
1332
- lookup = self.get_chained_lookup_(location, LigatureSubstBuilder)
1333
- chain.rules.append(ChainContextualRule(prefix, glyphs, suffix, [lookup]))
1331
+ self.add_ligature_subst_chained_(
1332
+ location, prefix, glyphs, suffix, replacement
1333
+ )
1334
+ return
1334
1335
  else:
1335
1336
  lookup = self.get_lookup_(location, LigatureSubstBuilder)
1336
1337
 
@@ -1387,6 +1388,24 @@ class Builder(object):
1387
1388
  sub.mapping[glyph] = replacements
1388
1389
  chain.rules.append(ChainContextualRule(prefix, [{glyph}], suffix, [sub]))
1389
1390
 
1391
+ def add_ligature_subst_chained_(
1392
+ self, location, prefix, glyphs, suffix, replacement
1393
+ ):
1394
+ # https://github.com/fonttools/fonttools/issues/3701
1395
+ if not all(prefix) or not all(suffix):
1396
+ raise FeatureLibError(
1397
+ "Empty glyph class in contextual substitution", location
1398
+ )
1399
+ chain = self.get_lookup_(location, ChainContextSubstBuilder)
1400
+ sub = chain.find_chainable_ligature_subst(glyphs, replacement)
1401
+ if sub is None:
1402
+ sub = self.get_chained_lookup_(location, LigatureSubstBuilder)
1403
+
1404
+ for g in itertools.product(*glyphs):
1405
+ sub.ligatures[g] = replacement
1406
+
1407
+ chain.rules.append(ChainContextualRule(prefix, glyphs, suffix, [sub]))
1408
+
1390
1409
  # GSUB 8
1391
1410
  def add_reverse_chain_single_subst(self, location, old_prefix, old_suffix, mapping):
1392
1411
  if not mapping:
Binary file