Mike Beaton 0ad4a318b0 OcConsoleLib: Provide ConsoleFont option
to load custom .hex format console font file
2023-06-11 05:48:55 +01:00

166 lines
3.7 KiB
C

/** @file
Test implemented font pages.
Copyright (c) 2023, Mike Beaton. All rights reserved.<BR>
SPDX-License-Identifier: BSD-3-Clause
**/
#include <Uefi.h>
#include <Library/OcDebugLogLib.h>
#include <Library/OcMiscLib.h>
#include <Library/UefiLib.h>
#include <Library/UefiBootServicesTableLib.h>
#define APP_TITLE L" <<<Font Tester>>> "
#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[2];
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);
String[1] = CHAR_NULL;
Char = PageNumber << 7;
for (Row = 0; Row < NROWS; Row++) {
for (Column = 0; Column < NCOLUMNS; Column++) {
String[0] = (Char < 32) ? L'_' : Char;
gST->ConOut->SetCursorPosition (gST->ConOut, CursorColumn + (Column * 2) + 1, CursorRow + Row + 1);
gST->ConOut->OutputString (gST->ConOut, String);
++Char;
}
}
}
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 Column0;
UINTN Column1;
UINTN Row0;
UINTN Row1;
UINTN Row2;
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);
Column0 = CentrePos (NCOLUMNS * 4 + GAP);
Column1 = Column0 + NCOLUMNS * 2 + GAP;
Row0 = gST->ConOut->Mode->CursorRow + 2;
Row1 = Row0 + 10;
Row2 = Row1 + 10;
PrintFontPage (0, Column0, Row0);
PrintFontPage (67, Column1, Row0);
PrintFontPage (74, Column0, Row1);
PrintFontPage (75, Column1, Row1);
//
// Give time for F10 screenshot.
//
PauseSeconds (2);
gST->ConOut->SetCursorPosition (gST->ConOut, 0, Row2);
gST->ConOut->SetAttribute (gST->ConOut, EFI_BACKGROUND_RED | EFI_WHITE);
Centre (L"Press any key...");
WaitForKeyPress (L"");
Centre (L"Done.");
gST->ConOut->SetAttribute (gST->ConOut, OriginalAttribute);
gST->ConOut->EnableCursor (gST->ConOut, OriginalCursorVisible);
return EFI_SUCCESS;
}