#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\\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", 48 },
+ { NULL, L"func_reset", 48 },
+ { NULL, L"func_shutdown", 48 },
+ { NULL, L"func_exit", 48 },
+ { NULL, L"func_firmware", 48 },
+ { NULL, L"tool_shell", 48 },
+ { NULL, L"tool_part", 48 },
+ { NULL, L"tool_rescue", 48 },
+ { NULL, L"tool_apple_rescue", 48 },
+ { NULL, L"tool_mok_tool", 48 },
+ { NULL, L"vol_internal", 32 },
+ { NULL, L"vol_external", 32 },
+ { NULL, L"vol_optical", 32 },
};
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, BuiltinIconTable[Id].PixelSize);
+ if (BuiltinIconTable[Id].Image == NULL)
+ BuiltinIconTable[Id].Image = DummyImage(BuiltinIconTable[Id].PixelSize);
+ } // if
return BuiltinIconTable[Id].Image;
}
//
// 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);
+ // 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, 128);
+ }
- // try to load it
- Image = egLoadIcon(SelfDir, FileName, 128);
- if (Image != NULL)
- return Image;
- FreePool(CutoutName);
- } // while
+ // 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, 128);
+ }
- // 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;
+ // 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, 128);
+ }
- // try the fallback name with os_ instead of boot_
- if (BootLogo)
- return LoadOSIcon(NULL, FallbackIconName, FALSE);
+ // If all of these fail, return the dummy image....
+ if (Image == NULL)
+ Image = DummyImage(128);
- return DummyImage(128);
+ return Image;
} /* 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);
-}
static EG_PIXEL BlackPixel = { 0x00, 0x00, 0x00, 0 };
//static EG_PIXEL YellowPixel = { 0x00, 0xff, 0xff, 0 };
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;
}
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;
}