From cb6c9d092d3d12702cdf87d7bdf614a93f158968 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 21 Jan 2015 13:17:11 -0800 Subject: [PATCH] Add snippet to subset fpgm functions --- Snippets/fontTools | 1 + Snippets/subset-fpgm.py | 57 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 120000 Snippets/fontTools create mode 100644 Snippets/subset-fpgm.py diff --git a/Snippets/fontTools b/Snippets/fontTools new file mode 120000 index 000000000..9a21c02e2 --- /dev/null +++ b/Snippets/fontTools @@ -0,0 +1 @@ +../Lib/fontTools \ No newline at end of file diff --git a/Snippets/subset-fpgm.py b/Snippets/subset-fpgm.py new file mode 100644 index 000000000..3c5978cb1 --- /dev/null +++ b/Snippets/subset-fpgm.py @@ -0,0 +1,57 @@ + +import sys +from fontTools.ttLib import TTFont + +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()