[pens] remove ReverseContourPointPen copy; import it from ufoLib (v2.1.0)
... or from robofab (I haven't tested the latter though)
This commit is contained in:
parent
27842267cd
commit
153404077d
@ -5,9 +5,11 @@ from fontTools.pens.basePen import AbstractPen, decomposeSuperBezierSegment
|
|||||||
try:
|
try:
|
||||||
from ufoLib.pointPen import AbstractPointPen, BasePointToSegmentPen
|
from ufoLib.pointPen import AbstractPointPen, BasePointToSegmentPen
|
||||||
from ufoLib.pointPen import PointToSegmentPen, SegmentToPointPen
|
from ufoLib.pointPen import PointToSegmentPen, SegmentToPointPen
|
||||||
|
from ufoLib.pointPen import ReverseContourPointPen
|
||||||
except ImportError:
|
except ImportError:
|
||||||
from robofab.pens.pointPen import AbstractPointPen, BasePointToSegmentPen
|
from robofab.pens.pointPen import AbstractPointPen, BasePointToSegmentPen
|
||||||
from robofab.pens.adapterPens import PointToSegmentPen, SegmentToPointPen
|
from robofab.pens.adapterPens import PointToSegmentPen, SegmentToPointPen
|
||||||
|
from robofab.pens.reverseContourPointPen import ReverseContourPointPen
|
||||||
|
|
||||||
|
|
||||||
class Cu2QuPen(AbstractPen):
|
class Cu2QuPen(AbstractPen):
|
||||||
@ -227,90 +229,6 @@ class Cu2QuPointPen(BasePointToSegmentPen):
|
|||||||
self.pen.addComponent(baseGlyphName, transformation)
|
self.pen.addComponent(baseGlyphName, transformation)
|
||||||
|
|
||||||
|
|
||||||
class ReverseContourPointPen(AbstractPointPen):
|
|
||||||
|
|
||||||
"""This is a PointPen that passes outline data to another PointPen, but
|
|
||||||
reversing the winding direction of all contours. Components are simply
|
|
||||||
passed through unchanged.
|
|
||||||
|
|
||||||
Closed contours are reversed in such a way that the first point remains
|
|
||||||
the first point.
|
|
||||||
|
|
||||||
(Copied from robofab.pens.reverseContourPointPen)
|
|
||||||
|
|
||||||
TODO(anthrotype) Move this to future "penBox" package?
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, outputPointPen):
|
|
||||||
self.pen = outputPointPen
|
|
||||||
# a place to store the points for the current sub path
|
|
||||||
self.currentContour = None
|
|
||||||
|
|
||||||
def _flushContour(self):
|
|
||||||
pen = self.pen
|
|
||||||
contour = self.currentContour
|
|
||||||
if not contour:
|
|
||||||
pen.beginPath()
|
|
||||||
pen.endPath()
|
|
||||||
return
|
|
||||||
|
|
||||||
closed = contour[0][1] != "move"
|
|
||||||
if not closed:
|
|
||||||
lastSegmentType = "move"
|
|
||||||
else:
|
|
||||||
# Remove the first point and insert it at the end. When
|
|
||||||
# the list of points gets reversed, this point will then
|
|
||||||
# again be at the start. In other words, the following
|
|
||||||
# will hold:
|
|
||||||
# for N in range(len(originalContour)):
|
|
||||||
# originalContour[N] == reversedContour[-N]
|
|
||||||
contour.append(contour.pop(0))
|
|
||||||
# Find the first on-curve point.
|
|
||||||
firstOnCurve = None
|
|
||||||
for i in range(len(contour)):
|
|
||||||
if contour[i][1] is not None:
|
|
||||||
firstOnCurve = i
|
|
||||||
break
|
|
||||||
if firstOnCurve is None:
|
|
||||||
# There are no on-curve points, be basically have to
|
|
||||||
# do nothing but contour.reverse().
|
|
||||||
lastSegmentType = None
|
|
||||||
else:
|
|
||||||
lastSegmentType = contour[firstOnCurve][1]
|
|
||||||
|
|
||||||
contour.reverse()
|
|
||||||
if not closed:
|
|
||||||
# Open paths must start with a move, so we simply dump
|
|
||||||
# all off-curve points leading up to the first on-curve.
|
|
||||||
while contour[0][1] is None:
|
|
||||||
contour.pop(0)
|
|
||||||
pen.beginPath()
|
|
||||||
for pt, nextSegmentType, smooth, name in contour:
|
|
||||||
if nextSegmentType is not None:
|
|
||||||
segmentType = lastSegmentType
|
|
||||||
lastSegmentType = nextSegmentType
|
|
||||||
else:
|
|
||||||
segmentType = None
|
|
||||||
pen.addPoint(pt, segmentType=segmentType, smooth=smooth, name=name)
|
|
||||||
pen.endPath()
|
|
||||||
|
|
||||||
def beginPath(self):
|
|
||||||
assert self.currentContour is None
|
|
||||||
self.currentContour = []
|
|
||||||
|
|
||||||
def endPath(self):
|
|
||||||
assert self.currentContour is not None
|
|
||||||
self._flushContour()
|
|
||||||
self.currentContour = None
|
|
||||||
|
|
||||||
def addPoint(self, pt, segmentType=None, smooth=False, name=None, **kwargs):
|
|
||||||
self.currentContour.append((pt, segmentType, smooth, name))
|
|
||||||
|
|
||||||
def addComponent(self, glyphName, transform):
|
|
||||||
assert self.currentContour is None
|
|
||||||
self.pen.addComponent(glyphName, transform)
|
|
||||||
|
|
||||||
|
|
||||||
class ReverseContourPen(SegmentToPointPen):
|
class ReverseContourPen(SegmentToPointPen):
|
||||||
""" Same as 'ReverseContourPointPen' but using the SegmentPen protocol. """
|
""" Same as 'ReverseContourPointPen' but using the SegmentPen protocol. """
|
||||||
|
|
||||||
|
@ -17,8 +17,8 @@ class BaseDummyPen(object):
|
|||||||
"""Return the pen commands as a string of python code."""
|
"""Return the pen commands as a string of python code."""
|
||||||
return _repr_pen_commands(self.commands)
|
return _repr_pen_commands(self.commands)
|
||||||
|
|
||||||
def addComponent(self, glyphName, transformation):
|
def addComponent(self, glyphName, transformation, **kwargs):
|
||||||
self.commands.append(('addComponent', (glyphName, transformation), {}))
|
self.commands.append(('addComponent', (glyphName, transformation), kwargs))
|
||||||
|
|
||||||
|
|
||||||
class DummyPen(BaseDummyPen):
|
class DummyPen(BaseDummyPen):
|
||||||
@ -46,8 +46,8 @@ class DummyPen(BaseDummyPen):
|
|||||||
class DummyPointPen(BaseDummyPen):
|
class DummyPointPen(BaseDummyPen):
|
||||||
"""A PointPen that records the commands it's called with."""
|
"""A PointPen that records the commands it's called with."""
|
||||||
|
|
||||||
def beginPath(self):
|
def beginPath(self, **kwargs):
|
||||||
self.commands.append(('beginPath', tuple(), {}))
|
self.commands.append(('beginPath', tuple(), kwargs))
|
||||||
|
|
||||||
def endPath(self):
|
def endPath(self):
|
||||||
self.commands.append(('endPath', tuple(), {}))
|
self.commands.append(('endPath', tuple(), {}))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user