69 lines
1.6 KiB
Python
69 lines
1.6 KiB
Python
#!/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)
|