#include "lib.h"
#include "icns.h"
#include "config.h"
+#include "../refind/screen.h"
//
// well-known icons
typedef struct {
EG_IMAGE *Image;
- CHAR16 *Path;
+ CHAR16 *FileName;
UINTN PixelSize;
} 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\\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.icns", 48 },
+ { NULL, L"func_reset.icns", 48 },
+ { NULL, L"func_shutdown.icns", 48 },
+ { NULL, L"func_exit.icns", 48 },
+ { 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 },
};
EG_IMAGE * BuiltinIcon(IN UINTN Id)
{
+ CHAR16 FileName[256];
+
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) {
+ SPrint(FileName, 255, L"%s\\%s", GlobalConfig.IconsDir ? GlobalConfig.IconsDir : DEFAULT_ICONS_DIR,
+ BuiltinIconTable[Id].FileName);
+ BuiltinIconTable[Id].Image = LoadIcnsFallback(SelfDir, FileName, BuiltinIconTable[Id].PixelSize);
+ } // if
+
return BuiltinIconTable[Id].Image;
}
// Load an icon for an operating system
//
+// Load an OS icon from among the comma-delimited list provided in OSIconName.
EG_IMAGE * LoadOSIcon(IN CHAR16 *OSIconName OPTIONAL, IN CHAR16 *FallbackIconName, BOOLEAN BootLogo)
{
EG_IMAGE *Image;
- CHAR16 CutoutName[16];
+ CHAR16 *CutoutName;
CHAR16 FileName[256];
- UINTN StartIndex, Index, NextIndex;
+ UINTN Index = 0;
if (GlobalConfig.TextOnly) // skip loading if it's not used anyway
return NULL;
- Image = NULL;
// try the names from OSIconName
- for (StartIndex = 0; OSIconName != NULL && OSIconName[StartIndex]; StartIndex = NextIndex) {
- // find the next name in the list
- NextIndex = 0;
- for (Index = StartIndex; OSIconName[Index]; Index++) {
- if (OSIconName[Index] == ',') {
- NextIndex = Index + 1;
- break;
- }
- }
- if (OSIconName[Index] == 0)
- NextIndex = Index;
-
- // construct full path
- if (Index > StartIndex + 15) // prevent buffer overflow
- continue;
- CopyMem(CutoutName, OSIconName + StartIndex, (Index - StartIndex) * sizeof(CHAR16));
- CutoutName[Index - StartIndex] = 0;
- SPrint(FileName, 255, L"icons\\%s_%s.icns",
- BootLogo ? L"boot" : L"os", CutoutName);
-
+ 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)
+ if (Image != NULL) {
+ MyFreePool(CutoutName);
return Image;
- }
+ }
+ MyFreePool(CutoutName);
+ } // while
// try the fallback name
- SPrint(FileName, 255, L"icons\\%s_%s.icns",
+ 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;
-
+
// try the fallback name with os_ instead of boot_
if (BootLogo)
return LoadOSIcon(NULL, FallbackIconName, FALSE);
-
+
return DummyImage(128);
-}
+} /* EG_IMAGE * LoadOSIcon() */
//
// Load an image from a .icns file
}
YPtr += LineOffset;
}
-
+
return Image;
}