X-Git-Url: https://code.delx.au/refind/blobdiff_plain/e71f070b28bf167ea4c236aa271c21ea7b2f5128..bda402d8bb74587c5a813c94a0c8626e0e4f18fe:/libeg/load_bmp.c diff --git a/libeg/load_bmp.c b/libeg/load_bmp.c index 24fec9f..a836e6e 100644 --- a/libeg/load_bmp.c +++ b/libeg/load_bmp.c @@ -51,20 +51,20 @@ typedef struct { typedef struct { CHAR8 CharB; CHAR8 CharM; - INT32 Size; - INT16 Reserved[2]; - INT32 ImageOffset; - INT32 HeaderSize; - INT32 PixelWidth; - INT32 PixelHeight; - INT16 Planes; // Must be 1 - INT16 BitPerPixel; // 1, 4, 8, or 24 - INT32 CompressionType; - INT32 ImageSize; // Compressed image size in bytes - INT32 XPixelsPerMeter; - INT32 YPixelsPerMeter; - INT32 NumberOfColors; - INT32 ImportantColors; + UINT32 Size; + UINT16 Reserved[2]; + UINT32 ImageOffset; + UINT32 HeaderSize; + UINT32 PixelWidth; + UINT32 PixelHeight; + UINT16 Planes; // Must be 1 + UINT16 BitPerPixel; // 1, 4, 8, or 24 + UINT32 CompressionType; + UINT32 ImageSize; // Compressed image size in bytes + UINT32 XPixelsPerMeter; + UINT32 YPixelsPerMeter; + UINT32 NumberOfColors; + UINT32 ImportantColors; } BMP_IMAGE_HEADER; #pragma pack() @@ -82,9 +82,8 @@ EG_IMAGE * egDecodeBMP(IN UINT8 *FileData, IN UINTN FileDataLength, IN UINTN Ico UINTN x, y; UINT8 *ImagePtr; UINT8 *ImagePtrBase; - UINTN PixelWidth, PixelHeight, ImageLineOffset; + UINTN ImageLineOffset; UINT8 ImageValue = 0, AlphaValue; - BOOLEAN UpsideDown; EG_PIXEL *PixelPtr; UINTN Index, BitIndex; @@ -99,19 +98,9 @@ EG_IMAGE * egDecodeBMP(IN UINT8 *FileData, IN UINTN FileDataLength, IN UINTN Ico if (BmpHeader->BitPerPixel != 1 && BmpHeader->BitPerPixel != 4 && BmpHeader->BitPerPixel != 8 && BmpHeader->BitPerPixel != 24) return NULL; - if (BmpHeader->PixelWidth < 1 || BmpHeader->PixelWidth > 4096 || - BmpHeader->PixelHeight < -4096 || BmpHeader->PixelHeight == 0 || - BmpHeader->PixelHeight > 4096) - return NULL; // calculate parameters - PixelWidth = BmpHeader->PixelWidth; - UpsideDown = BmpHeader->PixelHeight >= 0; - if (BmpHeader->PixelHeight < 0) - PixelHeight = -BmpHeader->PixelHeight; - else - PixelHeight = BmpHeader->PixelHeight; - ImageLineOffset = PixelWidth; + ImageLineOffset = BmpHeader->PixelWidth; if (BmpHeader->BitPerPixel == 24) ImageLineOffset *= 3; else if (BmpHeader->BitPerPixel == 1) @@ -121,11 +110,11 @@ EG_IMAGE * egDecodeBMP(IN UINT8 *FileData, IN UINTN FileDataLength, IN UINTN Ico if ((ImageLineOffset % 4) != 0) ImageLineOffset = ImageLineOffset + (4 - (ImageLineOffset % 4)); // check bounds - if (BmpHeader->ImageOffset + ImageLineOffset * PixelHeight > FileDataLength) + if (BmpHeader->ImageOffset + ImageLineOffset * BmpHeader->PixelHeight > FileDataLength) return NULL; // allocate image structure and buffer - NewImage = egCreateImage(PixelWidth, PixelHeight, WantAlpha); + NewImage = egCreateImage(BmpHeader->PixelWidth, BmpHeader->PixelHeight, WantAlpha); if (NewImage == NULL) return NULL; AlphaValue = WantAlpha ? 255 : 0; @@ -133,18 +122,15 @@ EG_IMAGE * egDecodeBMP(IN UINT8 *FileData, IN UINTN FileDataLength, IN UINTN Ico // convert image BmpColorMap = (BMP_COLOR_MAP *)(FileData + sizeof(BMP_IMAGE_HEADER)); ImagePtrBase = FileData + BmpHeader->ImageOffset; - for (y = 0; y < PixelHeight; y++) { + for (y = 0; y < BmpHeader->PixelHeight; y++) { ImagePtr = ImagePtrBase; ImagePtrBase += ImageLineOffset; - if (UpsideDown) - PixelPtr = NewImage->PixelData + (PixelHeight - 1 - y) * PixelWidth; - else - PixelPtr = NewImage->PixelData + y * PixelWidth; + PixelPtr = NewImage->PixelData + (BmpHeader->PixelHeight - 1 - y) * BmpHeader->PixelWidth; switch (BmpHeader->BitPerPixel) { case 1: - for (x = 0; x < PixelWidth; x++) { + for (x = 0; x < BmpHeader->PixelWidth; x++) { BitIndex = x & 0x07; if (BitIndex == 0) ImageValue = *ImagePtr++; @@ -159,7 +145,7 @@ EG_IMAGE * egDecodeBMP(IN UINT8 *FileData, IN UINTN FileDataLength, IN UINTN Ico break; case 4: - for (x = 0; x <= PixelWidth - 2; x += 2) { + for (x = 0; x <= BmpHeader->PixelWidth - 2; x += 2) { ImageValue = *ImagePtr++; Index = ImageValue >> 4; @@ -176,7 +162,7 @@ EG_IMAGE * egDecodeBMP(IN UINT8 *FileData, IN UINTN FileDataLength, IN UINTN Ico PixelPtr->a = AlphaValue; PixelPtr++; } - if (x < PixelWidth) { + if (x < BmpHeader->PixelWidth) { ImageValue = *ImagePtr++; Index = ImageValue >> 4; @@ -189,7 +175,7 @@ EG_IMAGE * egDecodeBMP(IN UINT8 *FileData, IN UINTN FileDataLength, IN UINTN Ico break; case 8: - for (x = 0; x < PixelWidth; x++) { + for (x = 0; x < BmpHeader->PixelWidth; x++) { Index = *ImagePtr++; PixelPtr->b = BmpColorMap[Index].Blue; PixelPtr->g = BmpColorMap[Index].Green; @@ -200,7 +186,7 @@ EG_IMAGE * egDecodeBMP(IN UINT8 *FileData, IN UINTN FileDataLength, IN UINTN Ico break; case 24: - for (x = 0; x < PixelWidth; x++) { + for (x = 0; x < BmpHeader->PixelWidth; x++) { PixelPtr->b = *ImagePtr++; PixelPtr->g = *ImagePtr++; PixelPtr->r = *ImagePtr++; @@ -248,11 +234,11 @@ VOID egEncodeBMP(IN EG_IMAGE *Image, OUT UINT8 **FileDataReturn, OUT UINTN *File BmpHeader = (BMP_IMAGE_HEADER *)FileData; BmpHeader->CharB = 'B'; BmpHeader->CharM = 'M'; - BmpHeader->Size = (INT32)FileDataLength; + BmpHeader->Size = FileDataLength; BmpHeader->ImageOffset = sizeof(BMP_IMAGE_HEADER); BmpHeader->HeaderSize = 40; - BmpHeader->PixelWidth = (INT32)Image->Width; - BmpHeader->PixelHeight = (INT32)Image->Height; + BmpHeader->PixelWidth = Image->Width; + BmpHeader->PixelHeight = Image->Height; BmpHeader->Planes = 1; BmpHeader->BitPerPixel = 24; BmpHeader->CompressionType = 0;