fonttools 4.57.0__cp312-cp312-win_amd64.whl → 4.58.1__cp312-cp312-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.
- fontTools/__init__.py +1 -1
- fontTools/cffLib/__init__.py +61 -26
- fontTools/cffLib/specializer.py +4 -1
- fontTools/cu2qu/cu2qu.c +15357 -14829
- fontTools/cu2qu/cu2qu.cp312-win_amd64.pyd +0 -0
- fontTools/designspaceLib/statNames.py +14 -7
- fontTools/feaLib/ast.py +12 -9
- fontTools/feaLib/builder.py +75 -49
- fontTools/feaLib/lexer.c +17160 -17986
- fontTools/feaLib/lexer.cp312-win_amd64.pyd +0 -0
- fontTools/feaLib/parser.py +1 -39
- fontTools/fontBuilder.py +6 -0
- fontTools/merge/cmap.py +33 -1
- fontTools/merge/tables.py +12 -1
- fontTools/misc/bezierTools.c +39948 -41831
- fontTools/misc/bezierTools.cp312-win_amd64.pyd +0 -0
- fontTools/misc/etree.py +4 -27
- fontTools/misc/loggingTools.py +1 -1
- fontTools/misc/symfont.py +6 -8
- fontTools/mtiLib/__init__.py +1 -3
- fontTools/otlLib/builder.py +359 -145
- fontTools/otlLib/optimize/gpos.py +42 -62
- fontTools/pens/momentsPen.c +13283 -13448
- fontTools/pens/momentsPen.cp312-win_amd64.pyd +0 -0
- fontTools/pens/pointPen.py +21 -12
- fontTools/pens/t2CharStringPen.py +31 -11
- fontTools/qu2cu/qu2cu.c +16550 -16269
- fontTools/qu2cu/qu2cu.cp312-win_amd64.pyd +0 -0
- fontTools/subset/__init__.py +12 -1
- fontTools/ttLib/tables/G_V_A_R_.py +5 -0
- fontTools/ttLib/tables/T_S_I__0.py +14 -3
- fontTools/ttLib/tables/T_S_I__5.py +16 -5
- fontTools/ttLib/tables/__init__.py +1 -0
- fontTools/ttLib/tables/_c_v_t.py +2 -0
- fontTools/ttLib/tables/_f_p_g_m.py +3 -1
- fontTools/ttLib/tables/_g_l_y_f.py +2 -6
- fontTools/ttLib/tables/_g_v_a_r.py +58 -15
- fontTools/ttLib/tables/_p_o_s_t.py +5 -2
- fontTools/ttLib/tables/otBase.py +1 -0
- fontTools/ufoLib/__init__.py +3 -3
- fontTools/ufoLib/converters.py +89 -25
- fontTools/ufoLib/errors.py +8 -0
- fontTools/ufoLib/etree.py +1 -1
- fontTools/ufoLib/filenames.py +155 -100
- fontTools/ufoLib/glifLib.py +9 -2
- fontTools/ufoLib/kerning.py +66 -36
- fontTools/ufoLib/utils.py +5 -2
- fontTools/unicodedata/Mirrored.py +446 -0
- fontTools/unicodedata/__init__.py +6 -2
- fontTools/varLib/__init__.py +20 -6
- fontTools/varLib/featureVars.py +13 -7
- fontTools/varLib/hvar.py +1 -1
- fontTools/varLib/instancer/__init__.py +14 -5
- fontTools/varLib/iup.c +19642 -19154
- fontTools/varLib/iup.cp312-win_amd64.pyd +0 -0
- fontTools/voltLib/__main__.py +206 -0
- fontTools/voltLib/ast.py +4 -0
- fontTools/voltLib/parser.py +16 -8
- fontTools/voltLib/voltToFea.py +347 -166
- {fonttools-4.57.0.dist-info → fonttools-4.58.1.dist-info}/METADATA +64 -11
- {fonttools-4.57.0.dist-info → fonttools-4.58.1.dist-info}/RECORD +67 -63
- {fonttools-4.57.0.dist-info → fonttools-4.58.1.dist-info}/WHEEL +1 -1
- fonttools-4.58.1.dist-info/licenses/LICENSE.external +359 -0
- {fonttools-4.57.0.data → fonttools-4.58.1.data}/data/share/man/man1/ttx.1 +0 -0
- {fonttools-4.57.0.dist-info → fonttools-4.58.1.dist-info}/entry_points.txt +0 -0
- {fonttools-4.57.0.dist-info → fonttools-4.58.1.dist-info}/licenses/LICENSE +0 -0
- {fonttools-4.57.0.dist-info → fonttools-4.58.1.dist-info}/top_level.txt +0 -0
|
Binary file
|
fontTools/feaLib/parser.py
CHANGED
|
@@ -1613,7 +1613,7 @@ class Parser(object):
|
|
|
1613
1613
|
"HorizAxis.BaseScriptList",
|
|
1614
1614
|
"VertAxis.BaseScriptList",
|
|
1615
1615
|
), self.cur_token_
|
|
1616
|
-
scripts = [
|
|
1616
|
+
scripts = [self.parse_base_script_record_(count)]
|
|
1617
1617
|
while self.next_token_ == ",":
|
|
1618
1618
|
self.expect_symbol_(",")
|
|
1619
1619
|
scripts.append(self.parse_base_script_record_(count))
|
|
@@ -2062,44 +2062,6 @@ class Parser(object):
|
|
|
2062
2062
|
)
|
|
2063
2063
|
self.expect_symbol_(";")
|
|
2064
2064
|
|
|
2065
|
-
# A multiple substitution may have a single destination, in which case
|
|
2066
|
-
# it will look just like a single substitution. So if there are both
|
|
2067
|
-
# multiple and single substitutions, upgrade all the single ones to
|
|
2068
|
-
# multiple substitutions.
|
|
2069
|
-
|
|
2070
|
-
# Check if we have a mix of non-contextual singles and multiples.
|
|
2071
|
-
has_single = False
|
|
2072
|
-
has_multiple = False
|
|
2073
|
-
for s in statements:
|
|
2074
|
-
if isinstance(s, self.ast.SingleSubstStatement):
|
|
2075
|
-
has_single = not any([s.prefix, s.suffix, s.forceChain])
|
|
2076
|
-
elif isinstance(s, self.ast.MultipleSubstStatement):
|
|
2077
|
-
has_multiple = not any([s.prefix, s.suffix, s.forceChain])
|
|
2078
|
-
|
|
2079
|
-
# Upgrade all single substitutions to multiple substitutions.
|
|
2080
|
-
if has_single and has_multiple:
|
|
2081
|
-
statements = []
|
|
2082
|
-
for s in block.statements:
|
|
2083
|
-
if isinstance(s, self.ast.SingleSubstStatement):
|
|
2084
|
-
glyphs = s.glyphs[0].glyphSet()
|
|
2085
|
-
replacements = s.replacements[0].glyphSet()
|
|
2086
|
-
if len(replacements) == 1:
|
|
2087
|
-
replacements *= len(glyphs)
|
|
2088
|
-
for i, glyph in enumerate(glyphs):
|
|
2089
|
-
statements.append(
|
|
2090
|
-
self.ast.MultipleSubstStatement(
|
|
2091
|
-
s.prefix,
|
|
2092
|
-
glyph,
|
|
2093
|
-
s.suffix,
|
|
2094
|
-
[replacements[i]],
|
|
2095
|
-
s.forceChain,
|
|
2096
|
-
location=s.location,
|
|
2097
|
-
)
|
|
2098
|
-
)
|
|
2099
|
-
else:
|
|
2100
|
-
statements.append(s)
|
|
2101
|
-
block.statements = statements
|
|
2102
|
-
|
|
2103
2065
|
def is_cur_keyword_(self, k):
|
|
2104
2066
|
if self.cur_token_type_ is Lexer.NAME:
|
|
2105
2067
|
if isinstance(k, type("")): # basestring is gone in Python3
|
fontTools/fontBuilder.py
CHANGED
|
@@ -714,6 +714,12 @@ class FontBuilder(object):
|
|
|
714
714
|
gvar.reserved = 0
|
|
715
715
|
gvar.variations = variations
|
|
716
716
|
|
|
717
|
+
def setupGVAR(self, variations):
|
|
718
|
+
gvar = self.font["GVAR"] = newTable("GVAR")
|
|
719
|
+
gvar.version = 1
|
|
720
|
+
gvar.reserved = 0
|
|
721
|
+
gvar.variations = variations
|
|
722
|
+
|
|
717
723
|
def calcGlyphBounds(self):
|
|
718
724
|
"""Calculate the bounding boxes of all glyphs in the `glyf` table.
|
|
719
725
|
This is usually not called explicitly by client code.
|
fontTools/merge/cmap.py
CHANGED
|
@@ -54,6 +54,28 @@ def _glyphsAreSame(
|
|
|
54
54
|
return True
|
|
55
55
|
|
|
56
56
|
|
|
57
|
+
def computeMegaUvs(merger, uvsTables):
|
|
58
|
+
"""Returns merged UVS subtable (cmap format=14)."""
|
|
59
|
+
uvsDict = {}
|
|
60
|
+
cmap = merger.cmap
|
|
61
|
+
for table in uvsTables:
|
|
62
|
+
for variationSelector, uvsMapping in table.uvsDict.items():
|
|
63
|
+
if variationSelector not in uvsDict:
|
|
64
|
+
uvsDict[variationSelector] = {}
|
|
65
|
+
for unicodeValue, glyphName in uvsMapping:
|
|
66
|
+
if cmap.get(unicodeValue) == glyphName:
|
|
67
|
+
# this is a default variation
|
|
68
|
+
glyphName = None
|
|
69
|
+
# prefer previous glyph id if both fonts defined UVS
|
|
70
|
+
if unicodeValue not in uvsDict[variationSelector]:
|
|
71
|
+
uvsDict[variationSelector][unicodeValue] = glyphName
|
|
72
|
+
|
|
73
|
+
for variationSelector in uvsDict:
|
|
74
|
+
uvsDict[variationSelector] = [*uvsDict[variationSelector].items()]
|
|
75
|
+
|
|
76
|
+
return uvsDict
|
|
77
|
+
|
|
78
|
+
|
|
57
79
|
# Valid (format, platformID, platEncID) triplets for cmap subtables containing
|
|
58
80
|
# Unicode BMP-only and Unicode Full Repertoire semantics.
|
|
59
81
|
# Cf. OpenType spec for "Platform specific encodings":
|
|
@@ -61,24 +83,29 @@ def _glyphsAreSame(
|
|
|
61
83
|
class _CmapUnicodePlatEncodings:
|
|
62
84
|
BMP = {(4, 3, 1), (4, 0, 3), (4, 0, 4), (4, 0, 6)}
|
|
63
85
|
FullRepertoire = {(12, 3, 10), (12, 0, 4), (12, 0, 6)}
|
|
86
|
+
UVS = {(14, 0, 5)}
|
|
64
87
|
|
|
65
88
|
|
|
66
89
|
def computeMegaCmap(merger, cmapTables):
|
|
67
|
-
"""Sets merger.cmap and merger.
|
|
90
|
+
"""Sets merger.cmap and merger.uvsDict."""
|
|
68
91
|
|
|
69
92
|
# TODO Handle format=14.
|
|
70
93
|
# Only merge format 4 and 12 Unicode subtables, ignores all other subtables
|
|
71
94
|
# If there is a format 12 table for a font, ignore the format 4 table of it
|
|
72
95
|
chosenCmapTables = []
|
|
96
|
+
chosenUvsTables = []
|
|
73
97
|
for fontIdx, table in enumerate(cmapTables):
|
|
74
98
|
format4 = None
|
|
75
99
|
format12 = None
|
|
100
|
+
format14 = None
|
|
76
101
|
for subtable in table.tables:
|
|
77
102
|
properties = (subtable.format, subtable.platformID, subtable.platEncID)
|
|
78
103
|
if properties in _CmapUnicodePlatEncodings.BMP:
|
|
79
104
|
format4 = subtable
|
|
80
105
|
elif properties in _CmapUnicodePlatEncodings.FullRepertoire:
|
|
81
106
|
format12 = subtable
|
|
107
|
+
elif properties in _CmapUnicodePlatEncodings.UVS:
|
|
108
|
+
format14 = subtable
|
|
82
109
|
else:
|
|
83
110
|
log.warning(
|
|
84
111
|
"Dropped cmap subtable from font '%s':\t"
|
|
@@ -93,6 +120,9 @@ def computeMegaCmap(merger, cmapTables):
|
|
|
93
120
|
elif format4 is not None:
|
|
94
121
|
chosenCmapTables.append((format4, fontIdx))
|
|
95
122
|
|
|
123
|
+
if format14 is not None:
|
|
124
|
+
chosenUvsTables.append(format14)
|
|
125
|
+
|
|
96
126
|
# Build the unicode mapping
|
|
97
127
|
merger.cmap = cmap = {}
|
|
98
128
|
fontIndexForGlyph = {}
|
|
@@ -127,6 +157,8 @@ def computeMegaCmap(merger, cmapTables):
|
|
|
127
157
|
"Dropped mapping from codepoint %#06X to glyphId '%s'", uni, gid
|
|
128
158
|
)
|
|
129
159
|
|
|
160
|
+
merger.uvsDict = computeMegaUvs(merger, chosenUvsTables)
|
|
161
|
+
|
|
130
162
|
|
|
131
163
|
def renameCFFCharStrings(merger, glyphOrder, cffTable):
|
|
132
164
|
"""Rename topDictIndex charStrings based on glyphOrder."""
|
fontTools/merge/tables.py
CHANGED
|
@@ -312,7 +312,6 @@ def merge(self, m, tables):
|
|
|
312
312
|
|
|
313
313
|
@add_method(ttLib.getTableClass("cmap"))
|
|
314
314
|
def merge(self, m, tables):
|
|
315
|
-
# TODO Handle format=14.
|
|
316
315
|
if not hasattr(m, "cmap"):
|
|
317
316
|
computeMegaCmap(m, tables)
|
|
318
317
|
cmap = m.cmap
|
|
@@ -336,6 +335,18 @@ def merge(self, m, tables):
|
|
|
336
335
|
cmapTable.cmap = cmapBmpOnly
|
|
337
336
|
# ordered by platform then encoding
|
|
338
337
|
self.tables.insert(0, cmapTable)
|
|
338
|
+
|
|
339
|
+
uvsDict = m.uvsDict
|
|
340
|
+
if uvsDict:
|
|
341
|
+
# format-14
|
|
342
|
+
uvsTable = module.cmap_classes[14](14)
|
|
343
|
+
uvsTable.platformID = 0
|
|
344
|
+
uvsTable.platEncID = 5
|
|
345
|
+
uvsTable.language = 0
|
|
346
|
+
uvsTable.cmap = {}
|
|
347
|
+
uvsTable.uvsDict = uvsDict
|
|
348
|
+
# ordered by platform then encoding
|
|
349
|
+
self.tables.insert(0, uvsTable)
|
|
339
350
|
self.tableVersion = 0
|
|
340
351
|
self.numSubTables = len(self.tables)
|
|
341
352
|
return self
|