import os import sys import fontforge basename = sys.argv[1] height = int(sys.argv[2]) width = int(sys.argv[3]) baseline = int(sys.argv[4]) strikes = sys.argv[5] unimap = eval(sys.argv[6]) subtbls = sys.argv[7:] strikes = [int(s) for s in strikes.split()] assert(subtbls) font = fontforge.font() font.comment = f'AMIX {basename} font' font.copyright = '' font.familyname = basename font.fontname = basename font.fullname = f'AMIX {basename}' font.version = '000.000' for sub in subtbls: svgbase = f'{basename}{sub}.svg/' xpmf = lambda f, s: f'{basename}{sub}.xpm{"" if s == 1 else f"x{s}"}/{f.removesuffix("svg") + "xpm"}' for f in sorted(os.listdir(svgbase)): cv = unimap(int(f.split('-')[0], 16), sub) print(chr(cv)) c = font.createChar(cv).importOutlines(svgbase + f, simplify=False).importOutlines(xpmf(f, 1)) #.simplify() assert(1000 * width / height == int(1000 * width / height)) c.width = int(1000 * width / height) # We can't import the individual images as per-character strikes (and it'd be disproportionately difficult to implement): import them from skeleton BDFs instead for s in strikes: font.importBitmaps(f'{basename}.{s}-strike.bdf') assert(font.bitmapSizes == tuple(s * height for s in strikes)) print('Valid:', f'{font.validate():#x}', file=sys.stderr) font.save(f'{basename}.sfd') font.selection.all() fontforge.printSetup('ps-file') font.printSample('fontdisplay', height, '', f'{basename}-fontdisplay.ps') font.printSample('chars', height, '', f'{basename}-chars.ps') font.printSample('waterfall', font.bitmapSizes, '', f'{basename}-waterfall.ps') font.generate(f'{basename}.otf', bitmap_type="ttf", flags=("opentype",)) # equivalent to saving from GUI font.generate(f'{basename}.bdf')