#!/usr/bin/env python3 from fontTools.ttLib import TTFont from fontTools.unicode import Unicode from PIL import ImageDraw, Image, ImageFont from os import mkdir from argparse import ArgumentParser from struct import pack parser = ArgumentParser() parser.add_argument("ttf_file") parser.add_argument("atlas") parser.add_argument("metadata") args = parser.parse_args() # Add control characters, keep 0x00 for "unknown" blacklist = set([ 0x08, 0x09, 0x0D, 0x1D, 0x20, ]) # Add other control characters blacklist.update(set(range(0x80, 0xA0))) ttfont = TTFont(args.ttf_file) keycodes = set() for table in ttfont['cmap'].tables: for keycode in table.cmap.keys(): keycodes.add(keycode) keycodes = keycodes.difference(blacklist) font = ImageFont.truetype(args.ttf_file, size=16) (ascent, descent) = font.getmetrics() widths = dict() tops = dict() for keycode in keycodes: (left, top, right, bottom) = font.getbbox(chr(keycode)) widths[keycode] = right-left tops[keycode] = top height = ascent - descent image = Image.new(mode="RGBA", size=(sum(widths.values()), height)) draw = ImageDraw.Draw(image) x = 0 keycode_list = list(keycodes) keycode_list.sort() for keycode in keycode_list: draw.text((x, -tops[keycode]), chr(keycode), font=font) x += widths[keycode] print(f"{chr(keycode)} - {tops[keycode]}") image.save(args.atlas) metadata = bytearray(pack("!HBB", len(keycode_list), ascent, descent)) idx = 0 x = 0 for keycode in keycode_list: metadata += pack("!HIBB", keycode, x, widths[keycode], tops[keycode]) x += widths[keycode] with open(args.metadata, "wb") as metadata_file: metadata_file.write(metadata)