mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-30 17:14:07 +02:00
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 "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
|
Check if we need to save the EFI variable with "ConVarName" as name
|
||||||
@ -786,6 +788,17 @@ EnableQuietBoot (
|
|||||||
UINT32 ColorDepth;
|
UINT32 ColorDepth;
|
||||||
UINT32 RefreshRate;
|
UINT32 RefreshRate;
|
||||||
EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;
|
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;
|
UgaDraw = NULL;
|
||||||
//
|
//
|
||||||
@ -803,6 +816,12 @@ EnableQuietBoot (
|
|||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Try to open Boot Logo Protocol.
|
||||||
|
//
|
||||||
|
BootLogo = NULL;
|
||||||
|
gBS->LocateProtocol (&gEfiBootLogoProtocolGuid, NULL, (VOID **) &BootLogo);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Erase Cursor from screen
|
// Erase Cursor from screen
|
||||||
//
|
//
|
||||||
@ -824,6 +843,16 @@ EnableQuietBoot (
|
|||||||
return EFI_UNSUPPORTED;
|
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;
|
Instance = 0;
|
||||||
while (1) {
|
while (1) {
|
||||||
ImageData = NULL;
|
ImageData = NULL;
|
||||||
@ -844,7 +873,7 @@ EnableQuietBoot (
|
|||||||
&CoordinateY
|
&CoordinateY
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -870,6 +899,9 @@ EnableQuietBoot (
|
|||||||
Attribute = EfiBadgingDisplayAttributeCenter;
|
Attribute = EfiBadgingDisplayAttributeCenter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Blt != NULL) {
|
||||||
|
FreePool (Blt);
|
||||||
|
}
|
||||||
Blt = NULL;
|
Blt = NULL;
|
||||||
Status = ConvertBmpToGopBlt (
|
Status = ConvertBmpToGopBlt (
|
||||||
ImageData,
|
ImageData,
|
||||||
@ -972,21 +1004,117 @@ EnableQuietBoot (
|
|||||||
Width * sizeof (EFI_UGA_PIXEL)
|
Width * sizeof (EFI_UGA_PIXEL)
|
||||||
);
|
);
|
||||||
} else {
|
} 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);
|
FreePool (ImageData);
|
||||||
|
|
||||||
if (Blt != NULL) {
|
|
||||||
FreePool (Blt);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Badging == NULL) {
|
if (Badging == NULL) {
|
||||||
break;
|
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;
|
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
|
BdsConsole.c
|
||||||
BdsBoot.c
|
BdsBoot.c
|
||||||
InternalBdsLib.h
|
InternalBdsLib.h
|
||||||
Bmp.h
|
|
||||||
String.h
|
String.h
|
||||||
String.c
|
String.c
|
||||||
GenericBdsStrings.uni
|
GenericBdsStrings.uni
|
||||||
@ -115,6 +114,7 @@
|
|||||||
gEfiHiiFontProtocolGuid # PROTOCOL CONSUMES
|
gEfiHiiFontProtocolGuid # PROTOCOL CONSUMES
|
||||||
gEfiUserManagerProtocolGuid # PROTOCOL CONSUMES
|
gEfiUserManagerProtocolGuid # PROTOCOL CONSUMES
|
||||||
gEfiUsbIoProtocolGuid # PROTOCOL SOMETIMES_CONSUMES
|
gEfiUsbIoProtocolGuid # PROTOCOL SOMETIMES_CONSUMES
|
||||||
|
gEfiBootLogoProtocolGuid # PROTOCOL SOMETIMES_CONSUMES
|
||||||
|
|
||||||
[FeaturePcd]
|
[FeaturePcd]
|
||||||
gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport
|
gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport
|
||||||
|
@ -45,6 +45,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|||||||
#include <Protocol/LegacyBios.h>
|
#include <Protocol/LegacyBios.h>
|
||||||
#include <Protocol/SimpleTextInEx.h>
|
#include <Protocol/SimpleTextInEx.h>
|
||||||
#include <Protocol/DriverHealth.h>
|
#include <Protocol/DriverHealth.h>
|
||||||
|
#include <Protocol/BootLogo.h>
|
||||||
|
|
||||||
#include <Library/UefiDriverEntryPoint.h>
|
#include <Library/UefiDriverEntryPoint.h>
|
||||||
#include <Library/PrintLib.h>
|
#include <Library/PrintLib.h>
|
||||||
|
@ -159,6 +159,7 @@
|
|||||||
gEfiDevicePathProtocolGuid ## PROTOCOL CONSUMES
|
gEfiDevicePathProtocolGuid ## PROTOCOL CONSUMES
|
||||||
gEfiDriverHealthProtocolGuid ## PROTOCOL SOMETIMES_CONSUMES
|
gEfiDriverHealthProtocolGuid ## PROTOCOL SOMETIMES_CONSUMES
|
||||||
gEfiPciIoProtocolGuid ## PROTOCOL CONSUMES
|
gEfiPciIoProtocolGuid ## PROTOCOL CONSUMES
|
||||||
|
gEfiBootLogoProtocolGuid ## PROTOCOL SOMETIMES_CONSUMES
|
||||||
|
|
||||||
[FeaturePcd]
|
[FeaturePcd]
|
||||||
gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultLangDeprecate
|
gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultLangDeprecate
|
||||||
|
@ -958,6 +958,7 @@ PlatformBdsEnterFrontPage (
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
EFI_BOOT_LOGO_PROTOCOL *BootLogo;
|
||||||
|
|
||||||
PERF_START (NULL, "BdsTimeOut", "BDS", 0);
|
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 {
|
do {
|
||||||
|
|
||||||
InitializeFrontPage (FALSE);
|
InitializeFrontPage (FALSE);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user