]> 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.
 
+* 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:
 -------------------
 
index 5a335cd26155ca4a8f9e2037821463c4644e055a..6b940ff70070160ef53dac360ebde4d270ed89fd 100644 (file)
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -1,6 +1,8 @@
 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
index 9b196c7f42052de31478570a8bd540529a693c33..647c3d05b3fb9db92159bbca0c54a078d15b000e 100644 (file)
@@ -5,7 +5,7 @@
 
 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
index 73c46dba625aaf1672971e36a978b41b55395c11..7766472760904afb4cfc0c59d067ba9eace7b69f 100644 (file)
@@ -9,7 +9,7 @@ VPATH = $(SRCDIR)
 
 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)
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()
index a9b3f01c689709be5afc9bf6207a3570eafadab0..5cd9fcd9d10549783e20e3bc086f7cfa2ec9e9a5 100644 (file)
@@ -81,49 +81,65 @@ EG_IMAGE * BuiltinIcon(IN UINTN Id)
     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.
+// 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        *Image;
+    EG_IMAGE        *Image = NULL;
     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
-    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
-    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_
-    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() */
 
+
 //
 // 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;
-    
+
     Image = egCreateFilledImage(PixelSize, PixelSize, TRUE, &BlackPixel);
-    
+
     LineOffset = PixelSize * 4;
-    
+
     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
 //
 
+#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);
index ba1c6946b508f5ff205d6318fa94b294312d2102..6459939d9c47e3dbefe88b7d0f0cef43805f72f8 100644 (file)
@@ -128,7 +128,7 @@ static VOID AboutrEFInd(VOID)
 
     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");