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