19#include <Library/BaseLib.h>
20#include <Library/BaseMemoryLib.h>
21#include <Library/DebugLib.h>
22#include <Library/MemoryAllocationLib.h>
25#include <Library/UefiBootServicesTableLib.h>
26#include <Library/UefiRuntimeServicesTableLib.h>
28#include <Protocol/GraphicsOutput.h>
72#define TGT_CHAR_WIDTH ((UINTN)(ISO_CHAR_WIDTH) * mFontScale)
73#define TGT_CHAR_HEIGHT ((UINTN)(ISO_CHAR_HEIGHT) * mFontScale)
74#define TGT_CHAR_AREA ((TGT_CHAR_WIDTH) * (TGT_CHAR_HEIGHT))
75#define TGT_PADD_WIDTH (mConsolePaddingX)
76#define TGT_PADD_HEIGHT (mConsolePaddingY)
77#define TGT_CURSOR_X mFontScale
78#define TGT_CURSOR_Y ((TGT_CHAR_HEIGHT) - mFontScale)
79#define TGT_CURSOR_WIDTH ((TGT_CHAR_WIDTH) - mFontScale * 2)
80#define TGT_CURSOR_HEIGHT (mFontScale)
82#define MIN_SUPPORTED_CONSOLE_WIDTH (80)
83#define MIN_SUPPORTED_CONSOLE_HEIGHT (25)
104 OUT UINT8 *GlyphIndex,
105 IN BOOLEAN UseFallback
114 ASSERT (GlyphIndex != NULL);
116 PageNumber = (Char >> 7) & 0x1FF;
117 PageChar = Char & 0x7F;
121 Status = EFI_SUCCESS;
123 if ((PageNumber >= ConsoleFont->PageMin) && (PageNumber < ConsoleFont->PageMax)) {
124 PageIndex = PageNumber - ConsoleFont->PageMin + 1;
125 if (ConsoleFont->PageOffsets != NULL) {
126 PageIndex = ConsoleFont->PageOffsets[PageIndex - 1];
129 if (PageIndex != 0) {
130 *Page = &ConsoleFont->Pages[PageIndex - 1];
131 if ((PageChar >= (*Page)->CharMin) && (PageChar < (*Page)->CharMax)) {
132 ASSERT ((*Page)->Glyphs != NULL);
133 if ((*Page)->GlyphOffsets == NULL) {
134 *GlyphIndex = PageChar - (*Page)->CharMin + 1;
136 *GlyphIndex = (*Page)->GlyphOffsets[PageChar - (*Page)->CharMin];
142 if (*GlyphIndex == 0) {
146 ASSERT (Status == EFI_SUCCESS);
147 if (!UseFallback || (Status != EFI_SUCCESS)) {
148 return EFI_LOAD_ERROR;
151 Status = EFI_WARN_UNKNOWN_GLYPH;
166 }
while (*GlyphIndex == 0);
183 return !EFI_ERROR (Status);
218 if (EFI_ERROR (Status)) {
228 for (Line = 0; Line < FontHead; ++Line) {
240 for (Index = 0; Index <
mFontScale; ++Index) {
241 Mask = LeftToRight ? 0x80 : 1;
243 for (Index2 = 0; Index2 <
mFontScale; ++Index2) {
296 EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION Colour;
315 EfiBltVideoToBltBuffer,
325 if (EFI_ERROR (Status)) {
391 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This
394 EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;
406 return EFI_LOAD_ERROR;
419 return EFI_OUT_OF_RESOURCES;
458 This->Mode->CursorColumn = This->Mode->CursorRow = 0;
472 Info->HorizontalResolution,
473 Info->VerticalResolution,
485 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
486 IN BOOLEAN ExtendedVerification,
493 OldTpl =
gBS->RaiseTPL (TPL_NOTIFY);
496 gST->ConsoleOutHandle,
501 if (EFI_ERROR (Status)) {
502 gBS->RestoreTPL (OldTpl);
504 DEBUG ((DEBUG_INFO,
"OCC: ASCII Text Reset [HandleProtocolFallback] - %r\n", Status));
508 return EFI_DEVICE_ERROR;
511 This->Mode->MaxMode = 1;
517 gBS->RestoreTPL (OldTpl);
518 if (EFI_ERROR (Status)) {
520 DEBUG ((DEBUG_INFO,
"OCC: ASCII Text Reset [RenderResync] - %r\n", Status));
524 return EFI_DEVICE_ERROR;
534 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
535 IN BOOLEAN ExtendedVerification
548 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
560 return EFI_UNSUPPORTED;
563 OldTpl =
gBS->RaiseTPL (TPL_NOTIFY);
570 if (EFI_ERROR (Status)) {
571 gBS->RestoreTPL (OldTpl);
572 return EFI_DEVICE_ERROR;
582 FlushCursor (This->Mode->CursorVisible, This->Mode->CursorColumn, This->Mode->CursorRow);
584 for (Index = 0; String[Index] !=
'\0'; ++Index) {
588 if (String[Index] == CHAR_CARRIAGE_RETURN) {
589 This->Mode->CursorColumn = 0;
593 if (String[Index] == CHAR_BACKSPACE) {
594 if ((This->Mode->CursorColumn == 0) && (This->Mode->CursorRow > 0)) {
595 This->Mode->CursorRow--;
597 RenderChar (
' ', This->Mode->CursorColumn, This->Mode->CursorRow);
598 }
else if (This->Mode->CursorColumn > 0) {
599 This->Mode->CursorColumn--;
600 RenderChar (
' ', This->Mode->CursorColumn, This->Mode->CursorRow);
610 if (String[Index] == CHAR_LINEFEED) {
612 ++This->Mode->CursorRow;
624 RenderChar (String[Index] == CHAR_TAB ? L
' ' : String[Index], This->Mode->CursorColumn, This->Mode->CursorRow);
630 ++This->Mode->CursorColumn;
636 This->Mode->CursorColumn = 0;
637 ++This->Mode->CursorRow;
644 This->Mode->CursorColumn = 0;
648 FlushCursor (This->Mode->CursorVisible, This->Mode->CursorColumn, This->Mode->CursorRow);
653 gBS->RestoreTPL (OldTpl);
662 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
677 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
686 OldTpl =
gBS->RaiseTPL (TPL_NOTIFY);
690 if (EFI_ERROR (Status)) {
691 gBS->RestoreTPL (OldTpl);
692 return EFI_DEVICE_ERROR;
696 if (ModeNumber == 0) {
699 Status = EFI_SUCCESS;
701 Status = EFI_UNSUPPORTED;
704 gBS->RestoreTPL (OldTpl);
713 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
720 if (ModeNumber != 0) {
721 return EFI_UNSUPPORTED;
725 OldTpl =
gBS->RaiseTPL (TPL_NOTIFY);
727 gBS->RestoreTPL (OldTpl);
728 if (EFI_ERROR (Status)) {
729 return EFI_DEVICE_ERROR;
740 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
749 if ((Attribute & ~0x7FU) != 0) {
750 return EFI_UNSUPPORTED;
753 OldTpl =
gBS->RaiseTPL (TPL_NOTIFY);
757 if (EFI_ERROR (Status)) {
758 gBS->RestoreTPL (OldTpl);
759 return EFI_DEVICE_ERROR;
763 if (Attribute != (UINTN)This->Mode->Attribute) {
766 FgColor = BitFieldRead32 ((UINT32)Attribute, 0, 3);
767 BgColor = BitFieldRead32 ((UINT32)Attribute, 4, 6);
778 This->Mode->Attribute = (UINT32)Attribute;
783 gBS->RestoreTPL (OldTpl);
796 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This
808 return EFI_UNSUPPORTED;
811 OldTpl =
gBS->RaiseTPL (TPL_NOTIFY);
819 if (EFI_ERROR (Status)) {
820 gBS->RestoreTPL (OldTpl);
821 return EFI_DEVICE_ERROR;
874 This->Mode->CursorColumn = This->Mode->CursorRow = 0;
885 gBS->RestoreTPL (OldTpl);
893 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
901 OldTpl =
gBS->RaiseTPL (TPL_NOTIFY);
905 if (EFI_ERROR (Status)) {
906 gBS->RestoreTPL (OldTpl);
907 return EFI_DEVICE_ERROR;
934 Status = EFI_SUCCESS;
936 Status = EFI_UNSUPPORTED;
939 gBS->RestoreTPL (OldTpl);
947 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
954 OldTpl =
gBS->RaiseTPL (TPL_NOTIFY);
958 if (EFI_ERROR (Status)) {
959 gBS->RestoreTPL (OldTpl);
960 return EFI_DEVICE_ERROR;
965 This->Mode->CursorVisible = Visible;
967 gBS->RestoreTPL (OldTpl);
972EFI_SIMPLE_TEXT_OUTPUT_MODE
976EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
996 OUT BOOLEAN *GopUgaExists OPTIONAL,
997 OUT BOOLEAN *StdInLocked OPTIONAL
1002 if (GopUgaExists != NULL) {
1003 *GopUgaExists = TRUE;
1006 if (StdInLocked != NULL) {
1007 *StdInLocked = FALSE;
1030 gST->ConOut->ClearScreen (
gST->ConOut);
1045 return EFI_DEVICE_ERROR;
1060 IN CONST CHAR8 *Font OPTIONAL,
1070 Status = EFI_NOT_FOUND;
1071 if ((Storage != NULL) && (Font != NULL) && (*Font !=
'\0')) {
1074 EFI_ERROR (Status) ? DEBUG_WARN : DEBUG_INFO,
1075 "OCC: Loading hex font %a - %r\n",
1081 if (EFI_ERROR (Status)) {
1088 Status =
gRT->GetVariable (
1096 if (EFI_ERROR (Status) || (
mUIScale != 2)) {
1102 DEBUG ((DEBUG_INFO,
"OCC: Using builtin text renderer with %d scale\n",
mUIScale));
1109 if (!EFI_ERROR (Status)) {
1111 if (EFI_ERROR (Status)) {
1117 gBS->CalculateCrc32 (
1119 gST->Hdr.HeaderSize,
1125 DEBUG ((DEBUG_INFO,
"OCC: Setup ASCII Output - %r\n", Status));
#define ARRAY_SIZE(Array)
EFI_GUID gAppleVendorVariableGuid
#define APPLE_UI_SCALE_VARIABLE_NAME
EFI_STATUS OcConsoleControlInstallProtocol(IN EFI_CONSOLE_CONTROL_PROTOCOL *NewProtocol, OUT EFI_CONSOLE_CONTROL_PROTOCOL *OldProtocol OPTIONAL, IN OUT EFI_CONSOLE_CONTROL_SCREEN_MODE *OldMode OPTIONAL)
EFI_STATUS OcConsoleControlRestoreProtocol(IN EFI_CONSOLE_CONTROL_PROTOCOL *OldProtocol)
EFI_CONSOLE_CONTROL_SCREEN_MODE
@ EfiConsoleControlScreenText
EFI_STATUS OcLoadConsoleFont(IN OC_STORAGE_CONTEXT *Storage, IN CONST CHAR8 *FontName, OUT OC_CONSOLE_FONT **Font)
STATIC_ASSERT(BYTES_PER_PIXEL==sizeof(UINT32), "Non 4-byte pixels are unsupported!")
EFI_CONSOLE_CONTROL_SCREEN_MODE OcConsoleControlSetMode(IN EFI_CONSOLE_CONTROL_SCREEN_MODE Mode)
#define OC_CONSOLE_FONT_FALLBACK_CHAR
OC_CONSOLE_FONT gDefaultConsoleFont
#define OC_CONSOLE_MARK_UNCONTROLLED
#define ISO_FONT_MAX_PAGE
EFI_STATUS OcHandleProtocolFallback(IN EFI_HANDLE Handle, IN EFI_GUID *Protocol, OUT VOID **Interface)
STATIC EFI_STATUS EFIAPI AsciiTextQueryMode(IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, IN UINTN ModeNumber, OUT UINTN *Columns, OUT UINTN *Rows)
STATIC UINTN mConsoleMaxPosY
STATIC EFI_STATUS EFIAPI AsciiTextSetMode(IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, IN UINTN ModeNumber)
STATIC EFI_STATUS EFIAPI AsciiTextReset(IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, IN BOOLEAN ExtendedVerification)
STATIC EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION mBackgroundColor
STATIC EFI_STATUS EFIAPI ConsoleControlSetMode(IN EFI_CONSOLE_CONTROL_PROTOCOL *This, IN EFI_CONSOLE_CONTROL_SCREEN_MODE Mode)
STATIC UINTN mConsoleWidth
STATIC UINTN mConsoleHeight
STATIC BOOLEAN mIsDefaultFont
STATIC EFI_CONSOLE_CONTROL_SCREEN_MODE mConsoleMode
STATIC EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION mForegroundColor
STATIC UINT32 mConsoleGopMode
STATIC EFI_STATUS EFIAPI AsciiTextSetCursorPosition(IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, IN UINTN Column, IN UINTN Row)
BOOLEAN OcConsoleFontContainsChar(IN OC_CONSOLE_FONT *ConsoleFont, IN CHAR16 Char)
EFI_STATUS OcUseBuiltinTextOutput(IN EFI_CONSOLE_CONTROL_SCREEN_MODE InitialMode, IN OC_STORAGE_CONTEXT *Storage OPTIONAL, IN CONST CHAR8 *Font OPTIONAL, IN EFI_CONSOLE_CONTROL_SCREEN_MODE Mode, IN UINT32 Width, IN UINT32 Height)
STATIC VOID RenderScroll(VOID)
STATIC EFI_STATUS RenderResync(IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This)
STATIC BOOLEAN mConsoleUncontrolled
#define TGT_CURSOR_HEIGHT
STATIC UINT32 mGraphicsEfiColors[16]
STATIC EFI_STATUS EFIAPI ConsoleControlLockStdIn(IN EFI_CONSOLE_CONTROL_PROTOCOL *This, IN CHAR16 *Password)
STATIC EFI_STATUS EFIAPI AsciiTextTestString(IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, IN CHAR16 *String)
STATIC EFI_STATUS EFIAPI AsciiTextClearScreen(IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This)
#define MIN_SUPPORTED_CONSOLE_WIDTH
STATIC EFI_STATUS EFIAPI AsciiTextSetAttribute(IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, IN UINTN Attribute)
STATIC EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION * mCharacterBuffer
STATIC UINTN mConsolePaddingX
STATIC OC_CONSOLE_FONT * mConsoleFont
STATIC EFI_SIMPLE_TEXT_OUTPUT_MODE mAsciiTextOutputMode
STATIC UINTN mPrivateColumn
At least UEFI Shell trashes Mode values.
STATIC EFI_STATUS EFIAPI AsciiTextOutputString(IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, IN CHAR16 *String)
STATIC EFI_GRAPHICS_OUTPUT_PROTOCOL * mGraphicsOutput
STATIC UINTN mPrivateRow
At least UEFI Shell trashes Mode values.
#define MIN_SUPPORTED_CONSOLE_HEIGHT
STATIC EFI_CONSOLE_CONTROL_PROTOCOL mConsoleControlProtocol
STATIC VOID FlushCursor(IN BOOLEAN Enabled, IN UINTN PosX, IN UINTN PosY)
STATIC EFI_STATUS EFIAPI AsciiTextEnableCursor(IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, IN BOOLEAN Visible)
STATIC UINTN mConsoleMaxPosX
STATIC EFI_STATUS EFIAPI ConsoleControlGetMode(IN EFI_CONSOLE_CONTROL_PROTOCOL *This, OUT EFI_CONSOLE_CONTROL_SCREEN_MODE *Mode, OUT BOOLEAN *GopUgaExists OPTIONAL, OUT BOOLEAN *StdInLocked OPTIONAL)
STATIC UINTN mConsolePaddingY
STATIC EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL mAsciiTextOutputProtocol
STATIC EFI_STATUS GetConsoleFontCharInfo(IN OC_CONSOLE_FONT *ConsoleFont, IN CHAR16 Char, OUT OC_CONSOLE_FONT_PAGE **Page, OUT UINT8 *GlyphIndex, IN BOOLEAN UseFallback)
STATIC VOID RenderChar(IN CHAR16 Char, IN UINTN PosX, IN UINTN PosY)
STATIC EFI_STATUS EFIAPI AsciiTextResetEx(IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This, IN BOOLEAN ExtendedVerification, IN BOOLEAN Debug)
EFI_RUNTIME_SERVICES * gRT
EFI_GUID gEfiGraphicsOutputProtocolGuid