Spaces:
Running
Running
openvoice2
/
path
/to
/venv
/lib
/python3.10
/site-packages
/fontTools
/pens
/explicitClosingLinePen.py
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", ())] | |