import os import sys import math 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] strikes = [int(s) for s in strikes.split()] font = fontforge.font() font.comment = f'Linux {basename} font' font.copyright = '' font.familyname = basename font.fontname = basename font.fullname = f'Linux {basename}' font.version = '000.000' svgbase = f'{basename}.svg/' xpmf = lambda f, s: f'{basename}.xpm{"" if s == 1 else f"x{s}"}/{f.removesuffix("svg") + "xpm"}' map={"slash": "/", "NUL": "\0"} for f in sorted(os.listdir(svgbase)): cv = ord(map.get(f[3:-4]) or f[3:-4]) print(chr(cv)) c = font.createChar(cv).importOutlines(svgbase + f, simplify=False).importOutlines(xpmf(f, 1)) #.simplify() c.width = math.ceil(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')