]> git.proxmox.com Git - mirror_edk2.git/commitdiff
IntelFrameworkModulePkg: Update GenericBdsLib to use BootLogo protocol to report...
authorxdu2 <xdu2@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 4 Nov 2011 08:28:09 +0000 (08:28 +0000)
committerxdu2 <xdu2@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 4 Nov 2011 08:28:09 +0000 (08:28 +0000)
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

IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConsole.c
IntelFrameworkModulePkg/Library/GenericBdsLib/Bmp.h [deleted file]
IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
IntelFrameworkModulePkg/Universal/BdsDxe/Bds.h
IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf
IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c

index f86cadf25b6fc81614b9961297323e3dc8faa773..f29c624223042c1223448182f2e52ca49f751d93 100644 (file)
@@ -13,7 +13,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 **/\r
 \r
 #include "InternalBdsLib.h"\r
-#include "Bmp.h"\r
+#include <IndustryStandard/Bmp.h>\r
+\r
+#include <Protocol/BootLogo.h>\r
 \r
 /**\r
   Check if we need to save the EFI variable with "ConVarName" as name\r
@@ -786,6 +788,17 @@ EnableQuietBoot (
   UINT32                        ColorDepth;\r
   UINT32                        RefreshRate;\r
   EFI_GRAPHICS_OUTPUT_PROTOCOL  *GraphicsOutput;\r
+  EFI_BOOT_LOGO_PROTOCOL        *BootLogo;\r
+  UINTN                         NumberOfLogos;\r
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL *LogoBlt;\r
+  UINTN                         LogoDestX;\r
+  UINTN                         LogoDestY;\r
+  UINTN                         LogoHeight;\r
+  UINTN                         LogoWidth;\r
+  UINTN                         NewDestX;\r
+  UINTN                         NewDestY;\r
+  UINTN                         NewHeight;\r
+  UINTN                         NewWidth;\r
 \r
   UgaDraw = NULL;\r
   //\r
@@ -803,6 +816,12 @@ EnableQuietBoot (
     return EFI_UNSUPPORTED;\r
   }\r
 \r
+  //\r
+  // Try to open Boot Logo Protocol.\r
+  //\r
+  BootLogo = NULL;\r
+  gBS->LocateProtocol (&gEfiBootLogoProtocolGuid, NULL, (VOID **) &BootLogo);\r
+\r
   //\r
   // Erase Cursor from screen\r
   //\r
@@ -824,6 +843,16 @@ EnableQuietBoot (
     return EFI_UNSUPPORTED;\r
   }\r
 \r
+  Blt = NULL;\r
+  NumberOfLogos = 0;\r
+  LogoDestX = 0;\r
+  LogoDestY = 0;\r
+  LogoHeight = 0;\r
+  LogoWidth = 0;\r
+  NewDestX = 0;\r
+  NewDestY = 0;\r
+  NewHeight = 0;\r
+  NewWidth = 0;\r
   Instance = 0;\r
   while (1) {\r
     ImageData = NULL;\r
@@ -844,7 +873,7 @@ EnableQuietBoot (
                           &CoordinateY\r
                           );\r
       if (EFI_ERROR (Status)) {\r
-        return Status;\r
+        goto Done;\r
       }\r
 \r
       //\r
@@ -870,6 +899,9 @@ EnableQuietBoot (
       Attribute   = EfiBadgingDisplayAttributeCenter;\r
     }\r
 \r
+    if (Blt != NULL) {\r
+      FreePool (Blt);\r
+    }\r
     Blt = NULL;\r
     Status = ConvertBmpToGopBlt (\r
               ImageData,\r
@@ -972,21 +1004,117 @@ EnableQuietBoot (
                             Width * sizeof (EFI_UGA_PIXEL)\r
                             );\r
       } else {\r
-      Status = EFI_UNSUPPORTED;\r
+        Status = EFI_UNSUPPORTED;\r
+      }\r
+\r
+      //\r
+      // Report displayed Logo information.\r
+      //\r
+      if (!EFI_ERROR (Status)) {\r
+        NumberOfLogos++;\r
+\r
+        if (LogoWidth == 0) {\r
+          //\r
+          // The first Logo.\r
+          //\r
+          LogoDestX = DestX;\r
+          LogoDestY = DestY;\r
+          LogoWidth = Width;\r
+          LogoHeight = Height;\r
+        } else {\r
+          //\r
+          // Merge new logo with old one.\r
+          //\r
+          NewDestX = MIN ((UINTN) DestX, LogoDestX);\r
+          NewDestY = MIN ((UINTN) DestY, LogoDestY);\r
+          NewWidth = MAX ((UINTN) DestX + Width, LogoDestX + LogoWidth) - NewDestX;\r
+          NewHeight = MAX ((UINTN) DestY + Height, LogoDestY + LogoHeight) - NewDestY;\r
+\r
+          LogoDestX = NewDestX;\r
+          LogoDestY = NewDestY;\r
+          LogoWidth = NewWidth;\r
+          LogoHeight = NewHeight;\r
+        }\r
       }\r
     }\r
 \r
     FreePool (ImageData);\r
 \r
+    if (Badging == NULL) {\r
+      break;\r
+    }\r
+  }\r
+\r
+Done:\r
+  if (BootLogo == NULL || NumberOfLogos == 0) {\r
+    //\r
+    // No logo displayed.\r
+    //\r
     if (Blt != NULL) {\r
       FreePool (Blt);\r
     }\r
 \r
-    if (Badging == NULL) {\r
-      break;\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Advertise displayed Logo information.\r
+  //\r
+  if (NumberOfLogos == 1) {\r
+    //\r
+    // Only one logo displayed, use its Blt buffer directly for BootLogo protocol.\r
+    //\r
+    LogoBlt = Blt;\r
+    Status = EFI_SUCCESS;\r
+  } else {\r
+    //\r
+    // More than one Logo displayed, get merged BltBuffer using VideoToBuffer operation. \r
+    //\r
+    if (Blt != NULL) {\r
+      FreePool (Blt);\r
+    }\r
+\r
+    LogoBlt = AllocateZeroPool (LogoWidth * LogoHeight * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));\r
+    if (LogoBlt == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+\r
+    if (GraphicsOutput != NULL) {\r
+      Status = GraphicsOutput->Blt (\r
+                          GraphicsOutput,\r
+                          LogoBlt,\r
+                          EfiBltVideoToBltBuffer,\r
+                          LogoDestX,\r
+                          LogoDestY,\r
+                          0,\r
+                          0,\r
+                          LogoWidth,\r
+                          LogoHeight,\r
+                          LogoWidth * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
+                          );\r
+    } else if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
+      Status = UgaDraw->Blt (\r
+                          UgaDraw,\r
+                          (EFI_UGA_PIXEL *) LogoBlt,\r
+                          EfiUgaVideoToBltBuffer,\r
+                          LogoDestX,\r
+                          LogoDestY,\r
+                          0,\r
+                          0,\r
+                          LogoWidth,\r
+                          LogoHeight,\r
+                          LogoWidth * sizeof (EFI_UGA_PIXEL)\r
+                          );\r
+    } else {\r
+      Status = EFI_UNSUPPORTED;\r
     }\r
   }\r
 \r
+  if (!EFI_ERROR (Status)) {\r
+    BootLogo->SetBootLogo (BootLogo, LogoBlt, LogoDestX, LogoDestY, LogoWidth, LogoHeight);\r
+  }\r
+  FreePool (LogoBlt);\r
+\r
   return Status;\r
 }\r
 \r
diff --git a/IntelFrameworkModulePkg/Library/GenericBdsLib/Bmp.h b/IntelFrameworkModulePkg/Library/GenericBdsLib/Bmp.h
deleted file mode 100644 (file)
index d2b75b2..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/** @file\r
-  This file defines BMP file header data structures.\r
-\r
-Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#ifndef _GENERIC_BDS_BMP_H__\r
-#define _GENERIC_BDS_BMP_H__\r
-\r
-#pragma pack(1)\r
-\r
-typedef struct {\r
-  UINT8   Blue;\r
-  UINT8   Green;\r
-  UINT8   Red;\r
-  UINT8   Reserved;\r
-} BMP_COLOR_MAP;\r
-\r
-typedef struct {\r
-  CHAR8         CharB;\r
-  CHAR8         CharM;\r
-  UINT32        Size;\r
-  UINT16        Reserved[2];\r
-  UINT32        ImageOffset;\r
-  UINT32        HeaderSize;\r
-  UINT32        PixelWidth;\r
-  UINT32        PixelHeight;\r
-  UINT16        Planes;          ///< Must be 1\r
-  UINT16        BitPerPixel;     ///< 1, 4, 8, or 24\r
-  UINT32        CompressionType;\r
-  UINT32        ImageSize;       ///< Compressed image size in bytes\r
-  UINT32        XPixelsPerMeter;\r
-  UINT32        YPixelsPerMeter;\r
-  UINT32        NumberOfColors;\r
-  UINT32        ImportantColors;\r
-} BMP_IMAGE_HEADER;\r
-\r
-#pragma pack()\r
-\r
-#endif\r
index 3557444b93696d94dd3ee7d9406ce99883f257cd..5d3aa5fb6ce768d61c0a9b6cd5a435debf65dac1 100644 (file)
@@ -39,7 +39,6 @@
   BdsConsole.c\r
   BdsBoot.c\r
   InternalBdsLib.h\r
-  Bmp.h\r
   String.h\r
   String.c\r
   GenericBdsStrings.uni\r
   gEfiHiiFontProtocolGuid                       # PROTOCOL CONSUMES\r
   gEfiUserManagerProtocolGuid                   # PROTOCOL CONSUMES\r
   gEfiUsbIoProtocolGuid                         # PROTOCOL SOMETIMES_CONSUMES\r
+  gEfiBootLogoProtocolGuid                      # PROTOCOL SOMETIMES_CONSUMES\r
 \r
 [FeaturePcd]\r
   gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport\r
index 1f2d64d2cf63c7a9e0960e7b297fa8d233d67464..008d13e41bff93e37f3762741058a37d83cad9d2 100644 (file)
@@ -45,6 +45,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Protocol/LegacyBios.h>\r
 #include <Protocol/SimpleTextInEx.h>\r
 #include <Protocol/DriverHealth.h>\r
+#include <Protocol/BootLogo.h>\r
 \r
 #include <Library/UefiDriverEntryPoint.h>\r
 #include <Library/PrintLib.h>\r
index 916d2af454c6f4c542c317d0ebe61538dd89c4cc..bb9775343ffa381e6bd8e906ff339f14df57ba1c 100644 (file)
   gEfiDevicePathProtocolGuid                    ## PROTOCOL CONSUMES\r
   gEfiDriverHealthProtocolGuid                  ## PROTOCOL SOMETIMES_CONSUMES\r
   gEfiPciIoProtocolGuid                         ## PROTOCOL CONSUMES\r
+  gEfiBootLogoProtocolGuid                      ## PROTOCOL SOMETIMES_CONSUMES\r
 \r
 [FeaturePcd]\r
   gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultLangDeprecate\r
index 63c14964bf7d1f360e1e7f7735e51e2db7b6b46d..4cd0691b91e33c7aaa077ea40b8f61f455d2e605 100644 (file)
@@ -958,6 +958,7 @@ PlatformBdsEnterFrontPage (
   )\r
 {\r
   EFI_STATUS                    Status;\r
+  EFI_BOOT_LOGO_PROTOCOL        *BootLogo;\r
 \r
   PERF_START (NULL, "BdsTimeOut", "BDS", 0);\r
   //\r
@@ -986,6 +987,14 @@ PlatformBdsEnterFrontPage (
     }\r
   }\r
 \r
+  //\r
+  // Boot Logo is corrupted, report it using Boot Logo protocol.\r
+  //\r
+  Status = gBS->LocateProtocol (&gEfiBootLogoProtocolGuid, NULL, (VOID **) &BootLogo);\r
+  if (!EFI_ERROR (Status) && (BootLogo != NULL)) {\r
+    BootLogo->SetBootLogo (BootLogo, NULL, 0, 0, 0, 0);\r
+  }\r
+\r
   do {\r
 \r
     InitializeFrontPage (FALSE);\r