transformPen.py revision 7ed91eca1eaa96b79eae780778e89bb9ec44c1ee
1from fontTools.pens.basePen import AbstractPen
2from fontTools.misc.py23 import *
3
4
5__all__ = ["TransformPen"]
6
7
8class TransformPen(AbstractPen):
9
10	"""Pen that transforms all coordinates using a Affine transformation,
11	and passes them to another pen.
12	"""
13
14	def __init__(self, outPen, transformation):
15		"""The 'outPen' argument is another pen object. It will receive the
16		transformed coordinates. The 'transformation' argument can either
17		be a six-tuple, or a fontTools.misc.transform.Transform object.
18		"""
19		if not hasattr(transformation, "transformPoint"):
20			from fontTools.misc.transform import Transform
21			transformation = Transform(*transformation)
22		self._transformation = transformation
23		self._transformPoint = transformation.transformPoint
24		self._outPen = outPen
25		self._stack = []
26
27	def moveTo(self, pt):
28		self._outPen.moveTo(self._transformPoint(pt))
29
30	def lineTo(self, pt):
31		self._outPen.lineTo(self._transformPoint(pt))
32
33	def curveTo(self, *points):
34		self._outPen.curveTo(*self._transformPoints(points))
35
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)
42
43	def _transformPoints(self, points):
44		new = []
45		transformPoint = self._transformPoint
46		for pt in points:
47			new.append(transformPoint(pt))
48		return new
49
50	def closePath(self):
51		self._outPen.closePath()
52
53	def addComponent(self, glyphName, transformation):
54		transformation = self._transformation.transform(transformation)
55		self._outPen.addComponent(glyphName, transformation)
56
57
58if __name__ == "__main__":
59	from fontTools.pens.basePen import _TestPen
60	pen = TransformPen(_TestPen(None), (2, 0, 0.5, 2, -10, 0))
61	pen.moveTo((0, 0))
62	pen.lineTo((0, 100))
63	pen.curveTo((50, 75), (60, 50), (50, 25), (0, 0))
64	pen.closePath()
65