xref: /aosp_15_r20/external/fonttools/Snippets/subset-fpgm.py (revision e1fe3e4ad2793916b15cccdc4a7da52a7e1dd0e9)
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