Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/fontTools/pens/transformPen.py: 33%
52 statements
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-07 06:33 +0000
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-07 06:33 +0000
1from fontTools.pens.filterPen import FilterPen, FilterPointPen
4__all__ = ["TransformPen", "TransformPointPen"]
7class TransformPen(FilterPen):
9 """Pen that transforms all coordinates using a Affine transformation,
10 and passes them to another pen.
11 """
13 def __init__(self, outPen, transformation):
14 """The 'outPen' argument is another pen object. It will receive the
15 transformed coordinates. The 'transformation' argument can either
16 be a six-tuple, or a fontTools.misc.transform.Transform object.
17 """
18 super(TransformPen, self).__init__(outPen)
19 if not hasattr(transformation, "transformPoint"):
20 from fontTools.misc.transform import Transform
22 transformation = Transform(*transformation)
23 self._transformation = transformation
24 self._transformPoint = transformation.transformPoint
25 self._stack = []
27 def moveTo(self, pt):
28 self._outPen.moveTo(self._transformPoint(pt))
30 def lineTo(self, pt):
31 self._outPen.lineTo(self._transformPoint(pt))
33 def curveTo(self, *points):
34 self._outPen.curveTo(*self._transformPoints(points))
36 def qCurveTo(self, *points):
37 if points[-1] is None:
38 points = self._transformPoints(points[:-1]) + [None]
39 else:
40 points = self._transformPoints(points)
41 self._outPen.qCurveTo(*points)
43 def _transformPoints(self, points):
44 transformPoint = self._transformPoint
45 return [transformPoint(pt) for pt in points]
47 def closePath(self):
48 self._outPen.closePath()
50 def endPath(self):
51 self._outPen.endPath()
53 def addComponent(self, glyphName, transformation):
54 transformation = self._transformation.transform(transformation)
55 self._outPen.addComponent(glyphName, transformation)
58class TransformPointPen(FilterPointPen):
59 """PointPen that transforms all coordinates using a Affine transformation,
60 and passes them to another PointPen.
62 >>> from fontTools.pens.recordingPen import RecordingPointPen
63 >>> rec = RecordingPointPen()
64 >>> pen = TransformPointPen(rec, (2, 0, 0, 2, -10, 5))
65 >>> v = iter(rec.value)
66 >>> pen.beginPath(identifier="contour-0")
67 >>> next(v)
68 ('beginPath', (), {'identifier': 'contour-0'})
69 >>> pen.addPoint((100, 100), "line")
70 >>> next(v)
71 ('addPoint', ((190, 205), 'line', False, None), {})
72 >>> pen.endPath()
73 >>> next(v)
74 ('endPath', (), {})
75 >>> pen.addComponent("a", (1, 0, 0, 1, -10, 5), identifier="component-0")
76 >>> next(v)
77 ('addComponent', ('a', <Transform [2 0 0 2 -30 15]>), {'identifier': 'component-0'})
78 """
80 def __init__(self, outPointPen, transformation):
81 """The 'outPointPen' argument is another point pen object.
82 It will receive the transformed coordinates.
83 The 'transformation' argument can either be a six-tuple, or a
84 fontTools.misc.transform.Transform object.
85 """
86 super().__init__(outPointPen)
87 if not hasattr(transformation, "transformPoint"):
88 from fontTools.misc.transform import Transform
90 transformation = Transform(*transformation)
91 self._transformation = transformation
92 self._transformPoint = transformation.transformPoint
94 def addPoint(self, pt, segmentType=None, smooth=False, name=None, **kwargs):
95 self._outPen.addPoint(
96 self._transformPoint(pt), segmentType, smooth, name, **kwargs
97 )
99 def addComponent(self, baseGlyphName, transformation, **kwargs):
100 transformation = self._transformation.transform(transformation)
101 self._outPen.addComponent(baseGlyphName, transformation, **kwargs)
104if __name__ == "__main__":
105 from fontTools.pens.basePen import _TestPen
107 pen = TransformPen(_TestPen(None), (2, 0, 0.5, 2, -10, 0))
108 pen.moveTo((0, 0))
109 pen.lineTo((0, 100))
110 pen.curveTo((50, 75), (60, 50), (50, 25), (0, 0))
111 pen.closePath()