diff options
author | Rasmus Andersson <rasmus@notion.se> | 2018-09-03 22:55:49 +0300 |
---|---|---|
committer | Rasmus Andersson <rasmus@notion.se> | 2018-09-03 22:55:49 +0300 |
commit | c833e252c925e8dd68108660710ca835d95daa6f (patch) | |
tree | 6b2e28264ed45efd7f054e453b622098d0d875b8 /misc/pylib/robofab/pens/pointPen.py | |
parent | 8c1a4c181ef12000179dfec541f1af87e9b03122 (diff) | |
download | inter-c833e252c925e8dd68108660710ca835d95daa6f.tar.xz |
Major overhaul, moving from UFO2 to Glyphs and UFO3, plus a brand new and much simpler fontbuild
Diffstat (limited to 'misc/pylib/robofab/pens/pointPen.py')
-rw-r--r-- | misc/pylib/robofab/pens/pointPen.py | 173 |
1 files changed, 0 insertions, 173 deletions
diff --git a/misc/pylib/robofab/pens/pointPen.py b/misc/pylib/robofab/pens/pointPen.py deleted file mode 100644 index dc81df38e..000000000 --- a/misc/pylib/robofab/pens/pointPen.py +++ /dev/null @@ -1,173 +0,0 @@ -__all__ = ["AbstractPointPen", "BasePointToSegmentPen", "PrintingPointPen", - "PrintingSegmentPen", "SegmentPrintingPointPen"] - - -class AbstractPointPen: - - def beginPath(self): - """Start a new sub path.""" - raise NotImplementedError - - def endPath(self): - """End the current sub path.""" - raise NotImplementedError - - def addPoint(self, pt, segmentType=None, smooth=False, name=None, **kwargs): - """Add a point to the current sub path.""" - raise NotImplementedError - - def addComponent(self, baseGlyphName, transformation): - """Add a sub glyph.""" - raise NotImplementedError - - -class BasePointToSegmentPen(AbstractPointPen): - - """Base class for retrieving the outline in a segment-oriented - way. The PointPen protocol is simple yet also a little tricky, - so when you need an outline presented as segments but you have - as points, do use this base implementation as it properly takes - care of all the edge cases. - """ - - def __init__(self): - self.currentPath = None - - def beginPath(self): - assert self.currentPath is None - self.currentPath = [] - - def _flushContour(self, segments): - """Override this method. - - It will be called for each non-empty sub path with a list - of segments: the 'segments' argument. - - The segments list contains tuples of length 2: - (segmentType, points) - - segmentType is one of "move", "line", "curve" or "qcurve". - "move" may only occur as the first segment, and it signifies - an OPEN path. A CLOSED path does NOT start with a "move", in - fact it will not contain a "move" at ALL. - - The 'points' field in the 2-tuple is a list of point info - tuples. The list has 1 or more items, a point tuple has - four items: - (point, smooth, name, kwargs) - 'point' is an (x, y) coordinate pair. - - For a closed path, the initial moveTo point is defined as - the last point of the last segment. - - The 'points' list of "move" and "line" segments always contains - exactly one point tuple. - """ - raise NotImplementedError - - def endPath(self): - assert self.currentPath is not None - points = self.currentPath - self.currentPath = None - if not points: - return - if len(points) == 1: - # Not much more we can do than output a single move segment. - pt, segmentType, smooth, name, kwargs = points[0] - segments = [("move", [(pt, smooth, name, kwargs)])] - self._flushContour(segments) - return - segments = [] - if points[0][1] == "move": - # It's an open contour, insert a "move" segment for the first - # point and remove that first point from the point list. - pt, segmentType, smooth, name, kwargs = points[0] - segments.append(("move", [(pt, smooth, name, kwargs)])) - points.pop(0) - else: - # It's a closed contour. Locate the first on-curve point, and - # rotate the point list so that it _ends_ with an on-curve - # point. - firstOnCurve = None - for i in range(len(points)): - segmentType = points[i][1] - if segmentType is not None: - firstOnCurve = i - break - if firstOnCurve is None: - # Special case for quadratics: a contour with no on-curve - # points. Add a "None" point. (See also the Pen protocol's - # qCurveTo() method and fontTools.pens.basePen.py.) - points.append((None, "qcurve", None, None, None)) - else: - points = points[firstOnCurve+1:] + points[:firstOnCurve+1] - - currentSegment = [] - for pt, segmentType, smooth, name, kwargs in points: - currentSegment.append((pt, smooth, name, kwargs)) - if segmentType is None: - continue - segments.append((segmentType, currentSegment)) - currentSegment = [] - - self._flushContour(segments) - - def addPoint(self, pt, segmentType=None, smooth=False, name=None, **kwargs): - self.currentPath.append((pt, segmentType, smooth, name, kwargs)) - - -class PrintingPointPen(AbstractPointPen): - def __init__(self): - self.havePath = False - def beginPath(self): - self.havePath = True - print "pen.beginPath()" - def endPath(self): - self.havePath = False - print "pen.endPath()" - def addPoint(self, pt, segmentType=None, smooth=False, name=None, **kwargs): - assert self.havePath - args = ["(%s, %s)" % (pt[0], pt[1])] - if segmentType is not None: - args.append("segmentType=%r" % segmentType) - if smooth: - args.append("smooth=True") - if name is not None: - args.append("name=%r" % name) - if kwargs: - args.append("**%s" % kwargs) - print "pen.addPoint(%s)" % ", ".join(args) - def addComponent(self, baseGlyphName, transformation): - assert not self.havePath - print "pen.addComponent(%r, %s)" % (baseGlyphName, tuple(transformation)) - - -from fontTools.pens.basePen import AbstractPen - -class PrintingSegmentPen(AbstractPen): - def moveTo(self, pt): - print "pen.moveTo(%s)" % (pt,) - def lineTo(self, pt): - print "pen.lineTo(%s)" % (pt,) - def curveTo(self, *pts): - print "pen.curveTo%s" % (pts,) - def qCurveTo(self, *pts): - print "pen.qCurveTo%s" % (pts,) - def closePath(self): - print "pen.closePath()" - def endPath(self): - print "pen.endPath()" - def addComponent(self, baseGlyphName, transformation): - print "pen.addComponent(%r, %s)" % (baseGlyphName, tuple(transformation)) - - -class SegmentPrintingPointPen(BasePointToSegmentPen): - def _flushContour(self, segments): - from pprint import pprint - pprint(segments) - - -if __name__ == "__main__": - p = SegmentPrintingPointPen() - from robofab.test.test_pens import TestShapes - TestShapes.onCurveLessQuadShape(p) |