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