diff --git a/Lib/fontTools/ttLib/tables/_g_l_y_f.py b/Lib/fontTools/ttLib/tables/_g_l_y_f.py index 46c5dca50..341c4ed64 100644 --- a/Lib/fontTools/ttLib/tables/_g_l_y_f.py +++ b/Lib/fontTools/ttLib/tables/_g_l_y_f.py @@ -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: diff --git a/Tests/ttLib/ttGlyphSet_test.py b/Tests/ttLib/ttGlyphSet_test.py index 3a4d9a937..1b31d229a 100644 --- a/Tests/ttLib/ttGlyphSet_test.py +++ b/Tests/ttLib/ttGlyphSet_test.py @@ -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