\r
\r
EFI_STATUS\r
-ConvertBmpToUgaBlt (\r
+ConvertBmpToGopBlt (\r
IN VOID *BmpImage,\r
IN UINTN BmpImageSize,\r
- IN OUT VOID **UgaBlt,\r
- IN OUT UINTN *UgaBltSize,\r
+ IN OUT VOID **GopBlt,\r
+ IN OUT UINTN *GopBltSize,\r
OUT UINTN *PixelHeight,\r
OUT UINTN *PixelWidth\r
)\r
UINT8 *ImageHeader;\r
BMP_IMAGE_HEADER *BmpHeader;\r
BMP_COLOR_MAP *BmpColorMap;\r
- EFI_UGA_PIXEL *BltBuffer;\r
- EFI_UGA_PIXEL *Blt;\r
+ EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer;\r
+ EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt;\r
UINTN BltBufferSize;\r
UINTN Index;\r
UINTN Height;\r
Image = ((UINT8 *) BmpImage) + BmpHeader->ImageOffset;\r
ImageHeader = Image;\r
\r
- BltBufferSize = BmpHeader->PixelWidth * BmpHeader->PixelHeight * sizeof (EFI_UGA_PIXEL);\r
+ BltBufferSize = BmpHeader->PixelWidth * BmpHeader->PixelHeight * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);\r
IsAllocated = FALSE;\r
- if (*UgaBlt == NULL) {\r
- *UgaBltSize = BltBufferSize;\r
- *UgaBlt = AllocatePool (*UgaBltSize);\r
- if (*UgaBlt == NULL) {\r
+ if (*GopBlt == NULL) {\r
+ *GopBltSize = BltBufferSize;\r
+ *GopBlt = AllocatePool (*GopBltSize);\r
+ IsAllocated = TRUE;\r
+ if (*GopBlt == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
- IsAllocated = TRUE;\r
} else {\r
- if (*UgaBltSize < BltBufferSize) {\r
- *UgaBltSize = BltBufferSize;\r
+ if (*GopBltSize < BltBufferSize) {\r
+ *GopBltSize = BltBufferSize;\r
return EFI_BUFFER_TOO_SMALL;\r
}\r
}\r
//\r
// Convert image from BMP to Blt buffer format\r
//\r
- BltBuffer = *UgaBlt;\r
+ BltBuffer = *GopBlt;\r
for (Height = 0; Height < BmpHeader->PixelHeight; Height++) {\r
Blt = &BltBuffer[(BmpHeader->PixelHeight - Height - 1) * BmpHeader->PixelWidth];\r
for (Width = 0; Width < BmpHeader->PixelWidth; Width++, Image++, Blt++) {\r
\r
default:\r
if (IsAllocated) {\r
- gBS->FreePool (*UgaBlt);\r
- *UgaBlt = NULL;\r
+ gBS->FreePool (*GopBlt);\r
+ *GopBlt = NULL;\r
}\r
return EFI_UNSUPPORTED;\r
break;\r
{\r
EFI_STATUS Status;\r
EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl;\r
- EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
EFI_OEM_BADGING_PROTOCOL *Badging;\r
UINT32 SizeOfX;\r
UINT32 SizeOfY;\r
- UINT32 ColorDepth;\r
- UINT32 RefreshRate;\r
INTN DestX;\r
INTN DestY;\r
-\r
UINT8 *ImageData;\r
UINTN ImageSize;\r
- EFI_UGA_PIXEL *UgaBlt;\r
- UINTN UgaBltSize;\r
-\r
+ UINTN BltSize;\r
UINT32 Instance;\r
EFI_BADGING_FORMAT Format;\r
EFI_BADGING_DISPLAY_ATTRIBUTE Attribute;\r
UINTN CoordinateY;\r
UINTN Height;\r
UINTN Width;\r
+ EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt;\r
+ EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
+ UINT32 ColorDepth;\r
+ UINT32 RefreshRate;\r
+ EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
\r
Status = gBS->LocateProtocol (&gEfiConsoleControlProtocolGuid, NULL, (VOID **) &ConsoleControl);\r
if (EFI_ERROR (Status)) {\r
return EFI_UNSUPPORTED;\r
}\r
\r
- Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiUgaDrawProtocolGuid, (VOID **) &UgaDraw);\r
- if (EFI_ERROR (Status)) {\r
- return EFI_UNSUPPORTED;\r
+ UgaDraw = NULL;\r
+ //\r
+ // Try to open GOP first\r
+ //\r
+ Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiGraphicsOutputProtocolGuid, (VOID **) &GraphicsOutput); \r
+ if (EFI_ERROR(Status)) {\r
+ GraphicsOutput = NULL;\r
+ //\r
+ // Open GOP failed, try to open UGA\r
+ //\r
+ Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiUgaDrawProtocolGuid, (VOID **) &UgaDraw);\r
+ if (EFI_ERROR (Status)) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
}\r
\r
Badging = NULL;\r
\r
ConsoleControl->SetMode (ConsoleControl, EfiConsoleControlScreenGraphics);\r
\r
- Status = UgaDraw->GetMode (UgaDraw, &SizeOfX, &SizeOfY, &ColorDepth, &RefreshRate);\r
- if (EFI_ERROR (Status)) {\r
- return EFI_UNSUPPORTED;\r
+ if (GraphicsOutput != NULL) {\r
+ SizeOfX = GraphicsOutput->Mode->Info->HorizontalResolution;\r
+ SizeOfY = GraphicsOutput->Mode->Info->VerticalResolution;\r
+ } else {\r
+ Status = UgaDraw->GetMode (UgaDraw, &SizeOfX, &SizeOfY, &ColorDepth, &RefreshRate);\r
+ if (EFI_ERROR (Status)) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
}\r
\r
Instance = 0;\r
Attribute = EfiBadgingDisplayAttributeCenter;\r
}\r
\r
- UgaBlt = NULL;\r
- Status = ConvertBmpToUgaBlt (\r
+ Blt = NULL;\r
+ Status = ConvertBmpToGopBlt (\r
ImageData,\r
ImageSize,\r
- (VOID **) &UgaBlt,\r
- &UgaBltSize,\r
+ (VOID**)&Blt,\r
+ &BltSize,\r
&Height,\r
&Width\r
);\r
if (EFI_ERROR (Status)) {\r
gBS->FreePool (ImageData);\r
- continue;\r
+ if (Badging == NULL) {\r
+ return Status;\r
+ } else {\r
+ continue;\r
+ }\r
}\r
\r
switch (Attribute) {\r
}\r
\r
if ((DestX >= 0) && (DestY >= 0)) {\r
- Status = UgaDraw->Blt (\r
- UgaDraw,\r
- UgaBlt,\r
- EfiUgaBltBufferToVideo,\r
- 0,\r
- 0,\r
- (UINTN) DestX,\r
- (UINTN) DestY,\r
- Width,\r
- Height,\r
- Width * sizeof (EFI_UGA_PIXEL)\r
- );\r
+ if (GraphicsOutput != NULL) {\r
+ Status = GraphicsOutput->Blt (\r
+ GraphicsOutput,\r
+ Blt,\r
+ EfiBltBufferToVideo,\r
+ 0,\r
+ 0,\r
+ (UINTN) DestX,\r
+ (UINTN) DestY,\r
+ Width,\r
+ Height,\r
+ Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
+ );\r
+ } else {\r
+ Status = UgaDraw->Blt (\r
+ UgaDraw,\r
+ (EFI_UGA_PIXEL *) Blt,\r
+ EfiUgaBltBufferToVideo,\r
+ 0,\r
+ 0,\r
+ (UINTN) DestX,\r
+ (UINTN) DestY,\r
+ Width,\r
+ Height,\r
+ Width * sizeof (EFI_UGA_PIXEL)\r
+ );\r
+ }\r
}\r
\r
gBS->FreePool (ImageData);\r
- gBS->FreePool (UgaBlt);\r
+ gBS->FreePool (Blt);\r
\r
if (Badging == NULL) {\r
break;\r
return ConsoleControl->SetMode (ConsoleControl, EfiConsoleControlScreenText);\r
}\r
\r
-static EFI_UGA_PIXEL mEfiColors[16] = {\r
+static EFI_GRAPHICS_OUTPUT_BLT_PIXEL mEfiColors[16] = {\r
{ 0x00, 0x00, 0x00, 0x00 },\r
{ 0x98, 0x00, 0x00, 0x00 },\r
{ 0x00, 0x98, 0x00, 0x00 },\r
STATIC\r
UINTN\r
_IPrint (\r
+ IN EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput,\r
IN EFI_UGA_DRAW_PROTOCOL *UgaDraw,\r
IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *Sto,\r
IN UINTN X,\r
IN UINTN Y,\r
- IN EFI_UGA_PIXEL *Foreground,\r
- IN EFI_UGA_PIXEL *Background,\r
+ IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Foreground,\r
+ IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Background,\r
IN CHAR16 *fmt,\r
IN VA_LIST args\r
)\r
\r
Arguments:\r
\r
+ GraphicsOutput - Graphics output protocol interface\r
+ \r
UgaDraw - UGA draw protocol interface\r
\r
Sto - Simple text out protocol interface\r
CHAR16 *UnicodeWeight;\r
EFI_NARROW_GLYPH *Glyph;\r
EFI_HII_PROTOCOL *Hii;\r
- EFI_UGA_PIXEL *LineBuffer;\r
+ EFI_GRAPHICS_OUTPUT_BLT_PIXEL *LineBuffer;\r
UINT32 HorizontalResolution;\r
UINT32 VerticalResolution;\r
UINT32 ColorDepth;\r
if (Buffer == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
+ \r
+ if (GraphicsOutput != NULL) {\r
+ HorizontalResolution = GraphicsOutput->Mode->Info->HorizontalResolution;\r
+ VerticalResolution = GraphicsOutput->Mode->Info->VerticalResolution;\r
+ } else {\r
+ //\r
+ // Get the current mode information from the UGA Draw Protocol\r
+ //\r
+ UgaDraw->GetMode (UgaDraw, &HorizontalResolution, &VerticalResolution, &ColorDepth, &RefreshRate);\r
+ }\r
\r
- UgaDraw->GetMode (UgaDraw, &HorizontalResolution, &VerticalResolution, &ColorDepth, &RefreshRate);\r
-\r
- LineBuffer = AllocatePool (sizeof (EFI_UGA_PIXEL) * HorizontalResolution * GLYPH_WIDTH * GLYPH_HEIGHT);\r
+ LineBuffer = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) * HorizontalResolution * GLYPH_WIDTH * GLYPH_HEIGHT);\r
if (LineBuffer == NULL) {\r
gBS->FreePool (Buffer);\r
return EFI_OUT_OF_RESOURCES;\r
//\r
// Blt a character to the screen\r
//\r
- Status = UgaDraw->Blt (\r
- UgaDraw,\r
- LineBuffer,\r
- EfiUgaBltBufferToVideo,\r
- 0,\r
- 0,\r
- X,\r
- Y,\r
- GLYPH_WIDTH * StrLen (Buffer),\r
- GLYPH_HEIGHT,\r
- GLYPH_WIDTH * StrLen (Buffer) * sizeof (EFI_UGA_PIXEL)\r
- );\r
+ if (GraphicsOutput != NULL) {\r
+ Status = GraphicsOutput->Blt (\r
+ GraphicsOutput,\r
+ LineBuffer,\r
+ EfiBltBufferToVideo,\r
+ 0,\r
+ 0,\r
+ X,\r
+ Y,\r
+ GLYPH_WIDTH * StrLen (Buffer),\r
+ GLYPH_HEIGHT,\r
+ GLYPH_WIDTH * StrLen (Buffer) * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
+ );\r
+ } else {\r
+ Status = UgaDraw->Blt (\r
+ UgaDraw,\r
+ (EFI_UGA_PIXEL *) (UINTN) LineBuffer,\r
+ EfiUgaBltBufferToVideo,\r
+ 0,\r
+ 0,\r
+ X,\r
+ Y,\r
+ GLYPH_WIDTH * StrLen (Buffer),\r
+ GLYPH_HEIGHT,\r
+ GLYPH_WIDTH * StrLen (Buffer) * sizeof (EFI_UGA_PIXEL)\r
+ );\r
+ }\r
\r
Error:\r
gBS->FreePool (LineBuffer);\r
PrintXY (\r
IN UINTN X,\r
IN UINTN Y,\r
- IN EFI_UGA_PIXEL *ForeGround, OPTIONAL\r
- IN EFI_UGA_PIXEL *BackGround, OPTIONAL\r
+ IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *ForeGround, OPTIONAL\r
+ IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BackGround, OPTIONAL\r
IN CHAR16 *Fmt,\r
...\r
)\r
--*/\r
{\r
EFI_HANDLE Handle;\r
+\r
+ EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
EFI_SIMPLE_TEXT_OUT_PROTOCOL *Sto;\r
EFI_STATUS Status;\r
\r
VA_START (Args, Fmt);\r
\r
+ UgaDraw = NULL;\r
+\r
Handle = gST->ConsoleOutHandle;\r
\r
Status = gBS->HandleProtocol (\r
Handle,\r
- &gEfiUgaDrawProtocolGuid,\r
- (VOID **) &UgaDraw\r
+ &gEfiGraphicsOutputProtocolGuid,\r
+ (VOID **) &GraphicsOutput\r
);\r
\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ GraphicsOutput = NULL;\r
+\r
+ Status = gBS->HandleProtocol (\r
+ Handle,\r
+ &gEfiUgaDrawProtocolGuid,\r
+ (VOID **) &UgaDraw\r
+ );\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
}\r
\r
Status = gBS->HandleProtocol (\r
return Status;\r
}\r
\r
- return _IPrint (UgaDraw, Sto, X, Y, ForeGround, BackGround, Fmt, Args);\r
+ return _IPrint (GraphicsOutput, UgaDraw, Sto, X, Y, ForeGround, BackGround, Fmt, Args);\r
}\r