From 6af29a7181b03aecce893522d1dd467cfd528f49 Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Sat, 2 Jan 2021 15:52:26 -0800 Subject: [PATCH] [fb] Add default hard-coded font For the fb driver to have a font before loading from disk is available, create a hard-coded font as a byte array. To create this, added a new scripts/psf_to_cpp.py which also refactored out much of scripts/parse_font.py into a new shared module scripts/fontpsf.py. --- scripts/fontpsf.py | 75 +++++++++++ scripts/parse_font.py | 34 ++--- scripts/psf_to_cpp.py | 27 ++++ src/drivers/fb/font.h | 266 ++++++++++++++++++++++++++++++++++++++++ src/drivers/fb/main.cpp | 10 ++ 5 files changed, 387 insertions(+), 25 deletions(-) create mode 100644 scripts/fontpsf.py mode change 100644 => 100755 scripts/parse_font.py create mode 100755 scripts/psf_to_cpp.py create mode 100644 src/drivers/fb/font.h diff --git a/scripts/fontpsf.py b/scripts/fontpsf.py new file mode 100644 index 0000000..309f4ca --- /dev/null +++ b/scripts/fontpsf.py @@ -0,0 +1,75 @@ +_MAGIC = (0x72, 0xb5, 0x4a, 0x86) +_VERSION = 0 + +class PSF2: + from collections import namedtuple + Header = namedtuple("PSF2Header", + ["version", "offset", "flags", "count", "charsize", "height", "width"]) + + def __init__(self, filename, header, data): + self.__filename = filename + self.__header = header + self.__data = data + + data = property(lambda self: self.__data) + header = property(lambda self: self.__header) + count = property(lambda self: self.__header.count) + charsize = property(lambda self: self.__header.charsize) + dimension = property(lambda self: (self.__header.width, self.__header.height)) + filename = property(lambda self: self.__filename) + + @classmethod + def load(cls, filename): + from os.path import basename + from struct import unpack_from + + data = open(filename, 'rb').read() + + fmt = "BBBBIIIIIII" + values = unpack_from(fmt, data) + + if values[:len(_MAGIC)] != _MAGIC: + raise Exception("Bad magic number in header") + + header = PSF2.Header(*values[len(_MAGIC):]) + if header.version != _VERSION: + raise Exception(f"Bad version {header.version} in header") + + return cls(basename(filename), header, data) + + class Glyph: + __slots__ = ['index', 'data'] + def __init__(self, i, data): + self.index = i + self.data = data + def __index__(self): + return self.index + def empty(self): + return not bool([b for b in self.data if b != 0]) + def description(self): + c = chr(self.index) + if c.isprintable(): + return "Glyph {:02x}: '{}'".format(self.index, c) + else: + return "Glyph {:02x}".format(self.index) + + def __getitem__(self, i): + c = self.__header.charsize + n = i * c + self.__header.offset + return PSF2.Glyph(i, self.__data[n:n+c]) + + class __iter: + __slots__ = ['font', 'n'] + def __init__(self, font): + self.font = font + self.n = 0 + def __next__(self): + if self.n < self.font.count: + glyph = self.font[self.n] + self.n += 1 + return glyph + else: + raise StopIteration + + def __iter__(self): + return PSF2.__iter(self) diff --git a/scripts/parse_font.py b/scripts/parse_font.py old mode 100644 new mode 100755 index 4819182..24fcaf5 --- a/scripts/parse_font.py +++ b/scripts/parse_font.py @@ -1,21 +1,6 @@ #!/usr/bin/env python3 -MAGIC = (0x72, 0xb5, 0x4a, 0x86) - -from collections import namedtuple -PSF2 = namedtuple("PSF2", ["version", "offset", "flags", "count", "charsize", "height", "width"]) - -def read_header(data): - from struct import unpack_from, calcsize - - fmt = "BBBBIIIIIII" - - values = unpack_from(fmt, data) - if values[:len(MAGIC)] != MAGIC: - raise Exception("Bad magic number in header") - - return PSF2(*values[len(MAGIC):]) - +from fontpsf import PSF2 def print_glyph(header, data): bw = (header.width + 7) // 8 @@ -28,16 +13,15 @@ def print_glyph(header, data): def display_font(filename): - data = open(filename, 'rb').read() + font = PSF2.load(filename) + print(font.header) - header = read_header(data) - print(header) - - c = header.charsize - for i in range(0, header.count): - n = i * c + header.offset - print("Glyph {}:".format(i)) - print_glyph(header, data[n:n+c]) + for glyph in font: + if glyph.empty(): + print("{}: BLANK".format(glyph.description())) + else: + print("{}:".format(glyph.description())) + print_glyph(font.header, glyph.data) if __name__ == "__main__": diff --git a/scripts/psf_to_cpp.py b/scripts/psf_to_cpp.py new file mode 100755 index 0000000..6e49a48 --- /dev/null +++ b/scripts/psf_to_cpp.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 + +from fontpsf import PSF2 + +def print_header(filename): + font = PSF2.load(filename) + + print("#pragma once") + print(f"// This file was autogenerated by psf_to_cpp.py from {font.filename}\n") + + print(f"const uint8_t font_glyph_size = {font.charsize};") + print(f"const uint8_t font_glyph_width = {font.dimension[0]};") + print(f"const uint8_t font_glyph_height = {font.dimension[1]};") + print(f"const uint16_t font_glyph_count = {font.count};\n") + + print('const uint8_t font_glyph_data[] = {') + + for glyph in font: + print(" ", "".join([f"0x{b:02x}," for b in glyph.data]), end="") + print(" // {}".format(glyph.description())) + + print("};") + +if __name__ == "__main__": + import sys + for filename in sys.argv[1:]: + print_header(filename) diff --git a/src/drivers/fb/font.h b/src/drivers/fb/font.h new file mode 100644 index 0000000..f692165 --- /dev/null +++ b/src/drivers/fb/font.h @@ -0,0 +1,266 @@ +#pragma once +// This file was autogenerated by psf_to_cpp.py from tamsyn8x16r.psf + +const uint8_t font_glyph_size = 16; +const uint8_t font_glyph_width = 8; +const uint8_t font_glyph_height = 16; +const uint16_t font_glyph_count = 256; + +const uint8_t font_glyph_data[] = { + 0x00,0x00,0x00,0x00,0x7e,0x42,0x42,0x42,0x42,0x42,0x42,0x7e,0x00,0x00,0x00,0x00, // Glyph 00 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 01 + 0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa, // Glyph 02 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 03 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 04 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 05 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 06 + 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 07 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 08 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 09 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 0a + 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 0b + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, // Glyph 0c + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, // Glyph 0d + 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 0e + 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xff,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, // Glyph 0f + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 10 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 11 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 12 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 13 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 14 + 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0f,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, // Glyph 15 + 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xf8,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, // Glyph 16 + 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 17 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, // Glyph 18 + 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, // Glyph 19 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 1a + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 1b + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 1c + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 1d + 0x00,0x00,0x00,0x1c,0x22,0x20,0x20,0xf8,0x20,0x20,0x72,0x8c,0x00,0x00,0x00,0x00, // Glyph 1e + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 1f + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 20: ' ' + 0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x10,0x10,0x00,0x00,0x00,0x00, // Glyph 21: '!' + 0x00,0x24,0x24,0x24,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 22: '"' + 0x00,0x00,0x00,0x24,0x24,0x7e,0x24,0x24,0x24,0x7e,0x24,0x24,0x00,0x00,0x00,0x00, // Glyph 23: '#' + 0x00,0x00,0x08,0x08,0x1e,0x20,0x20,0x1c,0x02,0x02,0x3c,0x08,0x08,0x00,0x00,0x00, // Glyph 24: '$' + 0x00,0x00,0x00,0x30,0x49,0x4a,0x34,0x08,0x16,0x29,0x49,0x06,0x00,0x00,0x00,0x00, // Glyph 25: '%' + 0x00,0x00,0x30,0x48,0x48,0x48,0x30,0x31,0x49,0x46,0x46,0x39,0x00,0x00,0x00,0x00, // Glyph 26: '&' + 0x00,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 27: ''' + 0x00,0x00,0x04,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x08,0x08,0x04,0x00,0x00, // Glyph 28: '(' + 0x00,0x00,0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x00,0x00, // Glyph 29: ')' + 0x00,0x00,0x00,0x00,0x00,0x24,0x18,0x7e,0x18,0x24,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 2a: '*' + 0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x7f,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00, // Glyph 2b: '+' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x08,0x08,0x10,0x00, // Glyph 2c: ',' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 2d: '-' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00, // Glyph 2e: '.' + 0x00,0x00,0x02,0x02,0x04,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x00,0x00, // Glyph 2f: '/' + 0x00,0x00,0x00,0x3c,0x42,0x46,0x4a,0x52,0x62,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, // Glyph 30: '0' + 0x00,0x00,0x00,0x08,0x18,0x28,0x08,0x08,0x08,0x08,0x08,0x3e,0x00,0x00,0x00,0x00, // Glyph 31: '1' + 0x00,0x00,0x00,0x3c,0x42,0x02,0x02,0x04,0x08,0x10,0x20,0x7e,0x00,0x00,0x00,0x00, // Glyph 32: '2' + 0x00,0x00,0x00,0x7e,0x04,0x08,0x1c,0x02,0x02,0x02,0x42,0x3c,0x00,0x00,0x00,0x00, // Glyph 33: '3' + 0x00,0x00,0x00,0x04,0x0c,0x14,0x24,0x44,0x7e,0x04,0x04,0x04,0x00,0x00,0x00,0x00, // Glyph 34: '4' + 0x00,0x00,0x00,0x7e,0x40,0x40,0x7c,0x02,0x02,0x02,0x42,0x3c,0x00,0x00,0x00,0x00, // Glyph 35: '5' + 0x00,0x00,0x00,0x1c,0x20,0x40,0x40,0x7c,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, // Glyph 36: '6' + 0x00,0x00,0x00,0x7e,0x02,0x04,0x04,0x08,0x08,0x10,0x10,0x10,0x00,0x00,0x00,0x00, // Glyph 37: '7' + 0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x3c,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, // Glyph 38: '8' + 0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x3e,0x02,0x02,0x04,0x38,0x00,0x00,0x00,0x00, // Glyph 39: '9' + 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00, // Glyph 3a: ':' + 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x08,0x08,0x10,0x00, // Glyph 3b: ';' + 0x00,0x00,0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00,0x00,0x00,0x00, // Glyph 3c: '<' + 0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 3d: '=' + 0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x04,0x08,0x10,0x20,0x00,0x00,0x00,0x00, // Glyph 3e: '>' + 0x00,0x00,0x3c,0x42,0x02,0x04,0x08,0x10,0x00,0x00,0x10,0x10,0x00,0x00,0x00,0x00, // Glyph 3f: '?' + 0x00,0x00,0x1c,0x22,0x41,0x4f,0x51,0x51,0x51,0x53,0x4d,0x40,0x20,0x1f,0x00,0x00, // Glyph 40: '@' + 0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x7e,0x42,0x42,0x42,0x00,0x00,0x00,0x00, // Glyph 41: 'A' + 0x00,0x00,0x00,0x7c,0x42,0x42,0x42,0x7c,0x42,0x42,0x42,0x7c,0x00,0x00,0x00,0x00, // Glyph 42: 'B' + 0x00,0x00,0x00,0x1e,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x1e,0x00,0x00,0x00,0x00, // Glyph 43: 'C' + 0x00,0x00,0x00,0x78,0x44,0x42,0x42,0x42,0x42,0x42,0x44,0x78,0x00,0x00,0x00,0x00, // Glyph 44: 'D' + 0x00,0x00,0x00,0x7e,0x40,0x40,0x40,0x7c,0x40,0x40,0x40,0x7e,0x00,0x00,0x00,0x00, // Glyph 45: 'E' + 0x00,0x00,0x00,0x7e,0x40,0x40,0x40,0x7c,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00, // Glyph 46: 'F' + 0x00,0x00,0x00,0x1e,0x20,0x40,0x40,0x46,0x42,0x42,0x22,0x1e,0x00,0x00,0x00,0x00, // Glyph 47: 'G' + 0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x7e,0x42,0x42,0x42,0x42,0x00,0x00,0x00,0x00, // Glyph 48: 'H' + 0x00,0x00,0x00,0x3e,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3e,0x00,0x00,0x00,0x00, // Glyph 49: 'I' + 0x00,0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, // Glyph 4a: 'J' + 0x00,0x00,0x00,0x42,0x44,0x48,0x50,0x60,0x50,0x48,0x44,0x42,0x00,0x00,0x00,0x00, // Glyph 4b: 'K' + 0x00,0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7e,0x00,0x00,0x00,0x00, // Glyph 4c: 'L' + 0x00,0x00,0x00,0x41,0x63,0x55,0x49,0x49,0x41,0x41,0x41,0x41,0x00,0x00,0x00,0x00, // Glyph 4d: 'M' + 0x00,0x00,0x00,0x42,0x62,0x52,0x4a,0x46,0x42,0x42,0x42,0x42,0x00,0x00,0x00,0x00, // Glyph 4e: 'N' + 0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, // Glyph 4f: 'O' + 0x00,0x00,0x00,0x7c,0x42,0x42,0x42,0x7c,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00, // Glyph 50: 'P' + 0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3c,0x04,0x02,0x00,0x00, // Glyph 51: 'Q' + 0x00,0x00,0x00,0x7c,0x42,0x42,0x42,0x7c,0x48,0x44,0x42,0x42,0x00,0x00,0x00,0x00, // Glyph 52: 'R' + 0x00,0x00,0x00,0x3e,0x40,0x40,0x20,0x18,0x04,0x02,0x02,0x7c,0x00,0x00,0x00,0x00, // Glyph 53: 'S' + 0x00,0x00,0x00,0x7f,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x00, // Glyph 54: 'T' + 0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, // Glyph 55: 'U' + 0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x24,0x24,0x18,0x18,0x00,0x00,0x00,0x00, // Glyph 56: 'V' + 0x00,0x00,0x00,0x41,0x41,0x41,0x41,0x49,0x49,0x49,0x55,0x63,0x00,0x00,0x00,0x00, // Glyph 57: 'W' + 0x00,0x00,0x00,0x41,0x41,0x22,0x14,0x08,0x14,0x22,0x41,0x41,0x00,0x00,0x00,0x00, // Glyph 58: 'X' + 0x00,0x00,0x00,0x41,0x41,0x22,0x14,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x00, // Glyph 59: 'Y' + 0x00,0x00,0x00,0x7e,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x7e,0x00,0x00,0x00,0x00, // Glyph 5a: 'Z' + 0x00,0x00,0x1e,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1e,0x00,0x00, // Glyph 5b: '[' + 0x00,0x00,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x02,0x02,0x00,0x00, // Glyph 5c: '\' + 0x00,0x00,0x78,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x78,0x00,0x00, // Glyph 5d: ']' + 0x00,0x00,0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 5e: '^' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00, // Glyph 5f: '_' + 0x00,0x20,0x10,0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 60: '`' + 0x00,0x00,0x00,0x00,0x00,0x3c,0x02,0x02,0x3e,0x42,0x42,0x3e,0x00,0x00,0x00,0x00, // Glyph 61: 'a' + 0x00,0x00,0x40,0x40,0x40,0x7c,0x42,0x42,0x42,0x42,0x42,0x7c,0x00,0x00,0x00,0x00, // Glyph 62: 'b' + 0x00,0x00,0x00,0x00,0x00,0x3c,0x42,0x40,0x40,0x40,0x42,0x3c,0x00,0x00,0x00,0x00, // Glyph 63: 'c' + 0x00,0x00,0x02,0x02,0x02,0x3e,0x42,0x42,0x42,0x42,0x42,0x3e,0x00,0x00,0x00,0x00, // Glyph 64: 'd' + 0x00,0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x7e,0x40,0x40,0x3e,0x00,0x00,0x00,0x00, // Glyph 65: 'e' + 0x00,0x00,0x0e,0x10,0x10,0x7e,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00, // Glyph 66: 'f' + 0x00,0x00,0x00,0x00,0x00,0x3e,0x42,0x42,0x42,0x42,0x42,0x3e,0x02,0x02,0x3c,0x00, // Glyph 67: 'g' + 0x00,0x00,0x40,0x40,0x40,0x7c,0x42,0x42,0x42,0x42,0x42,0x42,0x00,0x00,0x00,0x00, // Glyph 68: 'h' + 0x00,0x00,0x08,0x08,0x00,0x38,0x08,0x08,0x08,0x08,0x08,0x3e,0x00,0x00,0x00,0x00, // Glyph 69: 'i' + 0x00,0x00,0x04,0x04,0x00,0x1c,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x38,0x00, // Glyph 6a: 'j' + 0x00,0x00,0x40,0x40,0x40,0x44,0x48,0x50,0x70,0x48,0x44,0x42,0x00,0x00,0x00,0x00, // Glyph 6b: 'k' + 0x00,0x00,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3e,0x00,0x00,0x00,0x00, // Glyph 6c: 'l' + 0x00,0x00,0x00,0x00,0x00,0x77,0x49,0x49,0x49,0x49,0x49,0x49,0x00,0x00,0x00,0x00, // Glyph 6d: 'm' + 0x00,0x00,0x00,0x00,0x00,0x7c,0x42,0x42,0x42,0x42,0x42,0x42,0x00,0x00,0x00,0x00, // Glyph 6e: 'n' + 0x00,0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, // Glyph 6f: 'o' + 0x00,0x00,0x00,0x00,0x00,0x7c,0x42,0x42,0x42,0x42,0x42,0x7c,0x40,0x40,0x40,0x00, // Glyph 70: 'p' + 0x00,0x00,0x00,0x00,0x00,0x3e,0x42,0x42,0x42,0x42,0x42,0x3e,0x02,0x02,0x02,0x00, // Glyph 71: 'q' + 0x00,0x00,0x00,0x00,0x00,0x2e,0x30,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00, // Glyph 72: 'r' + 0x00,0x00,0x00,0x00,0x00,0x3e,0x40,0x20,0x18,0x04,0x02,0x7c,0x00,0x00,0x00,0x00, // Glyph 73: 's' + 0x00,0x00,0x00,0x10,0x10,0x7e,0x10,0x10,0x10,0x10,0x10,0x0e,0x00,0x00,0x00,0x00, // Glyph 74: 't' + 0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x3e,0x00,0x00,0x00,0x00, // Glyph 75: 'u' + 0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x24,0x24,0x18,0x18,0x00,0x00,0x00,0x00, // Glyph 76: 'v' + 0x00,0x00,0x00,0x00,0x00,0x41,0x41,0x41,0x49,0x49,0x55,0x63,0x00,0x00,0x00,0x00, // Glyph 77: 'w' + 0x00,0x00,0x00,0x00,0x00,0x41,0x22,0x14,0x08,0x14,0x22,0x41,0x00,0x00,0x00,0x00, // Glyph 78: 'x' + 0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x3e,0x02,0x02,0x3c,0x00, // Glyph 79: 'y' + 0x00,0x00,0x00,0x00,0x00,0x7e,0x04,0x08,0x10,0x20,0x40,0x7e,0x00,0x00,0x00,0x00, // Glyph 7a: 'z' + 0x00,0x0e,0x10,0x10,0x10,0x10,0x10,0xe0,0x10,0x10,0x10,0x10,0x10,0x0e,0x00,0x00, // Glyph 7b: '{' + 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00, // Glyph 7c: '|' + 0x00,0x70,0x08,0x08,0x08,0x08,0x08,0x07,0x08,0x08,0x08,0x08,0x08,0x70,0x00,0x00, // Glyph 7d: '}' + 0x00,0x00,0x31,0x49,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 7e: '~' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 7f + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 80 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 81 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 82 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 83 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 84 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 85 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 86 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 87 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 88 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 89 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 8a + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 8b + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 8c + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 8d + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 8e + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 8f + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 90 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 91 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 92 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 93 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 94 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 95 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 96 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 97 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 98 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 99 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 9a + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 9b + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 9c + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 9d + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 9e + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph 9f + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph a0 + 0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x00, // Glyph a1: '¡' + 0x00,0x00,0x08,0x08,0x1c,0x22,0x40,0x40,0x40,0x22,0x1c,0x08,0x08,0x00,0x00,0x00, // Glyph a2: '¢' + 0x00,0x00,0x00,0x1c,0x22,0x20,0x20,0xf8,0x20,0x20,0x72,0x8c,0x00,0x00,0x00,0x00, // Glyph a3: '£' + 0x00,0x00,0x00,0x00,0x42,0x3c,0x24,0x24,0x24,0x3c,0x42,0x00,0x00,0x00,0x00,0x00, // Glyph a4: '¤' + 0x00,0x00,0x00,0x41,0x22,0x14,0x08,0x3e,0x08,0x3e,0x08,0x08,0x00,0x00,0x00,0x00, // Glyph a5: '¥' + 0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x00,0x00, // Glyph a6: '¦' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph a7: '§' + 0x22,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph a8: '¨' + 0x00,0x00,0x00,0x1c,0x22,0x41,0x4d,0x51,0x51,0x4d,0x41,0x22,0x1c,0x00,0x00,0x00, // Glyph a9: '©' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph aa: 'ª' + 0x00,0x00,0x00,0x00,0x00,0x09,0x12,0x24,0x48,0x24,0x12,0x09,0x00,0x00,0x00,0x00, // Glyph ab: '«' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph ac: '¬' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph ad + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph ae: '®' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph af: '¯' + 0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph b0: '°' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph b1: '±' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph b2: '²' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph b3: '³' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph b4: '´' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph b5: 'µ' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph b6: '¶' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph b7: '·' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x30,0x00, // Glyph b8: '¸' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph b9: '¹' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph ba: 'º' + 0x00,0x00,0x00,0x00,0x00,0x48,0x24,0x12,0x09,0x12,0x24,0x48,0x00,0x00,0x00,0x00, // Glyph bb: '»' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph bc: '¼' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph bd: '½' + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Glyph be: '¾' + 0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x00,0x00,0x08,0x10,0x20,0x40,0x42,0x3c,0x00, // Glyph bf: '¿' + 0x20,0x10,0x00,0x18,0x18,0x24,0x24,0x24,0x7e,0x42,0x42,0x42,0x00,0x00,0x00,0x00, // Glyph c0: 'À' + 0x04,0x08,0x00,0x18,0x18,0x24,0x24,0x24,0x7e,0x42,0x42,0x42,0x00,0x00,0x00,0x00, // Glyph c1: 'Á' + 0x18,0x24,0x00,0x18,0x18,0x24,0x24,0x24,0x7e,0x42,0x42,0x42,0x00,0x00,0x00,0x00, // Glyph c2: 'Â' + 0x32,0x4c,0x00,0x18,0x18,0x24,0x24,0x24,0x7e,0x42,0x42,0x42,0x00,0x00,0x00,0x00, // Glyph c3: 'Ã' + 0x24,0x24,0x00,0x18,0x18,0x24,0x24,0x24,0x7e,0x42,0x42,0x42,0x00,0x00,0x00,0x00, // Glyph c4: 'Ä' + 0x18,0x24,0x24,0x18,0x18,0x24,0x24,0x24,0x7e,0x42,0x42,0x42,0x00,0x00,0x00,0x00, // Glyph c5: 'Å' + 0x00,0x00,0x00,0x0f,0x14,0x14,0x24,0x27,0x3c,0x44,0x44,0x47,0x00,0x00,0x00,0x00, // Glyph c6: 'Æ' + 0x00,0x00,0x00,0x1e,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x1e,0x08,0x08,0x30,0x00, // Glyph c7: 'Ç' + 0x20,0x10,0x00,0x7e,0x40,0x40,0x40,0x7c,0x40,0x40,0x40,0x7e,0x00,0x00,0x00,0x00, // Glyph c8: 'È' + 0x04,0x08,0x00,0x7e,0x40,0x40,0x40,0x7c,0x40,0x40,0x40,0x7e,0x00,0x00,0x00,0x00, // Glyph c9: 'É' + 0x18,0x24,0x00,0x7e,0x40,0x40,0x40,0x7c,0x40,0x40,0x40,0x7e,0x00,0x00,0x00,0x00, // Glyph ca: 'Ê' + 0x24,0x24,0x00,0x7e,0x40,0x40,0x40,0x7c,0x40,0x40,0x40,0x7e,0x00,0x00,0x00,0x00, // Glyph cb: 'Ë' + 0x10,0x08,0x00,0x3e,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3e,0x00,0x00,0x00,0x00, // Glyph cc: 'Ì' + 0x04,0x08,0x00,0x3e,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3e,0x00,0x00,0x00,0x00, // Glyph cd: 'Í' + 0x18,0x24,0x00,0x3e,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3e,0x00,0x00,0x00,0x00, // Glyph ce: 'Î' + 0x22,0x22,0x00,0x3e,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3e,0x00,0x00,0x00,0x00, // Glyph cf: 'Ï' + 0x00,0x00,0x00,0x3c,0x22,0x21,0x21,0x79,0x21,0x21,0x22,0x3c,0x00,0x00,0x00,0x00, // Glyph d0: 'Ð' + 0x32,0x4c,0x00,0x42,0x62,0x52,0x4a,0x46,0x42,0x42,0x42,0x42,0x00,0x00,0x00,0x00, // Glyph d1: 'Ñ' + 0x10,0x08,0x00,0x1c,0x22,0x41,0x41,0x41,0x41,0x41,0x22,0x1c,0x00,0x00,0x00,0x00, // Glyph d2: 'Ò' + 0x04,0x08,0x00,0x1c,0x22,0x41,0x41,0x41,0x41,0x41,0x22,0x1c,0x00,0x00,0x00,0x00, // Glyph d3: 'Ó' + 0x18,0x24,0x00,0x1c,0x22,0x41,0x41,0x41,0x41,0x41,0x22,0x1c,0x00,0x00,0x00,0x00, // Glyph d4: 'Ô' + 0x32,0x4c,0x00,0x1c,0x22,0x41,0x41,0x41,0x41,0x41,0x22,0x1c,0x00,0x00,0x00,0x00, // Glyph d5: 'Õ' + 0x24,0x24,0x00,0x1c,0x22,0x41,0x41,0x41,0x41,0x41,0x22,0x1c,0x00,0x00,0x00,0x00, // Glyph d6: 'Ö' + 0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x14,0x08,0x14,0x22,0x00,0x00,0x00,0x00,0x00, // Glyph d7: '×' + 0x00,0x00,0x02,0x3c,0x42,0x46,0x4a,0x52,0x62,0x42,0x42,0x3c,0x40,0x00,0x00,0x00, // Glyph d8: 'Ø' + 0x20,0x10,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, // Glyph d9: 'Ù' + 0x04,0x08,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, // Glyph da: 'Ú' + 0x18,0x24,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, // Glyph db: 'Û' + 0x24,0x24,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, // Glyph dc: 'Ü' + 0x04,0x08,0x00,0x41,0x41,0x22,0x14,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x00, // Glyph dd: 'Ý' + 0x00,0x00,0x00,0x40,0x40,0x7c,0x42,0x42,0x42,0x7c,0x40,0x40,0x00,0x00,0x00,0x00, // Glyph de: 'Þ' + 0x00,0x00,0x00,0x3c,0x42,0x44,0x4c,0x42,0x42,0x42,0x44,0x58,0x00,0x00,0x00,0x00, // Glyph df: 'ß' + 0x00,0x00,0x20,0x10,0x00,0x3c,0x02,0x02,0x3e,0x42,0x42,0x3e,0x00,0x00,0x00,0x00, // Glyph e0: 'à' + 0x00,0x00,0x04,0x08,0x00,0x3c,0x02,0x02,0x3e,0x42,0x42,0x3e,0x00,0x00,0x00,0x00, // Glyph e1: 'á' + 0x00,0x18,0x24,0x00,0x00,0x3c,0x02,0x02,0x3e,0x42,0x42,0x3e,0x00,0x00,0x00,0x00, // Glyph e2: 'â' + 0x00,0x32,0x4c,0x00,0x00,0x3c,0x02,0x02,0x3e,0x42,0x42,0x3e,0x00,0x00,0x00,0x00, // Glyph e3: 'ã' + 0x00,0x00,0x24,0x24,0x00,0x3c,0x02,0x02,0x3e,0x42,0x42,0x3e,0x00,0x00,0x00,0x00, // Glyph e4: 'ä' + 0x18,0x24,0x24,0x18,0x00,0x3c,0x02,0x02,0x3e,0x42,0x42,0x3e,0x00,0x00,0x00,0x00, // Glyph e5: 'å' + 0x00,0x00,0x00,0x00,0x00,0x36,0x09,0x39,0x4f,0x48,0x48,0x37,0x00,0x00,0x00,0x00, // Glyph e6: 'æ' + 0x00,0x00,0x00,0x00,0x00,0x3c,0x42,0x40,0x40,0x40,0x42,0x3c,0x08,0x08,0x30,0x00, // Glyph e7: 'ç' + 0x00,0x00,0x20,0x10,0x00,0x3c,0x42,0x42,0x7e,0x40,0x40,0x3e,0x00,0x00,0x00,0x00, // Glyph e8: 'è' + 0x00,0x00,0x04,0x08,0x00,0x3c,0x42,0x42,0x7e,0x40,0x40,0x3e,0x00,0x00,0x00,0x00, // Glyph e9: 'é' + 0x00,0x18,0x24,0x00,0x00,0x3c,0x42,0x42,0x7e,0x40,0x40,0x3e,0x00,0x00,0x00,0x00, // Glyph ea: 'ê' + 0x00,0x00,0x24,0x24,0x00,0x3c,0x42,0x42,0x7e,0x40,0x40,0x3e,0x00,0x00,0x00,0x00, // Glyph eb: 'ë' + 0x00,0x00,0x10,0x08,0x00,0x38,0x08,0x08,0x08,0x08,0x08,0x3e,0x00,0x00,0x00,0x00, // Glyph ec: 'ì' + 0x00,0x00,0x04,0x08,0x00,0x38,0x08,0x08,0x08,0x08,0x08,0x3e,0x00,0x00,0x00,0x00, // Glyph ed: 'í' + 0x00,0x18,0x24,0x00,0x00,0x38,0x08,0x08,0x08,0x08,0x08,0x3e,0x00,0x00,0x00,0x00, // Glyph ee: 'î' + 0x00,0x00,0x24,0x24,0x00,0x38,0x08,0x08,0x08,0x08,0x08,0x3e,0x00,0x00,0x00,0x00, // Glyph ef: 'ï' + 0x00,0x09,0x06,0x1a,0x01,0x1d,0x23,0x41,0x41,0x41,0x22,0x1c,0x00,0x00,0x00,0x00, // Glyph f0: 'ð' + 0x00,0x32,0x4c,0x00,0x00,0x7c,0x42,0x42,0x42,0x42,0x42,0x42,0x00,0x00,0x00,0x00, // Glyph f1: 'ñ' + 0x00,0x00,0x10,0x08,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, // Glyph f2: 'ò' + 0x00,0x00,0x04,0x08,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, // Glyph f3: 'ó' + 0x00,0x18,0x24,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, // Glyph f4: 'ô' + 0x00,0x32,0x4c,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, // Glyph f5: 'õ' + 0x00,0x00,0x24,0x24,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00,0x00,0x00, // Glyph f6: 'ö' + 0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x7e,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00, // Glyph f7: '÷' + 0x00,0x00,0x00,0x00,0x02,0x3c,0x46,0x4a,0x52,0x62,0x42,0x3c,0x40,0x00,0x00,0x00, // Glyph f8: 'ø' + 0x00,0x00,0x20,0x10,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x3e,0x00,0x00,0x00,0x00, // Glyph f9: 'ù' + 0x00,0x00,0x04,0x08,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x3e,0x00,0x00,0x00,0x00, // Glyph fa: 'ú' + 0x00,0x18,0x24,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x3e,0x00,0x00,0x00,0x00, // Glyph fb: 'û' + 0x00,0x00,0x24,0x24,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x3e,0x00,0x00,0x00,0x00, // Glyph fc: 'ü' + 0x00,0x00,0x04,0x08,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x3e,0x02,0x02,0x3c,0x00, // Glyph fd: 'ý' + 0x00,0x00,0x40,0x40,0x40,0x5c,0x62,0x41,0x41,0x41,0x62,0x5c,0x40,0x40,0x40,0x00, // Glyph fe: 'þ' + 0x00,0x00,0x24,0x24,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x3e,0x02,0x02,0x3c,0x00, // Glyph ff: 'ÿ' +}; diff --git a/src/drivers/fb/main.cpp b/src/drivers/fb/main.cpp index b8aa69c..2bf2655 100644 --- a/src/drivers/fb/main.cpp +++ b/src/drivers/fb/main.cpp @@ -8,6 +8,8 @@ #include +#include "font.h" + extern "C" { int main(int, const char **); void _get_init(size_t *initc, struct j6_init_value **initv); @@ -33,6 +35,14 @@ main(int argc, const char **argv) if (!fb) return 1; + size_t font_size = sizeof(font_glyph_data); + if (font_size != (font_glyph_size*font_glyph_count)) { + _syscall_system_log("fb driver has wrong font data, exiting"); + return 1; + } + + volatile uint8_t const * p = font_glyph_data; + uint32_t *fbp = reinterpret_cast(fb->addr); size_t size = fb->size; for (size_t i=0; i < size/4; ++i) {