+def CreateIdfFileCode(Info, AutoGenC, StringH, IdfGenCFlag, IdfGenBinBuffer):\r
+ if len(Info.IdfFileList) > 0:\r
+ ImageFiles = IdfFileClassObject(sorted (Info.IdfFileList))\r
+ if ImageFiles.ImageFilesDict:\r
+ Index = 1\r
+ PaletteIndex = 1\r
+ IncList = [Info.MetaFile.Dir]\r
+ SrcList = [F for F in Info.SourceFileList]\r
+ SkipList = ['.jpg', '.png', '.bmp', '.inf', '.idf']\r
+ FileList = GetFileList(SrcList, IncList, SkipList)\r
+ ValueStartPtr = 60\r
+ StringH.Append("\n//\n//Image ID\n//\n")\r
+ ImageInfoOffset = 0\r
+ PaletteInfoOffset = 0\r
+ ImageBuffer = pack('x')\r
+ PaletteBuffer = pack('x')\r
+ BufferStr = ''\r
+ PaletteStr = ''\r
+ FileDict = {}\r
+ for Idf in ImageFiles.ImageFilesDict:\r
+ if ImageFiles.ImageFilesDict[Idf]:\r
+ for FileObj in ImageFiles.ImageFilesDict[Idf]:\r
+ for sourcefile in Info.SourceFileList:\r
+ if FileObj.FileName == sourcefile.File:\r
+ if not sourcefile.Ext.upper() in ['.PNG', '.BMP', '.JPG']:\r
+ EdkLogger.error("build", AUTOGEN_ERROR, "The %s's postfix must be one of .bmp, .jpg, .png" % (FileObj.FileName), ExtraData="[%s]" % str(Info))\r
+ FileObj.File = sourcefile\r
+ break\r
+ else:\r
+ EdkLogger.error("build", AUTOGEN_ERROR, "The %s in %s is not defined in the driver's [Sources] section" % (FileObj.FileName, Idf), ExtraData="[%s]" % str(Info))\r
+\r
+ for FileObj in ImageFiles.ImageFilesDict[Idf]:\r
+ ID = FileObj.ImageID\r
+ File = FileObj.File\r
+ if not os.path.exists(File.Path) or not os.path.isfile(File.Path):\r
+ EdkLogger.error("build", FILE_NOT_FOUND, ExtraData=File.Path)\r
+ SearchImageID (FileObj, FileList)\r
+ if FileObj.Referenced:\r
+ if (ValueStartPtr - len(DEFINE_STR + ID)) <= 0:\r
+ Line = DEFINE_STR + ' ' + ID + ' ' + DecToHexStr(Index, 4) + '\n'\r
+ else:\r
+ Line = DEFINE_STR + ' ' + ID + ' ' * (ValueStartPtr - len(DEFINE_STR + ID)) + DecToHexStr(Index, 4) + '\n'\r
+\r
+ if File not in FileDict:\r
+ FileDict[File] = Index\r
+ else:\r
+ DuplicateBlock = pack('B', EFI_HII_IIBT_DUPLICATE)\r
+ DuplicateBlock += pack('H', FileDict[File])\r
+ ImageBuffer += DuplicateBlock\r
+ BufferStr = WriteLine(BufferStr, '// %s: %s: %s' % (DecToHexStr(Index, 4), ID, DecToHexStr(Index, 4)))\r
+ TempBufferList = AscToHexList(DuplicateBlock)\r
+ BufferStr = WriteLine(BufferStr, CreateArrayItem(TempBufferList, 16) + '\n')\r
+ StringH.Append(Line)\r
+ Index += 1\r
+ continue\r
+\r
+ TmpFile = open(File.Path, 'rb')\r
+ Buffer = TmpFile.read()\r
+ TmpFile.close()\r
+ if File.Ext.upper() == '.PNG':\r
+ TempBuffer = pack('B', EFI_HII_IIBT_IMAGE_PNG)\r
+ TempBuffer += pack('I', len(Buffer))\r
+ TempBuffer += Buffer\r
+ elif File.Ext.upper() == '.JPG':\r
+ ImageType, = struct.unpack('4s', Buffer[6:10])\r
+ if ImageType != 'JFIF':\r
+ EdkLogger.error("build", FILE_TYPE_MISMATCH, "The file %s is not a standard JPG file." % File.Path)\r
+ TempBuffer = pack('B', EFI_HII_IIBT_IMAGE_JPEG)\r
+ TempBuffer += pack('I', len(Buffer))\r
+ TempBuffer += Buffer\r
+ elif File.Ext.upper() == '.BMP':\r
+ TempBuffer, TempPalette = BmpImageDecoder(File, Buffer, PaletteIndex, FileObj.TransParent)\r
+ if len(TempPalette) > 1:\r
+ PaletteIndex += 1\r
+ NewPalette = pack('H', len(TempPalette))\r
+ NewPalette += TempPalette\r
+ PaletteBuffer += NewPalette\r
+ PaletteStr = WriteLine(PaletteStr, '// %s: %s: %s' % (DecToHexStr(PaletteIndex - 1, 4), ID, DecToHexStr(PaletteIndex - 1, 4)))\r
+ TempPaletteList = AscToHexList(NewPalette)\r
+ PaletteStr = WriteLine(PaletteStr, CreateArrayItem(TempPaletteList, 16) + '\n')\r
+ ImageBuffer += TempBuffer\r
+ BufferStr = WriteLine(BufferStr, '// %s: %s: %s' % (DecToHexStr(Index, 4), ID, DecToHexStr(Index, 4)))\r
+ TempBufferList = AscToHexList(TempBuffer)\r
+ BufferStr = WriteLine(BufferStr, CreateArrayItem(TempBufferList, 16) + '\n')\r
+\r
+ StringH.Append(Line)\r
+ Index += 1\r
+\r
+ BufferStr = WriteLine(BufferStr, '// End of the Image Info')\r
+ BufferStr = WriteLine(BufferStr, CreateArrayItem(DecToHexList(EFI_HII_IIBT_END, 2)) + '\n')\r
+ ImageEnd = pack('B', EFI_HII_IIBT_END)\r
+ ImageBuffer += ImageEnd\r
+\r
+ if len(ImageBuffer) > 1:\r
+ ImageInfoOffset = 12\r
+ if len(PaletteBuffer) > 1:\r
+ PaletteInfoOffset = 12 + len(ImageBuffer) - 1 # -1 is for the first empty pad byte of ImageBuffer\r
+\r
+ IMAGE_PACKAGE_HDR = pack('=II', ImageInfoOffset, PaletteInfoOffset)\r
+ # PACKAGE_HEADER_Length = PACKAGE_HEADER + ImageInfoOffset + PaletteInfoOffset + ImageBuffer Length + PaletteCount + PaletteBuffer Length\r
+ if len(PaletteBuffer) > 1:\r
+ PACKAGE_HEADER_Length = 4 + 4 + 4 + len(ImageBuffer) - 1 + 2 + len(PaletteBuffer) - 1\r
+ else:\r
+ PACKAGE_HEADER_Length = 4 + 4 + 4 + len(ImageBuffer) - 1\r
+ if PaletteIndex > 1:\r
+ PALETTE_INFO_HEADER = pack('H', PaletteIndex - 1)\r
+ # EFI_HII_PACKAGE_HEADER length max value is 0xFFFFFF\r
+ Hex_Length = '%06X' % PACKAGE_HEADER_Length\r
+ if PACKAGE_HEADER_Length > 0xFFFFFF:\r
+ EdkLogger.error("build", AUTOGEN_ERROR, "The Length of EFI_HII_PACKAGE_HEADER exceed its maximum value", ExtraData="[%s]" % str(Info))\r
+ PACKAGE_HEADER = pack('=HBB', int('0x' + Hex_Length[2:], 16), int('0x' + Hex_Length[0:2], 16), EFI_HII_PACKAGE_IMAGES)\r
+\r
+ IdfGenBinBuffer.write(PACKAGE_HEADER)\r
+ IdfGenBinBuffer.write(IMAGE_PACKAGE_HDR)\r
+ if len(ImageBuffer) > 1 :\r
+ IdfGenBinBuffer.write(ImageBuffer[1:])\r
+ if PaletteIndex > 1:\r
+ IdfGenBinBuffer.write(PALETTE_INFO_HEADER)\r
+ if len(PaletteBuffer) > 1:\r
+ IdfGenBinBuffer.write(PaletteBuffer[1:])\r
+\r
+ if IdfGenCFlag:\r
+ TotalLength = EFI_HII_ARRAY_SIZE_LENGTH + PACKAGE_HEADER_Length\r
+ AutoGenC.Append("\n//\n//Image Pack Definition\n//\n")\r
+ AllStr = WriteLine('', CHAR_ARRAY_DEFIN + ' ' + Info.Module.BaseName + 'Images' + '[] = {\n')\r
+ AllStr = WriteLine(AllStr, '// STRGATHER_OUTPUT_HEADER')\r
+ AllStr = WriteLine(AllStr, CreateArrayItem(DecToHexList(TotalLength)) + '\n')\r
+ AllStr = WriteLine(AllStr, '// Image PACKAGE HEADER\n')\r
+ IMAGE_PACKAGE_HDR_List = AscToHexList(PACKAGE_HEADER)\r
+ IMAGE_PACKAGE_HDR_List += AscToHexList(IMAGE_PACKAGE_HDR)\r
+ AllStr = WriteLine(AllStr, CreateArrayItem(IMAGE_PACKAGE_HDR_List, 16) + '\n')\r
+ AllStr = WriteLine(AllStr, '// Image DATA\n')\r
+ if BufferStr:\r
+ AllStr = WriteLine(AllStr, BufferStr)\r
+ if PaletteStr:\r
+ AllStr = WriteLine(AllStr, '// Palette Header\n')\r
+ PALETTE_INFO_HEADER_List = AscToHexList(PALETTE_INFO_HEADER)\r
+ AllStr = WriteLine(AllStr, CreateArrayItem(PALETTE_INFO_HEADER_List, 16) + '\n')\r
+ AllStr = WriteLine(AllStr, '// Palette Data\n')\r
+ AllStr = WriteLine(AllStr, PaletteStr)\r
+ AllStr = WriteLine(AllStr, '};')\r
+ AutoGenC.Append(AllStr)\r
+ AutoGenC.Append("\n")\r
+ StringH.Append('\nextern unsigned char ' + Info.Module.BaseName + 'Images[];\n')\r
+ StringH.Append("\n#define IMAGE_ARRAY_NAME %sImages\n" % Info.Module.BaseName)\r
+\r
+# typedef struct _EFI_HII_IMAGE_PACKAGE_HDR {\r
+# EFI_HII_PACKAGE_HEADER Header; # Standard package header, where Header.Type = EFI_HII_PACKAGE_IMAGES\r
+# UINT32 ImageInfoOffset;\r
+# UINT32 PaletteInfoOffset;\r
+# } EFI_HII_IMAGE_PACKAGE_HDR;\r
+\r
+# typedef struct {\r
+# UINT32 Length:24;\r
+# UINT32 Type:8;\r
+# UINT8 Data[];\r
+# } EFI_HII_PACKAGE_HEADER;\r
+\r
+# typedef struct _EFI_HII_IMAGE_BLOCK {\r
+# UINT8 BlockType;\r
+# UINT8 BlockBody[];\r
+# } EFI_HII_IMAGE_BLOCK;\r
+\r
+def BmpImageDecoder(File, Buffer, PaletteIndex, TransParent):\r
+ ImageType, = struct.unpack('2s', Buffer[0:2])\r
+ if ImageType!= 'BM': # BMP file type is 'BM'\r
+ EdkLogger.error("build", FILE_TYPE_MISMATCH, "The file %s is not a standard BMP file." % File.Path)\r
+ BMP_IMAGE_HEADER = collections.namedtuple('BMP_IMAGE_HEADER', ['bfSize', 'bfReserved1', 'bfReserved2', 'bfOffBits', 'biSize', 'biWidth', 'biHeight', 'biPlanes', 'biBitCount', 'biCompression', 'biSizeImage', 'biXPelsPerMeter', 'biYPelsPerMeter', 'biClrUsed', 'biClrImportant'])\r
+ BMP_IMAGE_HEADER_STRUCT = struct.Struct('IHHIIIIHHIIIIII')\r
+ BmpHeader = BMP_IMAGE_HEADER._make(BMP_IMAGE_HEADER_STRUCT.unpack_from(Buffer[2:]))\r
+ #\r
+ # Doesn't support compress.\r
+ #\r
+ if BmpHeader.biCompression != 0:\r
+ EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "The compress BMP file %s is not support." % File.Path)\r
+\r
+ # The Width and Height is UINT16 type in Image Package\r
+ if BmpHeader.biWidth > 0xFFFF:\r
+ EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "The BMP file %s Width is exceed 0xFFFF." % File.Path)\r
+ if BmpHeader.biHeight > 0xFFFF:\r
+ EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "The BMP file %s Height is exceed 0xFFFF." % File.Path)\r
+\r
+ PaletteBuffer = pack('x')\r
+ if BmpHeader.biBitCount == 1:\r
+ if TransParent:\r
+ ImageBuffer = pack('B', EFI_HII_IIBT_IMAGE_1BIT_TRANS)\r
+ else:\r
+ ImageBuffer = pack('B', EFI_HII_IIBT_IMAGE_1BIT)\r
+ ImageBuffer += pack('B', PaletteIndex)\r
+ Width = (BmpHeader.biWidth + 7)/8\r
+ if BmpHeader.bfOffBits > BMP_IMAGE_HEADER_STRUCT.size + 2:\r
+ PaletteBuffer = Buffer[BMP_IMAGE_HEADER_STRUCT.size + 2 : BmpHeader.bfOffBits]\r
+ elif BmpHeader.biBitCount == 4:\r
+ if TransParent:\r
+ ImageBuffer = pack('B', EFI_HII_IIBT_IMAGE_4BIT_TRANS)\r
+ else:\r
+ ImageBuffer = pack('B', EFI_HII_IIBT_IMAGE_4BIT)\r
+ ImageBuffer += pack('B', PaletteIndex)\r
+ Width = (BmpHeader.biWidth + 1)/2\r
+ if BmpHeader.bfOffBits > BMP_IMAGE_HEADER_STRUCT.size + 2:\r
+ PaletteBuffer = Buffer[BMP_IMAGE_HEADER_STRUCT.size + 2 : BmpHeader.bfOffBits]\r
+ elif BmpHeader.biBitCount == 8:\r
+ if TransParent:\r
+ ImageBuffer = pack('B', EFI_HII_IIBT_IMAGE_8BIT_TRANS)\r
+ else:\r
+ ImageBuffer = pack('B', EFI_HII_IIBT_IMAGE_8BIT)\r
+ ImageBuffer += pack('B', PaletteIndex)\r
+ Width = BmpHeader.biWidth\r
+ if BmpHeader.bfOffBits > BMP_IMAGE_HEADER_STRUCT.size + 2:\r
+ PaletteBuffer = Buffer[BMP_IMAGE_HEADER_STRUCT.size + 2 : BmpHeader.bfOffBits]\r
+ elif BmpHeader.biBitCount == 24:\r
+ if TransParent:\r
+ ImageBuffer = pack('B', EFI_HII_IIBT_IMAGE_24BIT_TRANS)\r
+ else:\r
+ ImageBuffer = pack('B', EFI_HII_IIBT_IMAGE_24BIT)\r
+ Width = BmpHeader.biWidth * 3\r
+ else:\r
+ EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "Only support the 1 bit, 4 bit, 8bit, 24 bit BMP files.", ExtraData="[%s]" % str(File.Path))\r
+\r
+ ImageBuffer += pack('H', BmpHeader.biWidth)\r
+ ImageBuffer += pack('H', BmpHeader.biHeight)\r
+ Start = BmpHeader.bfOffBits\r
+ End = BmpHeader.bfSize - 1\r
+ for Height in range(0, BmpHeader.biHeight):\r
+ if Width % 4 != 0:\r
+ Start = End + (Width % 4) - 4 - Width\r
+ else:\r
+ Start = End - Width\r
+ ImageBuffer += Buffer[Start + 1 : Start + Width + 1]\r
+ End = Start\r
+\r
+ # handle the Palette info, BMP use 4 bytes for R, G, B and Reserved info while EFI_HII_RGB_PIXEL only have the R, G, B info\r
+ if PaletteBuffer and len(PaletteBuffer) > 1:\r
+ PaletteTemp = pack('x')\r
+ for Index in range(0, len(PaletteBuffer)):\r
+ if Index % 4 == 3:\r
+ continue\r
+ PaletteTemp += PaletteBuffer[Index]\r
+ PaletteBuffer = PaletteTemp[1:]\r
+ return ImageBuffer, PaletteBuffer\r
+\r