]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/HiiDatabaseDxe/Image.c
MdeModulePkg: Refine type cast for pointer subtraction
[mirror_edk2.git] / MdeModulePkg / Universal / HiiDatabaseDxe / Image.c
index c8e9258ba67c217c39ab3bfee4010810b53620e3..e2fa16e6e02bad5abee3cc8c79b68d2adee89930 100644 (file)
@@ -2,7 +2,7 @@
 Implementation for EFI_HII_IMAGE_PROTOCOL.\r
 \r
 \r
-Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2007 - 2017, 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
@@ -643,10 +643,6 @@ HiiNewImage (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  if (!IsHiiHandleValid (PackageList)) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
   Private = HII_IMAGE_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
   PackageListNode = LocatePackageList (&Private->DatabaseList, PackageList);\r
   if (PackageListNode == NULL) {\r
@@ -781,33 +777,34 @@ HiiNewImage (
   This function retrieves the image specified by ImageId which is associated with\r
   the specified PackageList and copies it into the buffer specified by Image.\r
 \r
-  @param  This                   A pointer to the EFI_HII_IMAGE_PROTOCOL instance.\r
+  @param  Database               A pointer to the database list header.\r
   @param  PackageList            Handle of the package list where this image will\r
                                  be searched.\r
   @param  ImageId                The image's id,, which is unique within\r
                                  PackageList.\r
   @param  Image                  Points to the image.\r
+  @param  BitmapOnly             TRUE to only return the bitmap type image.\r
+                                 FALSE to locate image decoder instance to decode image.\r
 \r
   @retval EFI_SUCCESS            The new image was returned successfully.\r
-  @retval EFI_NOT_FOUND           The image specified by ImageId is not in the\r
-                                                database. The specified PackageList is not in the database.\r
+  @retval EFI_NOT_FOUND          The image specified by ImageId is not in the\r
+                                 database. The specified PackageList is not in the database.\r
   @retval EFI_BUFFER_TOO_SMALL   The buffer specified by ImageSize is too small to\r
                                  hold the image.\r
   @retval EFI_INVALID_PARAMETER  The Image or ImageSize was NULL.\r
   @retval EFI_OUT_OF_RESOURCES   The bitmap could not be retrieved because there was not\r
-                                                     enough memory.\r
-\r
+                                 enough memory.\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
-HiiGetImage (\r
-  IN  CONST EFI_HII_IMAGE_PROTOCOL   *This,\r
+IGetImage (\r
+  IN  LIST_ENTRY                     *Database,\r
   IN  EFI_HII_HANDLE                 PackageList,\r
   IN  EFI_IMAGE_ID                   ImageId,\r
-  OUT EFI_IMAGE_INPUT                *Image\r
+  OUT EFI_IMAGE_INPUT                *Image,\r
+  IN  BOOLEAN                        BitmapOnly\r
   )\r
 {\r
-  HII_DATABASE_PRIVATE_DATA           *Private;\r
+  EFI_STATUS                          Status;\r
   HII_DATABASE_PACKAGE_LIST_INSTANCE  *PackageListNode;\r
   HII_IMAGE_PACKAGE_INSTANCE          *ImagePackage;\r
   EFI_HII_IMAGE_BLOCK                 *CurrentImageBlock;\r
@@ -818,17 +815,14 @@ HiiGetImage (
   UINT8                               *PaletteInfo;\r
   UINT8                               PaletteIndex;\r
   UINT16                              PaletteSize;\r
+  EFI_HII_IMAGE_DECODER_PROTOCOL      *Decoder;\r
+  EFI_IMAGE_OUTPUT                    *ImageOut;\r
 \r
-  if (This == NULL || Image == NULL || ImageId == 0) {\r
+  if (Image == NULL || ImageId == 0) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  if (!IsHiiHandleValid (PackageList)) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  Private = HII_IMAGE_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
-  PackageListNode = LocatePackageList (&Private->DatabaseList, PackageList);\r
+  PackageListNode = LocatePackageList (Database, PackageList);\r
   if (PackageListNode == NULL) {\r
     return EFI_NOT_FOUND;\r
   }\r
@@ -845,14 +839,47 @@ HiiGetImage (
     return EFI_NOT_FOUND;\r
   }\r
 \r
+  Image->Flags = 0;\r
   switch (CurrentImageBlock->BlockType) {\r
   case EFI_HII_IIBT_IMAGE_JPEG:\r
   case EFI_HII_IIBT_IMAGE_PNG:\r
+    if (BitmapOnly) {\r
+      return EFI_UNSUPPORTED;\r
+    }\r
+\r
+    ImageOut = NULL;\r
+    Decoder = LocateHiiImageDecoder (CurrentImageBlock->BlockType);\r
+    if (Decoder == NULL) {\r
+      return EFI_UNSUPPORTED;\r
+    }\r
     //\r
-    // HiiImage protocol doesn't support return JPEG/PNG.\r
-    // Use HiiImageEx instead.\r
+    // Use the common block code since the definition of two structures is the same.\r
     //\r
-    return EFI_UNSUPPORTED;\r
+    ASSERT (OFFSET_OF (EFI_HII_IIBT_JPEG_BLOCK, Data) == OFFSET_OF (EFI_HII_IIBT_PNG_BLOCK, Data));\r
+    ASSERT (sizeof (((EFI_HII_IIBT_JPEG_BLOCK *) CurrentImageBlock)->Data) ==\r
+            sizeof (((EFI_HII_IIBT_PNG_BLOCK *) CurrentImageBlock)->Data));\r
+    ASSERT (OFFSET_OF (EFI_HII_IIBT_JPEG_BLOCK, Size) == OFFSET_OF (EFI_HII_IIBT_PNG_BLOCK, Size));\r
+    ASSERT (sizeof (((EFI_HII_IIBT_JPEG_BLOCK *) CurrentImageBlock)->Size) ==\r
+            sizeof (((EFI_HII_IIBT_PNG_BLOCK *) CurrentImageBlock)->Size));\r
+    Status = Decoder->DecodeImage (\r
+      Decoder,\r
+      ((EFI_HII_IIBT_JPEG_BLOCK *) CurrentImageBlock)->Data,\r
+      ((EFI_HII_IIBT_JPEG_BLOCK *) CurrentImageBlock)->Size,\r
+      &ImageOut,\r
+      FALSE\r
+    );\r
+\r
+    //\r
+    // Spec requires to use the first capable image decoder instance.\r
+    // The first image decoder instance may fail to decode the image.\r
+    //\r
+    if (!EFI_ERROR (Status)) {\r
+      Image->Bitmap = ImageOut->Image.Bitmap;\r
+      Image->Height = ImageOut->Height;\r
+      Image->Width = ImageOut->Width;\r
+      FreePool (ImageOut);\r
+    }\r
+    return Status;\r
 \r
   case EFI_HII_IIBT_IMAGE_1BIT_TRANS:\r
   case EFI_HII_IIBT_IMAGE_4BIT_TRANS:\r
@@ -870,7 +897,7 @@ HiiGetImage (
     CopyMem (&Iibt1bit, CurrentImageBlock, sizeof (EFI_HII_IIBT_IMAGE_1BIT_BLOCK));\r
     ImageLength = sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) *\r
                   (Iibt1bit.Bitmap.Width * Iibt1bit.Bitmap.Height);\r
-    Image->Bitmap = (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) AllocateZeroPool (ImageLength);\r
+    Image->Bitmap = AllocateZeroPool (ImageLength);\r
     if (Image->Bitmap == NULL) {\r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
@@ -943,6 +970,41 @@ HiiGetImage (
   }\r
 }\r
 \r
+/**\r
+  This function retrieves the image specified by ImageId which is associated with\r
+  the specified PackageList and copies it into the buffer specified by Image.\r
+\r
+  @param  This                   A pointer to the EFI_HII_IMAGE_PROTOCOL instance.\r
+  @param  PackageList            Handle of the package list where this image will\r
+                                 be searched.\r
+  @param  ImageId                The image's id,, which is unique within\r
+                                 PackageList.\r
+  @param  Image                  Points to the image.\r
+\r
+  @retval EFI_SUCCESS            The new image was returned successfully.\r
+  @retval EFI_NOT_FOUND           The image specified by ImageId is not in the\r
+                                                database. The specified PackageList is not in the database.\r
+  @retval EFI_BUFFER_TOO_SMALL   The buffer specified by ImageSize is too small to\r
+                                 hold the image.\r
+  @retval EFI_INVALID_PARAMETER  The Image or ImageSize was NULL.\r
+  @retval EFI_OUT_OF_RESOURCES   The bitmap could not be retrieved because there was not\r
+                                 enough memory.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetImage (\r
+  IN  CONST EFI_HII_IMAGE_PROTOCOL   *This,\r
+  IN  EFI_HII_HANDLE                 PackageList,\r
+  IN  EFI_IMAGE_ID                   ImageId,\r
+  OUT EFI_IMAGE_INPUT                *Image\r
+  )\r
+{\r
+  HII_DATABASE_PRIVATE_DATA           *Private;\r
+  Private = HII_IMAGE_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
+  return IGetImage (&Private->DatabaseList, PackageList, ImageId, Image, TRUE);\r
+}\r
+\r
 \r
 /**\r
   This function updates the image specified by ImageId in the specified PackageListHandle to\r
@@ -984,10 +1046,6 @@ HiiSetImage (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  if (!IsHiiHandleValid (PackageList)) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
   Private = HII_IMAGE_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
   PackageListNode = LocatePackageList (&Private->DatabaseList, PackageList);\r
   if (PackageListNode == NULL) {\r
@@ -1066,7 +1124,7 @@ HiiSetImage (
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  Part1Size = (UINT32) (UINTN) ((UINT8 *) CurrentImageBlock - (UINT8 *) ImagePackage->ImageBlock);\r
+  Part1Size = (UINT32) ((UINTN) CurrentImageBlock - (UINTN) ImagePackage->ImageBlock);\r
   Part2Size = ImagePackage->ImageBlockSize - Part1Size - OldBlockSize;\r
   CopyMem (ImageBlocks, ImagePackage->ImageBlock, Part1Size);\r
 \r
@@ -1394,10 +1452,6 @@ HiiDrawImageId (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  if (!IsHiiHandleValid (PackageList)) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
   //\r
   // Get the specified Image.\r
   //\r