72 lines
1.9 KiB
Python
72 lines
1.9 KiB
Python
#!/usr/bin/env python
|
|
import argparse
|
|
import colours
|
|
import fontdata
|
|
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('font', help='Text file describing the font')
|
|
parser.add_argument('start', help='First codepoint')
|
|
parser.add_argument('end', help='Last codepoint')
|
|
parsed = parser.parse_args()
|
|
|
|
with open(parsed.font) as f:
|
|
char_width, char_height, atlas = fontdata.parse(f)
|
|
|
|
if parsed.start[0:2] == 'U+':
|
|
codepoint_start = int(parsed.start[2:], 16)
|
|
else:
|
|
codepoint_start = ord(parsed.start)
|
|
if parsed.end[0:2] == 'U+':
|
|
codepoint_end = int(parsed.end[2:], 16)
|
|
else:
|
|
codepoint_end = ord(parsed.end)
|
|
|
|
|
|
start_row = codepoint_start // 16
|
|
end_row = codepoint_end // 16
|
|
|
|
filename = f'{codepoint_start:04X}-{codepoint_end:04X}.ppm'
|
|
|
|
glyphs = {}
|
|
|
|
with open(filename, 'rb') as f:
|
|
header = []
|
|
while len(header) < 3:
|
|
line = f.readline()
|
|
if line[0:1] == b'#': continue
|
|
header.append(line)
|
|
assert header[0] == b'P6\n'
|
|
width, height = map(int, header[1].split())
|
|
assert header[2] == b'255\n'
|
|
|
|
assert width % char_width == 0
|
|
assert height % char_height == 0
|
|
|
|
for row in range(height // char_height):
|
|
for y in range(char_height):
|
|
for column in range(width // char_width):
|
|
codepoint = (start_row + row) * 16 + column
|
|
if codepoint < codepoint_start or codepoint_end < codepoint:
|
|
f.read(char_width * 3)
|
|
continue
|
|
pixelrow = []
|
|
for x in range(char_width):
|
|
colour = f.read(3)
|
|
pixelrow.append(colour == colours.fg)
|
|
if codepoint not in glyphs:
|
|
glyphs[codepoint] = []
|
|
glyphs[codepoint].append(pixelrow)
|
|
|
|
print(f'Updating range: U+{codepoint_start:04X} - U+{codepoint_end:04X}')
|
|
|
|
replaced = []
|
|
for codepoint, glyph in glyphs.items():
|
|
if codepoint in atlas and atlas[codepoint] != glyph:
|
|
replaced.append(codepoint)
|
|
atlas[codepoint] = glyph
|
|
|
|
replaced = ', '.join(f'U+{c:04X}' for c in replaced)
|
|
print(f'Replacing: {replaced}')
|
|
|
|
with open(parsed.font, 'w') as f:
|
|
fontdata.serialize(f, char_width, char_height, atlas)
|