#! /usr/bin/env python3

# Example script to remove overlaps in TTF using skia-pathops


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."
    )


def skpath_from_simple_glyph(glyphName, glyphSet):
    path = pathops.Path()
    pathPen = path.getPen()
    glyphSet[glyphName].draw(pathPen)
    return path


def skpath_from_composite_glyph(glyphName, glyphSet):
    # 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)
    return path


def tt_glyph_from_skpath(path):
    ttPen = TTGlyphPen(None)
    path.draw(ttPen)
    return ttPen.glyph()


def main():
    if len(sys.argv) != 3:
        print("usage: remove-overlaps.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 glyfTable[glyphName].isComposite():
                path = skpath_from_composite_glyph(glyphName, glyphSet)
            else:
                path = skpath_from_simple_glyph(glyphName, glyphSet)

            # duplicate path
            path2 = pathops.Path(path)

            # remove overlaps
            path2.simplify()

            # replace TTGlyph if simplified copy is different
            if path2 != path:
                glyfTable[glyphName] = tt_glyph_from_skpath(path2)

        f.save(dst)


if __name__ == "__main__":
    main()

Add snippet to remove overlaps on TTF with skia-pathops
Add snippet to remove overlaps on TTF with skia-pathops
