|
from fontTools.pens.filterPen import ContourFilterPen |
|
|
|
|
|
class ExplicitClosingLinePen(ContourFilterPen): |
|
"""A filter pen that adds an explicit lineTo to the first point of each closed |
|
contour if the end point of the last segment is not already the same as the first point. |
|
Otherwise, it passes the contour through unchanged. |
|
|
|
>>> from pprint import pprint |
|
>>> from fontTools.pens.recordingPen import RecordingPen |
|
>>> rec = RecordingPen() |
|
>>> pen = ExplicitClosingLinePen(rec) |
|
>>> pen.moveTo((0, 0)) |
|
>>> pen.lineTo((100, 0)) |
|
>>> pen.lineTo((100, 100)) |
|
>>> pen.closePath() |
|
>>> pprint(rec.value) |
|
[('moveTo', ((0, 0),)), |
|
('lineTo', ((100, 0),)), |
|
('lineTo', ((100, 100),)), |
|
('lineTo', ((0, 0),)), |
|
('closePath', ())] |
|
>>> rec = RecordingPen() |
|
>>> pen = ExplicitClosingLinePen(rec) |
|
>>> pen.moveTo((0, 0)) |
|
>>> pen.lineTo((100, 0)) |
|
>>> pen.lineTo((100, 100)) |
|
>>> pen.lineTo((0, 0)) |
|
>>> pen.closePath() |
|
>>> pprint(rec.value) |
|
[('moveTo', ((0, 0),)), |
|
('lineTo', ((100, 0),)), |
|
('lineTo', ((100, 100),)), |
|
('lineTo', ((0, 0),)), |
|
('closePath', ())] |
|
>>> rec = RecordingPen() |
|
>>> pen = ExplicitClosingLinePen(rec) |
|
>>> pen.moveTo((0, 0)) |
|
>>> pen.curveTo((100, 0), (0, 100), (100, 100)) |
|
>>> pen.closePath() |
|
>>> pprint(rec.value) |
|
[('moveTo', ((0, 0),)), |
|
('curveTo', ((100, 0), (0, 100), (100, 100))), |
|
('lineTo', ((0, 0),)), |
|
('closePath', ())] |
|
>>> rec = RecordingPen() |
|
>>> pen = ExplicitClosingLinePen(rec) |
|
>>> pen.moveTo((0, 0)) |
|
>>> pen.curveTo((100, 0), (0, 100), (100, 100)) |
|
>>> pen.lineTo((0, 0)) |
|
>>> pen.closePath() |
|
>>> pprint(rec.value) |
|
[('moveTo', ((0, 0),)), |
|
('curveTo', ((100, 0), (0, 100), (100, 100))), |
|
('lineTo', ((0, 0),)), |
|
('closePath', ())] |
|
>>> rec = RecordingPen() |
|
>>> pen = ExplicitClosingLinePen(rec) |
|
>>> pen.moveTo((0, 0)) |
|
>>> pen.curveTo((100, 0), (0, 100), (0, 0)) |
|
>>> pen.closePath() |
|
>>> pprint(rec.value) |
|
[('moveTo', ((0, 0),)), |
|
('curveTo', ((100, 0), (0, 100), (0, 0))), |
|
('closePath', ())] |
|
>>> rec = RecordingPen() |
|
>>> pen = ExplicitClosingLinePen(rec) |
|
>>> pen.moveTo((0, 0)) |
|
>>> pen.closePath() |
|
>>> pprint(rec.value) |
|
[('moveTo', ((0, 0),)), ('closePath', ())] |
|
>>> rec = RecordingPen() |
|
>>> pen = ExplicitClosingLinePen(rec) |
|
>>> pen.closePath() |
|
>>> pprint(rec.value) |
|
[('closePath', ())] |
|
>>> rec = RecordingPen() |
|
>>> pen = ExplicitClosingLinePen(rec) |
|
>>> pen.moveTo((0, 0)) |
|
>>> pen.lineTo((100, 0)) |
|
>>> pen.lineTo((100, 100)) |
|
>>> pen.endPath() |
|
>>> pprint(rec.value) |
|
[('moveTo', ((0, 0),)), |
|
('lineTo', ((100, 0),)), |
|
('lineTo', ((100, 100),)), |
|
('endPath', ())] |
|
""" |
|
|
|
def filterContour(self, contour): |
|
if ( |
|
not contour |
|
or contour[0][0] != "moveTo" |
|
or contour[-1][0] != "closePath" |
|
or len(contour) < 3 |
|
): |
|
return |
|
movePt = contour[0][1][0] |
|
lastSeg = contour[-2][1] |
|
if lastSeg and movePt != lastSeg[-1]: |
|
contour[-1:] = [("lineTo", (movePt,)), ("closePath", ())] |
|
|