**/\r
\r
#include "InternalBdsLib.h"\r
-#include "Bmp.h"\r
+#include <IndustryStandard/Bmp.h>\r
+\r
+#include <Protocol/BootLogo.h>\r
\r
/**\r
Check if we need to save the EFI variable with "ConVarName" as name\r
UINT32 ColorDepth;\r
UINT32 RefreshRate;\r
EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
+ EFI_BOOT_LOGO_PROTOCOL *BootLogo;\r
+ UINTN NumberOfLogos;\r
+ EFI_GRAPHICS_OUTPUT_BLT_PIXEL *LogoBlt;\r
+ UINTN LogoDestX;\r
+ UINTN LogoDestY;\r
+ UINTN LogoHeight;\r
+ UINTN LogoWidth;\r
+ UINTN NewDestX;\r
+ UINTN NewDestY;\r
+ UINTN NewHeight;\r
+ UINTN NewWidth;\r
\r
UgaDraw = NULL;\r
//\r
return EFI_UNSUPPORTED;\r
}\r
\r
+ //\r
+ // Try to open Boot Logo Protocol.\r
+ //\r
+ BootLogo = NULL;\r
+ gBS->LocateProtocol (&gEfiBootLogoProtocolGuid, NULL, (VOID **) &BootLogo);\r
+\r
//\r
// Erase Cursor from screen\r
//\r
return EFI_UNSUPPORTED;\r
}\r
\r
+ Blt = NULL;\r
+ NumberOfLogos = 0;\r
+ LogoDestX = 0;\r
+ LogoDestY = 0;\r
+ LogoHeight = 0;\r
+ LogoWidth = 0;\r
+ NewDestX = 0;\r
+ NewDestY = 0;\r
+ NewHeight = 0;\r
+ NewWidth = 0;\r
Instance = 0;\r
while (1) {\r
ImageData = NULL;\r
&CoordinateY\r
);\r
if (EFI_ERROR (Status)) {\r
- return Status;\r
+ goto Done;\r
}\r
\r
//\r
Attribute = EfiBadgingDisplayAttributeCenter;\r
}\r
\r
+ if (Blt != NULL) {\r
+ FreePool (Blt);\r
+ }\r
Blt = NULL;\r
Status = ConvertBmpToGopBlt (\r
ImageData,\r
Width * sizeof (EFI_UGA_PIXEL)\r
);\r
} else {\r
- Status = EFI_UNSUPPORTED;\r
+ Status = EFI_UNSUPPORTED;\r
+ }\r
+\r
+ //\r
+ // Report displayed Logo information.\r
+ //\r
+ if (!EFI_ERROR (Status)) {\r
+ NumberOfLogos++;\r
+\r
+ if (LogoWidth == 0) {\r
+ //\r
+ // The first Logo.\r
+ //\r
+ LogoDestX = DestX;\r
+ LogoDestY = DestY;\r
+ LogoWidth = Width;\r
+ LogoHeight = Height;\r
+ } else {\r
+ //\r
+ // Merge new logo with old one.\r
+ //\r
+ NewDestX = MIN ((UINTN) DestX, LogoDestX);\r
+ NewDestY = MIN ((UINTN) DestY, LogoDestY);\r
+ NewWidth = MAX ((UINTN) DestX + Width, LogoDestX + LogoWidth) - NewDestX;\r
+ NewHeight = MAX ((UINTN) DestY + Height, LogoDestY + LogoHeight) - NewDestY;\r
+\r
+ LogoDestX = NewDestX;\r
+ LogoDestY = NewDestY;\r
+ LogoWidth = NewWidth;\r
+ LogoHeight = NewHeight;\r
+ }\r
}\r
}\r
\r
FreePool (ImageData);\r
\r
+ if (Badging == NULL) {\r
+ break;\r
+ }\r
+ }\r
+\r
+Done:\r
+ if (BootLogo == NULL || NumberOfLogos == 0) {\r
+ //\r
+ // No logo displayed.\r
+ //\r
if (Blt != NULL) {\r
FreePool (Blt);\r
}\r
\r
- if (Badging == NULL) {\r
- break;\r
+ return Status;\r
+ }\r
+\r
+ //\r
+ // Advertise displayed Logo information.\r
+ //\r
+ if (NumberOfLogos == 1) {\r
+ //\r
+ // Only one logo displayed, use its Blt buffer directly for BootLogo protocol.\r
+ //\r
+ LogoBlt = Blt;\r
+ Status = EFI_SUCCESS;\r
+ } else {\r
+ //\r
+ // More than one Logo displayed, get merged BltBuffer using VideoToBuffer operation. \r
+ //\r
+ if (Blt != NULL) {\r
+ FreePool (Blt);\r
+ }\r
+\r
+ LogoBlt = AllocateZeroPool (LogoWidth * LogoHeight * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));\r
+ if (LogoBlt == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ if (GraphicsOutput != NULL) {\r
+ Status = GraphicsOutput->Blt (\r
+ GraphicsOutput,\r
+ LogoBlt,\r
+ EfiBltVideoToBltBuffer,\r
+ LogoDestX,\r
+ LogoDestY,\r
+ 0,\r
+ 0,\r
+ LogoWidth,\r
+ LogoHeight,\r
+ LogoWidth * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
+ );\r
+ } else if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
+ Status = UgaDraw->Blt (\r
+ UgaDraw,\r
+ (EFI_UGA_PIXEL *) LogoBlt,\r
+ EfiUgaVideoToBltBuffer,\r
+ LogoDestX,\r
+ LogoDestY,\r
+ 0,\r
+ 0,\r
+ LogoWidth,\r
+ LogoHeight,\r
+ LogoWidth * sizeof (EFI_UGA_PIXEL)\r
+ );\r
+ } else {\r
+ Status = EFI_UNSUPPORTED;\r
}\r
}\r
\r
+ if (!EFI_ERROR (Status)) {\r
+ BootLogo->SetBootLogo (BootLogo, LogoBlt, LogoDestX, LogoDestY, LogoWidth, LogoHeight);\r
+ }\r
+ FreePool (LogoBlt);\r
+\r
return Status;\r
}\r
\r
+++ /dev/null
-/** @file\r
- This file defines BMP file header data structures.\r
-\r
-Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>\r
-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
-#ifndef _GENERIC_BDS_BMP_H__\r
-#define _GENERIC_BDS_BMP_H__\r
-\r
-#pragma pack(1)\r
-\r
-typedef struct {\r
- UINT8 Blue;\r
- UINT8 Green;\r
- UINT8 Red;\r
- UINT8 Reserved;\r
-} BMP_COLOR_MAP;\r
-\r
-typedef struct {\r
- CHAR8 CharB;\r
- CHAR8 CharM;\r
- UINT32 Size;\r
- UINT16 Reserved[2];\r
- UINT32 ImageOffset;\r
- UINT32 HeaderSize;\r
- UINT32 PixelWidth;\r
- UINT32 PixelHeight;\r
- UINT16 Planes; ///< Must be 1\r
- UINT16 BitPerPixel; ///< 1, 4, 8, or 24\r
- UINT32 CompressionType;\r
- UINT32 ImageSize; ///< Compressed image size in bytes\r
- UINT32 XPixelsPerMeter;\r
- UINT32 YPixelsPerMeter;\r
- UINT32 NumberOfColors;\r
- UINT32 ImportantColors;\r
-} BMP_IMAGE_HEADER;\r
-\r
-#pragma pack()\r
-\r
-#endif\r