58 lines
1.6 KiB
Python
58 lines
1.6 KiB
Python
#!/bin/python
|
|
|
|
import struct
|
|
|
|
GOOD_MAGIC = b"ZMFNT\0"
|
|
BAD_MAGIC = b"ABCDE\0"
|
|
NUM_FONT_SIZES = 4
|
|
|
|
ZMFNT_VERSION = 1
|
|
|
|
|
|
class FontFile:
|
|
def __init__(self, path):
|
|
self.path = path
|
|
|
|
def write_file_header(self, magic):
|
|
with open(self.path, "wb") as f:
|
|
f.write(magic)
|
|
f.write(struct.pack("B", ZMFNT_VERSION))
|
|
f.write(struct.pack("B", 0)) # pad
|
|
|
|
def write_bm_header(self, height, width, cp_count, idx, padding):
|
|
with open(self.path, "ab") as f:
|
|
f.write(struct.pack("HHIIBBBB", height, width, cp_count, idx, padding, 0, 0, 0))
|
|
|
|
def write_codepoints(self, value, height, count):
|
|
with open(self.path, "ab") as f:
|
|
for _ in range(height * count):
|
|
f.write(struct.pack("Q", value))
|
|
|
|
|
|
font = FontFile("01_bad_magic.zmfnt")
|
|
font.write_file_header(BAD_MAGIC)
|
|
|
|
# height, width and number of codepoints out of bounds
|
|
font = FontFile("02_variant_invalid.zmfnt")
|
|
font.write_file_header(GOOD_MAGIC)
|
|
font.write_bm_header(201, 65, 256, 0, 2)
|
|
|
|
# mismatch between number of codepoints specified in header and actually stored ones
|
|
font = FontFile("03_missing_cps.zmfnt")
|
|
font.write_file_header(GOOD_MAGIC)
|
|
offs = 0
|
|
for _ in range(NUM_FONT_SIZES):
|
|
font.write_bm_header(10, 10, 10, offs, 2)
|
|
offs += 10 * 10
|
|
for _ in range(NUM_FONT_SIZES):
|
|
font.write_codepoints(1, 10, 9)
|
|
|
|
font = FontFile("04_valid.zmfnt")
|
|
font.write_file_header(GOOD_MAGIC)
|
|
offs = 0
|
|
for i in range(NUM_FONT_SIZES):
|
|
font.write_bm_header(10 + i, 10 + i, 10, offs, 2)
|
|
offs += 10 * (10 + i)
|
|
for i in range(NUM_FONT_SIZES):
|
|
font.write_codepoints(i, 10 + i, 10)
|