Implementation for EFI_HII_IMAGE_PROTOCOL.\r
\r
\r
-Copyright (c) 2007 - 2008, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2007 - 2016, 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
http://opensource.org/licenses/bsd-license.php\r
\r
#include "HiiDatabase.h"\r
\r
-#ifndef _DISABLE_UNUSED_HII_PROTOCOLS_\r
\r
/**\r
Get the imageid of last image block: EFI_HII_IIBT_END_BLOCK when input\r
\r
This is a internal function.\r
\r
- @param ImageBlock Points to the beginning of a series of image blocks stored in order.\r
+ @param ImageBlocks Points to the beginning of a series of image blocks stored in order.\r
@param ImageId If input ImageId is 0, output the image id of the EFI_HII_IIBT_END_BLOCK;\r
else use this id to find its corresponding image block address.\r
\r
@return The image block address when input ImageId is not zero; otherwise return NULL.\r
\r
**/\r
-UINT8*\r
+EFI_HII_IMAGE_BLOCK *\r
GetImageIdOrAddress (\r
- IN UINT8 *ImageBlock,\r
- IN OUT EFI_IMAGE_ID *ImageId\r
+ IN EFI_HII_IMAGE_BLOCK *ImageBlocks,\r
+ IN OUT EFI_IMAGE_ID *ImageId\r
)\r
{\r
EFI_IMAGE_ID ImageIdCurrent;\r
- UINT8 *ImageBlockHdr;\r
- UINT8 Length8;\r
- UINT16 Length16;\r
- UINT32 Length32;\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
-\r
- ASSERT (ImageBlock != NULL && ImageId != NULL);\r
-\r
- ImageBlockHdr = ImageBlock;\r
- ImageIdCurrent = 1;\r
-\r
- while (((EFI_HII_IMAGE_BLOCK *) ImageBlock)->BlockType != EFI_HII_IIBT_END) {\r
- if (*ImageId > 0) {\r
+ EFI_HII_IMAGE_BLOCK *CurrentImageBlock;\r
+ UINTN Length;\r
+\r
+ ASSERT (ImageBlocks != NULL && ImageId != NULL);\r
+ CurrentImageBlock = ImageBlocks;\r
+ ImageIdCurrent = 1;\r
+\r
+ while (CurrentImageBlock->BlockType != EFI_HII_IIBT_END) {\r
+ if (*ImageId != 0) {\r
if (*ImageId == ImageIdCurrent) {\r
//\r
// If the found image block is a duplicate block, update the ImageId to\r
// find the previous defined image block.\r
//\r
- if (((EFI_HII_IMAGE_BLOCK *) ImageBlock)->BlockType == EFI_HII_IIBT_DUPLICATE) {\r
- CopyMem (ImageId, ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK), sizeof (EFI_IMAGE_ID));\r
+ if (CurrentImageBlock->BlockType == EFI_HII_IIBT_DUPLICATE) {\r
+ *ImageId = ReadUnaligned16 ((VOID *) &((EFI_HII_IIBT_DUPLICATE_BLOCK *) CurrentImageBlock)->ImageId);\r
ASSERT (*ImageId != ImageIdCurrent);\r
- ImageBlock = ImageBlockHdr;\r
+ ASSERT (*ImageId != 0);\r
+ CurrentImageBlock = ImageBlocks;\r
ImageIdCurrent = 1;\r
continue;\r
}\r
\r
- return ImageBlock;\r
+ return CurrentImageBlock;\r
}\r
if (*ImageId < ImageIdCurrent) {\r
//\r
return NULL;\r
}\r
}\r
- switch (((EFI_HII_IMAGE_BLOCK *) ImageBlock)->BlockType) {\r
+ switch (CurrentImageBlock->BlockType) {\r
case EFI_HII_IIBT_EXT1:\r
- Length8 = *(ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK) + sizeof (UINT8));\r
- ImageBlock += Length8;\r
- ImageIdCurrent++;\r
+ Length = ((EFI_HII_IIBT_EXT1_BLOCK *) CurrentImageBlock)->Length;\r
break;\r
case EFI_HII_IIBT_EXT2:\r
- CopyMem (\r
- &Length16,\r
- ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK) + sizeof (UINT8),\r
- sizeof (UINT16)\r
- );\r
- ImageBlock += Length16;\r
- ImageIdCurrent++;\r
+ Length = ReadUnaligned16 (&((EFI_HII_IIBT_EXT2_BLOCK *) CurrentImageBlock)->Length);\r
break;\r
case EFI_HII_IIBT_EXT4:\r
- CopyMem (\r
- &Length32,\r
- ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK) + sizeof (UINT8),\r
- sizeof (UINT32)\r
- );\r
- ImageBlock += Length32;\r
- ImageIdCurrent++;\r
+ Length = ReadUnaligned32 ((VOID *) &((EFI_HII_IIBT_EXT4_BLOCK *) CurrentImageBlock)->Length);\r
break;\r
\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
- ImageBlock += sizeof (EFI_HII_IIBT_IMAGE_1BIT_BLOCK) - sizeof (UINT8) +\r
- BITMAP_LEN_1_BIT (Iibt1bit.Bitmap.Width, Iibt1bit.Bitmap.Height);\r
+ Length = sizeof (EFI_HII_IIBT_IMAGE_1BIT_BLOCK) - sizeof (UINT8) +\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
ImageIdCurrent++;\r
break;\r
\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
- ImageBlock += sizeof (EFI_HII_IIBT_IMAGE_4BIT_BLOCK) - sizeof (UINT8) +\r
- BITMAP_LEN_4_BIT (Iibt4bit.Bitmap.Width, Iibt4bit.Bitmap.Height);\r
+ Length = sizeof (EFI_HII_IIBT_IMAGE_4BIT_BLOCK) - sizeof (UINT8) +\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
ImageIdCurrent++;\r
break;\r
\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
- ImageBlock += sizeof (EFI_HII_IIBT_IMAGE_8BIT_BLOCK) - sizeof (UINT8) +\r
- BITMAP_LEN_8_BIT (Iibt8bit.Bitmap.Width, Iibt8bit.Bitmap.Height);\r
+ Length = sizeof (EFI_HII_IIBT_IMAGE_8BIT_BLOCK) - sizeof (UINT8) +\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
ImageIdCurrent++;\r
break;\r
\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
- ImageBlock += sizeof (EFI_HII_IIBT_IMAGE_24BIT_BLOCK) - sizeof (EFI_HII_RGB_PIXEL) +\r
- BITMAP_LEN_24_BIT (Width, Height);\r
+ Length = sizeof (EFI_HII_IIBT_IMAGE_24BIT_BLOCK) - sizeof (EFI_HII_RGB_PIXEL) +\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
ImageIdCurrent++;\r
break;\r
\r
case EFI_HII_IIBT_DUPLICATE:\r
- ImageBlock += sizeof (EFI_HII_IIBT_DUPLICATE_BLOCK);\r
+ Length = sizeof (EFI_HII_IIBT_DUPLICATE_BLOCK);\r
ImageIdCurrent++;\r
break;\r
\r
case EFI_HII_IIBT_IMAGE_JPEG:\r
- CopyMem (&Length32, ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK), sizeof (UINT32));\r
- ImageBlock += Length32;\r
+ Length = ReadUnaligned32 ((VOID *) &((EFI_HII_IIBT_JPEG_BLOCK *) CurrentImageBlock)->Size);\r
ImageIdCurrent++;\r
break;\r
\r
case EFI_HII_IIBT_SKIP1:\r
- Length8 = *(ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK));\r
- ImageBlock += sizeof (EFI_HII_IIBT_SKIP1_BLOCK);\r
- ImageIdCurrent = (UINT16) (ImageIdCurrent + Length8);\r
+ Length = sizeof (EFI_HII_IIBT_SKIP1_BLOCK);\r
+ ImageIdCurrent += ((EFI_HII_IIBT_SKIP1_BLOCK *) CurrentImageBlock)->SkipCount;\r
break;\r
\r
case EFI_HII_IIBT_SKIP2:\r
- CopyMem (&Length16, ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK), sizeof (UINT16));\r
- ImageBlock += sizeof (EFI_HII_IIBT_SKIP2_BLOCK);\r
- ImageIdCurrent = (UINT16) (ImageIdCurrent + Length16);\r
+ Length = sizeof (EFI_HII_IIBT_SKIP2_BLOCK);\r
+ ImageIdCurrent += ReadUnaligned16 ((VOID *) &((EFI_HII_IIBT_SKIP2_BLOCK *) CurrentImageBlock)->SkipCount);\r
break;\r
\r
default:\r
// Unknown image blocks can not be skipped, processing halts.\r
//\r
ASSERT (FALSE);\r
+ Length = 0;\r
+ break;\r
}\r
+\r
+ CurrentImageBlock = (EFI_HII_IMAGE_BLOCK *) ((UINT8 *) CurrentImageBlock + Length);\r
+\r
}\r
\r
//\r
//\r
if (*ImageId == 0) {\r
*ImageId = ImageIdCurrent;\r
- return ImageBlock;\r
+ return CurrentImageBlock;\r
}\r
\r
return NULL;\r
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BitMapPtr;\r
EFI_GRAPHICS_OUTPUT_BLT_PIXEL PaletteValue[2];\r
EFI_HII_IMAGE_PALETTE_INFO *Palette;\r
- UINT16 PaletteSize;\r
+ UINTN PaletteSize;\r
UINT8 Byte;\r
\r
ASSERT (Image != NULL && Data != NULL && PaletteInfo != NULL);\r
//\r
// First entry corresponds to color 0 and second entry corresponds to color 1.\r
//\r
+ PaletteSize = 0;\r
CopyMem (&PaletteSize, PaletteInfo, sizeof (UINT16));\r
PaletteSize += sizeof (UINT16);\r
Palette = AllocateZeroPool (PaletteSize);\r
ASSERT (Palette != NULL);\r
+ if (Palette == NULL) {\r
+ return;\r
+ }\r
CopyMem (Palette, PaletteInfo, PaletteSize);\r
\r
ZeroMem (PaletteValue, sizeof (PaletteValue));\r
CopyRgbToGopPixel (&PaletteValue[0], &Palette->PaletteValue[0], 1);\r
CopyRgbToGopPixel (&PaletteValue[1], &Palette->PaletteValue[1], 1);\r
- SafeFreePool (Palette);\r
+ FreePool (Palette);\r
\r
//\r
// Convert the pixel from one bit to corresponding color.\r
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BitMapPtr;\r
EFI_GRAPHICS_OUTPUT_BLT_PIXEL PaletteValue[16];\r
EFI_HII_IMAGE_PALETTE_INFO *Palette;\r
- UINT16 PaletteSize;\r
+ UINTN PaletteSize;\r
UINT16 PaletteNum;\r
UINT8 Byte;\r
\r
//\r
// The bitmap should allocate each color index starting from 0.\r
//\r
+ PaletteSize = 0;\r
CopyMem (&PaletteSize, PaletteInfo, sizeof (UINT16));\r
PaletteSize += sizeof (UINT16);\r
Palette = AllocateZeroPool (PaletteSize);\r
ASSERT (Palette != NULL);\r
+ if (Palette == NULL) {\r
+ return;\r
+ }\r
CopyMem (Palette, PaletteInfo, PaletteSize);\r
PaletteNum = (UINT16)(Palette->PaletteSize / sizeof (EFI_HII_RGB_PIXEL));\r
\r
ZeroMem (PaletteValue, sizeof (PaletteValue));\r
CopyRgbToGopPixel (PaletteValue, Palette->PaletteValue, PaletteNum);\r
- SafeFreePool (Palette);\r
+ FreePool (Palette);\r
\r
//\r
// Convert the pixel from 4 bit to corresponding color.\r
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BitMapPtr;\r
EFI_GRAPHICS_OUTPUT_BLT_PIXEL PaletteValue[256];\r
EFI_HII_IMAGE_PALETTE_INFO *Palette;\r
- UINT16 PaletteSize;\r
+ UINTN PaletteSize;\r
UINT16 PaletteNum;\r
UINT8 Byte;\r
\r
//\r
// The bitmap should allocate each color index starting from 0.\r
//\r
+ PaletteSize = 0;\r
CopyMem (&PaletteSize, PaletteInfo, sizeof (UINT16));\r
PaletteSize += sizeof (UINT16);\r
Palette = AllocateZeroPool (PaletteSize);\r
ASSERT (Palette != NULL);\r
+ if (Palette == NULL) {\r
+ return;\r
+ }\r
CopyMem (Palette, PaletteInfo, PaletteSize);\r
PaletteNum = (UINT16)(Palette->PaletteSize / sizeof (EFI_HII_RGB_PIXEL));\r
ZeroMem (PaletteValue, sizeof (PaletteValue));\r
CopyRgbToGopPixel (PaletteValue, Palette->PaletteValue, PaletteNum);\r
- SafeFreePool (Palette);\r
+ FreePool (Palette);\r
\r
//\r
// Convert the pixel from 8 bits to corresponding color.\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Return the HII package list identified by PackageList HII handle.\r
+\r
+ @param Database Pointer to HII database list header.\r
+ @param PackageList HII handle of the package list to locate.\r
+\r
+ @retval The HII package list instance.\r
+**/\r
+HII_DATABASE_PACKAGE_LIST_INSTANCE *\r
+LocatePackageList (\r
+ IN LIST_ENTRY *Database,\r
+ IN EFI_HII_HANDLE PackageList\r
+ )\r
+{\r
+ LIST_ENTRY *Link;\r
+ HII_DATABASE_RECORD *Record;\r
+\r
+ //\r
+ // Get the specified package list and image package.\r
+ //\r
+ for (Link = GetFirstNode (Database);\r
+ !IsNull (Database, Link);\r
+ Link = GetNextNode (Database, Link)\r
+ ) {\r
+ Record = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE);\r
+ if (Record->Handle == PackageList) {\r
+ return Record->PackageList;\r
+ }\r
+ }\r
+ return NULL;\r
+}\r
\r
/**\r
This function adds the image Image to the group of images owned by PackageList, and returns\r
)\r
{\r
HII_DATABASE_PRIVATE_DATA *Private;\r
- LIST_ENTRY *Link;\r
- HII_DATABASE_RECORD *DatabaseRecord;\r
HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageListNode;\r
HII_IMAGE_PACKAGE_INSTANCE *ImagePackage;\r
UINT8 *ImageBlock;\r
}\r
\r
Private = HII_IMAGE_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
-\r
- //\r
- // Get the specified package list\r
- //\r
-\r
- PackageListNode = NULL;\r
-\r
- for (Link = Private->DatabaseList.ForwardLink;\r
- Link != &Private->DatabaseList;\r
- Link = Link->ForwardLink\r
- ) {\r
- DatabaseRecord = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE);\r
- if (DatabaseRecord->Handle == PackageList) {\r
- PackageListNode = DatabaseRecord->PackageList;\r
- break;\r
- }\r
- }\r
-\r
+ PackageListNode = LocatePackageList (&Private->DatabaseList, PackageList);\r
if (PackageListNode == NULL) {\r
return EFI_NOT_FOUND;\r
}\r
ImagePackage->ImageBlock,\r
ImagePackage->ImageBlockSize - sizeof (EFI_HII_IIBT_END_BLOCK)\r
);\r
- SafeFreePool (ImagePackage->ImageBlock);\r
- ImagePackage->ImageBlock = ImageBlock;\r
+ FreePool (ImagePackage->ImageBlock);\r
+ ImagePackage->ImageBlock = (EFI_HII_IMAGE_BLOCK *) ImageBlock;\r
ImageBlock += ImagePackage->ImageBlockSize - sizeof (EFI_HII_IIBT_END_BLOCK);\r
//\r
// Temp memory to store new block.\r
//\r
NewBlock = AllocateZeroPool (NewBlockSize);\r
if (NewBlock == NULL) {\r
- SafeFreePool (ImagePackage->ImageBlock);\r
- ImagePackage->ImageBlock = NULL;\r
+ FreePool (ImagePackage->ImageBlock);\r
return EFI_OUT_OF_RESOURCES;\r
}\r
NewBlockPtr = NewBlock;\r
// Fill in image blocks.\r
//\r
ImagePackage->ImageBlockSize = (UINT32) BlockSize;\r
- ImagePackage->ImageBlock = (UINT8 *) AllocateZeroPool (BlockSize);\r
+ ImagePackage->ImageBlock = AllocateZeroPool (BlockSize);\r
if (ImagePackage->ImageBlock == NULL) {\r
- SafeFreePool (ImagePackage);\r
+ FreePool (ImagePackage);\r
return EFI_OUT_OF_RESOURCES;\r
}\r
- ImageBlock = ImagePackage->ImageBlock;\r
+ ImageBlock = (UINT8 *) ImagePackage->ImageBlock;\r
\r
//\r
// Temp memory to store new block.\r
//\r
NewBlock = AllocateZeroPool (NewBlockSize);\r
if (NewBlock == NULL) {\r
- SafeFreePool (ImagePackage->ImageBlock);\r
- SafeFreePool (ImagePackage);\r
+ FreePool (ImagePackage->ImageBlock);\r
+ FreePool (ImagePackage);\r
return EFI_OUT_OF_RESOURCES;\r
}\r
NewBlockPtr = NewBlock;\r
CopyGopToRgbPixel ((EFI_HII_RGB_PIXEL *) NewBlock, ImageIn->Bitmap, ImageIn->Width * ImageIn->Height);\r
\r
CopyMem (ImageBlock, NewBlockPtr, NewBlockSize);\r
- SafeFreePool (NewBlockPtr);\r
+ FreePool (NewBlockPtr);\r
\r
//\r
// Append the block end\r
ImageBlock += NewBlockSize;\r
((EFI_HII_IIBT_END_BLOCK *) (ImageBlock))->Header.BlockType = EFI_HII_IIBT_END;\r
\r
+ //\r
+ // Check whether need to get the contents of HiiDataBase.\r
+ // Only after ReadyToBoot to do the export.\r
+ //\r
+ if (gExportAfterReadyToBoot) {\r
+ HiiGetDatabaseInfo(&Private->HiiDatabase);\r
+ }\r
+\r
return EFI_SUCCESS;\r
}\r
\r
)\r
{\r
HII_DATABASE_PRIVATE_DATA *Private;\r
- LIST_ENTRY *Link;\r
- HII_DATABASE_RECORD *DatabaseRecord;\r
HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageListNode;\r
HII_IMAGE_PACKAGE_INSTANCE *ImagePackage;\r
UINT8 *ImageBlock;\r
}\r
\r
Private = HII_IMAGE_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
-\r
- //\r
- // Get the specified package list and image package.\r
- //\r
- PackageListNode = NULL;\r
- for (Link = Private->DatabaseList.ForwardLink;\r
- Link != &Private->DatabaseList;\r
- Link = Link->ForwardLink\r
- ) {\r
- DatabaseRecord = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE);\r
- if (DatabaseRecord->Handle == PackageList) {\r
- PackageListNode = DatabaseRecord->PackageList;\r
- break;\r
- }\r
- }\r
+ PackageListNode = LocatePackageList (&Private->DatabaseList, PackageList);\r
if (PackageListNode == NULL) {\r
return EFI_NOT_FOUND;\r
}\r
// Find the image block specified by ImageId\r
//\r
LocalImageId = ImageId;\r
- ImageBlock = GetImageIdOrAddress (ImagePackage->ImageBlock, &LocalImageId);\r
+ ImageBlock = (UINT8 *) GetImageIdOrAddress (ImagePackage->ImageBlock, &LocalImageId);\r
if (ImageBlock == NULL) {\r
return EFI_NOT_FOUND;\r
}\r
// BUGBUG: need to be supported as soon as image tool is designed.\r
//\r
return EFI_UNSUPPORTED;\r
- break;\r
\r
case EFI_HII_IIBT_IMAGE_1BIT_TRANS:\r
case EFI_HII_IIBT_IMAGE_4BIT_TRANS:\r
if (BlockType == EFI_HII_IIBT_IMAGE_1BIT || BlockType == EFI_HII_IIBT_IMAGE_1BIT_TRANS) {\r
Output1bitPixel (\r
Image,\r
- (UINT8 *) (ImageBlock + sizeof (EFI_HII_IIBT_IMAGE_1BIT_BLOCK) - sizeof (UINT8)),\r
+ (UINT8 *) ((UINTN)ImageBlock + sizeof (EFI_HII_IIBT_IMAGE_1BIT_BLOCK) - sizeof (UINT8)),\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
Output4bitPixel (\r
Image,\r
- (UINT8 *) (ImageBlock + sizeof (EFI_HII_IIBT_IMAGE_4BIT_BLOCK) - sizeof (UINT8)),\r
+ (UINT8 *) ((UINTN)ImageBlock + sizeof (EFI_HII_IIBT_IMAGE_4BIT_BLOCK) - sizeof (UINT8)),\r
(EFI_HII_IMAGE_PALETTE_INFO *) PaletteInfo\r
);\r
} else {\r
Output8bitPixel (\r
Image,\r
- (UINT8 *) (ImageBlock + sizeof (EFI_HII_IIBT_IMAGE_8BIT_BLOCK) - sizeof (UINT8)),\r
+ (UINT8 *) ((UINTN)ImageBlock + sizeof (EFI_HII_IIBT_IMAGE_8BIT_BLOCK) - sizeof (UINT8)),\r
(EFI_HII_IMAGE_PALETTE_INFO *) PaletteInfo\r
);\r
}\r
\r
return EFI_SUCCESS;\r
- break;\r
\r
case EFI_HII_IIBT_IMAGE_24BIT_TRANS:\r
Flag = TRUE;\r
(EFI_HII_RGB_PIXEL *) (ImageBlock + sizeof (EFI_HII_IIBT_IMAGE_24BIT_BLOCK) - sizeof (EFI_HII_RGB_PIXEL))\r
);\r
return EFI_SUCCESS;\r
- break;\r
\r
default:\r
return EFI_NOT_FOUND;\r
- break;\r
}\r
}\r
\r
)\r
{\r
HII_DATABASE_PRIVATE_DATA *Private;\r
- LIST_ENTRY *Link;\r
- HII_DATABASE_RECORD *DatabaseRecord;\r
HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageListNode;\r
HII_IMAGE_PACKAGE_INSTANCE *ImagePackage;\r
UINT8 *ImageBlock;\r
}\r
\r
Private = HII_IMAGE_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
-\r
- //\r
- // Get the specified package list and image package.\r
- //\r
- PackageListNode = NULL;\r
- for (Link = Private->DatabaseList.ForwardLink;\r
- Link != &Private->DatabaseList;\r
- Link = Link->ForwardLink\r
- ) {\r
- DatabaseRecord = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE);\r
- if (DatabaseRecord->Handle == PackageList) {\r
- PackageListNode = DatabaseRecord->PackageList;\r
- break;\r
- }\r
- }\r
+ PackageListNode = LocatePackageList (&Private->DatabaseList, PackageList);\r
if (PackageListNode == NULL) {\r
return EFI_NOT_FOUND;\r
}\r
// Find the image block specified by ImageId\r
//\r
LocalImageId = ImageId;\r
- ImageBlock = GetImageIdOrAddress (ImagePackage->ImageBlock, &LocalImageId);\r
+ ImageBlock = (UINT8 *) GetImageIdOrAddress (ImagePackage->ImageBlock, &LocalImageId);\r
if (ImageBlock == NULL) {\r
return EFI_NOT_FOUND;\r
}\r
// BUGBUG: need to be supported as soon as image tool is designed.\r
//\r
return EFI_UNSUPPORTED;\r
- break;\r
\r
case EFI_HII_IIBT_IMAGE_1BIT:\r
case EFI_HII_IIBT_IMAGE_1BIT_TRANS:\r
break;\r
default:\r
return EFI_NOT_FOUND;\r
- break;\r
}\r
\r
//\r
BlockSize = ImagePackage->ImageBlockSize + NewBlockSize - OldBlockSize;\r
Block = (UINT8 *) AllocateZeroPool (BlockSize);\r
if (Block == NULL) {\r
- SafeFreePool (NewBlock);\r
+ FreePool (NewBlock);\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
BlockPtr = Block;\r
- Part1Size = (UINT32) (ImageBlock - ImagePackage->ImageBlock);\r
+ Part1Size = (UINT32) (ImageBlock - (UINT8 *) ImagePackage->ImageBlock);\r
Part2Size = ImagePackage->ImageBlockSize - Part1Size - OldBlockSize;\r
CopyMem (BlockPtr, ImagePackage->ImageBlock, Part1Size);\r
BlockPtr += Part1Size;\r
BlockPtr += NewBlockSize;\r
CopyMem (BlockPtr, ImageBlock + OldBlockSize, Part2Size);\r
\r
- SafeFreePool (ImagePackage->ImageBlock);\r
- SafeFreePool (NewBlock);\r
- ImagePackage->ImageBlock = Block;\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
PackageListNode->PackageListHdr.PackageLength += NewBlockSize - OldBlockSize;\r
\r
+ //\r
+ // Check whether need to get the contents of HiiDataBase.\r
+ // Only after ReadyToBoot to do the export.\r
+ //\r
+ if (gExportAfterReadyToBoot) {\r
+ HiiGetDatabaseInfo(&Private->HiiDatabase);\r
+ }\r
+\r
return EFI_SUCCESS;\r
\r
}\r
UINTN OffsetY2;\r
EFI_FONT_DISPLAY_INFO *FontInfo;\r
UINTN Index;\r
- EFI_CONSOLE_CONTROL_PROTOCOL *Console;\r
\r
if (This == NULL || Image == NULL || Blt == NULL) {\r
return EFI_INVALID_PARAMETER;\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
+ FontInfo = NULL;\r
ImageIn = (EFI_IMAGE_INPUT *) Image;\r
\r
//\r
// Draw the image to existing bitmap or screen depending on flag.\r
//\r
if ((Flags & EFI_HII_DIRECT_TO_SCREEN) == EFI_HII_DIRECT_TO_SCREEN) {\r
- Status = gBS->LocateProtocol (\r
- &gEfiConsoleControlProtocolGuid,\r
- NULL,\r
- (VOID **) &Console\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
+ //\r
+ // Caller should make sure the current UGA console is grarphic mode.\r
+ //\r
\r
- Console->SetMode (Console, EfiConsoleControlScreenGraphics);\r
//\r
// Write the image directly to the output device specified by Screen.\r
//\r
\r
}\r
\r
- SafeFreePool (BltBuffer);\r
+ FreePool (BltBuffer);\r
return Status;\r
\r
} else {\r
\r
ImageOut = (EFI_IMAGE_OUTPUT *) AllocateZeroPool (sizeof (EFI_IMAGE_OUTPUT));\r
if (ImageOut == NULL) {\r
- SafeFreePool (BltBuffer);\r
+ FreePool (BltBuffer);\r
return EFI_OUT_OF_RESOURCES;\r
}\r
ImageOut->Width = (UINT16) Width;\r
//\r
Status = GetSystemFont (Private, &FontInfo, NULL);\r
if (EFI_ERROR (Status)) {\r
- SafeFreePool (BltBuffer);\r
- SafeFreePool (ImageOut);\r
+ FreePool (BltBuffer);\r
+ FreePool (ImageOut);\r
return Status;\r
}\r
+ ASSERT (FontInfo != NULL);\r
for (Index = 0; Index < Width * Height; Index++) {\r
BltBuffer[Index] = FontInfo->BackgroundColor;\r
}\r
- SafeFreePool (FontInfo);\r
+ FreePool (FontInfo);\r
\r
//\r
// Draw the incoming image to the new created image.\r
// Draw this image.\r
//\r
Status = HiiDrawImage (This, Flags, &Image, Blt, BltX, BltY);\r
- SafeFreePool (Image.Bitmap);\r
+ if (Image.Bitmap != NULL) {\r
+ FreePool (Image.Bitmap);\r
+ }\r
return Status;\r
}\r
\r
-#endif\r
-\r