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 6A7111A1E0E for ; Mon, 26 Sep 2016 02:30:43 -0700 (PDT) Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga101.fm.intel.com with ESMTP; 26 Sep 2016 02:30:43 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.30,398,1470726000"; d="scan'208";a="13208329" Received: from ray-dev.ccr.corp.intel.com ([10.239.9.25]) by fmsmga006.fm.intel.com with ESMTP; 26 Sep 2016 02:30:41 -0700 From: Ruiyu Ni To: edk2-devel@lists.01.org Cc: Liming Gao , Eric Dong , Dandan Bi Date: Mon, 26 Sep 2016 17:30:19 +0800 Message-Id: <20160926093035.350612-4-ruiyu.ni@intel.com> X-Mailer: git-send-email 2.9.0.windows.1 In-Reply-To: <20160926093035.350612-1-ruiyu.ni@intel.com> References: <20160926093035.350612-1-ruiyu.ni@intel.com> Subject: [PATCH v2 03/19] MdeModulePkg/HiiDatabase: Refine HiiNewImage() 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: Mon, 26 Sep 2016 09:30:43 -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 | 83 +++++++++------------------ 1 file changed, 27 insertions(+), 56 deletions(-) diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/Image.c b/MdeModulePkg/Universal/HiiDatabaseDxe/Image.c index 6ff397d..d73269c 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/Image.c +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/Image.c @@ -631,12 +631,8 @@ HiiNewImage ( HII_DATABASE_PRIVATE_DATA *Private; HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageListNode; HII_IMAGE_PACKAGE_INSTANCE *ImagePackage; - UINT8 *ImageBlock; - UINTN BlockSize; - UINT8 *NewBlock; - UINT8 *NewBlockPtr; - UINTN NewBlockSize; - EFI_IMAGE_INPUT *ImageIn; + EFI_HII_IMAGE_BLOCK *ImageBlocks; + UINT32 NewBlockSize; if (This == NULL || ImageId == NULL || Image == NULL || Image->Bitmap == NULL) { return EFI_INVALID_PARAMETER; @@ -652,10 +648,8 @@ HiiNewImage ( return EFI_NOT_FOUND; } - 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); + BITMAP_LEN_24_BIT (Image->Width, Image->Height); // // Get the image package in the package list, @@ -674,38 +668,33 @@ HiiNewImage ( // // Update the package's image block by appending the new block to the end. // - BlockSize = ImagePackage->ImageBlockSize + NewBlockSize; - ImageBlock = (UINT8 *) AllocateZeroPool (BlockSize); - if (ImageBlock == NULL) { + ImageBlocks = AllocatePool (ImagePackage->ImageBlockSize + NewBlockSize); + if (ImageBlocks == NULL) { return EFI_OUT_OF_RESOURCES; } // // Copy the original content. // CopyMem ( - ImageBlock, + ImageBlocks, ImagePackage->ImageBlock, ImagePackage->ImageBlockSize - sizeof (EFI_HII_IIBT_END_BLOCK) ); FreePool (ImagePackage->ImageBlock); - ImagePackage->ImageBlock = (EFI_HII_IMAGE_BLOCK *) ImageBlock; - ImageBlock += ImagePackage->ImageBlockSize - sizeof (EFI_HII_IIBT_END_BLOCK); + ImagePackage->ImageBlock = ImageBlocks; + // - // Temp memory to store new block. + // Point to the very last block. // - NewBlock = AllocateZeroPool (NewBlockSize); - if (NewBlock == NULL) { - FreePool (ImagePackage->ImageBlock); - return EFI_OUT_OF_RESOURCES; - } - NewBlockPtr = NewBlock; - + ImageBlocks = (EFI_HII_IMAGE_BLOCK *) ( + (UINT8 *) ImageBlocks + ImagePackage->ImageBlockSize - sizeof (EFI_HII_IIBT_END_BLOCK) + ); // // Update the length record. // - ImagePackage->ImageBlockSize = (UINT32) BlockSize; - ImagePackage->ImagePkgHdr.Header.Length += (UINT32) NewBlockSize; - PackageListNode->PackageListHdr.PackageLength += (UINT32) NewBlockSize; + ImagePackage->ImageBlockSize += NewBlockSize; + ImagePackage->ImagePkgHdr.Header.Length += NewBlockSize; + PackageListNode->PackageListHdr.PackageLength += NewBlockSize; } else { // @@ -721,11 +710,10 @@ HiiNewImage ( // first image block so that id is initially to one. // *ImageId = 1; - BlockSize = sizeof (EFI_HII_IIBT_END_BLOCK) + NewBlockSize; // // Fill in image package header. // - ImagePackage->ImagePkgHdr.Header.Length = (UINT32) BlockSize + sizeof (EFI_HII_IMAGE_PACKAGE_HDR); + ImagePackage->ImagePkgHdr.Header.Length = sizeof (EFI_HII_IMAGE_PACKAGE_HDR) + NewBlockSize + sizeof (EFI_HII_IIBT_END_BLOCK); ImagePackage->ImagePkgHdr.Header.Type = EFI_HII_PACKAGE_IMAGES; ImagePackage->ImagePkgHdr.ImageInfoOffset = sizeof (EFI_HII_IMAGE_PACKAGE_HDR); ImagePackage->ImagePkgHdr.PaletteInfoOffset = 0; @@ -739,24 +727,13 @@ HiiNewImage ( // // Fill in image blocks. // - ImagePackage->ImageBlockSize = (UINT32) BlockSize; - ImagePackage->ImageBlock = AllocateZeroPool (BlockSize); + ImagePackage->ImageBlockSize = NewBlockSize + sizeof (EFI_HII_IIBT_END_BLOCK); + ImagePackage->ImageBlock = AllocateZeroPool (NewBlockSize + sizeof (EFI_HII_IIBT_END_BLOCK)); if (ImagePackage->ImageBlock == NULL) { FreePool (ImagePackage); return EFI_OUT_OF_RESOURCES; } - ImageBlock = (UINT8 *) ImagePackage->ImageBlock; - - // - // Temp memory to store new block. - // - NewBlock = AllocateZeroPool (NewBlockSize); - if (NewBlock == NULL) { - FreePool (ImagePackage->ImageBlock); - FreePool (ImagePackage); - return EFI_OUT_OF_RESOURCES; - } - NewBlockPtr = NewBlock; + ImageBlocks = ImagePackage->ImageBlock; // // Insert this image package. @@ -768,26 +745,20 @@ HiiNewImage ( // // Append the new block here // - if (ImageIn->Flags == EFI_IMAGE_TRANSPARENT) { - *NewBlock = EFI_HII_IIBT_IMAGE_24BIT_TRANS; + if (Image->Flags == EFI_IMAGE_TRANSPARENT) { + ImageBlocks->BlockType = EFI_HII_IIBT_IMAGE_24BIT_TRANS; } else { - *NewBlock = EFI_HII_IIBT_IMAGE_24BIT; + ImageBlocks->BlockType = EFI_HII_IIBT_IMAGE_24BIT; } - NewBlock++; - CopyMem (NewBlock, &ImageIn->Width, sizeof (UINT16)); - NewBlock += sizeof (UINT16); - CopyMem (NewBlock, &ImageIn->Height, sizeof (UINT16)); - NewBlock += sizeof (UINT16); - CopyGopToRgbPixel ((EFI_HII_RGB_PIXEL *) NewBlock, ImageIn->Bitmap, ImageIn->Width * ImageIn->Height); - - CopyMem (ImageBlock, NewBlockPtr, NewBlockSize); - FreePool (NewBlockPtr); + WriteUnaligned16 ((VOID *) &((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *) ImageBlocks)->Bitmap.Width, Image->Width); + WriteUnaligned16 ((VOID *) &((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *) ImageBlocks)->Bitmap.Height, Image->Height); + CopyGopToRgbPixel (((EFI_HII_IIBT_IMAGE_24BIT_BLOCK *) ImageBlocks)->Bitmap.Bitmap, Image->Bitmap, Image->Width * Image->Height); // // Append the block end // - ImageBlock += NewBlockSize; - ((EFI_HII_IIBT_END_BLOCK *) (ImageBlock))->Header.BlockType = EFI_HII_IIBT_END; + ImageBlocks = (EFI_HII_IMAGE_BLOCK *) ((UINT8 *) ImageBlocks + NewBlockSize); + ImageBlocks->BlockType = EFI_HII_IIBT_END; // // Check whether need to get the contents of HiiDataBase. -- 2.9.0.windows.1