[edk2] [Patch 2/2] MdeModulePkg/CapsuleApp: Center bitmap at bottom of screen

Michael D Kinney posted 2 patches 7 years, 10 months ago
[edk2] [Patch 2/2] MdeModulePkg/CapsuleApp: Center bitmap at bottom of screen
Posted by Michael D Kinney 7 years, 10 months ago
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
Re: [edk2] [Patch 2/2] MdeModulePkg/CapsuleApp: Center bitmap at bottom of screen
Posted by Yao, Jiewen 7 years, 10 months ago
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