mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-27 07:34:06 +02:00
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:
parent
9d91ff0ea4
commit
4518ff61c0
@ -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.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user