mirror of https://github.com/acidanthera/audk.git
IntelFrameworkModulePkg: Update GenericBdsLib to use BootLogo protocol to report logo information after logo is drawn to screen; update BdsDxe to notify logo is corrupted when user is going to enter setup.
Signed-off-by: xdu2 Reviewed-by: mdkinney Reviewed-by: lgao4 git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12664 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
e2988e6632
commit
a637802c2f
|
@ -13,7 +13,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||
**/
|
||||
|
||||
#include "InternalBdsLib.h"
|
||||
#include "Bmp.h"
|
||||
#include <IndustryStandard/Bmp.h>
|
||||
|
||||
#include <Protocol/BootLogo.h>
|
||||
|
||||
/**
|
||||
Check if we need to save the EFI variable with "ConVarName" as name
|
||||
|
@ -786,6 +788,17 @@ EnableQuietBoot (
|
|||
UINT32 ColorDepth;
|
||||
UINT32 RefreshRate;
|
||||
EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;
|
||||
EFI_BOOT_LOGO_PROTOCOL *BootLogo;
|
||||
UINTN NumberOfLogos;
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *LogoBlt;
|
||||
UINTN LogoDestX;
|
||||
UINTN LogoDestY;
|
||||
UINTN LogoHeight;
|
||||
UINTN LogoWidth;
|
||||
UINTN NewDestX;
|
||||
UINTN NewDestY;
|
||||
UINTN NewHeight;
|
||||
UINTN NewWidth;
|
||||
|
||||
UgaDraw = NULL;
|
||||
//
|
||||
|
@ -803,6 +816,12 @@ EnableQuietBoot (
|
|||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
//
|
||||
// Try to open Boot Logo Protocol.
|
||||
//
|
||||
BootLogo = NULL;
|
||||
gBS->LocateProtocol (&gEfiBootLogoProtocolGuid, NULL, (VOID **) &BootLogo);
|
||||
|
||||
//
|
||||
// Erase Cursor from screen
|
||||
//
|
||||
|
@ -824,6 +843,16 @@ EnableQuietBoot (
|
|||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
Blt = NULL;
|
||||
NumberOfLogos = 0;
|
||||
LogoDestX = 0;
|
||||
LogoDestY = 0;
|
||||
LogoHeight = 0;
|
||||
LogoWidth = 0;
|
||||
NewDestX = 0;
|
||||
NewDestY = 0;
|
||||
NewHeight = 0;
|
||||
NewWidth = 0;
|
||||
Instance = 0;
|
||||
while (1) {
|
||||
ImageData = NULL;
|
||||
|
@ -844,7 +873,7 @@ EnableQuietBoot (
|
|||
&CoordinateY
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
goto Done;
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -870,6 +899,9 @@ EnableQuietBoot (
|
|||
Attribute = EfiBadgingDisplayAttributeCenter;
|
||||
}
|
||||
|
||||
if (Blt != NULL) {
|
||||
FreePool (Blt);
|
||||
}
|
||||
Blt = NULL;
|
||||
Status = ConvertBmpToGopBlt (
|
||||
ImageData,
|
||||
|
@ -972,21 +1004,117 @@ EnableQuietBoot (
|
|||
Width * sizeof (EFI_UGA_PIXEL)
|
||||
);
|
||||
} else {
|
||||
Status = EFI_UNSUPPORTED;
|
||||
Status = EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
//
|
||||
// Report displayed Logo information.
|
||||
//
|
||||
if (!EFI_ERROR (Status)) {
|
||||
NumberOfLogos++;
|
||||
|
||||
if (LogoWidth == 0) {
|
||||
//
|
||||
// The first Logo.
|
||||
//
|
||||
LogoDestX = DestX;
|
||||
LogoDestY = DestY;
|
||||
LogoWidth = Width;
|
||||
LogoHeight = Height;
|
||||
} else {
|
||||
//
|
||||
// Merge new logo with old one.
|
||||
//
|
||||
NewDestX = MIN ((UINTN) DestX, LogoDestX);
|
||||
NewDestY = MIN ((UINTN) DestY, LogoDestY);
|
||||
NewWidth = MAX ((UINTN) DestX + Width, LogoDestX + LogoWidth) - NewDestX;
|
||||
NewHeight = MAX ((UINTN) DestY + Height, LogoDestY + LogoHeight) - NewDestY;
|
||||
|
||||
LogoDestX = NewDestX;
|
||||
LogoDestY = NewDestY;
|
||||
LogoWidth = NewWidth;
|
||||
LogoHeight = NewHeight;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FreePool (ImageData);
|
||||
|
||||
if (Blt != NULL) {
|
||||
FreePool (Blt);
|
||||
}
|
||||
|
||||
if (Badging == NULL) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Done:
|
||||
if (BootLogo == NULL || NumberOfLogos == 0) {
|
||||
//
|
||||
// No logo displayed.
|
||||
//
|
||||
if (Blt != NULL) {
|
||||
FreePool (Blt);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Advertise displayed Logo information.
|
||||
//
|
||||
if (NumberOfLogos == 1) {
|
||||
//
|
||||
// Only one logo displayed, use its Blt buffer directly for BootLogo protocol.
|
||||
//
|
||||
LogoBlt = Blt;
|
||||
Status = EFI_SUCCESS;
|
||||
} else {
|
||||
//
|
||||
// More than one Logo displayed, get merged BltBuffer using VideoToBuffer operation.
|
||||
//
|
||||
if (Blt != NULL) {
|
||||
FreePool (Blt);
|
||||
}
|
||||
|
||||
LogoBlt = AllocateZeroPool (LogoWidth * LogoHeight * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));
|
||||
if (LogoBlt == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
if (GraphicsOutput != NULL) {
|
||||
Status = GraphicsOutput->Blt (
|
||||
GraphicsOutput,
|
||||
LogoBlt,
|
||||
EfiBltVideoToBltBuffer,
|
||||
LogoDestX,
|
||||
LogoDestY,
|
||||
0,
|
||||
0,
|
||||
LogoWidth,
|
||||
LogoHeight,
|
||||
LogoWidth * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
|
||||
);
|
||||
} else if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) {
|
||||
Status = UgaDraw->Blt (
|
||||
UgaDraw,
|
||||
(EFI_UGA_PIXEL *) LogoBlt,
|
||||
EfiUgaVideoToBltBuffer,
|
||||
LogoDestX,
|
||||
LogoDestY,
|
||||
0,
|
||||
0,
|
||||
LogoWidth,
|
||||
LogoHeight,
|
||||
LogoWidth * sizeof (EFI_UGA_PIXEL)
|
||||
);
|
||||
} else {
|
||||
Status = EFI_UNSUPPORTED;
|
||||
}
|
||||
}
|
||||
|
||||
if (!EFI_ERROR (Status)) {
|
||||
BootLogo->SetBootLogo (BootLogo, LogoBlt, LogoDestX, LogoDestY, LogoWidth, LogoHeight);
|
||||
}
|
||||
FreePool (LogoBlt);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,48 +0,0 @@
|
|||
/** @file
|
||||
This file defines BMP file header data structures.
|
||||
|
||||
Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef _GENERIC_BDS_BMP_H__
|
||||
#define _GENERIC_BDS_BMP_H__
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
typedef struct {
|
||||
UINT8 Blue;
|
||||
UINT8 Green;
|
||||
UINT8 Red;
|
||||
UINT8 Reserved;
|
||||
} BMP_COLOR_MAP;
|
||||
|
||||
typedef struct {
|
||||
CHAR8 CharB;
|
||||
CHAR8 CharM;
|
||||
UINT32 Size;
|
||||
UINT16 Reserved[2];
|
||||
UINT32 ImageOffset;
|
||||
UINT32 HeaderSize;
|
||||
UINT32 PixelWidth;
|
||||
UINT32 PixelHeight;
|
||||
UINT16 Planes; ///< Must be 1
|
||||
UINT16 BitPerPixel; ///< 1, 4, 8, or 24
|
||||
UINT32 CompressionType;
|
||||
UINT32 ImageSize; ///< Compressed image size in bytes
|
||||
UINT32 XPixelsPerMeter;
|
||||
UINT32 YPixelsPerMeter;
|
||||
UINT32 NumberOfColors;
|
||||
UINT32 ImportantColors;
|
||||
} BMP_IMAGE_HEADER;
|
||||
|
||||
#pragma pack()
|
||||
|
||||
#endif
|
|
@ -39,7 +39,6 @@
|
|||
BdsConsole.c
|
||||
BdsBoot.c
|
||||
InternalBdsLib.h
|
||||
Bmp.h
|
||||
String.h
|
||||
String.c
|
||||
GenericBdsStrings.uni
|
||||
|
@ -115,6 +114,7 @@
|
|||
gEfiHiiFontProtocolGuid # PROTOCOL CONSUMES
|
||||
gEfiUserManagerProtocolGuid # PROTOCOL CONSUMES
|
||||
gEfiUsbIoProtocolGuid # PROTOCOL SOMETIMES_CONSUMES
|
||||
gEfiBootLogoProtocolGuid # PROTOCOL SOMETIMES_CONSUMES
|
||||
|
||||
[FeaturePcd]
|
||||
gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport
|
||||
|
|
|
@ -45,6 +45,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||
#include <Protocol/LegacyBios.h>
|
||||
#include <Protocol/SimpleTextInEx.h>
|
||||
#include <Protocol/DriverHealth.h>
|
||||
#include <Protocol/BootLogo.h>
|
||||
|
||||
#include <Library/UefiDriverEntryPoint.h>
|
||||
#include <Library/PrintLib.h>
|
||||
|
|
|
@ -159,6 +159,7 @@
|
|||
gEfiDevicePathProtocolGuid ## PROTOCOL CONSUMES
|
||||
gEfiDriverHealthProtocolGuid ## PROTOCOL SOMETIMES_CONSUMES
|
||||
gEfiPciIoProtocolGuid ## PROTOCOL CONSUMES
|
||||
gEfiBootLogoProtocolGuid ## PROTOCOL SOMETIMES_CONSUMES
|
||||
|
||||
[FeaturePcd]
|
||||
gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultLangDeprecate
|
||||
|
|
|
@ -958,6 +958,7 @@ PlatformBdsEnterFrontPage (
|
|||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_BOOT_LOGO_PROTOCOL *BootLogo;
|
||||
|
||||
PERF_START (NULL, "BdsTimeOut", "BDS", 0);
|
||||
//
|
||||
|
@ -986,6 +987,14 @@ PlatformBdsEnterFrontPage (
|
|||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Boot Logo is corrupted, report it using Boot Logo protocol.
|
||||
//
|
||||
Status = gBS->LocateProtocol (&gEfiBootLogoProtocolGuid, NULL, (VOID **) &BootLogo);
|
||||
if (!EFI_ERROR (Status) && (BootLogo != NULL)) {
|
||||
BootLogo->SetBootLogo (BootLogo, NULL, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
do {
|
||||
|
||||
InitializeFrontPage (FALSE);
|
||||
|
|
Loading…
Reference in New Issue