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
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
//\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
// 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
//\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
//\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