From 94c88f56cb788ae3218d3f434df6d2ecb49eee3b Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Thu, 23 Mar 2017 14:06:41 +0000 Subject: [PATCH] [recordingPen] add DecomposingRecordingPen Uses the DecomposingPen as mixin, and raise KeyError on missing glyphs See https://github.com/fonttools/fonttools/pull/880#issuecomment-288558012 --- Lib/fontTools/pens/recordingPen.py | 32 ++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/Lib/fontTools/pens/recordingPen.py b/Lib/fontTools/pens/recordingPen.py index e51568f2d..6d5921802 100644 --- a/Lib/fontTools/pens/recordingPen.py +++ b/Lib/fontTools/pens/recordingPen.py @@ -1,10 +1,10 @@ """Pen recording operations that can be accessed or replayed.""" from __future__ import print_function, division, absolute_import from fontTools.misc.py23 import * -from fontTools.pens.basePen import AbstractPen +from fontTools.pens.basePen import AbstractPen, DecomposingPen -__all__ = ["RecordingPen"] +__all__ = ["RecordingPen", "DecomposingRecordingPen"] class RecordingPen(AbstractPen): @@ -51,6 +51,34 @@ class RecordingPen(AbstractPen): getattr(pen, operator)(*operands) +class DecomposingRecordingPen(DecomposingPen, RecordingPen): + """ Same as RecordingPen, except that it doesn't keep components + as references, but draws them decomposed as regular contours. + + The constructor takes a single 'glyphSet' positional argument, + a dictionary of glyph objects (i.e. with a 'draw' method) keyed + by thir name. + + >>> class SimpleGlyph(object): + ... def draw(self, pen): + ... pen.moveTo((0, 0)) + ... pen.curveTo((1, 1), (2, 2), (3, 3)) + ... pen.closePath() + >>> class CompositeGlyph(object): + ... def draw(self, pen): + ... pen.addComponent('a', (1, 0, 0, 1, -1, 1)) + >>> glyphSet = {'a': SimpleGlyph(), 'b': CompositeGlyph()} + >>> for name, glyph in sorted(glyphSet.items()): + ... pen = DecomposingRecordingPen(glyphSet) + ... glyph.draw(pen) + ... print("{}: {}".format(name, pen.value)) + a: [('moveTo', ((0, 0),)), ('curveTo', ((1, 1), (2, 2), (3, 3))), ('closePath', ())] + b: [('moveTo', ((-1, 1),)), ('curveTo', ((0, 2), (1, 3), (2, 4))), ('closePath', ())] + """ + # raises KeyError if base glyph is not found in glyphSet + skipMissingComponents = False + + if __name__ == "__main__": from fontTools.pens.basePen import _TestPen pen = RecordingPen()