#! /usr/bin/env python3 from fontTools.ttLib import TTFont import sys if len(sys.argv) < 2: print("usage: subset-fpgm.py fontfile.ttf func-number...") sys.exit(1) fontfile = sys.argv[1] func_nums = [int(x) for x in sys.argv[2:]] font = TTFont(fontfile) fpgm = font['fpgm'] # Parse fpgm asm = fpgm.program.getAssembly() funcs = {} stack = [] tokens = iter(asm) for token in tokens: if token.startswith("PUSH") or token.startswith("NPUSH"): for token in tokens: try: num = int(token) stack.append(num) except ValueError: break if token.startswith("FDEF"): num = stack.pop() body = [] for token in tokens: if token.startswith("ENDF"): break body.append(token) funcs[num] = body continue assert 0, "Unexpected token in fpgm: %s" % token # Subset! funcs = {i:funcs[i] for i in func_nums} # Put it back together: asm = [] if funcs: asm.append("PUSH[ ]") nums = sorted(funcs.keys()) asm.extend(str(i) for i in nums) for i in nums: asm.append("FDEF[ ]") asm.extend(funcs[i]) asm.append("ENDF[ ]") import pprint pprint.pprint(asm) fpgm.program.fromAssembly(asm) # Make sure it compiles fpgm.program.getBytecode()