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
break;\r
\r
case EFI_HII_IIBT_IMAGE_JPEG:\r
- Length = ReadUnaligned32 ((VOID *) &((EFI_HII_IIBT_JPEG_BLOCK *) CurrentImageBlock)->Size);\r
+ Length = OFFSET_OF (EFI_HII_IIBT_JPEG_BLOCK, Data) + ReadUnaligned32 ((VOID *) &((EFI_HII_IIBT_JPEG_BLOCK *) CurrentImageBlock)->Size);\r
+ ImageIdCurrent++;\r
+ break;\r
+\r
+ case EFI_HII_IIBT_IMAGE_PNG:\r
+ Length = OFFSET_OF (EFI_HII_IIBT_PNG_BLOCK, Data) + ReadUnaligned32 ((VOID *) &((EFI_HII_IIBT_PNG_BLOCK *) CurrentImageBlock)->Size);\r
ImageIdCurrent++;\r
break;\r
\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
if (PackageListNode == NULL) {\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 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
- UINT8 *ImageBlock;\r
- EFI_IMAGE_ID LocalImageId;\r
- UINT8 BlockType;\r
+ EFI_HII_IMAGE_BLOCK *CurrentImageBlock;\r
EFI_HII_IIBT_IMAGE_1BIT_BLOCK Iibt1bit;\r
UINT16 Width;\r
UINT16 Height;\r
UINTN ImageLength;\r
- BOOLEAN Flag;\r
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 < 1) {\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
//\r
// Find the image block specified by ImageId\r
//\r
- LocalImageId = ImageId;\r
- ImageBlock = (UINT8 *) GetImageIdOrAddress (ImagePackage->ImageBlock, &LocalImageId);\r
- if (ImageBlock == NULL) {\r
+ CurrentImageBlock = GetImageIdOrAddress (ImagePackage->ImageBlock, &ImageId);\r
+ if (CurrentImageBlock == NULL) {\r
return EFI_NOT_FOUND;\r
}\r
\r
- Flag = FALSE;\r
- BlockType = *ImageBlock;\r
-\r
- switch (BlockType) {\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
- // BUGBUG: need to be supported as soon as image tool is designed.\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
case EFI_HII_IIBT_IMAGE_8BIT_TRANS:\r
- Flag = TRUE;\r
+ Image->Flags = EFI_IMAGE_TRANSPARENT;\r
//\r
// fall through\r
//\r
//\r
// Use the common block code since the definition of these structures is the same.\r
//\r
- CopyMem (&Iibt1bit, ImageBlock, sizeof (EFI_HII_IIBT_IMAGE_1BIT_BLOCK));\r
+ 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
\r
- if (Flag) {\r
- Image->Flags = EFI_IMAGE_TRANSPARENT;\r
- }\r
Image->Width = Iibt1bit.Bitmap.Width;\r
Image->Height = Iibt1bit.Bitmap.Height;\r
\r
//\r
// Output bitmap data\r
//\r
- if (BlockType == EFI_HII_IIBT_IMAGE_1BIT || BlockType == EFI_HII_IIBT_IMAGE_1BIT_TRANS) {\r
+ if (CurrentImageBlock->BlockType == EFI_HII_IIBT_IMAGE_1BIT ||\r
+ CurrentImageBlock->BlockType == EFI_HII_IIBT_IMAGE_1BIT_TRANS) {\r
Output1bitPixel (\r
Image,\r
- (UINT8 *) ((UINTN)ImageBlock + sizeof (EFI_HII_IIBT_IMAGE_1BIT_BLOCK) - sizeof (UINT8)),\r
+ ((EFI_HII_IIBT_IMAGE_1BIT_BLOCK *) CurrentImageBlock)->Bitmap.Data,\r
(EFI_HII_IMAGE_PALETTE_INFO *) PaletteInfo\r
);\r
- } else if (BlockType == EFI_HII_IIBT_IMAGE_4BIT || BlockType == EFI_HII_IIBT_IMAGE_4BIT_TRANS) {\r
+ } else if (CurrentImageBlock->BlockType == EFI_HII_IIBT_IMAGE_4BIT ||\r
+ CurrentImageBlock->BlockType == EFI_HII_IIBT_IMAGE_4BIT_TRANS) {\r
Output4bitPixel (\r
Image,\r
- (UINT8 *) ((UINTN)ImageBlock + sizeof (EFI_HII_IIBT_IMAGE_4BIT_BLOCK) - sizeof (UINT8)),\r
+ ((EFI_HII_IIBT_IMAGE_4BIT_BLOCK *) CurrentImageBlock)->Bitmap.Data,\r
(EFI_HII_IMAGE_PALETTE_INFO *) PaletteInfo\r
);\r
} else {\r
Output8bitPixel (\r
Image,\r
- (UINT8 *) ((UINTN)ImageBlock + sizeof (EFI_HII_IIBT_IMAGE_8BIT_BLOCK) - sizeof (UINT8)),\r
+ ((EFI_HII_IIBT_IMAGE_8BIT_BLOCK *) CurrentImageBlock)->Bitmap.Data,\r
(EFI_HII_IMAGE_PALETTE_INFO *) PaletteInfo\r
);\r
}\r
return EFI_SUCCESS;\r
\r
case EFI_HII_IIBT_IMAGE_24BIT_TRANS:\r
- Flag = TRUE;\r
+ Image->Flags = EFI_IMAGE_TRANSPARENT;\r
//\r
// fall through\r
//\r
case EFI_HII_IIBT_IMAGE_24BIT:\r
- CopyMem (&Width, ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK), sizeof (UINT16));\r
- CopyMem (\r
- &Height,\r
- ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK) + sizeof (UINT16),\r
- sizeof (UINT16)\r
- );\r
+ Width = ReadUnaligned16 ((VOID *) &((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *) CurrentImageBlock)->Bitmap.Width);\r
+ Height = ReadUnaligned16 ((VOID *) &((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *) CurrentImageBlock)->Bitmap.Height);\r
ImageLength = sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) * (Width * 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
\r
- if (Flag) {\r
- Image->Flags = EFI_IMAGE_TRANSPARENT;\r
- }\r
Image->Width = Width;\r
Image->Height = Height;\r
\r
//\r
- // Output the bimap data directly.\r
+ // Output the bitmap data directly.\r
//\r
Output24bitPixel (\r
Image,\r
- (EFI_HII_RGB_PIXEL *) (ImageBlock + sizeof (EFI_HII_IIBT_IMAGE_24BIT_BLOCK) - sizeof (EFI_HII_RGB_PIXEL))\r
+ ((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *) CurrentImageBlock)->Bitmap.Bitmap\r
);\r
return EFI_SUCCESS;\r
\r
}\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
HII_DATABASE_PRIVATE_DATA *Private;\r
HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageListNode;\r
HII_IMAGE_PACKAGE_INSTANCE *ImagePackage;\r
- UINT8 *ImageBlock;\r
- EFI_IMAGE_ID LocalImageId;\r
- UINT8 BlockType;\r
- EFI_HII_IIBT_IMAGE_1BIT_BLOCK Iibt1bit;\r
- EFI_HII_IIBT_IMAGE_4BIT_BLOCK Iibt4bit;\r
- EFI_HII_IIBT_IMAGE_8BIT_BLOCK Iibt8bit;\r
- UINT16 Width;\r
- UINT16 Height;\r
- UINT32 BlockSize;\r
+ EFI_HII_IMAGE_BLOCK *CurrentImageBlock;\r
+ EFI_HII_IMAGE_BLOCK *ImageBlocks;\r
+ EFI_HII_IMAGE_BLOCK *NewImageBlock;\r
UINT32 NewBlockSize;\r
UINT32 OldBlockSize;\r
- EFI_IMAGE_INPUT *ImageIn;\r
- UINT8 *NewBlock;\r
- UINT8 *NewBlockPtr;\r
- UINT8 *Block;\r
- UINT8 *BlockPtr;\r
UINT32 Part1Size;\r
UINT32 Part2Size;\r
\r
- if (This == NULL || Image == NULL || ImageId < 1 || Image->Bitmap == NULL) {\r
+ if (This == NULL || Image == NULL || ImageId == 0 || Image->Bitmap == NULL) {\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
if (PackageListNode == NULL) {\r
//\r
// Find the image block specified by ImageId\r
//\r
- LocalImageId = ImageId;\r
- ImageBlock = (UINT8 *) GetImageIdOrAddress (ImagePackage->ImageBlock, &LocalImageId);\r
- if (ImageBlock == NULL) {\r
+ CurrentImageBlock = GetImageIdOrAddress (ImagePackage->ImageBlock, &ImageId);\r
+ if (CurrentImageBlock == NULL) {\r
return EFI_NOT_FOUND;\r
}\r
\r
- BlockType = *ImageBlock;\r
-\r
//\r
// Get the size of original image block. Use some common block code here\r
// since the definition of some structures is the same.\r
//\r
- switch (BlockType) {\r
+ switch (CurrentImageBlock->BlockType) {\r
case EFI_HII_IIBT_IMAGE_JPEG:\r
- //\r
- // BUGBUG: need to be supported as soon as image tool is designed.\r
- //\r
- return EFI_UNSUPPORTED;\r
-\r
+ OldBlockSize = OFFSET_OF (EFI_HII_IIBT_JPEG_BLOCK, Data) + ReadUnaligned32 ((VOID *) &((EFI_HII_IIBT_JPEG_BLOCK *) CurrentImageBlock)->Size);\r
+ break;\r
+ case EFI_HII_IIBT_IMAGE_PNG:\r
+ OldBlockSize = OFFSET_OF (EFI_HII_IIBT_PNG_BLOCK, Data) + ReadUnaligned32 ((VOID *) &((EFI_HII_IIBT_PNG_BLOCK *) CurrentImageBlock)->Size);\r
+ break;\r
case EFI_HII_IIBT_IMAGE_1BIT:\r
case EFI_HII_IIBT_IMAGE_1BIT_TRANS:\r
- CopyMem (&Iibt1bit, ImageBlock, sizeof (EFI_HII_IIBT_IMAGE_1BIT_BLOCK));\r
OldBlockSize = sizeof (EFI_HII_IIBT_IMAGE_1BIT_BLOCK) - sizeof (UINT8) +\r
- BITMAP_LEN_1_BIT (Iibt1bit.Bitmap.Width, Iibt1bit.Bitmap.Height);\r
+ BITMAP_LEN_1_BIT (\r
+ ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_1BIT_BLOCK *) CurrentImageBlock)->Bitmap.Width),\r
+ ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_1BIT_BLOCK *) CurrentImageBlock)->Bitmap.Height)\r
+ );\r
break;\r
case EFI_HII_IIBT_IMAGE_4BIT:\r
case EFI_HII_IIBT_IMAGE_4BIT_TRANS:\r
- CopyMem (&Iibt4bit, ImageBlock, sizeof (EFI_HII_IIBT_IMAGE_4BIT_BLOCK));\r
OldBlockSize = sizeof (EFI_HII_IIBT_IMAGE_4BIT_BLOCK) - sizeof (UINT8) +\r
- BITMAP_LEN_4_BIT (Iibt4bit.Bitmap.Width, Iibt4bit.Bitmap.Height);\r
+ BITMAP_LEN_4_BIT (\r
+ ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_4BIT_BLOCK *) CurrentImageBlock)->Bitmap.Width),\r
+ ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_4BIT_BLOCK *) CurrentImageBlock)->Bitmap.Height)\r
+ );\r
break;\r
case EFI_HII_IIBT_IMAGE_8BIT:\r
case EFI_HII_IIBT_IMAGE_8BIT_TRANS:\r
- CopyMem (&Iibt8bit, ImageBlock, sizeof (EFI_HII_IIBT_IMAGE_8BIT_BLOCK));\r
OldBlockSize = sizeof (EFI_HII_IIBT_IMAGE_8BIT_BLOCK) - sizeof (UINT8) +\r
- BITMAP_LEN_8_BIT (Iibt8bit.Bitmap.Width, Iibt8bit.Bitmap.Height);\r
+ BITMAP_LEN_8_BIT (\r
+ ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_8BIT_BLOCK *) CurrentImageBlock)->Bitmap.Width),\r
+ ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_8BIT_BLOCK *) CurrentImageBlock)->Bitmap.Height)\r
+ );\r
break;\r
case EFI_HII_IIBT_IMAGE_24BIT:\r
case EFI_HII_IIBT_IMAGE_24BIT_TRANS:\r
- CopyMem (&Width, ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK), sizeof (UINT16));\r
- CopyMem (\r
- &Height,\r
- ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK) + sizeof (UINT16),\r
- sizeof (UINT16)\r
- );\r
OldBlockSize = sizeof (EFI_HII_IIBT_IMAGE_24BIT_BLOCK) - sizeof (EFI_HII_RGB_PIXEL) +\r
- BITMAP_LEN_24_BIT (Width , Height);\r
+ BITMAP_LEN_24_BIT (\r
+ ReadUnaligned16 ((VOID *) &((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *) CurrentImageBlock)->Bitmap.Width),\r
+ ReadUnaligned16 ((VOID *) &((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *) CurrentImageBlock)->Bitmap.Height)\r
+ );\r
break;\r
default:\r
return EFI_NOT_FOUND;\r
//\r
// Create the new image block according to input image.\r
//\r
- ImageIn = (EFI_IMAGE_INPUT *) Image;\r
NewBlockSize = sizeof (EFI_HII_IIBT_IMAGE_24BIT_BLOCK) - sizeof (EFI_HII_RGB_PIXEL) +\r
- BITMAP_LEN_24_BIT (ImageIn->Width, ImageIn->Height);\r
- NewBlock = (UINT8 *) AllocateZeroPool (NewBlockSize);\r
- if (NewBlock == NULL) {\r
+ BITMAP_LEN_24_BIT (Image->Width, Image->Height);\r
+ //\r
+ // Adjust the image package to remove the original block firstly then add the new block.\r
+ //\r
+ ImageBlocks = AllocateZeroPool (ImagePackage->ImageBlockSize + NewBlockSize - OldBlockSize);\r
+ if (ImageBlocks == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
- NewBlockPtr = NewBlock;\r
- if ((ImageIn->Flags & EFI_IMAGE_TRANSPARENT) == EFI_IMAGE_TRANSPARENT) {\r
- *NewBlockPtr = EFI_HII_IIBT_IMAGE_24BIT_TRANS;\r
- } else {\r
- *NewBlockPtr = EFI_HII_IIBT_IMAGE_24BIT;\r
- }\r
- NewBlockPtr++;\r
-\r
- CopyMem (NewBlockPtr, &ImageIn->Width, sizeof (UINT16));\r
- NewBlockPtr += sizeof (UINT16);\r
- CopyMem (NewBlockPtr, &ImageIn->Height, sizeof (UINT16));\r
- NewBlockPtr += sizeof (UINT16);\r
-\r
- CopyGopToRgbPixel ((EFI_HII_RGB_PIXEL *) NewBlockPtr, ImageIn->Bitmap, ImageIn->Width * ImageIn->Height);\r
+ Part1Size = (UINT32) ((UINTN) CurrentImageBlock - (UINTN) ImagePackage->ImageBlock);\r
+ Part2Size = ImagePackage->ImageBlockSize - Part1Size - OldBlockSize;\r
+ CopyMem (ImageBlocks, ImagePackage->ImageBlock, Part1Size);\r
\r
//\r
- // Adjust the image package to remove the original block firstly then add the new block.\r
+ // Set the new image block\r
//\r
- BlockSize = ImagePackage->ImageBlockSize + NewBlockSize - OldBlockSize;\r
- Block = (UINT8 *) AllocateZeroPool (BlockSize);\r
- if (Block == NULL) {\r
- FreePool (NewBlock);\r
- return EFI_OUT_OF_RESOURCES;\r
+ NewImageBlock = (EFI_HII_IMAGE_BLOCK *) ((UINT8 *) ImageBlocks + Part1Size);\r
+ if ((Image->Flags & EFI_IMAGE_TRANSPARENT) == EFI_IMAGE_TRANSPARENT) {\r
+ NewImageBlock->BlockType= EFI_HII_IIBT_IMAGE_24BIT_TRANS;\r
+ } else {\r
+ NewImageBlock->BlockType = EFI_HII_IIBT_IMAGE_24BIT;\r
}\r
+ WriteUnaligned16 ((VOID *) &((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *) NewImageBlock)->Bitmap.Width, Image->Width);\r
+ WriteUnaligned16 ((VOID *) &((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *) NewImageBlock)->Bitmap.Height, Image->Height);\r
+ CopyGopToRgbPixel (((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *) NewImageBlock)->Bitmap.Bitmap,\r
+ Image->Bitmap, Image->Width * Image->Height);\r
\r
- BlockPtr = Block;\r
- Part1Size = (UINT32) (ImageBlock - (UINT8 *) ImagePackage->ImageBlock);\r
- Part2Size = ImagePackage->ImageBlockSize - Part1Size - OldBlockSize;\r
- CopyMem (BlockPtr, ImagePackage->ImageBlock, Part1Size);\r
- BlockPtr += Part1Size;\r
- CopyMem (BlockPtr, NewBlock, NewBlockSize);\r
- BlockPtr += NewBlockSize;\r
- CopyMem (BlockPtr, ImageBlock + OldBlockSize, Part2Size);\r
+ CopyMem ((UINT8 *) NewImageBlock + NewBlockSize, (UINT8 *) CurrentImageBlock + OldBlockSize, Part2Size);\r
\r
FreePool (ImagePackage->ImageBlock);\r
- FreePool (NewBlock);\r
- ImagePackage->ImageBlock = (EFI_HII_IMAGE_BLOCK *) Block;\r
- ImagePackage->ImageBlockSize = BlockSize;\r
- ImagePackage->ImagePkgHdr.Header.Length += NewBlockSize - OldBlockSize;\r
+ ImagePackage->ImageBlock = ImageBlocks;\r
+ ImagePackage->ImageBlockSize += NewBlockSize - OldBlockSize;\r
+ ImagePackage->ImagePkgHdr.Header.Length += NewBlockSize - OldBlockSize;\r
PackageListNode->PackageListHdr.PackageLength += NewBlockSize - OldBlockSize;\r
\r
//\r
EFI_STATUS Status;\r
HII_DATABASE_PRIVATE_DATA *Private;\r
BOOLEAN Transparent;\r
- EFI_IMAGE_INPUT *ImageIn;\r
EFI_IMAGE_OUTPUT *ImageOut;\r
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer;\r
UINTN BufferLen;\r
}\r
\r
FontInfo = NULL;\r
- ImageIn = (EFI_IMAGE_INPUT *) Image;\r
\r
//\r
// Check whether the image will be drawn transparently or opaquely.\r
// Now EFI_HII_DRAW_FLAG_DEFAULT is set, whether image will be drawn depending\r
// on the image's transparency setting.\r
//\r
- if ((ImageIn->Flags & EFI_IMAGE_TRANSPARENT) == EFI_IMAGE_TRANSPARENT) {\r
+ if ((Image->Flags & EFI_IMAGE_TRANSPARENT) == EFI_IMAGE_TRANSPARENT) {\r
Transparent = TRUE;\r
}\r
}\r
// Clip the image by (Width, Height)\r
//\r
\r
- Width = ImageIn->Width;\r
- Height = ImageIn->Height;\r
+ Width = Image->Width;\r
+ Height = Image->Height;\r
\r
if (Width > (*Blt)->Width - BltX) {\r
Width = (*Blt)->Width - BltX;\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
- if (Width == ImageIn->Width && Height == ImageIn->Height) {\r
- CopyMem (BltBuffer, ImageIn->Bitmap, BufferLen);\r
+ if (Width == Image->Width && Height == Image->Height) {\r
+ CopyMem (BltBuffer, Image->Bitmap, BufferLen);\r
} else {\r
for (Ypos = 0; Ypos < Height; Ypos++) {\r
- OffsetY1 = ImageIn->Width * Ypos;\r
+ OffsetY1 = Image->Width * Ypos;\r
OffsetY2 = Width * Ypos;\r
for (Xpos = 0; Xpos < Width; Xpos++) {\r
- BltBuffer[OffsetY2 + Xpos] = ImageIn->Bitmap[OffsetY1 + Xpos];\r
+ BltBuffer[OffsetY2 + Xpos] = Image->Bitmap[OffsetY1 + Xpos];\r
}\r
}\r
}\r
//\r
// Allocate a new bitmap to hold the incoming image.\r
//\r
- Width = ImageIn->Width + BltX;\r
- Height = ImageIn->Height + BltY;\r
+ Width = Image->Width + BltX;\r
+ Height = Image->Height + BltY;\r
\r
BufferLen = Width * Height * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);\r
BltBuffer = (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) AllocateZeroPool (BufferLen);\r
//\r
*Blt = ImageOut;\r
return ImageToBlt (\r
- ImageIn->Bitmap,\r
+ Image->Bitmap,\r
BltX,\r
BltY,\r
- ImageIn->Width,\r
- ImageIn->Height,\r
+ Image->Width,\r
+ Image->Height,\r
Transparent,\r
Blt\r
);\r
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