roleplay/client/tools/ttf.py

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]
2024-10-14 19:42:38 -06:00
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)