11ae29591efbb29492ce05378909ccf4028d7c1eeBehdad Esfahbodfrom __future__ import print_function, division, absolute_import
27ed91eca1eaa96b79eae780778e89bb9ec44c1eeBehdad Esfahbodfrom fontTools.misc.py23 import *
3b369ef33fcbfd39bd5aaf2b079cef1c689095783jvrfrom fontTools.pens.basePen import AbstractPen
4b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr
5b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr
6b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr__all__ = ["TransformPen"]
7b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr
8b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr
9b369ef33fcbfd39bd5aaf2b079cef1c689095783jvrclass TransformPen(AbstractPen):
10b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr
110b0fec3b08144d33b5a419d5b2ec95ad37dcf1e9jvr	"""Pen that transforms all coordinates using a Affine transformation,
120b0fec3b08144d33b5a419d5b2ec95ad37dcf1e9jvr	and passes them to another pen.
13b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr	"""
14b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr
15b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr	def __init__(self, outPen, transformation):
160b0fec3b08144d33b5a419d5b2ec95ad37dcf1e9jvr		"""The 'outPen' argument is another pen object. It will receive the
170b0fec3b08144d33b5a419d5b2ec95ad37dcf1e9jvr		transformed coordinates. The 'transformation' argument can either
180b0fec3b08144d33b5a419d5b2ec95ad37dcf1e9jvr		be a six-tuple, or a fontTools.misc.transform.Transform object.
190b0fec3b08144d33b5a419d5b2ec95ad37dcf1e9jvr		"""
20b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr		if not hasattr(transformation, "transformPoint"):
21b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr			from fontTools.misc.transform import Transform
22b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr			transformation = Transform(*transformation)
23b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr		self._transformation = transformation
24b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr		self._transformPoint = transformation.transformPoint
25b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr		self._outPen = outPen
26b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr		self._stack = []
27b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr
28b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr	def moveTo(self, pt):
29b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr		self._outPen.moveTo(self._transformPoint(pt))
30b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr
31b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr	def lineTo(self, pt):
322bb6cd35063ab976c90bc82952cfe9f2701ee28cjvr		self._outPen.lineTo(self._transformPoint(pt))
33b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr
34b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr	def curveTo(self, *points):
35b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr		self._outPen.curveTo(*self._transformPoints(points))
36b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr
37b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr	def qCurveTo(self, *points):
38fbff58cd7800b876308cf3929338daf94bb90d30jvr		if points[-1] is None:
39fbff58cd7800b876308cf3929338daf94bb90d30jvr			points = self._transformPoints(points[:-1]) + [None]
40fbff58cd7800b876308cf3929338daf94bb90d30jvr		else:
41fbff58cd7800b876308cf3929338daf94bb90d30jvr			points = self._transformPoints(points)
42fbff58cd7800b876308cf3929338daf94bb90d30jvr		self._outPen.qCurveTo(*points)
43b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr
44b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr	def _transformPoints(self, points):
45b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr		new = []
46b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr		transformPoint = self._transformPoint
47b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr		for pt in points:
48b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr			new.append(transformPoint(pt))
49b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr		return new
50b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr
51b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr	def closePath(self):
52b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr		self._outPen.closePath()
53b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr
54b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr	def addComponent(self, glyphName, transformation):
55b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr		transformation = self._transformation.transform(transformation)
56b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr		self._outPen.addComponent(glyphName, transformation)
57b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr
58b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr
59b369ef33fcbfd39bd5aaf2b079cef1c689095783jvrif __name__ == "__main__":
60b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr	from fontTools.pens.basePen import _TestPen
61b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr	pen = TransformPen(_TestPen(None), (2, 0, 0.5, 2, -10, 0))
62b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr	pen.moveTo((0, 0))
63b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr	pen.lineTo((0, 100))
64b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr	pen.curveTo((50, 75), (60, 50), (50, 25), (0, 0))
65b369ef33fcbfd39bd5aaf2b079cef1c689095783jvr	pen.closePath()
66