+++ /dev/null
-/**@file\r
- This is the main routine for initializing the Graphics Console support routines.\r
-Remaining Tasks\r
- Add all standard Glyphs from EFI 1.02 Specification\r
- Implement optimal automatic Mode creation algorithm\r
- Solve palette issues for mixed graphics and text\r
- When does this protocol reset the palette?\r
- \r
-Copyright (c) 2006 - 2007 Intel Corporation. <BR>\r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-**/\r
-\r
-#include "GraphicsConsole.h"\r
-\r
-STATIC\r
-EFI_STATUS\r
-GetTextColors (\r
- IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
- OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Foreground,\r
- OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Background\r
- );\r
-\r
-STATIC\r
-EFI_STATUS\r
-DrawUnicodeWeightAtCursorN (\r
- IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
- IN CHAR16 *UnicodeWeight,\r
- IN UINTN Count\r
- );\r
-\r
-STATIC\r
-EFI_STATUS\r
-EraseCursor (\r
- IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This\r
- );\r
-\r
-//\r
-// Globals\r
-//\r
-GRAPHICS_CONSOLE_DEV mGraphicsConsoleDevTemplate = {\r
- GRAPHICS_CONSOLE_DEV_SIGNATURE,\r
- (EFI_GRAPHICS_OUTPUT_PROTOCOL *) NULL,\r
- (EFI_UGA_DRAW_PROTOCOL *) NULL,\r
- {\r
- GraphicsConsoleConOutReset,\r
- GraphicsConsoleConOutOutputString,\r
- GraphicsConsoleConOutTestString,\r
- GraphicsConsoleConOutQueryMode,\r
- GraphicsConsoleConOutSetMode,\r
- GraphicsConsoleConOutSetAttribute,\r
- GraphicsConsoleConOutClearScreen,\r
- GraphicsConsoleConOutSetCursorPosition,\r
- GraphicsConsoleConOutEnableCursor,\r
- (EFI_SIMPLE_TEXT_OUTPUT_MODE *) NULL\r
- },\r
- {\r
- 0,\r
- 0,\r
- EFI_TEXT_ATTR(EFI_LIGHTGRAY, EFI_BLACK),\r
- 0,\r
- 0,\r
- TRUE\r
- },\r
- {\r
- { 80, 25, 0, 0, 0, 0 }, // Mode 0\r
- { 80, 50, 0, 0, 0, 0 }, // Mode 1 \r
- { 0, 0, 0, 0, 0, 0 } // Mode 2\r
- },\r
- (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) NULL,\r
- (EFI_HII_HANDLE) 0\r
-};\r
-\r
-EFI_HII_PROTOCOL *mHii;\r
-\r
-static CHAR16 mCrLfString[3] = { CHAR_CARRIAGE_RETURN, CHAR_LINEFEED, CHAR_NULL };\r
-\r
-static EFI_GRAPHICS_OUTPUT_BLT_PIXEL mEfiColors[16] = {\r
- //\r
- // B G R\r
- //\r
- {0x00, 0x00, 0x00, 0x00}, // BLACK\r
- {0x98, 0x00, 0x00, 0x00}, // BLUE\r
- {0x00, 0x98, 0x00, 0x00}, // GREEN\r
- {0x98, 0x98, 0x00, 0x00}, // CYAN\r
- {0x00, 0x00, 0x98, 0x00}, // RED\r
- {0x98, 0x00, 0x98, 0x00}, // MAGENTA\r
- {0x00, 0x98, 0x98, 0x00}, // BROWN\r
- {0x98, 0x98, 0x98, 0x00}, // LIGHTGRAY\r
- {0x30, 0x30, 0x30, 0x00}, // DARKGRAY - BRIGHT BLACK\r
- {0xff, 0x00, 0x00, 0x00}, // LIGHTBLUE - ?\r
- {0x00, 0xff, 0x00, 0x00}, // LIGHTGREEN - ?\r
- {0xff, 0xff, 0x00, 0x00}, // LIGHTCYAN\r
- {0x00, 0x00, 0xff, 0x00}, // LIGHTRED\r
- {0xff, 0x00, 0xff, 0x00}, // LIGHTMAGENTA\r
- {0x00, 0xff, 0xff, 0x00}, // LIGHTBROWN\r
- {0xff, 0xff, 0xff, 0x00} // WHITE\r
-};\r
-\r
-static EFI_NARROW_GLYPH mCursorGlyph = {\r
- 0x0000,\r
- 0x00,\r
- { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF }\r
-};\r
-\r
-EFI_DRIVER_BINDING_PROTOCOL gGraphicsConsoleDriverBinding = {\r
- GraphicsConsoleControllerDriverSupported,\r
- GraphicsConsoleControllerDriverStart,\r
- GraphicsConsoleControllerDriverStop,\r
- 0xa,\r
- NULL,\r
- NULL\r
-};\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleControllerDriverSupported (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE Controller,\r
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
- EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
-\r
- UgaDraw = NULL;\r
- //\r
- // Open the IO Abstraction(s) needed to perform the supported test\r
- //\r
- Status = gBS->OpenProtocol (\r
- Controller,\r
- &gEfiGraphicsOutputProtocolGuid,\r
- (VOID **) &GraphicsOutput,\r
- This->DriverBindingHandle,\r
- Controller,\r
- EFI_OPEN_PROTOCOL_BY_DRIVER\r
- );\r
- \r
- if (EFI_ERROR (Status)) {\r
- GraphicsOutput = NULL;\r
- //\r
- // Open Graphics Output Protocol failed, try to open UGA Draw Protocol\r
- //\r
- Status = gBS->OpenProtocol (\r
- Controller,\r
- &gEfiUgaDrawProtocolGuid,\r
- (VOID **) &UgaDraw,\r
- This->DriverBindingHandle,\r
- Controller,\r
- EFI_OPEN_PROTOCOL_BY_DRIVER\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- }\r
-\r
- //\r
- // We need to ensure that we do not layer on top of a virtual handle.\r
- // We need to ensure that the handles produced by the conspliter do not\r
- // get used.\r
- //\r
- Status = gBS->OpenProtocol (\r
- Controller,\r
- &gEfiDevicePathProtocolGuid,\r
- (VOID **) &DevicePath,\r
- This->DriverBindingHandle,\r
- Controller,\r
- EFI_OPEN_PROTOCOL_BY_DRIVER\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- gBS->CloseProtocol (\r
- Controller,\r
- &gEfiDevicePathProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
- } else {\r
- goto Error;\r
- }\r
- //\r
- // Does Hii Exist? If not, we aren't ready to run\r
- //\r
- Status = EfiLocateHiiProtocol ();\r
-\r
- //\r
- // Close the I/O Abstraction(s) used to perform the supported test\r
- //\r
-Error:\r
- if (GraphicsOutput != NULL) {\r
- gBS->CloseProtocol (\r
- Controller,\r
- &gEfiGraphicsOutputProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
- } else {\r
- gBS->CloseProtocol (\r
- Controller,\r
- &gEfiUgaDrawProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
- }\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleControllerDriverStart (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE Controller,\r
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
- )\r
-/*++\r
-\r
- Routine Description:\r
-\r
- Start the controller.\r
-\r
- Arguments:\r
-\r
- This - A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.\r
- Controller - The handle of the controller to start.\r
- RemainingDevicePath - A pointer to the remaining portion of a devcie path.\r
-\r
- Returns:\r
-\r
- EFI_SUCCESS - Return successfully.\r
- EFI_OUT_OF_RESOURCES - Out of resources.\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- GRAPHICS_CONSOLE_DEV *Private;\r
- EFI_HII_PACKAGES *Package;\r
- EFI_HII_FONT_PACK *FontPack;\r
- UINTN NarrowFontSize;\r
- UINT32 HorizontalResolution;\r
- UINT32 VerticalResolution;\r
- UINT32 ColorDepth;\r
- UINT32 RefreshRate;\r
- UINTN MaxMode;\r
- UINTN Columns;\r
- UINTN Rows;\r
- UINT8 *Location;\r
- UINT32 ModeNumber;\r
- UINTN SizeOfInfo;\r
- EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
- \r
- ModeNumber = 0;\r
-\r
- //\r
- // Initialize the Graphics Console device instance\r
- //\r
- Private = AllocateCopyPool (\r
- sizeof (GRAPHICS_CONSOLE_DEV),\r
- &mGraphicsConsoleDevTemplate\r
- );\r
- if (Private == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- Private->SimpleTextOutput.Mode = &(Private->SimpleTextOutputMode);\r
-\r
- Status = gBS->OpenProtocol (\r
- Controller,\r
- &gEfiGraphicsOutputProtocolGuid,\r
- (VOID **) &Private->GraphicsOutput,\r
- This->DriverBindingHandle,\r
- Controller,\r
- EFI_OPEN_PROTOCOL_BY_DRIVER\r
- );\r
- if (EFI_ERROR(Status)) {\r
- Private->GraphicsOutput = NULL;\r
-\r
- Status = gBS->OpenProtocol (\r
- Controller,\r
- &gEfiUgaDrawProtocolGuid,\r
- (VOID **) &Private->UgaDraw,\r
- This->DriverBindingHandle,\r
- Controller,\r
- EFI_OPEN_PROTOCOL_BY_DRIVER\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto Error;\r
- }\r
- }\r
-\r
- //\r
- // Get the HII protocol. If Supported() succeeds, do we really\r
- // need to get HII protocol again?\r
- //\r
- Status = EfiLocateHiiProtocol ();\r
- if (EFI_ERROR (Status)) {\r
- goto Error;\r
- }\r
-\r
- NarrowFontSize = ReturnNarrowFontSize ();\r
-\r
- FontPack = AllocateZeroPool (sizeof (EFI_HII_FONT_PACK) + NarrowFontSize);\r
- ASSERT (FontPack);\r
-\r
- FontPack->Header.Length = (UINT32) (sizeof (EFI_HII_FONT_PACK) + NarrowFontSize);\r
- FontPack->Header.Type = EFI_HII_FONT;\r
- FontPack->NumberOfNarrowGlyphs = (UINT16) (NarrowFontSize / sizeof (EFI_NARROW_GLYPH));\r
-\r
- Location = (UINT8 *) (&FontPack->NumberOfWideGlyphs + sizeof (UINT8));\r
- CopyMem (Location, UsStdNarrowGlyphData, NarrowFontSize);\r
-\r
- //\r
- // Register our Fonts into the global database\r
- //\r
- Package = PreparePackages (1, NULL, FontPack);\r
- mHii->NewPack (mHii, Package, &(Private->HiiHandle));\r
- FreePool (Package);\r
-\r
- //\r
- // Free the font database\r
- //\r
- FreePool (FontPack);\r
-\r
- //\r
- // If the current mode information can not be retrieved, then attemp to set the default mode\r
- // of 800x600, 32 bit colot, 60 Hz refresh.\r
- //\r
- HorizontalResolution = 800;\r
- VerticalResolution = 600;\r
-\r
- if (Private->GraphicsOutput != NULL) {\r
- //\r
- // The console is build on top of Graphics Output Protocol, find the mode number for 800x600\r
- //\r
- for (ModeNumber = 0; ModeNumber < Private->GraphicsOutput->Mode->MaxMode; ModeNumber++) {\r
- Status = Private->GraphicsOutput->QueryMode (\r
- Private->GraphicsOutput,\r
- ModeNumber,\r
- &SizeOfInfo,\r
- &Info\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- if ((Info->HorizontalResolution == 800) &&\r
- (Info->VerticalResolution == 600)) {\r
- Status = Private->GraphicsOutput->SetMode (Private->GraphicsOutput, ModeNumber);\r
- if (!EFI_ERROR (Status)) {\r
- FreePool (Info);\r
- break;\r
- }\r
- }\r
- FreePool (Info);\r
- }\r
- }\r
-\r
- if (EFI_ERROR (Status) || (ModeNumber == Private->GraphicsOutput->Mode->MaxMode)) {\r
- //\r
- // Set default mode failed or device don't support default mode, then get the current mode information\r
- //\r
- HorizontalResolution = Private->GraphicsOutput->Mode->Info->HorizontalResolution;\r
- VerticalResolution = Private->GraphicsOutput->Mode->Info->VerticalResolution;\r
- ModeNumber = Private->GraphicsOutput->Mode->Mode;\r
- }\r
- } else {\r
- //\r
- // The console is build on top of UGA Draw Protocol\r
- //\r
- ColorDepth = 32;\r
- RefreshRate = 60;\r
- Status = Private->UgaDraw->SetMode (\r
- Private->UgaDraw,\r
- HorizontalResolution,\r
- VerticalResolution,\r
- ColorDepth,\r
- RefreshRate\r
- );\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // Get the current mode information from the UGA Draw Protocol\r
- //\r
- Status = Private->UgaDraw->GetMode (\r
- Private->UgaDraw,\r
- &HorizontalResolution,\r
- &VerticalResolution,\r
- &ColorDepth,\r
- &RefreshRate\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto Error;\r
- }\r
- }\r
- }\r
-\r
- //\r
- // Compute the maximum number of text Rows and Columns that this current graphics mode can support\r
- //\r
- Columns = HorizontalResolution / GLYPH_WIDTH;\r
- Rows = VerticalResolution / GLYPH_HEIGHT;\r
-\r
- //\r
- // See if the mode is too small to support the required 80x25 text mode\r
- //\r
- if (Columns < 80 || Rows < 25) {\r
- goto Error;\r
- }\r
- //\r
- // Add Mode #0 that must be 80x25\r
- //\r
- MaxMode = 0;\r
- Private->ModeData[MaxMode].GopWidth = HorizontalResolution;\r
- Private->ModeData[MaxMode].GopHeight = VerticalResolution;\r
- Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
- Private->ModeData[MaxMode].DeltaX = (HorizontalResolution - (80 * GLYPH_WIDTH)) >> 1;\r
- Private->ModeData[MaxMode].DeltaY = (VerticalResolution - (25 * GLYPH_HEIGHT)) >> 1;\r
- MaxMode++;\r
-\r
- //\r
- // If it is possible to support Mode #1 - 80x50, than add it as an active mode\r
- //\r
- if (Rows >= 50) {\r
- Private->ModeData[MaxMode].GopWidth = HorizontalResolution;\r
- Private->ModeData[MaxMode].GopHeight = VerticalResolution;\r
- Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
- Private->ModeData[MaxMode].DeltaX = (HorizontalResolution - (80 * GLYPH_WIDTH)) >> 1;\r
- Private->ModeData[MaxMode].DeltaY = (VerticalResolution - (50 * GLYPH_HEIGHT)) >> 1;\r
- MaxMode++;\r
- }\r
- //\r
- // If the graphics mode is 800x600, than add a text mode that uses the entire display\r
- //\r
- if (HorizontalResolution == 800 && VerticalResolution == 600) {\r
-\r
- if (MaxMode < 2) {\r
- Private->ModeData[MaxMode].Columns = 0;\r
- Private->ModeData[MaxMode].Rows = 0;\r
- Private->ModeData[MaxMode].GopWidth = 800;\r
- Private->ModeData[MaxMode].GopHeight = 600;\r
- Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
- Private->ModeData[MaxMode].DeltaX = 0;\r
- Private->ModeData[MaxMode].DeltaY = 0;\r
- MaxMode++;\r
- }\r
-\r
- Private->ModeData[MaxMode].Columns = 800 / GLYPH_WIDTH;\r
- Private->ModeData[MaxMode].Rows = 600 / GLYPH_HEIGHT;\r
- Private->ModeData[MaxMode].GopWidth = 800;\r
- Private->ModeData[MaxMode].GopHeight = 600;\r
- Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
- Private->ModeData[MaxMode].DeltaX = (800 % GLYPH_WIDTH) >> 1;\r
- Private->ModeData[MaxMode].DeltaY = (600 % GLYPH_HEIGHT) >> 1;\r
- MaxMode++;\r
- }\r
- //\r
- // Update the maximum number of modes\r
- //\r
- Private->SimpleTextOutputMode.MaxMode = (INT32) MaxMode;\r
-\r
- //\r
- // Determine the number of text modes that this protocol can support\r
- //\r
- Status = GraphicsConsoleConOutSetMode (&Private->SimpleTextOutput, 0);\r
- if (EFI_ERROR (Status)) {\r
- goto Error;\r
- }\r
-\r
- DEBUG_CODE_BEGIN ();\r
- GraphicsConsoleConOutOutputString (&Private->SimpleTextOutput, (CHAR16 *)L"Graphics Console Started\n\r");\r
- DEBUG_CODE_END ();\r
-\r
- //\r
- // Install protocol interfaces for the Graphics Console device.\r
- //\r
- Status = gBS->InstallMultipleProtocolInterfaces (\r
- &Controller,\r
- &gEfiSimpleTextOutProtocolGuid,\r
- &Private->SimpleTextOutput,\r
- NULL\r
- );\r
-\r
-Error:\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // Close the GOP or UGA IO Protocol\r
- //\r
- if (Private->GraphicsOutput != NULL) {\r
- gBS->CloseProtocol (\r
- Controller,\r
- &gEfiGraphicsOutputProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
- } else {\r
- gBS->CloseProtocol (\r
- Controller,\r
- &gEfiUgaDrawProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
- }\r
-\r
- //\r
- // Free private data\r
- //\r
- if (Private != NULL) {\r
- if (Private->LineBuffer != NULL) {\r
- FreePool (Private->LineBuffer);\r
- }\r
- FreePool (Private);\r
- }\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleControllerDriverStop (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE Controller,\r
- IN UINTN NumberOfChildren,\r
- IN EFI_HANDLE *ChildHandleBuffer\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_SIMPLE_TEXT_OUT_PROTOCOL *SimpleTextOutput;\r
- GRAPHICS_CONSOLE_DEV *Private;\r
-\r
- Status = gBS->OpenProtocol (\r
- Controller,\r
- &gEfiSimpleTextOutProtocolGuid,\r
- (VOID **) &SimpleTextOutput,\r
- This->DriverBindingHandle,\r
- Controller,\r
- EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return EFI_NOT_STARTED;\r
- }\r
-\r
- Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (SimpleTextOutput);\r
-\r
- Status = gBS->UninstallProtocolInterface (\r
- Controller,\r
- &gEfiSimpleTextOutProtocolGuid,\r
- &Private->SimpleTextOutput\r
- );\r
-\r
- if (!EFI_ERROR (Status)) {\r
- //\r
- // Close the GOP or UGA IO Protocol\r
- //\r
- if (Private->GraphicsOutput != NULL) {\r
- gBS->CloseProtocol (\r
- Controller,\r
- &gEfiGraphicsOutputProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
- } else {\r
- gBS->CloseProtocol (\r
- Controller,\r
- &gEfiUgaDrawProtocolGuid,\r
- This->DriverBindingHandle,\r
- Controller\r
- );\r
- }\r
-\r
- //\r
- // Remove the font pack\r
- //\r
- mHii->RemovePack (mHii, Private->HiiHandle);\r
-\r
- //\r
- // Free our instance data\r
- //\r
- if (Private != NULL) {\r
- FreePool (Private->LineBuffer);\r
- FreePool (Private);\r
- }\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EfiLocateHiiProtocol (\r
- VOID\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Find if the HII protocol is available. If yes, locate the HII protocol\r
-\r
- Arguments:\r
-\r
- Returns:\r
-\r
---*/\r
-{\r
- EFI_HANDLE Handle;\r
- UINTN Size;\r
- EFI_STATUS Status;\r
-\r
- //\r
- // There should only be one - so buffer size is this\r
- //\r
- Size = sizeof (EFI_HANDLE);\r
-\r
- Status = gBS->LocateHandle (\r
- ByProtocol,\r
- &gEfiHiiProtocolGuid,\r
- NULL,\r
- &Size,\r
- &Handle\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- Status = gBS->HandleProtocol (\r
- Handle,\r
- &gEfiHiiProtocolGuid,\r
- (VOID **)&mHii\r
- );\r
-\r
- return Status;\r
-}\r
-//\r
-// Body of the STO functions\r
-//\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleConOutReset (\r
- IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
- IN BOOLEAN ExtendedVerification\r
- )\r
-/*++\r
- Routine Description:\r
- \r
- Implements SIMPLE_TEXT_OUTPUT.Reset().\r
- If ExtendeVerification is TRUE, then perform dependent Graphics Console \r
- device reset, and set display mode to mode 0.\r
- If ExtendedVerification is FALSE, only set display mode to mode 0.\r
- \r
- Arguments:\r
- \r
- This - Indicates the calling context.\r
- \r
- ExtendedVerification - Indicates that the driver may perform a more exhaustive\r
- verification operation of the device during reset.\r
- \r
- Returns:\r
- \r
- EFI_SUCCESS\r
- The reset operation succeeds. \r
- \r
- EFI_DEVICE_ERROR\r
- The Graphics Console is not functioning correctly \r
- \r
---*/\r
-{\r
- This->SetAttribute (This, EFI_TEXT_ATTR (This->Mode->Attribute & 0x0F, EFI_BACKGROUND_BLACK));\r
- return This->SetMode (This, 0);\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleConOutOutputString (\r
- IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
- IN CHAR16 *WString\r
- )\r
-/*++\r
- Routine Description:\r
- \r
- Implements SIMPLE_TEXT_OUTPUT.OutputString().\r
- The Unicode string will be converted to Glyphs and will be \r
- sent to the Graphics Console.\r
- \r
- \r
- Arguments:\r
- \r
- This - Indicates the calling context.\r
- \r
- WString - The Null-terminated Unicode string to be displayed on \r
- the Graphics Console.\r
- \r
- Returns:\r
- \r
- EFI_SUCCESS\r
- The string is output successfully. \r
- \r
- EFI_DEVICE_ERROR\r
- The Graphics Console failed to send the string out.\r
- \r
- EFI_WARN_UNKNOWN_GLYPH\r
- Indicates that some of the characters in the Unicode string could not \r
- be rendered and are skipped. \r
- \r
---*/\r
-{\r
- GRAPHICS_CONSOLE_DEV *Private;\r
- EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
- EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
- INTN Mode;\r
- UINTN MaxColumn;\r
- UINTN MaxRow;\r
- UINTN Width;\r
- UINTN Height;\r
- UINTN Delta;\r
- EFI_STATUS Status;\r
- BOOLEAN Warning;\r
- EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground;\r
- EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background;\r
- UINTN DeltaX;\r
- UINTN DeltaY;\r
- UINTN Count;\r
- UINTN Index;\r
- INT32 OriginAttribute;\r
- EFI_TPL OldTpl;\r
- CHAR16 SpaceStr[] = { NARROW_CHAR, ' ', 0 };\r
-\r
- Status = EFI_SUCCESS;\r
-\r
- OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
- //\r
- // Current mode\r
- //\r
- Mode = This->Mode->Mode;\r
- Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
- GraphicsOutput = Private->GraphicsOutput;\r
- UgaDraw = Private->UgaDraw;\r
-\r
- MaxColumn = Private->ModeData[Mode].Columns;\r
- MaxRow = Private->ModeData[Mode].Rows;\r
- DeltaX = Private->ModeData[Mode].DeltaX;\r
- DeltaY = Private->ModeData[Mode].DeltaY;\r
- Width = MaxColumn * GLYPH_WIDTH;\r
- Height = (MaxRow - 1) * GLYPH_HEIGHT;\r
- Delta = Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);\r
-\r
- //\r
- // The Attributes won't change when during the time OutputString is called\r
- //\r
- GetTextColors (This, &Foreground, &Background);\r
-\r
- EraseCursor (This);\r
-\r
- Warning = FALSE;\r
-\r
- //\r
- // Backup attribute\r
- //\r
- OriginAttribute = This->Mode->Attribute;\r
-\r
- while (*WString) {\r
-\r
- if (*WString == CHAR_BACKSPACE) {\r
- //\r
- // If the cursor is at the left edge of the display, then move the cursor\r
- // one row up.\r
- //\r
- if (This->Mode->CursorColumn == 0 && This->Mode->CursorRow > 0) {\r
- This->Mode->CursorRow--;\r
- This->Mode->CursorColumn = (INT32) (MaxColumn - 1);\r
- This->OutputString (This, SpaceStr);\r
- EraseCursor (This);\r
- This->Mode->CursorRow--;\r
- This->Mode->CursorColumn = (INT32) (MaxColumn - 1);\r
- } else if (This->Mode->CursorColumn > 0) {\r
- //\r
- // If the cursor is not at the left edge of the display, then move the cursor\r
- // left one column.\r
- //\r
- This->Mode->CursorColumn--;\r
- This->OutputString (This, SpaceStr);\r
- EraseCursor (This);\r
- This->Mode->CursorColumn--;\r
- }\r
-\r
- WString++;\r
-\r
- } else if (*WString == CHAR_LINEFEED) {\r
- //\r
- // If the cursor is at the bottom of the display, then scroll the display one\r
- // row, and do not update the cursor position. Otherwise, move the cursor\r
- // down one row.\r
- //\r
- if (This->Mode->CursorRow == (INT32) (MaxRow - 1)) {\r
- if (GraphicsOutput != NULL) {\r
- //\r
- // Scroll Screen Up One Row\r
- //\r
- GraphicsOutput->Blt (\r
- GraphicsOutput,\r
- NULL,\r
- EfiBltVideoToVideo,\r
- DeltaX,\r
- DeltaY + GLYPH_HEIGHT,\r
- DeltaX,\r
- DeltaY,\r
- Width,\r
- Height,\r
- Delta\r
- );\r
-\r
- //\r
- // Print Blank Line at last line\r
- //\r
- GraphicsOutput->Blt (\r
- GraphicsOutput,\r
- &Background,\r
- EfiBltVideoFill,\r
- 0,\r
- 0,\r
- DeltaX,\r
- DeltaY + Height,\r
- Width,\r
- GLYPH_HEIGHT,\r
- Delta\r
- );\r
- } else {\r
- //\r
- // Scroll Screen Up One Row\r
- //\r
- UgaDraw->Blt (\r
- UgaDraw,\r
- NULL,\r
- EfiUgaVideoToVideo,\r
- DeltaX,\r
- DeltaY + GLYPH_HEIGHT,\r
- DeltaX,\r
- DeltaY,\r
- Width,\r
- Height,\r
- Delta\r
- );\r
-\r
- //\r
- // Print Blank Line at last line\r
- //\r
- UgaDraw->Blt (\r
- UgaDraw,\r
- (EFI_UGA_PIXEL *) (UINTN) &Background,\r
- EfiUgaVideoFill,\r
- 0,\r
- 0,\r
- DeltaX,\r
- DeltaY + Height,\r
- Width,\r
- GLYPH_HEIGHT,\r
- Delta\r
- );\r
- }\r
- } else {\r
- This->Mode->CursorRow++;\r
- }\r
-\r
- WString++;\r
-\r
- } else if (*WString == CHAR_CARRIAGE_RETURN) {\r
- //\r
- // Move the cursor to the beginning of the current row.\r
- //\r
- This->Mode->CursorColumn = 0;\r
- WString++;\r
-\r
- } else if (*WString == WIDE_CHAR) {\r
-\r
- This->Mode->Attribute |= EFI_WIDE_ATTRIBUTE;\r
- WString++;\r
-\r
- } else if (*WString == NARROW_CHAR) {\r
-\r
- This->Mode->Attribute &= (~ (UINT32) EFI_WIDE_ATTRIBUTE);\r
- WString++;\r
-\r
- } else {\r
- //\r
- // Print the character at the current cursor position and move the cursor\r
- // right one column. If this moves the cursor past the right edge of the\r
- // display, then the line should wrap to the beginning of the next line. This\r
- // is equivalent to inserting a CR and an LF. Note that if the cursor is at the\r
- // bottom of the display, and the line wraps, then the display will be scrolled\r
- // one line.\r
- // If wide char is going to be displayed, need to display one character at a time\r
- // Or, need to know the display length of a certain string.\r
- //\r
- // Index is used to determine how many character width units (wide = 2, narrow = 1)\r
- // Count is used to determine how many characters are used regardless of their attributes\r
- //\r
- for (Count = 0, Index = 0; (This->Mode->CursorColumn + Index) < MaxColumn; Count++, Index++) {\r
- if (WString[Count] == CHAR_NULL) {\r
- break;\r
- }\r
-\r
- if (WString[Count] == CHAR_BACKSPACE) {\r
- break;\r
- }\r
-\r
- if (WString[Count] == CHAR_LINEFEED) {\r
- break;\r
- }\r
-\r
- if (WString[Count] == CHAR_CARRIAGE_RETURN) {\r
- break;\r
- }\r
-\r
- if (WString[Count] == WIDE_CHAR) {\r
- break;\r
- }\r
-\r
- if (WString[Count] == NARROW_CHAR) {\r
- break;\r
- }\r
- //\r
- // Is the wide attribute on?\r
- //\r
- if (This->Mode->Attribute & EFI_WIDE_ATTRIBUTE) {\r
- //\r
- // If wide, add one more width unit than normal since we are going to increment at the end of the for loop\r
- //\r
- Index++;\r
- //\r
- // This is the end-case where if we are at column 79 and about to print a wide character\r
- // We should prevent this from happening because we will wrap inappropriately. We should\r
- // not print this character until the next line.\r
- //\r
- if ((This->Mode->CursorColumn + Index + 1) > MaxColumn) {\r
- Index++;\r
- break;\r
- }\r
- }\r
- }\r
-\r
- Status = DrawUnicodeWeightAtCursorN (This, WString, Count);\r
- if (EFI_ERROR (Status)) {\r
- Warning = TRUE;\r
- }\r
- //\r
- // At the end of line, output carriage return and line feed\r
- //\r
- WString += Count;\r
- This->Mode->CursorColumn += (INT32) Index;\r
- if (This->Mode->CursorColumn > (INT32) MaxColumn) {\r
- This->Mode->CursorColumn -= 2;\r
- This->OutputString (This, SpaceStr);\r
- }\r
-\r
- if (This->Mode->CursorColumn >= (INT32) MaxColumn) {\r
- EraseCursor (This);\r
- This->OutputString (This, mCrLfString);\r
- EraseCursor (This);\r
- }\r
- }\r
- }\r
-\r
- This->Mode->Attribute = OriginAttribute;\r
-\r
- EraseCursor (This);\r
-\r
- if (Warning) {\r
- Status = EFI_WARN_UNKNOWN_GLYPH;\r
- }\r
-\r
- gBS->RestoreTPL (OldTpl);\r
- return Status;\r
-\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleConOutTestString (\r
- IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
- IN CHAR16 *WString\r
- )\r
-/*++\r
- Routine Description:\r
- \r
- Implements SIMPLE_TEXT_OUTPUT.TestString().\r
- If one of the characters in the *Wstring is\r
- neither valid valid Unicode drawing characters,\r
- not ASCII code, then this function will return\r
- EFI_UNSUPPORTED.\r
- \r
- \r
- Arguments:\r
- \r
- This - Indicates the calling context.\r
- \r
- WString - The Null-terminated Unicode string to be tested.\r
- \r
- Returns:\r
- \r
- EFI_SUCCESS\r
- The Graphics Console is capable of rendering the output string. \r
- \r
- EFI_UNSUPPORTED\r
- Some of the characters in the Unicode string cannot be rendered. \r
- \r
---*/\r
-{\r
- EFI_STATUS Status;\r
- UINT16 GlyphWidth;\r
- UINT32 GlyphStatus;\r
- UINT16 Count;\r
- GLYPH_UNION *Glyph;\r
-\r
- GlyphStatus = 0;\r
- Count = 0;\r
-\r
- while (WString[Count]) {\r
- Status = mHii->GetGlyph (\r
- mHii,\r
- WString,\r
- &Count,\r
- (UINT8 **) &Glyph,\r
- &GlyphWidth,\r
- &GlyphStatus\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- return EFI_UNSUPPORTED;\r
- }\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleConOutQueryMode (\r
- IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
- IN UINTN ModeNumber,\r
- OUT UINTN *Columns,\r
- OUT UINTN *Rows\r
- )\r
-/*++\r
- Routine Description:\r
- \r
- Implements SIMPLE_TEXT_OUTPUT.QueryMode().\r
- It returnes information for an available text mode\r
- that the Graphics Console supports.\r
- In this driver,we only support text mode 80x25, which is\r
- defined as mode 0.\r
- \r
- \r
- Arguments:\r
- \r
- This - Indicates the calling context.\r
- \r
- ModeNumber - The mode number to return information on.\r
- \r
- Columns - The returned columns of the requested mode.\r
- \r
- Rows - The returned rows of the requested mode. \r
- \r
- Returns:\r
- \r
- EFI_SUCCESS\r
- The requested mode information is returned. \r
- \r
- EFI_UNSUPPORTED\r
- The mode number is not valid. \r
- \r
---*/\r
-{\r
- GRAPHICS_CONSOLE_DEV *Private;\r
- EFI_STATUS Status;\r
- EFI_TPL OldTpl;\r
-\r
- if (ModeNumber >= (UINTN) This->Mode->MaxMode) {\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
- Status = EFI_SUCCESS;\r
- \r
- Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
-\r
- *Columns = Private->ModeData[ModeNumber].Columns;\r
- *Rows = Private->ModeData[ModeNumber].Rows;\r
-\r
- if (*Columns <= 0 && *Rows <= 0) {\r
- Status = EFI_UNSUPPORTED;\r
- goto Done;\r
-\r
- }\r
-\r
-Done:\r
- gBS->RestoreTPL (OldTpl);\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleConOutSetMode (\r
- IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
- IN UINTN ModeNumber\r
- )\r
-/*++\r
- Routine Description:\r
- \r
- Implements SIMPLE_TEXT_OUTPUT.SetMode().\r
- Set the Graphics Console to a specified mode.\r
- In this driver, we only support mode 0. \r
- \r
- Arguments:\r
- \r
- This - Indicates the calling context.\r
- \r
- ModeNumber - The text mode to set.\r
- \r
- Returns:\r
- \r
- EFI_SUCCESS\r
- The requested text mode is set.\r
- \r
- EFI_DEVICE_ERROR\r
- The requested text mode cannot be set because of Graphics Console device error.\r
- \r
- EFI_UNSUPPORTED\r
- The text mode number is not valid. \r
- \r
---*/\r
-{\r
- EFI_STATUS Status;\r
- GRAPHICS_CONSOLE_DEV *Private;\r
- GRAPHICS_CONSOLE_MODE_DATA *ModeData;\r
- EFI_GRAPHICS_OUTPUT_BLT_PIXEL *NewLineBuffer;\r
- UINT32 HorizontalResolution;\r
- UINT32 VerticalResolution;\r
- EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
- EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
- UINT32 ColorDepth;\r
- UINT32 RefreshRate;\r
- EFI_TPL OldTpl;\r
-\r
- OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
-\r
- Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
- GraphicsOutput = Private->GraphicsOutput;\r
- UgaDraw = Private->UgaDraw;\r
- ModeData = &(Private->ModeData[ModeNumber]);\r
-\r
- if (ModeData->Columns <= 0 && ModeData->Rows <= 0) {\r
- Status = EFI_UNSUPPORTED;\r
- goto Done;\r
- }\r
-\r
- //\r
- // Make sure the requested mode number is supported\r
- //\r
- if (ModeNumber >= (UINTN) This->Mode->MaxMode) {\r
- Status = EFI_UNSUPPORTED;\r
- goto Done;\r
- }\r
-\r
- if (ModeData->Columns <= 0 && ModeData->Rows <= 0) {\r
- Status = EFI_UNSUPPORTED;\r
- goto Done;\r
- }\r
- //\r
- // Attempt to allocate a line buffer for the requested mode number\r
- //\r
- NewLineBuffer = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) * ModeData->Columns * GLYPH_WIDTH * GLYPH_HEIGHT);\r
-\r
- if (NewLineBuffer == NULL) {\r
- //\r
- // The new line buffer could not be allocated, so return an error.\r
- // No changes to the state of the current console have been made, so the current console is still valid\r
- //\r
- Status = EFI_OUT_OF_RESOURCES;\r
- goto Done;\r
- }\r
- //\r
- // If the mode has been set at least one other time, then LineBuffer will not be NULL\r
- //\r
- if (Private->LineBuffer != NULL) {\r
- //\r
- // Clear the current text window on the current graphics console\r
- //\r
- This->ClearScreen (This);\r
-\r
- //\r
- // If the new mode is the same as the old mode, then just return EFI_SUCCESS\r
- //\r
- if ((INT32) ModeNumber == This->Mode->Mode) {\r
- FreePool (NewLineBuffer);\r
- Status = EFI_SUCCESS;\r
- goto Done;\r
- }\r
- //\r
- // Otherwise, the size of the text console and/or the UGA mode will be changed,\r
- // so turn off the cursor, and free the LineBuffer for the current mode\r
- //\r
- This->EnableCursor (This, FALSE);\r
-\r
- FreePool (Private->LineBuffer);\r
- }\r
- //\r
- // Assign the current line buffer to the newly allocated line buffer\r
- //\r
- Private->LineBuffer = NewLineBuffer;\r
-\r
- if (GraphicsOutput != NULL) {\r
- if (ModeData->GopModeNumber != GraphicsOutput->Mode->Mode) {\r
- //\r
- // Either no graphics mode is currently set, or it is set to the wrong resolution, so set the new grapghics mode\r
- //\r
- Status = GraphicsOutput->SetMode (GraphicsOutput, ModeData->GopModeNumber);\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // The mode set operation failed\r
- //\r
- goto Done;\r
- }\r
- } else {\r
- //\r
- // The current graphics mode is correct, so simply clear the entire display\r
- //\r
- Status = GraphicsOutput->Blt (\r
- GraphicsOutput,\r
- &mEfiColors[0],\r
- EfiBltVideoFill,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- ModeData->GopWidth,\r
- ModeData->GopHeight,\r
- 0\r
- );\r
- }\r
- } else {\r
- //\r
- // Get the current UGA Draw mode information\r
- //\r
- Status = UgaDraw->GetMode (\r
- UgaDraw,\r
- &HorizontalResolution,\r
- &VerticalResolution,\r
- &ColorDepth,\r
- &RefreshRate\r
- );\r
- if (EFI_ERROR (Status) || HorizontalResolution != ModeData->GopWidth || VerticalResolution != ModeData->GopHeight) {\r
- //\r
- // Either no graphics mode is currently set, or it is set to the wrong resolution, so set the new grapghics mode\r
- //\r
- Status = UgaDraw->SetMode (\r
- UgaDraw,\r
- ModeData->GopWidth,\r
- ModeData->GopHeight,\r
- 32,\r
- 60\r
- );\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // The mode set operation failed\r
- //\r
- goto Done;\r
- }\r
- } else {\r
- //\r
- // The current graphics mode is correct, so simply clear the entire display\r
- //\r
- Status = UgaDraw->Blt (\r
- UgaDraw,\r
- (EFI_UGA_PIXEL *) (UINTN) &mEfiColors[0],\r
- EfiUgaVideoFill,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- ModeData->GopWidth,\r
- ModeData->GopHeight,\r
- 0\r
- );\r
- }\r
- }\r
-\r
- //\r
- // The new mode is valid, so commit the mode change\r
- //\r
- This->Mode->Mode = (INT32) ModeNumber;\r
-\r
- //\r
- // Move the text cursor to the upper left hand corner of the displat and enable it\r
- //\r
- This->SetCursorPosition (This, 0, 0);\r
- This->EnableCursor (This, TRUE);\r
-\r
- Status = EFI_SUCCESS;\r
-\r
-Done:\r
- gBS->RestoreTPL (OldTpl);\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleConOutSetAttribute (\r
- IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
- IN UINTN Attribute\r
- )\r
-/*++\r
- Routine Description:\r
- \r
- Implements SIMPLE_TEXT_OUTPUT.SetAttribute(). \r
- \r
- Arguments:\r
- \r
- This - Indicates the calling context.\r
- \r
- Attrubute - The attribute to set. Only bit0..6 are valid, all other bits\r
- are undefined and must be zero.\r
- \r
- Returns:\r
- \r
- EFI_SUCCESS\r
- The requested attribute is set. \r
- \r
- EFI_DEVICE_ERROR\r
- The requested attribute cannot be set due to Graphics Console port error.\r
- \r
- EFI_UNSUPPORTED\r
- The attribute requested is not defined by EFI spec. \r
- \r
---*/\r
-{\r
- EFI_TPL OldTpl;\r
- \r
- if ((Attribute | 0xFF) != 0xFF) {\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- if ((INT32) Attribute == This->Mode->Attribute) {\r
- return EFI_SUCCESS;\r
- }\r
-\r
- OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
-\r
- EraseCursor (This);\r
-\r
- This->Mode->Attribute = (INT32) Attribute;\r
-\r
- EraseCursor (This);\r
-\r
- gBS->RestoreTPL (OldTpl);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleConOutClearScreen (\r
- IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This\r
- )\r
-/*++\r
- Routine Description:\r
- \r
- Implements SIMPLE_TEXT_OUTPUT.ClearScreen().\r
- It clears the Graphics Console's display to the \r
- currently selected background color.\r
- \r
- \r
- Arguments:\r
- \r
- This - Indicates the calling context.\r
-\r
- Returns:\r
- \r
- EFI_SUCCESS\r
- The operation completed successfully.\r
- \r
- EFI_DEVICE_ERROR\r
- The Graphics Console cannot be cleared due to Graphics Console device error. \r
- \r
- EFI_UNSUPPORTED\r
- The Graphics Console is not in a valid text mode. \r
- \r
---*/\r
-{\r
- EFI_STATUS Status;\r
- GRAPHICS_CONSOLE_DEV *Private;\r
- GRAPHICS_CONSOLE_MODE_DATA *ModeData;\r
- EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
- EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
- EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground;\r
- EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background;\r
- EFI_TPL OldTpl;\r
-\r
- OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
-\r
- Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
- GraphicsOutput = Private->GraphicsOutput;\r
- UgaDraw = Private->UgaDraw;\r
- ModeData = &(Private->ModeData[This->Mode->Mode]);\r
-\r
- GetTextColors (This, &Foreground, &Background);\r
- if (GraphicsOutput != NULL) {\r
- Status = GraphicsOutput->Blt (\r
- GraphicsOutput,\r
- &Background,\r
- EfiBltVideoFill,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- ModeData->GopWidth,\r
- ModeData->GopHeight,\r
- 0\r
- );\r
- } else {\r
- Status = UgaDraw->Blt (\r
- UgaDraw,\r
- (EFI_UGA_PIXEL *) (UINTN) &Background,\r
- EfiUgaVideoFill,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- ModeData->GopWidth,\r
- ModeData->GopHeight,\r
- 0\r
- );\r
- }\r
-\r
- This->Mode->CursorColumn = 0;\r
- This->Mode->CursorRow = 0;\r
-\r
- EraseCursor (This);\r
-\r
- gBS->RestoreTPL (OldTpl);\r
-\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleConOutSetCursorPosition (\r
- IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
- IN UINTN Column,\r
- IN UINTN Row\r
- )\r
-/*++\r
- Routine Description:\r
- \r
- Implements SIMPLE_TEXT_OUTPUT.SetCursorPosition(). \r
- \r
- Arguments:\r
- \r
- This - Indicates the calling context.\r
- \r
- Column - The row to set cursor to.\r
- \r
- Row - The column to set cursor to. \r
-\r
- Returns:\r
- \r
- EFI_SUCCESS\r
- The operation completed successfully.\r
- \r
- EFI_DEVICE_ERROR\r
- The request fails due to Graphics Console device error. \r
- \r
- EFI_UNSUPPORTED\r
- The Graphics Console is not in a valid text mode, or the cursor position\r
- is invalid for current mode. \r
- \r
---*/\r
-{\r
- GRAPHICS_CONSOLE_DEV *Private;\r
- GRAPHICS_CONSOLE_MODE_DATA *ModeData;\r
- EFI_STATUS Status;\r
- EFI_TPL OldTpl;\r
-\r
- Status = EFI_SUCCESS;\r
-\r
- OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
-\r
- Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
- ModeData = &(Private->ModeData[This->Mode->Mode]);\r
-\r
- if ((Column >= ModeData->Columns) || (Row >= ModeData->Rows)) {\r
- Status = EFI_UNSUPPORTED;\r
- goto Done;\r
- }\r
-\r
- if (((INT32) Column == This->Mode->CursorColumn) && ((INT32) Row == This->Mode->CursorRow)) {\r
- Status = EFI_SUCCESS;\r
- goto Done;\r
- }\r
-\r
- EraseCursor (This);\r
-\r
- This->Mode->CursorColumn = (INT32) Column;\r
- This->Mode->CursorRow = (INT32) Row;\r
-\r
- EraseCursor (This);\r
-\r
-Done:\r
- gBS->RestoreTPL (OldTpl);\r
-\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-GraphicsConsoleConOutEnableCursor (\r
- IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
- IN BOOLEAN Visible\r
- )\r
-/*++\r
- Routine Description:\r
- \r
- Implements SIMPLE_TEXT_OUTPUT.EnableCursor().\r
- In this driver, the cursor cannot be hidden. \r
- \r
- Arguments:\r
- \r
- This - Indicates the calling context.\r
- \r
- Visible - If TRUE, the cursor is set to be visible,\r
- If FALSE, the cursor is set to be invisible. \r
-\r
- Returns:\r
- \r
- EFI_SUCCESS\r
- The request is valid.\r
- \r
- EFI_UNSUPPORTED\r
- The Graphics Console does not support a hidden cursor. \r
- \r
---*/\r
-{\r
- EFI_TPL OldTpl;\r
- \r
- OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
- \r
- EraseCursor (This);\r
-\r
- This->Mode->CursorVisible = Visible;\r
-\r
- EraseCursor (This);\r
-\r
- gBS->RestoreTPL (OldTpl);\r
- return EFI_SUCCESS;\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-GetTextColors (\r
- IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
- OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Foreground,\r
- OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Background\r
- )\r
-{\r
- INTN Attribute;\r
-\r
- Attribute = This->Mode->Attribute & 0x7F;\r
-\r
- *Foreground = mEfiColors[Attribute & 0x0f];\r
- *Background = mEfiColors[Attribute >> 4];\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-DrawUnicodeWeightAtCursorN (\r
- IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,\r
- IN CHAR16 *UnicodeWeight,\r
- IN UINTN Count\r
- )\r
-{\r
- GRAPHICS_CONSOLE_DEV *Private;\r
- EFI_STATUS Status;\r
- EFI_STATUS ReturnStatus;\r
- GLYPH_UNION *Glyph;\r
- GLYPH_UNION GlyphData;\r
- INTN GlyphX;\r
- INTN GlyphY;\r
- EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
- EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
- EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground;\r
- EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background;\r
- UINTN Index;\r
- UINTN ArrayIndex;\r
- UINTN Counts;\r
- UINT16 GlyphWidth;\r
- UINT32 GlyphStatus;\r
-\r
- Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
-\r
- ReturnStatus = EFI_SUCCESS;\r
- GlyphStatus = 0;\r
- GlyphWidth = 0x08;\r
-\r
- GetTextColors (This, &Foreground, &Background);\r
-\r
- Index = 0;\r
- ArrayIndex = 0;\r
- while (Index < Count) {\r
- if (This->Mode->Attribute & EFI_WIDE_ATTRIBUTE) {\r
- GlyphStatus = WIDE_CHAR;\r
- } else {\r
- GlyphStatus = NARROW_CHAR;\r
- }\r
-\r
- Status = mHii->GetGlyph (\r
- mHii,\r
- UnicodeWeight,\r
- (UINT16 *) &Index,\r
- (UINT8 **) &Glyph,\r
- &GlyphWidth,\r
- &GlyphStatus\r
- );\r
- if (EFI_ERROR (Status)) {\r
- ReturnStatus = Status;\r
- }\r
-\r
- Counts = 0;\r
-\r
- CopyMem (&GlyphData, Glyph, sizeof (GLYPH_UNION));\r
-\r
- do {\r
- //\r
- // We are creating the second half of the wide character's BLT buffer\r
- //\r
- if (GlyphWidth == 0x10 && Counts == 1) {\r
- CopyMem (&GlyphData.NarrowGlyph.GlyphCol1, &Glyph->WideGlyph.GlyphCol2, sizeof (Glyph->WideGlyph.GlyphCol2));\r
- }\r
-\r
- Counts++;\r
-\r
- if (GlyphWidth == 0x10) {\r
- mHii->GlyphToBlt (\r
- mHii,\r
- (UINT8 *) &GlyphData,\r
- Foreground,\r
- Background,\r
- Count * 2,\r
- GLYPH_WIDTH,\r
- GLYPH_HEIGHT,\r
- &Private->LineBuffer[ArrayIndex * GLYPH_WIDTH]\r
- );\r
- } else {\r
- mHii->GlyphToBlt (\r
- mHii,\r
- (UINT8 *) &GlyphData,\r
- Foreground,\r
- Background,\r
- Count,\r
- GLYPH_WIDTH,\r
- GLYPH_HEIGHT,\r
- &Private->LineBuffer[ArrayIndex * GLYPH_WIDTH]\r
- );\r
- }\r
-\r
- ArrayIndex++;\r
-\r
- } while (Counts < 2 && GlyphWidth == 0x10);\r
-\r
- }\r
- //\r
- // If we are printing Wide characters, treat the BLT as if it is twice as many characters\r
- //\r
- if (GlyphWidth == 0x10) {\r
- Count = Count * 2;\r
- }\r
- //\r
- // Blt a character to the screen\r
- //\r
- GlyphX = This->Mode->CursorColumn * GLYPH_WIDTH;\r
- GlyphY = This->Mode->CursorRow * GLYPH_HEIGHT;\r
- GraphicsOutput = Private->GraphicsOutput;\r
- UgaDraw = Private->UgaDraw;\r
- if (GraphicsOutput != NULL) {\r
- GraphicsOutput->Blt (\r
- GraphicsOutput,\r
- Private->LineBuffer,\r
- EfiBltBufferToVideo,\r
- 0,\r
- 0,\r
- GlyphX + Private->ModeData[This->Mode->Mode].DeltaX,\r
- GlyphY + Private->ModeData[This->Mode->Mode].DeltaY,\r
- GLYPH_WIDTH * Count,\r
- GLYPH_HEIGHT,\r
- GLYPH_WIDTH * Count * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
- );\r
- } else {\r
- UgaDraw->Blt (\r
- UgaDraw,\r
- (EFI_UGA_PIXEL *) (UINTN) Private->LineBuffer,\r
- EfiUgaBltBufferToVideo,\r
- 0,\r
- 0,\r
- GlyphX + Private->ModeData[This->Mode->Mode].DeltaX,\r
- GlyphY + Private->ModeData[This->Mode->Mode].DeltaY,\r
- GLYPH_WIDTH * Count,\r
- GLYPH_HEIGHT,\r
- GLYPH_WIDTH * Count * sizeof (EFI_UGA_PIXEL)\r
- );\r
- }\r
-\r
- return ReturnStatus;\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-EraseCursor (\r
- IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This\r
- )\r
-{\r
- GRAPHICS_CONSOLE_DEV *Private;\r
- EFI_SIMPLE_TEXT_OUTPUT_MODE *CurrentMode;\r
- INTN GlyphX;\r
- INTN GlyphY;\r
- EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
- EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
- EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION Foreground;\r
- EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION Background;\r
- EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION BltChar[GLYPH_HEIGHT][GLYPH_WIDTH];\r
- UINTN X;\r
- UINTN Y;\r
-\r
- CurrentMode = This->Mode;\r
-\r
- if (!CurrentMode->CursorVisible) {\r
- return EFI_SUCCESS;\r
- }\r
-\r
- Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
- GraphicsOutput = Private->GraphicsOutput;\r
- UgaDraw = Private->UgaDraw;\r
-\r
- //\r
- // BUGBUG - we need to think about what to do with wide and narrow character deletions.\r
- //\r
- //\r
- // Blt a character to the screen\r
- //\r
- GlyphX = (CurrentMode->CursorColumn * GLYPH_WIDTH) + Private->ModeData[CurrentMode->Mode].DeltaX;\r
- GlyphY = (CurrentMode->CursorRow * GLYPH_HEIGHT) + Private->ModeData[CurrentMode->Mode].DeltaY;\r
- if (GraphicsOutput != NULL) {\r
- GraphicsOutput->Blt (\r
- GraphicsOutput,\r
- (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) BltChar,\r
- EfiBltVideoToBltBuffer,\r
- GlyphX,\r
- GlyphY,\r
- 0,\r
- 0,\r
- GLYPH_WIDTH,\r
- GLYPH_HEIGHT,\r
- GLYPH_WIDTH * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
- );\r
- } else {\r
- UgaDraw->Blt (\r
- UgaDraw,\r
- (EFI_UGA_PIXEL *) (UINTN) BltChar,\r
- EfiUgaVideoToBltBuffer,\r
- GlyphX,\r
- GlyphY,\r
- 0,\r
- 0,\r
- GLYPH_WIDTH,\r
- GLYPH_HEIGHT,\r
- GLYPH_WIDTH * sizeof (EFI_UGA_PIXEL)\r
- );\r
- }\r
-\r
- GetTextColors (This, &Foreground.Pixel, &Background.Pixel);\r
-\r
- //\r
- // Convert Monochrome bitmap of the Glyph to BltBuffer structure\r
- //\r
- for (Y = 0; Y < GLYPH_HEIGHT; Y++) {\r
- for (X = 0; X < GLYPH_WIDTH; X++) {\r
- if ((mCursorGlyph.GlyphCol1[Y] & (1 << X)) != 0) {\r
- BltChar[Y][GLYPH_WIDTH - X - 1].Raw ^= Foreground.Raw;\r
- }\r
- }\r
- }\r
-\r
- if (GraphicsOutput != NULL) {\r
- GraphicsOutput->Blt (\r
- GraphicsOutput,\r
- (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) BltChar,\r
- EfiBltBufferToVideo,\r
- 0,\r
- 0,\r
- GlyphX,\r
- GlyphY,\r
- GLYPH_WIDTH,\r
- GLYPH_HEIGHT,\r
- GLYPH_WIDTH * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
- );\r
- } else {\r
- UgaDraw->Blt (\r
- UgaDraw,\r
- (EFI_UGA_PIXEL *) (UINTN) BltChar,\r
- EfiUgaBltBufferToVideo,\r
- 0,\r
- 0,\r
- GlyphX,\r
- GlyphY,\r
- GLYPH_WIDTH,\r
- GLYPH_HEIGHT,\r
- GLYPH_WIDTH * sizeof (EFI_UGA_PIXEL)\r
- );\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r