X-Git-Url: https://code.delx.au/refind/blobdiff_plain/0d5ee58bd6562186ea980fcca99484d8272369bf..153afb2bcbdb1a98961d7daa8d3539dde05dacc1:/refind/icns.c diff --git a/refind/icns.c b/refind/icns.c index e4738e2..0f55c8d 100644 --- a/refind/icns.c +++ b/refind/icns.c @@ -38,6 +38,7 @@ #include "lib.h" #include "icns.h" #include "config.h" +#include "../refind/screen.h" // // well-known icons @@ -57,6 +58,8 @@ BUILTIN_ICON BuiltinIconTable[BUILTIN_ICON_COUNT] = { { NULL, L"tool_shell.icns", 48 }, { NULL, L"tool_part.icns", 48 }, { NULL, L"tool_rescue.icns", 48 }, + { NULL, L"tool_apple_rescue.icns", 48 }, + { NULL, L"tool_mok_tool.icns", 48 }, { NULL, L"vol_internal.icns", 32 }, { NULL, L"vol_external.icns", 32 }, { NULL, L"vol_optical.icns", 32 }, @@ -78,57 +81,81 @@ 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) - return Image; - FreePool(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 -// -EG_IMAGE * LoadIcns(IN EFI_FILE_HANDLE BaseDir, IN CHAR16 *FileName, IN UINTN PixelSize) -{ - if (GlobalConfig.TextOnly) // skip loading if it's not used anyway - return NULL; - return egLoadIcon(BaseDir, FileName, PixelSize); -} +// Load an image from a .icns or .png file. FileNames contains a comma-delimited +// list of potential filanems; the function tries each in turn until it finds +// a loadable icon. If no file has a valid icon, it returns NULL. +EG_IMAGE * LoadIcns(IN EFI_FILE_HANDLE BaseDir, IN CHAR16 *FileNames, IN UINTN PixelSize) { + CHAR16 *FileName; + EG_IMAGE *Image = NULL; + UINTN Index = 0; + + if (GlobalConfig.TextOnly) // skip loading if it's not used anyway + return NULL; + + while (((FileName = FindCommaDelimited(FileNames, Index++)) != NULL) && (Image == NULL)) { + Image = egLoadIcon(BaseDir, FileName, PixelSize); + } + return Image; +} // EG_IMAGE * LoadIcns() static EG_PIXEL BlackPixel = { 0x00, 0x00, 0x00, 0 }; //static EG_PIXEL YellowPixel = { 0x00, 0xff, 0xff, 0 }; @@ -138,11 +165,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;