]> code.delx.au - refind/blobdiff - libeg/image.c
Added PNG support for icons, selection images, & banners.
[refind] / libeg / image.c
index cd25312bc22860947d1973bc97fd1f2422a84930..4cf282e1f0a6b9867ab793cd07cb0559c1095c93 100644 (file)
@@ -39,6 +39,7 @@
 #include "../refind/lib.h"
 #include "../refind/screen.h"
 #include "../include/refit_call_wrapper.h"
+#include "lodepng.h"
 
 #define MAX_FILE_SIZE (1024*1024*1024)
 
@@ -246,6 +247,8 @@ static EG_IMAGE * egDecodeAny(IN UINT8 *FileData, IN UINTN FileDataLength,
       NewImage = egDecodeBMP(FileData, FileDataLength, IconSize, WantAlpha);
    } else if ((StriCmp(Format, L"ICNS") == 0) || (StriCmp(Format, L"icns") == 0)) {
       NewImage = egDecodeICNS(FileData, FileDataLength, IconSize, WantAlpha);
+   } else if ((StriCmp(Format, L"PNG") == 0) || (StriCmp(Format, L"png") == 0)) {
+      NewImage = egDecodePNG(FileData, FileDataLength, IconSize, WantAlpha);
    } // if/else
 
    return NewImage;
@@ -304,6 +307,11 @@ EG_IMAGE * egLoadIcon(IN EFI_FILE* BaseDir, IN CHAR16 *Path, IN UINTN IconSize)
     // decode it
     NewImage = egDecodeAny(FileData, FileDataLength, egFindExtension(Path), IconSize, TRUE);
     FreePool(FileData);
+    if ((NewImage->Width != IconSize) || (NewImage->Height != IconSize)) {
+       Print(L"Warning: Attempt to load icon of the wrong size from '%s'\n", Path);
+       MyFreePool(NewImage);
+       NewImage = NULL;
+    }
 
     return NewImage;
 } // EG_IMAGE *egLoadIcon()