Prusa-Firmware/Firmware/Fonts/FontGen.py

93 lines
2.8 KiB
Python

#!/usr/bin/env python3
import argparse
from traceback import print_exc
import xml.etree.ElementTree as ET
import os
import sys
class CustomCharacter:
def __init__(self, utf, default, alternate = None):
self.utf = utf
self.default = default
self.alternate = alternate
fontTable = [
# custom characters:
CustomCharacter('🄷', 0x80, 'H'),
CustomCharacter('°', 0x81, '\\xdf'),
CustomCharacter('🌡', 0x82, 'h'),
CustomCharacter('', 0x83, '^'),
CustomCharacter('🗘', 0x84, '\\xf3'),
CustomCharacter('🗀', 0x85, '\\xdb'),
CustomCharacter('»', 0x86, '>'),
CustomCharacter('🕑', 0x87, '\\xe5'),
CustomCharacter('', 0x88, '\\x7e'),
CustomCharacter('', 0x89, '\\x7e'),
# from the default character set:
CustomCharacter('ä', 0xe1),
CustomCharacter('μ', 0xe4),
CustomCharacter('ö', 0xef),
CustomCharacter('ü', 0xf5),
]
def generateLineInTable(index, chars):
pixels = chars[index]["PIXELS"].split(',')
rows = []
for i in range(8):
rows.append(0)
for j in range(5):
rows[i] |= (1 << (5 - j - 1)) if pixels[j * 8 + i] == "0" else 0
line = "{{"
for r in rows:
line += f"0x{r:02X}, "
line += f"}}, '{fontTable[index].alternate}'}}, // '{fontTable[index].utf}'"
return line
def generateFont():
tree = ET.parse(os.path.join(sys.path[0], "Prusa.lcd"))
root = tree.getroot()
CharList = [Char.attrib for Char in root.iter("CHAR")]
f = open(os.path.join(sys.path[0], "FontTable.h"), "w")
for x in range(len(fontTable)):
if fontTable[x].default >= 0xE0:
continue
f.write(generateLineInTable(x, CharList) + '\n')
f.close()
def utfToLCD(infile, outfile):
return
def lcdToUTF(infile, outfile):
return
def main():
parser = argparse.ArgumentParser(description = "Layer between the unicode and the LCD")
parser.add_argument("action", type = str, nargs = '?', default = "generateFont",
help = "What the script should do: (generateFont|utfToLCD|lcdToUTF)")
parser.add_argument('infile', nargs = '?', type = argparse.FileType('r'), default = sys.stdin)
parser.add_argument('outfile', nargs = '?', type = argparse.FileType('w'), default = sys.stdout)
args = parser.parse_args()
try:
if args.action == "generateFont":
generateFont()
elif args.action == "utfToLCD":
utfToLCD(args.infile, args.outfile)
elif args.action == "lcdToUTF":
lcdToUTF(args.infile, args.outfile)
else:
print("invalid action")
return 1
# parse_txt(args.lang, args.no_warning, args.warn_empty)
return 0
except Exception as exc:
print_exc()
parser.error("%s" % exc)
return 1
if __name__ == "__main__":
exit(main())