[cubic-glyf] Fix drawPoints() contour ending with cubic offCurve

Fixes https://github.com/fonttools/fonttools/issues/3189
This commit is contained in:
Behdad Esfahbod 2023-06-27 09:23:46 -06:00
parent 1138e5b0df
commit 9974a74a18
2 changed files with 80 additions and 2 deletions

View File

@ -1528,9 +1528,15 @@ class Glyph(object):
start = end
pen.beginPath()
# Start with the appropriate segment type based on the final segment
segmentType = "line" if cFlags[-1] == 1 else "qcurve"
if cFlags[-1] & flagOnCurve:
segmentType = "line"
elif cFlags[-1] & flagCubic:
segmentType = "curve"
else:
segmentType = "qcurve"
for i, pt in enumerate(contour):
if cFlags[i] & flagOnCurve == 1:
if cFlags[i] & flagOnCurve:
pen.addPoint(pt, segmentType=segmentType)
segmentType = "line"
else:

View File

@ -563,14 +563,68 @@ class TTGlyphSetTest(object):
glyphset["one"].draw(pen)
assert pen.value == expected
expectedPoints = [
("beginPath", (), {}),
("addPoint", ((76, 181), "curve", False, None), {}),
("addPoint", ((103, 181), None, False, None), {}),
("addPoint", ((125, 158), None, False, None), {}),
("addPoint", ((125, 104), None, False, None), {}),
("addPoint", ((103, 82), None, False, None), {}),
("addPoint", ((76, 82), "curve", False, None), {}),
("addPoint", ((48, 82), None, False, None), {}),
("addPoint", ((26, 104), None, False, None), {}),
("addPoint", ((26, 158), None, False, None), {}),
("addPoint", ((48, 181), None, False, None), {}),
("endPath", (), {}),
]
pen = RecordingPointPen()
glyphset["one"].drawPoints(pen)
assert pen.value == expectedPoints
pen = RecordingPen()
glyphset["two"].draw(pen)
assert pen.value == expected
expectedPoints = [
("beginPath", (), {}),
("addPoint", ((26, 158), None, False, None), {}),
("addPoint", ((48, 181), None, False, None), {}),
("addPoint", ((76, 181), "curve", False, None), {}),
("addPoint", ((103, 181), None, False, None), {}),
("addPoint", ((125, 158), None, False, None), {}),
("addPoint", ((125, 104), None, False, None), {}),
("addPoint", ((103, 82), None, False, None), {}),
("addPoint", ((76, 82), "curve", False, None), {}),
("addPoint", ((48, 82), None, False, None), {}),
("addPoint", ((26, 104), None, False, None), {}),
("endPath", (), {}),
]
pen = RecordingPointPen()
glyphset["two"].drawPoints(pen)
assert pen.value == expectedPoints
pen = RecordingPen()
glyphset["three"].draw(pen)
assert pen.value == expected
expectedPoints = [
("beginPath", (), {}),
("addPoint", ((48, 82), None, False, None), {}),
("addPoint", ((26, 104), None, False, None), {}),
("addPoint", ((26, 158), None, False, None), {}),
("addPoint", ((48, 181), None, False, None), {}),
("addPoint", ((76, 181), "curve", False, None), {}),
("addPoint", ((103, 181), None, False, None), {}),
("addPoint", ((125, 158), None, False, None), {}),
("addPoint", ((125, 104), None, False, None), {}),
("addPoint", ((103, 82), None, False, None), {}),
("addPoint", ((76, 82), "curve", False, None), {}),
("endPath", (), {}),
]
pen = RecordingPointPen()
glyphset["three"].drawPoints(pen)
assert pen.value == expectedPoints
pen = RecordingPen()
glyphset["four"].draw(pen)
assert pen.value == [
@ -581,3 +635,21 @@ class TTGlyphSetTest(object):
("curveTo", ((26, 158), (48, 181), (75.5, 181))),
("closePath", ()),
]
# Ouch! We can't represent all-cubic-offcurves in pointPen!
expectedPoints = [
("beginPath", (), {}),
("addPoint", ((103, 181), None, False, None), {}),
("addPoint", ((125, 158), None, False, None), {}),
("addPoint", ((125, 104), None, False, None), {}),
("addPoint", ((103, 82), None, False, None), {}),
("addPoint", ((48, 82), None, False, None), {}),
("addPoint", ((26, 104), None, False, None), {}),
("addPoint", ((26, 158), None, False, None), {}),
("addPoint", ((48, 181), None, False, None), {}),
("endPath", (), {}),
]
pen = RecordingPointPen()
glyphset["four"].drawPoints(pen)
print(pen.value)
assert pen.value == expectedPoints