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 <[email protected]>
Reviewed-by: waddlesplash <[email protected]>
Reviewed-by: Adrien Destugues <[email protected]>
This commit is contained in:
PulkoMandy
2023-05-24 10:58:48 +00:00
committed by Adrien Destugues
parent 13f2f8de06
commit 4dbd474753
11 changed files with 430 additions and 579 deletions
+30 -4
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. * Distributed under the terms of the MIT License.
* *
* Authors: * Authors:
* Adrien Destugues, pulkomandy@pulkomandy.ath.cx * Adrien Destugues, pulkomandy@pulkomandy.tk
* *
* Corresponds to: * Corresponds to:
* headers/os/interface/IconUtils.h rev 42600 * headers/os/interface/IconUtils.h hrev57019
* src/kits/interface/IconUtils.cpp rev 42600 * 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, \fn static status_t BIconUtils::ConvertFromCMAP8(BBitmap* source,
BBitmap* result) BBitmap* result)
+3 -1
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. * Distributed under the terms of the MIT License.
*/ */
#ifndef _ICON_UTILS_H #ifndef _ICON_UTILS_H
@@ -36,6 +36,8 @@ public:
const char* largeIconAttrName, const char* largeIconAttrName,
icon_size size, BBitmap* icon); icon_size size, BBitmap* icon);
static status_t GetSystemIcon(const char* iconName, BBitmap* result);
static status_t ConvertFromCMAP8(BBitmap* source, static status_t ConvertFromCMAP8(BBitmap* source,
BBitmap* result); BBitmap* result);
static status_t ConvertToCMAP8(BBitmap* source, static status_t ConvertToCMAP8(BBitmap* source,
@@ -42,14 +42,7 @@ AlertWithCheckbox::AlertWithCheckbox(const char* title, const char* messageText,
fSemaphore(create_sem(0, "AlertWithCheckbox")), fSemaphore(create_sem(0, "AlertWithCheckbox")),
fAction(0) fAction(0)
{ {
BResources resources; BIconUtils::GetSystemIcon("dialog-information", &fBitmap);
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);
BStripeView *stripeView = new BStripeView(fBitmap); BStripeView *stripeView = new BStripeView(fBitmap);
BTextView *message = new BTextView("_tv_"); BTextView *message = new BTextView("_tv_");
+245 -245
View File
File diff suppressed because it is too large Load Diff
+67
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"
};
+1 -1
View File
@@ -28,7 +28,7 @@ for architectureObject in [ MultiArchSubDirSetup ] {
local libbe = [ MultiArchDefaultGristFiles libbe.so ] ; local libbe = [ MultiArchDefaultGristFiles libbe.so ] ;
AddResources $(libbe) : AddResources $(libbe) :
libbe_version.rdef CountryFlags.rdef LanguageFlags.rdef libbe_version.rdef CountryFlags.rdef Icons.rdef LanguageFlags.rdef
; ;
SetVersionScript $(libbe) : libbe_versions ; SetVersionScript $(libbe) : libbe_versions ;
+5 -53
View File
@@ -530,45 +530,21 @@ BAlert::_CreateTypeIcon()
// The icons are in the app_server resources // The icons are in the app_server resources
BBitmap* icon = NULL; 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? // Which icon are we trying to load?
const char* iconName; const char* iconName;
switch (fType) { switch (fType) {
case B_INFO_ALERT: case B_INFO_ALERT:
iconName = "info"; iconName = "dialog-information";
break; break;
case B_IDEA_ALERT: case B_IDEA_ALERT:
iconName = "idea"; iconName = "dialog-idea";
break; break;
case B_WARNING_ALERT: case B_WARNING_ALERT:
iconName = "warn"; iconName = "dialog-warning";
break; break;
case B_STOP_ALERT: case B_STOP_ALERT:
iconName = "stop"; iconName = "dialog-error";
break; break;
default: default:
@@ -587,31 +563,7 @@ BAlert::_CreateTypeIcon()
} }
// Load the raw icon data // Load the raw icon data
size_t size = 0; BIconUtils::GetSystemIcon(iconName, icon);
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);
}
return icon; return icon;
} }
+5 -4
View File
@@ -370,10 +370,11 @@ BLocaleRoster::GetFlagIconForCountry(BBitmap* flagIcon, const char* countryCode)
if (codeLength < 2) if (codeLength < 2)
return B_BAD_VALUE; return B_BAD_VALUE;
char normalizedCode[3]; char normalizedCode[8];
normalizedCode[0] = toupper(countryCode[codeLength - 2]); strcpy(normalizedCode, "flag-");
normalizedCode[1] = toupper(countryCode[codeLength - 1]); normalizedCode[5] = tolower(countryCode[codeLength - 2]);
normalizedCode[2] = '\0'; normalizedCode[6] = tolower(countryCode[codeLength - 1]);
normalizedCode[7] = '\0';
size_t size; size_t size;
const void* buffer = resources->LoadResource(B_VECTOR_ICON_TYPE, const void* buffer = resources->LoadResource(B_VECTOR_ICON_TYPE,
+67 -1
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. * Distributed under the terms of the MIT License.
* *
* Authors: * Authors:
@@ -18,8 +18,11 @@
#include <string.h> #include <string.h>
#include <Bitmap.h> #include <Bitmap.h>
#include <FindDirectory.h>
#include <Node.h> #include <Node.h>
#include <NodeInfo.h> #include <NodeInfo.h>
#include <Path.h>
#include <Resources.h>
#include <String.h> #include <String.h>
#include <TypeConstants.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() // #pragma mark - ConvertFromCMAP8() and ConvertToCMAP8()
+6 -50
View File
@@ -151,42 +151,6 @@ ConflictView::SetWarnIcon(bool show)
void void
ConflictView::_FillIcons() 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) { if (fStopIcon == NULL) {
// Allocate the fStopIcon bitmap // Allocate the fStopIcon bitmap
fStopIcon = new (std::nothrow) BBitmap(Bounds(), 0, fStopIcon = new (std::nothrow) BBitmap(Bounds(), 0,
@@ -198,15 +162,11 @@ ConflictView::_FillIcons()
return; return;
} }
// load stop icon bitmap from app_server // load dialog-error icon bitmap
const uint8* stopVector if (BIconUtils::GetSystemIcon("dialog-error", fStopIcon) != B_OK) {
= (const uint8*)resources.LoadResource(B_VECTOR_ICON_TYPE, "stop",
&size);
if (stopVector == NULL
|| BIconUtils::GetVectorIcon(stopVector, size, fStopIcon)
!= B_OK) {
delete fStopIcon; delete fStopIcon;
fStopIcon = NULL; fStopIcon = NULL;
return;
} }
} }
@@ -221,15 +181,11 @@ ConflictView::_FillIcons()
return; return;
} }
// load warn icon bitmap from app_server // load dialog-warning icon bitmap
const uint8* warnVector if (BIconUtils::GetSystemIcon("dialog-warning", fWarnIcon) != B_OK) {
= (const uint8*)resources.LoadResource(B_VECTOR_ICON_TYPE, "warn",
&size);
if (warnVector == NULL
|| BIconUtils::GetVectorIcon(warnVector, size, fWarnIcon)
!= B_OK) {
delete fWarnIcon; delete fWarnIcon;
fWarnIcon = NULL; fWarnIcon = NULL;
return;
} }
} }
} }
-212
View File
@@ -18,8 +18,6 @@ resource app_version {
long_info = "app_server ©2004-2009 Haiku Inc." long_info = "app_server ©2004-2009 Haiku Inc."
}; };
#ifdef HAIKU_TARGET_PLATFORM_HAIKU
resource vector_icon array { resource vector_icon array {
$"6E6369662104004C03FFCB9A01CD9866B201CD9966B201CD9966B201CD9966B2" $"6E6369662104004C03FFCB9A01CD9866B201CD9966B201CD9966B201CD9966B2"
$"01CD9966B201CD9966B201CD9966B201CD9866B204FFF204FFF204FFF204FFF2" $"01CD9966B201CD9966B201CD9966B201CD9866B204FFF204FFF204FFF204FFF2"
@@ -132,213 +130,3 @@ resource vector_icon array {
$"4011" $"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