From 85207350a8e545ce44b5b6e3e91f1c3c95f3d532 Mon Sep 17 00:00:00 2001 From: Jens Kutilek Date: Mon, 5 May 2025 16:22:27 +0200 Subject: [PATCH 1/3] Add more type annotations to pointPens --- Lib/fontTools/pens/pointPen.py | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/Lib/fontTools/pens/pointPen.py b/Lib/fontTools/pens/pointPen.py index 93a9201c99..c35d1feb41 100644 --- a/Lib/fontTools/pens/pointPen.py +++ b/Lib/fontTools/pens/pointPen.py @@ -12,12 +12,14 @@ For instance, whether or not a point is smooth, and its name. """ +from __future__ import annotations + import math -from typing import Any, Optional, Tuple, Dict +from typing import Any, Dict, List, Optional, Tuple from fontTools.misc.loggingTools import LogMixin -from fontTools.pens.basePen import AbstractPen, MissingComponentError, PenError from fontTools.misc.transform import DecomposedTransform, Identity +from fontTools.pens.basePen import AbstractPen, MissingComponentError, PenError __all__ = [ "AbstractPointPen", @@ -28,6 +30,14 @@ "ReverseContourPointPen", ] +# Some type aliases to make it easier below +Point = Tuple[float, float] +PointName = str | None +# [(pt, smooth, name, kwargs)] +SegmentPointList = List[Tuple[Point | None, bool, PointName, Any]] +SegmentType = str | None +SegmentList = List[Tuple[SegmentType, SegmentPointList]] + class AbstractPointPen: """Baseclass for all PointPens.""" @@ -88,7 +98,7 @@ class BasePointToSegmentPen(AbstractPointPen): care of all the edge cases. """ - def __init__(self): + def __init__(self) -> None: self.currentPath = None def beginPath(self, identifier=None, **kwargs): @@ -96,7 +106,7 @@ def beginPath(self, identifier=None, **kwargs): raise PenError("Path already begun.") self.currentPath = [] - def _flushContour(self, segments): + def _flushContour(self, segments: SegmentList) -> None: """Override this method. It will be called for each non-empty sub path with a list @@ -124,7 +134,7 @@ def _flushContour(self, segments): """ raise NotImplementedError - def endPath(self): + def endPath(self) -> None: if self.currentPath is None: raise PenError("Path not begun.") points = self.currentPath @@ -134,7 +144,7 @@ def endPath(self): if len(points) == 1: # Not much more we can do than output a single move segment. pt, segmentType, smooth, name, kwargs = points[0] - segments = [("move", [(pt, smooth, name, kwargs)])] + segments: SegmentList = [("move", [(pt, smooth, name, kwargs)])] self._flushContour(segments) return segments = [] @@ -162,7 +172,7 @@ def endPath(self): else: points = points[firstOnCurve + 1 :] + points[: firstOnCurve + 1] - currentSegment = [] + currentSegment: SegmentPointList = [] for pt, segmentType, smooth, name, kwargs in points: currentSegment.append((pt, smooth, name, kwargs)) if segmentType is None: @@ -189,7 +199,7 @@ class PointToSegmentPen(BasePointToSegmentPen): and kwargs. """ - def __init__(self, segmentPen, outputImpliedClosingLine=False): + def __init__(self, segmentPen, outputImpliedClosingLine: bool = False) -> None: BasePointToSegmentPen.__init__(self) self.pen = segmentPen self.outputImpliedClosingLine = outputImpliedClosingLine @@ -271,14 +281,14 @@ class SegmentToPointPen(AbstractPen): PointPen protocol. """ - def __init__(self, pointPen, guessSmooth=True): + def __init__(self, pointPen, guessSmooth=True) -> None: if guessSmooth: self.pen = GuessSmoothPointPen(pointPen) else: self.pen = pointPen - self.contour = None + self.contour: List[Tuple[Point, SegmentType]] | None = None - def _flushContour(self): + def _flushContour(self) -> None: pen = self.pen pen.beginPath() for pt, segmentType in self.contour: From cdfbe9aede155ef835919db1eef2d1b3e3f770ed Mon Sep 17 00:00:00 2001 From: Jens Kutilek Date: Mon, 5 May 2025 16:22:36 +0200 Subject: [PATCH 2/3] Remove unused variable --- Lib/fontTools/pens/pointPen.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Lib/fontTools/pens/pointPen.py b/Lib/fontTools/pens/pointPen.py index c35d1feb41..141c8ad6d9 100644 --- a/Lib/fontTools/pens/pointPen.py +++ b/Lib/fontTools/pens/pointPen.py @@ -604,7 +604,6 @@ def addComponent(self, baseGlyphName, transformation, identifier=None, **kwargs) # if the transformation has a negative determinant, it will # reverse the contour direction of the component a, b, c, d = transformation[:4] - det = a * d - b * c if a * d - b * c < 0: pen = ReverseContourPointPen(pen) glyph.drawPoints(pen) From 2fd02974addb4583cd16089632cacf272141c889 Mon Sep 17 00:00:00 2001 From: Jens Kutilek Date: Mon, 5 May 2025 16:29:04 +0200 Subject: [PATCH 3/3] Fixes for Python 3.8 --- Lib/fontTools/pens/pointPen.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Lib/fontTools/pens/pointPen.py b/Lib/fontTools/pens/pointPen.py index 141c8ad6d9..843d7a28d3 100644 --- a/Lib/fontTools/pens/pointPen.py +++ b/Lib/fontTools/pens/pointPen.py @@ -32,10 +32,10 @@ # Some type aliases to make it easier below Point = Tuple[float, float] -PointName = str | None +PointName = Optional[str] # [(pt, smooth, name, kwargs)] -SegmentPointList = List[Tuple[Point | None, bool, PointName, Any]] -SegmentType = str | None +SegmentPointList = List[Tuple[Optional[Point], bool, PointName, Any]] +SegmentType = Optional[str] SegmentList = List[Tuple[SegmentType, SegmentPointList]] @@ -286,7 +286,7 @@ def __init__(self, pointPen, guessSmooth=True) -> None: self.pen = GuessSmoothPointPen(pointPen) else: self.pen = pointPen - self.contour: List[Tuple[Point, SegmentType]] | None = None + self.contour: Optional[List[Tuple[Point, SegmentType]]] = None def _flushContour(self) -> None: pen = self.pen