[ttLib.glyf] Make sure to use the flagOnCurve mask in glyph.draw() (#1772)

* When drawing glyf outlines to a pen, make sure to use the flagOnCurve mask, so we don't trip over the overlap flag, that is set when instantiating variable fonts to indicate that overlaps are ok.

Fixes #1771.
This commit is contained in:
Just van Rossum 2019-12-06 10:27:31 +01:00 committed by GitHub
parent cfc5b44c65
commit 46a06cabf2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 28 additions and 1 deletions

View File

@ -1179,7 +1179,7 @@ class Glyph(object):
for end in endPts: for end in endPts:
end = end + 1 end = end + 1
contour = coordinates[start:end] contour = coordinates[start:end]
cFlags = flags[start:end] cFlags = [flagOnCurve & f for f in flags[start:end]]
start = end start = end
if 1 not in cFlags: if 1 not in cFlags:
# There is not a single on-curve point on the curve, # There is not a single on-curve point on the curve,

View File

@ -2,6 +2,7 @@ from fontTools.misc.py23 import *
from fontTools.misc.fixedTools import otRound from fontTools.misc.fixedTools import otRound
from fontTools.misc.testTools import getXML, parseXML from fontTools.misc.testTools import getXML, parseXML
from fontTools.pens.ttGlyphPen import TTGlyphPen from fontTools.pens.ttGlyphPen import TTGlyphPen
from fontTools.pens.recordingPen import RecordingPen
from fontTools.ttLib import TTFont, newTable, TTLibError from fontTools.ttLib import TTFont, newTable, TTLibError
from fontTools.ttLib.tables._g_l_y_f import ( from fontTools.ttLib.tables._g_l_y_f import (
GlyphCoordinates, GlyphCoordinates,
@ -284,6 +285,32 @@ class glyfTableTest(unittest.TestCase):
composite.compact(glyfTable) composite.compact(glyfTable)
def test_bit6_draw_to_pen_issue1771(self):
# https://github.com/fonttools/fonttools/issues/1771
font = TTFont(sfntVersion="\x00\x01\x00\x00")
# glyph00003 contains a bit 6 flag on the first point,
# which triggered the issue
font.importXML(GLYF_TTX)
glyfTable = font['glyf']
pen = RecordingPen()
glyfTable["glyph00003"].draw(pen, glyfTable=glyfTable)
expected = [('moveTo', ((501, 1430),)),
('lineTo', ((683, 1430),)),
('lineTo', ((1172, 0),)),
('lineTo', ((983, 0),)),
('lineTo', ((591, 1193),)),
('lineTo', ((199, 0),)),
('lineTo', ((12, 0),)),
('lineTo', ((501, 1430),)),
('closePath', ()),
('moveTo', ((249, 514),)),
('lineTo', ((935, 514),)),
('lineTo', ((935, 352),)),
('lineTo', ((249, 352),)),
('lineTo', ((249, 514),)),
('closePath', ())]
self.assertEqual(pen.value, expected)
class GlyphComponentTest: class GlyphComponentTest: