MdeModulePkg/HiiDatabase: Refine HiiNewImage()

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>
This commit is contained in:
Ruiyu Ni 2016-09-21 11:18:15 +08:00
parent 9d91ff0ea4
commit 4518ff61c0

View File

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