#include <Library/UefiRuntimeServicesTableLib.h>\r
#include <Library/UefiLib.h>\r
#include <Library/PrintLib.h>\r
+#include <Library/BmpSupportLib.h>\r
#include <Protocol/GraphicsOutput.h>\r
#include <Guid/GlobalVariable.h>\r
#include <Guid/CapsuleReport.h>\r
EFI_DISPLAY_CAPSULE *DisplayCapsule;\r
EFI_STATUS Status;\r
EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop;\r
+ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
+ EFI_GRAPHICS_OUTPUT_BLT_PIXEL *GopBlt;\r
+ UINTN GopBltSize;\r
+ UINTN Height;\r
+ UINTN Width;\r
\r
Status = gBS->LocateProtocol(&gEfiGraphicsOutputProtocolGuid, NULL, (VOID **)&Gop);\r
if (EFI_ERROR(Status)) {\r
Print(L"CapsuleApp: NO GOP is found.\n");\r
return EFI_UNSUPPORTED;\r
}\r
+ Info = Gop->Mode->Info;\r
Print(L"Current GOP: Mode - %d, ", Gop->Mode->Mode);\r
- Print(L"HorizontalResolution - %d, ", Gop->Mode->Info->HorizontalResolution);\r
- Print(L"VerticalResolution - %d\n", Gop->Mode->Info->VerticalResolution);\r
+ Print(L"HorizontalResolution - %d, ", Info->HorizontalResolution);\r
+ Print(L"VerticalResolution - %d\n", Info->VerticalResolution);\r
// HorizontalResolution >= BMP_IMAGE_HEADER.PixelWidth\r
// VerticalResolution >= BMP_IMAGE_HEADER.PixelHeight\r
\r
goto Done;\r
}\r
\r
+ GopBlt = NULL;\r
+ Status = TranslateBmpToGopBlt (\r
+ BmpBuffer,\r
+ FileSize,\r
+ &GopBlt,\r
+ &GopBltSize,\r
+ &Height,\r
+ &Width\r
+ );\r
+ if (EFI_ERROR(Status)) {\r
+ Print(L"CapsuleApp: BMP image (%s) is not valid.\n", BmpName);\r
+ goto Done;\r
+ }\r
+ if (GopBlt != NULL) {\r
+ FreePool (GopBlt);\r
+ }\r
+ Print(L"BMP image (%s), Width - %d, Height - %d\n", BmpName, Width, Height);\r
+\r
+ if (Height > Info->VerticalResolution) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ Print(L"CapsuleApp: BMP image (%s) height is larger than current resolution.\n", BmpName);\r
+ goto Done;\r
+ }\r
+ if (Width > Info->HorizontalResolution) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ Print(L"CapsuleApp: BMP image (%s) width is larger than current resolution.\n", BmpName);\r
+ goto Done;\r
+ }\r
+\r
FullCapsuleBufferSize = sizeof(EFI_DISPLAY_CAPSULE) + FileSize;\r
FullCapsuleBuffer = AllocatePool(FullCapsuleBufferSize);\r
if (FullCapsuleBuffer == NULL) {\r
DisplayCapsule->ImagePayload.ImageType = 0; // BMP\r
DisplayCapsule->ImagePayload.Reserved = 0;\r
DisplayCapsule->ImagePayload.Mode = Gop->Mode->Mode;\r
- DisplayCapsule->ImagePayload.OffsetX = 0;\r
- DisplayCapsule->ImagePayload.OffsetY = 0;\r
+\r
+ //\r
+ // Center the bitmap horizontally\r
+ //\r
+ DisplayCapsule->ImagePayload.OffsetX = (UINT32)((Info->HorizontalResolution - Width) / 2);\r
+\r
+ //\r
+ // Put bitmap 3/4 down the display. If bitmap is too tall, then align bottom\r
+ // of bitmap at bottom of display.\r
+ //\r
+ DisplayCapsule->ImagePayload.OffsetY =\r
+ MIN (\r
+ (UINT32)(Info->VerticalResolution - Height),\r
+ (UINT32)(((3 * Info->VerticalResolution) - (2 * Height)) / 4)\r
+ );\r
+\r
+ Print(L"BMP image (%s), OffsetX - %d, OffsetY - %d\n",\r
+ BmpName,\r
+ DisplayCapsule->ImagePayload.OffsetX,\r
+ DisplayCapsule->ImagePayload.OffsetY\r
+ );\r
\r
CopyMem((DisplayCapsule + 1), BmpBuffer, FileSize);\r
\r