1*e1fe3e4aSElliott Hughes#! /usr/bin/env python3 2*e1fe3e4aSElliott Hughes 3*e1fe3e4aSElliott Hughesfrom fontTools.ttLib import TTFont 4*e1fe3e4aSElliott Hughesimport sys 5*e1fe3e4aSElliott Hughes 6*e1fe3e4aSElliott Hughesif len(sys.argv) < 2: 7*e1fe3e4aSElliott Hughes print("usage: subset-fpgm.py fontfile.ttf func-number...") 8*e1fe3e4aSElliott Hughes sys.exit(1) 9*e1fe3e4aSElliott Hughesfontfile = sys.argv[1] 10*e1fe3e4aSElliott Hughesfunc_nums = [int(x) for x in sys.argv[2:]] 11*e1fe3e4aSElliott Hughes 12*e1fe3e4aSElliott Hughesfont = TTFont(fontfile) 13*e1fe3e4aSElliott Hughesfpgm = font["fpgm"] 14*e1fe3e4aSElliott Hughes 15*e1fe3e4aSElliott Hughes# Parse fpgm 16*e1fe3e4aSElliott Hughesasm = fpgm.program.getAssembly() 17*e1fe3e4aSElliott Hughesfuncs = {} 18*e1fe3e4aSElliott Hughesstack = [] 19*e1fe3e4aSElliott Hughestokens = iter(asm) 20*e1fe3e4aSElliott Hughesfor token in tokens: 21*e1fe3e4aSElliott Hughes if token.startswith("PUSH") or token.startswith("NPUSH"): 22*e1fe3e4aSElliott Hughes for token in tokens: 23*e1fe3e4aSElliott Hughes try: 24*e1fe3e4aSElliott Hughes num = int(token) 25*e1fe3e4aSElliott Hughes stack.append(num) 26*e1fe3e4aSElliott Hughes except ValueError: 27*e1fe3e4aSElliott Hughes break 28*e1fe3e4aSElliott Hughes if token.startswith("FDEF"): 29*e1fe3e4aSElliott Hughes num = stack.pop() 30*e1fe3e4aSElliott Hughes body = [] 31*e1fe3e4aSElliott Hughes for token in tokens: 32*e1fe3e4aSElliott Hughes if token.startswith("ENDF"): 33*e1fe3e4aSElliott Hughes break 34*e1fe3e4aSElliott Hughes body.append(token) 35*e1fe3e4aSElliott Hughes funcs[num] = body 36*e1fe3e4aSElliott Hughes continue 37*e1fe3e4aSElliott Hughes assert 0, "Unexpected token in fpgm: %s" % token 38*e1fe3e4aSElliott Hughes 39*e1fe3e4aSElliott Hughes# Subset! 40*e1fe3e4aSElliott Hughesfuncs = {i: funcs[i] for i in func_nums} 41*e1fe3e4aSElliott Hughes 42*e1fe3e4aSElliott Hughes# Put it back together: 43*e1fe3e4aSElliott Hughesasm = [] 44*e1fe3e4aSElliott Hughesif funcs: 45*e1fe3e4aSElliott Hughes asm.append("PUSH[ ]") 46*e1fe3e4aSElliott Hughesnums = sorted(funcs.keys()) 47*e1fe3e4aSElliott Hughesasm.extend(str(i) for i in nums) 48*e1fe3e4aSElliott Hughesfor i in nums: 49*e1fe3e4aSElliott Hughes asm.append("FDEF[ ]") 50*e1fe3e4aSElliott Hughes asm.extend(funcs[i]) 51*e1fe3e4aSElliott Hughes asm.append("ENDF[ ]") 52*e1fe3e4aSElliott Hughes 53*e1fe3e4aSElliott Hughesimport pprint 54*e1fe3e4aSElliott Hughes 55*e1fe3e4aSElliott Hughespprint.pprint(asm) 56*e1fe3e4aSElliott Hughes 57*e1fe3e4aSElliott Hughesfpgm.program.fromAssembly(asm) 58*e1fe3e4aSElliott Hughes# Make sure it compiles 59*e1fe3e4aSElliott Hughesfpgm.program.getBytecode() 60