From 3ad201cbe5865e3eda63631ff56b759bdb4162f0 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Thu, 23 Jul 2020 11:19:45 +0200 Subject: [PATCH] Snippets/decompose-ttf: remove overlaps with skia-pathops --- Snippets/decompose-ttf.py | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/Snippets/decompose-ttf.py b/Snippets/decompose-ttf.py index 36f56d218..bccaf72e1 100755 --- a/Snippets/decompose-ttf.py +++ b/Snippets/decompose-ttf.py @@ -9,10 +9,18 @@ from fontTools.ttLib import TTFont from fontTools.pens.recordingPen import DecomposingRecordingPen from fontTools.pens.ttGlyphPen import TTGlyphPen +try: + import pathops +except ImportError: + sys.exit( + "This script requires the skia-pathops module. " + "`pip install skia-pathops` and then retry." + ) + if len(sys.argv) != 3: - print("usage: decompose-ttf.py fontfile.ttf outfile.ttf") - sys.exit(1) + print("usage: decompose-ttf.py fontfile.ttf outfile.ttf") + sys.exit(1) src = sys.argv[1] dst = sys.argv[2] @@ -24,10 +32,22 @@ with TTFont(src) as f: for glyphName in glyphSet.keys(): if not glyfTable[glyphName].isComposite(): continue + + # record TTGlyph outlines without components dcPen = DecomposingRecordingPen(glyphSet) glyphSet[glyphName].draw(dcPen) + + # replay recording onto a skia-pathops Path + path = pathops.Path() + pathPen = path.getPen() + dcPen.replay(pathPen) + + # remove overlaps + path.simplify() + + # create new TTGlyph from Path ttPen = TTGlyphPen(None) - dcPen.replay(ttPen) + path.draw(ttPen) glyfTable[glyphName] = ttPen.glyph() f.save(dst)