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