terom@38: def read_block (fh) : terom@38: """ terom@38: Yield a series of non-empty lines from the given file, ignoring any leading empty lines, and stopping after the first empty line terom@38: """ terom@38: terom@38: leading = True terom@38: terom@38: for line in fh : terom@38: if line.strip() : terom@38: leading = False terom@38: terom@38: # yield non-empty terom@38: yield line terom@38: terom@38: elif leading : terom@38: # skip leading empty terom@38: continue terom@38: terom@38: else : terom@38: # stop on empty terom@38: return terom@38: terom@38: else : terom@38: # EOF terom@38: return terom@38: terom@38: def read_charblock (lines) : terom@38: """ terom@38: Read in a char from the given lines, returning an terom@38: (ascii, rows) terom@38: terom@38: tuple, or None, if there weren't any more blocks terom@38: """ terom@38: terom@38: # the ascii code as a char terom@38: ascii = '' terom@38: terom@38: # row data as ints terom@38: rows = [] terom@38: terom@38: for line in lines : terom@38: line = line.strip() terom@38: terom@38: if line.startswith(';') : terom@38: # set ascii code terom@38: ascii = line.replace(';', '').strip() terom@38: terom@38: if not ascii : terom@38: print 'read_charblock', 'empty' terom@38: terom@38: # skip terom@38: return None terom@39: terom@39: elif len(ascii) == 1 : terom@39: print 'read_charblock', 'simplechar', ascii terom@39: terom@39: else : terom@39: ascii = ascii.decode('string_escape') terom@38: terom@39: print 'read_charblock', 'decodechar', ascii terom@38: terom@38: assert len(ascii) == 1 terom@38: terom@38: else : terom@38: # convert terom@38: row = line.replace('#', '1').replace('-', '0') terom@38: terom@38: print 'read_charblock', 'row', row terom@38: terom@38: # 6 columns terom@38: assert len(row) == 6 terom@38: terom@38: # from binary terom@38: row = int(row, 2) terom@38: terom@38: rows.append(row) terom@38: terom@38: # got data? terom@38: if ascii and rows : terom@38: # 8 rows terom@38: assert len(rows) == 8 terom@38: terom@38: return ascii, rows terom@38: terom@38: else : terom@38: # nope, empty block, EOF terom@38: return None terom@38: terom@38: def read_charblocks (fh) : terom@38: """ terom@38: Read in all char blocks as (ascii, rows) tuples from given file terom@38: """ terom@38: terom@38: while True : terom@38: out = read_charblock(read_block(fh)) terom@38: terom@38: if out : terom@38: yield out terom@38: terom@38: else : terom@38: break terom@38: terom@38: def decode_rows (inrows) : terom@38: """ terom@38: Decode char def data from its 6x8 row format into the format we need (6x8 col format) terom@38: """ terom@38: terom@38: outcols = [0x00] * 6 terom@38: terom@38: for rowidx, row in enumerate(inrows) : terom@38: terom@38: for colidx, col in enumerate(outcols) : terom@38: # get bit from row terom@38: bit = (row >> (5 - colidx)) & 1 terom@38: terom@38: # set bit into column terom@38: outcols[colidx] |= (bit << rowidx) terom@38: terom@38: # ok... terom@38: return outcols terom@38: terom@38: def write_chardef (fh, ascii, cols) : terom@38: """ terom@38: Write out character definition block to given .def file, using given char code and column data terom@38: """ terom@38: terom@38: fh.write( terom@39: ("; %r\n" % ascii) terom@38: + (".db %s\n" % (', '.join(bin(col) for col in cols))) terom@38: + ("\n") terom@38: ) terom@38: terom@38: def compile_fonts (infh, outf) : terom@38: """ terom@38: Compile char blocks from infh, writing out definitions to outf terom@38: """ terom@38: terom@38: charmap = dict() terom@38: terom@38: # decode in terom@38: for charblock in read_charblocks(infh) : terom@38: # unpack terom@38: ascii, rows = charblock terom@38: terom@38: # convert terom@38: cols = decode_rows(rows) terom@38: terom@38: # map terom@38: charmap[ascii] = cols terom@38: terom@38: print 'compile_fonts', 'read', ascii terom@39: terom@39: # detect min/max syms terom@39: syms = charmap.keys() terom@39: font_start = min(syms) terom@39: font_end = max(syms) terom@38: terom@38: assert(ord(font_start) < ord(font_end)) terom@38: terom@38: # write out terom@38: outf.write( terom@38: ";; AUTOMATICALLY GENERATED - Do not edit!\n" terom@38: ";; 8x6 font, '0' - '1', rows-by-col format\n" terom@39: + (".equ FONT_8x6_START = %d ; %r\n" % (ord(font_start), font_start)) terom@39: + (".equ FONT_8x6_END = %d ; %r\n" % (ord(font_end), font_end)) terom@38: + (".equ FONT_8x6_COLS = %d\n" % (6, )) terom@38: + (".equ FONT_8x6_ROWS = %d\n" % (8, )) terom@38: + "FONT_8x6:\n" terom@38: "\n" terom@38: ) terom@38: terom@39: # default symbol for unknown chars terom@39: defsym = charmap['\0'] terom@39: terom@39: for char in xrange(ord(font_start), ord(font_end) + 1) : terom@38: ascii = chr(char) terom@39: cols = charmap.get(ascii, defsym) terom@38: terom@38: write_chardef(outf, ascii, cols) terom@38: terom@38: def main () : terom@38: import sys, getopt terom@38: terom@38: opts, args = getopt.getopt(sys.argv[1:], '') terom@38: terom@38: inpath, outpath = args terom@38: terom@38: # run terom@38: compile_fonts(open(inpath, 'r'), open(outpath, 'w')) terom@38: terom@38: if __name__ == '__main__' : terom@38: main() terom@38: