X-Git-Url: https://code.delx.au/refind/blobdiff_plain/ee27d9d42706044bc9aa443bd8fc8ceb012ec86c..480ba418c97ece5557ac0efc5dc189ff19fb8b8f:/refind/icns.c diff --git a/refind/icns.c b/refind/icns.c index 09f28cf..5e74bb2 100644 --- a/refind/icns.c +++ b/refind/icns.c @@ -38,6 +38,8 @@ #include "lib.h" #include "icns.h" #include "config.h" +#include "mystrings.h" +#include "../refind/screen.h" // // well-known icons @@ -45,31 +47,42 @@ typedef struct { EG_IMAGE *Image; - CHAR16 *Path; - UINTN PixelSize; + CHAR16 *FileName; + UINTN IconSize; } BUILTIN_ICON; BUILTIN_ICON BuiltinIconTable[BUILTIN_ICON_COUNT] = { - { NULL, L"icons\\func_about.icns", 48 }, - { NULL, L"icons\\func_reset.icns", 48 }, - { NULL, L"icons\\func_shutdown.icns", 48 }, - { NULL, L"icons\\func_exit.icns", 48 }, - { NULL, L"icons\\tool_shell.icns", 48 }, - { NULL, L"icons\\tool_part.icns", 48 }, - { NULL, L"icons\\tool_rescue.icns", 48 }, - { NULL, L"icons\\vol_internal.icns", 32 }, - { NULL, L"icons\\vol_external.icns", 32 }, - { NULL, L"icons\\vol_optical.icns", 32 }, + { NULL, L"func_about", ICON_SIZE_SMALL }, + { NULL, L"func_reset", ICON_SIZE_SMALL }, + { NULL, L"func_shutdown", ICON_SIZE_SMALL }, + { NULL, L"func_exit", ICON_SIZE_SMALL }, + { NULL, L"func_firmware", ICON_SIZE_SMALL }, + { NULL, L"func_csr_rotate", ICON_SIZE_SMALL }, + { NULL, L"tool_shell", ICON_SIZE_SMALL }, + { NULL, L"tool_part", ICON_SIZE_SMALL }, + { NULL, L"tool_rescue", ICON_SIZE_SMALL }, + { NULL, L"tool_apple_rescue", ICON_SIZE_SMALL }, + { NULL, L"tool_windows_rescue", ICON_SIZE_SMALL }, + { NULL, L"tool_mok_tool", ICON_SIZE_SMALL }, + { NULL, L"tool_memtest", ICON_SIZE_SMALL }, + { NULL, L"tool_netboot", ICON_SIZE_SMALL }, + { NULL, L"vol_internal", ICON_SIZE_BADGE }, + { NULL, L"vol_external", ICON_SIZE_BADGE }, + { NULL, L"vol_optical", ICON_SIZE_BADGE }, + { NULL, L"vol_net", ICON_SIZE_BADGE }, }; EG_IMAGE * BuiltinIcon(IN UINTN Id) { if (Id >= BUILTIN_ICON_COUNT) return NULL; - - if (BuiltinIconTable[Id].Image == NULL) - BuiltinIconTable[Id].Image = LoadIcnsFallback(SelfDir, BuiltinIconTable[Id].Path, BuiltinIconTable[Id].PixelSize); - + + if (BuiltinIconTable[Id].Image == NULL) { + BuiltinIconTable[Id].Image = egFindIcon(BuiltinIconTable[Id].FileName, GlobalConfig.IconSizes[BuiltinIconTable[Id].IconSize]); + if (BuiltinIconTable[Id].Image == NULL) + BuiltinIconTable[Id].Image = DummyImage(GlobalConfig.IconSizes[BuiltinIconTable[Id].IconSize]); + } // if + return BuiltinIconTable[Id].Image; } @@ -78,50 +91,43 @@ EG_IMAGE * BuiltinIcon(IN UINTN Id) // // Load an OS icon from among the comma-delimited list provided in OSIconName. +// Searches for icons with extensions in the ICON_EXTENSIONS list (via +// egFindIcon()). +// 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; - CHAR16 *CutoutName; - CHAR16 FileName[256]; + EG_IMAGE *Image = NULL; + CHAR16 *CutoutName, BaseName[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"icons\\%s_%s.icns", BootLogo ? L"boot" : L"os", CutoutName); - - // try to load it - Image = egLoadIcon(SelfDir, FileName, 128); - if (Image != NULL) - return Image; - FreePool(CutoutName); - } // while - - // try the fallback name - SPrint(FileName, 255, L"icons\\%s_%s.icns", BootLogo ? L"boot" : L"os", FallbackIconName); - Image = egLoadIcon(SelfDir, FileName, 128); - if (Image != NULL) - return Image; - - // try the fallback name with os_ instead of boot_ - if (BootLogo) - return LoadOSIcon(NULL, FallbackIconName, FALSE); - - return DummyImage(128); -} /* EG_IMAGE * LoadOSIcon() */ + // First, try to find an icon from the OSIconName list.... + while (((CutoutName = FindCommaDelimited(OSIconName, Index++)) != NULL) && (Image == NULL)) { + SPrint(BaseName, 255, L"%s_%s", BootLogo ? L"boot" : L"os", CutoutName); + Image = egFindIcon(BaseName, GlobalConfig.IconSizes[ICON_SIZE_BIG]); + } -// -// Load an image from a .icns file -// + // If that fails, try again using the FallbackIconName.... + if (Image == NULL) { + SPrint(BaseName, 255, L"%s_%s", BootLogo ? L"boot" : L"os", FallbackIconName); + Image = egFindIcon(BaseName, GlobalConfig.IconSizes[ICON_SIZE_BIG]); + } + + // If that fails and if BootLogo was set, try again using the "os_" start of the name.... + if (BootLogo && (Image == NULL)) { + SPrint(BaseName, 255, L"os_%s", FallbackIconName); + Image = egFindIcon(BaseName, GlobalConfig.IconSizes[ICON_SIZE_BIG]); + } + + // If all of these fail, return the dummy image.... + if (Image == NULL) + Image = DummyImage(GlobalConfig.IconSizes[ICON_SIZE_BIG]); + + return Image; +} /* EG_IMAGE * LoadOSIcon() */ -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); -} static EG_PIXEL BlackPixel = { 0x00, 0x00, 0x00, 0 }; //static EG_PIXEL YellowPixel = { 0x00, 0xff, 0xff, 0 }; @@ -131,11 +137,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; @@ -153,19 +159,6 @@ EG_IMAGE * DummyImage(IN UINTN PixelSize) } YPtr += LineOffset; } - - return Image; -} -EG_IMAGE * LoadIcnsFallback(IN EFI_FILE_HANDLE BaseDir, IN CHAR16 *FileName, IN UINTN PixelSize) -{ - EG_IMAGE *Image; - if (GlobalConfig.TextOnly) // skip loading if it's not used anyway - return NULL; - - Image = LoadIcns(BaseDir, FileName, PixelSize); - if (Image == NULL) { - Image = DummyImage(PixelSize); - } return Image; }