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:
xdu2 2011-11-04 08:28:09 +00:00
parent e2988e6632
commit a637802c2f
6 changed files with 147 additions and 56 deletions

View File

@ -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;
}

View File

@ -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

View File

@ -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

View File

@ -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>

View File

@ -159,6 +159,7 @@
gEfiDevicePathProtocolGuid ## PROTOCOL CONSUMES
gEfiDriverHealthProtocolGuid ## PROTOCOL SOMETIMES_CONSUMES
gEfiPciIoProtocolGuid ## PROTOCOL CONSUMES
gEfiBootLogoProtocolGuid ## PROTOCOL SOMETIMES_CONSUMES
[FeaturePcd]
gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultLangDeprecate

View File

@ -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);