diff options
author | raywu <raywu@aaeon.com.tw> | 2018-09-13 16:11:56 +0800 |
---|---|---|
committer | raywu <raywu@aaeon.com.tw> | 2018-09-13 16:11:56 +0800 |
commit | 31bb486c913795c8b67d1c4dbaae2bdec4943fc9 (patch) | |
tree | f0e04ad6fe983d8aa11f0f8a808518e39ab408f1 /EDK/MiniSetup/TseAdvanced/pnguncmp.c | |
parent | 465bdc2f8b32bb4cc1ac2c420086ec79ccbd5f78 (diff) | |
download | zprj-31bb486c913795c8b67d1c4dbaae2bdec4943fc9.tar.xz |
SLP1.0 / SLP2.0 / Default Password / Logo / Fix Boot Order
Diffstat (limited to 'EDK/MiniSetup/TseAdvanced/pnguncmp.c')
-rw-r--r-- | EDK/MiniSetup/TseAdvanced/pnguncmp.c | 879 |
1 files changed, 879 insertions, 0 deletions
diff --git a/EDK/MiniSetup/TseAdvanced/pnguncmp.c b/EDK/MiniSetup/TseAdvanced/pnguncmp.c new file mode 100644 index 0000000..655994f --- /dev/null +++ b/EDK/MiniSetup/TseAdvanced/pnguncmp.c @@ -0,0 +1,879 @@ +//*****************************************************************// +//*****************************************************************// +//*****************************************************************// +//** **// +//** (C)Copyright 2011, American Megatrends, Inc. **// +//** **// +//** All Rights Reserved. **// +//** **// +//** 5555 Oakbrook Pkwy, Building 200,Norcross, Georgia 30093 **// +//** **// +//** Phone (770)-246-8600 **// +//** **// +//*****************************************************************// +//*****************************************************************// +//*****************************************************************// +// $Archive: /Alaska/SOURCE/Modules/AMITSE2_0/AMITSE/TseAdvanced/pnguncmp.c $ +// +// $Author: Arunsb $ +// +// $Revision: 3 $ +// +// $Date: 10/18/12 5:53a $ +// +//*****************************************************************// +//*****************************************************************// +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Modules/AMITSE2_0/AMITSE/TseAdvanced/pnguncmp.c $ +// +// 3 10/18/12 5:53a Arunsb +// Updated for 2.16.1235 QA submission +// +// 2 10/10/12 12:35p Arunsb +// Synched the source for v2.16.1232, backup with Aptio +// +// 2 6/20/11 1:19p Rajashakerg +// [TAG] EIP60910 +// [Description] Updated with respect to the review comments. +// +// 1 6/13/11 12:21p Rajashakerg +// EIP:60910 -PNG image support in TSE. +// +// +//*****************************************************************// +//*****************************************************************// + +//<AMI_FHDR_START> +//---------------------------------------------------------------------------- +// +// Name: pnguncmp.c +// +// Description: This file contains code for pcx image handling +// +//---------------------------------------------------------------------------- +//<AMI_FHDR_END> + +#include "png.h" +#define codeLengthLen 19 + +typedef struct _PngHuffmanTree +{ + unsigned dat; + struct _PngHuffmanTree *zero, *one; +}PngHuffmanTree; + +void MakeFixedHuffmanCode(unsigned *hLength, unsigned *hCode); +void MakeDynamicHuffmanCode(unsigned hLength[288], unsigned hCode[288], unsigned nLng, unsigned lng[]); +EFI_STATUS DecodeDynamicHuffmanCode + (unsigned int *hLit, unsigned int *hDist, unsigned int*hCLen, + unsigned int **hLengthLiteral, unsigned int **hCodeLiteral, + unsigned int **hLengthDist, unsigned int **hCodeDist, + unsigned int *hLengthBuf, unsigned int *hCodeBuf, + const unsigned char dat[], unsigned int *bytePtr, unsigned int *bitPtr); + +PngHuffmanTree *MakeHuffmanTree(unsigned n, unsigned *hLength, unsigned *hCode); +void DeleteHuffmanTree(PngHuffmanTree *node); + +unsigned GetCopyLength(unsigned value, unsigned char dat[], unsigned *bytePtr, unsigned *bitPtr); +unsigned GetBackwardDistance(unsigned distCode, unsigned char dat[], unsigned *bytePtr, unsigned *bitPtr); + + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Name: GetNextBit() +// +// Description: To get the Next Bit +// +// Input: const unsigned char dat[], unsigned *bytePtr, unsigned *bitPtr +// +// Output: unsigned int +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +unsigned int GetNextBit(const unsigned char dat[], unsigned *bytePtr, unsigned *bitPtr) +{ + unsigned a; + unsigned b; + a = dat[*bytePtr] & *bitPtr; + *bitPtr <<= 1; + if(*bitPtr >= 256) + { + *bitPtr = 1; + (*bytePtr)++; + } + b = (a != 0 ? 1 : 0); + return b; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Name: GetNextMultiBit() +// +// Description: To get the Next multiple Bits. +// +// Input: const unsigned char dat[], unsigned *bytePtr, unsigned *bitPtr, unsigned n +// +// Output: unsigned int +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +unsigned int GetNextMultiBit(const unsigned char dat[], unsigned *bytePtr, unsigned *bitPtr, unsigned n) +{ + unsigned value,mask,i; + value = 0; + mask = 1; + for(i = 0; i < n; i++) + { + if(GetNextBit(dat,bytePtr,bitPtr)) + { + value |= mask; + } + mask <<= 1; + } + return value; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Name: MakeFixedHuffmanCode() +// +// Description: To make the fixed huffman code +// +// Input: unsigned hLength[288],unsigned hCode[288] +// +// Output: none +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +void MakeFixedHuffmanCode(unsigned *hLength, unsigned *hCode) +{ + unsigned i; + for(i = 0; i <= 143; i++) + { + hLength[i] = 8; + hCode[i] = 0x30+i; + } + for(i = 144; i <= 255; i++) + { + hLength[i] = 9; + hCode[i] = 0x190 + (i-144); + } + for(i = 256; i <= 279; i++) + { + hLength[i] = 7; + hCode[i] = i - 256; + } + for(i=280; i<=287; i++) + { + hLength[i] = 8; + hCode[i] = 0xc0 + (i-280); + } +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Name: MakeDynamicHuffmanCode() +// +// Description: To make the Dynamic Huffman Code +// +// Input: unsigned hLength[],unsigned hCode[],unsigned nLng,unsigned lng[] +// +// Output: none +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +void MakeDynamicHuffmanCode(unsigned hLength[], unsigned hCode[], unsigned nLng, unsigned lng[]) +{ + unsigned i, maxLng, code, *bl_count, *next_code, bits, n; + + for(i = 0; i < nLng; i++) + { + hLength[i] = lng[i]; + hCode[i] = 0; + } + + maxLng = 0; + for(i = 0; i < nLng; i++) + { + if(maxLng < lng[i]) + { + maxLng = lng[i]; + } + } + + bl_count = (unsigned int *) EfiLibAllocateZeroPool((maxLng+1)*sizeof(unsigned)); + if (!bl_count) { + return; + } + next_code = (unsigned int *) EfiLibAllocateZeroPool((maxLng+1)*sizeof(unsigned)); + if (!next_code) { + MemFreePointer(&bl_count); + return; + } + for(i = 0; i < maxLng+1; i++) + { + bl_count[i] = 0; + next_code[i] = 0; + } + for(i = 0; i < nLng; i++) + { + bl_count[lng[i]]++; + } + + code = 0; + bl_count[0] = 0; + for (bits = 1; bits <= maxLng; bits++) + { + code = (code + bl_count[bits-1]) << 1; + next_code[bits] = code; + } + + for (n = 0; n < nLng; n++) + { + unsigned len; + len = lng[n]; + if (len > 0) + { + hCode[n] = next_code[len]++; + } + } + + if (bl_count != NULL) + { + MemFreePointer(&bl_count); + } + if (next_code != NULL) + { + MemFreePointer(&next_code); + } +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Name: DecodeDynamicHuffmanCode() +// +// Description: Decodeing the Dynamic Huffman Code +// +// Input: unsigned int &hLit,unsigned int &hDist,unsigned int &hCLen, +// unsigned int *&hLengthLiteral,unsigned int *&hCodeLiteral, +// unsigned int *&hLengthDist,unsigned int *&hCodeDist, +// unsigned int hLengthBuf[322],unsigned int hCodeBuf[322], +// const unsigned char dat[],unsigned int &bytePtr,unsigned int &bitPtr +// +// Output: int +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS DecodeDynamicHuffmanCode + (unsigned int *hLit, unsigned int *hDist, unsigned int *hCLen, + unsigned int **hLengthLiteral, unsigned int **hCodeLiteral, + unsigned int **hLengthDist, unsigned int **hCodeDist, + unsigned int *hLengthBuf, unsigned int *hCodeBuf, + const unsigned char dat[], unsigned int *bytePtr, unsigned int *bitPtr) +{ + unsigned int i; + unsigned int nExtr=0; + PngHuffmanTree *lengthTree, *lengthTreePtr; + unsigned value, copyLength; + unsigned codeLengthOrder[codeLengthLen] = + { + 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 + }; + unsigned codeLengthCode[codeLengthLen]; + unsigned hLengthCode[codeLengthLen],hCodeCode[codeLengthLen]; + + *hLit = 0; + *hDist = 0; + *hCLen = 0; + + *hLit = GetNextMultiBit(dat, bytePtr, bitPtr, 5); + *hDist = GetNextMultiBit(dat, bytePtr, bitPtr, 5); + *hCLen = GetNextMultiBit(dat, bytePtr, bitPtr, 4); + + for (i = 0; i < codeLengthLen; i++) + { + codeLengthCode[i] = 0; + } + for (i = 0; i < *hCLen+4; i++) + { + codeLengthCode[codeLengthOrder[i]] = GetNextMultiBit(dat, bytePtr, bitPtr, 3); + } + + MakeDynamicHuffmanCode(hLengthCode, hCodeCode, codeLengthLen, codeLengthCode); + + *hLengthLiteral = hLengthBuf; + *hCodeLiteral = hCodeBuf; + *hLengthDist = hLengthBuf + *hLit + 257; + *hCodeDist = hCodeBuf+ *hLit + 257; + + + lengthTree = MakeHuffmanTree(codeLengthLen, hLengthCode, hCodeCode); + if (lengthTree == NULL) { + return EFI_ABORTED; + } + + lengthTreePtr = lengthTree; + while (nExtr < *hLit + 257 + *hDist +1) + { + if (GetNextBit(dat, bytePtr, bitPtr)) + { + if(lengthTreePtr->one){ + lengthTreePtr = lengthTreePtr->one; + } + } + else + { + if(lengthTreePtr->zero){ + lengthTreePtr = lengthTreePtr->zero; + } + } + if (lengthTreePtr->zero == NULL && lengthTreePtr->one == NULL) + { + + value = lengthTreePtr->dat; + + if (value <= 15) + { + hLengthBuf[nExtr++] = value; + } + else if (value == 16) + { + copyLength = 3 + GetNextMultiBit(dat, bytePtr, bitPtr, 2); + while (copyLength > 0) + { + hLengthBuf[nExtr] = hLengthBuf[nExtr-1]; + nExtr++; + copyLength--; + } + } + else if (value == 17) + { + copyLength = 3 + GetNextMultiBit(dat, bytePtr, bitPtr, 3); + while (copyLength > 0) + { + hLengthBuf[nExtr++] = 0; + copyLength--; + } + } + else if (value == 18) + { + copyLength = 11 + GetNextMultiBit(dat, bytePtr, bitPtr, 7); + while (copyLength > 0) + { + hLengthBuf[nExtr++] = 0; + copyLength--; + } + } + + lengthTreePtr = lengthTree; + } + } + + MakeDynamicHuffmanCode(*hLengthLiteral, *hCodeLiteral, *hLit+257, *hLengthLiteral); + MakeDynamicHuffmanCode(*hLengthDist, *hCodeDist, *hDist+1, *hLengthDist); + + DeleteHuffmanTree(lengthTree); + + return EFI_SUCCESS; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Name: MakeHuffmanTree() +// +// Description: To create the huffman tree +// +// Input: unsigned n,unsigned hLength[],unsigned hCode[] +// +// Output: PngHuffmanTree +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +PngHuffmanTree *MakeHuffmanTree(unsigned n, unsigned *hLength, unsigned *hCode) +{ + unsigned i, j, mask; + PngHuffmanTree *root, *ptr; + + root = EfiLibAllocateZeroPool(sizeof(PngHuffmanTree)); + if (root == NULL) { + return (PngHuffmanTree *)NULL; + } + + for (i = 0; i < n; i++) + { + if (hLength[i] > 0) + { + ptr = root; + mask = (1<<(hLength[i]-1)); + for (j = 0; j < hLength[i]; j++) + { + if (hCode[i] & mask) + { + if (ptr->one == NULL) + { + ptr->one = EfiLibAllocateZeroPool(sizeof(PngHuffmanTree)); + } + ptr = ptr->one; + } + else + { + if (ptr->zero == NULL) + { + ptr->zero = EfiLibAllocateZeroPool(sizeof(PngHuffmanTree)); + } + ptr = ptr->zero; + } + mask >>= 1; + } + ptr->dat = i; + } + } + + return root; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Name: DeleteHuffmanTree() +// +// Description: Deleting the created Trees +// +// Input: PngHuffmanTree *node +// +// Output: String size +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +void DeleteHuffmanTree(PngHuffmanTree *node) +{ + if (node != NULL) + { + DeleteHuffmanTree(node->zero); //Delete the Huffman tree + DeleteHuffmanTree(node->one); + MemFreePointer( &node); + } +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Name: GetCopyLength() +// +// Description: To Get the correct Copy Length +// +// Input: unsigned value,unsigned char dat[],unsigned &bytePtr,unsigned &bitPtr +// +// Output: unsigned int +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +unsigned GetCopyLength(unsigned value, unsigned char dat[], unsigned *bytePtr, unsigned *bitPtr) +{ + unsigned copyLength; + unsigned base,offset,extBits; + + if (value <= 264) + { + copyLength = 3 + (value - 257); + } + else if (value >= 285) + { + copyLength = 258; + } + else + { + extBits = 1 + (value-265) / 4; + base = (8 << ((value-265) / 4)) + 3; + offset = ((value-265) & 3) * (2 << ((value - 265) / 4)); + + copyLength = GetNextMultiBit(dat, bytePtr, bitPtr, extBits); + copyLength += base+offset; + } + + return copyLength; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Name: GetBackwardDistance() +// +// Description: To get the Backward Distance +// +// Input: unsigned distCode,unsigned char dat[],unsigned &bytePtr,unsigned &bitPtr +// +// Output: unsigned int +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +unsigned GetBackwardDistance + (unsigned distCode, unsigned char dat[], unsigned *bytePtr, unsigned *bitPtr) +{ + unsigned backDist; + unsigned base, offset, extBits; + + if (distCode <= 3) + { + backDist = distCode + 1; + } + else + { + + + base = (4 << ((distCode - 4) / 2)) + 1; + offset = (distCode&1) * (2 << ((distCode - 4) / 2)); + extBits = (distCode - 2) / 2; + + backDist = GetNextMultiBit(dat,bytePtr,bitPtr,extBits); + backDist += base + offset; + } + + return backDist; +} + +//<AMI_PHDR_START> +//---------------------------------------------------------------------------- +// +// Name: Uncompress() +// +// Description: Used to Uncompress the Image data and to convert the RGB format. +// +// Input: unsigned length,unsigned char dat[] +// +// Output: int +// +//---------------------------------------------------------------------------- +//<AMI_PHDR_END> +EFI_STATUS Uncompress(unsigned length, unsigned char dat[]) +{ + unsigned windowUsed; + unsigned char *windowBuf; + unsigned nByteExtracted; + PngHuffmanTree *codeTree, *codeTreePtr; + PngHuffmanTree *distTree, *distTreePtr; + unsigned bytePtr, bitPtr; + unsigned char cmf, flg; + unsigned cm, cInfo, windowSize; + unsigned fDict; + unsigned *hLengthBuf = (unsigned *)NULL; + unsigned *hCodeBuf = (unsigned *)NULL; + unsigned *hLength = (unsigned *)NULL; + unsigned *hCode = (unsigned *)NULL; + unsigned value; + unsigned copyLength,distCode,backDist; + int i=0; + windowBuf = (unsigned char *)NULL; + + codeTree = (PngHuffmanTree *)NULL; + distTree = (PngHuffmanTree *)NULL; + bytePtr = 0; + bitPtr = 1; + nByteExtracted = 0; + + cmf = dat[bytePtr++]; + flg = dat[bytePtr++]; + + cm = cmf&0x0f; + if (cm != 8) + { + goto ERREND; + } + + cInfo = (cmf&0xf0)>>4; + windowSize = 1 << (cInfo + 8); + + windowBuf = (unsigned char *)EfiLibAllocateZeroPool(windowSize); + windowUsed = 0; + + fDict = (flg&32) >> 5; + + if (fDict != 0) + { + goto ERREND; + } + + while (1) + { + unsigned bFinal,bType; + + bFinal = GetNextBit(dat, &bytePtr, &bitPtr); + bType = GetNextMultiBit(dat, &bytePtr, &bitPtr, 2); + + if (bytePtr >= length) + { + goto ERREND; + } + + if (bType == 0) // No Compression + { + unsigned len; + if (bitPtr != 1) //Skip the current byte. + { + bitPtr = 1; + bytePtr++; + } + if (bytePtr >= length) + { + goto ERREND; + } + + len = dat[bytePtr] + dat[bytePtr + 1] * 256; + bytePtr += 4; //Skip bytes for length(2 bytes) and 1's complement of length(2 bytes). + + for( i=0; i<(int)len; i++) //Feed the image data that is not compressed to output buffer. + { + Output(dat[bytePtr+i]); + } + bytePtr += len; + } + else if (bType == 1 || bType == 2) + { + codeTree = (PngHuffmanTree *)NULL; + + if (bType == 1) + { + hLength = (unsigned *)EfiLibAllocateZeroPool(288 * sizeof(unsigned)); //Prefast issue fix - Exceeds stack size issue + hCode = (unsigned *)EfiLibAllocateZeroPool(288 * sizeof(unsigned)); + if (!hLength || !hCode) { + goto ERREND; + } + MakeFixedHuffmanCode(hLength, hCode); + codeTree = MakeHuffmanTree(288, hLength, hCode); + distTree = (PngHuffmanTree *)NULL; + if (hLength) { //Prefast issue fix - Exceeds stack size issue + MemFreePointer( &hLength); + } + if (hCode) { + MemFreePointer( &hCode); + } + } + else + { + unsigned hLit, hDist, hCLen; + unsigned *hLengthLiteral, *hCodeLiteral; + unsigned *hLengthDist, *hCodeDist; + + hLengthBuf = (unsigned *)EfiLibAllocateZeroPool(322 * sizeof(unsigned)); //Prefast issue fix - Exceeds stack size issue + hCodeBuf = (unsigned *)EfiLibAllocateZeroPool(322 * sizeof(unsigned)); + + /*Changes + hLengthLiteral = (unsigned *)EfiLibAllocateZeroPool(322 * sizeof(unsigned)); + hCodeLiteral = (unsigned *)EfiLibAllocateZeroPool(322 * sizeof(unsigned)); + hLengthDist = (unsigned *)EfiLibAllocateZeroPool(322 * sizeof(unsigned)); + hCodeDist = (unsigned *)EfiLibAllocateZeroPool(322 * sizeof(unsigned)); + + */ + if (!hLengthBuf || !hCodeBuf) { + goto ERREND; + } + + if (DecodeDynamicHuffmanCode + (&hLit, &hDist, &hCLen, + &hLengthLiteral, &hCodeLiteral, &hLengthDist, &hCodeDist, hLengthBuf, hCodeBuf, + dat, &bytePtr, &bitPtr)) { + goto ERREND; + } + + codeTree = MakeHuffmanTree(hLit+257, hLengthLiteral, hCodeLiteral); + if (codeTree == NULL) { + goto ERREND; + } + distTree = MakeHuffmanTree(hDist+1, hLengthDist, hCodeDist); + if (distTree == NULL) { + goto ERREND; + } + /* + if (hLengthLiteral) { //Prefast issue fix - Exceeds stack size issue + MemFreePointer( &hLengthLiteral); + } + if (hCodeLiteral) { //Prefast issue fix - Exceeds stack size issue + MemFreePointer( &hCodeLiteral); + } + if (hLengthDist) { //Prefast issue fix - Exceeds stack size issue + MemFreePointer( &hLengthDist); + } + if (hCodeDist) { //Prefast issue fix - Exceeds stack size issue + MemFreePointer( &hCodeDist); + } + */ + if (hLengthBuf) { //Prefast issue fix - Exceeds stack size issue + MemFreePointer( &hLengthBuf); + } + if (hCodeBuf) { + MemFreePointer( &hCodeBuf); + } + } + + codeTreePtr = codeTree; + if (codeTree != NULL) + { + while (1) + { + if (GetNextBit(dat, &bytePtr, &bitPtr)) + { + codeTreePtr = codeTreePtr->one; + } + else + { + codeTreePtr = codeTreePtr->zero; + } + + if (codeTreePtr == NULL) + { + goto ERREND; + } + + if (codeTreePtr->zero == NULL && codeTreePtr->one == NULL) + { + + value = codeTreePtr->dat; + if (value < 256) + { + windowBuf[windowUsed++] = (unsigned char)value; + windowUsed &= (windowSize - 1); + if (Output((unsigned char)value)) + { + goto ERREND; + } + nByteExtracted++; + } + else if (value == 256) + { + break; + } + else if (value <= 285) + { + + copyLength = GetCopyLength(value, dat, &bytePtr, &bitPtr); + + if (bType == 1) + { + distCode = 16 * GetNextBit(dat, &bytePtr, &bitPtr); // 5 bits fixed + distCode += 8 * GetNextBit(dat, &bytePtr, &bitPtr); // Reversed order + distCode += 4 * GetNextBit(dat, &bytePtr, &bitPtr); + distCode += 2 * GetNextBit(dat, &bytePtr, &bitPtr); + distCode += GetNextBit(dat, &bytePtr, &bitPtr); + } + else + { + distTreePtr = distTree; + while (distTreePtr->zero != NULL || distTreePtr->one != NULL) + { + if (GetNextBit(dat,&bytePtr,&bitPtr)) + { + if (distTreePtr->one) //Fix for Fortify issue - Null Dereference + distTreePtr = distTreePtr->one; + } + else + { + if (distTreePtr->zero) //Fix for Fortify issue - Null Dereference + distTreePtr = distTreePtr->zero; + } + } + distCode = distTreePtr->dat; + } + backDist = GetBackwardDistance(distCode,dat,&bytePtr,&bitPtr); + + + for(i=0; i < (int)copyLength; i++) + { + unsigned char dat; + dat = windowBuf[(windowUsed-backDist)&(windowSize-1)]; + if (Output(dat)) + { + goto ERREND; + } + nByteExtracted++; + windowBuf[windowUsed++] = dat; + windowUsed &= (windowSize-1); + } + } + + codeTreePtr = codeTree; + } + + if (length <= bytePtr) + { + goto ERREND; + } + } + } + + + DeleteHuffmanTree(codeTree); + DeleteHuffmanTree(distTree); + codeTree = (PngHuffmanTree *)NULL; + distTree = (PngHuffmanTree *)NULL; + } + else + { + goto ERREND; + } + + + if (bFinal != 0) + { + break; + } + } + + MemFreePointer( &windowBuf); + windowBuf = (unsigned char *)NULL; + + return EFI_SUCCESS; + +ERREND: + if (windowBuf != NULL) + { + MemFreePointer( &windowBuf); + } + if (codeTree != NULL) + { + DeleteHuffmanTree(codeTree); + codeTree = (PngHuffmanTree *)NULL; + } + if (distTree != NULL) + { + DeleteHuffmanTree(distTree); + distTree = (PngHuffmanTree *)NULL; + } + if (hLength) { //Prefast issue fix - Exceeds stack size issue + MemFreePointer( &hLength); + } + if (hCode) { + MemFreePointer( &hCode); + } + if (hLengthBuf) { + MemFreePointer( &hLengthBuf); + } + if (hCodeBuf) { + MemFreePointer( &hCodeBuf); + } + return EFI_ABORTED; +} + +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2011, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Pkwy, Building 200,Norcross, Georgia 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** + + + +
\ No newline at end of file |