]> code.delx.au - refind/commitdiff
Reverted rEFIt commit r472, since it's caused some existing BMP
authorsrs5694 <srs5694@users.sourceforge.net>
Mon, 2 Feb 2015 19:52:33 +0000 (14:52 -0500)
committersrs5694 <srs5694@users.sourceforge.net>
Mon, 2 Feb 2015 19:52:33 +0000 (14:52 -0500)
selection images to fail.

NEWS.txt
libeg/load_bmp.c
refind/main.c

index f356e9abb883732f5151415ce47b328438b4d5dc..661a53d82e152829b77cfe35d0cbdc16bf499736 100644 (file)
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -1,6 +1,10 @@
 0.8.6 (?/??/2016):
 ------------------
 
+- Reverted rEFIt commit r472, introduced in rEFInd 0.8.5 to support more
+  BMP images because I've received bug reports that it's causing existing
+  selection images to fail to load.
+
 - Fixed install.sh bug that caused misidentification of installation
   directory under OS X if an already-mounted ESP has spaces in its path.
 
index 24fec9f5483cccfc0e2f43b12733255453f9e82b..a836e6e2d9b5107ed1f94cda118857bbf8565788 100644 (file)
@@ -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;
index 3ccd5e3681f7d8349ebdcc42c4fdbfd8ec8c7838..267bf2de6e6f4e265a9c19017fe11fcefab0bad5 100644 (file)
@@ -176,7 +176,7 @@ static VOID AboutrEFInd(VOID)
 
     if (AboutMenu.EntryCount == 0) {
         AboutMenu.TitleImage = BuiltinIcon(BUILTIN_ICON_FUNC_ABOUT);
-        AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.8.5");
+        AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.8.5.1");
         AddMenuInfoLine(&AboutMenu, L"");
         AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2006-2010 Christoph Pfisterer");
         AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2012-2014 Roderick W. Smith");