From bc71bbf9efde2eb7c4dce75e8473c47848239866 Mon Sep 17 00:00:00 2001 From: Mike Beaton Date: Wed, 17 May 2023 10:37:30 +0100 Subject: [PATCH] OcConsoleLib: Add font pages - Add back original ISO Latin font page 1 - Add unicode box drawing and block element characters --- Application/FontTester/FontTester.c | 167 +++++++ Application/FontTester/FontTester.inf | 40 ++ Changelog.md | 1 + Docs/Configuration.tex | 2 + Library/OcConsoleLib/TextOutputBuiltin.c | 547 ++++++++++++++++++++++- OpenCorePkg.dsc | 1 + build_oc.tool | 1 + 7 files changed, 737 insertions(+), 22 deletions(-) create mode 100644 Application/FontTester/FontTester.c create mode 100644 Application/FontTester/FontTester.inf diff --git a/Application/FontTester/FontTester.c b/Application/FontTester/FontTester.c new file mode 100644 index 00000000..92dbbf8c --- /dev/null +++ b/Application/FontTester/FontTester.c @@ -0,0 +1,167 @@ +/** @file + Test implemented font pages. + + Copyright (c) 2023, Mike Beaton. All rights reserved.
+ SPDX-License-Identifier: BSD-3-Clause +**/ + +#include +#include +#include +#include +#include + +#define APP_TITLE L" <<>> " + +#define NROWS (8) +#define NCOLUMNS (16) +#define GAP (8) + +STATIC +VOID +PauseSeconds ( + UINTN Seconds + ) +{ + UINTN Index; + + // + // Note: Ensure that stall value is within UINT32 in nanoseconds (required on some broken firmware). + // + for (Index = 0; Index < Seconds; ++Index) { + gBS->Stall (SECONDS_TO_MICROSECONDS (1)); + } +} + +STATIC +VOID +PrintFontPage ( + UINT8 PageNumber, + UINTN CursorColumn, + UINTN CursorRow + ) +{ + CHAR16 Char; + CHAR16 String[(NCOLUMNS * 2) + 1]; + UINTN Row; + UINTN Column; + + gST->ConOut->SetAttribute (gST->ConOut, EFI_BACKGROUND_CYAN | EFI_DARKGRAY); + gST->ConOut->SetCursorPosition (gST->ConOut, CursorColumn, CursorRow); + Print (L"Page %u:", PageNumber); + gST->ConOut->SetAttribute (gST->ConOut, EFI_BACKGROUND_BLACK | EFI_LIGHTGRAY); + + for (Column = 0; Column < NCOLUMNS; Column++) { + String[Column * 2] = L' '; + } + + String[NCOLUMNS * 2] = CHAR_NULL; + Char = PageNumber << 7; + + for (Row = 0; Row < NROWS; Row++) { + for (Column = 0; Column < NCOLUMNS; Column++) { + if (Char < 32) { + String[(Column * 2) + 1] = L'_'; + } else { + String[(Column * 2) + 1] = Char; + } + + ++Char; + } + + gST->ConOut->SetCursorPosition (gST->ConOut, CursorColumn, CursorRow + Row + 2); + gST->ConOut->OutputString (gST->ConOut, String); + } +} + +UINTN +CentrePos ( + UINTN Width + ) +{ + EFI_STATUS Status; + UINTN Columns; + UINTN Rows; + + Status = gST->ConOut->QueryMode ( + gST->ConOut, + gST->ConOut->Mode->Mode, + &Columns, + &Rows + ); + + if (EFI_ERROR (Status) || (Columns < Width)) { + return 0; + } + + // + // Note: Subtract then divide can be different by one, and is less well centred. + // + return (Columns / 2) - (Width / 2); +} + +VOID +Centre ( + CHAR16 *String + ) +{ + gST->ConOut->SetCursorPosition ( + gST->ConOut, + CentrePos (StrLen (String)), + gST->ConOut->Mode->CursorRow + ); + + gST->ConOut->OutputString ( + gST->ConOut, + String + ); +} + +EFI_STATUS +EFIAPI +UefiMain ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + UINTN Pos0; + UINTN Pos1; + INT32 OriginalAttribute; + BOOLEAN OriginalCursorVisible; + + OriginalAttribute = gST->ConOut->Mode->Attribute; + OriginalCursorVisible = gST->ConOut->Mode->CursorVisible; + + gST->ConOut->EnableCursor (gST->ConOut, FALSE); + + gST->ConOut->SetAttribute (gST->ConOut, EFI_BACKGROUND_BLACK | EFI_LIGHTGRAY); + gST->ConOut->ClearScreen (gST->ConOut); + + Print (L"\r\n"); + gST->ConOut->SetAttribute (gST->ConOut, EFI_BACKGROUND_BROWN | EFI_CYAN); + Centre (APP_TITLE); + + Pos0 = CentrePos (NCOLUMNS * 4 + GAP); + Pos1 = Pos0 + NCOLUMNS * 2 + GAP; + + PrintFontPage (0, Pos0, 3); + PrintFontPage (1, Pos1, 3); + PrintFontPage (74, Pos0, 14); + PrintFontPage (75, Pos1, 14); + + // + // Give time for screenshot. + // + PauseSeconds (2); + + Print (L"\r\n\r\n\r\n"); + gST->ConOut->SetAttribute (gST->ConOut, EFI_BACKGROUND_RED | EFI_WHITE); + Centre (L"Press any key..."); + WaitForKeyPress (L""); + Centre (L"Done.\r\n"); + + gST->ConOut->SetAttribute (gST->ConOut, OriginalAttribute); + gST->ConOut->EnableCursor (gST->ConOut, OriginalCursorVisible); + + return EFI_SUCCESS; +} diff --git a/Application/FontTester/FontTester.inf b/Application/FontTester/FontTester.inf new file mode 100644 index 00000000..f2982b13 --- /dev/null +++ b/Application/FontTester/FontTester.inf @@ -0,0 +1,40 @@ +## @file +# Test implemented font pages. +# +# Copyright (C) 2023, Mike Beaton. All rights reserved.
+# SPDX-License-Identifier: BSD-3-Clause +## + + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = FontTester + FILE_GUID = 17B6BF62-9513-4FAB-88A0-B8936D59C152 + MODULE_TYPE = UEFI_APPLICATION + VERSION_STRING = 1.0 + ENTRY_POINT = UefiMain + +# +# This flag specifies whether HII resource section is generated into PE image. +# + UEFI_HII_RESOURCE_SECTION = TRUE + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 IPF EBC +# + +[Sources] + FontTester.c + +[Packages] + MdePkg/MdePkg.dec + OpenCorePkg/OpenCorePkg.dec + +[LibraryClasses] + OcConsoleControlEntryModeGenericLib + OcMiscLib + UefiApplicationEntryPoint + UefiBootServicesTableLib + UefiLib diff --git a/Changelog.md b/Changelog.md index 7f05a675..30b86447 100644 --- a/Changelog.md +++ b/Changelog.md @@ -4,6 +4,7 @@ OpenCore Changelog - Added `--force-codec` option to AudioDxe, thx @xCuri0 - Downgraded additional warning message in normal operation of emulated NVRAM to info - Disabled not present DVL0 device in SSDT-SBUS-MCHC by default, thx @stevezhengshiqi +- Added Unicode font pages for some accented characters, plus box drawing and block elements, to `Builtin` text renderer #### v0.9.2 - Added `DisableIoMapperMapping` quirk, thx @CaseySJ diff --git a/Docs/Configuration.tex b/Docs/Configuration.tex index 7b117810..c2cede60 100755 --- a/Docs/Configuration.tex +++ b/Docs/Configuration.tex @@ -6526,6 +6526,8 @@ Some of the known tools are listed below (builtin tools are marked with \textbf{ & Reset NVRAM alternative bundled as a standalone tool. \\ \href{https://github.com/acidanthera/OpenCorePkg}{\texttt{CsrUtil}}\textbf{*} & Simple implementation of SIP-related features of Apple \texttt{csrutil}. \\ +\href{https://github.com/acidanthera/OpenCorePkg}{\texttt{FontTester}}\textbf{*} +& Render the console font pages which the \texttt{Builtin} renderer provides. \\ \href{https://github.com/acidanthera/OpenCorePkg}{\texttt{GopStop}}\textbf{*} & Test GraphicsOutput protocol with a \href{https://github.com/acidanthera/OpenCorePkg/tree/master/Application/GopStop}{simple scenario}. \\ diff --git a/Library/OcConsoleLib/TextOutputBuiltin.c b/Library/OcConsoleLib/TextOutputBuiltin.c index dee7f0b9..79e48293 100644 --- a/Library/OcConsoleLib/TextOutputBuiltin.c +++ b/Library/OcConsoleLib/TextOutputBuiltin.c @@ -36,12 +36,15 @@ * This font may be freely used for any purpose. */ -#define ISO_CHAR_MIN 0x21 -#define ISO_CHAR_MAX 0x7E -#define ISO_CHAR_WIDTH 8 -#define ISO_CHAR_HEIGHT 16 +#define ISO_CHAR_WIDTH (8) +#define ISO_CHAR_HEIGHT (16) -STATIC UINT8 mIsoFontData[(ISO_CHAR_MAX - ISO_CHAR_MIN + 1)*(ISO_CHAR_HEIGHT - 2)] = { +#define PAGE0_CHAR_MIN (33) +#define PAGE0_CHAR_MAX (127) ///< Use one over +#define PAGE0_FONT_HEAD (1) +#define PAGE0_FONT_TAIL (1) + +STATIC UINT8 mIsoFontDataPage0[(PAGE0_CHAR_MAX - PAGE0_CHAR_MIN) * (ISO_CHAR_HEIGHT - PAGE0_FONT_HEAD - PAGE0_FONT_TAIL)] = { /* 33 */ 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, /* 34 */ 0x00, 0x6c, 0x6c, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 35 */ 0x00, 0x00, 0x36, 0x36, 0x7f, 0x36, 0x36, 0x7f, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, @@ -138,6 +141,433 @@ STATIC UINT8 mIsoFontData[(ISO_CHAR_MAX - ISO_CHAR_MIN + 1)*(ISO_CHAR_HEIGHT - /* 126 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; +/* + * Second page of ISO Latin-1 font. + */ +#define PAGE1_CHAR_MIN (161 - 0x80) +#define PAGE1_CHAR_MAX (256 - 0x80) +#define PAGE1_FONT_HEAD (0) +#define PAGE1_FONT_TAIL (1) + +STATIC UINT8 mIsoFontDataPage1[(PAGE1_CHAR_MAX - PAGE1_CHAR_MIN) * (ISO_CHAR_HEIGHT - PAGE1_FONT_HEAD - PAGE1_FONT_TAIL)] = { + /* 161 */ 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, + /* 162 */ 0x00, 0x00, 0x00, 0x08, 0x08, 0x3e, 0x6b, 0x0b, 0x0b, 0x0b, 0x6b, 0x3e, 0x08, 0x08, 0x00, + /* 163 */ 0x00, 0x00, 0x1c, 0x36, 0x06, 0x06, 0x1f, 0x06, 0x06, 0x07, 0x6f, 0x3b, 0x00, 0x00, 0x00, + /* 164 */ 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0x66, 0x66, 0x66, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, + /* 165 */ 0x00, 0x00, 0xc3, 0xc3, 0x66, 0x66, 0x3c, 0x7e, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, + /* 166 */ 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, + /* 167 */ 0x00, 0x3c, 0x66, 0x0c, 0x1e, 0x33, 0x63, 0x66, 0x3c, 0x18, 0x33, 0x1e, 0x00, 0x00, 0x00, + /* 168 */ 0x00, 0x00, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 169 */ 0x00, 0x00, 0x3c, 0x42, 0x99, 0xa5, 0x85, 0xa5, 0x99, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, + /* 170 */ 0x00, 0x1e, 0x30, 0x3e, 0x33, 0x3b, 0x36, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 171 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x36, 0x1b, 0x1b, 0x36, 0x6c, 0x00, 0x00, 0x00, 0x00, + /* 172 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 173 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 174 */ 0x00, 0x00, 0x3c, 0x42, 0x9d, 0xa5, 0x9d, 0xa5, 0xa5, 0x42, 0x3c, 0x00, 0x00, 0x00, 0x00, + /* 175 */ 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 176 */ 0x00, 0x00, 0x1c, 0x36, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 177 */ 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, + /* 178 */ 0x00, 0x1e, 0x33, 0x18, 0x0c, 0x06, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 179 */ 0x00, 0x1e, 0x33, 0x18, 0x30, 0x33, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 180 */ 0x00, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 181 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x76, 0x6e, 0x06, 0x06, 0x03, + /* 182 */ 0x00, 0x00, 0x7e, 0x2f, 0x2f, 0x2f, 0x2e, 0x28, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, + /* 183 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 184 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x1e, + /* 185 */ 0x00, 0x0c, 0x0e, 0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 186 */ 0x00, 0x1e, 0x33, 0x33, 0x33, 0x33, 0x1e, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 187 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x36, 0x6c, 0x6c, 0x36, 0x1b, 0x00, 0x00, 0x00, 0x00, + /* 188 */ 0x00, 0x10, 0x1c, 0x18, 0x18, 0x18, 0x00, 0x7f, 0x00, 0x18, 0x1c, 0x1a, 0x3e, 0x18, 0x00, + /* 189 */ 0x00, 0x10, 0x1c, 0x18, 0x18, 0x18, 0x00, 0x7f, 0x00, 0x1c, 0x36, 0x18, 0x0c, 0x3e, 0x00, + /* 190 */ 0x00, 0x1c, 0x36, 0x18, 0x36, 0x1c, 0x00, 0x7f, 0x00, 0x18, 0x1c, 0x1a, 0x3e, 0x18, 0x00, + /* 191 */ 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x0c, 0x0c, 0x06, 0x06, 0x03, 0x63, 0x3e, 0x00, + /* 192 */ 0x0c, 0x18, 0x3e, 0x63, 0x63, 0x63, 0x7f, 0x63, 0x63, 0x63, 0x63, 0x63, 0x00, 0x00, 0x00, + /* 193 */ 0x18, 0x0c, 0x3e, 0x63, 0x63, 0x63, 0x7f, 0x63, 0x63, 0x63, 0x63, 0x63, 0x00, 0x00, 0x00, + /* 194 */ 0x08, 0x14, 0x3e, 0x63, 0x63, 0x63, 0x7f, 0x63, 0x63, 0x63, 0x63, 0x63, 0x00, 0x00, 0x00, + /* 195 */ 0x6e, 0x3b, 0x3e, 0x63, 0x63, 0x63, 0x7f, 0x63, 0x63, 0x63, 0x63, 0x63, 0x00, 0x00, 0x00, + /* 196 */ 0x36, 0x00, 0x3e, 0x63, 0x63, 0x63, 0x7f, 0x63, 0x63, 0x63, 0x63, 0x63, 0x00, 0x00, 0x00, + /* 197 */ 0x1c, 0x36, 0x3e, 0x63, 0x63, 0x63, 0x7f, 0x63, 0x63, 0x63, 0x63, 0x63, 0x00, 0x00, 0x00, + /* 198 */ 0x00, 0x00, 0xfe, 0x33, 0x33, 0x33, 0xff, 0x33, 0x33, 0x33, 0x33, 0xf3, 0x00, 0x00, 0x00, + /* 199 */ 0x00, 0x00, 0x3c, 0x66, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x66, 0x3c, 0x18, 0x30, 0x1e, + /* 200 */ 0x0c, 0x18, 0x7f, 0x03, 0x03, 0x03, 0x3f, 0x03, 0x03, 0x03, 0x03, 0x7f, 0x00, 0x00, 0x00, + /* 201 */ 0x18, 0x0c, 0x7f, 0x03, 0x03, 0x03, 0x3f, 0x03, 0x03, 0x03, 0x03, 0x7f, 0x00, 0x00, 0x00, + /* 202 */ 0x08, 0x14, 0x7f, 0x03, 0x03, 0x03, 0x3f, 0x03, 0x03, 0x03, 0x03, 0x7f, 0x00, 0x00, 0x00, + /* 203 */ 0x36, 0x00, 0x7f, 0x03, 0x03, 0x03, 0x3f, 0x03, 0x03, 0x03, 0x03, 0x7f, 0x00, 0x00, 0x00, + /* 204 */ 0x0c, 0x18, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, + /* 205 */ 0x30, 0x18, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, + /* 206 */ 0x18, 0x24, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, + /* 207 */ 0x66, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, + /* 208 */ 0x00, 0x00, 0x1e, 0x36, 0x66, 0x66, 0x6f, 0x66, 0x66, 0x66, 0x36, 0x1e, 0x00, 0x00, 0x00, + /* 209 */ 0x6e, 0x3b, 0x63, 0x63, 0x67, 0x6f, 0x6f, 0x7b, 0x7b, 0x73, 0x63, 0x63, 0x00, 0x00, 0x00, + /* 210 */ 0x06, 0x0c, 0x3e, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x3e, 0x00, 0x00, 0x00, + /* 211 */ 0x30, 0x18, 0x3e, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x3e, 0x00, 0x00, 0x00, + /* 212 */ 0x08, 0x14, 0x3e, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x3e, 0x00, 0x00, 0x00, + /* 213 */ 0x6e, 0x3b, 0x3e, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x3e, 0x00, 0x00, 0x00, + /* 214 */ 0x36, 0x00, 0x3e, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x3e, 0x00, 0x00, 0x00, + /* 215 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 216 */ 0x00, 0x20, 0x3e, 0x73, 0x73, 0x6b, 0x6b, 0x6b, 0x6b, 0x67, 0x67, 0x3e, 0x02, 0x00, 0x00, + /* 217 */ 0x0c, 0x18, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x3e, 0x00, 0x00, 0x00, + /* 218 */ 0x18, 0x0c, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x3e, 0x00, 0x00, 0x00, + /* 219 */ 0x08, 0x14, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x3e, 0x00, 0x00, 0x00, + /* 220 */ 0x36, 0x00, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x63, 0x3e, 0x00, 0x00, 0x00, + /* 221 */ 0x30, 0x18, 0xc3, 0xc3, 0x66, 0x66, 0x3c, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, + /* 222 */ 0x00, 0x00, 0x0f, 0x06, 0x3e, 0x66, 0x66, 0x66, 0x66, 0x3e, 0x06, 0x0f, 0x00, 0x00, 0x00, + /* 223 */ 0x00, 0x00, 0x1e, 0x33, 0x33, 0x1b, 0x33, 0x63, 0x63, 0x63, 0x63, 0x3b, 0x00, 0x00, 0x00, + /* 224 */ 0x00, 0x0c, 0x18, 0x30, 0x00, 0x3e, 0x60, 0x7e, 0x63, 0x63, 0x73, 0x6e, 0x00, 0x00, 0x00, + /* 225 */ 0x00, 0x30, 0x18, 0x0c, 0x00, 0x3e, 0x60, 0x7e, 0x63, 0x63, 0x73, 0x6e, 0x00, 0x00, 0x00, + /* 226 */ 0x00, 0x08, 0x1c, 0x36, 0x00, 0x3e, 0x60, 0x7e, 0x63, 0x63, 0x73, 0x6e, 0x00, 0x00, 0x00, + /* 227 */ 0x00, 0x00, 0x6e, 0x3b, 0x00, 0x3e, 0x60, 0x7e, 0x63, 0x63, 0x73, 0x6e, 0x00, 0x00, 0x00, + /* 228 */ 0x00, 0x00, 0x36, 0x36, 0x00, 0x3e, 0x60, 0x7e, 0x63, 0x63, 0x73, 0x6e, 0x00, 0x00, 0x00, + /* 229 */ 0x00, 0x1c, 0x36, 0x1c, 0x00, 0x3e, 0x60, 0x7e, 0x63, 0x63, 0x73, 0x6e, 0x00, 0x00, 0x00, + /* 230 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0xdb, 0xd8, 0xfe, 0x1b, 0xdb, 0x76, 0x00, 0x00, 0x00, + /* 231 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x63, 0x03, 0x03, 0x03, 0x63, 0x3e, 0x18, 0x30, 0x1e, + /* 232 */ 0x00, 0x0c, 0x18, 0x30, 0x00, 0x3e, 0x63, 0x63, 0x7f, 0x03, 0x63, 0x3e, 0x00, 0x00, 0x00, + /* 233 */ 0x00, 0x30, 0x18, 0x0c, 0x00, 0x3e, 0x63, 0x63, 0x7f, 0x03, 0x63, 0x3e, 0x00, 0x00, 0x00, + /* 234 */ 0x00, 0x08, 0x1c, 0x36, 0x00, 0x3e, 0x63, 0x63, 0x7f, 0x03, 0x63, 0x3e, 0x00, 0x00, 0x00, + /* 235 */ 0x00, 0x00, 0x36, 0x36, 0x00, 0x3e, 0x63, 0x63, 0x7f, 0x03, 0x63, 0x3e, 0x00, 0x00, 0x00, + /* 236 */ 0x00, 0x06, 0x0c, 0x18, 0x00, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x38, 0x00, 0x00, 0x00, + /* 237 */ 0x00, 0x18, 0x0c, 0x06, 0x00, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x38, 0x00, 0x00, 0x00, + /* 238 */ 0x00, 0x08, 0x1c, 0x36, 0x00, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x38, 0x00, 0x00, 0x00, + /* 239 */ 0x00, 0x00, 0x36, 0x36, 0x00, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x38, 0x00, 0x00, 0x00, + /* 240 */ 0x00, 0x00, 0x2c, 0x18, 0x34, 0x60, 0x7c, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, + /* 241 */ 0x00, 0x00, 0x6e, 0x3b, 0x00, 0x3b, 0x67, 0x63, 0x63, 0x63, 0x63, 0x63, 0x00, 0x00, 0x00, + /* 242 */ 0x00, 0x06, 0x0c, 0x18, 0x00, 0x3e, 0x63, 0x63, 0x63, 0x63, 0x63, 0x3e, 0x00, 0x00, 0x00, + /* 243 */ 0x00, 0x30, 0x18, 0x0c, 0x00, 0x3e, 0x63, 0x63, 0x63, 0x63, 0x63, 0x3e, 0x00, 0x00, 0x00, + /* 244 */ 0x00, 0x08, 0x1c, 0x36, 0x00, 0x3e, 0x63, 0x63, 0x63, 0x63, 0x63, 0x3e, 0x00, 0x00, 0x00, + /* 245 */ 0x00, 0x00, 0x6e, 0x3b, 0x00, 0x3e, 0x63, 0x63, 0x63, 0x63, 0x63, 0x3e, 0x00, 0x00, 0x00, + /* 246 */ 0x00, 0x00, 0x36, 0x36, 0x00, 0x3e, 0x63, 0x63, 0x63, 0x63, 0x63, 0x3e, 0x00, 0x00, 0x00, + /* 247 */ 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + /* 248 */ 0x00, 0x00, 0x00, 0x00, 0x20, 0x3e, 0x73, 0x6b, 0x6b, 0x6b, 0x67, 0x3e, 0x02, 0x00, 0x00, + /* 249 */ 0x00, 0x06, 0x0c, 0x18, 0x00, 0x63, 0x63, 0x63, 0x63, 0x63, 0x73, 0x6e, 0x00, 0x00, 0x00, + /* 250 */ 0x00, 0x30, 0x18, 0x0c, 0x00, 0x63, 0x63, 0x63, 0x63, 0x63, 0x73, 0x6e, 0x00, 0x00, 0x00, + /* 251 */ 0x00, 0x08, 0x1c, 0x36, 0x00, 0x63, 0x63, 0x63, 0x63, 0x63, 0x73, 0x6e, 0x00, 0x00, 0x00, + /* 252 */ 0x00, 0x00, 0x36, 0x36, 0x00, 0x63, 0x63, 0x63, 0x63, 0x63, 0x73, 0x6e, 0x00, 0x00, 0x00, + /* 253 */ 0x00, 0x30, 0x18, 0x0c, 0x00, 0x63, 0x63, 0x36, 0x36, 0x1c, 0x1c, 0x0c, 0x0c, 0x06, 0x03, + /* 254 */ 0x00, 0x00, 0x0f, 0x06, 0x06, 0x3e, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3e, 0x06, 0x06, 0x0f, + /* 255 */ 0x00, 0x00, 0x36, 0x36, 0x00, 0x63, 0x63, 0x36, 0x36, 0x1c, 0x1c, 0x0c, 0x0c, 0x06, 0x03 +}; + +/* + * Unicode box drawing and block element characters (used e.g. by memtest86). + * Unicode font pages derived from https://github.com/farsil/ibmfonts + * SPDX-License-Identifier: CC-BY-SA-4.0 + * (Exported as hex using `gbdfed` from ib8x16u.bdf, sparse info generated with `head`, `tail`, `nl` and additional hand editing.) + */ +#define ADDITIONAL_FONT_PAGE_MIN (74) +#define ADDITIONAL_FONT_PAGE_MAX (76) + +#define PAGE74_CHAR_MIN (0x00) +#define PAGE74_CHAR_MAX (0x6D) +#define PAGE74_SPARSE_CHAR_COUNT (40) + +STATIC UINT8 mGlyphsPage74[PAGE74_SPARSE_CHAR_COUNT * ISO_CHAR_HEIGHT] = { + /* 0x2500 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 0x2502 */ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + /* 0x250C */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + /* 0x2510 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + /* 0x2514 */ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 0x2518 */ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 0x251C */ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1F, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + /* 0x2524 */ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xF8, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + /* 0x252C */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + /* 0x2534 */ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 0x253C */ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + /* 0x2550 */ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 0x2551 */ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + /* 0x2552 */ 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x18, 0x18, 0x1F, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + /* 0x2553 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + /* 0x2554 */ 0x00, 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x30, 0x30, 0x37, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + /* 0x2555 */ 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, 0x18, 0x18, 0xF8, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + /* 0x2556 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + /* 0x2557 */ 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x06, 0x06, 0xF6, 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + /* 0x2558 */ 0x18, 0x18, 0x18, 0x18, 0x1F, 0x1F, 0x18, 0x18, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 0x2559 */ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 0x255A */ 0x36, 0x36, 0x36, 0x36, 0x37, 0x37, 0x30, 0x30, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 0x255B */ 0x18, 0x18, 0x18, 0x18, 0xF8, 0xF8, 0x18, 0x18, 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 0x255C */ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 0x255D */ 0x36, 0x36, 0x36, 0x36, 0xF6, 0xF6, 0x06, 0x06, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 0x255E */ 0x18, 0x18, 0x18, 0x18, 0x1F, 0x1F, 0x18, 0x18, 0x1F, 0x1F, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + /* 0x255F */ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + /* 0x2560 */ 0x36, 0x36, 0x36, 0x36, 0x37, 0x37, 0x30, 0x30, 0x37, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + /* 0x2561 */ 0x18, 0x18, 0x18, 0x18, 0xF8, 0xF8, 0x18, 0x18, 0xF8, 0xF8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + /* 0x2562 */ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xF6, 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + /* 0x2563 */ 0x36, 0x36, 0x36, 0x36, 0xF6, 0xF6, 0x06, 0x06, 0xF6, 0xF6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + /* 0x2564 */ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + /* 0x2565 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + /* 0x2566 */ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xF7, 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + /* 0x2567 */ 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 0x2568 */ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 0x2569 */ 0x36, 0x36, 0x36, 0x36, 0xF7, 0xF7, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 0x256A */ 0x18, 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18, 0x18, 0xFF, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + /* 0x256B */ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xFF, 0xFF, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + /* 0x256C */ 0x36, 0x36, 0x36, 0x36, 0xF7, 0xF7, 0x00, 0x00, 0xF7, 0xF7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 +}; + +STATIC UINT8 mOffsetsPage74[PAGE74_CHAR_MAX - PAGE74_CHAR_MIN] = { + 1, /* 0x2500 */ + 0, + 2, /* 0x2502 */ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, /* 0x250C */ + 0, + 0, + 0, + 4, /* 0x2510 */ + 0, + 0, + 0, + 5, /* 0x2514 */ + 0, + 0, + 0, + 6, /* 0x2518 */ + 0, + 0, + 0, + 7, /* 0x251C */ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 8, /* 0x2524 */ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 9, /* 0x252C */ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 10, /* 0x2534 */ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 11, /* 0x253C */ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 12, /* 0x2550 */ + 13, /* 0x2551 */ + 14, /* 0x2552 */ + 15, /* 0x2553 */ + 16, /* 0x2554 */ + 17, /* 0x2555 */ + 18, /* 0x2556 */ + 19, /* 0x2557 */ + 20, /* 0x2558 */ + 21, /* 0x2559 */ + 22, /* 0x255A */ + 23, /* 0x255B */ + 24, /* 0x255C */ + 25, /* 0x255D */ + 26, /* 0x255E */ + 27, /* 0x255F */ + 28, /* 0x2560 */ + 29, /* 0x2561 */ + 30, /* 0x2562 */ + 31, /* 0x2563 */ + 32, /* 0x2564 */ + 33, /* 0x2565 */ + 34, /* 0x2566 */ + 35, /* 0x2567 */ + 36, /* 0x2568 */ + 37, /* 0x2569 */ + 38, /* 0x256A */ + 39, /* 0x256B */ + 40 /* 0x256C */ +}; + +#define PAGE75_CHAR_MIN (0x00) +#define PAGE75_CHAR_MAX (0xE7) +#define PAGE75_SPARSE_CHAR_COUNT (24) + +STATIC UINT8 mGlyphsPage75[PAGE75_SPARSE_CHAR_COUNT * ISO_CHAR_HEIGHT] = { + /* 0x2580 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* 0x2581 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + /* 0x2584 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + /* 0x2588 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + /* 0x258C */ 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, + /* 0x2590 */ 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + /* 0x2591 */ 0x22, 0x22, 0x88, 0x88, 0x22, 0x22, 0x88, 0x88, 0x22, 0x22, 0x88, 0x88, 0x22, 0x22, 0x88, 0x88, + /* 0x2592 */ 0x55, 0x55, 0xAA, 0xAA, 0x55, 0x55, 0xAA, 0xAA, 0x55, 0x55, 0xAA, 0xAA, 0x55, 0x55, 0xAA, 0xAA, + /* 0x2593 */ 0xDB, 0xDB, 0x77, 0x77, 0xDB, 0xDB, 0xEE, 0xEE, 0xDB, 0xDB, 0x77, 0x77, 0xDB, 0xDB, 0xEE, 0xEE, + /* 0x25A0 */ 0x00, 0x00, 0x00, 0x00, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* 0x25A1 */ 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7C, 0x6C, 0x6C, 0x6C, 0x6C, 0x7C, 0x7C, 0x00, 0x00, 0x00, 0x00, + /* 0x25AA */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00, 0x00, 0x00, + /* 0x25AB */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7C, 0x6C, 0x6C, 0x7C, 0x7C, 0x00, 0x00, 0x00, 0x00, + /* 0x25AC */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x00, 0x00, + /* 0x25B2 */ 0x00, 0x00, 0x18, 0x18, 0x3C, 0x3C, 0x7E, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + /* 0x25BA */ 0x80, 0x80, 0xE0, 0xE0, 0xF8, 0xF8, 0xFE, 0xFE, 0xF8, 0xF8, 0xE0, 0xE0, 0x80, 0x80, 0x00, 0x00, + /* 0x25BC */ 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x7E, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + /* 0x25C4 */ 0x02, 0x02, 0x0E, 0x0E, 0x3E, 0x3E, 0xFE, 0xFE, 0x3E, 0x3E, 0x0E, 0x0E, 0x02, 0x02, 0x00, 0x00, + /* 0x25CA */ 0x10, 0x10, 0x38, 0x38, 0x6C, 0x6C, 0xC6, 0xC6, 0x6C, 0x6C, 0x38, 0x38, 0x10, 0x10, 0x00, 0x00, + /* 0x25CB */ 0x00, 0x00, 0x3C, 0x3C, 0x66, 0x66, 0x42, 0x42, 0x42, 0x42, 0x66, 0x66, 0x3C, 0x3C, 0x00, 0x00, + /* 0x25CF */ 0x00, 0x00, 0x3C, 0x3C, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x7E, 0x3C, 0x3C, 0x00, 0x00, + /* 0x25D8 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xE7, 0xC3, 0xC3, 0xC3, 0xC3, 0xE7, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, + /* 0x25D9 */ 0xFF, 0xFF, 0xC3, 0xC3, 0x99, 0x99, 0xBD, 0xBD, 0xBD, 0xBD, 0x99, 0x99, 0xC3, 0xC3, 0xFF, 0xFF, + /* 0x25E6 */ 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x6C, 0x6C, 0x6C, 0x6C, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00 +}; + +STATIC UINT8 mOffsetsPage75[PAGE75_CHAR_MAX - PAGE75_CHAR_MIN] = { + 1, /* 0x2580 */ + 2, /* 0x2581 */ + 0, + 0, + 3, /* 0x2584 */ + 0, + 0, + 0, + 4, /* 0x2588 */ + 0, + 0, + 0, + 5, /* 0x258C */ + 0, + 0, + 0, + 6, /* 0x2590 */ + 7, /* 0x2591 */ + 8, /* 0x2592 */ + 9, /* 0x2593 */ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 10, /* 0x25A0 */ + 11, /* 0x25A1 */ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 12, /* 0x25AA */ + 13, /* 0x25AB */ + 14, /* 0x25AC */ + 0, + 0, + 0, + 0, + 0, + 15, /* 0x25B2 */ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 16, /* 0x25BA */ + 0, + 17, /* 0x25BC */ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 18, /* 0x25C4 */ + 0, + 0, + 0, + 0, + 0, + 19, /* 0x25CA */ + 20, /* 0x25CB */ + 0, + 0, + 0, + 21, /* 0x25CF */ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 22, /* 0x25D8 */ + 23, /* 0x25D9 */ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 24 /* 0x25E6 */ +}; + +typedef struct { + UINT8 *Glyphs; + UINT8 *Offsets; + UINT8 Min; + UINT8 Max; + BOOLEAN LeftToRight; +} UNICODE_PAGE; + +// +// Specify { NULL, NULL, 0, 0, FALSE } for any non-populated page in range. +// +STATIC UNICODE_PAGE mUnicodePages[ADDITIONAL_FONT_PAGE_MAX - ADDITIONAL_FONT_PAGE_MIN] = { + { mGlyphsPage74, mOffsetsPage74, PAGE74_CHAR_MIN, PAGE74_CHAR_MAX, TRUE }, + { mGlyphsPage75, mOffsetsPage75, PAGE75_CHAR_MIN, PAGE75_CHAR_MAX, TRUE } +}; + STATIC UINT32 mGraphicsEfiColors[16] = { 0x00000000, // BLACK 0x00000098, // LIGHTBLUE @@ -201,47 +631,120 @@ RenderChar ( IN UINTN PosY ) { - UINT32 *DstBuffer; - UINT8 *SrcBuffer; - UINT32 Line; - UINT32 Index; - UINT32 Index2; - UINT8 Mask; + UINT32 *DstBuffer; + UINT8 *SrcBuffer; + UINT32 Line; + UINT32 Index; + UINT32 Index2; + UINT8 Mask; + UINTN PageNumber; + UINT8 PageChar; + UINT8 PageCharMin; + UNICODE_PAGE *Page; + UINTN FontHead; + UINTN FontTail; + UINT8 *CharData; + UINT8 GlyphIndex; + BOOLEAN LeftToRight; DstBuffer = &mCharacterBuffer[0].Raw; - if (((Char >= 0) && (Char < ISO_CHAR_MIN)) || (Char == ' ') || (Char == CHAR_TAB) || (Char == 0x7F)) { + // + // Page 0 and 1 data are optimised to only include non-blank chars, but all other chars in original font + // are blank and should be rendered as such. Page 0 and 1 also save space by not holding font data for + // top or bottom lines which are blank in every char in that page, in the original font. + // + if ( ((Char >= 0) && (Char < PAGE0_CHAR_MIN)) + || (Char == ' ') + || (Char == CHAR_TAB) + || ((Char >= PAGE0_CHAR_MAX) && (Char < (PAGE1_CHAR_MIN + 0x80))) + || ((Char >= (PAGE1_CHAR_MAX + 0x80)) && (Char < 0x100)) + ) + { SetMem32 (DstBuffer, TGT_CHAR_AREA * sizeof (DstBuffer[0]), mBackgroundColor.Raw); } else { - if ((Char < 0) || (Char > ISO_CHAR_MAX)) { - Char = L'_'; + PageNumber = (Char >> 7) & 0x1FF; + PageChar = Char & 0x7F; + if (PageNumber == 0) { + LeftToRight = FALSE; + FontHead = PAGE0_FONT_HEAD; + FontTail = PAGE0_FONT_TAIL; + PageCharMin = PAGE0_CHAR_MIN; + CharData = mIsoFontDataPage0; + } else if (PageNumber == 1) { + LeftToRight = FALSE; + FontHead = PAGE1_FONT_HEAD; + FontTail = PAGE1_FONT_TAIL; + PageCharMin = PAGE1_CHAR_MIN; + CharData = mIsoFontDataPage1; + } else { + GlyphIndex = 0; + + if ((PageNumber >= ADDITIONAL_FONT_PAGE_MIN) && (PageNumber < ADDITIONAL_FONT_PAGE_MAX)) { + Page = &mUnicodePages[PageNumber - ADDITIONAL_FONT_PAGE_MIN]; + if ((PageChar >= Page->Min) && (PageChar < Page->Max)) { + ASSERT (Page->Glyphs != NULL); + ASSERT (Page->Offsets != NULL); + GlyphIndex = Page->Offsets[PageChar - Page->Min]; + } + } + + // + // Render all unknown chars as standard font underscore. + // + if (GlyphIndex == 0) { + LeftToRight = FALSE; + FontHead = PAGE0_FONT_HEAD; + FontTail = PAGE0_FONT_TAIL; + PageCharMin = PAGE0_CHAR_MIN; + PageChar = L'_' & 0x7F; + CharData = mIsoFontDataPage0; + } else { + LeftToRight = Page->LeftToRight; + FontHead = 0; + FontTail = 0; + PageCharMin = 0; + PageChar = 0; + CharData = &Page->Glyphs[ISO_CHAR_HEIGHT * (GlyphIndex - 1)]; + } } - SrcBuffer = mIsoFontData + ((Char - ISO_CHAR_MIN) * (ISO_CHAR_HEIGHT - 2)); + SrcBuffer = CharData + ((PageChar - PageCharMin) * (ISO_CHAR_HEIGHT - FontHead - FontTail)); - SetMem32 (DstBuffer, TGT_CHAR_WIDTH * mFontScale * sizeof (DstBuffer[0]), mBackgroundColor.Raw); - DstBuffer += TGT_CHAR_WIDTH * mFontScale; + for (Line = 0; Line < FontHead; ++Line) { + SetMem32 (DstBuffer, TGT_CHAR_WIDTH * mFontScale * sizeof (DstBuffer[0]), mBackgroundColor.Raw); ///< Apply scale twice, for width and height. + DstBuffer += TGT_CHAR_WIDTH * mFontScale; + } - for (Line = 0; Line < ISO_CHAR_HEIGHT - 2; ++Line) { + for ( ; Line < ISO_CHAR_HEIGHT - FontTail; ++Line) { // - // Iterate, while the single bit drops to the right. + // Iterate, while the single bit scans font. // for (Index = 0; Index < mFontScale; ++Index) { - Mask = 1; + Mask = LeftToRight ? 0x80 : 1; do { for (Index2 = 0; Index2 < mFontScale; ++Index2) { *DstBuffer = (*SrcBuffer & Mask) ? mForegroundColor.Raw : mBackgroundColor.Raw; ++DstBuffer; } - Mask <<= 1U; + if (LeftToRight) { + Mask >>= 1U; + } else { + Mask <<= 1U; + } } while (Mask != 0); } ++SrcBuffer; } - SetMem32 (DstBuffer, TGT_CHAR_WIDTH * mFontScale * sizeof (DstBuffer[0]), mBackgroundColor.Raw); + for ( ; Line < ISO_CHAR_HEIGHT; ++Line) { + SetMem32 (DstBuffer, TGT_CHAR_WIDTH * mFontScale * sizeof (DstBuffer[0]), mBackgroundColor.Raw); + DstBuffer += TGT_CHAR_WIDTH * mFontScale; + } + + ASSERT (DstBuffer - &mCharacterBuffer[0].Raw == (INTN)TGT_CHAR_AREA); } mGraphicsOutput->Blt ( diff --git a/OpenCorePkg.dsc b/OpenCorePkg.dsc index ff516d57..c04680e8 100755 --- a/OpenCorePkg.dsc +++ b/OpenCorePkg.dsc @@ -201,6 +201,7 @@ OpenCorePkg/Application/ChipTune/ChipTune.inf OpenCorePkg/Application/CleanNvram/CleanNvram.inf OpenCorePkg/Application/CsrUtil/CsrUtil.inf + OpenCorePkg/Application/FontTester/FontTester.inf OpenCorePkg/Application/GopPerf/GopPerf.inf OpenCorePkg/Application/GopStop/GopStop.inf OpenCorePkg/Application/KeyTester/KeyTester.inf diff --git a/build_oc.tool b/build_oc.tool index a6aef034..057ff9be 100755 --- a/build_oc.tool +++ b/build_oc.tool @@ -161,6 +161,7 @@ package() { "ChipTune.efi" "CleanNvram.efi" "CsrUtil.efi" + "FontTester.efi" "GopStop.efi" "KeyTester.efi" "ListPartitions.efi"