fonttools 4.60.0__cp314-cp314t-musllinux_1_2_aarch64.whl → 4.60.1__cp314-cp314t-musllinux_1_2_aarch64.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.

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.60.0"
6
+ version = __version__ = "4.60.1"
7
7
 
8
8
  __all__ = ["version", "log", "configLogger"]
fontTools/misc/visitor.py CHANGED
@@ -79,12 +79,15 @@ class Visitor(object):
79
79
  def visitObject(self, obj, *args, **kwargs):
80
80
  """Called to visit an object. This function loops over all non-private
81
81
  attributes of the objects and calls any user-registered (via
82
- @register_attr() or @register_attrs()) visit() functions.
82
+ ``@register_attr()`` or ``@register_attrs()``) ``visit()`` functions.
83
83
 
84
- If there is no user-registered visit function, of if there is and it
85
- returns True, or it returns None (or doesn't return anything) and
86
- visitor.defaultStop is False (default), then the visitor will proceed
87
- to call self.visitAttr()"""
84
+ The visitor will proceed to call ``self.visitAttr()``, unless there is a
85
+ user-registered visit function and:
86
+
87
+ * It returns ``False``; or
88
+ * It returns ``None`` (or doesn't return anything) and
89
+ ``visitor.defaultStop`` is ``True`` (non-default).
90
+ """
88
91
 
89
92
  keys = sorted(vars(obj).keys())
90
93
  _visitors = self._visitorsFor(obj)
@@ -121,19 +124,24 @@ class Visitor(object):
121
124
 
122
125
  def visit(self, obj, *args, **kwargs):
123
126
  """This is the main entry to the visitor. The visitor will visit object
124
- obj.
127
+ ``obj``.
125
128
 
126
129
  The visitor will first determine if there is a registered (via
127
- @register()) visit function for the type of object. If there is, it
128
- will be called, and (visitor, obj, *args, **kwargs) will be passed to
129
- the user visit function.
130
-
131
- If there is no user-registered visit function, of if there is and it
132
- returns True, or it returns None (or doesn't return anything) and
133
- visitor.defaultStop is False (default), then the visitor will proceed
134
- to dispatch to one of self.visitObject(), self.visitList(),
135
- self.visitDict(), or self.visitLeaf() (any of which can be overriden in
136
- a subclass)."""
130
+ ``@register()``) visit function for the type of object. If there is, it
131
+ will be called, and ``(visitor, obj, *args, **kwargs)`` will be passed
132
+ to the user visit function.
133
+
134
+ The visitor will not recurse if there is a user-registered visit
135
+ function and:
136
+
137
+ * It returns ``False``; or
138
+ * It returns ``None`` (or doesn't return anything) and
139
+ ``visitor.defaultStop`` is ``True`` (non-default)
140
+
141
+ Otherwise, the visitor will proceed to dispatch to one of
142
+ ``self.visitObject()``, ``self.visitList()``, ``self.visitDict()``, or
143
+ ``self.visitLeaf()`` (any of which can be overriden in a subclass).
144
+ """
137
145
 
138
146
  visitorFunc = self._visitorsFor(obj).get(None, None)
139
147
  if visitorFunc is not None:
@@ -272,7 +272,7 @@ Font table options
272
272
  Specify (=), add to (+=) or exclude from (-=) the comma-separated
273
273
  set of tables that will be be dropped.
274
274
  By default, the following tables are dropped:
275
- 'BASE', 'JSTF', 'DSIG', 'EBDT', 'EBLC', 'EBSC', 'PCLT', 'LTSH'
275
+ 'JSTF', 'DSIG', 'EBDT', 'EBLC', 'EBSC', 'PCLT', 'LTSH'
276
276
  and Graphite tables: 'Feat', 'Glat', 'Gloc', 'Silf', 'Sill'.
277
277
  The tool will attempt to subset the remaining tables.
278
278
 
@@ -827,13 +827,26 @@ def subset_glyphs(self, s):
827
827
  self.MarkArray.MarkRecord, mark_indices
828
828
  )
829
829
  self.MarkArray.MarkCount = len(self.MarkArray.MarkRecord)
830
- base_indices = self.BaseCoverage.subset(s.glyphs)
830
+ class_indices = _uniq_sort(v.Class for v in self.MarkArray.MarkRecord)
831
+
832
+ intersect_base_indices = self.BaseCoverage.intersect(s.glyphs)
833
+ base_records = self.BaseArray.BaseRecord
834
+ num_base_records = len(base_records)
835
+ base_indices = [
836
+ i
837
+ for i in intersect_base_indices
838
+ if i < num_base_records
839
+ and any(base_records[i].BaseAnchor[j] is not None for j in class_indices)
840
+ ]
841
+ if not base_indices:
842
+ return False
843
+
844
+ self.BaseCoverage.remap(base_indices)
831
845
  self.BaseArray.BaseRecord = _list_subset(
832
846
  self.BaseArray.BaseRecord, base_indices
833
847
  )
834
848
  self.BaseArray.BaseCount = len(self.BaseArray.BaseRecord)
835
849
  # Prune empty classes
836
- class_indices = _uniq_sort(v.Class for v in self.MarkArray.MarkRecord)
837
850
  self.ClassCount = len(class_indices)
838
851
  for m in self.MarkArray.MarkRecord:
839
852
  m.Class = class_indices.index(m.Class)
@@ -867,13 +880,31 @@ def subset_glyphs(self, s):
867
880
  self.MarkArray.MarkRecord, mark_indices
868
881
  )
869
882
  self.MarkArray.MarkCount = len(self.MarkArray.MarkRecord)
870
- ligature_indices = self.LigatureCoverage.subset(s.glyphs)
883
+ class_indices = _uniq_sort(v.Class for v in self.MarkArray.MarkRecord)
884
+
885
+ intersect_ligature_indices = self.LigatureCoverage.intersect(s.glyphs)
886
+ ligature_array = self.LigatureArray.LigatureAttach
887
+ num_ligatures = self.LigatureArray.LigatureCount
888
+
889
+ ligature_indices = [
890
+ i
891
+ for i in intersect_ligature_indices
892
+ if i < num_ligatures
893
+ and any(
894
+ any(component.LigatureAnchor[j] is not None for j in class_indices)
895
+ for component in ligature_array[i].ComponentRecord
896
+ )
897
+ ]
898
+
899
+ if not ligature_indices:
900
+ return False
901
+
902
+ self.LigatureCoverage.remap(ligature_indices)
871
903
  self.LigatureArray.LigatureAttach = _list_subset(
872
904
  self.LigatureArray.LigatureAttach, ligature_indices
873
905
  )
874
906
  self.LigatureArray.LigatureCount = len(self.LigatureArray.LigatureAttach)
875
907
  # Prune empty classes
876
- class_indices = _uniq_sort(v.Class for v in self.MarkArray.MarkRecord)
877
908
  self.ClassCount = len(class_indices)
878
909
  for m in self.MarkArray.MarkRecord:
879
910
  m.Class = class_indices.index(m.Class)
@@ -915,13 +946,26 @@ def subset_glyphs(self, s):
915
946
  self.Mark1Array.MarkRecord, mark1_indices
916
947
  )
917
948
  self.Mark1Array.MarkCount = len(self.Mark1Array.MarkRecord)
918
- mark2_indices = self.Mark2Coverage.subset(s.glyphs)
949
+ class_indices = _uniq_sort(v.Class for v in self.Mark1Array.MarkRecord)
950
+
951
+ intersect_mark2_indices = self.Mark2Coverage.intersect(s.glyphs)
952
+ mark2_records = self.Mark2Array.Mark2Record
953
+ num_mark2_records = len(mark2_records)
954
+ mark2_indices = [
955
+ i
956
+ for i in intersect_mark2_indices
957
+ if i < num_mark2_records
958
+ and any(mark2_records[i].Mark2Anchor[j] is not None for j in class_indices)
959
+ ]
960
+ if not mark2_indices:
961
+ return False
962
+
963
+ self.Mark2Coverage.remap(mark2_indices)
919
964
  self.Mark2Array.Mark2Record = _list_subset(
920
965
  self.Mark2Array.Mark2Record, mark2_indices
921
966
  )
922
967
  self.Mark2Array.MarkCount = len(self.Mark2Array.Mark2Record)
923
968
  # Prune empty classes
924
- class_indices = _uniq_sort(v.Class for v in self.Mark1Array.MarkRecord)
925
969
  self.ClassCount = len(class_indices)
926
970
  for m in self.Mark1Array.MarkRecord:
927
971
  m.Class = class_indices.index(m.Class)
@@ -1717,6 +1761,19 @@ def subset_features(self, feature_indices):
1717
1761
  return bool(self.SubstitutionCount)
1718
1762
 
1719
1763
 
1764
+ @_add_method(otTables.FeatureTableSubstitution)
1765
+ def prune_features(self, feature_index_map):
1766
+ self.ensureDecompiled()
1767
+ self.SubstitutionRecord = [
1768
+ r for r in self.SubstitutionRecord if r.FeatureIndex in feature_index_map.keys()
1769
+ ]
1770
+ # remap feature indices
1771
+ for r in self.SubstitutionRecord:
1772
+ r.FeatureIndex = feature_index_map[r.FeatureIndex]
1773
+ self.SubstitutionCount = len(self.SubstitutionRecord)
1774
+ return bool(self.SubstitutionCount)
1775
+
1776
+
1720
1777
  @_add_method(otTables.FeatureVariations)
1721
1778
  def subset_features(self, feature_indices):
1722
1779
  self.ensureDecompiled()
@@ -1735,6 +1792,24 @@ def subset_features(self, feature_indices):
1735
1792
  return bool(self.FeatureVariationCount)
1736
1793
 
1737
1794
 
1795
+ @_add_method(otTables.FeatureVariations)
1796
+ def prune_features(self, feature_index_map):
1797
+ self.ensureDecompiled()
1798
+ for r in self.FeatureVariationRecord:
1799
+ r.FeatureTableSubstitution.prune_features(feature_index_map)
1800
+ # Prune empty records at the end only
1801
+ # https://github.com/fonttools/fonttools/issues/1881
1802
+ while (
1803
+ self.FeatureVariationRecord
1804
+ and not self.FeatureVariationRecord[
1805
+ -1
1806
+ ].FeatureTableSubstitution.SubstitutionCount
1807
+ ):
1808
+ self.FeatureVariationRecord.pop()
1809
+ self.FeatureVariationCount = len(self.FeatureVariationRecord)
1810
+ return bool(self.FeatureVariationCount)
1811
+
1812
+
1738
1813
  @_add_method(otTables.DefaultLangSys, otTables.LangSys)
1739
1814
  def subset_features(self, feature_indices):
1740
1815
  if self.ReqFeatureIndex in feature_indices:
@@ -1750,6 +1825,16 @@ def subset_features(self, feature_indices):
1750
1825
  return bool(self.FeatureCount or self.ReqFeatureIndex != 65535)
1751
1826
 
1752
1827
 
1828
+ @_add_method(otTables.DefaultLangSys, otTables.LangSys)
1829
+ def prune_features(self, feature_index_map):
1830
+ self.ReqFeatureIndex = feature_index_map.get(self.ReqFeatureIndex, 65535)
1831
+ self.FeatureIndex = [
1832
+ feature_index_map[f] for f in self.FeatureIndex if f in feature_index_map.keys()
1833
+ ]
1834
+ self.FeatureCount = len(self.FeatureIndex)
1835
+ return bool(self.FeatureCount or self.ReqFeatureIndex != 65535)
1836
+
1837
+
1753
1838
  @_add_method(otTables.DefaultLangSys, otTables.LangSys)
1754
1839
  def collect_features(self):
1755
1840
  feature_indices = self.FeatureIndex[:]
@@ -1773,6 +1858,21 @@ def subset_features(self, feature_indices, keepEmptyDefaultLangSys=False):
1773
1858
  return bool(self.LangSysCount or self.DefaultLangSys)
1774
1859
 
1775
1860
 
1861
+ @_add_method(otTables.Script)
1862
+ def prune_features(self, feature_index_map, keepEmptyDefaultLangSys=False):
1863
+ if (
1864
+ self.DefaultLangSys
1865
+ and not self.DefaultLangSys.prune_features(feature_index_map)
1866
+ and not keepEmptyDefaultLangSys
1867
+ ):
1868
+ self.DefaultLangSys = None
1869
+ self.LangSysRecord = [
1870
+ l for l in self.LangSysRecord if l.LangSys.prune_features(feature_index_map)
1871
+ ]
1872
+ self.LangSysCount = len(self.LangSysRecord)
1873
+ return bool(self.LangSysCount or self.DefaultLangSys)
1874
+
1875
+
1776
1876
  @_add_method(otTables.Script)
1777
1877
  def collect_features(self):
1778
1878
  feature_indices = [l.LangSys.collect_features() for l in self.LangSysRecord]
@@ -1794,6 +1894,19 @@ def subset_features(self, feature_indices, retain_empty):
1794
1894
  return bool(self.ScriptCount)
1795
1895
 
1796
1896
 
1897
+ @_add_method(otTables.ScriptList)
1898
+ def prune_features(self, feature_index_map, retain_empty):
1899
+ # https://bugzilla.mozilla.org/show_bug.cgi?id=1331737#c32
1900
+ self.ScriptRecord = [
1901
+ s
1902
+ for s in self.ScriptRecord
1903
+ if s.Script.prune_features(feature_index_map, s.ScriptTag == "DFLT")
1904
+ or retain_empty
1905
+ ]
1906
+ self.ScriptCount = len(self.ScriptRecord)
1907
+ return bool(self.ScriptCount)
1908
+
1909
+
1797
1910
  @_add_method(otTables.ScriptList)
1798
1911
  def collect_features(self):
1799
1912
  return _uniq_sort(sum((s.Script.collect_features() for s in self.ScriptRecord), []))
@@ -1981,21 +2094,74 @@ def subset_script_tags(self, tags):
1981
2094
 
1982
2095
  @_add_method(ttLib.getTableClass("GSUB"), ttLib.getTableClass("GPOS"))
1983
2096
  def prune_features(self):
1984
- """Remove unreferenced features"""
2097
+ """Remove unreferenced and duplicate features in FeatureList
2098
+ Remove unreferenced features and remap duplicate feature indices in ScriptList and FeatureVariations
2099
+ """
1985
2100
  if self.table.ScriptList:
1986
2101
  feature_indices = self.table.ScriptList.collect_features()
1987
2102
  else:
1988
2103
  feature_indices = []
2104
+ (feature_indices, feature_index_map) = self.remap_duplicate_features(
2105
+ feature_indices
2106
+ )
2107
+
1989
2108
  if self.table.FeatureList:
1990
2109
  self.table.FeatureList.subset_features(feature_indices)
1991
2110
  if getattr(self.table, "FeatureVariations", None):
1992
- self.table.FeatureVariations.subset_features(feature_indices)
2111
+ self.table.FeatureVariations.prune_features(feature_index_map)
1993
2112
  if self.table.ScriptList:
1994
- self.table.ScriptList.subset_features(
1995
- feature_indices, self.retain_empty_scripts()
2113
+ self.table.ScriptList.prune_features(
2114
+ feature_index_map, self.retain_empty_scripts()
1996
2115
  )
1997
2116
 
1998
2117
 
2118
+ @_add_method(ttLib.getTableClass("GSUB"), ttLib.getTableClass("GPOS"))
2119
+ def remap_duplicate_features(self, feature_indices):
2120
+ """Return retained feature indices(without duplicates) and remapped feature indices"""
2121
+ features = self.table.FeatureList.FeatureRecord
2122
+
2123
+ unique_features = {}
2124
+ duplicate_features = {}
2125
+ for i in feature_indices:
2126
+ f = features[i]
2127
+ tag = f.FeatureTag
2128
+
2129
+ same_tag_features = unique_features.get(tag)
2130
+ if same_tag_features is None:
2131
+ unique_features[tag] = set([i])
2132
+ duplicate_features[i] = i
2133
+ continue
2134
+
2135
+ found = False
2136
+ for other_i in same_tag_features:
2137
+ if features[other_i] == f:
2138
+ found = True
2139
+ duplicate_features[i] = other_i
2140
+ break
2141
+
2142
+ if not found:
2143
+ same_tag_features.add(i)
2144
+ duplicate_features[i] = i
2145
+
2146
+ ## remap retained feature indices
2147
+ feature_map = {}
2148
+ new_idx = 0
2149
+
2150
+ for i in feature_indices:
2151
+ unique_i = duplicate_features.get(i, i)
2152
+ v = feature_map.get(unique_i)
2153
+ if v is None:
2154
+ feature_map[i] = new_idx
2155
+ new_idx += 1
2156
+ else:
2157
+ feature_map[i] = v
2158
+
2159
+ retained_feature_indices = _uniq_sort(
2160
+ sum((list(s) for s in unique_features.values()), [])
2161
+ )
2162
+ return (retained_feature_indices, feature_map)
2163
+
2164
+
1999
2165
  @_add_method(ttLib.getTableClass("GSUB"), ttLib.getTableClass("GPOS"))
2000
2166
  def prune_pre_subset(self, font, options):
2001
2167
  # Drop undesired features
@@ -3145,7 +3311,6 @@ class Options(object):
3145
3311
 
3146
3312
  # spaces in tag names (e.g. "SVG ", "cvt ") are stripped by the argument parser
3147
3313
  _drop_tables_default = [
3148
- "BASE",
3149
3314
  "JSTF",
3150
3315
  "DSIG",
3151
3316
  "EBDT",
@@ -3157,6 +3322,7 @@ class Options(object):
3157
3322
  _drop_tables_default += ["Feat", "Glat", "Gloc", "Silf", "Sill"] # Graphite
3158
3323
  _no_subset_tables_default = [
3159
3324
  "avar",
3325
+ "BASE",
3160
3326
  "fvar",
3161
3327
  "gasp",
3162
3328
  "head",
@@ -534,7 +534,7 @@ class UFOReader(_UFOBaseIO):
534
534
  raise UFOLibError(message)
535
535
  return groups
536
536
 
537
- def getKerningGroupRenameMaps(
537
+ def getKerningGroupConversionRenameMaps(
538
538
  self, validate: Optional[bool] = None
539
539
  ) -> KerningGroupRenameMaps:
540
540
  """
@@ -1263,7 +1263,7 @@ class UFOWriter(UFOReader):
1263
1263
  }
1264
1264
 
1265
1265
  This is the same form returned by UFOReader's
1266
- getKerningGroupRenameMaps method.
1266
+ getKerningGroupConversionRenameMaps method.
1267
1267
  """
1268
1268
  if self._formatVersion >= UFOFormatVersion.FORMAT_3_0:
1269
1269
  return # XXX raise an error here
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fonttools
3
- Version: 4.60.0
3
+ Version: 4.60.1
4
4
  Summary: Tools to manipulate font files
5
5
  Home-page: http://github.com/fonttools/fonttools
6
6
  Author: Just van Rossum
@@ -392,6 +392,18 @@ Have fun!
392
392
  Changelog
393
393
  ~~~~~~~~~
394
394
 
395
+ 4.60.1 (released 2025-09-29)
396
+ ----------------------------
397
+
398
+ - [ufoLib] Reverted accidental method name change in ``UFOReader.getKerningGroupConversionRenameMaps``
399
+ that broke compatibility with downstream projects like defcon (#3948, #3947, robotools/defcon#478).
400
+ - [ufoLib] Added test coverage for ``getKerningGroupConversionRenameMaps`` method (#3950).
401
+ - [subset] Don't try to subset BASE table; pass it through by default instead (#3949).
402
+ - [subset] Remove empty BaseRecord entries in MarkBasePos lookups (#3897, #3892).
403
+ - [subset] Add pruning for MarkLigPos and MarkMarkPos lookups (#3946).
404
+ - [subset] Remove duplicate features when subsetting (#3945).
405
+ - [Docs] Added documentation for the visitor module (#3944).
406
+
395
407
  4.60.0 (released 2025-09-17)
396
408
  ----------------------------
397
409
 
@@ -1,4 +1,4 @@
1
- fontTools/__init__.py,sha256=QErDWwLyteqhpD3TFcyyf5Higmwv-NgoQcXfIOF862M,183
1
+ fontTools/__init__.py,sha256=MfqTqdwYD_P2HKtnQkjibL8iy5ln62P1VIO9tT5epww,183
2
2
  fontTools/__main__.py,sha256=VjkGh1UD-i1zTDA1dXo1uecSs6PxHdGQ5vlCk_mCCYs,925
3
3
  fontTools/afmLib.py,sha256=1MagIItOzRV4vV5kKPxeDZbPJsfxLB3wdHLFkQvl0uk,13164
4
4
  fontTools/agl.py,sha256=05bm8Uq45uVWW8nPbP6xbNgmFyxQr8sWhYAiP0VSjnI,112975
@@ -26,7 +26,7 @@ fontTools/cu2qu/__main__.py,sha256=kTUI-jczsHeelULLlory74QEeFjZWp9zigCc7PrdVQY,9
26
26
  fontTools/cu2qu/benchmark.py,sha256=wasPJmf8q9k9UHjpHChC3WQAGbBAyHN9PvJzXvWC0Fw,1296
27
27
  fontTools/cu2qu/cli.py,sha256=MbAQnOpZwrUFe_tjAP3Tgf6uLdOgHlONUcPNeTXwH0Y,6076
28
28
  fontTools/cu2qu/cu2qu.c,sha256=-7JwWBSeJ3I4vIs6ZaSVHzfBf46MSx25lG05NRqA6Zg,637967
29
- fontTools/cu2qu/cu2qu.cpython-314t-aarch64-linux-musl.so,sha256=XJzNZP42acAts5vgSJB-zSidNierpOcKn3-w_lrZsVU,836048
29
+ fontTools/cu2qu/cu2qu.cpython-314t-aarch64-linux-musl.so,sha256=kxs5AMIGxhe89x31OUHExlCPpt8EUU4fxYOwHGhk9Tg,836048
30
30
  fontTools/cu2qu/cu2qu.py,sha256=6LTe1ZI-jxW8y79s_UFjbkeFoFleIekTLm2jAE-uqGQ,17986
31
31
  fontTools/cu2qu/errors.py,sha256=PyJNMy8lHDtKpfFkc0nkM8F4jNLZAC4lPQCN1Km4bpg,2441
32
32
  fontTools/cu2qu/ufo.py,sha256=qZR70uWdCia19Ff8GLn5NeItscvvn69DegjDZVF4eNI,11794
@@ -45,7 +45,7 @@ fontTools/feaLib/ast.py,sha256=48Y6vpSD_wYfucWyh_bQtzf2AQFX-pOwBvsxdcpVDz0,74158
45
45
  fontTools/feaLib/builder.py,sha256=jIJVmaLwrNGFBO7mQDNpchiGBiv70nNpZ4LVRVaaIUM,73757
46
46
  fontTools/feaLib/error.py,sha256=Bz_5tNcNVcY7_nrAmFlQNhQldtqZWd8WUGQ2E3PWhZo,648
47
47
  fontTools/feaLib/lexer.c,sha256=UaY5Hy0WYsGF9UMJnA2tMx0k5DwYA72N2IKxpRsAcCc,754285
48
- fontTools/feaLib/lexer.cpython-314t-aarch64-linux-musl.so,sha256=H8BHXcuKDSriEKsRXODjEHTkk5688_W3ixk4xSjQZxE,1108608
48
+ fontTools/feaLib/lexer.cpython-314t-aarch64-linux-musl.so,sha256=bHLwxQErR8oX_wbJoiVrpgjsP_gPOgO_HYTRbNPMKJ4,1108608
49
49
  fontTools/feaLib/lexer.py,sha256=emyMPmRoqNZkzxnJyI6JRCCtXrbCOFofwa9O6ABGLiw,11121
50
50
  fontTools/feaLib/location.py,sha256=JXzHqGV56EHdcq823AwA5oaK05hf_1ySWpScbo3zGC0,234
51
51
  fontTools/feaLib/lookupDebugInfo.py,sha256=gVRr5-APWfT_a5-25hRuawSVX8fEvXVsOSLWkH91T2w,304
@@ -63,7 +63,7 @@ fontTools/merge/util.py,sha256=BH3bZWNFy-Tsj1cth7aSpGVJ18YXKXqDakPn6Wzku6U,3378
63
63
  fontTools/misc/__init__.py,sha256=DJBWmoX_Haau7qlgmvWyfbhSzrX2qL636Rns7CG01pk,75
64
64
  fontTools/misc/arrayTools.py,sha256=jZk__GE-K9VViZE_H-LPPj0smWbKng-yfPE8BfGp8HI,11483
65
65
  fontTools/misc/bezierTools.c,sha256=mFo2nrmrIq11WJ8Tj_cxR4M6U3tx75RVPcU-ODkHrbg,1821732
66
- fontTools/misc/bezierTools.cpython-314t-aarch64-linux-musl.so,sha256=xJHUNivurbhflEyaVEtk7m-EcpdFHop8k4Sw_X58lJU,3637168
66
+ fontTools/misc/bezierTools.cpython-314t-aarch64-linux-musl.so,sha256=ILzK2AO5MdqyAISHlN_WfgDTSNp0voDNYtLmMVUFjbk,3637168
67
67
  fontTools/misc/bezierTools.py,sha256=OmR3pzCGExNvZyTPrByH7gQHpAJsYOl1cmvfYQIVfQA,45038
68
68
  fontTools/misc/classifyTools.py,sha256=zcg3EM4GOerBW9c063ljaLllgeeZ772EpFZjp9CdgLI,5613
69
69
  fontTools/misc/cliTools.py,sha256=qCznJMLCQu3ZHQD_4ctUnr3TkfAUdkGl-UuxZUrppy0,1862
@@ -95,7 +95,7 @@ fontTools/misc/timeTools.py,sha256=e9h5pgzL04tBDXmCv_8eRGB4boFV8GKXlS6dq3ggEpw,2
95
95
  fontTools/misc/transform.py,sha256=OR8dPsAw87z77gkZQMq00iUkDWLIxYv-12XiKH1-erk,15798
96
96
  fontTools/misc/treeTools.py,sha256=tLWkwyDHeZUPVOGNnJeD4Pn7x2bQeZetwJKaEAW2J2M,1269
97
97
  fontTools/misc/vector.py,sha256=6lqZcDjAgHJFQgjzD-ULQ_PrigAMfeZKaBZmAfcC0ig,4062
98
- fontTools/misc/visitor.py,sha256=c9YQs14bXfL1SmqwoAhEGCvXlmyZIKR5_Vr4n7iWaRs,5610
98
+ fontTools/misc/visitor.py,sha256=zwBAVfZ3MTsrbhNFj03pSSjNRyT6oGkare-kfWkN5ns,5754
99
99
  fontTools/misc/xmlReader.py,sha256=igut4_d13RT4WarliqVvuuPybO1uSXVeoBOeW4j0_e4,6580
100
100
  fontTools/misc/xmlWriter.py,sha256=CrNXQfNJRdt5CHKAZ4-qy3h1yJeL63ot17kXkNbeI_E,6829
101
101
  fontTools/misc/filesystem/__init__.py,sha256=iwoOj6DpXKk8q-NRRHqOfRxFF6lcXIhsIA46j-cZswU,2011
@@ -133,7 +133,7 @@ fontTools/pens/filterPen.py,sha256=REgspXaaSvF3XUwqe40abe3X_E7-WbBP13IqLUUBLCw,1
133
133
  fontTools/pens/freetypePen.py,sha256=HD-gXJSbgImJdBc8sIBk0HWBdjv3WKFofs6PgCCsGOY,19908
134
134
  fontTools/pens/hashPointPen.py,sha256=gElrFyQoOQp3ZbpKHRWPwC61A9OgT2Js8crVUD8BQAY,3573
135
135
  fontTools/pens/momentsPen.c,sha256=nXlaxy9cejy1MWW6NCDck71BKCfnc_E25BrmYXXPC18,565310
136
- fontTools/pens/momentsPen.cpython-314t-aarch64-linux-musl.so,sha256=b465fPl5PSEQ8PexIz0TnNPTB1xgCf-HYAn679b0qSU,882064
136
+ fontTools/pens/momentsPen.cpython-314t-aarch64-linux-musl.so,sha256=lKsPVm8YLST6FcWIe2kRHZ8wKM316nafmN-49UuAe8A,882064
137
137
  fontTools/pens/momentsPen.py,sha256=kjLVXhGe55Abl__Yr1gob0bl0dHe7fPSwyr7TRJnbug,25658
138
138
  fontTools/pens/perimeterPen.py,sha256=lr6NzrIWxi4TXBJPbcJsKzqABWfQeil2Bgm9BgUD3N4,2153
139
139
  fontTools/pens/pointInsidePen.py,sha256=noEUvBQIeAheDMJwzvvfnEiKhmwbS1i0RQE9jik6Gl4,6355
@@ -157,9 +157,9 @@ fontTools/qu2cu/__main__.py,sha256=9FWf6SIZaRaC8SiL0LhjAWC2yIdY9N_9wlRko8m1l2Q,9
157
157
  fontTools/qu2cu/benchmark.py,sha256=GMcr_4r7L6K9SmJ13itt-_XKhnKqSVUDPlXUG6IZmmM,1400
158
158
  fontTools/qu2cu/cli.py,sha256=U2rooYnVVEalGRAWGFHk-Kp6Okys8wtzdaWLjw1bngY,3714
159
159
  fontTools/qu2cu/qu2cu.c,sha256=k-6C2e2_m_1cBuYoSiHCY1ZBcSqtZjiffLCghiJCYDM,690421
160
- fontTools/qu2cu/qu2cu.cpython-314t-aarch64-linux-musl.so,sha256=V6ogxQDNoYk_KJmWEpCfdkHUKRexi8BXMZLjvtoE-eE,987784
160
+ fontTools/qu2cu/qu2cu.cpython-314t-aarch64-linux-musl.so,sha256=BTtFFjE1A4jdDGSpQTd13u6PVpfqpFMlcJuF1oE-KSs,987784
161
161
  fontTools/qu2cu/qu2cu.py,sha256=IYtpkwHdfKOXJr65Y_pJ9Lrt_MgJaISAKGMAs5ilFSM,12288
162
- fontTools/subset/__init__.py,sha256=Qmhbtr07h4a16dHWUP46jF8Nr4gd4njICcNVBFyYaac,137742
162
+ fontTools/subset/__init__.py,sha256=R9VoZ2QWhqENHC5Ct1wyhLhEU-xo4mUXwCWl6EZGgwQ,143263
163
163
  fontTools/subset/__main__.py,sha256=bhtfP2SqP4k799pxtksFgnC-XGNQDr3LcO4lc8T5e5g,95
164
164
  fontTools/subset/cff.py,sha256=rqMRJOlX5FacV1LW8aDlVOglgEM87TkMA9bdsYenask,6145
165
165
  fontTools/subset/svg.py,sha256=8dLBzQlnIt4_fOKEFDAVlKTucdHvcbCcyG9-a6UBZZ0,9384
@@ -283,7 +283,7 @@ fontTools/ttLib/tables/sbixGlyph.py,sha256=tjEUPVRfx6gr5yme8UytGTtVrimKN5qmbzT1G
283
283
  fontTools/ttLib/tables/sbixStrike.py,sha256=dL8O9K8R4S6RVQDP-PVjIPBrvbqbE9zwra0uRL0nLq0,6651
284
284
  fontTools/ttLib/tables/table_API_readme.txt,sha256=eZlRTLUkLzc_9Ot3pdfhyMb3ahU0_Iipx0vSbzOVGy8,2748
285
285
  fontTools/ttLib/tables/ttProgram.py,sha256=tgtxgd-EnOq-2PUlYEihp-6NHu_7HnE5rxeSAtmXOtU,35888
286
- fontTools/ufoLib/__init__.py,sha256=ZVreWYfL-UgFes62pwW5lHyj0vfvVblwaIlRCV34Vq8,98961
286
+ fontTools/ufoLib/__init__.py,sha256=nKG8gu6NEvqGJoZ781IARoQ7ii4LoWfMMvX3Yf5TsVw,98981
287
287
  fontTools/ufoLib/converters.py,sha256=YnBKr8kmyjwLcq8LdD46ubGOgyL9Pxt9avlvZn9anKI,13444
288
288
  fontTools/ufoLib/errors.py,sha256=9f8l5NaFAj3BZPa6Bbqt06FL4afffLuMzy4nPf-eOlE,845
289
289
  fontTools/ufoLib/etree.py,sha256=T3sjLTgjMAq6VyYRicWPaMIVBJ2YSuwZxV6Vc5yZtQI,231
@@ -315,7 +315,7 @@ fontTools/varLib/interpolatableTestContourOrder.py,sha256=mHJ9Ry7Rm7H3zHDwEUQEtE
315
315
  fontTools/varLib/interpolatableTestStartingPoint.py,sha256=K6OYKBspim6BXc91pfLTbGLyi5XZukfMuBc6hRpENG8,4296
316
316
  fontTools/varLib/interpolate_layout.py,sha256=22VjGZuV2YiAe2MpdTf0xPVz1x2G84bcOL0vOeBpGQM,3689
317
317
  fontTools/varLib/iup.c,sha256=I7snrACi_wloZDL67Fypk-7Dff5pxJhaVmluAXBUW_4,827723
318
- fontTools/varLib/iup.cpython-314t-aarch64-linux-musl.so,sha256=yhke5V44yVnJvG434LkptyYC_J9kG9v9aKmoADzPRXY,1314696
318
+ fontTools/varLib/iup.cpython-314t-aarch64-linux-musl.so,sha256=CehuXTlccw7vycpzfDcBhgGnyPxwx7MNU1vKocFuw0U,1314696
319
319
  fontTools/varLib/iup.py,sha256=mKq_GRWuUg4yTmw2V32nu0v2r-SzzN7xS7rIbV0mYuc,14984
320
320
  fontTools/varLib/merger.py,sha256=E59oli4AwqWZ-FgnuStMSBvsB-FHe-55esXTYUqGeJ8,60802
321
321
  fontTools/varLib/models.py,sha256=sj_ENljh_qcMbfYzRIOlRgHq6tFOmL02Wv6WO8uofis,22398
@@ -343,11 +343,11 @@ fontTools/voltLib/error.py,sha256=phcQOQj-xOspCXu9hBJQRhSOBDzxHRgZd3fWQOFNJzw,39
343
343
  fontTools/voltLib/lexer.py,sha256=OvuETOSvlS6v7iCVeJ3IdH2Cg71n3OJoEyiB3-h6vhE,3368
344
344
  fontTools/voltLib/parser.py,sha256=rkw2IHBZPsrhGVC7Kw7V501m0u52kh1JSM5HXp-xchM,25396
345
345
  fontTools/voltLib/voltToFea.py,sha256=Z2yvnaZLQXzPLT86Uta0zRsXIYgj6NnvZtSWt5xmw2s,36549
346
- fonttools-4.60.0.data/data/share/man/man1/ttx.1,sha256=cLbm_pOOj1C76T2QXvDxzwDj9gk-GTd5RztvTMsouFw,5377
347
- fonttools-4.60.0.dist-info/METADATA,sha256=Rr4SmYR6GaXoQc5vdAknoI1T6jKbFYOSvq8iA_VnxrQ,111615
348
- fonttools-4.60.0.dist-info/WHEEL,sha256=Rmj_1p8w6vs03sA3piwr0LDCnhshdZofyeLRZQ_Y0EI,114
349
- fonttools-4.60.0.dist-info/entry_points.txt,sha256=8kVHddxfFWA44FSD4mBpmC-4uCynQnkoz_9aNJb227Y,147
350
- fonttools-4.60.0.dist-info/top_level.txt,sha256=rRgRylrXzekqWOsrhygzib12pQ7WILf7UGjqEwkIFDM,10
351
- fonttools-4.60.0.dist-info/RECORD,,
352
- fonttools-4.60.0.dist-info/licenses/LICENSE,sha256=Z4cgj4P2Wcy8IiOy_elS_6b36KymLxqKK_W8UbsbI4M,1072
353
- fonttools-4.60.0.dist-info/licenses/LICENSE.external,sha256=lKg6ruBymg8wLTSsxKzsvZ1YNm8mJCkHX-VX5KVLLmk,20022
346
+ fonttools-4.60.1.data/data/share/man/man1/ttx.1,sha256=cLbm_pOOj1C76T2QXvDxzwDj9gk-GTd5RztvTMsouFw,5377
347
+ fonttools-4.60.1.dist-info/METADATA,sha256=CIZ3DxcKqkgjQVIa68ndWbeo4HP-yrkBlOLu-dmZygM,112334
348
+ fonttools-4.60.1.dist-info/WHEEL,sha256=Rmj_1p8w6vs03sA3piwr0LDCnhshdZofyeLRZQ_Y0EI,114
349
+ fonttools-4.60.1.dist-info/entry_points.txt,sha256=8kVHddxfFWA44FSD4mBpmC-4uCynQnkoz_9aNJb227Y,147
350
+ fonttools-4.60.1.dist-info/top_level.txt,sha256=rRgRylrXzekqWOsrhygzib12pQ7WILf7UGjqEwkIFDM,10
351
+ fonttools-4.60.1.dist-info/RECORD,,
352
+ fonttools-4.60.1.dist-info/licenses/LICENSE,sha256=Z4cgj4P2Wcy8IiOy_elS_6b36KymLxqKK_W8UbsbI4M,1072
353
+ fonttools-4.60.1.dist-info/licenses/LICENSE.external,sha256=lKg6ruBymg8wLTSsxKzsvZ1YNm8mJCkHX-VX5KVLLmk,20022