TR
games/open-lemmings / tools / fonts.py · commit 04e2e2a
#!/usr/bin/env python3"""The game's fonts, cut down to the characters it writes (config/lang.yaml):  python3 tools/fonts.py <Lato-Bold.ttf> <cjk.ttf> <korean.ttf>ui.ttf: Lato Bold (OFL), Latin + Cyrillic.  cjk.ttf: Noto Sans SC (OFL), Japanese + Chinese.  ko.ttf: Noto Sans KR (OFL)."""import os, re, sysfrom fontTools import subsetfrom fontTools.ttLib import TTFontroot = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..')text = open(os.path.join(root, 'config', 'lang.yaml'), encoding='utf-8').read()blocks = dict(re.findall(r'^(\w\w):\n((?:  .*\n)+)', text, re.M))basic = ''.join(chr(c) for c in range(32, 127)) + '‹›…'def cut(src, dst, chars):    opt = subset.Options()    opt.layout_features = ['kern']    opt.name_IDs = [1, 2]    opt.notdef_outline = True    font = TTFont(src)    if 'fvar' in font:   # a variable font: its bold instance        from fontTools.varLib import instancer        font = instancer.instantiateVariableFont(font, {'wght': 700})    cmap = font.getBestCmap()    missing = sorted(set(c for c in chars if ord(c) not in cmap and c.strip()))    s = subset.Subsetter(opt)    s.populate(text=chars)    s.subset(font)    font.save(os.path.join(root, 'assets', 'fonts', dst))    print(dst, os.path.getsize(os.path.join(root, 'assets', 'fonts', dst)), 'bytes', 'MISSING: ' + ''.join(missing) if missing else '')latin = ''.join(v for k, v in blocks.items() if k not in ('ja', 'zh', 'ko'))cut(sys.argv[1], 'ui.ttf', basic + latin + ''.join(chr(c) for c in list(range(0xA0, 0x180)) + list(range(0x400, 0x460)) + [0x490, 0x491]))cut(sys.argv[2], 'cjk.ttf', basic + blocks['ja'] + blocks['zh'])cut(sys.argv[3], 'ko.ttf', basic + blocks['ko'])