]> code.delx.au - refind/commitdiff
Added PNG support for icons, selection images, & banners.
authorsrs5694 <srs5694@users.sourceforge.net>
Tue, 15 Jan 2013 03:16:46 +0000 (22:16 -0500)
committersrs5694 <srs5694@users.sourceforge.net>
Tue, 15 Jan 2013 03:16:46 +0000 (22:16 -0500)
CREDITS.txt
NEWS.txt
libeg/Make.tiano
libeg/Makefile
libeg/image.c
refind/icns.c
refind/icns.h
refind/main.c

index be34553bd09f9090be2aa0034f7f44f3bb249d8b..2870038339abed445e1edf4acf018db53fbf21fc 100644 (file)
@@ -53,6 +53,10 @@ Program (C source code) files:
   functionality in rEFInd. Most of the files in the mok subdirectory are
   based on Bottomley's PreBootloader code.
 
   functionality in rEFInd. Most of the files in the mok subdirectory are
   based on Bottomley's PreBootloader code.
 
+* The PNG support, in the files libeg/lodepng.c and libeg/lodepng.h, is a
+  slightly modified version of LodePNG (http://lodev.org/lodepng/) by Lode
+  Vandevenne.
+
 Icons and graphics:
 -------------------
 
 Icons and graphics:
 -------------------
 
index 5a335cd26155ca4a8f9e2037821463c4644e055a..6b940ff70070160ef53dac360ebde4d270ed89fd 100644 (file)
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -1,6 +1,8 @@
 0.6.5 (1/??/2013):
 ------------------
 
 0.6.5 (1/??/2013):
 ------------------
 
+- Added support for PNGs as banners, icons, and selectors.
+
 - Added icon for ALT Linux.
 
 - Added "safemode" option to "hideui" token, to hide option to boot into
 - Added icon for ALT Linux.
 
 - Added "safemode" option to "hideui" token, to hide option to boot into
index 9b196c7f42052de31478570a8bd540529a693c33..647c3d05b3fb9db92159bbca0c54a078d15b000e 100644 (file)
@@ -5,7 +5,7 @@
 
 include ../Make.tiano
 
 
 include ../Make.tiano
 
-SOURCE_NAMES     = image load_bmp load_icns screen text
+SOURCE_NAMES     = image load_bmp load_icns lodepng screen text
 OBJS             = $(SOURCE_NAMES:=.obj)
 #DRIVERNAME      = ext2
 #BUILDME          = $(DRIVERNAME)_$(FILENAME_CODE).efi
 OBJS             = $(SOURCE_NAMES:=.obj)
 #DRIVERNAME      = ext2
 #BUILDME          = $(DRIVERNAME)_$(FILENAME_CODE).efi
index 73c46dba625aaf1672971e36a978b41b55395c11..7766472760904afb4cfc0c59d067ba9eace7b69f 100644 (file)
@@ -9,7 +9,7 @@ VPATH = $(SRCDIR)
 
 LOCAL_CPPFLAGS  = -I$(SRCDIR) -I$(SRCDIR)/../include
 
 
 LOCAL_CPPFLAGS  = -I$(SRCDIR) -I$(SRCDIR)/../include
 
-OBJS            = screen.o image.o text.o load_bmp.o load_icns.o
+OBJS            = screen.o image.o text.o load_bmp.o load_icns.o lodepng.o
 TARGET          = libeg.a
 
 all: $(TARGET)
 TARGET          = libeg.a
 
 all: $(TARGET)
index cd25312bc22860947d1973bc97fd1f2422a84930..4cf282e1f0a6b9867ab793cd07cb0559c1095c93 100644 (file)
@@ -39,6 +39,7 @@
 #include "../refind/lib.h"
 #include "../refind/screen.h"
 #include "../include/refit_call_wrapper.h"
 #include "../refind/lib.h"
 #include "../refind/screen.h"
 #include "../include/refit_call_wrapper.h"
+#include "lodepng.h"
 
 #define MAX_FILE_SIZE (1024*1024*1024)
 
 
 #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);
       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;
    } // 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);
     // 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()
 
     return NewImage;
 } // EG_IMAGE *egLoadIcon()
index a9b3f01c689709be5afc9bf6207a3570eafadab0..5cd9fcd9d10549783e20e3bc086f7cfa2ec9e9a5 100644 (file)
@@ -81,49 +81,65 @@ EG_IMAGE * BuiltinIcon(IN UINTN Id)
     return BuiltinIconTable[Id].Image;
 }
 
     return BuiltinIconTable[Id].Image;
 }
 
+// Construct filename for all valid icon extensions and try to load it.
+// Returns image data or NULL if it can't be found.
+static EG_IMAGE * LoadIconAnyFormat(IN CHAR16 *IconsDir, IN CHAR16 *BaseName, IN CHAR16 *OsName) {
+   CHAR16     FileName[256];
+   CHAR16     *Extension;
+   EG_IMAGE   *Image = NULL;
+   UINTN      Index = 0;
+
+   while (((Extension = FindCommaDelimited(ICON_EXTENSIONS, Index++)) != NULL) && (Image == NULL)) {
+      SPrint(FileName, 255, L"%s\\%s_%s.%s", IconsDir, BaseName, OsName, Extension);
+
+      // try to load it
+      Image = egLoadIcon(SelfDir, FileName, 128);
+      MyFreePool(Extension);
+   } // while()
+   return Image;
+} // EG_IMAGE * LoadIconAnyFormat()
+
 //
 // Load an icon for an operating system
 //
 
 // Load an OS icon from among the comma-delimited list provided in OSIconName.
 //
 // Load an icon for an operating system
 //
 
 // Load an OS icon from among the comma-delimited list provided in OSIconName.
+// Searches for icons with extensions in the ICON_EXTENSIONS list (via
+// LoadIconAnyFormat()).
+// Returns image data. On failure, returns an ugly "dummy" icon.
 EG_IMAGE * LoadOSIcon(IN CHAR16 *OSIconName OPTIONAL, IN CHAR16 *FallbackIconName, BOOLEAN BootLogo)
 {
 EG_IMAGE * LoadOSIcon(IN CHAR16 *OSIconName OPTIONAL, IN CHAR16 *FallbackIconName, BOOLEAN BootLogo)
 {
-    EG_IMAGE        *Image;
+    EG_IMAGE        *Image = NULL;
     CHAR16          *CutoutName;
     CHAR16          *CutoutName;
-    CHAR16          FileName[256];
     UINTN           Index = 0;
 
     if (GlobalConfig.TextOnly)      // skip loading if it's not used anyway
         return NULL;
 
     // try the names from OSIconName
     UINTN           Index = 0;
 
     if (GlobalConfig.TextOnly)      // skip loading if it's not used anyway
         return NULL;
 
     // try the names from OSIconName
-    while ((CutoutName = FindCommaDelimited(OSIconName, Index++)) != NULL) {
-       SPrint(FileName, 255, L"%s\\%s_%s.icns", GlobalConfig.IconsDir ? GlobalConfig.IconsDir : DEFAULT_ICONS_DIR,
-              BootLogo ? L"boot" : L"os", CutoutName);
-
-        // try to load it
-        Image = egLoadIcon(SelfDir, FileName, 128);
-        if (Image != NULL) {
-            MyFreePool(CutoutName);
-            return Image;
-        }
-        MyFreePool(CutoutName);
-    } // while
+    while (((CutoutName = FindCommaDelimited(OSIconName, Index++)) != NULL) && (Image == NULL)) {
+       Image = LoadIconAnyFormat(GlobalConfig.IconsDir ? GlobalConfig.IconsDir : DEFAULT_ICONS_DIR,
+                                 BootLogo ? L"boot" : L"os", CutoutName);
+       MyFreePool(CutoutName);
+    } // while()
 
     // try the fallback name
 
     // try the fallback name
-    SPrint(FileName, 255, L"%s\\%s_%s.icns", GlobalConfig.IconsDir ? GlobalConfig.IconsDir : DEFAULT_ICONS_DIR,
-           BootLogo ? L"boot" : L"os", FallbackIconName);
-    Image = egLoadIcon(SelfDir, FileName, 128);
-    if (Image != NULL)
-        return Image;
+    if (Image == NULL)
+       Image = LoadIconAnyFormat(GlobalConfig.IconsDir ? GlobalConfig.IconsDir : DEFAULT_ICONS_DIR,
+                                 BootLogo ? L"boot" : L"os", FallbackIconName);
 
     // try the fallback name with os_ instead of boot_
 
     // try the fallback name with os_ instead of boot_
-    if (BootLogo)
-        return LoadOSIcon(NULL, FallbackIconName, FALSE);
+    if (BootLogo && (Image == NULL))
+       Image = LoadIconAnyFormat(GlobalConfig.IconsDir ? GlobalConfig.IconsDir : DEFAULT_ICONS_DIR,
+                                 L"os", FallbackIconName);
 
 
-    return DummyImage(128);
+    if (Image != NULL)
+        return Image;
+    else
+       return DummyImage(128);
 } /* EG_IMAGE * LoadOSIcon() */
 
 } /* EG_IMAGE * LoadOSIcon() */
 
+
 //
 // Load an image from a .icns file
 //
 //
 // Load an image from a .icns file
 //
@@ -143,11 +159,11 @@ EG_IMAGE * DummyImage(IN UINTN PixelSize)
     EG_IMAGE        *Image;
     UINTN           x, y, LineOffset;
     CHAR8           *Ptr, *YPtr;
     EG_IMAGE        *Image;
     UINTN           x, y, LineOffset;
     CHAR8           *Ptr, *YPtr;
-    
+
     Image = egCreateFilledImage(PixelSize, PixelSize, TRUE, &BlackPixel);
     Image = egCreateFilledImage(PixelSize, PixelSize, TRUE, &BlackPixel);
-    
+
     LineOffset = PixelSize * 4;
     LineOffset = PixelSize * 4;
-    
+
     YPtr = (CHAR8 *)Image->PixelData + ((PixelSize - 32) >> 1) * (LineOffset + 4);
     for (y = 0; y < 32; y++) {
         Ptr = YPtr;
     YPtr = (CHAR8 *)Image->PixelData + ((PixelSize - 32) >> 1) * (LineOffset + 4);
     for (y = 0; y < 32; y++) {
         Ptr = YPtr;
index bf8db1f3bb72cba2cd8923b379d1187d903f3d99..6035ee457dc96c1d54a0e18a23d047cc9148ccee 100644 (file)
@@ -49,6 +49,8 @@
 // icns loader module
 //
 
 // icns loader module
 //
 
+#define ICON_EXTENSIONS L"icns,png"
+
 EG_IMAGE * LoadOSIcon(IN CHAR16 *OSIconName OPTIONAL, IN CHAR16 *FallbackIconName, BOOLEAN BootLogo);
 
 EG_IMAGE * LoadIcns(IN EFI_FILE_HANDLE BaseDir, IN CHAR16 *FileName, IN UINTN PixelSize);
 EG_IMAGE * LoadOSIcon(IN CHAR16 *OSIconName OPTIONAL, IN CHAR16 *FallbackIconName, BOOLEAN BootLogo);
 
 EG_IMAGE * LoadIcns(IN EFI_FILE_HANDLE BaseDir, IN CHAR16 *FileName, IN UINTN PixelSize);
index ba1c6946b508f5ff205d6318fa94b294312d2102..6459939d9c47e3dbefe88b7d0f0cef43805f72f8 100644 (file)
@@ -128,7 +128,7 @@ static VOID AboutrEFInd(VOID)
 
     if (AboutMenu.EntryCount == 0) {
         AboutMenu.TitleImage = BuiltinIcon(BUILTIN_ICON_FUNC_ABOUT);
 
     if (AboutMenu.EntryCount == 0) {
         AboutMenu.TitleImage = BuiltinIcon(BUILTIN_ICON_FUNC_ABOUT);
-        AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.6.4.3");
+        AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.6.4.4");
         AddMenuInfoLine(&AboutMenu, L"");
         AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2006-2010 Christoph Pfisterer");
         AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2012 Roderick W. Smith");
         AddMenuInfoLine(&AboutMenu, L"");
         AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2006-2010 Christoph Pfisterer");
         AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2012 Roderick W. Smith");