Add BIconUtils::GetSystemIcon

Allow to easily access the alert icons and anything that's added to app_server
resources.

Fixes #10887.

Convert BAlert, Debugger AlertWithCheckbox and Keymap ModifierKeysWindow
to make use of it, removing the duplicate code to locate app_server
resources.

The resources are initialized only once (per application), so there is no need
to reload them for every access to the icons.

In the ticket there is discussion about putting this in BControlLook,
but I think this should in fact be moved fully into app_server with
special drawing commands for well-known icons. That would avoid loading
and rendering the icon on the application side to then send it to
app_server (especially in remote_app_server case)?

In any case, this simple API can serve as a base for applications to
use, and we can change how it is implemented later on.

Change-Id: Id370526ae5cf165cfb8bc277bc8a7f46c26f542d
Reviewed-on: https://review.haiku-os.org/c/haiku/+/6463
Tested-by: Commit checker robot <no-reply+buildbot@haiku-os.org>
Reviewed-by: waddlesplash <waddlesplash@gmail.com>
Reviewed-by: Adrien Destugues <pulkomandy@pulkomandy.tk>
This commit is contained in:
PulkoMandy 2023-05-20 14:18:01 +02:00 committed by Adrien Destugues
parent 13f2f8de06
commit 4dbd474753
11 changed files with 430 additions and 579 deletions

View File

@ -1,13 +1,13 @@
/*
* Copyright 2011 Haiku, Inc. All rights reserved.
* Copyright 2011-2023 Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Adrien Destugues, pulkomandy@pulkomandy.ath.cx
* Adrien Destugues, pulkomandy@pulkomandy.tk
*
* Corresponds to:
* headers/os/interface/IconUtils.h rev 42600
* src/kits/interface/IconUtils.cpp rev 42600
* headers/os/interface/IconUtils.h hrev57019
* src/kits/interface/IconUtils.cpp hrev57019
*/
@ -114,6 +114,32 @@
*/
/*
\fn static status_t BIconUtils::GetSystemIcon(const char* iconName, BBitmap* result)
\brief Load an icon from the set of system icons.
To provide some uniformity between different applications, a base set of icons is provided
with Haiku. Whenever possible, these should be used instead of application specific icons,
to ensure consistency and ease of discovering application functions.
The available icons follow the FreeDesktop icon-naming-spec convention. At this time the
following icons are available:
- Flag icons for 245 countries
- dialog-error, dialog-information, and dialog-warning
- As an extension not available in FreeDesktop specifications, dialog-idea is also available
and corresponds to the icon used in BAlert of type B_IDEA_ALERT.
The icon is automatically scaled to fit the \a result bitmap, which must be allocated and
valid before calling this function.
\return B_OK if the icon could be loaded into the \a result BBitmap. B_ENTRY_NOT_FOUND if the
requested icon is not currently available.
\since Haiku R1
*/
/*!
\fn static status_t BIconUtils::ConvertFromCMAP8(BBitmap* source,
BBitmap* result)

View File

@ -1,5 +1,5 @@
/*
* Copyright 2006-2008, Haiku. All rights reserved.
* Copyright 2006-2023, Haiku. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef _ICON_UTILS_H
@ -36,6 +36,8 @@ public:
const char* largeIconAttrName,
icon_size size, BBitmap* icon);
static status_t GetSystemIcon(const char* iconName, BBitmap* result);
static status_t ConvertFromCMAP8(BBitmap* source,
BBitmap* result);
static status_t ConvertToCMAP8(BBitmap* source,

View File

@ -42,14 +42,7 @@ AlertWithCheckbox::AlertWithCheckbox(const char* title, const char* messageText,
fSemaphore(create_sem(0, "AlertWithCheckbox")),
fAction(0)
{
BResources resources;
resources.SetToImage(B_TRANSLATION_CONTEXT);
size_t size;
const uint8* iconData = (const uint8*)resources.LoadResource('VICN', 1,
&size);
// TODO load "info" icon from app_server instead?
BIconUtils::GetVectorIcon(iconData, size, &fBitmap);
BIconUtils::GetSystemIcon("dialog-information", &fBitmap);
BStripeView *stripeView = new BStripeView(fBitmap);
BTextView *message = new BTextView("_tv_");

File diff suppressed because it is too large Load Diff

67
src/kits/Icons.rdef Normal file
View File

@ -0,0 +1,67 @@
resource(512, "dialog-information") vector_icon {
$"6E636966090500040054020006023BF30E382DD2BB75033F220A49642A46D5CC"
$"00227AFFFF0025E5020006023A56A43629D9BB9B013FE5A94A9B3E32FBB50000"
$"0081FF0909B7020106023C80000000000000003A400049C00048C000000530D1"
$"FF67B5FF020006023AACD8B8A7473AAA713CB009472EA94A5B710067B5FFFF3B"
$"79F602000602392514B71E8838D8A53ADE9E49A9DC4ADF2C00050EC5FF062FE3"
$"020106043B40000000000000003B4000486000465B85003787FF551B76FFFF03"
$"1D8CDA00008102010602376000000000000000B7600048600046400000FFFFFF"
$"FF3787FF0C0A07444A406044604E565156584F4E4A0204564ACAB74AC6504A4C"
$"C5ED4CC4B74CC7225655C65055CAB75560C5ED60C72260C4B70A0C424D423535"
$"302A362A392E3C2E47264C2650405E4A544A500A0A3855383C2A362A39B897BE"
$"432E50264C2650405E40590A044059405E4A544A500A043855424D4235383C0A"
$"044A50424D3855C180C8210A0338554059C180C8210A03264C2E502E470A0435"
$"302A36383C423502043622BDF722B990222C2CB7C7B5942CB9FB3636B99036BD"
$"F736402C40B9FB40B594020433B53DBB50B53DB9D3B53DB93A29B939B5D7B93A"
$"B75433B7EEB9D4B7EEBB50B7EEBBEA29BBEAB754BBEAB5D70C0A01020001000A"
$"0001021001178400040A020103000A030104000A030105000A060106000A0501"
$"07000A050108000A040109000A00010A1001178400040A07010A000A08010B00"
};
resource(513, "dialog-idea") vector_icon {
$"6E63696605020102023DC0000000000000003D80004A00004A40007D01000044"
$"FF0100000003010000020116043B73F1366FD3B526223A3B22497CE64B43AE70"
$"F2A38ED4E1FF59020106033DC0000000000000003DC00049000048000031FFFF"
$"FFD5FFE500FFFFC800020106033DC0000000000000003DC00049000048000000"
$"FFE6A5FFFFBF00E2FFBB03070204402052202E202040202E205240602E605260"
$"60406052602E0405FE0148534858485848CAB0405EC18E5EBDF15E385838CAB0"
$"3858530405FE014B4B4B4D4B4D4BC6D24056C22956BD5656354D35C6D2354D4B"
$"0005444D444DC56BC42F563856C0D4C883B7C14022C49622BAE9222A382AB7C1"
$"2AC0D43C4DBA14C42F3C4D08024050404202043C3C3CBF713CBCDE4036BED836"
$"C0A736443C44BCDE44BF714042C0A742BED8420203344A344ABBEAC4533C4DBD"
$"00C4B83C4D344B374D344B0B0A000100023EE0000000000000003C8000484000"
$"4AC0000A0101011001178400040A020101000A010202031001178400040A0301"
$"02000A030103000A0400000A0401041001178422040A0401051001178422040A"
$"010106000A01010602C000000000000000004000004C0000000000"
};
resource(514, "dialog-warning") vector_icon {
$"6E636966060500020006023B5F8C3892CABB1F6A3E0BF0492A4E47706700FFF4"
$"9EFFFFBD30020006023B3049396B0ABA90833C646E4A101543299500FFFFFFFF"
$"FFF28902000602B7465D385FF3BBBFC4BA95C24A5F424B291400E07900FFFFF2"
$"8902000602395E1E32DB49B6921A3D07D74A57904908D600ED9406FFFCB23D04"
$"0174090A0B3E5E445E465C4A5E585E605456504C504B51485046500A062E262E"
$"423E494643462636220A042E262E423E493E2B0A042E263E2B462636220A043E"
$"2B3E49464346260A062E492E543E5C4654464936430A042E492E543E5C3E500A"
$"042E493E50464936430A043E503E5C46544649070A050100000A000105100117"
$"8400040A030107000A0001011001178400040A01020206000A020103000A0402"
$"040800"
};
resource(515, "dialog-error") vector_icon {
$"6E636966070500040177020106043BA6660000000000003BA6664899994AF000"
$"00FFFFFF3FFF3930FFBF0000CF800000020106043BA6660000000000003BA666"
$"4899994AF00000FF756E4CD50F05FFBF0000CF8000000200060239F3803A4863"
$"BE14543D99654A2E00465D3700FF6159FFE4000002000602371CFF350C19BC16"
$"873E221B4A4C844710AB00800000FFA00404020006023B00000000000000003C"
$"800049000000000000FFC6C0FFFF7575090A0657605F5857544856445A485E02"
$"043C54C0CB54BB8454305A30C8CA30CB6D3C60BB8460C0CB60485A48CB6D48C8"
$"CA02043848BEC348BA5C482E522EC4B82EC91F385CBA5C5CBEC35C425242C91F"
$"42C4B802053848364CBA5C482E522EC4B8B895C91F385CBA5C5CBEC45C425242"
$"C91F4054364F3A51364F02033848BEC348364C364F364F3A514252405442C4B8"
$"0A032A28354B3C2D0A0435222A283C2D46260A043C2D354B3D4346260A053522"
$"2A28354B3D434626080A01020001000A0001021001178400040A020103000A03"
$"0104000A0001081001178400040A040105000A050107000A06010600"
};

View File

@ -28,7 +28,7 @@ for architectureObject in [ MultiArchSubDirSetup ] {
local libbe = [ MultiArchDefaultGristFiles libbe.so ] ;
AddResources $(libbe) :
libbe_version.rdef CountryFlags.rdef LanguageFlags.rdef
libbe_version.rdef CountryFlags.rdef Icons.rdef LanguageFlags.rdef
;
SetVersionScript $(libbe) : libbe_versions ;

View File

@ -530,45 +530,21 @@ BAlert::_CreateTypeIcon()
// The icons are in the app_server resources
BBitmap* icon = NULL;
BPath path;
status_t status = find_directory(B_BEOS_SERVERS_DIRECTORY, &path);
if (status != B_OK) {
FTRACE((stderr, "BAlert::_CreateTypeIcon() - find_directory "
"failed: %s\n", strerror(status)));
return NULL;
}
path.Append("app_server");
BFile file;
status = file.SetTo(path.Path(), B_READ_ONLY);
if (status != B_OK) {
FTRACE((stderr, "BAlert::_CreateTypeIcon() - BFile init failed: %s\n",
strerror(status)));
return NULL;
}
BResources resources;
status = resources.SetTo(&file);
if (status != B_OK) {
FTRACE((stderr, "BAlert::_CreateTypeIcon() - BResources init "
"failed: %s\n", strerror(status)));
return NULL;
}
// Which icon are we trying to load?
const char* iconName;
switch (fType) {
case B_INFO_ALERT:
iconName = "info";
iconName = "dialog-information";
break;
case B_IDEA_ALERT:
iconName = "idea";
iconName = "dialog-idea";
break;
case B_WARNING_ALERT:
iconName = "warn";
iconName = "dialog-warning";
break;
case B_STOP_ALERT:
iconName = "stop";
iconName = "dialog-error";
break;
default:
@ -587,31 +563,7 @@ BAlert::_CreateTypeIcon()
}
// Load the raw icon data
size_t size = 0;
const uint8* rawIcon;
// Try to load vector icon
rawIcon = (const uint8*)resources.LoadResource(B_VECTOR_ICON_TYPE,
iconName, &size);
if (rawIcon != NULL
&& BIconUtils::GetVectorIcon(rawIcon, size, icon) == B_OK) {
return icon;
}
// Fall back to bitmap icon
rawIcon = (const uint8*)resources.LoadResource(B_LARGE_ICON_TYPE,
iconName, &size);
if (rawIcon == NULL) {
FTRACE((stderr, "BAlert::_CreateTypeIcon() - Icon resource not found\n"));
delete icon;
return NULL;
}
// Handle color space conversion
if (icon->ColorSpace() != B_CMAP8) {
BIconUtils::ConvertFromCMAP8(rawIcon, B_LARGE_ICON, B_LARGE_ICON,
B_LARGE_ICON, icon);
}
BIconUtils::GetSystemIcon(iconName, icon);
return icon;
}

View File

@ -370,10 +370,11 @@ BLocaleRoster::GetFlagIconForCountry(BBitmap* flagIcon, const char* countryCode)
if (codeLength < 2)
return B_BAD_VALUE;
char normalizedCode[3];
normalizedCode[0] = toupper(countryCode[codeLength - 2]);
normalizedCode[1] = toupper(countryCode[codeLength - 1]);
normalizedCode[2] = '\0';
char normalizedCode[8];
strcpy(normalizedCode, "flag-");
normalizedCode[5] = tolower(countryCode[codeLength - 2]);
normalizedCode[6] = tolower(countryCode[codeLength - 1]);
normalizedCode[7] = '\0';
size_t size;
const void* buffer = resources->LoadResource(B_VECTOR_ICON_TYPE,

View File

@ -1,5 +1,5 @@
/*
* Copyright 2006-2014 Haiku, Inc. All rights reserved.
* Copyright 2006-2023 Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
@ -18,8 +18,11 @@
#include <string.h>
#include <Bitmap.h>
#include <FindDirectory.h>
#include <Node.h>
#include <NodeInfo.h>
#include <Path.h>
#include <Resources.h>
#include <String.h>
#include <TypeConstants.h>
@ -614,6 +617,69 @@ BIconUtils::GetCMAP8Icon(BNode* node, const char* smallIconAttrName,
}
status_t
BIconUtils::GetSystemIcon(const char* iconName, BBitmap* icon)
{
static BResources resources;
static bool resourcesAreLoaded = false;
if (!resourcesAreLoaded) {
BPath path;
status_t status = find_directory(B_SYSTEM_LIB_DIRECTORY, &path);
if (status != B_OK) {
return status;
}
path.Append("libbe.so");
BFile file;
status = file.SetTo(path.Path(), B_READ_ONLY);
if (status != B_OK) {
return status;
}
status = resources.SetTo(&file);
if (status != B_OK) {
return status;
}
resourcesAreLoaded = true;
}
// Check the icon bitmap
if (icon == NULL || icon->InitCheck() < B_OK) {
return B_BAD_DATA;
}
// Load the raw icon data
size_t size = 0;
const uint8* rawIcon;
// Try to load vector icon
rawIcon = (const uint8*)resources.LoadResource(B_VECTOR_ICON_TYPE,
iconName, &size);
if (rawIcon != NULL
&& BIconUtils::GetVectorIcon(rawIcon, size, icon) == B_OK) {
return B_OK;
}
// Fall back to bitmap icon
rawIcon = (const uint8*)resources.LoadResource(B_LARGE_ICON_TYPE,
iconName, &size);
if (rawIcon == NULL) {
delete icon;
return B_ENTRY_NOT_FOUND;
}
// Handle color space conversion
if (icon->ColorSpace() != B_CMAP8) {
BIconUtils::ConvertFromCMAP8(rawIcon, B_LARGE_ICON, B_LARGE_ICON,
B_LARGE_ICON, icon);
}
return B_OK;
}
// #pragma mark - ConvertFromCMAP8() and ConvertToCMAP8()

View File

@ -151,42 +151,6 @@ ConflictView::SetWarnIcon(bool show)
void
ConflictView::_FillIcons()
{
// return if the icons have already been filled out
if (fStopIcon != NULL && fStopIcon->InitCheck() == B_OK
&& fWarnIcon != NULL && fWarnIcon->InitCheck() == B_OK) {
return;
}
BPath path;
status_t status = find_directory(B_BEOS_SERVERS_DIRECTORY, &path);
if (status < B_OK) {
FTRACE((stderr,
"_FillIcons() - find_directory failed: %s\n",
strerror(status)));
return;
}
path.Append("app_server");
BFile file;
status = file.SetTo(path.Path(), B_READ_ONLY);
if (status < B_OK) {
FTRACE((stderr,
"_FillIcons() - BFile init failed: %s\n",
strerror(status)));
return;
}
BResources resources;
status = resources.SetTo(&file);
if (status < B_OK) {
FTRACE((stderr,
"_FillIcons() - BResources init failed: %s\n",
strerror(status)));
return;
}
size_t size = 0;
if (fStopIcon == NULL) {
// Allocate the fStopIcon bitmap
fStopIcon = new (std::nothrow) BBitmap(Bounds(), 0,
@ -198,15 +162,11 @@ ConflictView::_FillIcons()
return;
}
// load stop icon bitmap from app_server
const uint8* stopVector
= (const uint8*)resources.LoadResource(B_VECTOR_ICON_TYPE, "stop",
&size);
if (stopVector == NULL
|| BIconUtils::GetVectorIcon(stopVector, size, fStopIcon)
!= B_OK) {
// load dialog-error icon bitmap
if (BIconUtils::GetSystemIcon("dialog-error", fStopIcon) != B_OK) {
delete fStopIcon;
fStopIcon = NULL;
return;
}
}
@ -221,15 +181,11 @@ ConflictView::_FillIcons()
return;
}
// load warn icon bitmap from app_server
const uint8* warnVector
= (const uint8*)resources.LoadResource(B_VECTOR_ICON_TYPE, "warn",
&size);
if (warnVector == NULL
|| BIconUtils::GetVectorIcon(warnVector, size, fWarnIcon)
!= B_OK) {
// load dialog-warning icon bitmap
if (BIconUtils::GetSystemIcon("dialog-warning", fWarnIcon) != B_OK) {
delete fWarnIcon;
fWarnIcon = NULL;
return;
}
}
}

View File

@ -18,8 +18,6 @@ resource app_version {
long_info = "app_server ©2004-2009 Haiku Inc."
};
#ifdef HAIKU_TARGET_PLATFORM_HAIKU
resource vector_icon array {
$"6E6369662104004C03FFCB9A01CD9866B201CD9966B201CD9966B201CD9966B2"
$"01CD9966B201CD9966B201CD9966B201CD9866B204FFF204FFF204FFF204FFF2"
@ -132,213 +130,3 @@ resource vector_icon array {
$"4011"
};
resource(0, "info") #'VICN' array {
$"6E636966090500040054020006023BF30E382DD2BB75033F220A49642A46D5CC"
$"00227AFFFF0025E5020006023A56A43629D9BB9B013FE5A94A9B3E32FBB50000"
$"0081FF0909B7020106023C80000000000000003A400049C00048C000000530D1"
$"FF67B5FF020006023AACD8B8A7473AAA713CB009472EA94A5B710067B5FFFF3B"
$"79F602000602392514B71E8838D8A53ADE9E49A9DC4ADF2C00050EC5FF062FE3"
$"020106043B40000000000000003B4000486000465B85003787FF551B76FFFF03"
$"1D8CDA00008102010602376000000000000000B7600048600046400000FFFFFF"
$"FF3787FF0C0A07444A406044604E565156584F4E4A0204564ACAB74AC6504A4C"
$"C5ED4CC4B74CC7225655C65055CAB75560C5ED60C72260C4B70A0C424D423535"
$"302A362A392E3C2E47264C2650405E4A544A500A0A3855383C2A362A39B897BE"
$"432E50264C2650405E40590A044059405E4A544A500A043855424D4235383C0A"
$"044A50424D3855C180C8210A0338554059C180C8210A03264C2E502E470A0435"
$"302A36383C423502043622BDF722B990222C2CB7C7B5942CB9FB3636B99036BD"
$"F736402C40B9FB40B594020433B53DBB50B53DB9D3B53DB93A29B939B5D7B93A"
$"B75433B7EEB9D4B7EEBB50B7EEBBEA29BBEAB754BBEAB5D70C0A01020001000A"
$"0001021001178400040A020103000A030104000A030105000A060106000A0501"
$"07000A050108000A040109000A00010A1001178400040A07010A000A08010B00"
};
resource(1, "idea") #'VICN' array {
$"6E63696605020102023DC0000000000000003D80004A00004A40007D01000044"
$"FF0100000003010000020116043B73F1366FD3B526223A3B22497CE64B43AE70"
$"F2A38ED4E1FF59020106033DC0000000000000003DC00049000048000031FFFF"
$"FFD5FFE500FFFFC800020106033DC0000000000000003DC00049000048000000"
$"FFE6A5FFFFBF00E2FFBB03070204402052202E202040202E205240602E605260"
$"60406052602E0405FE0148534858485848CAB0405EC18E5EBDF15E385838CAB0"
$"3858530405FE014B4B4B4D4B4D4BC6D24056C22956BD5656354D35C6D2354D4B"
$"0005444D444DC56BC42F563856C0D4C883B7C14022C49622BAE9222A382AB7C1"
$"2AC0D43C4DBA14C42F3C4D08024050404202043C3C3CBF713CBCDE4036BED836"
$"C0A736443C44BCDE44BF714042C0A742BED8420203344A344ABBEAC4533C4DBD"
$"00C4B83C4D344B374D344B0B0A000100023EE0000000000000003C8000484000"
$"4AC0000A0101011001178400040A020101000A010202031001178400040A0301"
$"02000A030103000A0400000A0401041001178422040A0401051001178422040A"
$"010106000A01010602C000000000000000004000004C0000000000"
};
resource(2, "warn") #'VICN' array {
$"6E636966060500020006023B5F8C3892CABB1F6A3E0BF0492A4E47706700FFF4"
$"9EFFFFBD30020006023B3049396B0ABA90833C646E4A101543299500FFFFFFFF"
$"FFF28902000602B7465D385FF3BBBFC4BA95C24A5F424B291400E07900FFFFF2"
$"8902000602395E1E32DB49B6921A3D07D74A57904908D600ED9406FFFCB23D04"
$"0174090A0B3E5E445E465C4A5E585E605456504C504B51485046500A062E262E"
$"423E494643462636220A042E262E423E493E2B0A042E263E2B462636220A043E"
$"2B3E49464346260A062E492E543E5C4654464936430A042E492E543E5C3E500A"
$"042E493E50464936430A043E503E5C46544649070A050100000A000105100117"
$"8400040A030107000A0001011001178400040A01020206000A020103000A0402"
$"040800"
};
resource(3, "stop") #'VICN' array {
$"6E636966070500040177020106043BA6660000000000003BA6664899994AF000"
$"00FFFFFF3FFF3930FFBF0000CF800000020106043BA6660000000000003BA666"
$"4899994AF00000FF756E4CD50F05FFBF0000CF8000000200060239F3803A4863"
$"BE14543D99654A2E00465D3700FF6159FFE4000002000602371CFF350C19BC16"
$"873E221B4A4C844710AB00800000FFA00404020006023B00000000000000003C"
$"800049000000000000FFC6C0FFFF7575090A0657605F5857544856445A485E02"
$"043C54C0CB54BB8454305A30C8CA30CB6D3C60BB8460C0CB60485A48CB6D48C8"
$"CA02043848BEC348BA5C482E522EC4B82EC91F385CBA5C5CBEC35C425242C91F"
$"42C4B802053848364CBA5C482E522EC4B8B895C91F385CBA5C5CBEC45C425242"
$"C91F4054364F3A51364F02033848BEC348364C364F364F3A514252405442C4B8"
$"0A032A28354B3C2D0A0435222A283C2D46260A043C2D354B3D4346260A053522"
$"2A28354B3D434626080A01020001000A0001021001178400040A020103000A03"
$"0104000A0001081001178400040A040105000A050107000A06010600"
};
#else // HAIKU_TARGET_PLATFORM_HAIKU
resource(0, "info") #'ICON' array {
$"FFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFF0000252525250000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF00252521212325252500FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF002020BE202122232500FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFF002521BE3FBE212123232500FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFF00252120BE21212223242500FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFF002523212121212223242500FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFF002525222121232224242500FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF00252323232324242500FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFF000025252424242425250000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFF00BEBE000025252525000025BE00FFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFF009292BEBE000000002525255E00FFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFF0021219292BE25252525BE5E2500FFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFF000021219292BEBEBE5E252500FFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF002121212192925E25252500FFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF002121212121212525252500FFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF002121212121212525252500FFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF002121212121212525252500FFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFF00002121212121212525252500FFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFF00BE0021212121212125252525000EFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFF00BEBE0021212121212125252525000E0E0EFFFFFFFFFFFFFFFFFFFFFF"
$"FFFF009292BE002121212121212525252500000E0E0E0EFFFFFFFFFFFFFFFFFF"
$"FFFF002121920021212121212125252525BEBE00000E0E0E0EFFFFFFFFFFFFFF"
$"FFFF0021212121212121212121252525BEBEBEBE25000E0E0E0E0EFFFFFFFFFF"
$"FFFF00212121212121212121212525BEBEBEBE2525000E0E0E0E0E0E0EFFFFFF"
$"FFFFFF0000212121212121212125BEBEBEBE252525000E0E0E0E0E0EFFFFFFFF"
$"FFFFFFFFFF00002121212121219292BEBE25252525000E0E0E0E0EFFFFFFFFFF"
$"FFFFFFFFFFFFFF00002121212121219225252525000E0E0E0E0EFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFF00002121212121252525000E0E0E0E0EFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFFFF00002121212525000E0E0E0E0EFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFFFFFFFF00002125000E0E0E0E0EFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000E0E0E0E0EFFFFFFFFFFFFFFFFFFFF"
};
resource(1, "idea") #'ICON' array {
$"FFFFFFFFFFFFFFFFFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFF0000FAFAFAFAFAFAFA0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF00FBFAFCFCFCFCFBFCFCFAFA00FFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFF00FAFCFCFDFDFDFDFDFDFCFBFAFA00FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFF00FAFDFDFDFEFEFEFEFEFEFDFCFBFAFA00FFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFF00FAFDFCFE3F3F3F3F3FFEFEFDFDFCFBFAF900FFFFFFFFFFFFFFFFFFFF"
$"FFFFFF00FAFCFE3F3F3F3F3F3F3FFEFDFDFCFBFBF900FFFFFFFFFFFFFFFFFFFF"
$"FFFF00FAFCFDFE3F3F3F3F3F3F3F3FFEFDFDFDFBFAF900FFFFFFFFFFFFFFFFFF"
$"FFFF00FAFCFDFE3F3F3F3F3F3F3F3FFEFDFDFCFBFAF900FFFFFFFFFFFFFFFFFF"
$"FFFF00FAFCFDFE3F3F3F3F3FF93FFEFEFEFDFCFBFBF900FFFFFFFFFFFFFFFFFF"
$"FFFF00FAFCFDFE3F3F3F3F5D3F5D3FFEFEFDFCFBFAF900FFFFFFFFFFFFFFFFFF"
$"FFFF00FAFCFDFDFE3F3F3F5D3FF9FEFEFEFDFCFBFAF900FFFFFFFFFFFFFFFFFF"
$"FFFF00FAFCFBFDFEFE3F3F5D3FF9FEFDFDFCFCFBFAF900FFFFFFFFFFFFFFFFFF"
$"FFFF00FAFAFCFCFDFEFEFEFE5DF9FDFDFDFDFBFBF9F900FFFFFFFFFFFFFFFFFF"
$"FFFFFF00FAFBFDFDFDFEFEFDF9FDFDFCFCFBFBFAF900FFFFFFFFFFFFFFFFFFFF"
$"FFFFFF00FAFAFBFCFDFDFDFDF9FDFCFCFCFBFBF9F900FFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFF00FAFAFBFCFCFDFCF9FCFCFCFBFBF9F900FFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFF00FAFAFBFBFCFCF9FBFBFBFBF9F900FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF00F9FAFBFBFBF9FBFBFAF9F900FFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFF00F9F9FAFA5DFAF9F95D00FFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFF005DF9FD5DF95D5D00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFF005DF9FD5DF95D5D00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFF005DF9FD5DF95D5D00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFF0000F9FD5DF95D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFF001500000000000A00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFF00001B193F0A0A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFF001500000000000A00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFF00001B193F0A0A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFF001500000000000A00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFF001B193F0A0A000E0E0E0E0E0E0E0E0E0E0E0E0EFFFFFF"
$"FFFFFFFFFFFFFFFFFFFF00000000000E0E0E0E0E0E0E0E0E0E0E0E0E1BFFFFFF"
$"FFFFFFFFFFFFFFFFFFFFFF0000000E0E0E0E0E0E0E0E0E0E0E0E0E1B1BFFFFFF"
};
resource(2, "warn") #'ICON' array {
$"FFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFF00FAFAFA0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFF00FAFAFAFAFAFA0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFF00FAFAFAFAFAFAFAFAFA0000FFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF00FAFAFAFAFAFAFAFAFAFAFAFA00FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF003F3FFAFAFAFAFAFAFAFAFA3F00FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF00F9F93F3FFAFAFAFAFAFA3F5D00FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF00F9F9F9F93F3FFAFAFA3F5D5D00FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF00F9F9F9F9F9F93F3F3F5D5D5D00FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF00F9F9F9F9F9F9F9F95D5D5D5D00FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF00F9F9F9F9F9F9F9F95D5D5D5D00FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF00F9F9F9F9F9F9F9F95D5D5D5D00FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF00F9F9F9F9F9F9F9F95D5D5D5D00FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF00F9F9F9F9F9F9F9F95D5D5D5D00FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF00F9F9F9F9F9F9F9F95D5D5D5D00FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF00F9F9F9F9F9F9F9F95D5D5D5D00FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF00F9F9F9F9F9F9F9F95D5D5D5D00FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF00F9F9F9F9F9F9F9F95D5D5D5D00FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFF0000F9F9F9F9F9F95D5D5D0000FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFF00A50000F9F9F9F95D5D00FFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF00A5A5A5A50000F9F95D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF000000A5A5A5A5000000A5A50000FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF00F9F90000A5A5A5A5A5A5005D00FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF00F9F9F9F90000A5A5A5005D5D00FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF00F9F9F9F9F9F90000005D5D5D00FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF00F9F9F9F9F9F9F9F95D5D5D5D000E0EFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF00F9F9F9F9F9F9F9F95D5D5D5D000E0E0E0EFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFF00F9F9F9F9F9F9F9F95D5D5D5D000E0E0E0E0E0EFFFFFFFFFFFF"
$"FFFFFFFFFFFFFF0000F9F9F9F9F9F95D5D5D000E0E0E0E0E0EFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFF0000F9F9F9F95D5D000E0E0E0E0E0EFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFFFF0000F9F95D000E0E0E0E0E0EFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFFFFFFFF0000000E0E0E0E0E0EFFFFFFFFFFFFFFFFFFFF"
};
resource(3, "stop") #'ICON' array {
$"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFFFFFFFF000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFFFFFF002B2B2B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFFFF002B2B2B2B2B2B0000FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFF002B2B2B2B2B2B2B2B2B0000FFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFF002B2B2B2B2B2B2B2B2B2B2B2B00FFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFF007B7B2B2B2B2B2B2B2B2B2B7B00FFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFF002B7B7B2B2B2B2B2B2B7B2F00FFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFF002B2B2B7B7B2B2B2B7B2F00FFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFF002B2B2B2B2B7B7B7B2F2F00FFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFF002B2B2B2B2B2B2B2F2F2F00FFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFFFF002B2B2B2B2B2F2F2F00FFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFFFF002B2B2B2B2B2F2F2F00FFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFFFF002B2B2B2B2B2F2F00FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFFFFFF002B2B2B2F2F2F00FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFFFFFF002B2B2B2F2F2F00FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFFFFFF002B2B2B2F2F00FFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFFFFFF002B2B2F2F2F00FFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFFFFFFFF002B2F2F2F00FFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFFFFFFFF002B2F2F00FFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFFFFFFFFFF002F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFFFFFF000000002F2F0000FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFFFF002D2B2B2B2D2F2F2F00FFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFFFF002B2A2A2A2B2C2D2F00FFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFF002D2C2A3F2A2B2B2D2D2F00FFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFF002D2C2A2A2A2B2B2DEB2F00FFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFF002F2D2C2B2B2C2B2DEB2F00FFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFF002F2F2D2C2C2C2D2DEB2F00FFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFFFF002FEB2D2D2DEBEBEB00FFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFFFF002F2FEBEB2F2F2F2F00FFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFFFFFF00002F2F2F2F0000FFFFFFFFFFFFFFFFFFFFFFFF"
$"FFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF"
};
#endif // HAIKU_TARGET_PLATFORM_HAIKU