diff options
Diffstat (limited to 'platform/windows/native_menu_windows.cpp')
-rw-r--r-- | platform/windows/native_menu_windows.cpp | 45 |
1 files changed, 29 insertions, 16 deletions
diff --git a/platform/windows/native_menu_windows.cpp b/platform/windows/native_menu_windows.cpp index 40a08f87df..d9dc28e9d9 100644 --- a/platform/windows/native_menu_windows.cpp +++ b/platform/windows/native_menu_windows.cpp @@ -35,6 +35,8 @@ #include "scene/resources/image_texture.h" HBITMAP NativeMenuWindows::_make_bitmap(const Ref<Image> &p_img) const { + p_img->convert(Image::FORMAT_RGBA8); + Vector2i texture_size = p_img->get_size(); UINT image_size = texture_size.width * texture_size.height; @@ -231,6 +233,11 @@ float NativeMenuWindows::get_minimum_width(const RID &p_rid) const { return 0.f; } +bool NativeMenuWindows::is_opened(const RID &p_rid) const { + // Not supported. + return false; +} + int NativeMenuWindows::add_submenu_item(const RID &p_rid, const String &p_label, const RID &p_submenu_rid, const Variant &p_tag, int p_index) { MenuData *md = menus.get_or_null(p_rid); MenuData *md_sub = menus.get_or_null(p_submenu_rid); @@ -349,12 +356,14 @@ int NativeMenuWindows::add_icon_item(const RID &p_rid, const Ref<Texture2D> &p_i item_data->checkable_type = CHECKABLE_TYPE_NONE; item_data->max_states = 0; item_data->state = 0; - item_data->img = p_icon->get_image(); - item_data->img = item_data->img->duplicate(); - if (item_data->img->is_compressed()) { - item_data->img->decompress(); + if (p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0 && p_icon->get_image().is_valid()) { + item_data->img = p_icon->get_image(); + item_data->img = item_data->img->duplicate(); + if (item_data->img->is_compressed()) { + item_data->img->decompress(); + } + item_data->bmp = _make_bitmap(item_data->img); } - item_data->bmp = _make_bitmap(item_data->img); Char16String label = p_label.utf16(); MENUITEMINFOW item; @@ -389,12 +398,14 @@ int NativeMenuWindows::add_icon_check_item(const RID &p_rid, const Ref<Texture2D item_data->checkable_type = CHECKABLE_TYPE_CHECK_BOX; item_data->max_states = 0; item_data->state = 0; - item_data->img = p_icon->get_image(); - item_data->img = item_data->img->duplicate(); - if (item_data->img->is_compressed()) { - item_data->img->decompress(); + if (p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0 && p_icon->get_image().is_valid()) { + item_data->img = p_icon->get_image(); + item_data->img = item_data->img->duplicate(); + if (item_data->img->is_compressed()) { + item_data->img->decompress(); + } + item_data->bmp = _make_bitmap(item_data->img); } - item_data->bmp = _make_bitmap(item_data->img); Char16String label = p_label.utf16(); MENUITEMINFOW item; @@ -462,12 +473,14 @@ int NativeMenuWindows::add_icon_radio_check_item(const RID &p_rid, const Ref<Tex item_data->checkable_type = CHECKABLE_TYPE_RADIO_BUTTON; item_data->max_states = 0; item_data->state = 0; - item_data->img = p_icon->get_image(); - item_data->img = item_data->img->duplicate(); - if (item_data->img->is_compressed()) { - item_data->img->decompress(); + if (p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0 && p_icon->get_image().is_valid()) { + item_data->img = p_icon->get_image(); + item_data->img = item_data->img->duplicate(); + if (item_data->img->is_compressed()) { + item_data->img->decompress(); + } + item_data->bmp = _make_bitmap(item_data->img); } - item_data->bmp = _make_bitmap(item_data->img); Char16String label = p_label.utf16(); MENUITEMINFOW item; @@ -1082,7 +1095,7 @@ void NativeMenuWindows::set_item_icon(const RID &p_rid, int p_idx, const Ref<Tex if (item_data->bmp) { DeleteObject(item_data->bmp); } - if (p_icon.is_valid()) { + if (p_icon.is_valid() && p_icon->get_width() > 0 && p_icon->get_height() > 0 && p_icon->get_image().is_valid()) { item_data->img = p_icon->get_image(); item_data->img = item_data->img->duplicate(); if (item_data->img->is_compressed()) { |