transformPen.py revision 2bb6cd35063ab976c90bc82952cfe9f2701ee28c
1from fontTools.pens.basePen import AbstractPen
2
3
4__all__ = ["TransformPen"]
5
6
7class TransformPen(AbstractPen):
8
9	"""Pen that passes transforms all coordinates, and passes them
10	to another pen.
11	"""
12
13	def __init__(self, outPen, transformation):
14		if not hasattr(transformation, "transformPoint"):
15			from fontTools.misc.transform import Transform
16			transformation = Transform(*transformation)
17		self._transformation = transformation
18		self._transformPoint = transformation.transformPoint
19		self._outPen = outPen
20		self._stack = []
21
22	def moveTo(self, pt):
23		self._outPen.moveTo(self._transformPoint(pt))
24
25	def lineTo(self, pt):
26		self._outPen.lineTo(self._transformPoint(pt))
27
28	def curveTo(self, *points):
29		self._outPen.curveTo(*self._transformPoints(points))
30
31	def qCurveTo(self, *points):
32		self._outPen.qCurveTo(*self._transformPoints(points))
33
34	def _transformPoints(self, points):
35		new = []
36		transformPoint = self._transformPoint
37		for pt in points:
38			new.append(transformPoint(pt))
39		return new
40
41	def closePath(self):
42		self._outPen.closePath()
43
44	def addComponent(self, glyphName, transformation):
45		transformation = self._transformation.transform(transformation)
46		self._outPen.addComponent(glyphName, transformation)
47
48
49if __name__ == "__main__":
50	from fontTools.pens.basePen import _TestPen
51	pen = TransformPen(_TestPen(None), (2, 0, 0.5, 2, -10, 0))
52	pen.moveTo((0, 0))
53	pen.lineTo((0, 100))
54	pen.curveTo((50, 75), (60, 50), (50, 25), (0, 0))
55	pen.closePath()
56