Skip to main content
Glama
explicitClosingLinePen.py3.22 kB
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", ())]

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Lillard01/chatExcel-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server