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
---
MdeModulePkg/Application/CapsuleApp/CapsuleApp.c | 63 ++++++++++++++++++++--
MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf | 3 +-
2 files changed, 61 insertions(+), 5 deletions(-)
diff --git a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
index b9ff812179..e1e48befc2 100644
--- a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
+++ b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
@@ -21,6 +21,7 @@
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Library/UefiLib.h>
#include <Library/PrintLib.h>
+#include <Library/BmpSupportLib.h>
#include <Protocol/GraphicsOutput.h>
#include <Guid/GlobalVariable.h>
#include <Guid/CapsuleReport.h>
@@ -173,15 +174,21 @@ CreateBmpFmp (
EFI_DISPLAY_CAPSULE *DisplayCapsule;
EFI_STATUS Status;
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);
if (EFI_ERROR(Status)) {
Print(L"CapsuleApp: NO GOP is found.\n");
return EFI_UNSUPPORTED;
}
+ Info = Gop->Mode->Info;
Print(L"Current GOP: Mode - %d, ", Gop->Mode->Mode);
- Print(L"HorizontalResolution - %d, ", Gop->Mode->Info->HorizontalResolution);
- Print(L"VerticalResolution - %d\n", Gop->Mode->Info->VerticalResolution);
+ Print(L"HorizontalResolution - %d, ", Info->HorizontalResolution);
+ Print(L"VerticalResolution - %d\n", Info->VerticalResolution);
// HorizontalResolution >= BMP_IMAGE_HEADER.PixelWidth
// VerticalResolution >= BMP_IMAGE_HEADER.PixelHeight
@@ -207,6 +214,35 @@ CreateBmpFmp (
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;
FullCapsuleBuffer = AllocatePool(FullCapsuleBufferSize);
if (FullCapsuleBuffer == NULL) {
@@ -226,8 +262,27 @@ CreateBmpFmp (
DisplayCapsule->ImagePayload.ImageType = 0; // BMP
DisplayCapsule->ImagePayload.Reserved = 0;
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);
diff --git a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf
index b06c4ea1bc..3a67c6b909 100644
--- a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf
+++ b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf
@@ -4,7 +4,7 @@
# This application can trigger capsule update process. It can also
# 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
# 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
@@ -63,6 +63,7 @@ [LibraryClasses]
UefiRuntimeServicesTableLib
UefiLib
PrintLib
+ BmpSupportLib
[UserExtensions.TianoCore."ExtraFiles"]
CapsuleAppExtra.uni
--
2.14.2.windows.3
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Reviewed-by: Jiewen.yao@intel.com
> -----Original Message-----
> From: Kinney, Michael D
> Sent: Thursday, March 22, 2018 5:13 AM
> To: edk2-devel@lists.01.org
> Cc: Yao, Jiewen <jiewen.yao@intel.com>; Zeng, Star <star.zeng@intel.com>;
> Dong, Eric <eric.dong@intel.com>
> Subject: [Patch 2/2] 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-exp
> erience-for-uefi-firmware-updates
> https://docs.microsoft.com/en-us/windows-hardware/drivers/bringup/boot-scr
> een-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
> ---
> MdeModulePkg/Application/CapsuleApp/CapsuleApp.c | 63
> ++++++++++++++++++++--
> MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf | 3 +-
> 2 files changed, 61 insertions(+), 5 deletions(-)
>
> diff --git a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
> b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
> index b9ff812179..e1e48befc2 100644
> --- a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
> +++ b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.c
> @@ -21,6 +21,7 @@
> #include <Library/UefiRuntimeServicesTableLib.h>
> #include <Library/UefiLib.h>
> #include <Library/PrintLib.h>
> +#include <Library/BmpSupportLib.h>
> #include <Protocol/GraphicsOutput.h>
> #include <Guid/GlobalVariable.h>
> #include <Guid/CapsuleReport.h>
> @@ -173,15 +174,21 @@ CreateBmpFmp (
> EFI_DISPLAY_CAPSULE *DisplayCapsule;
> EFI_STATUS Status;
> 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);
> if (EFI_ERROR(Status)) {
> Print(L"CapsuleApp: NO GOP is found.\n");
> return EFI_UNSUPPORTED;
> }
> + Info = Gop->Mode->Info;
> Print(L"Current GOP: Mode - %d, ", Gop->Mode->Mode);
> - Print(L"HorizontalResolution - %d, ",
> Gop->Mode->Info->HorizontalResolution);
> - Print(L"VerticalResolution - %d\n", Gop->Mode->Info->VerticalResolution);
> + Print(L"HorizontalResolution - %d, ", Info->HorizontalResolution);
> + Print(L"VerticalResolution - %d\n", Info->VerticalResolution);
> // HorizontalResolution >= BMP_IMAGE_HEADER.PixelWidth
> // VerticalResolution >= BMP_IMAGE_HEADER.PixelHeight
>
> @@ -207,6 +214,35 @@ CreateBmpFmp (
> 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;
> FullCapsuleBuffer = AllocatePool(FullCapsuleBufferSize);
> if (FullCapsuleBuffer == NULL) {
> @@ -226,8 +262,27 @@ CreateBmpFmp (
> DisplayCapsule->ImagePayload.ImageType = 0; // BMP
> DisplayCapsule->ImagePayload.Reserved = 0;
> 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);
>
> diff --git a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf
> b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf
> index b06c4ea1bc..3a67c6b909 100644
> --- a/MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf
> +++ b/MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf
> @@ -4,7 +4,7 @@
> # This application can trigger capsule update process. It can also
> # 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
> # 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
> @@ -63,6 +63,7 @@ [LibraryClasses]
> UefiRuntimeServicesTableLib
> UefiLib
> PrintLib
> + BmpSupportLib
>
> [UserExtensions.TianoCore."ExtraFiles"]
> CapsuleAppExtra.uni
> --
> 2.14.2.windows.3
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
© 2016 - 2026 Red Hat, Inc.