Skip to content

Commit a139cd6

Browse files
committed
Merge pull request godotengine#92826 from bruvzg/nat_icon_checks
Improve native menu and status indicator icons conversion and checks.
2 parents f9c5cdf + 28ec224 commit a139cd6

File tree

4 files changed

+44
-88
lines changed

4 files changed

+44
-88
lines changed

platform/macos/display_server_macos.mm

Lines changed: 8 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -3166,42 +3166,13 @@
31663166

31673167
DisplayServer::IndicatorID DisplayServerMacOS::create_status_indicator(const Ref<Texture2D> &p_icon, const String &p_tooltip, const Callable &p_callback) {
31683168
NSImage *nsimg = nullptr;
3169-
if (p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0) {
3169+
if (p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0 && p_icon->get_image().is_valid()) {
31703170
Ref<Image> img = p_icon->get_image();
31713171
img = img->duplicate();
3172-
img->convert(Image::FORMAT_RGBA8);
3173-
3174-
NSBitmapImageRep *imgrep = [[NSBitmapImageRep alloc]
3175-
initWithBitmapDataPlanes:nullptr
3176-
pixelsWide:img->get_width()
3177-
pixelsHigh:img->get_height()
3178-
bitsPerSample:8
3179-
samplesPerPixel:4
3180-
hasAlpha:YES
3181-
isPlanar:NO
3182-
colorSpaceName:NSDeviceRGBColorSpace
3183-
bytesPerRow:img->get_width() * 4
3184-
bitsPerPixel:32];
3185-
if (imgrep) {
3186-
uint8_t *pixels = [imgrep bitmapData];
3187-
3188-
int len = img->get_width() * img->get_height();
3189-
const uint8_t *r = img->get_data().ptr();
3190-
3191-
/* Premultiply the alpha channel */
3192-
for (int i = 0; i < len; i++) {
3193-
uint8_t alpha = r[i * 4 + 3];
3194-
pixels[i * 4 + 0] = (uint8_t)(((uint16_t)r[i * 4 + 0] * alpha) / 255);
3195-
pixels[i * 4 + 1] = (uint8_t)(((uint16_t)r[i * 4 + 1] * alpha) / 255);
3196-
pixels[i * 4 + 2] = (uint8_t)(((uint16_t)r[i * 4 + 2] * alpha) / 255);
3197-
pixels[i * 4 + 3] = alpha;
3198-
}
3199-
3200-
nsimg = [[NSImage alloc] initWithSize:NSMakeSize(img->get_width(), img->get_height())];
3201-
if (nsimg) {
3202-
[nsimg addRepresentation:imgrep];
3203-
}
3172+
if (img->is_compressed()) {
3173+
img->decompress();
32043174
}
3175+
nsimg = _convert_to_nsimg(img);
32053176
}
32063177

32073178
IndicatorData idat;
@@ -3229,42 +3200,13 @@
32293200
ERR_FAIL_COND(!indicators.has(p_id));
32303201

32313202
NSImage *nsimg = nullptr;
3232-
if (p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0) {
3203+
if (p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0 && p_icon->get_image().is_valid()) {
32333204
Ref<Image> img = p_icon->get_image();
32343205
img = img->duplicate();
3235-
img->convert(Image::FORMAT_RGBA8);
3236-
3237-
NSBitmapImageRep *imgrep = [[NSBitmapImageRep alloc]
3238-
initWithBitmapDataPlanes:nullptr
3239-
pixelsWide:img->get_width()
3240-
pixelsHigh:img->get_height()
3241-
bitsPerSample:8
3242-
samplesPerPixel:4
3243-
hasAlpha:YES
3244-
isPlanar:NO
3245-
colorSpaceName:NSDeviceRGBColorSpace
3246-
bytesPerRow:img->get_width() * 4
3247-
bitsPerPixel:32];
3248-
if (imgrep) {
3249-
uint8_t *pixels = [imgrep bitmapData];
3250-
3251-
int len = img->get_width() * img->get_height();
3252-
const uint8_t *r = img->get_data().ptr();
3253-
3254-
/* Premultiply the alpha channel */
3255-
for (int i = 0; i < len; i++) {
3256-
uint8_t alpha = r[i * 4 + 3];
3257-
pixels[i * 4 + 0] = (uint8_t)(((uint16_t)r[i * 4 + 0] * alpha) / 255);
3258-
pixels[i * 4 + 1] = (uint8_t)(((uint16_t)r[i * 4 + 1] * alpha) / 255);
3259-
pixels[i * 4 + 2] = (uint8_t)(((uint16_t)r[i * 4 + 2] * alpha) / 255);
3260-
pixels[i * 4 + 3] = alpha;
3261-
}
3262-
3263-
nsimg = [[NSImage alloc] initWithSize:NSMakeSize(img->get_width(), img->get_height())];
3264-
if (nsimg) {
3265-
[nsimg addRepresentation:imgrep];
3266-
}
3206+
if (img->is_compressed()) {
3207+
img->decompress();
32673208
}
3209+
nsimg = _convert_to_nsimg(img);
32683210
}
32693211

32703212
NSStatusItem *item = indicators[p_id].item;

platform/macos/native_menu_macos.mm

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,7 @@
461461
obj->max_states = 0;
462462
obj->state = 0;
463463
DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton();
464-
if (ds && p_icon.is_valid()) {
464+
if (ds && p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0 && p_icon->get_image().is_valid()) {
465465
obj->img = p_icon->get_image();
466466
obj->img = obj->img->duplicate();
467467
if (obj->img->is_compressed()) {
@@ -492,7 +492,7 @@
492492
obj->max_states = 0;
493493
obj->state = 0;
494494
DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton();
495-
if (ds && p_icon.is_valid()) {
495+
if (ds && p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0 && p_icon->get_image().is_valid()) {
496496
obj->img = p_icon->get_image();
497497
obj->img = obj->img->duplicate();
498498
if (obj->img->is_compressed()) {
@@ -543,7 +543,7 @@
543543
obj->max_states = 0;
544544
obj->state = 0;
545545
DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton();
546-
if (ds && p_icon.is_valid()) {
546+
if (ds && p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0 && p_icon->get_image().is_valid()) {
547547
obj->img = p_icon->get_image();
548548
obj->img = obj->img->duplicate();
549549
if (obj->img->is_compressed()) {
@@ -1237,7 +1237,7 @@
12371237
GodotMenuItem *obj = [menu_item representedObject];
12381238
ERR_FAIL_NULL(obj);
12391239
DisplayServerMacOS *ds = (DisplayServerMacOS *)DisplayServer::get_singleton();
1240-
if (ds && p_icon.is_valid()) {
1240+
if (ds && p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0 && p_icon->get_image().is_valid()) {
12411241
obj->img = p_icon->get_image();
12421242
obj->img = obj->img->duplicate();
12431243
if (obj->img->is_compressed()) {

platform/windows/display_server_windows.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3166,9 +3166,12 @@ void DisplayServerWindows::set_icon(const Ref<Image> &p_icon) {
31663166

31673167
DisplayServer::IndicatorID DisplayServerWindows::create_status_indicator(const Ref<Texture2D> &p_icon, const String &p_tooltip, const Callable &p_callback) {
31683168
HICON hicon = nullptr;
3169-
if (p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0) {
3169+
if (p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0 && p_icon->get_image().is_valid()) {
31703170
Ref<Image> img = p_icon->get_image();
31713171
img = img->duplicate();
3172+
if (img->is_compressed()) {
3173+
img->decompress();
3174+
}
31723175
img->convert(Image::FORMAT_RGBA8);
31733176

31743177
int w = img->get_width();
@@ -3236,9 +3239,12 @@ void DisplayServerWindows::status_indicator_set_icon(IndicatorID p_id, const Ref
32363239
ERR_FAIL_COND(!indicators.has(p_id));
32373240

32383241
HICON hicon = nullptr;
3239-
if (p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0) {
3242+
if (p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0 && p_icon->get_image().is_valid()) {
32403243
Ref<Image> img = p_icon->get_image();
32413244
img = img->duplicate();
3245+
if (img->is_compressed()) {
3246+
img->decompress();
3247+
}
32423248
img->convert(Image::FORMAT_RGBA8);
32433249

32443250
int w = img->get_width();

platform/windows/native_menu_windows.cpp

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
#include "scene/resources/image_texture.h"
3636

3737
HBITMAP NativeMenuWindows::_make_bitmap(const Ref<Image> &p_img) const {
38+
p_img->convert(Image::FORMAT_RGBA8);
39+
3840
Vector2i texture_size = p_img->get_size();
3941
UINT image_size = texture_size.width * texture_size.height;
4042

@@ -354,12 +356,14 @@ int NativeMenuWindows::add_icon_item(const RID &p_rid, const Ref<Texture2D> &p_i
354356
item_data->checkable_type = CHECKABLE_TYPE_NONE;
355357
item_data->max_states = 0;
356358
item_data->state = 0;
357-
item_data->img = p_icon->get_image();
358-
item_data->img = item_data->img->duplicate();
359-
if (item_data->img->is_compressed()) {
360-
item_data->img->decompress();
359+
if (p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0 && p_icon->get_image().is_valid()) {
360+
item_data->img = p_icon->get_image();
361+
item_data->img = item_data->img->duplicate();
362+
if (item_data->img->is_compressed()) {
363+
item_data->img->decompress();
364+
}
365+
item_data->bmp = _make_bitmap(item_data->img);
361366
}
362-
item_data->bmp = _make_bitmap(item_data->img);
363367

364368
Char16String label = p_label.utf16();
365369
MENUITEMINFOW item;
@@ -394,12 +398,14 @@ int NativeMenuWindows::add_icon_check_item(const RID &p_rid, const Ref<Texture2D
394398
item_data->checkable_type = CHECKABLE_TYPE_CHECK_BOX;
395399
item_data->max_states = 0;
396400
item_data->state = 0;
397-
item_data->img = p_icon->get_image();
398-
item_data->img = item_data->img->duplicate();
399-
if (item_data->img->is_compressed()) {
400-
item_data->img->decompress();
401+
if (p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0 && p_icon->get_image().is_valid()) {
402+
item_data->img = p_icon->get_image();
403+
item_data->img = item_data->img->duplicate();
404+
if (item_data->img->is_compressed()) {
405+
item_data->img->decompress();
406+
}
407+
item_data->bmp = _make_bitmap(item_data->img);
401408
}
402-
item_data->bmp = _make_bitmap(item_data->img);
403409

404410
Char16String label = p_label.utf16();
405411
MENUITEMINFOW item;
@@ -467,12 +473,14 @@ int NativeMenuWindows::add_icon_radio_check_item(const RID &p_rid, const Ref<Tex
467473
item_data->checkable_type = CHECKABLE_TYPE_RADIO_BUTTON;
468474
item_data->max_states = 0;
469475
item_data->state = 0;
470-
item_data->img = p_icon->get_image();
471-
item_data->img = item_data->img->duplicate();
472-
if (item_data->img->is_compressed()) {
473-
item_data->img->decompress();
476+
if (p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0 && p_icon->get_image().is_valid()) {
477+
item_data->img = p_icon->get_image();
478+
item_data->img = item_data->img->duplicate();
479+
if (item_data->img->is_compressed()) {
480+
item_data->img->decompress();
481+
}
482+
item_data->bmp = _make_bitmap(item_data->img);
474483
}
475-
item_data->bmp = _make_bitmap(item_data->img);
476484

477485
Char16String label = p_label.utf16();
478486
MENUITEMINFOW item;
@@ -1087,7 +1095,7 @@ void NativeMenuWindows::set_item_icon(const RID &p_rid, int p_idx, const Ref<Tex
10871095
if (item_data->bmp) {
10881096
DeleteObject(item_data->bmp);
10891097
}
1090-
if (p_icon.is_valid()) {
1098+
if (p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0 && p_icon->get_image().is_valid()) {
10911099
item_data->img = p_icon->get_image();
10921100
item_data->img = item_data->img->duplicate();
10931101
if (item_data->img->is_compressed()) {

0 commit comments

Comments
 (0)