| from fontTools.ttLib import TTFont |
| from fontTools.ttLib import ttGlyphSet |
| from fontTools.pens.recordingPen import RecordingPen |
| import os |
| import pytest |
| |
| |
| class TTGlyphSetTest(object): |
| @staticmethod |
| def getpath(testfile): |
| path = os.path.dirname(__file__) |
| return os.path.join(path, "data", testfile) |
| |
| @pytest.mark.parametrize( |
| "fontfile, location, expected", |
| [ |
| ( |
| "I.ttf", |
| None, |
| [ |
| ("moveTo", ((175, 0),)), |
| ("lineTo", ((367, 0),)), |
| ("lineTo", ((367, 1456),)), |
| ("lineTo", ((175, 1456),)), |
| ("closePath", ()), |
| ], |
| ), |
| ( |
| "I.ttf", |
| {}, |
| [ |
| ("moveTo", ((175, 0),)), |
| ("lineTo", ((367, 0),)), |
| ("lineTo", ((367, 1456),)), |
| ("lineTo", ((175, 1456),)), |
| ("closePath", ()), |
| ], |
| ), |
| ( |
| "I.ttf", |
| {"wght": 100}, |
| [ |
| ("moveTo", ((175, 0),)), |
| ("lineTo", ((271, 0),)), |
| ("lineTo", ((271, 1456),)), |
| ("lineTo", ((175, 1456),)), |
| ("closePath", ()), |
| ], |
| ), |
| ( |
| "I.ttf", |
| {"wght": 1000}, |
| [ |
| ("moveTo", ((128, 0),)), |
| ("lineTo", ((550, 0),)), |
| ("lineTo", ((550, 1456),)), |
| ("lineTo", ((128, 1456),)), |
| ("closePath", ()), |
| ], |
| ), |
| ( |
| "I.ttf", |
| {"wght": 1000, "wdth": 25}, |
| [ |
| ("moveTo", ((140, 0),)), |
| ("lineTo", ((553, 0),)), |
| ("lineTo", ((553, 1456),)), |
| ("lineTo", ((140, 1456),)), |
| ("closePath", ()), |
| ], |
| ), |
| ( |
| "I.ttf", |
| {"wght": 1000, "wdth": 50}, |
| [ |
| ("moveTo", ((136, 0),)), |
| ("lineTo", ((552, 0),)), |
| ("lineTo", ((552, 1456),)), |
| ("lineTo", ((136, 1456),)), |
| ("closePath", ()), |
| ], |
| ), |
| ( |
| "I.otf", |
| {"wght": 1000}, |
| [ |
| ("moveTo", ((179, 74),)), |
| ("lineTo", ((28, 59),)), |
| ("lineTo", ((28, 0),)), |
| ("lineTo", ((367, 0),)), |
| ("lineTo", ((367, 59),)), |
| ("lineTo", ((212, 74),)), |
| ("lineTo", ((179, 74),)), |
| ("closePath", ()), |
| ("moveTo", ((179, 578),)), |
| ("lineTo", ((212, 578),)), |
| ("lineTo", ((367, 593),)), |
| ("lineTo", ((367, 652),)), |
| ("lineTo", ((28, 652),)), |
| ("lineTo", ((28, 593),)), |
| ("lineTo", ((179, 578),)), |
| ("closePath", ()), |
| ("moveTo", ((98, 310),)), |
| ("curveTo", ((98, 205), (98, 101), (95, 0))), |
| ("lineTo", ((299, 0),)), |
| ("curveTo", ((296, 103), (296, 207), (296, 311))), |
| ("lineTo", ((296, 342),)), |
| ("curveTo", ((296, 447), (296, 551), (299, 652))), |
| ("lineTo", ((95, 652),)), |
| ("curveTo", ((98, 549), (98, 445), (98, 342))), |
| ("lineTo", ((98, 310),)), |
| ("closePath", ()), |
| ], |
| ), |
| ( |
| # In this font, /I has an lsb of 30, but an xMin of 25, so an |
| # offset of 5 units needs to be applied when drawing the outline. |
| # See https://github.com/fonttools/fonttools/issues/2824 |
| "issue2824.ttf", |
| None, |
| [ |
| ("moveTo", ((309, 180),)), |
| ("qCurveTo", ((274, 151), (187, 136), (104, 166), (74, 201))), |
| ("qCurveTo", ((45, 236), (30, 323), (59, 407), (95, 436))), |
| ("qCurveTo", ((130, 466), (217, 480), (301, 451), (330, 415))), |
| ("qCurveTo", ((360, 380), (374, 293), (345, 210), (309, 180))), |
| ("closePath", ()), |
| ], |
| ), |
| ], |
| ) |
| def test_glyphset(self, fontfile, location, expected): |
| font = TTFont(self.getpath(fontfile)) |
| glyphset = font.getGlyphSet(location=location) |
| |
| assert isinstance(glyphset, ttGlyphSet._TTGlyphSet) |
| |
| assert list(glyphset.keys()) == [".notdef", "I"] |
| |
| assert "I" in glyphset |
| assert glyphset.has_key("I") # we should really get rid of this... |
| |
| assert len(glyphset) == 2 |
| |
| pen = RecordingPen() |
| glyph = glyphset["I"] |
| |
| assert glyphset.get("foobar") is None |
| |
| assert isinstance(glyph, ttGlyphSet._TTGlyph) |
| is_glyf = fontfile.endswith(".ttf") |
| glyphType = ttGlyphSet._TTGlyphGlyf if is_glyf else ttGlyphSet._TTGlyphCFF |
| assert isinstance(glyph, glyphType) |
| |
| glyph.draw(pen) |
| actual = pen.value |
| |
| print(actual) |
| assert actual == expected, (location, actual, expected) |