From dccb136c990244b86089a98e1394e0321dbf9c4e Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Sun, 3 Jan 2021 00:08:20 -0800 Subject: [PATCH] [fb] Change to embedding PSF file Moved old PSF parsing code from kernel, and switched to embedding whole PSF instead of just glyph data to make font class the same code paths for both cases. --- modules.yaml | 4 +- src/boot/console.cpp | 12 +- src/drivers/fb/default_font.inc | 390 ++++++++++++++++++++++++++++ src/{kernel => drivers/fb}/font.cpp | 33 ++- src/drivers/fb/font.h | 291 +++------------------ src/drivers/fb/main.cpp | 36 ++- src/drivers/fb/screen.cpp | 41 +++ src/drivers/fb/screen.h | 28 ++ src/include/j6/init.h | 2 +- src/include/kernel_args.h | 1 + src/kernel/console.cpp | 213 --------------- src/kernel/console.h | 6 - src/kernel/font.h | 33 --- src/kernel/main.cpp | 10 +- src/kernel/screen.cpp | 70 ----- src/kernel/screen.h | 38 --- 16 files changed, 553 insertions(+), 655 deletions(-) create mode 100644 src/drivers/fb/default_font.inc rename src/{kernel => drivers/fb}/font.cpp (72%) create mode 100644 src/drivers/fb/screen.cpp create mode 100644 src/drivers/fb/screen.h delete mode 100644 src/kernel/font.h delete mode 100644 src/kernel/screen.cpp delete mode 100644 src/kernel/screen.h diff --git a/modules.yaml b/modules.yaml index 74ee97f..b79a9d9 100644 --- a/modules.yaml +++ b/modules.yaml @@ -20,7 +20,6 @@ modules: - src/kernel/debug.cpp - src/kernel/debug.s - src/kernel/device_manager.cpp - - src/kernel/font.cpp - src/kernel/frame_allocator.cpp - src/kernel/fs/gpt.cpp - src/kernel/gdt.cpp @@ -44,7 +43,6 @@ modules: - src/kernel/page_table.cpp - src/kernel/pci.cpp - src/kernel/scheduler.cpp - - src/kernel/screen.cpp - src/kernel/serial.cpp - src/kernel/symbol_table.cpp - src/kernel/syscall.cpp @@ -93,7 +91,9 @@ modules: deps: - libc source: + - src/drivers/fb/font.cpp - src/drivers/fb/main.cpp + - src/drivers/fb/screen.cpp kutil: kind: lib diff --git a/src/boot/console.cpp b/src/boot/console.cpp index 9448352..b820a3e 100644 --- a/src/boot/console.cpp +++ b/src/boot/console.cpp @@ -127,7 +127,17 @@ console::pick_mode(uefi::boot_services *bs) m_fb.vertical = gfx_out_proto->mode->info->vertical_resolution; m_fb.horizontal = gfx_out_proto->mode->info->horizontal_resolution; m_fb.scanline = gfx_out_proto->mode->info->pixels_per_scanline; - m_fb.type = static_cast(pixmode); + + switch (gfx_out_proto->mode->info->pixel_format) { + case uefi::pixel_format::rgb8: + m_fb.type = kernel::args::fb_type::rgb8; + break; + case uefi::pixel_format::bgr8: + m_fb.type = kernel::args::fb_type::bgr8; + break; + default: + m_fb.type = kernel::args::fb_type::none; + } } } diff --git a/src/drivers/fb/default_font.inc b/src/drivers/fb/default_font.inc new file mode 100644 index 0000000..32f83a8 --- /dev/null +++ b/src/drivers/fb/default_font.inc @@ -0,0 +1,390 @@ + 0x72, 0xb5, 0x4a, 0x86, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7e, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, + 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x38, 0x44, 0x44, 0x44, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf8, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0xff, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x0f, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0xf8, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x22, 0x20, 0x20, 0xf8, 0x20, 0x20, 0x72, 0x8c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, 0x7e, 0x24, 0x24, + 0x24, 0x7e, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, + 0x1e, 0x20, 0x20, 0x1c, 0x02, 0x02, 0x3c, 0x08, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x30, 0x49, 0x4a, 0x34, 0x08, 0x16, 0x29, 0x49, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x48, 0x48, 0x48, 0x30, 0x31, + 0x49, 0x46, 0x46, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, + 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x10, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x10, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x24, 0x18, 0x7e, 0x18, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x7f, 0x08, 0x08, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x18, 0x18, 0x08, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, + 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x42, 0x46, 0x4a, 0x52, 0x62, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x18, 0x28, 0x08, 0x08, 0x08, 0x08, 0x08, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x02, 0x02, 0x04, + 0x08, 0x10, 0x20, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, + 0x04, 0x08, 0x1c, 0x02, 0x02, 0x02, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x0c, 0x14, 0x24, 0x44, 0x7e, 0x04, 0x04, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x40, 0x40, 0x7c, 0x02, + 0x02, 0x02, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x20, 0x40, 0x40, 0x7c, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7e, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x42, 0x42, 0x3c, + 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x42, 0x42, 0x42, 0x3e, 0x02, 0x02, 0x04, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, + 0x00, 0x00, 0x18, 0x18, 0x08, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x08, 0x10, 0x20, 0x40, 0x20, 0x10, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x7e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, + 0x04, 0x08, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, + 0x02, 0x04, 0x08, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0x22, 0x41, 0x4f, 0x51, 0x51, 0x51, 0x53, 0x4d, 0x40, + 0x20, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x24, 0x42, 0x42, 0x42, + 0x7e, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, + 0x42, 0x42, 0x42, 0x7c, 0x42, 0x42, 0x42, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1e, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x1e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x44, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x44, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, + 0x40, 0x40, 0x40, 0x7c, 0x40, 0x40, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7e, 0x40, 0x40, 0x40, 0x7c, 0x40, 0x40, 0x40, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x20, 0x40, 0x40, 0x46, + 0x42, 0x42, 0x22, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, + 0x42, 0x42, 0x42, 0x7e, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3e, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x02, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, + 0x44, 0x48, 0x50, 0x60, 0x50, 0x48, 0x44, 0x42, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x63, 0x55, 0x49, 0x49, + 0x41, 0x41, 0x41, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, + 0x62, 0x52, 0x4a, 0x46, 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x42, 0x42, 0x42, 0x7c, + 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, + 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x04, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7c, 0x42, 0x42, 0x42, 0x7c, 0x48, 0x44, 0x42, 0x42, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x40, 0x40, 0x20, 0x18, + 0x04, 0x02, 0x02, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x24, 0x24, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, + 0x41, 0x41, 0x41, 0x49, 0x49, 0x49, 0x55, 0x63, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x41, 0x41, 0x22, 0x14, 0x08, 0x14, 0x22, 0x41, 0x41, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x41, 0x22, 0x14, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, + 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1e, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x20, 0x20, 0x10, 0x10, + 0x08, 0x08, 0x04, 0x04, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x78, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x78, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x28, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x02, 0x02, 0x3e, 0x42, 0x42, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x7c, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3c, 0x42, 0x40, 0x40, 0x40, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x02, 0x02, 0x3e, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x42, 0x42, + 0x7e, 0x40, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x10, + 0x10, 0x7e, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e, + 0x02, 0x02, 0x3c, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x7c, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, + 0x00, 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x04, 0x00, 0x1c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x04, 0x38, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x44, 0x48, 0x50, + 0x70, 0x48, 0x44, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x7c, + 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x3e, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x2e, 0x30, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x40, 0x20, 0x18, 0x04, 0x02, 0x7c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x7e, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x24, 0x24, 0x18, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x41, 0x41, + 0x49, 0x49, 0x55, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x41, 0x22, 0x14, 0x08, 0x14, 0x22, 0x41, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e, + 0x02, 0x02, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x04, 0x08, + 0x10, 0x20, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x10, 0x10, + 0x10, 0x10, 0x10, 0xe0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0e, 0x00, 0x00, + 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x00, 0x00, 0x00, 0x70, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x70, 0x00, 0x00, 0x00, 0x00, 0x31, 0x49, + 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, + 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x08, 0x08, + 0x1c, 0x22, 0x40, 0x40, 0x40, 0x22, 0x1c, 0x08, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x22, 0x20, 0x20, 0xf8, 0x20, 0x20, 0x72, 0x8c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x3c, 0x24, 0x24, + 0x24, 0x3c, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, + 0x22, 0x14, 0x08, 0x3e, 0x08, 0x3e, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x08, 0x08, + 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1c, 0x22, 0x41, 0x4d, 0x51, 0x51, 0x4d, 0x41, 0x22, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x09, 0x12, 0x24, 0x48, 0x24, 0x12, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x44, 0x44, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x08, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x24, 0x12, 0x09, 0x12, 0x24, 0x48, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00, + 0x00, 0x08, 0x10, 0x20, 0x40, 0x42, 0x3c, 0x00, 0x20, 0x10, 0x00, 0x18, + 0x18, 0x24, 0x24, 0x24, 0x7e, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x08, 0x00, 0x18, 0x18, 0x24, 0x24, 0x24, 0x7e, 0x42, 0x42, 0x42, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x24, 0x00, 0x18, 0x18, 0x24, 0x24, 0x24, + 0x7e, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x32, 0x4c, 0x00, 0x18, + 0x18, 0x24, 0x24, 0x24, 0x7e, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, + 0x24, 0x24, 0x00, 0x18, 0x18, 0x24, 0x24, 0x24, 0x7e, 0x42, 0x42, 0x42, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x24, 0x24, 0x18, 0x18, 0x24, 0x24, 0x24, + 0x7e, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, + 0x14, 0x14, 0x24, 0x27, 0x3c, 0x44, 0x44, 0x47, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1e, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x1e, + 0x08, 0x08, 0x30, 0x00, 0x20, 0x10, 0x00, 0x7e, 0x40, 0x40, 0x40, 0x7c, + 0x40, 0x40, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x7e, + 0x40, 0x40, 0x40, 0x7c, 0x40, 0x40, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x24, 0x00, 0x7e, 0x40, 0x40, 0x40, 0x7c, 0x40, 0x40, 0x40, 0x7e, + 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, 0x00, 0x7e, 0x40, 0x40, 0x40, 0x7c, + 0x40, 0x40, 0x40, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x3e, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x08, 0x00, 0x3e, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x24, 0x00, 0x3e, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x3e, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3c, 0x22, 0x21, 0x21, 0x79, 0x21, 0x21, 0x22, 0x3c, + 0x00, 0x00, 0x00, 0x00, 0x32, 0x4c, 0x00, 0x42, 0x62, 0x52, 0x4a, 0x46, + 0x42, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x1c, + 0x22, 0x41, 0x41, 0x41, 0x41, 0x41, 0x22, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x08, 0x00, 0x1c, 0x22, 0x41, 0x41, 0x41, 0x41, 0x41, 0x22, 0x1c, + 0x00, 0x00, 0x00, 0x00, 0x18, 0x24, 0x00, 0x1c, 0x22, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x22, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x32, 0x4c, 0x00, 0x1c, + 0x22, 0x41, 0x41, 0x41, 0x41, 0x41, 0x22, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x24, 0x24, 0x00, 0x1c, 0x22, 0x41, 0x41, 0x41, 0x41, 0x41, 0x22, 0x1c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x14, + 0x08, 0x14, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3c, + 0x42, 0x46, 0x4a, 0x52, 0x62, 0x42, 0x42, 0x3c, 0x40, 0x00, 0x00, 0x00, + 0x20, 0x10, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x18, 0x24, 0x00, 0x42, + 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x24, 0x24, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x41, 0x41, 0x22, 0x14, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x40, 0x7c, 0x42, 0x42, 0x42, 0x7c, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3c, 0x42, 0x44, 0x4c, 0x42, 0x42, 0x42, 0x44, 0x58, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x3c, 0x02, 0x02, + 0x3e, 0x42, 0x42, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, + 0x00, 0x3c, 0x02, 0x02, 0x3e, 0x42, 0x42, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x24, 0x00, 0x00, 0x3c, 0x02, 0x02, 0x3e, 0x42, 0x42, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x4c, 0x00, 0x00, 0x3c, 0x02, 0x02, + 0x3e, 0x42, 0x42, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, + 0x00, 0x3c, 0x02, 0x02, 0x3e, 0x42, 0x42, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x24, 0x24, 0x18, 0x00, 0x3c, 0x02, 0x02, 0x3e, 0x42, 0x42, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x09, 0x39, + 0x4f, 0x48, 0x48, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3c, 0x42, 0x40, 0x40, 0x40, 0x42, 0x3c, 0x08, 0x08, 0x30, 0x00, + 0x00, 0x00, 0x20, 0x10, 0x00, 0x3c, 0x42, 0x42, 0x7e, 0x40, 0x40, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x00, 0x3c, 0x42, 0x42, + 0x7e, 0x40, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x24, 0x00, + 0x00, 0x3c, 0x42, 0x42, 0x7e, 0x40, 0x40, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x24, 0x24, 0x00, 0x3c, 0x42, 0x42, 0x7e, 0x40, 0x40, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x38, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, + 0x00, 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x24, 0x00, 0x00, 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, 0x00, 0x38, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x06, 0x1a, + 0x01, 0x1d, 0x23, 0x41, 0x41, 0x41, 0x22, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x32, 0x4c, 0x00, 0x00, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x3c, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, + 0x00, 0x3c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x24, 0x00, 0x00, 0x3c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x4c, 0x00, 0x00, 0x3c, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, + 0x00, 0x3c, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x18, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3c, 0x46, 0x4a, + 0x52, 0x62, 0x42, 0x3c, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, + 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x08, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x24, 0x00, 0x00, 0x42, 0x42, 0x42, + 0x42, 0x42, 0x42, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, + 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x08, 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e, + 0x02, 0x02, 0x3c, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x5c, 0x62, 0x41, + 0x41, 0x41, 0x62, 0x5c, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x24, 0x24, + 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3e, 0x02, 0x02, 0x3c, 0x00, + 0xff, 0xff, 0xe2, 0x96, 0x92, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0xb0, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x94, 0x98, 0xff, 0xe2, 0x94, 0x90, 0xff, + 0xe2, 0x94, 0x8c, 0xff, 0xe2, 0x94, 0x94, 0xff, 0xe2, 0x94, 0xbc, 0xff, + 0xff, 0xff, 0xe2, 0x94, 0x80, 0xff, 0xff, 0xff, 0xe2, 0x94, 0x9c, 0xff, + 0xe2, 0x94, 0xa4, 0xff, 0xe2, 0x94, 0xb4, 0xff, 0xe2, 0x94, 0xac, 0xff, + 0xe2, 0x94, 0x82, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0xa3, 0xff, 0xff, + 0x20, 0xff, 0x21, 0xff, 0x22, 0xff, 0x23, 0xff, 0x24, 0xff, 0x25, 0xff, + 0x26, 0xff, 0x27, 0xff, 0x28, 0xff, 0x29, 0xff, 0x2a, 0xff, 0x2b, 0xff, + 0x2c, 0xff, 0x2d, 0xff, 0x2e, 0xff, 0x2f, 0xff, 0x30, 0xff, 0x31, 0xff, + 0x32, 0xff, 0x33, 0xff, 0x34, 0xff, 0x35, 0xff, 0x36, 0xff, 0x37, 0xff, + 0x38, 0xff, 0x39, 0xff, 0x3a, 0xff, 0x3b, 0xff, 0x3c, 0xff, 0x3d, 0xff, + 0x3e, 0xff, 0x3f, 0xff, 0x40, 0xff, 0x41, 0xff, 0x42, 0xff, 0x43, 0xff, + 0x44, 0xff, 0x45, 0xff, 0x46, 0xff, 0x47, 0xff, 0x48, 0xff, 0x49, 0xff, + 0x4a, 0xff, 0x4b, 0xff, 0x4c, 0xff, 0x4d, 0xff, 0x4e, 0xff, 0x4f, 0xff, + 0x50, 0xff, 0x51, 0xff, 0x52, 0xff, 0x53, 0xff, 0x54, 0xff, 0x55, 0xff, + 0x56, 0xff, 0x57, 0xff, 0x58, 0xff, 0x59, 0xff, 0x5a, 0xff, 0x5b, 0xff, + 0x5c, 0xff, 0x5d, 0xff, 0x5e, 0xff, 0x5f, 0xff, 0x60, 0xff, 0x61, 0xff, + 0x62, 0xff, 0x63, 0xff, 0x64, 0xff, 0x65, 0xff, 0x66, 0xff, 0x67, 0xff, + 0x68, 0xff, 0x69, 0xff, 0x6a, 0xff, 0x6b, 0xff, 0x6c, 0xff, 0x6d, 0xff, + 0x6e, 0xff, 0x6f, 0xff, 0x70, 0xff, 0x71, 0xff, 0x72, 0xff, 0x73, 0xff, + 0x74, 0xff, 0x75, 0xff, 0x76, 0xff, 0x77, 0xff, 0x78, 0xff, 0x79, 0xff, + 0x7a, 0xff, 0x7b, 0xff, 0x7c, 0xff, 0x7d, 0xff, 0x7e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0xa0, 0xff, 0xc2, 0xa1, + 0xff, 0xc2, 0xa2, 0xff, 0xc2, 0xa3, 0xff, 0xc2, 0xa4, 0xff, 0xc2, 0xa5, + 0xff, 0xc2, 0xa6, 0xff, 0xff, 0xc2, 0xa8, 0xff, 0xc2, 0xa9, 0xff, 0xff, + 0xc2, 0xab, 0xff, 0xff, 0xc2, 0xad, 0xff, 0xff, 0xff, 0xc2, 0xb0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0xb8, 0xff, 0xff, 0xff, + 0xc2, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xc2, 0xbf, 0xff, 0xc3, 0x80, 0xff, + 0xc3, 0x81, 0xff, 0xc3, 0x82, 0xff, 0xc3, 0x83, 0xff, 0xc3, 0x84, 0xff, + 0xc3, 0x85, 0xff, 0xc3, 0x86, 0xff, 0xc3, 0x87, 0xff, 0xc3, 0x88, 0xff, + 0xc3, 0x89, 0xff, 0xc3, 0x8a, 0xff, 0xc3, 0x8b, 0xff, 0xc3, 0x8c, 0xff, + 0xc3, 0x8d, 0xff, 0xc3, 0x8e, 0xff, 0xc3, 0x8f, 0xff, 0xc3, 0x90, 0xff, + 0xc3, 0x91, 0xff, 0xc3, 0x92, 0xff, 0xc3, 0x93, 0xff, 0xc3, 0x94, 0xff, + 0xc3, 0x95, 0xff, 0xc3, 0x96, 0xff, 0xc3, 0x97, 0xff, 0xc3, 0x98, 0xff, + 0xc3, 0x99, 0xff, 0xc3, 0x9a, 0xff, 0xc3, 0x9b, 0xff, 0xc3, 0x9c, 0xff, + 0xc3, 0x9d, 0xff, 0xc3, 0x9e, 0xff, 0xc3, 0x9f, 0xff, 0xc3, 0xa0, 0xff, + 0xc3, 0xa1, 0xff, 0xc3, 0xa2, 0xff, 0xc3, 0xa3, 0xff, 0xc3, 0xa4, 0xff, + 0xc3, 0xa5, 0xff, 0xc3, 0xa6, 0xff, 0xc3, 0xa7, 0xff, 0xc3, 0xa8, 0xff, + 0xc3, 0xa9, 0xff, 0xc3, 0xaa, 0xff, 0xc3, 0xab, 0xff, 0xc3, 0xac, 0xff, + 0xc3, 0xad, 0xff, 0xc3, 0xae, 0xff, 0xc3, 0xaf, 0xff, 0xc3, 0xb0, 0xff, + 0xc3, 0xb1, 0xff, 0xc3, 0xb2, 0xff, 0xc3, 0xb3, 0xff, 0xc3, 0xb4, 0xff, + 0xc3, 0xb5, 0xff, 0xc3, 0xb6, 0xff, 0xc3, 0xb7, 0xff, 0xc3, 0xb8, 0xff, + 0xc3, 0xb9, 0xff, 0xc3, 0xba, 0xff, 0xc3, 0xbb, 0xff, 0xc3, 0xbc, 0xff, + 0xc3, 0xbd, 0xff, 0xc3, 0xbe, 0xff, 0xc3, 0xbf, 0xff diff --git a/src/kernel/font.cpp b/src/drivers/fb/font.cpp similarity index 72% rename from src/kernel/font.cpp rename to src/drivers/fb/font.cpp index e5320eb..ee5b170 100644 --- a/src/kernel/font.cpp +++ b/src/drivers/fb/font.cpp @@ -1,6 +1,7 @@ -#include "kutil/assert.h" +#include #include "font.h" + /* PSF2 header format * Taken from the Linux KBD documentation * http://www.win.tue.nl/~aeb/linux/kbd/font-formats-1.html @@ -27,43 +28,51 @@ struct psf2_header { uint32_t height, width; // max dimensions of glyphs }; +const uint8_t default_font[] = { +// xxd -i < font_file.psf > default_font.inc +#include "default_font.inc" +}; font::font(void const *data) : - m_size(0, 0), - m_count(0), - m_data(nullptr) + m_sizex {0}, + m_sizey {0}, + m_count {0}, + m_data {nullptr} { + if (!data) + data = default_font; + psf2_header const *psf2 = static_cast(data); for (int i = 0; i < sizeof(magic); ++i) { - kassert(psf2->magic[i] == magic[i], "Bad font magic number."); + assert(psf2->magic[i] == magic[i] && "Bad font magic number."); } m_data = static_cast(data) + psf2->header_size; - m_size.x = psf2->width; - m_size.y = psf2->height; + m_sizex = psf2->width; + m_sizey = psf2->height; m_count = psf2->length; } void font::draw_glyph( - screen *s, + screen &s, uint32_t glyph, screen::pixel_t fg, screen::pixel_t bg, unsigned x, unsigned y) const { - unsigned bwidth = (m_size.x+7)/8; + unsigned bwidth = (m_sizex+7)/8; uint8_t const *data = m_data + (glyph * glyph_bytes()); - for (int dy = 0; dy < m_size.y; ++dy) { + for (int dy = 0; dy < m_sizey; ++dy) { for (int dx = 0; dx < bwidth; ++dx) { uint8_t byte = data[dy * bwidth + dx]; for (int i = 0; i < 8; ++i) { - if (dx*8 + i >= m_size.x) continue; + if (dx*8 + i >= m_sizex) break; const uint8_t mask = 1 << (7-i); uint32_t c = (byte & mask) ? fg : bg; - s->draw_pixel(x + dx*8 + i, y + dy, c); + s.draw_pixel(x + dx*8 + i, y + dy, c); } } } diff --git a/src/drivers/fb/font.h b/src/drivers/fb/font.h index f692165..3bf3bb8 100644 --- a/src/drivers/fb/font.h +++ b/src/drivers/fb/font.h @@ -1,266 +1,33 @@ #pragma once -// This file was autogenerated by psf_to_cpp.py from tamsyn8x16r.psf +#include -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; +#include "screen.h" -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: 'ÿ' +class font +{ +public: + /// Constructor. + /// \arg data The font data to load. If null, will load the default + /// built-in font. + font(void const *data = nullptr); + + unsigned glyph_bytes() const { return m_sizey * ((m_sizex + 7) / 8); } + unsigned count() const { return m_count; } + unsigned width() const { return m_sizex; } + unsigned height() const { return m_sizey; } + bool valid() const { return m_count > 0; } + + void draw_glyph( + screen &s, + uint32_t glyph, + screen::pixel_t fg, + screen::pixel_t bg, + unsigned x, + unsigned y) const; + +private: + unsigned m_sizex, m_sizey; + unsigned m_count; + uint8_t const *m_data; }; + diff --git a/src/drivers/fb/main.cpp b/src/drivers/fb/main.cpp index 2bf2655..9a58193 100644 --- a/src/drivers/fb/main.cpp +++ b/src/drivers/fb/main.cpp @@ -9,6 +9,7 @@ #include #include "font.h" +#include "screen.h" extern "C" { int main(int, const char **); @@ -32,21 +33,34 @@ 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"); + if (!fb || fb->addr == nullptr) { + _syscall_system_log("fb driver didn't find a framebuffer, exiting"); return 1; } - volatile uint8_t const * p = font_glyph_data; + const screen::pixel_order order = (fb->flags & 1) ? + screen::pixel_order::bgr8 : screen::pixel_order::rgb8; - uint32_t *fbp = reinterpret_cast(fb->addr); - size_t size = fb->size; - for (size_t i=0; i < size/4; ++i) { - fbp[i] = 0xff; + screen scr(fb->addr, fb->horizontal, fb->vertical, order); + font fnt; + + screen::pixel_t fg = scr.color(255, 255, 255); + screen::pixel_t bg = scr.color(49, 79, 128); + scr.fill(bg); + + constexpr int margin = 4; + + int y = margin; + char g = 0; + + while (y < scr.height() - margin - fnt.height()) { + int x = margin; + while (x < scr.width() - margin - fnt.width()) { + fnt.draw_glyph(scr, g+' ', fg, bg, x, y); + x += fnt.width() + fnt.width() / 4; + g = ++g % ('~' - ' ' + 1); + } + y += fnt.height() + fnt.height() / 4; } _syscall_system_log("fb driver done, exiting"); diff --git a/src/drivers/fb/screen.cpp b/src/drivers/fb/screen.cpp new file mode 100644 index 0000000..a01823b --- /dev/null +++ b/src/drivers/fb/screen.cpp @@ -0,0 +1,41 @@ +#include "screen.h" + +screen::screen(void *addr, unsigned hres, unsigned vres, pixel_order order) : + m_fb(static_cast(addr)), + m_order(order), + m_resx(hres), + m_resy(vres) +{ +} + +screen::pixel_t +screen::color(uint8_t r, uint8_t g, uint8_t b) const +{ + switch (m_order) { + case pixel_order::bgr8: + return + (static_cast(b) << 0) | + (static_cast(g) << 8) | + (static_cast(r) << 16); + + case pixel_order::rgb8: + return + (static_cast(r) << 0) | + (static_cast(g) << 8) | + (static_cast(b) << 16); + } +} + +void +screen::fill(pixel_t color) +{ + const size_t len = m_resx * m_resy; + for (size_t i = 0; i < len; ++i) + m_fb[i] = color; +} + +void +screen::draw_pixel(unsigned x, unsigned y, pixel_t color) +{ + m_fb[x + y * m_resx] = color; +} diff --git a/src/drivers/fb/screen.h b/src/drivers/fb/screen.h new file mode 100644 index 0000000..a9766ec --- /dev/null +++ b/src/drivers/fb/screen.h @@ -0,0 +1,28 @@ +#pragma once +#include +#include + +class screen +{ +public: + using pixel_t = uint32_t; + + enum class pixel_order : uint8_t { bgr8, rgb8, }; + + screen(void *addr, unsigned hres, unsigned vres, pixel_order order); + + unsigned width() const { return m_resx; } + unsigned height() const { return m_resy; } + + pixel_t color(uint8_t r, uint8_t g, uint8_t b) const; + + void fill(pixel_t color); + void draw_pixel(unsigned x, unsigned y, pixel_t color); + +private: + pixel_t *m_fb; + pixel_order m_order; + unsigned m_resx, m_resy; + + screen() = delete; +}; diff --git a/src/include/j6/init.h b/src/include/j6/init.h index 1e9b2cd..c53e049 100644 --- a/src/include/j6/init.h +++ b/src/include/j6/init.h @@ -19,7 +19,7 @@ struct j6_init_value { /// Structure defining a framebuffer. /// `flags` has the following bits: -/// 0-3: Pixel layout. 0000: bgr8, 0001: rgb8 +/// 0-3: Pixel layout. 0000: rgb8, 0001: bgr8 struct j6_init_framebuffer { void* addr; size_t size; diff --git a/src/include/kernel_args.h b/src/include/kernel_args.h index 12ebda0..b793edd 100644 --- a/src/include/kernel_args.h +++ b/src/include/kernel_args.h @@ -21,6 +21,7 @@ struct module { }; enum class fb_type : uint16_t { + none, rgb8, bgr8 }; diff --git a/src/kernel/console.cpp b/src/kernel/console.cpp index 0382120..fcf5edd 100644 --- a/src/kernel/console.cpp +++ b/src/kernel/console.cpp @@ -4,8 +4,6 @@ #include "kutil/no_construct.h" #include "kutil/printf.h" #include "console.h" -#include "font.h" -#include "screen.h" #include "serial.h" @@ -15,212 +13,12 @@ static kutil::no_construct __g_console_storage; console &g_console = __g_console_storage.value; -class console::screen_out -{ -public: - screen_out(screen *s, font *f) : - m_font(f), - m_screen(s), - m_size(s->width() / f->width(), s->height() / f->height()), - m_fg(0xffffff), - m_bg(0), - m_first(0), - m_data(nullptr), - m_attrs(nullptr), - m_palette(nullptr) - { - const unsigned count = m_size.size(); - const size_t attrs_size = 2 * count; - - m_data = new char[count]; - kutil::memset(m_data, 0, count); - - m_palette = new screen::pixel_t[256]; - fill_palette(); - - m_attrs = new uint16_t[count]; - set_color(7, 0); // Grey on black default - for (unsigned i = 0; i < count; ++i) m_attrs[i] = m_attr; - - repaint(); - } - - ~screen_out() - { - delete [] m_data; - delete [] m_palette; - delete [] m_attrs; - } - - void fill_palette() - { - unsigned index = 0; - - // Manually add the 16 basic ANSI colors - m_palette[index++] = m_screen->color(0x00, 0x00, 0x00); - m_palette[index++] = m_screen->color(0xcd, 0x00, 0x00); - m_palette[index++] = m_screen->color(0x00, 0xcd, 0x00); - m_palette[index++] = m_screen->color(0xcd, 0xcd, 0x00); - m_palette[index++] = m_screen->color(0x00, 0x00, 0xee); - m_palette[index++] = m_screen->color(0xcd, 0x00, 0xcd); - m_palette[index++] = m_screen->color(0x00, 0xcd, 0xcd); - m_palette[index++] = m_screen->color(0xe5, 0xe5, 0xe5); - m_palette[index++] = m_screen->color(0x7f, 0x7f, 0x7f); - m_palette[index++] = m_screen->color(0xff, 0x00, 0x00); - m_palette[index++] = m_screen->color(0x00, 0xff, 0x00); - m_palette[index++] = m_screen->color(0xff, 0xff, 0x00); - m_palette[index++] = m_screen->color(0x00, 0x50, 0xff); - m_palette[index++] = m_screen->color(0xff, 0x00, 0xff); - m_palette[index++] = m_screen->color(0x00, 0xff, 0xff); - m_palette[index++] = m_screen->color(0xff, 0xff, 0xff); - - // Build the high-color portion of the table - const uint32_t intensity[] = {0, 0x5f, 0x87, 0xaf, 0xd7, 0xff}; - const uint32_t intensities = sizeof(intensity) / sizeof(uint32_t); - - for (uint32_t r = 0; r < intensities; ++r) { - for (uint32_t g = 0; g < intensities; ++g) { - for (uint32_t b = 0; b < intensities; ++b) { - m_palette[index++] = m_screen->color( - intensity[r], intensity[g], intensity[b]); - } - } - } - - // Build the greyscale portion of the table - for (uint8_t i = 0x08; i <= 0xee; i += 10) - m_palette[index++] = m_screen->color(i, i, i); - } - - void repaint() - { - m_screen->fill(m_bg); - if (!m_data) return; - - for (unsigned y = 0; y < m_size.y; ++y) { - const char *line = line_pointer(y); - const uint16_t *attrs = attr_pointer(y); - for (unsigned x = 0; x < m_size.x; ++x) { - const uint16_t attr = attrs[x]; - - set_color(static_cast(attr), - static_cast(attr >> 8)); - - m_font->draw_glyph( - m_screen, - line[x] ? line[x] : ' ', - m_fg, - m_bg, - x * m_font->width(), - y * m_font->height()); - } - } - } - - void scroll(unsigned lines) - { - if (!m_data) { - m_pos.x = 0; - m_pos.y = 0; - } else { - unsigned bytes = lines * m_size.x; - char *line = line_pointer(0); - for (unsigned i = 0; i < bytes; ++i) - *line++ = 0; - - m_first = (m_first + lines) % m_size.y; - m_pos.y -= lines; - } - repaint(); - } - - void set_color(uint8_t fg, uint8_t bg) - { - m_bg = m_palette[bg]; - m_fg = m_palette[fg]; - m_attr = (bg << 8) | fg; - } - - void putc(char c) - { - char *line = line_pointer(m_pos.y); - uint16_t *attrs = attr_pointer(m_pos.y); - - - switch (c) { - case '\t': - m_pos.x = (m_pos.x + 4) / 4 * 4; - break; - - case '\r': - m_pos.x = 0; - break; - - case '\n': - m_pos.x = 0; - m_pos.y++; - break; - - default: { - if (line) line[m_pos.x] = c; - if (attrs) attrs[m_pos.x] = m_attr; - - const unsigned x = m_pos.x * m_font->width(); - const unsigned y = m_pos.y * m_font->height(); - m_font->draw_glyph(m_screen, c, m_fg, m_bg, x, y); - - m_pos.x++; - } - } - - if (m_pos.x >= m_size.x) { - m_pos.x = m_pos.x % m_size.x; - m_pos.y++; - } - - if (m_pos.y >= m_size.y) { - scroll(1); - line = line_pointer(m_pos.y); - } - } - -private: - char * line_pointer(unsigned line) - { - if (!m_data) return nullptr; - return m_data + ((m_first + line) % m_size.y) * m_size.x; - } - - uint16_t * attr_pointer(unsigned line) - { - if (!m_attrs) return nullptr; - return m_attrs + ((m_first + line) % m_size.y) * m_size.x; - } - - font *m_font; - screen *m_screen; - - kutil::coord m_size; - kutil::coord m_pos; - screen::pixel_t m_fg, m_bg; - uint16_t m_attr; - - size_t m_first; - - char *m_data; - uint16_t *m_attrs; - screen::pixel_t *m_palette; -}; - - console::console() : - m_screen(nullptr), m_serial(nullptr) { } console::console(serial_port *serial) : - m_screen(nullptr), m_serial(serial) { if (m_serial) { @@ -239,9 +37,6 @@ console::echo() void console::set_color(uint8_t fg, uint8_t bg) { - if (m_screen) - m_screen->set_color(fg, bg); - if (m_serial) { const char *fgseq = "\x1b[38;5;"; while (*fgseq) @@ -276,8 +71,6 @@ console::puts(const char *message) void console::putc(char c) { - if (m_screen) m_screen->putc(c); - if (m_serial) { if (c == '\n') m_serial->write('\r'); m_serial->write(c); @@ -291,9 +84,3 @@ void console::vprintf(const char *fmt, va_list args) vsnprintf_(buffer, buf_size, fmt, args); puts(buffer); } - -void -console::init_screen(screen *s, font *f) -{ - m_screen = new screen_out(s, f); -} diff --git a/src/kernel/console.h b/src/kernel/console.h index 5014ef1..5b3c8ba 100644 --- a/src/kernel/console.h +++ b/src/kernel/console.h @@ -2,9 +2,7 @@ #include #include -class font; struct kernel_data; -class screen; class serial_port; class console @@ -35,13 +33,9 @@ public: void echo(); - void init_screen(screen *s, font *f); - static console * get(); private: - class screen_out; - screen_out *m_screen; serial_port *m_serial; }; diff --git a/src/kernel/font.h b/src/kernel/font.h deleted file mode 100644 index 74723a4..0000000 --- a/src/kernel/font.h +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once -#include - -#include "kutil/coord.h" -#include "screen.h" - -class font -{ -public: - font(void const *data); - - unsigned glyph_bytes() const { return m_size.y * ((m_size.x + 7) / 8); } - unsigned count() const { return m_count; } - unsigned width() const { return m_size.x; } - unsigned height() const { return m_size.y; } - bool valid() const { return m_count > 0; } - - void draw_glyph( - screen *s, - uint32_t glyph, - screen::pixel_t fg, - screen::pixel_t bg, - unsigned x, - unsigned y) const; - -private: - kutil::coord m_size; - unsigned m_count; - uint8_t const *m_data; - - font() = delete; -}; - diff --git a/src/kernel/main.cpp b/src/kernel/main.cpp index 5fc72bb..def6202 100644 --- a/src/kernel/main.cpp +++ b/src/kernel/main.cpp @@ -45,16 +45,15 @@ run_constructors() extern void __kernel_assert(const char *, unsigned, const char *); -/// TODO: not this. this is awful. -uintptr_t fb_loc = 0; -size_t fb_size = 0; - /// Bootstrap the memory managers. void memory_initialize_pre_ctors(kernel::args::header *kargs); void memory_initialize_post_ctors(kernel::args::header *kargs); using namespace kernel; +/// TODO: not this. this is awful. +args::framebuffer *fb = nullptr; + void init_console() { @@ -137,8 +136,7 @@ kernel_main(args::header *header) } if (header->video.size > 0) { - fb_size = header->video.size; - fb_loc = header->video.phys_addr; + fb = memory::to_virtual(reinterpret_cast(&header->video)); } log::debug(logs::boot, " jsix header is at: %016lx", header); diff --git a/src/kernel/screen.cpp b/src/kernel/screen.cpp deleted file mode 100644 index 4a5ad70..0000000 --- a/src/kernel/screen.cpp +++ /dev/null @@ -1,70 +0,0 @@ -#include "screen.h" - -template -static int popcount(T x) -{ - int c = 0; - while (x) { - c += (x & 1); - x = x >> 1; - } - return c; -} - -template -static int ctz(T x) -{ - int c = 0; - while ((x & 1) == 0) { - x = x >> 1; - ++c; - } - return c; -} - -screen::color_masks::color_masks(pixel_t r, pixel_t g, pixel_t b) : - r(r), g(g), b(b) -{ - rshift = static_cast(ctz(r) - (8 - popcount(r))); - gshift = static_cast(ctz(g) - (8 - popcount(g))); - bshift = static_cast(ctz(b) - (8 - popcount(b))); -} - -screen::color_masks::color_masks(const color_masks &o) : - rshift(o.rshift), gshift(o.gshift), bshift(o.bshift), - r(o.r), g(o.g), b(o.b) -{ -} - -screen::screen( - void *framebuffer, - unsigned hres, unsigned vres, - pixel_t rmask, pixel_t gmask, pixel_t bmask) : - m_framebuffer(static_cast(framebuffer)), - m_masks(rmask, gmask, bmask), - m_resolution(hres, vres) -{ -} - -screen::pixel_t -screen::color(uint8_t r, uint8_t g, uint8_t b) const -{ - return - ((static_cast(r) << m_masks.rshift) & m_masks.r) | - ((static_cast(g) << m_masks.gshift) & m_masks.g) | - ((static_cast(b) << m_masks.bshift) & m_masks.b); -} - -void -screen::fill(pixel_t color) -{ - const size_t len = m_resolution.size(); - for (size_t i = 0; i < len; ++i) - m_framebuffer[i] = color; -} - -void -screen::draw_pixel(unsigned x, unsigned y, pixel_t color) -{ - m_framebuffer[x + y * m_resolution.x] = color; -} diff --git a/src/kernel/screen.h b/src/kernel/screen.h deleted file mode 100644 index ac018bb..0000000 --- a/src/kernel/screen.h +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once -#include -#include - -#include "kutil/coord.h" - -class screen -{ -public: - using pixel_t = uint32_t; - - screen( - void *framebuffer, - unsigned hres, unsigned vres, - pixel_t rmask, pixel_t gmask, pixel_t bmask); - - unsigned width() const { return m_resolution.x; } - unsigned height() const { return m_resolution.y; } - - pixel_t color(uint8_t r, uint8_t g, uint8_t b) const; - - void fill(pixel_t color); - void draw_pixel(unsigned x, unsigned y, pixel_t color); - -private: - struct color_masks { - uint8_t rshift, gshift, bshift; - pixel_t r, g, b; - color_masks(pixel_t r, pixel_t g, pixel_t b); - color_masks(const color_masks &other); - }; - - pixel_t *m_framebuffer; - color_masks m_masks; - kutil::coord m_resolution; - - screen() = delete; -};