/** @file\r
This is the main routine for initializing the Graphics Console support routines.\r
-Remaining Tasks\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
Copyright (c) 2006 - 2008 Intel Corporation. <BR>\r
All rights reserved. This program and the accompanying materials\r
\r
#include "GraphicsConsole.h"\r
\r
-EFI_STATUS\r
-GetTextColors (\r
- IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
- OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Foreground,\r
- OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Background\r
- );\r
-\r
-EFI_STATUS\r
-DrawUnicodeWeightAtCursorN (\r
- IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
- IN CHAR16 *UnicodeWeight,\r
- IN UINTN Count\r
- );\r
-\r
-EFI_STATUS\r
-EraseCursor (\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
+// Graphics Console Device Private Data template\r
//\r
-GRAPHICS_CONSOLE_DEV mGraphicsConsoleDevTemplate = {\r
+GRAPHICS_CONSOLE_DEV mGraphicsConsoleDevTemplate = {\r
GRAPHICS_CONSOLE_DEV_SIGNATURE,\r
(EFI_GRAPHICS_OUTPUT_PROTOCOL *) NULL,\r
(EFI_UGA_DRAW_PROTOCOL *) NULL,\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
+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
+CHAR16 mCrLfString[3] = { CHAR_CARRIAGE_RETURN, CHAR_LINEFEED, CHAR_NULL };\r
\r
-STATIC EFI_GRAPHICS_OUTPUT_BLT_PIXEL mEfiColors[16] = {\r
+EFI_GRAPHICS_OUTPUT_BLT_PIXEL mEfiColors[16] = {\r
//\r
- // B G R\r
+ // B G R reserved\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, 0x00, 0x00}, // LIGHTBLUE\r
+ {0x00, 0x98, 0x00, 0x00}, // LIGHGREEN\r
+ {0x98, 0x98, 0x00, 0x00}, // LIGHCYAN\r
+ {0x00, 0x00, 0x98, 0x00}, // LIGHRED\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
+ {0xff, 0x00, 0x00, 0x00}, // BLUE\r
+ {0x00, 0xff, 0x00, 0x00}, // LIME\r
+ {0xff, 0xff, 0x00, 0x00}, // CYAN\r
+ {0x00, 0x00, 0xff, 0x00}, // RED\r
+ {0xff, 0x00, 0xff, 0x00}, // FUCHSIA\r
+ {0x00, 0xff, 0xff, 0x00}, // YELLOW\r
+ {0xff, 0xff, 0xff, 0x00} // WHITE\r
};\r
\r
-STATIC EFI_NARROW_GLYPH mCursorGlyph = {\r
+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
-STATIC CHAR16 SpaceStr[] = { NARROW_CHAR, ' ', 0 };\r
+CHAR16 SpaceStr[] = { NARROW_CHAR, ' ', 0 };\r
\r
EFI_DRIVER_BINDING_PROTOCOL gGraphicsConsoleDriverBinding = {\r
GraphicsConsoleControllerDriverSupported,\r
NULL\r
};\r
\r
+/**\r
+ Gets Graphics Console devcie's foreground color and background color.\r
+\r
+ @param This Protocol instance pointer.\r
+ @param Foreground Returned text foreground color.\r
+ @param Background Returned text background color.\r
+\r
+ @retval EFI_SUCCESS It returned always.\r
+\r
+**/\r
+EFI_STATUS\r
+GetTextColors (\r
+ IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
+ OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Foreground,\r
+ OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Background\r
+ );\r
+\r
+/**\r
+ Draw Unicode string on the Graphics Console device's screen.\r
+\r
+ @param This Protocol instance pointer.\r
+ @param UnicodeWeight One Unicode string to be displayed.\r
+ @param Count The count of Unicode string.\r
+\r
+ @retval EFI_OUT_OF_RESOURCES If no memory resource to use.\r
+ @retval EFI_UNSUPPORTED If no Graphics Output protocol and UGA Draw\r
+ protocol exist.\r
+ @retval EFI_SUCCESS Drawing Unicode string implemented successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+DrawUnicodeWeightAtCursorN (\r
+ IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
+ IN CHAR16 *UnicodeWeight,\r
+ IN UINTN Count\r
+ );\r
+\r
+/**\r
+ Erase the cursor on the screen.\r
+\r
+ @param This Protocol instance pointer.\r
+\r
+ @retval EFI_SUCCESS The cursor is erased successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+EraseCursor (\r
+ IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This\r
+ );\r
+\r
+/**\r
+ Check if the current specific mode supported the user defined resolution\r
+ for the Graphics Console device based on Graphics Output Protocol.\r
+\r
+ If yes, set the graphic device's current mode to this specific mode.\r
+ \r
+ @param GraphicsOutput Graphics Output Protocol instance pointer.\r
+ @param HorizontalResolution User defined horizontal resolution\r
+ @param VerticalResolution User defined vertical resolution.\r
+ @param CurrentModeNumber Current specific mode to be check.\r
+\r
+ @retval EFI_SUCCESS The mode is supported.\r
+ @retval EFI_UNSUPPORTED The specific mode is out of range of graphics \r
+ device supported.\r
+ @retval other The specific mode does not support user defined \r
+ resolution or failed to set the current mode to the \r
+ specific mode on graphics device.\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
+/**\r
+ Test to see if Graphics Console could be supported on the Controller.\r
+\r
+ Graphics Console could be supported if Graphics Output Protocol or UGA Draw\r
+ Protocol exists on the Controller. (UGA Draw Protocol could be skipped\r
+ if PcdUgaConsumeSupport is set to FALSE.)\r
+\r
+ @param This Protocol instance pointer.\r
+ @param Controller Handle of device to test.\r
+ @param RemainingDevicePath Optional parameter use to pick a specific child\r
+ device to start.\r
+\r
+ @retval EFI_SUCCESS This driver supports this device.\r
+ @retval other This driver does not support this device.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
GraphicsConsoleControllerDriverSupported (\r
\r
\r
/**\r
- Start the controller.\r
-\r
- @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL\r
- instance.\r
- @param Controller The handle of the controller to start.\r
- @param RemainingDevicePath A pointer to the remaining portion of a devcie\r
- path.\r
-\r
- @retval EFI_SUCCESS Return successfully.\r
- @retval EFI_OUT_OF_RESOURCES Out of resources.\r
+ Start this driver on Controller by opening Graphics Output protocol or \r
+ UGA Draw protocol, and installing Simple Text Out protocol on Controller.\r
+ (UGA Draw protocol could be skipped if PcdUgaConsumeSupport is set to FALSE.)\r
+ \r
+ @param This Protocol instance pointer.\r
+ @param Controller Handle of device to bind driver to\r
+ @param RemainingDevicePath Optional parameter use to pick a specific child\r
+ device to start.\r
+\r
+ @retval EFI_SUCCESS This driver is added to Controller.\r
+ @retval other This driver does not support this device.\r
\r
**/\r
EFI_STATUS\r
{\r
EFI_STATUS Status;\r
GRAPHICS_CONSOLE_DEV *Private;\r
- UINTN NarrowFontSize;\r
+ UINT32 NarrowFontSize;\r
UINT32 HorizontalResolution;\r
UINT32 VerticalResolution;\r
UINT32 ColorDepth;\r
UINTN Rows;\r
UINT32 ModeNumber;\r
EFI_HII_SIMPLE_FONT_PACKAGE_HDR *SimplifiedFont;\r
- UINTN PackageLength;\r
+ UINT32 PackageLength;\r
EFI_HII_PACKAGE_LIST_HEADER *PackageList;\r
UINT8 *Package;\r
UINT8 *Location;\r
-\r
+ EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode;\r
ModeNumber = 0;\r
\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
+ // +--------------------------------+ <-- Package\r
+ // | |\r
+ // | PackageLength(4 bytes) | \r
+ // | |\r
+ // |--------------------------------| <-- SimplifiedFont\r
+ // | |\r
+ // |EFI_HII_SIMPLE_FONT_PACKAGE_HDR | \r
+ // | |\r
+ // |--------------------------------| <-- Location\r
+ // | |\r
+ // | gUsStdNarrowGlyphData |\r
+ // | |\r
+ // +--------------------------------+\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
+ WriteUnaligned32((UINT32 *) Package,PackageLength);\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
Location = (UINT8 *) (&SimplifiedFont->NumberOfWideGlyphs + 1);\r
- CopyMem (Location, UsStdNarrowGlyphData, NarrowFontSize);\r
+ CopyMem (Location, gUsStdNarrowGlyphData, NarrowFontSize);\r
\r
//\r
// Add this simplified font package to a package list then install it.\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
+ FreePool (PackageList);\r
+ FreePool (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
+ // If the current mode information can not be retrieved, then attempt to set the default mode\r
+ // of 800x600, 32 bit color, 60 Hz refresh.\r
//\r
HorizontalResolution = 800;\r
VerticalResolution = 600;\r
&ModeNumber\r
);\r
}\r
-\r
- if (EFI_ERROR (Status) || (ModeNumber == Private->GraphicsOutput->Mode->MaxMode)) {\r
+ \r
+ Mode = Private->GraphicsOutput->Mode;\r
+ \r
+ if (EFI_ERROR (Status) || (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
+ HorizontalResolution = Mode->Info->HorizontalResolution;\r
+ VerticalResolution = Mode->Info->VerticalResolution;\r
+ ModeNumber = Mode->Mode;\r
}\r
} else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\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].GopWidth = HorizontalResolution;\r
+ Private->ModeData[MaxMode].GopHeight = VerticalResolution;\r
Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
- Private->ModeData[MaxMode].DeltaX = (HorizontalResolution - (80 * EFI_GLYPH_WIDTH)) >> 1;\r
- Private->ModeData[MaxMode].DeltaY = (VerticalResolution - (25 * EFI_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
// 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].GopWidth = HorizontalResolution;\r
+ Private->ModeData[MaxMode].GopHeight = VerticalResolution;\r
Private->ModeData[MaxMode].GopModeNumber = ModeNumber;\r
- Private->ModeData[MaxMode].DeltaX = (HorizontalResolution - (80 * EFI_GLYPH_WIDTH)) >> 1;\r
- Private->ModeData[MaxMode].DeltaY = (VerticalResolution - (50 * EFI_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
// If it is not to support Mode #1 - 80x50, then skip it\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].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
+ Private->ModeData[MaxMode].DeltaX = 0;\r
+ Private->ModeData[MaxMode].DeltaY = 0;\r
MaxMode++;\r
}\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].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
+ 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
// 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].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 = (HorizontalResolution % EFI_GLYPH_WIDTH) >> 1;\r
- Private->ModeData[MaxMode].DeltaY = (VerticalResolution % EFI_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
Error:\r
if (EFI_ERROR (Status)) {\r
//\r
- // Close the GOP or UGA IO Protocol\r
+ // Close the GOP and UGA Draw Protocol\r
//\r
if (Private->GraphicsOutput != NULL) {\r
gBS->CloseProtocol (\r
return Status;\r
}\r
\r
+/**\r
+ Stop this driver on Controller by removing Simple Text Out protocol \r
+ and closing the Graphics Output Protocol or UGA Draw protocol on Controller.\r
+ (UGA Draw protocol could be skipped if PcdUgaConsumeSupport is set to FALSE.)\r
+ \r
+\r
+ @param This Protocol instance pointer.\r
+ @param Controller Handle of device to stop driver on\r
+ @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
+ children is zero stop the entire bus driver.\r
+ @param ChildHandleBuffer List of Child Handles to Stop.\r
+\r
+ @retval EFI_SUCCESS This driver is removed Controller.\r
+ @retval EFI_NOT_STARTED Simple Text Out protocol could not be found the \r
+ Controller.\r
+ @retval other This driver was not removed from this device.\r
+\r
+**/\r
EFI_STATUS\r
EFIAPI\r
GraphicsConsoleControllerDriverStop (\r
return Status;\r
}\r
\r
+/**\r
+ Check if the current specific mode supported the user defined resolution\r
+ for the Graphics Console device based on Graphics Output Protocol.\r
+\r
+ If yes, set the graphic devcice's current mode to this specific mode.\r
+ \r
+ @param GraphicsOutput Graphics Output Protocol instance pointer.\r
+ @param HorizontalResolution User defined horizontal resolution\r
+ @param VerticalResolution User defined vertical resolution.\r
+ @param CurrentModeNumber Current specific mode to be check.\r
+\r
+ @retval EFI_SUCCESS The mode is supported.\r
+ @retval EFI_UNSUPPORTED The specific mode is out of range of graphics \r
+ device supported.\r
+ @retval other The specific mode does not support user defined \r
+ resolution or failed to set the current mode to the \r
+ specific mode on graphics device.\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
+ IN UINT32 HorizontalResolution,\r
+ IN UINT32 VerticalResolution,\r
+ OUT UINT32 *CurrentModeNumber\r
)\r
{\r
UINT32 ModeNumber;\r
\r
\r
/**\r
- Locate HII protocols for future usage.\r
-\r
+ Locate HII Database protocol and HII Font protocol.\r
\r
+ @retval EFI_SUCCESS HII Database protocol and HII Font protocol \r
+ are located successfully.\r
+ @return other Failed to locate HII Database protocol or \r
+ HII Font protocol.\r
\r
**/\r
EFI_STATUS\r
//\r
\r
/**\r
+ Reset the text output device hardware and optionally run diagnostics.\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
- @param This Indicates the calling context.\r
+ @param This Protocol instance pointer.\r
@param ExtendedVerification Indicates that the driver may perform a more\r
exhaustive verification operation of the device\r
during reset.\r
\r
- @return EFI_SUCCESS\r
- @return The reset operation succeeds.\r
- @return EFI_DEVICE_ERROR\r
- @return The Graphics Console is not functioning correctly\r
+ @retval EFI_SUCCESS The text output device was reset.\r
+ @retval EFI_DEVICE_ERROR The text output device is not functioning correctly and\r
+ could not be reset.\r
\r
**/\r
EFI_STATUS\r
\r
\r
/**\r
- Implements SIMPLE_TEXT_OUTPUT.OutputString().\r
+ Write a Unicode string to the output device.\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
- @param This Indicates the calling context.\r
- @param WString The Null-terminated Unicode string to be displayed\r
- on the Graphics Console.\r
+ @param This Protocol instance pointer.\r
+ @param WString The NULL-terminated Unicode string to be displayed\r
+ on the output device(s). All output devices must\r
+ also support the Unicode drawing defined in this file.\r
\r
- @return EFI_SUCCESS\r
- @return The string is output successfully.\r
- @return EFI_DEVICE_ERROR\r
- @return The Graphics Console failed to send the string out.\r
- @return EFI_WARN_UNKNOWN_GLYPH\r
- @return Indicates that some of the characters in the Unicode string could not\r
- @return be rendered and are skipped.\r
+ @retval EFI_SUCCESS The string was output to the device.\r
+ @retval EFI_DEVICE_ERROR The device reported an error while attempting to output\r
+ the text.\r
+ @retval EFI_UNSUPPORTED The output device's mode is not currently in a\r
+ defined text mode.\r
+ @retval EFI_WARN_UNKNOWN_GLYPH This warning code indicates that some of the\r
+ characters in the Unicode string could not be\r
+ rendered and were skipped.\r
\r
**/\r
EFI_STATUS\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
+ if (WString[Count] == CHAR_NULL || \r
+ WString[Count] == CHAR_BACKSPACE || \r
+ WString[Count] == CHAR_LINEFEED ||\r
+ WString[Count] == CHAR_CARRIAGE_RETURN ||\r
+ WString[Count] == WIDE_CHAR ||\r
+ WString[Count] == NARROW_CHAR) {\r
break;\r
}\r
//\r
\r
}\r
\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
+ Verifies that all characters in a Unicode string can be output to the \r
+ target device.\r
+\r
+ Implements SIMPLE_TEXT_OUTPUT.QueryMode().\r
+ If one of the characters in the *Wstring is neither valid valid Unicode\r
+ drawing characters, not ASCII code, then this function will return\r
+ EFI_UNSUPPORTED\r
\r
- @param This Indicates the calling context.\r
- @param WString The Null-terminated Unicode string to be tested.\r
+ @param This Protocol instance pointer.\r
+ @param WString The NULL-terminated Unicode string to be examined for the output\r
+ device(s).\r
\r
- @return EFI_SUCCESS\r
- @return The Graphics Console is capable of rendering the output string.\r
- @return EFI_UNSUPPORTED\r
- @return Some of the characters in the Unicode string cannot be rendered.\r
+ @retval EFI_SUCCESS The device(s) are capable of rendering the output string.\r
+ @retval EFI_UNSUPPORTED Some of the characters in the Unicode string cannot be\r
+ rendered by one or more of the output devices mapped\r
+ by the EFI handle.\r
\r
**/\r
EFI_STATUS\r
&Blt,\r
NULL\r
);\r
- SafeFreePool (Blt);\r
- Blt = NULL;\r
+ if (Blt != NULL) {\r
+ FreePool (Blt);\r
+ Blt = NULL;\r
+ }\r
Count++;\r
\r
if (EFI_ERROR (Status)) {\r
\r
\r
/**\r
+ Returns information for an available text mode that the output device(s)\r
+ supports\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
+ It returnes information for an available text mode that the Graphics Console supports.\r
+ In this driver,we only support text mode 80x25, which is defined as mode 0.\r
\r
- @param This Indicates the calling context.\r
+ @param This Protocol instance pointer.\r
@param ModeNumber The mode number to return information on.\r
@param Columns The returned columns of the requested mode.\r
@param Rows The returned rows of the requested mode.\r
\r
- @return EFI_SUCCESS\r
- @return The requested mode information is returned.\r
- @return EFI_UNSUPPORTED\r
- @return The mode number is not valid.\r
+ @retval EFI_SUCCESS The requested mode information is returned.\r
+ @retval EFI_UNSUPPORTED The mode number is not valid.\r
\r
**/\r
EFI_STATUS\r
\r
\r
/**\r
+ Sets the output device(s) to a specified mode.\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
+ Set the Graphics Console to a specified mode. In this driver, we only support mode 0.\r
\r
- @param This Indicates the calling context.\r
+ @param This Protocol instance pointer.\r
@param ModeNumber The text mode to set.\r
\r
- @return EFI_SUCCESS\r
- @return The requested text mode is set.\r
- @return EFI_DEVICE_ERROR\r
- @return The requested text mode cannot be set because of Graphics Console device error.\r
- @return EFI_UNSUPPORTED\r
- @return The text mode number is not valid.\r
+ @retval EFI_SUCCESS The requested text mode is set.\r
+ @retval EFI_DEVICE_ERROR The requested text mode cannot be set because of \r
+ Graphics Console device error.\r
+ @retval EFI_UNSUPPORTED The text mode number is not valid.\r
\r
**/\r
EFI_STATUS\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
+ // Either no graphics mode is currently set, or it is set to the wrong resolution, so set the new graphics mode\r
//\r
Status = GraphicsOutput->SetMode (GraphicsOutput, ModeData->GopModeNumber);\r
if (EFI_ERROR (Status)) {\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
+ // Either no graphics mode is currently set, or it is set to the wrong resolution, so set the new graphics mode\r
//\r
Status = UgaDraw->SetMode (\r
UgaDraw,\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
+ // Move the text cursor to the upper left hand corner of the display and enable it\r
//\r
This->SetCursorPosition (This, 0, 0);\r
\r
\r
\r
/**\r
+ Sets the background and foreground colors for the OutputString () and\r
+ ClearScreen () functions.\r
+\r
Implements SIMPLE_TEXT_OUTPUT.SetAttribute().\r
\r
- @param This Indicates the calling context.\r
- @param Attribute The attribute to set. Only bit0..6 are valid, all\r
- other bits are undefined and must be zero.\r
+ @param This Protocol instance pointer.\r
+ @param Attribute The attribute to set. Bits 0..3 are the foreground\r
+ color, and bits 4..6 are the background color. \r
+ All other bits are undefined and must be zero.\r
\r
- @return EFI_SUCCESS The requested attribute is set.\r
- @return EFI_DEVICE_ERROR The requested attribute cannot be set due to Graphics Console port error.\r
- @return EFI_UNSUPPORTED The attribute requested is not defined by EFI spec.\r
+ @retval EFI_SUCCESS The requested attribute is set.\r
+ @retval EFI_DEVICE_ERROR The requested attribute cannot be set due to Graphics Console port error.\r
+ @retval EFI_UNSUPPORTED The attribute requested is not defined.\r
\r
**/\r
EFI_STATUS\r
\r
\r
/**\r
+ Clears the output device(s) display to the currently selected background \r
+ color.\r
+\r
Implements SIMPLE_TEXT_OUTPUT.ClearScreen().\r
- It clears the Graphics Console's display to the\r
- currently selected background color.\r
\r
- @param This Indicates the calling context.\r
+ @param This Protocol instance pointer.\r
\r
- @return EFI_SUCCESS\r
- @return The operation completed successfully.\r
- @return EFI_DEVICE_ERROR\r
- @return The Graphics Console cannot be cleared due to Graphics Console device error.\r
- @return EFI_UNSUPPORTED\r
- @return The Graphics Console is not in a valid text mode.\r
+ @retval EFI_SUCCESS The operation completed successfully.\r
+ @retval EFI_DEVICE_ERROR The device had an error and could not complete the request.\r
+ @retval EFI_UNSUPPORTED The output device is not in a valid text mode.\r
\r
**/\r
EFI_STATUS\r
\r
\r
/**\r
+ Sets the current coordinates of the cursor position.\r
+\r
Implements SIMPLE_TEXT_OUTPUT.SetCursorPosition().\r
\r
- @param This Indicates the calling context.\r
- @param Column The row to set cursor to.\r
- @param Row The column to set cursor to.\r
+ @param This Protocol instance pointer.\r
+ @param Column The position to set the cursor to. Must be greater than or\r
+ equal to zero and less than the number of columns and rows\r
+ by QueryMode ().\r
+ @param Row The position to set the cursor to. Must be greater than or\r
+ equal to zero and less than the number of columns and rows\r
+ by QueryMode ().\r
\r
- @return EFI_SUCCESS\r
- @return The operation completed successfully.\r
- @return EFI_DEVICE_ERROR\r
- @return The request fails due to Graphics Console device error.\r
- @return EFI_UNSUPPORTED\r
- @return The Graphics Console is not in a valid text mode, or the cursor position\r
- @return is invalid for current mode.\r
+ @retval EFI_SUCCESS The operation completed successfully.\r
+ @retval EFI_DEVICE_ERROR The device had an error and could not complete the request.\r
+ @retval EFI_UNSUPPORTED The output device is not in a valid text mode, or the\r
+ cursor position is invalid for the current mode.\r
\r
**/\r
EFI_STATUS\r
goto Done;\r
}\r
\r
- if (((INT32) Column == This->Mode->CursorColumn) && ((INT32) Row == This->Mode->CursorRow)) {\r
+ if ((This->Mode->CursorColumn == (INT32) Column) && (This->Mode->CursorRow == (INT32) Row)) {\r
Status = EFI_SUCCESS;\r
goto Done;\r
}\r
\r
\r
/**\r
+ Makes the cursor visible or invisible.\r
+\r
Implements SIMPLE_TEXT_OUTPUT.EnableCursor().\r
- In this driver, the cursor cannot be hidden.\r
\r
- @param This Indicates the calling context.\r
+ @param This Protocol instance pointer.\r
@param Visible If TRUE, the cursor is set to be visible, If FALSE,\r
the cursor is set to be invisible.\r
\r
- @return EFI_SUCCESS\r
- @return The request is valid.\r
- @return EFI_UNSUPPORTED\r
- @return The Graphics Console does not support a hidden cursor.\r
+ @retval EFI_SUCCESS The operation completed successfully.\r
\r
**/\r
EFI_STATUS\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Gets Graphics Console devcie's foreground color and background color.\r
+\r
+ @param This Protocol instance pointer.\r
+ @param Foreground Returned text foreground color.\r
+ @param Background Returned text background color.\r
+\r
+ @retval EFI_SUCCESS It returned always.\r
+\r
+**/\r
EFI_STATUS\r
GetTextColors (\r
IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Draw Unicode string on the Graphics Console device's screen.\r
+\r
+ @param This Protocol instance pointer.\r
+ @param UnicodeWeight One Unicode string to be displayed.\r
+ @param Count The count of Unicode string.\r
+\r
+ @retval EFI_OUT_OF_RESOURCES If no memory resource to use.\r
+ @retval EFI_UNSUPPORTED If no Graphics Output protocol and UGA Draw\r
+ protocol exist.\r
+ @retval EFI_SUCCESS Drawing Unicode string implemented successfully.\r
+\r
+**/\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
EFI_STATUS Status;\r
\r
String = AllocateCopyPool ((Count + 1) * sizeof (CHAR16), UnicodeWeight);\r
if (String == NULL) {\r
- SafeFreePool (Blt);\r
+ FreePool (Blt);\r
return EFI_OUT_OF_RESOURCES;\r
}\r
- *(String + Count) = 0;\r
+ //\r
+ // Set the end character\r
+ //\r
+ *(String + Count) = L'\0';\r
\r
FontInfo = (EFI_FONT_DISPLAY_INFO *) AllocateZeroPool (sizeof (EFI_FONT_DISPLAY_INFO));\r
if (FontInfo == NULL) {\r
- SafeFreePool (Blt);\r
- SafeFreePool (String);\r
+ FreePool (Blt);\r
+ FreePool (String);\r
return EFI_OUT_OF_RESOURCES;\r
}\r
+ //\r
+ // Get current foreground and background colors.\r
+ //\r
GetTextColors (This, &FontInfo->ForegroundColor, &FontInfo->BackgroundColor);\r
\r
if (Private->GraphicsOutput != NULL) {\r
+ //\r
+ // If Graphics Output protocol exists, using HII Font protocol to draw. \r
+ //\r
Blt->Image.Screen = Private->GraphicsOutput;\r
\r
Status = mHiiFont->StringToImage (\r
);\r
\r
} else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
+ //\r
+ // If Graphics Output protocol cannot be found and PcdUgaConsumeSupport enabled, \r
+ // using UGA Draw protocol to draw.\r
+ //\r
ASSERT (Private->UgaDraw!= NULL);\r
\r
UgaDraw = Private->UgaDraw;\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
+ FreePool (Blt);\r
+ FreePool (String);\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
);\r
}\r
\r
- SafeFreePool (RowInfoArray);\r
- SafeFreePool (Blt->Image.Bitmap);\r
+ FreePool (RowInfoArray);\r
+ FreePool (Blt->Image.Bitmap);\r
} else {\r
Status = EFI_UNSUPPORTED;\r
}\r
\r
- SafeFreePool (Blt);\r
- SafeFreePool (String);\r
- SafeFreePool (FontInfo);\r
+ if (Blt != NULL) {\r
+ FreePool (Blt);\r
+ }\r
+ if (String != NULL) {\r
+ FreePool (String);\r
+ }\r
+ if (FontInfo != NULL) {\r
+ FreePool (FontInfo);\r
+ }\r
return Status;\r
}\r
\r
+/**\r
+ Erase the cursor on the screen.\r
+\r
+ @param This Protocol instance pointer.\r
\r
+ @retval EFI_SUCCESS The cursor is erased successfully.\r
+\r
+**/\r
EFI_STATUS\r
EraseCursor (\r
IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This\r
UgaDraw = Private->UgaDraw;\r
\r
//\r
- // BUGBUG - we need to think about what to do with wide and narrow character deletions.\r
+ // In this driver, only narrow character was supported.\r
//\r
//\r
// Blt a character to the screen\r
//\r
for (PosY = 0; PosY < EFI_GLYPH_HEIGHT; PosY++) {\r
for (PosX = 0; PosX < EFI_GLYPH_WIDTH; PosX++) {\r
- if ((mCursorGlyph.GlyphCol1[PosY] & (1 << PosX)) != 0) {\r
+ if ((mCursorGlyph.GlyphCol1[PosY] & (BIT0 << PosX)) != 0) {\r
BltChar[PosY][EFI_GLYPH_WIDTH - PosX - 1].Raw ^= Foreground.Raw;\r
}\r
}\r