diff options
| author | robot-piglet <[email protected]> | 2024-12-18 10:16:08 +0300 |
|---|---|---|
| committer | robot-piglet <[email protected]> | 2024-12-18 10:29:14 +0300 |
| commit | 691a35e0546dbd763dd51657b1a3816a3c40e094 (patch) | |
| tree | 651c5813885adb4fa8993f44b364a0a7a148e7ad /contrib/python/fonttools | |
| parent | 72b6bf1f88ac4ec4ed2adf6dda915278c5d2b924 (diff) | |
Intermediate changes
commit_hash:1a5e9f4585838729a12fdcba5306caddb2c0c7ac
Diffstat (limited to 'contrib/python/fonttools')
| -rw-r--r-- | contrib/python/fonttools/.dist-info/METADATA | 85 | ||||
| -rw-r--r-- | contrib/python/fonttools/fontTools/__init__.py | 2 | ||||
| -rw-r--r-- | contrib/python/fonttools/fontTools/cffLib/transforms.py | 7 | ||||
| -rw-r--r-- | contrib/python/fonttools/fontTools/cu2qu/cu2qu.py | 5 | ||||
| -rw-r--r-- | contrib/python/fonttools/fontTools/misc/bezierTools.py | 5 | ||||
| -rw-r--r-- | contrib/python/fonttools/fontTools/misc/symfont.py | 5 | ||||
| -rw-r--r-- | contrib/python/fonttools/fontTools/misc/transform.py | 19 | ||||
| -rw-r--r-- | contrib/python/fonttools/fontTools/pens/momentsPen.py | 5 | ||||
| -rw-r--r-- | contrib/python/fonttools/fontTools/qu2cu/qu2cu.py | 5 | ||||
| -rw-r--r-- | contrib/python/fonttools/fontTools/ttLib/ttGlyphSet.py | 23 | ||||
| -rw-r--r-- | contrib/python/fonttools/fontTools/varLib/iup.py | 14 | ||||
| -rw-r--r-- | contrib/python/fonttools/ya.make | 2 |
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) |
