]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg/HiiDatabase: Refine HiiNewImage()
authorRuiyu Ni <ruiyu.ni@intel.com>
Wed, 21 Sep 2016 03:18:15 +0000 (11:18 +0800)
committerRuiyu Ni <ruiyu.ni@intel.com>
Wed, 28 Sep 2016 08:21:26 +0000 (16:21 +0800)
Contributed-under: TianoCore Contribution Agreement 1.0
Reviewed-by: Liming Gao <liming.gao@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Dandan Bi <dandan.bi@intel.com>
Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
MdeModulePkg/Universal/HiiDatabaseDxe/Image.c

index 6ff397ddd26511606aaff85305e7e941bc85fe1d..d73269cf7d1b5703e41b882d10e5444381e2034a 100644 (file)
@@ -631,12 +631,8 @@ HiiNewImage (
   HII_DATABASE_PRIVATE_DATA           *Private;\r
   HII_DATABASE_PACKAGE_LIST_INSTANCE  *PackageListNode;\r
   HII_IMAGE_PACKAGE_INSTANCE          *ImagePackage;\r
-  UINT8                               *ImageBlock;\r
-  UINTN                               BlockSize;\r
-  UINT8                               *NewBlock;\r
-  UINT8                               *NewBlockPtr;\r
-  UINTN                               NewBlockSize;\r
-  EFI_IMAGE_INPUT                     *ImageIn;\r
+  EFI_HII_IMAGE_BLOCK                 *ImageBlocks;\r
+  UINT32                              NewBlockSize;\r
 \r
   if (This == NULL || ImageId == NULL || Image == NULL || Image->Bitmap == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -652,10 +648,8 @@ HiiNewImage (
     return EFI_NOT_FOUND;\r
   }\r
 \r
-  ImageIn = (EFI_IMAGE_INPUT *) Image;\r
-\r
   NewBlockSize = sizeof (EFI_HII_IIBT_IMAGE_24BIT_BLOCK) - sizeof (EFI_HII_RGB_PIXEL) +\r
-                 BITMAP_LEN_24_BIT (ImageIn->Width, ImageIn->Height);\r
+                 BITMAP_LEN_24_BIT (Image->Width, Image->Height);\r
 \r
   //\r
   // Get the image package in the package list,\r
@@ -674,38 +668,33 @@ HiiNewImage (
     //\r
     // Update the package's image block by appending the new block to the end.\r
     //\r
-    BlockSize  = ImagePackage->ImageBlockSize + NewBlockSize;\r
-    ImageBlock = (UINT8 *) AllocateZeroPool (BlockSize);\r
-    if (ImageBlock == NULL) {\r
+    ImageBlocks = AllocatePool (ImagePackage->ImageBlockSize + NewBlockSize);\r
+    if (ImageBlocks == NULL) {\r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
     //\r
     // Copy the original content.\r
     //\r
     CopyMem (\r
-      ImageBlock,\r
+      ImageBlocks,\r
       ImagePackage->ImageBlock,\r
       ImagePackage->ImageBlockSize - sizeof (EFI_HII_IIBT_END_BLOCK)\r
       );\r
     FreePool (ImagePackage->ImageBlock);\r
-    ImagePackage->ImageBlock = (EFI_HII_IMAGE_BLOCK *) ImageBlock;\r
-    ImageBlock += ImagePackage->ImageBlockSize - sizeof (EFI_HII_IIBT_END_BLOCK);\r
+    ImagePackage->ImageBlock = ImageBlocks;\r
+\r
     //\r
-    // Temp memory to store new block.\r
+    // Point to the very last block.\r
     //\r
-    NewBlock = AllocateZeroPool (NewBlockSize);\r
-    if (NewBlock == NULL) {\r
-      FreePool (ImagePackage->ImageBlock);\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
-    NewBlockPtr = NewBlock;\r
-\r
+    ImageBlocks = (EFI_HII_IMAGE_BLOCK *) (\r
+                    (UINT8 *) ImageBlocks + ImagePackage->ImageBlockSize - sizeof (EFI_HII_IIBT_END_BLOCK)\r
+                    );\r
     //\r
     // Update the length record.\r
     //\r
-    ImagePackage->ImageBlockSize = (UINT32) BlockSize;\r
-    ImagePackage->ImagePkgHdr.Header.Length += (UINT32) NewBlockSize;\r
-    PackageListNode->PackageListHdr.PackageLength += (UINT32) NewBlockSize;\r
+    ImagePackage->ImageBlockSize                  += NewBlockSize;\r
+    ImagePackage->ImagePkgHdr.Header.Length       += NewBlockSize;\r
+    PackageListNode->PackageListHdr.PackageLength += NewBlockSize;\r
 \r
   } else {\r
     //\r
@@ -721,11 +710,10 @@ HiiNewImage (
     // first image block so that id is initially to one.\r
     //\r
     *ImageId = 1;\r
-    BlockSize    = sizeof (EFI_HII_IIBT_END_BLOCK) + NewBlockSize;\r
     //\r
     // Fill in image package header.\r
     //\r
-    ImagePackage->ImagePkgHdr.Header.Length     = (UINT32) BlockSize + sizeof (EFI_HII_IMAGE_PACKAGE_HDR);\r
+    ImagePackage->ImagePkgHdr.Header.Length     = sizeof (EFI_HII_IMAGE_PACKAGE_HDR) + NewBlockSize + sizeof (EFI_HII_IIBT_END_BLOCK);\r
     ImagePackage->ImagePkgHdr.Header.Type       = EFI_HII_PACKAGE_IMAGES;\r
     ImagePackage->ImagePkgHdr.ImageInfoOffset   = sizeof (EFI_HII_IMAGE_PACKAGE_HDR);\r
     ImagePackage->ImagePkgHdr.PaletteInfoOffset = 0;\r
@@ -739,24 +727,13 @@ HiiNewImage (
     //\r
     // Fill in image blocks.\r
     //\r
-    ImagePackage->ImageBlockSize = (UINT32) BlockSize;\r
-    ImagePackage->ImageBlock = AllocateZeroPool (BlockSize);\r
+    ImagePackage->ImageBlockSize = NewBlockSize + sizeof (EFI_HII_IIBT_END_BLOCK);\r
+    ImagePackage->ImageBlock = AllocateZeroPool (NewBlockSize + sizeof (EFI_HII_IIBT_END_BLOCK));\r
     if (ImagePackage->ImageBlock == NULL) {\r
       FreePool (ImagePackage);\r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
-    ImageBlock = (UINT8 *) ImagePackage->ImageBlock;\r
-\r
-    //\r
-    // Temp memory to store new block.\r
-    //\r
-    NewBlock = AllocateZeroPool (NewBlockSize);\r
-    if (NewBlock == NULL) {\r
-      FreePool (ImagePackage->ImageBlock);\r
-      FreePool (ImagePackage);\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
-    NewBlockPtr = NewBlock;\r
+    ImageBlocks = ImagePackage->ImageBlock;\r
 \r
     //\r
     // Insert this image package.\r
@@ -768,26 +745,20 @@ HiiNewImage (
   //\r
   // Append the new block here\r
   //\r
-  if (ImageIn->Flags == EFI_IMAGE_TRANSPARENT) {\r
-    *NewBlock = EFI_HII_IIBT_IMAGE_24BIT_TRANS;\r
+  if (Image->Flags == EFI_IMAGE_TRANSPARENT) {\r
+    ImageBlocks->BlockType = EFI_HII_IIBT_IMAGE_24BIT_TRANS;\r
   } else {\r
-    *NewBlock = EFI_HII_IIBT_IMAGE_24BIT;\r
+    ImageBlocks->BlockType = EFI_HII_IIBT_IMAGE_24BIT;\r
   }\r
-  NewBlock++;\r
-  CopyMem (NewBlock, &ImageIn->Width, sizeof (UINT16));\r
-  NewBlock += sizeof (UINT16);\r
-  CopyMem (NewBlock, &ImageIn->Height, sizeof (UINT16));\r
-  NewBlock += sizeof (UINT16);\r
-  CopyGopToRgbPixel ((EFI_HII_RGB_PIXEL *) NewBlock, ImageIn->Bitmap, ImageIn->Width * ImageIn->Height);\r
-\r
-  CopyMem (ImageBlock, NewBlockPtr, NewBlockSize);\r
-  FreePool (NewBlockPtr);\r
+  WriteUnaligned16 ((VOID *) &((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *) ImageBlocks)->Bitmap.Width, Image->Width);\r
+  WriteUnaligned16 ((VOID *) &((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *) ImageBlocks)->Bitmap.Height, Image->Height);\r
+  CopyGopToRgbPixel (((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *) ImageBlocks)->Bitmap.Bitmap, Image->Bitmap, Image->Width * Image->Height);\r
 \r
   //\r
   // Append the block end\r
   //\r
-  ImageBlock += NewBlockSize;\r
-  ((EFI_HII_IIBT_END_BLOCK *) (ImageBlock))->Header.BlockType = EFI_HII_IIBT_END;\r
+  ImageBlocks = (EFI_HII_IMAGE_BLOCK *) ((UINT8 *) ImageBlocks + NewBlockSize);\r
+  ImageBlocks->BlockType = EFI_HII_IIBT_END;\r
 \r
   //\r
   // Check whether need to get the contents of HiiDataBase.\r