/**@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
+ Add all standard Glyphs from UEFI 2.0 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
+\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
+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
-**/\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
-// Include common header file for this module.\r
-//\r
-#include "CommonHeader.h"\r
+**/\r
\r
#include "GraphicsConsole.h"\r
\r
IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This\r
);\r
\r
+EFI_STATUS\r
+CheckModeSupported (\r
+ EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput,\r
+ IN UINT32 HorizontalResolution,\r
+ IN UINT32 VerticalResolution,\r
+ OUT UINT32 *CurrentModeNumber\r
+ );\r
+\r
//\r
// Globals\r
//\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
+ { 80, 50, 0, 0, 0, 0 }, // Mode 1\r
+ { 100,31, 0, 0, 0, 0 }, // Mode 2\r
+ { 0, 0, 0, 0, 0, 0 } // Mode 3\r
},\r
(EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) NULL,\r
- (EFI_HII_HANDLE) 0\r
+ (EFI_HII_HANDLE ) 0\r
};\r
\r
-EFI_HII_PROTOCOL *mHii;\r
+EFI_HII_DATABASE_PROTOCOL *mHiiDatabase;\r
+EFI_HII_FONT_PROTOCOL *mHiiFont;\r
+BOOLEAN mFirstAccessFlag = TRUE;\r
+\r
+STATIC EFI_GUID mFontPackageListGuid = {0xf5f219d3, 0x7006, 0x4648, 0xac, 0x8d, 0xd6, 0x1d, 0xfb, 0x7b, 0xc6, 0xad};\r
\r
static CHAR16 mCrLfString[3] = { CHAR_CARRIAGE_RETURN, CHAR_LINEFEED, CHAR_NULL };\r
\r
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
)\r
{\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
- EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+ EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
\r
- UgaDraw = NULL;\r
+ GraphicsOutput = NULL;\r
+ UgaDraw = NULL;\r
//\r
// Open the IO Abstraction(s) needed to perform the supported test\r
//\r
Controller,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
);\r
- \r
- if (EFI_ERROR (Status)) {\r
- GraphicsOutput = NULL;\r
+\r
+ if (EFI_ERROR (Status) && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
//\r
// Open Graphics Output Protocol failed, try to open UGA Draw Protocol\r
//\r
Controller,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
+ }\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
}\r
\r
//\r
} else {\r
goto Error;\r
}\r
+\r
//\r
// Does Hii Exist? If not, we aren't ready to run\r
//\r
This->DriverBindingHandle,\r
Controller\r
);\r
- } else {\r
+ } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
gBS->CloseProtocol (\r
Controller,\r
&gEfiUgaDrawProtocolGuid,\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
+ EFI_STATUS Status;\r
+ GRAPHICS_CONSOLE_DEV *Private;\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
UINT32 ModeNumber;\r
- UINTN SizeOfInfo;\r
- EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
- \r
+ EFI_HII_SIMPLE_FONT_PACKAGE_HDR *SimplifiedFont;\r
+ UINTN PackageLength;\r
+ EFI_HII_PACKAGE_LIST_HEADER *PackageList;\r
+ UINT8 *Package;\r
+ UINT8 *Location;\r
+\r
ModeNumber = 0;\r
\r
//\r
Controller,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
);\r
- if (EFI_ERROR(Status)) {\r
- Private->GraphicsOutput = NULL;\r
\r
+ if (EFI_ERROR(Status) && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
Status = gBS->OpenProtocol (\r
Controller,\r
&gEfiUgaDrawProtocolGuid,\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
+ if (mFirstAccessFlag) {\r
+ //\r
+ // Add 4 bytes to the header for entire length for HiiLibPreparePackageList use only.\r
+ // Looks ugly. Might be updated when font tool is ready.\r
+ //\r
+ PackageLength = sizeof (EFI_HII_SIMPLE_FONT_PACKAGE_HDR) + NarrowFontSize + 4;\r
+ Package = AllocateZeroPool (PackageLength);\r
+ if (Package == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ CopyMem (Package, &PackageLength, 4);\r
+ SimplifiedFont = (EFI_HII_SIMPLE_FONT_PACKAGE_HDR*) (Package + 4);\r
+ SimplifiedFont->Header.Length = (UINT32) (PackageLength - 4);\r
+ SimplifiedFont->Header.Type = EFI_HII_PACKAGE_SIMPLE_FONTS;\r
+ SimplifiedFont->NumberOfNarrowGlyphs = (UINT16) (NarrowFontSize / sizeof (EFI_NARROW_GLYPH));\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
+ Location = (UINT8 *) (&SimplifiedFont->NumberOfWideGlyphs + 1);\r
+ CopyMem (Location, UsStdNarrowGlyphData, NarrowFontSize);\r
\r
- //\r
- // Free the font database\r
- //\r
- FreePool (FontPack);\r
+ //\r
+ // Add this simplified font package to a package list then install it.\r
+ //\r
+ PackageList = HiiLibPreparePackageList (1, &mFontPackageListGuid, Package);\r
+ Status = mHiiDatabase->NewPackageList (mHiiDatabase, PackageList, NULL, &(Private->HiiHandle));\r
+ ASSERT_EFI_ERROR (Status);\r
+ SafeFreePool (PackageList);\r
+ SafeFreePool (Package);\r
\r
+ mFirstAccessFlag = FALSE;\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
if (Private->GraphicsOutput != NULL) {\r
//\r
- // The console is build on top of Graphics Output Protocol, find the mode number for 800x600\r
+ // The console is build on top of Graphics Output Protocol, find the mode number\r
+ // for the user-defined mode; if there are multiple video devices,\r
+ // graphic console driver will set all the video devices to the same mode.\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
+ Status = CheckModeSupported (\r
+ Private->GraphicsOutput,\r
+ CURRENT_HORIZONTAL_RESOLUTION,\r
+ CURRENT_VERTICAL_RESOLUTION,\r
+ &ModeNumber\r
+ );\r
+ if (!EFI_ERROR(Status)) {\r
+ //\r
+ // Update default mode to current mode\r
+ //\r
+ HorizontalResolution = CURRENT_HORIZONTAL_RESOLUTION;\r
+ VerticalResolution = CURRENT_VERTICAL_RESOLUTION;\r
+ } else {\r
+ //\r
+ // if not supporting current mode, try 800x600 which is required by UEFI/EFI spec\r
+ //\r
+ Status = CheckModeSupported (\r
+ Private->GraphicsOutput,\r
+ 800,\r
+ 600,\r
+ &ModeNumber\r
+ );\r
}\r
\r
if (EFI_ERROR (Status) || (ModeNumber == Private->GraphicsOutput->Mode->MaxMode)) {\r
VerticalResolution = Private->GraphicsOutput->Mode->Info->VerticalResolution;\r
ModeNumber = Private->GraphicsOutput->Mode->Mode;\r
}\r
- } else {\r
+ } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
//\r
- // The console is build on top of UGA Draw Protocol\r
+ // At first try to set user-defined resolution\r
//\r
ColorDepth = 32;\r
RefreshRate = 60;\r
Status = Private->UgaDraw->SetMode (\r
Private->UgaDraw,\r
- HorizontalResolution,\r
- VerticalResolution,\r
+ CURRENT_HORIZONTAL_RESOLUTION,\r
+ CURRENT_VERTICAL_RESOLUTION,\r
ColorDepth,\r
RefreshRate\r
);\r
- if (EFI_ERROR (Status)) {\r
+ if (!EFI_ERROR (Status)) {\r
+ HorizontalResolution = CURRENT_HORIZONTAL_RESOLUTION;\r
+ VerticalResolution = CURRENT_VERTICAL_RESOLUTION;\r
+ } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
//\r
- // Get the current mode information from the UGA Draw Protocol\r
+ // Try to set 800*600 which is required by UEFI/EFI spec\r
//\r
- Status = Private->UgaDraw->GetMode (\r
+ Status = Private->UgaDraw->SetMode (\r
Private->UgaDraw,\r
- &HorizontalResolution,\r
- &VerticalResolution,\r
- &ColorDepth,\r
- &RefreshRate\r
+ HorizontalResolution,\r
+ VerticalResolution,\r
+ ColorDepth,\r
+ RefreshRate\r
);\r
if (EFI_ERROR (Status)) {\r
- goto Error;\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
+ } else {\r
+ Status = EFI_UNSUPPORTED;\r
+ goto Error;\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
+ Columns = HorizontalResolution / EFI_GLYPH_WIDTH;\r
+ Rows = VerticalResolution / EFI_GLYPH_HEIGHT;\r
\r
//\r
// See if the mode is too small to support the required 80x25 text mode\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
+ Private->ModeData[MaxMode].DeltaX = (HorizontalResolution - (80 * EFI_GLYPH_WIDTH)) >> 1;\r
+ Private->ModeData[MaxMode].DeltaY = (VerticalResolution - (25 * EFI_GLYPH_HEIGHT)) >> 1;\r
MaxMode++;\r
\r
//\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
+ Private->ModeData[MaxMode].DeltaX = (HorizontalResolution - (80 * EFI_GLYPH_WIDTH)) >> 1;\r
+ Private->ModeData[MaxMode].DeltaY = (VerticalResolution - (50 * EFI_GLYPH_HEIGHT)) >> 1;\r
MaxMode++;\r
}\r
+\r
//\r
- // If the graphics mode is 800x600, than add a text mode that uses the entire display\r
+ // If it is not to support Mode #1 - 80x50, then skip it\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
+ if (MaxMode < 2) {\r
+ Private->ModeData[MaxMode].Columns = 0;\r
+ Private->ModeData[MaxMode].Rows = 0;\r
+ Private->ModeData[MaxMode].GopWidth = HorizontalResolution;\r
+ Private->ModeData[MaxMode].GopHeight = VerticalResolution;\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
+ //\r
+ // Add Mode #2 that must be 100x31 (graphic mode >= 800x600)\r
+ //\r
+ if (Columns >= 100 && Rows >= 31) {\r
+ Private->ModeData[MaxMode].GopWidth = HorizontalResolution;\r
+ Private->ModeData[MaxMode].GopHeight = VerticalResolution;\r
+ Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
+ Private->ModeData[MaxMode].DeltaX = (HorizontalResolution - (100 * EFI_GLYPH_WIDTH)) >> 1;\r
+ Private->ModeData[MaxMode].DeltaY = (VerticalResolution - (31 * EFI_GLYPH_HEIGHT)) >> 1;\r
+ MaxMode++;\r
+ }\r
+\r
+ //\r
+ // Add Mode #3 that uses the entire display for user-defined mode\r
+ //\r
+ if (HorizontalResolution > 800 && VerticalResolution > 600) {\r
+ Private->ModeData[MaxMode].Columns = HorizontalResolution/EFI_GLYPH_WIDTH;\r
+ Private->ModeData[MaxMode].Rows = VerticalResolution/EFI_GLYPH_HEIGHT;\r
+ Private->ModeData[MaxMode].GopWidth = HorizontalResolution;\r
+ Private->ModeData[MaxMode].GopHeight = VerticalResolution;\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
+ Private->ModeData[MaxMode].DeltaX = (HorizontalResolution % EFI_GLYPH_WIDTH) >> 1;\r
+ Private->ModeData[MaxMode].DeltaY = (VerticalResolution % EFI_GLYPH_HEIGHT) >> 1;\r
MaxMode++;\r
}\r
+\r
//\r
// Update the maximum number of modes\r
//\r
This->DriverBindingHandle,\r
Controller\r
);\r
- } else {\r
+ } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
gBS->CloseProtocol (\r
Controller,\r
&gEfiUgaDrawProtocolGuid,\r
This->DriverBindingHandle,\r
Controller\r
);\r
- } else {\r
+ } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
gBS->CloseProtocol (\r
Controller,\r
&gEfiUgaDrawProtocolGuid,\r
//\r
// Remove the font pack\r
//\r
- mHii->RemovePack (mHii, Private->HiiHandle);\r
+ if (Private->HiiHandle != NULL) {\r
+ HiiLibRemovePackages (Private->HiiHandle);\r
+ mFirstAccessFlag = TRUE;\r
+ }\r
\r
//\r
// Free our instance data\r
return Status;\r
}\r
\r
+EFI_STATUS\r
+CheckModeSupported (\r
+ EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput,\r
+ IN UINT32 HorizontalResolution,\r
+ IN UINT32 VerticalResolution,\r
+ OUT UINT32 *CurrentModeNumber\r
+ )\r
+{\r
+ UINT32 ModeNumber;\r
+ EFI_STATUS Status;\r
+ UINTN SizeOfInfo;\r
+ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
+\r
+ Status = EFI_SUCCESS;\r
+\r
+ for (ModeNumber = 0; ModeNumber < GraphicsOutput->Mode->MaxMode; ModeNumber++) {\r
+ Status = GraphicsOutput->QueryMode (\r
+ GraphicsOutput,\r
+ ModeNumber,\r
+ &SizeOfInfo,\r
+ &Info\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ if ((Info->HorizontalResolution == HorizontalResolution) &&\r
+ (Info->VerticalResolution == VerticalResolution)) {\r
+ Status = GraphicsOutput->SetMode (GraphicsOutput, ModeNumber);\r
+ if (!EFI_ERROR (Status)) {\r
+ gBS->FreePool (Info);\r
+ break;\r
+ }\r
+ }\r
+ gBS->FreePool (Info);\r
+ }\r
+ }\r
+\r
+ if (ModeNumber == GraphicsOutput->Mode->MaxMode) {\r
+ Status = EFI_UNSUPPORTED;\r
+ }\r
+\r
+ *CurrentModeNumber = ModeNumber;\r
+ return Status;\r
+}\r
+\r
EFI_STATUS\r
EfiLocateHiiProtocol (\r
VOID\r
/*++\r
\r
Routine Description:\r
- Find if the HII protocol is available. If yes, locate the HII protocol\r
+ Locate HII protocols for future usage.\r
\r
Arguments:\r
\r
\r
Status = gBS->LocateHandle (\r
ByProtocol,\r
- &gEfiHiiProtocolGuid,\r
+ &gEfiHiiDatabaseProtocolGuid,\r
NULL,\r
&Size,\r
- &Handle\r
+ (VOID **) &Handle\r
);\r
\r
if (EFI_ERROR (Status)) {\r
\r
Status = gBS->HandleProtocol (\r
Handle,\r
- &gEfiHiiProtocolGuid,\r
- (VOID **)&mHii\r
+ &gEfiHiiDatabaseProtocolGuid,\r
+ (VOID **) &mHiiDatabase\r
);\r
\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ Status = gBS->HandleProtocol (\r
+ Handle,\r
+ &gEfiHiiFontProtocolGuid,\r
+ (VOID **) &mHiiFont\r
+ );\r
return Status;\r
}\r
+\r
//\r
// Body of the STO functions\r
//\r
)\r
/*++\r
Routine Description:\r
- \r
+\r
Implements SIMPLE_TEXT_OUTPUT.Reset().\r
- If ExtendeVerification is TRUE, then perform dependent Graphics Console \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
+\r
Arguments:\r
- \r
+\r
This - Indicates the calling context.\r
- \r
+\r
ExtendedVerification - Indicates that the driver may perform a more exhaustive\r
verification operation of the device during reset.\r
- \r
+\r
Returns:\r
- \r
+\r
EFI_SUCCESS\r
- The reset operation succeeds. \r
- \r
+ The reset operation succeeds.\r
+\r
EFI_DEVICE_ERROR\r
- The Graphics Console is not functioning correctly \r
- \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
)\r
/*++\r
Routine Description:\r
- \r
+\r
Implements SIMPLE_TEXT_OUTPUT.OutputString().\r
- The Unicode string will be converted to Glyphs and will be \r
+ The Unicode string will be converted to Glyphs and will be\r
sent to the Graphics Console.\r
- \r
- \r
+\r
+\r
Arguments:\r
- \r
+\r
This - Indicates the calling context.\r
- \r
- WString - The Null-terminated Unicode string to be displayed on \r
+\r
+ WString - The Null-terminated Unicode string to be displayed on\r
the Graphics Console.\r
- \r
+\r
Returns:\r
- \r
+\r
EFI_SUCCESS\r
- The string is output successfully. \r
- \r
+ The string is output successfully.\r
+\r
EFI_DEVICE_ERROR\r
The Graphics Console failed to send the string out.\r
- \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
+ 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
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
+ Width = MaxColumn * EFI_GLYPH_WIDTH;\r
+ Height = (MaxRow - 1) * EFI_GLYPH_HEIGHT;\r
Delta = Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);\r
\r
//\r
NULL,\r
EfiBltVideoToVideo,\r
DeltaX,\r
- DeltaY + GLYPH_HEIGHT,\r
+ DeltaY + EFI_GLYPH_HEIGHT,\r
DeltaX,\r
DeltaY,\r
Width,\r
DeltaX,\r
DeltaY + Height,\r
Width,\r
- GLYPH_HEIGHT,\r
+ EFI_GLYPH_HEIGHT,\r
Delta\r
);\r
- } else {\r
+ } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
//\r
// Scroll Screen Up One Row\r
//\r
NULL,\r
EfiUgaVideoToVideo,\r
DeltaX,\r
- DeltaY + GLYPH_HEIGHT,\r
+ DeltaY + EFI_GLYPH_HEIGHT,\r
DeltaX,\r
DeltaY,\r
Width,\r
DeltaX,\r
DeltaY + Height,\r
Width,\r
- GLYPH_HEIGHT,\r
+ EFI_GLYPH_HEIGHT,\r
Delta\r
);\r
}\r
)\r
/*++\r
Routine Description:\r
- \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
+\r
+\r
Arguments:\r
- \r
+\r
This - Indicates the calling context.\r
- \r
+\r
WString - The Null-terminated Unicode string to be tested.\r
- \r
+\r
Returns:\r
- \r
+\r
EFI_SUCCESS\r
- The Graphics Console is capable of rendering the output string. \r
- \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
+ 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
+ EFI_IMAGE_OUTPUT *Blt = NULL;\r
+\r
+ Count = 0;\r
+\r
+ while (WString[Count] != 0) {\r
+ Status = mHiiFont->GetGlyph (\r
+ mHiiFont,\r
+ WString[Count],\r
+ NULL,\r
+ &Blt,\r
+ NULL\r
+ );\r
+ SafeFreePool (Blt);\r
+ Blt = NULL;\r
+ Count++;\r
\r
if (EFI_ERROR (Status)) {\r
return EFI_UNSUPPORTED;\r
)\r
/*++\r
Routine Description:\r
- \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
+\r
+\r
Arguments:\r
- \r
+\r
This - Indicates the calling context.\r
- \r
+\r
ModeNumber - The mode number to return information on.\r
- \r
+\r
Columns - The returned columns of the requested mode.\r
- \r
- Rows - The returned rows of the requested mode. \r
- \r
+\r
+ Rows - The returned rows of the requested mode.\r
+\r
Returns:\r
- \r
+\r
EFI_SUCCESS\r
- The requested mode information is returned. \r
- \r
+ The requested mode information is returned.\r
+\r
EFI_UNSUPPORTED\r
- The mode number is not valid. \r
- \r
+ The mode number is not valid.\r
+\r
--*/\r
{\r
GRAPHICS_CONSOLE_DEV *Private;\r
\r
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
Status = EFI_SUCCESS;\r
- \r
+\r
Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
\r
*Columns = Private->ModeData[ModeNumber].Columns;\r
)\r
/*++\r
Routine Description:\r
- \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
+ In this driver, we only support mode 0.\r
+\r
Arguments:\r
- \r
+\r
This - Indicates the calling context.\r
- \r
+\r
ModeNumber - The text mode to set.\r
- \r
+\r
Returns:\r
- \r
+\r
EFI_SUCCESS\r
The requested text mode is set.\r
- \r
+\r
EFI_DEVICE_ERROR\r
The requested text mode cannot be set because of Graphics Console device error.\r
- \r
+\r
EFI_UNSUPPORTED\r
- The text mode number is not valid. \r
- \r
+ The text mode number is not valid.\r
+\r
--*/\r
{\r
EFI_STATUS Status;\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
+ NewLineBuffer = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) * ModeData->Columns * EFI_GLYPH_WIDTH * EFI_GLYPH_HEIGHT);\r
\r
if (NewLineBuffer == NULL) {\r
//\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
+ // Otherwise, the size of the text console and/or the GOP/UGA mode will be changed,\r
+ // so erase the cursor, and free the LineBuffer for the current mode\r
//\r
- This->EnableCursor (This, FALSE);\r
+ EraseCursor (This);\r
\r
FreePool (Private->LineBuffer);\r
}\r
0\r
);\r
}\r
- } else {\r
+ } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
//\r
// Get the current UGA Draw mode information\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
)\r
/*++\r
Routine Description:\r
- \r
- Implements SIMPLE_TEXT_OUTPUT.SetAttribute(). \r
- \r
+\r
+ Implements SIMPLE_TEXT_OUTPUT.SetAttribute().\r
+\r
Arguments:\r
- \r
+\r
This - Indicates the calling context.\r
- \r
+\r
Attrubute - The attribute to set. Only bit0..6 are valid, all other bits\r
are undefined and must be zero.\r
- \r
+\r
Returns:\r
- \r
+\r
EFI_SUCCESS\r
- The requested attribute is set. \r
- \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
+\r
EFI_UNSUPPORTED\r
- The attribute requested is not defined by EFI spec. \r
- \r
+ The attribute requested is not defined by EFI spec.\r
+\r
--*/\r
{\r
EFI_TPL OldTpl;\r
- \r
+\r
if ((Attribute | 0xFF) != 0xFF) {\r
return EFI_UNSUPPORTED;\r
}\r
)\r
/*++\r
Routine Description:\r
- \r
+\r
Implements SIMPLE_TEXT_OUTPUT.ClearScreen().\r
- It clears the Graphics Console's display to the \r
+ It clears the Graphics Console's display to the\r
currently selected background color.\r
- \r
- \r
+\r
+\r
Arguments:\r
- \r
+\r
This - Indicates the calling context.\r
\r
Returns:\r
- \r
+\r
EFI_SUCCESS\r
The operation completed successfully.\r
- \r
+\r
EFI_DEVICE_ERROR\r
- The Graphics Console cannot be cleared due to Graphics Console device error. \r
- \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
+ The Graphics Console is not in a valid text mode.\r
+\r
--*/\r
{\r
EFI_STATUS Status;\r
ModeData->GopHeight,\r
0\r
);\r
- } else {\r
+ } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
Status = UgaDraw->Blt (\r
UgaDraw,\r
(EFI_UGA_PIXEL *) (UINTN) &Background,\r
ModeData->GopHeight,\r
0\r
);\r
+ } else {\r
+ Status = EFI_UNSUPPORTED;\r
}\r
\r
This->Mode->CursorColumn = 0;\r
)\r
/*++\r
Routine Description:\r
- \r
- Implements SIMPLE_TEXT_OUTPUT.SetCursorPosition(). \r
- \r
+\r
+ Implements SIMPLE_TEXT_OUTPUT.SetCursorPosition().\r
+\r
Arguments:\r
- \r
+\r
This - Indicates the calling context.\r
- \r
+\r
Column - The row to set cursor to.\r
- \r
- Row - The column to set cursor to. \r
+\r
+ Row - The column to set cursor to.\r
\r
Returns:\r
- \r
+\r
EFI_SUCCESS\r
The operation completed successfully.\r
- \r
+\r
EFI_DEVICE_ERROR\r
- The request fails due to Graphics Console device error. \r
- \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
+ is invalid for current mode.\r
+\r
--*/\r
{\r
GRAPHICS_CONSOLE_DEV *Private;\r
)\r
/*++\r
Routine Description:\r
- \r
+\r
Implements SIMPLE_TEXT_OUTPUT.EnableCursor().\r
- In this driver, the cursor cannot be hidden. \r
- \r
+ In this driver, the cursor cannot be hidden.\r
+\r
Arguments:\r
- \r
+\r
This - Indicates the calling context.\r
- \r
+\r
Visible - If TRUE, the cursor is set to be visible,\r
- If FALSE, the cursor is set to be invisible. \r
+ If FALSE, the cursor is set to be invisible.\r
\r
Returns:\r
- \r
+\r
EFI_SUCCESS\r
The request is valid.\r
- \r
+\r
EFI_UNSUPPORTED\r
- The Graphics Console does not support a hidden cursor. \r
- \r
+ The Graphics Console does not support a hidden cursor.\r
+\r
--*/\r
{\r
EFI_TPL OldTpl;\r
- \r
+\r
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
- \r
+\r
EraseCursor (This);\r
\r
This->Mode->CursorVisible = Visible;\r
return EFI_SUCCESS;\r
}\r
\r
-STATIC\r
EFI_STATUS\r
DrawUnicodeWeightAtCursorN (\r
IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
- IN CHAR16 *UnicodeWeight,\r
- IN UINTN Count\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
+ EFI_STATUS Status;\r
+ GRAPHICS_CONSOLE_DEV *Private;\r
+ EFI_IMAGE_OUTPUT *Blt;\r
+ EFI_STRING String;\r
+ EFI_FONT_DISPLAY_INFO *FontInfo;\r
+ EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
+ EFI_HII_ROW_INFO *RowInfoArray;\r
+ UINTN RowInfoArraySize;\r
\r
- Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
+ Private = GRAPHICS_CONSOLE_CON_OUT_DEV_FROM_THIS (This);\r
+ Blt = (EFI_IMAGE_OUTPUT *) AllocateZeroPool (sizeof (EFI_IMAGE_OUTPUT));\r
+ if (Blt == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
\r
- ReturnStatus = EFI_SUCCESS;\r
- GlyphStatus = 0;\r
- GlyphWidth = 0x08;\r
+ Blt->Width = (UINT16) (Private->ModeData[This->Mode->Mode].GopWidth);\r
+ Blt->Height = (UINT16) (Private->ModeData[This->Mode->Mode].GopHeight);\r
\r
- GetTextColors (This, &Foreground, &Background);\r
+ String = AllocateCopyPool ((Count + 1) * sizeof (CHAR16), UnicodeWeight);\r
+ if (String == NULL) {\r
+ SafeFreePool (Blt);\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ *(String + Count) = 0;\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
+ FontInfo = (EFI_FONT_DISPLAY_INFO *) AllocateZeroPool (sizeof (EFI_FONT_DISPLAY_INFO));\r
+ if (FontInfo == NULL) {\r
+ SafeFreePool (Blt);\r
+ SafeFreePool (String);\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ GetTextColors (This, &FontInfo->ForegroundColor, &FontInfo->BackgroundColor);\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
+ if (Private->GraphicsOutput != NULL) {\r
+ Blt->Image.Screen = Private->GraphicsOutput;\r
+\r
+ Status = mHiiFont->StringToImage (\r
+ mHiiFont,\r
+ EFI_HII_IGNORE_IF_NO_GLYPH | EFI_HII_DIRECT_TO_SCREEN,\r
+ String,\r
+ FontInfo,\r
+ &Blt,\r
+ This->Mode->CursorColumn * EFI_GLYPH_WIDTH + Private->ModeData[This->Mode->Mode].DeltaX,\r
+ This->Mode->CursorRow * EFI_GLYPH_HEIGHT + Private->ModeData[This->Mode->Mode].DeltaY,\r
+ NULL,\r
+ NULL,\r
+ NULL\r
+ );\r
\r
- Counts = 0;\r
+ } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
+ ASSERT (Private->UgaDraw!= NULL);\r
\r
- CopyMem (&GlyphData, Glyph, sizeof (GLYPH_UNION));\r
+ UgaDraw = Private->UgaDraw;\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
+ Blt->Image.Bitmap = AllocateZeroPool (Blt->Width * Blt->Height * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));\r
+ if (Blt->Image.Bitmap == NULL) {\r
+ SafeFreePool (Blt);\r
+ SafeFreePool (String);\r
+ return EFI_OUT_OF_RESOURCES;\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
+ RowInfoArray = NULL;\r
+ //\r
+ // StringToImage only support blt'ing image to device using GOP protocol. If GOP is not supported in this platform,\r
+ // we ask StringToImage to print the string to blt buffer, then blt to device using UgaDraw.\r
+ //\r
+ Status = mHiiFont->StringToImage (\r
+ mHiiFont,\r
+ EFI_HII_IGNORE_IF_NO_GLYPH,\r
+ String,\r
+ FontInfo,\r
+ &Blt,\r
+ This->Mode->CursorColumn * EFI_GLYPH_WIDTH + Private->ModeData[This->Mode->Mode].DeltaX,\r
+ This->Mode->CursorRow * EFI_GLYPH_HEIGHT + Private->ModeData[This->Mode->Mode].DeltaY,\r
+ &RowInfoArray,\r
+ &RowInfoArraySize,\r
+ NULL\r
+ );\r
\r
- ArrayIndex++;\r
+ if (!EFI_ERROR (Status)) {\r
+ //\r
+ // Line breaks are handled by caller of DrawUnicodeWeightAtCursorN, so the updated parameter RowInfoArraySize by StringToImage will\r
+ // always be 1. ASSERT here to make sure.\r
+ //\r
+ ASSERT (RowInfoArraySize == 1);\r
\r
- } while (Counts < 2 && GlyphWidth == 0x10);\r
+ Status = UgaDraw->Blt (\r
+ UgaDraw,\r
+ (EFI_UGA_PIXEL *) Blt->Image.Bitmap,\r
+ EfiUgaBltBufferToVideo,\r
+ This->Mode->CursorColumn * EFI_GLYPH_WIDTH + Private->ModeData[This->Mode->Mode].DeltaX,\r
+ (This->Mode->CursorRow) * EFI_GLYPH_HEIGHT + Private->ModeData[This->Mode->Mode].DeltaY,\r
+ This->Mode->CursorColumn * EFI_GLYPH_WIDTH + Private->ModeData[This->Mode->Mode].DeltaX,\r
+ (This->Mode->CursorRow) * EFI_GLYPH_HEIGHT + Private->ModeData[This->Mode->Mode].DeltaY,\r
+ RowInfoArray[0].LineWidth,\r
+ RowInfoArray[0].LineHeight,\r
+ Blt->Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
+ );\r
+ }\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
+ SafeFreePool (RowInfoArray);\r
+ SafeFreePool (Blt->Image.Bitmap);\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
+ Status = EFI_UNSUPPORTED;\r
}\r
\r
- return ReturnStatus;\r
+ SafeFreePool (Blt);\r
+ SafeFreePool (String);\r
+ SafeFreePool (FontInfo);\r
+ return Status;\r
}\r
\r
+\r
STATIC\r
EFI_STATUS\r
EraseCursor (\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
+ EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION BltChar[EFI_GLYPH_HEIGHT][EFI_GLYPH_WIDTH];\r
UINTN X;\r
UINTN Y;\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
+ GlyphX = (CurrentMode->CursorColumn * EFI_GLYPH_WIDTH) + Private->ModeData[CurrentMode->Mode].DeltaX;\r
+ GlyphY = (CurrentMode->CursorRow * EFI_GLYPH_HEIGHT) + Private->ModeData[CurrentMode->Mode].DeltaY;\r
if (GraphicsOutput != NULL) {\r
GraphicsOutput->Blt (\r
GraphicsOutput,\r
GlyphY,\r
0,\r
0,\r
- GLYPH_WIDTH,\r
- GLYPH_HEIGHT,\r
- GLYPH_WIDTH * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
+ EFI_GLYPH_WIDTH,\r
+ EFI_GLYPH_HEIGHT,\r
+ EFI_GLYPH_WIDTH * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
);\r
- } else {\r
+ } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
UgaDraw->Blt (\r
UgaDraw,\r
(EFI_UGA_PIXEL *) (UINTN) BltChar,\r
GlyphY,\r
0,\r
0,\r
- GLYPH_WIDTH,\r
- GLYPH_HEIGHT,\r
- GLYPH_WIDTH * sizeof (EFI_UGA_PIXEL)\r
+ EFI_GLYPH_WIDTH,\r
+ EFI_GLYPH_HEIGHT,\r
+ EFI_GLYPH_WIDTH * sizeof (EFI_UGA_PIXEL)\r
);\r
}\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
+ for (Y = 0; Y < EFI_GLYPH_HEIGHT; Y++) {\r
+ for (X = 0; X < EFI_GLYPH_WIDTH; X++) {\r
if ((mCursorGlyph.GlyphCol1[Y] & (1 << X)) != 0) {\r
- BltChar[Y][GLYPH_WIDTH - X - 1].Raw ^= Foreground.Raw;\r
+ BltChar[Y][EFI_GLYPH_WIDTH - X - 1].Raw ^= Foreground.Raw;\r
}\r
}\r
}\r
0,\r
GlyphX,\r
GlyphY,\r
- GLYPH_WIDTH,\r
- GLYPH_HEIGHT,\r
- GLYPH_WIDTH * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
+ EFI_GLYPH_WIDTH,\r
+ EFI_GLYPH_HEIGHT,\r
+ EFI_GLYPH_WIDTH * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
);\r
- } else {\r
+ } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
UgaDraw->Blt (\r
UgaDraw,\r
(EFI_UGA_PIXEL *) (UINTN) BltChar,\r
0,\r
GlyphX,\r
GlyphY,\r
- GLYPH_WIDTH,\r
- GLYPH_HEIGHT,\r
- GLYPH_WIDTH * sizeof (EFI_UGA_PIXEL)\r
+ EFI_GLYPH_WIDTH,\r
+ EFI_GLYPH_HEIGHT,\r
+ EFI_GLYPH_WIDTH * sizeof (EFI_UGA_PIXEL)\r
);\r
}\r
\r
return EFI_SUCCESS;\r
}\r
+\r
+/**\r
+ The user Entry Point for module GraphicsConsole. The user code starts with this function.\r
+\r
+ @param[in] ImageHandle The firmware allocated handle for the EFI image.\r
+ @param[in] SystemTable A pointer to the EFI System Table.\r
+\r
+ @retval EFI_SUCCESS The entry point is executed successfully.\r
+ @retval other Some error occurs when executing this entry point.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+InitializeGraphicsConsole (\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+\r
+ //\r
+ // Install driver model protocol(s).\r
+ //\r
+ Status = EfiLibInstallDriverBindingComponentName2 (\r
+ ImageHandle,\r
+ SystemTable,\r
+ &gGraphicsConsoleDriverBinding,\r
+ ImageHandle,\r
+ &gGraphicsConsoleComponentName,\r
+ &gGraphicsConsoleComponentName2\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+\r
+ return Status;\r
+}\r
+\r
+\r