| #! /usr/bin/env python3 |
| |
| # Example script to decompose the composite glyphs in a TTF into |
| # non-composite outlines. |
| |
| |
| import sys |
| 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) |
| |
| src = sys.argv[1] |
| dst = sys.argv[2] |
| |
| with TTFont(src) as f: |
| glyfTable = f["glyf"] |
| glyphSet = f.getGlyphSet() |
| |
| 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) |
| path.draw(ttPen) |
| glyfTable[glyphName] = ttPen.glyph() |
| |
| f.save(dst) |