#!/usr/bin/env python3 """Gera a fonte bitmap 6x8 do Coric's Quest (grade de 16x16 glifos, 96x128 px, RGBA) a partir do Spleen 5x8 (BSD-2-Clause). Uso: python3 -I make-font.py O jogo desenha texto com uma imagem de 16x16 celulas de 6x8 px (codigo = linha*16 + coluna): usa os codigos '!'..'~', 16 (a seta do cursor) e 255 (reticencias). Os glifos ASCII vem do Spleen (coluna 0 da celula em branco, como na fonte original do jogo), e a seta e as reticencias sao desenhadas aqui. O PNG sai sempre com os mesmos bytes. """ import re import struct import sys import zlib W, H, COLS = 6, 8, 16 glyphs = {} enc = None rows = None for line in open(sys.argv[1], encoding='ascii'): line = line.strip() if line.startswith('ENCODING'): enc = int(line.split()[1]) elif line.startswith('BBX'): bbx = [int(v) for v in line.split()[1:]] assert bbx == [5, 8, 0, -1], bbx elif line == 'BITMAP': rows = [] elif line == 'ENDCHAR': glyphs[enc] = rows rows = None elif rows is not None and re.fullmatch(r'[0-9A-Fa-f]+', line): rows.append(int(line, 16)) pixels = [[0] * (COLS * W) for _ in range(COLS * H)] def put(code, bitrows): cx, cy = (code % COLS) * W, (code // COLS) * H for y, bits in enumerate(bitrows): for x, ch in enumerate(bits): if ch == '#': pixels[cy + y][cx + x] = 1 for code in range(33, 127): bits = glyphs[code] assert len(bits) == 8 put(code, [''.join('#' if r & (0x80 >> x) else '.' for x in range(5)).rjust(6, '.')[:6] for r in bits]) # 5 colunas de glifo deslocadas uma casa para a direita: coluna 0 em branco # (o rjust acima ja faz isso: 5 caracteres viram 6 com um '.' a esquerda) put(16, ['......', '.#....', '.##...', '.###..', '.####.', '.###..', '.##...', '.#....']) # seta do cursor put(255, ['......', '......', '......', '......', '......', '......', '.#.#.#', '......']) # reticencias def png_chunk(tag, data): body = tag + data return struct.pack('>I', len(data)) + body + struct.pack('>I', zlib.crc32(body) & 0xFFFFFFFF) raw = bytearray() for row in pixels: raw.append(0) # filtro "none" for p in row: raw += bytes((255, 255, 255, 255)) if p else bytes((0, 0, 0, 0)) png = b'\x89PNG\r\n\x1a\n' + png_chunk(b'IHDR', struct.pack('>IIBBBBB', COLS * W, COLS * H, 8, 6, 0, 0, 0)) png += png_chunk(b'IDAT', zlib.compress(bytes(raw), 9)) + png_chunk(b'IEND', b'') open(sys.argv[2], 'wb').write(png)