From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (using TLSv1 with cipher CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 5B2D01A20B7 for ; Fri, 23 Sep 2016 01:25:31 -0700 (PDT) Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga101.fm.intel.com with ESMTP; 23 Sep 2016 01:25:31 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.30,381,1470726000"; d="scan'208";a="172311844" Received: from ray-dev.ccr.corp.intel.com ([10.239.9.25]) by fmsmga004.fm.intel.com with ESMTP; 23 Sep 2016 01:25:30 -0700 From: Ruiyu Ni To: edk2-devel@lists.01.org Cc: Liming Gao , Eric Dong , Dandan Bi Date: Fri, 23 Sep 2016 16:25:13 +0800 Message-Id: <20160923082521.99872-6-ruiyu.ni@intel.com> X-Mailer: git-send-email 2.9.0.windows.1 In-Reply-To: <20160923082521.99872-1-ruiyu.ni@intel.com> References: <20160923082521.99872-1-ruiyu.ni@intel.com> Subject: [PATCH 05/13] MdeModulePkg/HiiDatabase: Refine HiiSetImage() X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 23 Sep 2016 08:25:31 -0000 Contributed-under: TianoCore Contribution Agreement 1.0 Cc: Liming Gao Cc: Eric Dong Cc: Dandan Bi Signed-off-by: Ruiyu Ni --- MdeModulePkg/Universal/HiiDatabaseDxe/Image.c | 116 ++++++++++---------------- 1 file changed, 46 insertions(+), 70 deletions(-) diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/Image.c b/MdeModulePkg/Universal/HiiDatabaseDxe/Image.c index 9b7e3af..1562767 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/Image.c +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/Image.c @@ -965,26 +965,15 @@ HiiSetImage ( HII_DATABASE_PRIVATE_DATA *Private; HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageListNode; HII_IMAGE_PACKAGE_INSTANCE *ImagePackage; - UINT8 *ImageBlock; - EFI_IMAGE_ID LocalImageId; - UINT8 BlockType; - EFI_HII_IIBT_IMAGE_1BIT_BLOCK Iibt1bit; - EFI_HII_IIBT_IMAGE_4BIT_BLOCK Iibt4bit; - EFI_HII_IIBT_IMAGE_8BIT_BLOCK Iibt8bit; - UINT16 Width; - UINT16 Height; - UINT32 BlockSize; + EFI_HII_IMAGE_BLOCK *CurrentImageBlock; + EFI_HII_IMAGE_BLOCK *ImageBlocks; + EFI_HII_IMAGE_BLOCK *NewImageBlock; UINT32 NewBlockSize; UINT32 OldBlockSize; - EFI_IMAGE_INPUT *ImageIn; - UINT8 *NewBlock; - UINT8 *NewBlockPtr; - UINT8 *Block; - UINT8 *BlockPtr; UINT32 Part1Size; UINT32 Part2Size; - if (This == NULL || Image == NULL || ImageId < 1 || Image->Bitmap == NULL) { + if (This == NULL || Image == NULL || ImageId == 0 || Image->Bitmap == NULL) { return EFI_INVALID_PARAMETER; } @@ -1005,19 +994,16 @@ HiiSetImage ( // // Find the image block specified by ImageId // - LocalImageId = ImageId; - ImageBlock = (UINT8 *) GetImageIdOrAddress (ImagePackage->ImageBlock, &LocalImageId); - if (ImageBlock == NULL) { + CurrentImageBlock = GetImageIdOrAddress (ImagePackage->ImageBlock, &ImageId); + if (CurrentImageBlock == NULL) { return EFI_NOT_FOUND; } - BlockType = *ImageBlock; - // // Get the size of original image block. Use some common block code here // since the definition of some structures is the same. // - switch (BlockType) { + switch (CurrentImageBlock->BlockType) { case EFI_HII_IIBT_IMAGE_JPEG: // // BUGBUG: need to be supported as soon as image tool is designed. @@ -1026,32 +1012,35 @@ HiiSetImage ( case EFI_HII_IIBT_IMAGE_1BIT: case EFI_HII_IIBT_IMAGE_1BIT_TRANS: - CopyMem (&Iibt1bit, ImageBlock, sizeof (EFI_HII_IIBT_IMAGE_1BIT_BLOCK)); OldBlockSize = sizeof (EFI_HII_IIBT_IMAGE_1BIT_BLOCK) - sizeof (UINT8) + - BITMAP_LEN_1_BIT (Iibt1bit.Bitmap.Width, Iibt1bit.Bitmap.Height); + BITMAP_LEN_1_BIT ( + ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_1BIT_BLOCK *) CurrentImageBlock)->Bitmap.Width), + ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_1BIT_BLOCK *) CurrentImageBlock)->Bitmap.Height) + ); break; case EFI_HII_IIBT_IMAGE_4BIT: case EFI_HII_IIBT_IMAGE_4BIT_TRANS: - CopyMem (&Iibt4bit, ImageBlock, sizeof (EFI_HII_IIBT_IMAGE_4BIT_BLOCK)); OldBlockSize = sizeof (EFI_HII_IIBT_IMAGE_4BIT_BLOCK) - sizeof (UINT8) + - BITMAP_LEN_4_BIT (Iibt4bit.Bitmap.Width, Iibt4bit.Bitmap.Height); + BITMAP_LEN_4_BIT ( + ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_4BIT_BLOCK *) CurrentImageBlock)->Bitmap.Width), + ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_4BIT_BLOCK *) CurrentImageBlock)->Bitmap.Height) + ); break; case EFI_HII_IIBT_IMAGE_8BIT: case EFI_HII_IIBT_IMAGE_8BIT_TRANS: - CopyMem (&Iibt8bit, ImageBlock, sizeof (EFI_HII_IIBT_IMAGE_8BIT_BLOCK)); OldBlockSize = sizeof (EFI_HII_IIBT_IMAGE_8BIT_BLOCK) - sizeof (UINT8) + - BITMAP_LEN_8_BIT (Iibt8bit.Bitmap.Width, Iibt8bit.Bitmap.Height); + BITMAP_LEN_8_BIT ( + ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_8BIT_BLOCK *) CurrentImageBlock)->Bitmap.Width), + ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_8BIT_BLOCK *) CurrentImageBlock)->Bitmap.Height) + ); break; case EFI_HII_IIBT_IMAGE_24BIT: case EFI_HII_IIBT_IMAGE_24BIT_TRANS: - CopyMem (&Width, ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK), sizeof (UINT16)); - CopyMem ( - &Height, - ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK) + sizeof (UINT16), - sizeof (UINT16) - ); OldBlockSize = sizeof (EFI_HII_IIBT_IMAGE_24BIT_BLOCK) - sizeof (EFI_HII_RGB_PIXEL) + - BITMAP_LEN_24_BIT (Width , Height); + BITMAP_LEN_24_BIT ( + ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *) CurrentImageBlock)->Bitmap.Width), + ReadUnaligned16 (&((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *) CurrentImageBlock)->Bitmap.Height) + ); break; default: return EFI_NOT_FOUND; @@ -1060,53 +1049,40 @@ HiiSetImage ( // // Create the new image block according to input image. // - ImageIn = (EFI_IMAGE_INPUT *) Image; NewBlockSize = sizeof (EFI_HII_IIBT_IMAGE_24BIT_BLOCK) - sizeof (EFI_HII_RGB_PIXEL) + - BITMAP_LEN_24_BIT (ImageIn->Width, ImageIn->Height); - NewBlock = (UINT8 *) AllocateZeroPool (NewBlockSize); - if (NewBlock == NULL) { + BITMAP_LEN_24_BIT (Image->Width, Image->Height); + // + // Adjust the image package to remove the original block firstly then add the new block. + // + ImageBlocks = AllocateZeroPool (ImagePackage->ImageBlockSize + NewBlockSize - OldBlockSize); + if (ImageBlocks == NULL) { return EFI_OUT_OF_RESOURCES; } - NewBlockPtr = NewBlock; - if ((ImageIn->Flags & EFI_IMAGE_TRANSPARENT) == EFI_IMAGE_TRANSPARENT) { - *NewBlockPtr = EFI_HII_IIBT_IMAGE_24BIT_TRANS; - } else { - *NewBlockPtr = EFI_HII_IIBT_IMAGE_24BIT; - } - NewBlockPtr++; - - CopyMem (NewBlockPtr, &ImageIn->Width, sizeof (UINT16)); - NewBlockPtr += sizeof (UINT16); - CopyMem (NewBlockPtr, &ImageIn->Height, sizeof (UINT16)); - NewBlockPtr += sizeof (UINT16); - - CopyGopToRgbPixel ((EFI_HII_RGB_PIXEL *) NewBlockPtr, ImageIn->Bitmap, ImageIn->Width * ImageIn->Height); + Part1Size = (UINT32) (UINTN) ((UINT8 *) CurrentImageBlock - (UINT8 *) ImagePackage->ImageBlock); + Part2Size = ImagePackage->ImageBlockSize - Part1Size - OldBlockSize; + CopyMem (ImageBlocks, ImagePackage->ImageBlock, Part1Size); // - // Adjust the image package to remove the original block firstly then add the new block. + // Set the new image block // - BlockSize = ImagePackage->ImageBlockSize + NewBlockSize - OldBlockSize; - Block = (UINT8 *) AllocateZeroPool (BlockSize); - if (Block == NULL) { - FreePool (NewBlock); - return EFI_OUT_OF_RESOURCES; + NewImageBlock = (EFI_HII_IMAGE_BLOCK *) ((UINT8 *) ImageBlocks + Part1Size); + if ((Image->Flags & EFI_IMAGE_TRANSPARENT) == EFI_IMAGE_TRANSPARENT) { + NewImageBlock->BlockType= EFI_HII_IIBT_IMAGE_24BIT_TRANS; + } else { + NewImageBlock->BlockType = EFI_HII_IIBT_IMAGE_24BIT; } + WriteUnaligned16 (&((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *) NewImageBlock)->Bitmap.Width, Image->Width); + WriteUnaligned16 (&((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *) NewImageBlock)->Bitmap.Height, Image->Height); + CopyGopToRgbPixel (((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *) NewImageBlock)->Bitmap.Bitmap, + Image->Bitmap, Image->Width * Image->Height); - BlockPtr = Block; - Part1Size = (UINT32) (ImageBlock - (UINT8 *) ImagePackage->ImageBlock); - Part2Size = ImagePackage->ImageBlockSize - Part1Size - OldBlockSize; - CopyMem (BlockPtr, ImagePackage->ImageBlock, Part1Size); - BlockPtr += Part1Size; - CopyMem (BlockPtr, NewBlock, NewBlockSize); - BlockPtr += NewBlockSize; - CopyMem (BlockPtr, ImageBlock + OldBlockSize, Part2Size); + CopyMem ((UINT8 *) NewImageBlock + NewBlockSize, (UINT8 *) CurrentImageBlock + OldBlockSize, Part2Size); FreePool (ImagePackage->ImageBlock); - FreePool (NewBlock); - ImagePackage->ImageBlock = (EFI_HII_IMAGE_BLOCK *) Block; - ImagePackage->ImageBlockSize = BlockSize; - ImagePackage->ImagePkgHdr.Header.Length += NewBlockSize - OldBlockSize; + ImagePackage->ImageBlock = ImageBlocks; + ImagePackage->ImageBlockSize += NewBlockSize - OldBlockSize; + ImagePackage->ImagePkgHdr.Header.Length += NewBlockSize - OldBlockSize; PackageListNode->PackageListHdr.PackageLength += NewBlockSize - OldBlockSize; // -- 2.9.0.windows.1