mirror of https://github.com/acidanthera/audk.git
MdeModulePkg/CapsuleApp: Center bitmap at bottom of screen
https://bugzilla.tianocore.org/show_bug.cgi?id=907 When -G option is used to convert a BMP file to a UX capsule, the bitmap is centered horizontally and placed in the lower half of the screen below the boot logo. This matches examples shown in the following pages: https://docs.microsoft.com/en-us/windows-hardware/drivers/bringup/user-experience-for-uefi-firmware-updates https://docs.microsoft.com/en-us/windows-hardware/drivers/bringup/boot-screen-components Checks are also made to make sure the bitmap provided fits in the current GOP mode. Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Star Zeng <star.zeng@intel.com> Cc: Eric Dong <eric.dong@intel.com> Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
This commit is contained in:
parent
845f7cfef2
commit
bf9b044e67
|
@ -21,6 +21,7 @@
|
||||||
#include <Library/UefiRuntimeServicesTableLib.h>
|
#include <Library/UefiRuntimeServicesTableLib.h>
|
||||||
#include <Library/UefiLib.h>
|
#include <Library/UefiLib.h>
|
||||||
#include <Library/PrintLib.h>
|
#include <Library/PrintLib.h>
|
||||||
|
#include <Library/BmpSupportLib.h>
|
||||||
#include <Protocol/GraphicsOutput.h>
|
#include <Protocol/GraphicsOutput.h>
|
||||||
#include <Guid/GlobalVariable.h>
|
#include <Guid/GlobalVariable.h>
|
||||||
#include <Guid/CapsuleReport.h>
|
#include <Guid/CapsuleReport.h>
|
||||||
|
@ -173,15 +174,21 @@ CreateBmpFmp (
|
||||||
EFI_DISPLAY_CAPSULE *DisplayCapsule;
|
EFI_DISPLAY_CAPSULE *DisplayCapsule;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop;
|
EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop;
|
||||||
|
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;
|
||||||
|
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *GopBlt;
|
||||||
|
UINTN GopBltSize;
|
||||||
|
UINTN Height;
|
||||||
|
UINTN Width;
|
||||||
|
|
||||||
Status = gBS->LocateProtocol(&gEfiGraphicsOutputProtocolGuid, NULL, (VOID **)&Gop);
|
Status = gBS->LocateProtocol(&gEfiGraphicsOutputProtocolGuid, NULL, (VOID **)&Gop);
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR(Status)) {
|
||||||
Print(L"CapsuleApp: NO GOP is found.\n");
|
Print(L"CapsuleApp: NO GOP is found.\n");
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
Info = Gop->Mode->Info;
|
||||||
Print(L"Current GOP: Mode - %d, ", Gop->Mode->Mode);
|
Print(L"Current GOP: Mode - %d, ", Gop->Mode->Mode);
|
||||||
Print(L"HorizontalResolution - %d, ", Gop->Mode->Info->HorizontalResolution);
|
Print(L"HorizontalResolution - %d, ", Info->HorizontalResolution);
|
||||||
Print(L"VerticalResolution - %d\n", Gop->Mode->Info->VerticalResolution);
|
Print(L"VerticalResolution - %d\n", Info->VerticalResolution);
|
||||||
// HorizontalResolution >= BMP_IMAGE_HEADER.PixelWidth
|
// HorizontalResolution >= BMP_IMAGE_HEADER.PixelWidth
|
||||||
// VerticalResolution >= BMP_IMAGE_HEADER.PixelHeight
|
// VerticalResolution >= BMP_IMAGE_HEADER.PixelHeight
|
||||||
|
|
||||||
|
@ -207,6 +214,35 @@ CreateBmpFmp (
|
||||||
goto Done;
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GopBlt = NULL;
|
||||||
|
Status = TranslateBmpToGopBlt (
|
||||||
|
BmpBuffer,
|
||||||
|
FileSize,
|
||||||
|
&GopBlt,
|
||||||
|
&GopBltSize,
|
||||||
|
&Height,
|
||||||
|
&Width
|
||||||
|
);
|
||||||
|
if (EFI_ERROR(Status)) {
|
||||||
|
Print(L"CapsuleApp: BMP image (%s) is not valid.\n", BmpName);
|
||||||
|
goto Done;
|
||||||
|
}
|
||||||
|
if (GopBlt != NULL) {
|
||||||
|
FreePool (GopBlt);
|
||||||
|
}
|
||||||
|
Print(L"BMP image (%s), Width - %d, Height - %d\n", BmpName, Width, Height);
|
||||||
|
|
||||||
|
if (Height > Info->VerticalResolution) {
|
||||||
|
Status = EFI_INVALID_PARAMETER;
|
||||||
|
Print(L"CapsuleApp: BMP image (%s) height is larger than current resolution.\n", BmpName);
|
||||||
|
goto Done;
|
||||||
|
}
|
||||||
|
if (Width > Info->HorizontalResolution) {
|
||||||
|
Status = EFI_INVALID_PARAMETER;
|
||||||
|
Print(L"CapsuleApp: BMP image (%s) width is larger than current resolution.\n", BmpName);
|
||||||
|
goto Done;
|
||||||
|
}
|
||||||
|
|
||||||
FullCapsuleBufferSize = sizeof(EFI_DISPLAY_CAPSULE) + FileSize;
|
FullCapsuleBufferSize = sizeof(EFI_DISPLAY_CAPSULE) + FileSize;
|
||||||
FullCapsuleBuffer = AllocatePool(FullCapsuleBufferSize);
|
FullCapsuleBuffer = AllocatePool(FullCapsuleBufferSize);
|
||||||
if (FullCapsuleBuffer == NULL) {
|
if (FullCapsuleBuffer == NULL) {
|
||||||
|
@ -226,8 +262,27 @@ CreateBmpFmp (
|
||||||
DisplayCapsule->ImagePayload.ImageType = 0; // BMP
|
DisplayCapsule->ImagePayload.ImageType = 0; // BMP
|
||||||
DisplayCapsule->ImagePayload.Reserved = 0;
|
DisplayCapsule->ImagePayload.Reserved = 0;
|
||||||
DisplayCapsule->ImagePayload.Mode = Gop->Mode->Mode;
|
DisplayCapsule->ImagePayload.Mode = Gop->Mode->Mode;
|
||||||
DisplayCapsule->ImagePayload.OffsetX = 0;
|
|
||||||
DisplayCapsule->ImagePayload.OffsetY = 0;
|
//
|
||||||
|
// Center the bitmap horizontally
|
||||||
|
//
|
||||||
|
DisplayCapsule->ImagePayload.OffsetX = (UINT32)((Info->HorizontalResolution - Width) / 2);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Put bitmap 3/4 down the display. If bitmap is too tall, then align bottom
|
||||||
|
// of bitmap at bottom of display.
|
||||||
|
//
|
||||||
|
DisplayCapsule->ImagePayload.OffsetY =
|
||||||
|
MIN (
|
||||||
|
(UINT32)(Info->VerticalResolution - Height),
|
||||||
|
(UINT32)(((3 * Info->VerticalResolution) - (2 * Height)) / 4)
|
||||||
|
);
|
||||||
|
|
||||||
|
Print(L"BMP image (%s), OffsetX - %d, OffsetY - %d\n",
|
||||||
|
BmpName,
|
||||||
|
DisplayCapsule->ImagePayload.OffsetX,
|
||||||
|
DisplayCapsule->ImagePayload.OffsetY
|
||||||
|
);
|
||||||
|
|
||||||
CopyMem((DisplayCapsule + 1), BmpBuffer, FileSize);
|
CopyMem((DisplayCapsule + 1), BmpBuffer, FileSize);
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
# This application can trigger capsule update process. It can also
|
# This application can trigger capsule update process. It can also
|
||||||
# generate capsule image, or dump capsule variable information.
|
# generate capsule image, or dump capsule variable information.
|
||||||
#
|
#
|
||||||
# Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.<BR>
|
# Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||||
# This program and the accompanying materials
|
# This program and the accompanying materials
|
||||||
# are licensed and made available under the terms and conditions of the BSD License
|
# 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
|
# which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -63,6 +63,7 @@
|
||||||
UefiRuntimeServicesTableLib
|
UefiRuntimeServicesTableLib
|
||||||
UefiLib
|
UefiLib
|
||||||
PrintLib
|
PrintLib
|
||||||
|
BmpSupportLib
|
||||||
|
|
||||||
[UserExtensions.TianoCore."ExtraFiles"]
|
[UserExtensions.TianoCore."ExtraFiles"]
|
||||||
CapsuleAppExtra.uni
|
CapsuleAppExtra.uni
|
||||||
|
|
Loading…
Reference in New Issue