2017-12-19 21:28:42 +00:00
|
|
|
#!/usr/bin/env python2
|
|
|
|
|
|
|
|
import os
|
|
|
|
from PIL import Image
|
|
|
|
|
|
|
|
glyphmap = {
|
|
|
|
"ampersand": "&",
|
|
|
|
"apostrophe": "'",
|
|
|
|
"asterisk": "*",
|
|
|
|
"at": "@",
|
|
|
|
"backslash": "\\",
|
|
|
|
"bar": "|",
|
|
|
|
"blank": " ",
|
|
|
|
"caret": "^",
|
|
|
|
"colon": ":",
|
|
|
|
"comma": ",",
|
|
|
|
"dollar": "$",
|
|
|
|
"emark": "!",
|
|
|
|
"equal": "=",
|
|
|
|
"grave": "`",
|
|
|
|
"hyphen": "-",
|
|
|
|
"langle": "<",
|
|
|
|
"lbrace": "{",
|
|
|
|
"lbracket": "[",
|
|
|
|
"lparen": "(",
|
|
|
|
"percent": "%",
|
|
|
|
"perfcurs": 10,
|
|
|
|
"period": ".",
|
|
|
|
"plus": "+",
|
|
|
|
"pound": "#",
|
|
|
|
"qmark": "?",
|
|
|
|
"quote": '"',
|
|
|
|
"rangle": ">",
|
|
|
|
"rbrace": "}",
|
|
|
|
"rbracket": "]",
|
|
|
|
"rparen": ")",
|
|
|
|
"semicolon": ";",
|
|
|
|
"slash": "/",
|
|
|
|
"tilde": "~",
|
|
|
|
"underscore": "_",
|
|
|
|
"0": "0",
|
|
|
|
"1": "1",
|
|
|
|
"2": "2",
|
|
|
|
"3": "3",
|
|
|
|
"4": "4",
|
|
|
|
"5": "5",
|
|
|
|
"6": "6",
|
|
|
|
"7": "7",
|
|
|
|
"8": "8",
|
|
|
|
"9": "9",
|
|
|
|
"al": "a",
|
|
|
|
"bl": "b",
|
|
|
|
"cl": "c",
|
|
|
|
"dl": "d",
|
|
|
|
"el": "e",
|
|
|
|
"fl": "f",
|
|
|
|
"gl": "g",
|
|
|
|
"hl": "h",
|
|
|
|
"il": "i",
|
|
|
|
"jl": "j",
|
|
|
|
"kl": "k",
|
|
|
|
"ll": "l",
|
|
|
|
"ml": "m",
|
|
|
|
"nl": "n",
|
|
|
|
"ol": "o",
|
|
|
|
"pl": "p",
|
|
|
|
"ql": "q",
|
|
|
|
"rl": "r",
|
|
|
|
"sl": "s",
|
|
|
|
"tl": "t",
|
|
|
|
"ul": "u",
|
|
|
|
"vl": "v",
|
|
|
|
"wl": "w",
|
|
|
|
"xl": "x",
|
|
|
|
"yl": "y",
|
|
|
|
"zl": "z",
|
|
|
|
"au": "A",
|
|
|
|
"bu": "B",
|
|
|
|
"cu": "C",
|
|
|
|
"du": "D",
|
|
|
|
"eu": "E",
|
|
|
|
"fu": "F",
|
|
|
|
"gu": "G",
|
|
|
|
"hu": "H",
|
|
|
|
"iu": "I",
|
|
|
|
"ju": "J",
|
|
|
|
"ku": "K",
|
|
|
|
"lu": "L",
|
|
|
|
"mu": "M",
|
|
|
|
"nu": "N",
|
|
|
|
"ou": "O",
|
|
|
|
"pu": "P",
|
|
|
|
"qu": "Q",
|
|
|
|
"ru": "R",
|
|
|
|
"su": "S",
|
|
|
|
"tu": "T",
|
|
|
|
"uu": "U",
|
|
|
|
"vu": "V",
|
|
|
|
"wu": "W",
|
|
|
|
"xu": "X",
|
|
|
|
"yu": "Y",
|
|
|
|
"zu": "Z",
|
|
|
|
}
|
|
|
|
|
|
|
|
def build_font(name, path, gridfiles):
|
|
|
|
img = Image.new("RGB", (112, 64))
|
|
|
|
pix = img.load()
|
|
|
|
for gridfile in gridfiles:
|
|
|
|
with open(os.path.join(path, gridfile)) as openf:
|
|
|
|
glyphname = gridfile.split('.')[0]
|
|
|
|
glyphchar = name_to_char(glyphname)
|
|
|
|
render(glyph_coords(glyphchar), glyphchar, openf.read(), pix)
|
2017-12-19 22:13:04 +00:00
|
|
|
img.save('./fonts/' + name + '.bmp')
|
2017-12-19 21:28:42 +00:00
|
|
|
|
|
|
|
def name_to_char(name):
|
|
|
|
if not glyphmap[name]:
|
|
|
|
raise Exception('unknown glyph')
|
|
|
|
return glyphmap[name]
|
|
|
|
|
|
|
|
|
|
|
|
# Return the row and column that a character should be saved in our bitmap
|
|
|
|
# font.
|
|
|
|
def glyph_coords(ch):
|
|
|
|
if type(ch) == int:
|
|
|
|
code = ch
|
|
|
|
else:
|
|
|
|
code = ord(ch)
|
|
|
|
|
|
|
|
row = (code & 0xf0) >> 4
|
|
|
|
col = code & 0x0f
|
|
|
|
return (row, col)
|
|
|
|
|
|
|
|
def render_row(offset, row, line, pix):
|
|
|
|
row_offset, col_offset = offset
|
|
|
|
row_offset = row_offset * 8
|
|
|
|
col_offset = col_offset * 7
|
|
|
|
col = 0
|
|
|
|
for c in line[1:]:
|
|
|
|
if c == 'o':
|
|
|
|
pix[col_offset + col, row_offset + row] = (255, 255, 255)
|
|
|
|
col = col + 1
|
|
|
|
|
|
|
|
def render(offset, ch, grid, pix):
|
|
|
|
row, col = glyph_coords(ch)
|
|
|
|
lines = grid.split("\n")
|
|
|
|
render_row(offset, 0, lines[1], pix)
|
|
|
|
render_row(offset, 1, lines[2], pix)
|
|
|
|
render_row(offset, 2, lines[3], pix)
|
|
|
|
render_row(offset, 3, lines[4], pix)
|
|
|
|
render_row(offset, 4, lines[5], pix)
|
|
|
|
render_row(offset, 5, lines[6], pix)
|
|
|
|
render_row(offset, 6, lines[7], pix)
|
|
|
|
render_row(offset, 7, lines[8], pix)
|
|
|
|
|
|
|
|
for root, subdirs, subfiles in os.walk('./fonts'):
|
|
|
|
if subdirs == []:
|
|
|
|
fontname = root.replace('./fonts/', '')
|
|
|
|
fontname = fontname.replace('/', '-')
|
|
|
|
build_font(fontname, root, subfiles)
|