30 IN EFI_HII_IMAGE_BLOCK *ImageBlocks,
31 IN OUT EFI_IMAGE_ID *ImageId
34 EFI_IMAGE_ID ImageIdCurrent;
35 EFI_HII_IMAGE_BLOCK *CurrentImageBlock;
38 ASSERT (ImageBlocks != NULL && ImageId != NULL);
39 CurrentImageBlock = ImageBlocks;
42 while (CurrentImageBlock->BlockType != EFI_HII_IIBT_END) {
44 if (*ImageId == ImageIdCurrent) {
49 if (CurrentImageBlock->BlockType == EFI_HII_IIBT_DUPLICATE) {
50 *ImageId =
ReadUnaligned16 ((VOID *)&((EFI_HII_IIBT_DUPLICATE_BLOCK *)CurrentImageBlock)->ImageId);
51 ASSERT (*ImageId != ImageIdCurrent);
53 CurrentImageBlock = ImageBlocks;
58 return CurrentImageBlock;
61 if (*ImageId < ImageIdCurrent) {
69 switch (CurrentImageBlock->BlockType) {
70 case EFI_HII_IIBT_EXT1:
71 Length = ((EFI_HII_IIBT_EXT1_BLOCK *)CurrentImageBlock)->Length;
73 case EFI_HII_IIBT_EXT2:
76 case EFI_HII_IIBT_EXT4:
80 case EFI_HII_IIBT_IMAGE_1BIT:
81 case EFI_HII_IIBT_IMAGE_1BIT_TRANS:
82 Length =
sizeof (EFI_HII_IIBT_IMAGE_1BIT_BLOCK) -
sizeof (UINT8) +
84 ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_1BIT_BLOCK *)CurrentImageBlock)->Bitmap.Width),
85 ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_1BIT_BLOCK *)CurrentImageBlock)->Bitmap.Height)
90 case EFI_HII_IIBT_IMAGE_4BIT:
91 case EFI_HII_IIBT_IMAGE_4BIT_TRANS:
92 Length =
sizeof (EFI_HII_IIBT_IMAGE_4BIT_BLOCK) -
sizeof (UINT8) +
94 ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_4BIT_BLOCK *)CurrentImageBlock)->Bitmap.Width),
95 ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_4BIT_BLOCK *)CurrentImageBlock)->Bitmap.Height)
100 case EFI_HII_IIBT_IMAGE_8BIT:
101 case EFI_HII_IIBT_IMAGE_8BIT_TRANS:
102 Length =
sizeof (EFI_HII_IIBT_IMAGE_8BIT_BLOCK) -
sizeof (UINT8) +
104 (UINT32)
ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_8BIT_BLOCK *)CurrentImageBlock)->Bitmap.Width),
105 ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_8BIT_BLOCK *)CurrentImageBlock)->Bitmap.Height)
110 case EFI_HII_IIBT_IMAGE_24BIT:
111 case EFI_HII_IIBT_IMAGE_24BIT_TRANS:
112 Length =
sizeof (EFI_HII_IIBT_IMAGE_24BIT_BLOCK) -
sizeof (EFI_HII_RGB_PIXEL) +
114 (UINT32)
ReadUnaligned16 ((VOID *)&((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *)CurrentImageBlock)->Bitmap.Width),
115 ReadUnaligned16 ((VOID *)&((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *)CurrentImageBlock)->Bitmap.Height)
120 case EFI_HII_IIBT_DUPLICATE:
121 Length =
sizeof (EFI_HII_IIBT_DUPLICATE_BLOCK);
125 case EFI_HII_IIBT_IMAGE_JPEG:
126 Length = OFFSET_OF (EFI_HII_IIBT_JPEG_BLOCK, Data) +
ReadUnaligned32 ((VOID *)&((EFI_HII_IIBT_JPEG_BLOCK *)CurrentImageBlock)->
Size);
130 case EFI_HII_IIBT_IMAGE_PNG:
131 Length = OFFSET_OF (EFI_HII_IIBT_PNG_BLOCK, Data) +
ReadUnaligned32 ((VOID *)&((EFI_HII_IIBT_PNG_BLOCK *)CurrentImageBlock)->
Size);
135 case EFI_HII_IIBT_SKIP1:
136 Length =
sizeof (EFI_HII_IIBT_SKIP1_BLOCK);
137 ImageIdCurrent += ((EFI_HII_IIBT_SKIP1_BLOCK *)CurrentImageBlock)->SkipCount;
140 case EFI_HII_IIBT_SKIP2:
141 Length =
sizeof (EFI_HII_IIBT_SKIP2_BLOCK);
142 ImageIdCurrent +=
ReadUnaligned16 ((VOID *)&((EFI_HII_IIBT_SKIP2_BLOCK *)CurrentImageBlock)->SkipCount);
154 CurrentImageBlock = (EFI_HII_IMAGE_BLOCK *)((UINT8 *)CurrentImageBlock +
Length);
161 *ImageId = ImageIdCurrent;
162 return CurrentImageBlock;
240 IN OUT EFI_IMAGE_INPUT *Image,
242 IN EFI_HII_IMAGE_PALETTE_INFO *PaletteInfo
249 EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BitMapPtr;
250 EFI_GRAPHICS_OUTPUT_BLT_PIXEL PaletteValue[2];
251 EFI_HII_IMAGE_PALETTE_INFO *Palette;
255 ASSERT (Image != NULL && Data != NULL && PaletteInfo != NULL);
257 BitMapPtr = Image->Bitmap;
263 CopyMem (&PaletteSize, PaletteInfo,
sizeof (UINT16));
264 PaletteSize +=
sizeof (UINT16);
265 Palette = AllocateZeroPool (PaletteSize);
267 if (Palette == NULL) {
271 CopyMem (Palette, PaletteInfo, PaletteSize);
273 ZeroMem (PaletteValue,
sizeof (PaletteValue));
281 for (Ypos = 0; Ypos < Image->Height; Ypos++) {
286 for (Xpos = 0; Xpos < Image->Width / 8; Xpos++) {
287 Byte = *(Data + OffsetY + Xpos);
288 for (Index = 0; Index < 8; Index++) {
289 if ((
Byte & (1 << Index)) != 0) {
290 BitMapPtr[Ypos * Image->Width + Xpos * 8 + (8 - Index - 1)] = PaletteValue[1];
292 BitMapPtr[Ypos * Image->Width + Xpos * 8 + (8 - Index - 1)] = PaletteValue[0];
297 if (Image->Width % 8 != 0) {
301 Byte = *(Data + OffsetY + Xpos);
302 for (Index = 0; Index < Image->Width % 8; Index++) {
303 if ((
Byte & (1 << (8 - Index - 1))) != 0) {
304 BitMapPtr[Ypos * Image->Width + Xpos * 8 + Index] = PaletteValue[1];
306 BitMapPtr[Ypos * Image->Width + Xpos * 8 + Index] = PaletteValue[0];
329 IN OUT EFI_IMAGE_INPUT *Image,
331 IN EFI_HII_IMAGE_PALETTE_INFO *PaletteInfo
337 EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BitMapPtr;
338 EFI_GRAPHICS_OUTPUT_BLT_PIXEL PaletteValue[16];
339 EFI_HII_IMAGE_PALETTE_INFO *Palette;
344 ASSERT (Image != NULL && Data != NULL && PaletteInfo != NULL);
346 BitMapPtr = Image->Bitmap;
352 CopyMem (&PaletteSize, PaletteInfo,
sizeof (UINT16));
353 PaletteSize +=
sizeof (UINT16);
354 Palette = AllocateZeroPool (PaletteSize);
356 if (Palette == NULL) {
360 CopyMem (Palette, PaletteInfo, PaletteSize);
361 PaletteNum = (UINT16)(Palette->PaletteSize / sizeof (EFI_HII_RGB_PIXEL));
363 ZeroMem (PaletteValue,
sizeof (PaletteValue));
370 for (Ypos = 0; Ypos < Image->Height; Ypos++) {
375 for (Xpos = 0; Xpos < Image->Width / 2; Xpos++) {
376 Byte = *(Data + OffsetY + Xpos);
377 BitMapPtr[Ypos * Image->Width + Xpos * 2] = PaletteValue[
Byte >> 4];
378 BitMapPtr[Ypos * Image->Width + Xpos * 2 + 1] = PaletteValue[
Byte & 0x0F];
381 if (Image->Width % 2 != 0) {
385 Byte = *(Data + OffsetY + Xpos);
386 BitMapPtr[Ypos * Image->Width + Xpos * 2] = PaletteValue[
Byte >> 4];
407 IN OUT EFI_IMAGE_INPUT *Image,
409 IN EFI_HII_IMAGE_PALETTE_INFO *PaletteInfo
415 EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BitMapPtr;
416 EFI_GRAPHICS_OUTPUT_BLT_PIXEL PaletteValue[256];
417 EFI_HII_IMAGE_PALETTE_INFO *Palette;
422 ASSERT (Image != NULL && Data != NULL && PaletteInfo != NULL);
424 BitMapPtr = Image->Bitmap;
430 CopyMem (&PaletteSize, PaletteInfo,
sizeof (UINT16));
431 PaletteSize +=
sizeof (UINT16);
432 Palette = AllocateZeroPool (PaletteSize);
434 if (Palette == NULL) {
438 CopyMem (Palette, PaletteInfo, PaletteSize);
439 PaletteNum = (UINT16)(Palette->PaletteSize / sizeof (EFI_HII_RGB_PIXEL));
440 ZeroMem (PaletteValue,
sizeof (PaletteValue));
447 for (Ypos = 0; Ypos < Image->Height; Ypos++) {
452 for (Xpos = 0; Xpos < Image->Width; Xpos++) {
453 Byte = *(Data + OffsetY + Xpos);
454 BitMapPtr[OffsetY + Xpos] = PaletteValue[
Byte];
515 IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer,
520 IN BOOLEAN Transparent,
521 IN OUT EFI_IMAGE_OUTPUT **Blt
524 EFI_IMAGE_OUTPUT *ImageOut;
529 EFI_GRAPHICS_OUTPUT_BLT_PIXEL SrcPixel;
530 EFI_GRAPHICS_OUTPUT_BLT_PIXEL ZeroPixel;
532 if ((BltBuffer == NULL) || (Blt == NULL) || (*Blt == NULL)) {
533 return EFI_INVALID_PARAMETER;
538 if (Width + BltX > ImageOut->Width) {
539 return EFI_INVALID_PARAMETER;
542 if (Height + BltY > ImageOut->Height) {
543 return EFI_INVALID_PARAMETER;
546 ZeroMem (&ZeroPixel,
sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));
548 for (Ypos = 0; Ypos < Height; Ypos++) {
549 OffsetY1 = Width * Ypos;
550 OffsetY2 = ImageOut->Width * (BltY + Ypos);
551 for (Xpos = 0; Xpos < Width; Xpos++) {
552 SrcPixel = BltBuffer[OffsetY1 + Xpos];
554 if (
CompareMem (&SrcPixel, &ZeroPixel, 3) != 0) {
555 ImageOut->Image.Bitmap[OffsetY2 + BltX + Xpos] = SrcPixel;
558 ImageOut->Image.Bitmap[OffsetY2 + BltX + Xpos] = SrcPixel;
621 IN CONST EFI_HII_IMAGE_PROTOCOL *This,
622 IN EFI_HII_HANDLE PackageList,
623 OUT EFI_IMAGE_ID *ImageId,
624 IN CONST EFI_IMAGE_INPUT *Image
630 EFI_HII_IMAGE_BLOCK *ImageBlocks;
633 if ((This == NULL) || (ImageId == NULL) || (Image == NULL) || (Image->Bitmap == NULL)) {
634 return EFI_INVALID_PARAMETER;
639 if (PackageListNode == NULL) {
640 return EFI_NOT_FOUND;
650 NewBlockSize = (UINT32)Image->Width * Image->Height;
651 if (NewBlockSize > (MAX_UINT32 - (
sizeof (EFI_HII_IIBT_IMAGE_24BIT_BLOCK) -
sizeof (EFI_HII_RGB_PIXEL))) / 3) {
653 return EFI_OUT_OF_RESOURCES;
656 NewBlockSize = NewBlockSize * 3 + (
sizeof (EFI_HII_IIBT_IMAGE_24BIT_BLOCK) -
sizeof (EFI_HII_RGB_PIXEL));
662 if (PackageListNode->
ImagePkg != NULL) {
663 ImagePackage = PackageListNode->
ImagePkg;
682 return EFI_OUT_OF_RESOURCES;
689 ImageBlocks = AllocatePool (ImagePackage->
ImageBlockSize + NewBlockSize);
690 if (ImageBlocks == NULL) {
692 return EFI_OUT_OF_RESOURCES;
709 ImageBlocks = (EFI_HII_IMAGE_BLOCK *)(
710 (UINT8 *)ImageBlocks + ImagePackage->
ImageBlockSize - sizeof (EFI_HII_IIBT_END_BLOCK)
716 ImagePackage->
ImagePkgHdr.Header.Length += NewBlockSize;
723 if (NewBlockSize >
MAX_UINT24 - (
sizeof (EFI_HII_IMAGE_PACKAGE_HDR) +
sizeof (EFI_HII_IIBT_END_BLOCK))) {
725 return EFI_OUT_OF_RESOURCES;
733 if (ImagePackage == NULL) {
735 return EFI_OUT_OF_RESOURCES;
746 ImagePackage->
ImagePkgHdr.Header.Length =
sizeof (EFI_HII_IMAGE_PACKAGE_HDR) + NewBlockSize +
sizeof (EFI_HII_IIBT_END_BLOCK);
747 ImagePackage->
ImagePkgHdr.Header.Type = EFI_HII_PACKAGE_IMAGES;
748 ImagePackage->
ImagePkgHdr.ImageInfoOffset =
sizeof (EFI_HII_IMAGE_PACKAGE_HDR);
760 ImagePackage->
ImageBlockSize = NewBlockSize +
sizeof (EFI_HII_IIBT_END_BLOCK);
761 ImagePackage->
ImageBlock = AllocateZeroPool (NewBlockSize +
sizeof (EFI_HII_IIBT_END_BLOCK));
763 FreePool (ImagePackage);
765 return EFI_OUT_OF_RESOURCES;
773 PackageListNode->
ImagePkg = ImagePackage;
780 if (Image->Flags == EFI_IMAGE_TRANSPARENT) {
781 ImageBlocks->BlockType = EFI_HII_IIBT_IMAGE_24BIT_TRANS;
783 ImageBlocks->BlockType = EFI_HII_IIBT_IMAGE_24BIT;
786 WriteUnaligned16 ((VOID *)&((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *)ImageBlocks)->Bitmap.Width, Image->Width);
787 WriteUnaligned16 ((VOID *)&((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *)ImageBlocks)->Bitmap.Height, Image->Height);
788 CopyGopToRgbPixel (((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *)ImageBlocks)->Bitmap.Bitmap, Image->Bitmap, (UINT32)Image->Width * Image->Height);
793 ImageBlocks = (EFI_HII_IMAGE_BLOCK *)((UINT8 *)ImageBlocks + NewBlockSize);
794 ImageBlocks->BlockType = EFI_HII_IIBT_END;
833 IN LIST_ENTRY *Database,
834 IN EFI_HII_HANDLE PackageList,
835 IN EFI_IMAGE_ID ImageId,
836 OUT EFI_IMAGE_INPUT *Image,
837 IN BOOLEAN BitmapOnly
843 EFI_HII_IMAGE_BLOCK *CurrentImageBlock;
844 EFI_HII_IIBT_IMAGE_1BIT_BLOCK Iibt1bit;
851 EFI_HII_IMAGE_DECODER_PROTOCOL *Decoder;
852 EFI_IMAGE_OUTPUT *ImageOut;
854 if ((Image == NULL) || (ImageId == 0)) {
855 return EFI_INVALID_PARAMETER;
859 if (PackageListNode == NULL) {
860 return EFI_NOT_FOUND;
863 ImagePackage = PackageListNode->
ImagePkg;
864 if (ImagePackage == NULL) {
865 return EFI_NOT_FOUND;
872 if (CurrentImageBlock == NULL) {
873 return EFI_NOT_FOUND;
877 switch (CurrentImageBlock->BlockType) {
878 case EFI_HII_IIBT_IMAGE_JPEG:
879 case EFI_HII_IIBT_IMAGE_PNG:
881 return EFI_UNSUPPORTED;
886 if (Decoder == NULL) {
887 return EFI_UNSUPPORTED;
893 ASSERT (OFFSET_OF (EFI_HII_IIBT_JPEG_BLOCK, Data) == OFFSET_OF (EFI_HII_IIBT_PNG_BLOCK, Data));
895 sizeof (((EFI_HII_IIBT_JPEG_BLOCK *)CurrentImageBlock)->Data) ==
896 sizeof (((EFI_HII_IIBT_PNG_BLOCK *)CurrentImageBlock)->Data)
898 ASSERT (OFFSET_OF (EFI_HII_IIBT_JPEG_BLOCK,
Size) == OFFSET_OF (EFI_HII_IIBT_PNG_BLOCK,
Size));
900 sizeof (((EFI_HII_IIBT_JPEG_BLOCK *)CurrentImageBlock)->
Size) ==
901 sizeof (((EFI_HII_IIBT_PNG_BLOCK *)CurrentImageBlock)->
Size)
903 Status = Decoder->DecodeImage (
905 ((EFI_HII_IIBT_JPEG_BLOCK *)CurrentImageBlock)->Data,
906 ((EFI_HII_IIBT_JPEG_BLOCK *)CurrentImageBlock)->
Size,
915 if (!EFI_ERROR (Status)) {
916 Image->Bitmap = ImageOut->Image.Bitmap;
917 Image->Height = ImageOut->Height;
918 Image->Width = ImageOut->Width;
924 case EFI_HII_IIBT_IMAGE_1BIT_TRANS:
925 case EFI_HII_IIBT_IMAGE_4BIT_TRANS:
926 case EFI_HII_IIBT_IMAGE_8BIT_TRANS:
927 Image->Flags = EFI_IMAGE_TRANSPARENT;
931 case EFI_HII_IIBT_IMAGE_1BIT:
932 case EFI_HII_IIBT_IMAGE_4BIT:
933 case EFI_HII_IIBT_IMAGE_8BIT:
937 CopyMem (&Iibt1bit, CurrentImageBlock,
sizeof (EFI_HII_IIBT_IMAGE_1BIT_BLOCK));
938 ImageLength = (UINTN)Iibt1bit.Bitmap.Width * Iibt1bit.Bitmap.Height;
939 if (ImageLength > MAX_UINTN /
sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)) {
940 return EFI_OUT_OF_RESOURCES;
943 ImageLength *=
sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);
944 Image->Bitmap = AllocateZeroPool (ImageLength);
945 if (Image->Bitmap == NULL) {
946 return EFI_OUT_OF_RESOURCES;
949 Image->Width = Iibt1bit.Bitmap.Width;
950 Image->Height = Iibt1bit.Bitmap.Height;
952 PaletteInfo = ImagePackage->
PaletteBlock +
sizeof (EFI_HII_IMAGE_PALETTE_INFO_HEADER);
953 for (PaletteIndex = 1; PaletteIndex < Iibt1bit.PaletteIndex; PaletteIndex++) {
954 CopyMem (&PaletteSize, PaletteInfo,
sizeof (UINT16));
955 PaletteInfo += PaletteSize +
sizeof (UINT16);
958 ASSERT (PaletteIndex == Iibt1bit.PaletteIndex);
963 if ((CurrentImageBlock->BlockType == EFI_HII_IIBT_IMAGE_1BIT) ||
964 (CurrentImageBlock->BlockType == EFI_HII_IIBT_IMAGE_1BIT_TRANS))
968 ((EFI_HII_IIBT_IMAGE_1BIT_BLOCK *)CurrentImageBlock)->Bitmap.Data,
969 (EFI_HII_IMAGE_PALETTE_INFO *)PaletteInfo
971 }
else if ((CurrentImageBlock->BlockType == EFI_HII_IIBT_IMAGE_4BIT) ||
972 (CurrentImageBlock->BlockType == EFI_HII_IIBT_IMAGE_4BIT_TRANS))
976 ((EFI_HII_IIBT_IMAGE_4BIT_BLOCK *)CurrentImageBlock)->Bitmap.Data,
977 (EFI_HII_IMAGE_PALETTE_INFO *)PaletteInfo
982 ((EFI_HII_IIBT_IMAGE_8BIT_BLOCK *)CurrentImageBlock)->Bitmap.Data,
983 (EFI_HII_IMAGE_PALETTE_INFO *)PaletteInfo
989 case EFI_HII_IIBT_IMAGE_24BIT_TRANS:
990 Image->Flags = EFI_IMAGE_TRANSPARENT;
994 case EFI_HII_IIBT_IMAGE_24BIT:
995 Width =
ReadUnaligned16 ((VOID *)&((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *)CurrentImageBlock)->Bitmap.Width);
996 Height =
ReadUnaligned16 ((VOID *)&((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *)CurrentImageBlock)->Bitmap.Height);
997 ImageLength = (UINTN)Width * Height;
998 if (ImageLength > MAX_UINTN /
sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)) {
999 return EFI_OUT_OF_RESOURCES;
1002 ImageLength *=
sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);
1003 Image->Bitmap = AllocateZeroPool (ImageLength);
1004 if (Image->Bitmap == NULL) {
1005 return EFI_OUT_OF_RESOURCES;
1008 Image->Width = Width;
1009 Image->Height = Height;
1016 ((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *)CurrentImageBlock)->Bitmap.Bitmap
1021 return EFI_NOT_FOUND;
1080 IN CONST EFI_HII_IMAGE_PROTOCOL *This,
1081 IN EFI_HII_HANDLE PackageList,
1082 IN EFI_IMAGE_ID ImageId,
1083 IN CONST EFI_IMAGE_INPUT *Image
1089 EFI_HII_IMAGE_BLOCK *CurrentImageBlock;
1090 EFI_HII_IMAGE_BLOCK *ImageBlocks;
1091 EFI_HII_IMAGE_BLOCK *NewImageBlock;
1092 UINT32 NewBlockSize;
1093 UINT32 OldBlockSize;
1097 if ((This == NULL) || (Image == NULL) || (ImageId == 0) || (Image->Bitmap == NULL)) {
1098 return EFI_INVALID_PARAMETER;
1103 if (PackageListNode == NULL) {
1104 return EFI_NOT_FOUND;
1107 ImagePackage = PackageListNode->
ImagePkg;
1108 if (ImagePackage == NULL) {
1109 return EFI_NOT_FOUND;
1116 if (CurrentImageBlock == NULL) {
1117 return EFI_NOT_FOUND;
1126 switch (CurrentImageBlock->BlockType) {
1127 case EFI_HII_IIBT_IMAGE_JPEG:
1128 OldBlockSize = OFFSET_OF (EFI_HII_IIBT_JPEG_BLOCK, Data) +
ReadUnaligned32 ((VOID *)&((EFI_HII_IIBT_JPEG_BLOCK *)CurrentImageBlock)->
Size);
1130 case EFI_HII_IIBT_IMAGE_PNG:
1131 OldBlockSize = OFFSET_OF (EFI_HII_IIBT_PNG_BLOCK, Data) +
ReadUnaligned32 ((VOID *)&((EFI_HII_IIBT_PNG_BLOCK *)CurrentImageBlock)->
Size);
1133 case EFI_HII_IIBT_IMAGE_1BIT:
1134 case EFI_HII_IIBT_IMAGE_1BIT_TRANS:
1135 OldBlockSize =
sizeof (EFI_HII_IIBT_IMAGE_1BIT_BLOCK) -
sizeof (UINT8) +
1137 ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_1BIT_BLOCK *)CurrentImageBlock)->Bitmap.Width),
1138 ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_1BIT_BLOCK *)CurrentImageBlock)->Bitmap.Height)
1141 case EFI_HII_IIBT_IMAGE_4BIT:
1142 case EFI_HII_IIBT_IMAGE_4BIT_TRANS:
1143 OldBlockSize =
sizeof (EFI_HII_IIBT_IMAGE_4BIT_BLOCK) -
sizeof (UINT8) +
1145 ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_4BIT_BLOCK *)CurrentImageBlock)->Bitmap.Width),
1146 ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_4BIT_BLOCK *)CurrentImageBlock)->Bitmap.Height)
1149 case EFI_HII_IIBT_IMAGE_8BIT:
1150 case EFI_HII_IIBT_IMAGE_8BIT_TRANS:
1151 OldBlockSize =
sizeof (EFI_HII_IIBT_IMAGE_8BIT_BLOCK) -
sizeof (UINT8) +
1153 (UINT32)
ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_8BIT_BLOCK *)CurrentImageBlock)->Bitmap.Width),
1154 ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_8BIT_BLOCK *)CurrentImageBlock)->Bitmap.Height)
1157 case EFI_HII_IIBT_IMAGE_24BIT:
1158 case EFI_HII_IIBT_IMAGE_24BIT_TRANS:
1159 OldBlockSize =
sizeof (EFI_HII_IIBT_IMAGE_24BIT_BLOCK) -
sizeof (EFI_HII_RGB_PIXEL) +
1161 (UINT32)
ReadUnaligned16 ((VOID *)&((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *)CurrentImageBlock)->Bitmap.Width),
1162 ReadUnaligned16 ((VOID *)&((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *)CurrentImageBlock)->Bitmap.Height)
1167 return EFI_NOT_FOUND;
1179 NewBlockSize = (UINT32)Image->Width * Image->Height;
1180 if (NewBlockSize > (MAX_UINT32 - (
sizeof (EFI_HII_IIBT_IMAGE_24BIT_BLOCK) -
sizeof (EFI_HII_RGB_PIXEL))) / 3) {
1182 return EFI_OUT_OF_RESOURCES;
1185 NewBlockSize = NewBlockSize * 3 + (
sizeof (EFI_HII_IIBT_IMAGE_24BIT_BLOCK) -
sizeof (EFI_HII_RGB_PIXEL));
1186 if ((NewBlockSize > OldBlockSize) &&
1191 return EFI_OUT_OF_RESOURCES;
1197 ImageBlocks = AllocateZeroPool (ImagePackage->
ImageBlockSize + NewBlockSize - OldBlockSize);
1198 if (ImageBlocks == NULL) {
1200 return EFI_OUT_OF_RESOURCES;
1203 Part1Size = (UINT32)((UINTN)CurrentImageBlock - (UINTN)ImagePackage->
ImageBlock);
1204 Part2Size = ImagePackage->
ImageBlockSize - Part1Size - OldBlockSize;
1210 NewImageBlock = (EFI_HII_IMAGE_BLOCK *)((UINT8 *)ImageBlocks + Part1Size);
1211 if ((Image->Flags & EFI_IMAGE_TRANSPARENT) == EFI_IMAGE_TRANSPARENT) {
1212 NewImageBlock->BlockType = EFI_HII_IIBT_IMAGE_24BIT_TRANS;
1214 NewImageBlock->BlockType = EFI_HII_IIBT_IMAGE_24BIT;
1217 WriteUnaligned16 ((VOID *)&((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *)NewImageBlock)->Bitmap.Width, Image->Width);
1218 WriteUnaligned16 ((VOID *)&((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *)NewImageBlock)->Bitmap.Height, Image->Height);
1220 ((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *)NewImageBlock)->Bitmap.Bitmap,
1222 (UINT32)Image->Width * Image->Height
1225 CopyMem ((UINT8 *)NewImageBlock + NewBlockSize, (UINT8 *)CurrentImageBlock + OldBlockSize, Part2Size);
1230 ImagePackage->
ImagePkgHdr.Header.Length += NewBlockSize - OldBlockSize;
1231 PackageListNode->
PackageListHdr.PackageLength += NewBlockSize - OldBlockSize;
1275 IN CONST EFI_HII_IMAGE_PROTOCOL *This,
1276 IN EFI_HII_DRAW_FLAGS Flags,
1277 IN CONST EFI_IMAGE_INPUT *Image,
1278 IN OUT EFI_IMAGE_OUTPUT **Blt,
1285 BOOLEAN Transparent;
1286 EFI_IMAGE_OUTPUT *ImageOut;
1287 EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer;
1295 EFI_FONT_DISPLAY_INFO *FontInfo;
1298 if ((This == NULL) || (Image == NULL) || (Blt == NULL)) {
1299 return EFI_INVALID_PARAMETER;
1302 if (((Flags & EFI_HII_DRAW_FLAG_CLIP) == EFI_HII_DRAW_FLAG_CLIP) && (*Blt == NULL)) {
1303 return EFI_INVALID_PARAMETER;
1306 if ((Flags & EFI_HII_DRAW_FLAG_TRANSPARENT) == EFI_HII_DRAW_FLAG_TRANSPARENT) {
1307 return EFI_INVALID_PARAMETER;
1315 Transparent = FALSE;
1316 if ((Flags & EFI_HII_DRAW_FLAG_TRANSPARENT) == EFI_HII_DRAW_FLAG_FORCE_TRANS) {
1318 }
else if ((Flags & EFI_HII_DRAW_FLAG_TRANSPARENT) == EFI_HII_DRAW_FLAG_FORCE_OPAQUE) {
1319 Transparent = FALSE;
1325 if ((Image->Flags & EFI_IMAGE_TRANSPARENT) == EFI_IMAGE_TRANSPARENT) {
1336 return EFI_INVALID_PARAMETER;
1337 }
else if ((Flags & EFI_HII_DIRECT_TO_SCREEN) == EFI_HII_DIRECT_TO_SCREEN) {
1338 return EFI_INVALID_PARAMETER;
1353 if ((BltX >= (*Blt)->Width) || (BltY >= (*Blt)->Height)) {
1354 return EFI_INVALID_PARAMETER;
1361 Width = Image->Width;
1362 Height = Image->Height;
1364 if (Width > (*Blt)->Width - (UINT16)BltX) {
1365 Width = (*Blt)->Width - (UINT16)BltX;
1368 if (Height > (*Blt)->Height - (UINT16)BltY) {
1369 Height = (*Blt)->Height - (UINT16)BltY;
1376 BufferLen = Width * Height;
1377 if (BufferLen > MAX_UINTN /
sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)) {
1378 return EFI_OUT_OF_RESOURCES;
1381 BufferLen *=
sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);
1382 BltBuffer = AllocateZeroPool (BufferLen);
1383 if (BltBuffer == NULL) {
1384 return EFI_OUT_OF_RESOURCES;
1387 if ((Width == Image->Width) && (Height == Image->Height)) {
1388 CopyMem (BltBuffer, Image->Bitmap, BufferLen);
1390 for (Ypos = 0; Ypos < Height; Ypos++) {
1391 OffsetY1 = Image->Width * Ypos;
1392 OffsetY2 = Width * Ypos;
1393 for (Xpos = 0; Xpos < Width; Xpos++) {
1394 BltBuffer[OffsetY2 + Xpos] = Image->Bitmap[OffsetY1 + Xpos];
1402 if ((Flags & EFI_HII_DIRECT_TO_SCREEN) == EFI_HII_DIRECT_TO_SCREEN) {
1410 Status = (*Blt)->Image.Screen->Blt (
1411 (*Blt)->Image.Screen,
1413 EfiBltBufferToVideo,
1437 FreePool (BltBuffer);
1447 if ((BltX > (UINTN)MAX_UINT16 - Image->Width) || (BltY > (UINTN)MAX_UINT16 - Image->Height)) {
1448 return EFI_INVALID_PARAMETER;
1451 Width = Image->Width + (UINT16)BltX;
1452 Height = Image->Height + (UINT16)BltY;
1457 BufferLen = Width * Height;
1458 if (BufferLen > MAX_UINTN /
sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)) {
1459 return EFI_OUT_OF_RESOURCES;
1462 BufferLen *=
sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);
1463 BltBuffer = AllocateZeroPool (BufferLen);
1464 if (BltBuffer == NULL) {
1465 return EFI_OUT_OF_RESOURCES;
1468 ImageOut = (EFI_IMAGE_OUTPUT *)AllocateZeroPool (
sizeof (EFI_IMAGE_OUTPUT));
1469 if (ImageOut == NULL) {
1470 FreePool (BltBuffer);
1471 return EFI_OUT_OF_RESOURCES;
1474 ImageOut->Width = Width;
1475 ImageOut->Height = Height;
1476 ImageOut->Image.Bitmap = BltBuffer;
1483 if (EFI_ERROR (Status)) {
1484 FreePool (BltBuffer);
1485 FreePool (ImageOut);
1489 ASSERT (FontInfo != NULL);
1490 for (Index = 0; Index < (UINTN)Width * Height; Index++) {
1491 BltBuffer[Index] = FontInfo->BackgroundColor;
1494 FreePool (FontInfo);
1547 IN CONST EFI_HII_IMAGE_PROTOCOL *This,
1548 IN EFI_HII_DRAW_FLAGS Flags,
1549 IN EFI_HII_HANDLE PackageList,
1550 IN EFI_IMAGE_ID ImageId,
1551 IN OUT EFI_IMAGE_OUTPUT **Blt,
1557 EFI_IMAGE_INPUT Image;
1562 if ((This == NULL) || (Blt == NULL)) {
1563 return EFI_INVALID_PARAMETER;
1569 Status =
HiiGetImage (This, PackageList, ImageId, &Image);
1570 if (EFI_ERROR (Status)) {
1577 Status =
HiiDrawImage (This, Flags, &Image, Blt, BltX, BltY);
1578 if (Image.Bitmap != NULL) {
1579 FreePool (Image.Bitmap);