summaryrefslogtreecommitdiffstats
path: root/contrib/python/fonttools
diff options
context:
space:
mode:
authorrobot-piglet <[email protected]>2024-12-18 10:16:08 +0300
committerrobot-piglet <[email protected]>2024-12-18 10:29:14 +0300
commit691a35e0546dbd763dd51657b1a3816a3c40e094 (patch)
tree651c5813885adb4fa8993f44b364a0a7a148e7ad /contrib/python/fonttools
parent72b6bf1f88ac4ec4ed2adf6dda915278c5d2b924 (diff)
Intermediate changes
commit_hash:1a5e9f4585838729a12fdcba5306caddb2c0c7ac
Diffstat (limited to 'contrib/python/fonttools')
-rw-r--r--contrib/python/fonttools/.dist-info/METADATA85
-rw-r--r--contrib/python/fonttools/fontTools/__init__.py2
-rw-r--r--contrib/python/fonttools/fontTools/cffLib/transforms.py7
-rw-r--r--contrib/python/fonttools/fontTools/cu2qu/cu2qu.py5
-rw-r--r--contrib/python/fonttools/fontTools/misc/bezierTools.py5
-rw-r--r--contrib/python/fonttools/fontTools/misc/symfont.py5
-rw-r--r--contrib/python/fonttools/fontTools/misc/transform.py19
-rw-r--r--contrib/python/fonttools/fontTools/pens/momentsPen.py5
-rw-r--r--contrib/python/fonttools/fontTools/qu2cu/qu2cu.py5
-rw-r--r--contrib/python/fonttools/fontTools/ttLib/ttGlyphSet.py23
-rw-r--r--contrib/python/fonttools/fontTools/varLib/iup.py14
-rw-r--r--contrib/python/fonttools/ya.make2
12 files changed, 103 insertions, 74 deletions
diff --git a/contrib/python/fonttools/.dist-info/METADATA b/contrib/python/fonttools/.dist-info/METADATA
index 8ad26257c5b..9460888006d 100644
--- a/contrib/python/fonttools/.dist-info/METADATA
+++ b/contrib/python/fonttools/.dist-info/METADATA
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: fonttools
-Version: 4.55.0
+Version: 4.55.1
Summary: Tools to manipulate font files
Home-page: http://github.com/fonttools/fonttools
Author: Just van Rossum
@@ -30,48 +30,48 @@ Classifier: Topic :: Multimedia :: Graphics
Classifier: Topic :: Multimedia :: Graphics :: Graphics Conversion
Requires-Python: >=3.8
License-File: LICENSE
-Provides-Extra: all
-Requires-Dist: fs <3,>=2.2.0 ; extra == 'all'
-Requires-Dist: lxml >=4.0 ; extra == 'all'
-Requires-Dist: zopfli >=0.1.4 ; extra == 'all'
-Requires-Dist: lz4 >=1.7.4.2 ; extra == 'all'
-Requires-Dist: pycairo ; extra == 'all'
-Requires-Dist: matplotlib ; extra == 'all'
-Requires-Dist: sympy ; extra == 'all'
-Requires-Dist: skia-pathops >=0.5.0 ; extra == 'all'
-Requires-Dist: uharfbuzz >=0.23.0 ; extra == 'all'
-Requires-Dist: brotlicffi >=0.8.0 ; (platform_python_implementation != "CPython") and extra == 'all'
-Requires-Dist: scipy ; (platform_python_implementation != "PyPy") and extra == 'all'
-Requires-Dist: brotli >=1.0.1 ; (platform_python_implementation == "CPython") and extra == 'all'
-Requires-Dist: munkres ; (platform_python_implementation == "PyPy") and extra == 'all'
-Requires-Dist: unicodedata2 >=15.1.0 ; (python_version <= "3.12") and extra == 'all'
-Requires-Dist: xattr ; (sys_platform == "darwin") and extra == 'all'
+Provides-Extra: ufo
+Requires-Dist: fs<3,>=2.2.0; extra == "ufo"
+Provides-Extra: lxml
+Requires-Dist: lxml>=4.0; extra == "lxml"
+Provides-Extra: woff
+Requires-Dist: brotli>=1.0.1; platform_python_implementation == "CPython" and extra == "woff"
+Requires-Dist: brotlicffi>=0.8.0; platform_python_implementation != "CPython" and extra == "woff"
+Requires-Dist: zopfli>=0.1.4; extra == "woff"
+Provides-Extra: unicode
+Requires-Dist: unicodedata2>=15.1.0; python_version <= "3.12" and extra == "unicode"
Provides-Extra: graphite
-Requires-Dist: lz4 >=1.7.4.2 ; extra == 'graphite'
+Requires-Dist: lz4>=1.7.4.2; extra == "graphite"
Provides-Extra: interpolatable
-Requires-Dist: pycairo ; extra == 'interpolatable'
-Requires-Dist: scipy ; (platform_python_implementation != "PyPy") and extra == 'interpolatable'
-Requires-Dist: munkres ; (platform_python_implementation == "PyPy") and extra == 'interpolatable'
-Provides-Extra: lxml
-Requires-Dist: lxml >=4.0 ; extra == 'lxml'
-Provides-Extra: pathops
-Requires-Dist: skia-pathops >=0.5.0 ; extra == 'pathops'
+Requires-Dist: scipy; platform_python_implementation != "PyPy" and extra == "interpolatable"
+Requires-Dist: munkres; platform_python_implementation == "PyPy" and extra == "interpolatable"
+Requires-Dist: pycairo; extra == "interpolatable"
Provides-Extra: plot
-Requires-Dist: matplotlib ; extra == 'plot'
-Provides-Extra: repacker
-Requires-Dist: uharfbuzz >=0.23.0 ; extra == 'repacker'
+Requires-Dist: matplotlib; extra == "plot"
Provides-Extra: symfont
-Requires-Dist: sympy ; extra == 'symfont'
+Requires-Dist: sympy; extra == "symfont"
Provides-Extra: type1
-Requires-Dist: xattr ; (sys_platform == "darwin") and extra == 'type1'
-Provides-Extra: ufo
-Requires-Dist: fs <3,>=2.2.0 ; extra == 'ufo'
-Provides-Extra: unicode
-Requires-Dist: unicodedata2 >=15.1.0 ; (python_version <= "3.12") and extra == 'unicode'
-Provides-Extra: woff
-Requires-Dist: zopfli >=0.1.4 ; extra == 'woff'
-Requires-Dist: brotlicffi >=0.8.0 ; (platform_python_implementation != "CPython") and extra == 'woff'
-Requires-Dist: brotli >=1.0.1 ; (platform_python_implementation == "CPython") and extra == 'woff'
+Requires-Dist: xattr; sys_platform == "darwin" and extra == "type1"
+Provides-Extra: pathops
+Requires-Dist: skia-pathops>=0.5.0; extra == "pathops"
+Provides-Extra: repacker
+Requires-Dist: uharfbuzz>=0.23.0; extra == "repacker"
+Provides-Extra: all
+Requires-Dist: fs<3,>=2.2.0; extra == "all"
+Requires-Dist: lxml>=4.0; extra == "all"
+Requires-Dist: brotli>=1.0.1; platform_python_implementation == "CPython" and extra == "all"
+Requires-Dist: brotlicffi>=0.8.0; platform_python_implementation != "CPython" and extra == "all"
+Requires-Dist: zopfli>=0.1.4; extra == "all"
+Requires-Dist: unicodedata2>=15.1.0; python_version <= "3.12" and extra == "all"
+Requires-Dist: lz4>=1.7.4.2; extra == "all"
+Requires-Dist: scipy; platform_python_implementation != "PyPy" and extra == "all"
+Requires-Dist: munkres; platform_python_implementation == "PyPy" and extra == "all"
+Requires-Dist: pycairo; extra == "all"
+Requires-Dist: matplotlib; extra == "all"
+Requires-Dist: sympy; extra == "all"
+Requires-Dist: xattr; sys_platform == "darwin" and extra == "all"
+Requires-Dist: skia-pathops>=0.5.0; extra == "all"
+Requires-Dist: uharfbuzz>=0.23.0; extra == "all"
|CI Build Status| |Coverage Status| |PyPI| |Gitter Chat|
@@ -377,6 +377,15 @@ Have fun!
Changelog
~~~~~~~~~
+4.55.1 (released 2024-12-02)
+----------------------------
+
+- [ttGlyphSet] Support VARC CFF2 fonts (#3683)
+- [DecomposedTransform] Document and implement always skewY == 0 (#3697)
+- [varLib] "Fix" cython iup issue? (#3704)
+- Cython minor refactor (#3705)
+
+
4.55.0 (released 2024-11-14)
----------------------------
diff --git a/contrib/python/fonttools/fontTools/__init__.py b/contrib/python/fonttools/fontTools/__init__.py
index 502ca5cec65..6aa5f3ad593 100644
--- a/contrib/python/fonttools/fontTools/__init__.py
+++ b/contrib/python/fonttools/fontTools/__init__.py
@@ -3,6 +3,6 @@ from fontTools.misc.loggingTools import configLogger
log = logging.getLogger(__name__)
-version = __version__ = "4.55.0"
+version = __version__ = "4.55.1"
__all__ = ["version", "log", "configLogger"]
diff --git a/contrib/python/fonttools/fontTools/cffLib/transforms.py b/contrib/python/fonttools/fontTools/cffLib/transforms.py
index 5b474a7cd80..82c70f81f49 100644
--- a/contrib/python/fonttools/fontTools/cffLib/transforms.py
+++ b/contrib/python/fonttools/fontTools/cffLib/transforms.py
@@ -457,7 +457,12 @@ def remove_unused_subroutines(cff):
if subrs == font.GlobalSubrs:
if not hasattr(font, "FDArray") and hasattr(font.Private, "Subrs"):
local_subrs = font.Private.Subrs
- elif hasattr(font, "FDArray") and len(font.FDArray) == 1:
+ elif (
+ hasattr(font, "FDArray")
+ and len(font.FDArray) == 1
+ and hasattr(font.FDArray[0].Private, "Subrs")
+ ):
+ # Technically we shouldn't do this. But I've run into fonts that do it.
local_subrs = font.FDArray[0].Private.Subrs
else:
local_subrs = None
diff --git a/contrib/python/fonttools/fontTools/cu2qu/cu2qu.py b/contrib/python/fonttools/fontTools/cu2qu/cu2qu.py
index e620b48a55b..c0d4cf947b8 100644
--- a/contrib/python/fonttools/fontTools/cu2qu/cu2qu.py
+++ b/contrib/python/fonttools/fontTools/cu2qu/cu2qu.py
@@ -17,13 +17,10 @@
try:
import cython
-
- COMPILED = cython.compiled
except (AttributeError, ImportError):
# if cython not installed, use mock module with no-op decorators and types
from fontTools.misc import cython
-
- COMPILED = False
+COMPILED = cython.compiled
import math
diff --git a/contrib/python/fonttools/fontTools/misc/bezierTools.py b/contrib/python/fonttools/fontTools/misc/bezierTools.py
index 5411ff99fd0..1b37ade8d67 100644
--- a/contrib/python/fonttools/fontTools/misc/bezierTools.py
+++ b/contrib/python/fonttools/fontTools/misc/bezierTools.py
@@ -9,13 +9,10 @@ from collections import namedtuple
try:
import cython
-
- COMPILED = cython.compiled
except (AttributeError, ImportError):
# if cython not installed, use mock module with no-op decorators and types
from fontTools.misc import cython
-
- COMPILED = False
+COMPILED = cython.compiled
EPSILON = 1e-9
diff --git a/contrib/python/fonttools/fontTools/misc/symfont.py b/contrib/python/fonttools/fontTools/misc/symfont.py
index 3a8819c7743..4dea4184080 100644
--- a/contrib/python/fonttools/fontTools/misc/symfont.py
+++ b/contrib/python/fonttools/fontTools/misc/symfont.py
@@ -121,13 +121,10 @@ def printGreenPen(penName, funcs, file=sys.stdout, docstring=None):
"""from fontTools.pens.basePen import BasePen, OpenContourError
try:
import cython
-
- COMPILED = cython.compiled
except (AttributeError, ImportError):
# if cython not installed, use mock module with no-op decorators and types
from fontTools.misc import cython
-
- COMPILED = False
+COMPILED = cython.compiled
__all__ = ["%s"]
diff --git a/contrib/python/fonttools/fontTools/misc/transform.py b/contrib/python/fonttools/fontTools/misc/transform.py
index 9025b79ec12..2f4a216fa69 100644
--- a/contrib/python/fonttools/fontTools/misc/transform.py
+++ b/contrib/python/fonttools/fontTools/misc/transform.py
@@ -437,8 +437,20 @@ class DecomposedTransform:
@classmethod
def fromTransform(self, transform):
+ """Return a DecomposedTransform() equivalent of this transformation.
+ The returned solution always has skewY = 0, and angle in the (-180, 180].
+
+ :Example:
+ >>> DecomposedTransform.fromTransform(Transform(3, 0, 0, 2, 0, 0))
+ DecomposedTransform(translateX=0, translateY=0, rotation=0.0, scaleX=3.0, scaleY=2.0, skewX=0.0, skewY=0.0, tCenterX=0, tCenterY=0)
+ >>> DecomposedTransform.fromTransform(Transform(0, 0, 0, 1, 0, 0))
+ DecomposedTransform(translateX=0, translateY=0, rotation=0.0, scaleX=0.0, scaleY=1.0, skewX=0.0, skewY=0.0, tCenterX=0, tCenterY=0)
+ >>> DecomposedTransform.fromTransform(Transform(0, 0, 1, 1, 0, 0))
+ DecomposedTransform(translateX=0, translateY=0, rotation=-45.0, scaleX=0.0, scaleY=1.4142135623730951, skewX=0.0, skewY=0.0, tCenterX=0, tCenterY=0)
+ """
# Adapted from an answer on
# https://math.stackexchange.com/questions/13150/extracting-rotation-scale-values-from-2d-transformation-matrix
+
a, b, c, d, x, y = transform
sx = math.copysign(1, a)
@@ -450,21 +462,20 @@ class DecomposedTransform:
rotation = 0
scaleX = scaleY = 0
- skewX = skewY = 0
+ skewX = 0
# Apply the QR-like decomposition.
if a != 0 or b != 0:
r = math.sqrt(a * a + b * b)
rotation = math.acos(a / r) if b >= 0 else -math.acos(a / r)
scaleX, scaleY = (r, delta / r)
- skewX, skewY = (math.atan((a * c + b * d) / (r * r)), 0)
+ skewX = math.atan((a * c + b * d) / (r * r))
elif c != 0 or d != 0:
s = math.sqrt(c * c + d * d)
rotation = math.pi / 2 - (
math.acos(-c / s) if d >= 0 else -math.acos(c / s)
)
scaleX, scaleY = (delta / s, s)
- skewX, skewY = (0, math.atan((a * c + b * d) / (s * s)))
else:
# a = b = c = d = 0
pass
@@ -476,7 +487,7 @@ class DecomposedTransform:
scaleX * sx,
scaleY,
math.degrees(skewX) * sx,
- math.degrees(skewY),
+ 0.0,
0,
0,
)
diff --git a/contrib/python/fonttools/fontTools/pens/momentsPen.py b/contrib/python/fonttools/fontTools/pens/momentsPen.py
index 2afb8fdbd17..77ead9fc31c 100644
--- a/contrib/python/fonttools/fontTools/pens/momentsPen.py
+++ b/contrib/python/fonttools/fontTools/pens/momentsPen.py
@@ -2,13 +2,10 @@ from fontTools.pens.basePen import BasePen, OpenContourError
try:
import cython
-
- COMPILED = cython.compiled
except (AttributeError, ImportError):
# if cython not installed, use mock module with no-op decorators and types
from fontTools.misc import cython
-
- COMPILED = False
+COMPILED = cython.compiled
__all__ = ["MomentsPen"]
diff --git a/contrib/python/fonttools/fontTools/qu2cu/qu2cu.py b/contrib/python/fonttools/fontTools/qu2cu/qu2cu.py
index 97a665f63ad..8fe3e18b086 100644
--- a/contrib/python/fonttools/fontTools/qu2cu/qu2cu.py
+++ b/contrib/python/fonttools/fontTools/qu2cu/qu2cu.py
@@ -18,13 +18,10 @@
try:
import cython
-
- COMPILED = cython.compiled
except (AttributeError, ImportError):
# if cython not installed, use mock module with no-op decorators and types
from fontTools.misc import cython
-
- COMPILED = False
+COMPILED = cython.compiled
from fontTools.misc.bezierTools import splitCubicAtTC
from collections import namedtuple
diff --git a/contrib/python/fonttools/fontTools/ttLib/ttGlyphSet.py b/contrib/python/fonttools/fontTools/ttLib/ttGlyphSet.py
index 446c81e7db4..e8dd007c5c6 100644
--- a/contrib/python/fonttools/fontTools/ttLib/ttGlyphSet.py
+++ b/contrib/python/fonttools/fontTools/ttLib/ttGlyphSet.py
@@ -119,19 +119,35 @@ class _TTGlyphSetCFF(_TTGlyphSet):
tableTag = "CFF2" if "CFF2" in font else "CFF "
self.charStrings = list(font[tableTag].cff.values())[0].CharStrings
super().__init__(font, location, self.charStrings)
+ self.setLocation(location)
+
+ def __getitem__(self, glyphName):
+ return _TTGlyphCFF(self, glyphName)
+
+ def setLocation(self, location):
self.blender = None
if location:
+ # TODO Optimize by using instancer.setLocation()
+
from fontTools.varLib.varStore import VarStoreInstancer
varStore = getattr(self.charStrings, "varStore", None)
if varStore is not None:
instancer = VarStoreInstancer(
- varStore.otVarStore, font["fvar"].axes, location
+ varStore.otVarStore, self.font["fvar"].axes, location
)
self.blender = instancer.interpolateFromDeltas
+ else:
+ self.blender = None
- def __getitem__(self, glyphName):
- return _TTGlyphCFF(self, glyphName)
+ @contextmanager
+ def pushLocation(self, location, reset: bool):
+ self.setLocation(location)
+ with _TTGlyphSet.pushLocation(self, location, reset) as value:
+ try:
+ yield value
+ finally:
+ self.setLocation(self.location)
class _TTGlyphSetVARC(_TTGlyphSet):
@@ -335,7 +351,6 @@ class _TTGlyphVARC(_TTGlyph):
)
for comp in glyph.components:
-
if comp.flags & VarComponentFlags.HAVE_CONDITION:
condition = varc.ConditionList.ConditionTable[comp.conditionIndex]
if not _evaluateCondition(
diff --git a/contrib/python/fonttools/fontTools/varLib/iup.py b/contrib/python/fonttools/fontTools/varLib/iup.py
index 76555f35083..9ff6c0eca39 100644
--- a/contrib/python/fonttools/fontTools/varLib/iup.py
+++ b/contrib/python/fonttools/fontTools/varLib/iup.py
@@ -1,12 +1,9 @@
try:
import cython
-
- COMPILED = cython.compiled
except (AttributeError, ImportError):
# if cython not installed, use mock module with no-op decorators and types
from fontTools.misc import cython
-
- COMPILED = False
+COMPILED = cython.compiled
from typing import (
Sequence,
@@ -77,7 +74,14 @@ def iup_segment(
d = d2
else:
# Interpolate
- d = d1 + (x - x1) * scale
+ #
+ # NOTE: we assign an explicit intermediate variable here in
+ # order to disable a fused mul-add optimization. See:
+ #
+ # - https://godbolt.org/z/YsP4T3TqK,
+ # - https://github.com/fonttools/fonttools/issues/3703
+ nudge = (x - x1) * scale
+ d = d1 + nudge
out.append(d)
diff --git a/contrib/python/fonttools/ya.make b/contrib/python/fonttools/ya.make
index 874cdd1b3b7..ce8febfcdd8 100644
--- a/contrib/python/fonttools/ya.make
+++ b/contrib/python/fonttools/ya.make
@@ -2,7 +2,7 @@
PY3_LIBRARY()
-VERSION(4.55.0)
+VERSION(4.55.1)
LICENSE(MIT)