diff options
author | bruvzg <7645683+bruvzg@users.noreply.github.com> | 2023-06-19 16:18:39 +0300 |
---|---|---|
committer | bruvzg <7645683+bruvzg@users.noreply.github.com> | 2023-07-03 13:48:28 +0300 |
commit | 9c5a0c6c102556c229825e053153d02fb7141668 (patch) | |
tree | 026374922e004f48fae8057f982f2d3c26c5018a /platform/web | |
parent | 46424488edc341b65467ee7fd3ac423e4d49ad34 (diff) | |
download | redot-engine-9c5a0c6c102556c229825e053153d02fb7141668.tar.gz |
Add error checks and harmonize behavior of the set_icon method.
Diffstat (limited to 'platform/web')
-rw-r--r-- | platform/web/display_server_web.cpp | 51 | ||||
-rw-r--r-- | platform/web/js/libs/library_godot_display.js | 25 |
2 files changed, 44 insertions, 32 deletions
diff --git a/platform/web/display_server_web.cpp b/platform/web/display_server_web.cpp index 951ce110e0..941f2c7ef3 100644 --- a/platform/web/display_server_web.cpp +++ b/platform/web/display_server_web.cpp @@ -731,35 +731,40 @@ void DisplayServerWeb::send_window_event_callback(int p_notification) { } void DisplayServerWeb::set_icon(const Ref<Image> &p_icon) { - ERR_FAIL_COND(p_icon.is_null()); - Ref<Image> icon = p_icon; - if (icon->is_compressed()) { - icon = icon->duplicate(); - ERR_FAIL_COND(icon->decompress() != OK); - } - if (icon->get_format() != Image::FORMAT_RGBA8) { - if (icon == p_icon) { + if (p_icon.is_valid()) { + ERR_FAIL_COND(p_icon->get_width() <= 0 || p_icon->get_height() <= 0); + + Ref<Image> icon = p_icon; + if (icon->is_compressed()) { icon = icon->duplicate(); + ERR_FAIL_COND(icon->decompress() != OK); + } + if (icon->get_format() != Image::FORMAT_RGBA8) { + if (icon == p_icon) { + icon = icon->duplicate(); + } + icon->convert(Image::FORMAT_RGBA8); } - icon->convert(Image::FORMAT_RGBA8); - } - png_image png_meta; - memset(&png_meta, 0, sizeof png_meta); - png_meta.version = PNG_IMAGE_VERSION; - png_meta.width = icon->get_width(); - png_meta.height = icon->get_height(); - png_meta.format = PNG_FORMAT_RGBA; + png_image png_meta; + memset(&png_meta, 0, sizeof png_meta); + png_meta.version = PNG_IMAGE_VERSION; + png_meta.width = icon->get_width(); + png_meta.height = icon->get_height(); + png_meta.format = PNG_FORMAT_RGBA; - PackedByteArray png; - size_t len; - PackedByteArray data = icon->get_data(); - ERR_FAIL_COND(!png_image_write_get_memory_size(png_meta, len, 0, data.ptr(), 0, nullptr)); + PackedByteArray png; + size_t len; + PackedByteArray data = icon->get_data(); + ERR_FAIL_COND(!png_image_write_get_memory_size(png_meta, len, 0, data.ptr(), 0, nullptr)); - png.resize(len); - ERR_FAIL_COND(!png_image_write_to_memory(&png_meta, png.ptrw(), &len, 0, data.ptr(), 0, nullptr)); + png.resize(len); + ERR_FAIL_COND(!png_image_write_to_memory(&png_meta, png.ptrw(), &len, 0, data.ptr(), 0, nullptr)); - godot_js_display_window_icon_set(png.ptr(), len); + godot_js_display_window_icon_set(png.ptr(), len); + } else { + godot_js_display_window_icon_set(nullptr, 0); + } } void DisplayServerWeb::_dispatch_input_event(const Ref<InputEvent> &p_event) { diff --git a/platform/web/js/libs/library_godot_display.js b/platform/web/js/libs/library_godot_display.js index 23cbc67c16..f8f38337d5 100644 --- a/platform/web/js/libs/library_godot_display.js +++ b/platform/web/js/libs/library_godot_display.js @@ -568,16 +568,23 @@ const GodotDisplay = { godot_js_display_window_icon_set__sig: 'vii', godot_js_display_window_icon_set: function (p_ptr, p_len) { let link = document.getElementById('-gd-engine-icon'); - if (link === null) { - link = document.createElement('link'); - link.rel = 'icon'; - link.id = '-gd-engine-icon'; - document.head.appendChild(link); - } const old_icon = GodotDisplay.window_icon; - const png = new Blob([GodotRuntime.heapSlice(HEAPU8, p_ptr, p_len)], { type: 'image/png' }); - GodotDisplay.window_icon = URL.createObjectURL(png); - link.href = GodotDisplay.window_icon; + if (p_ptr) { + if (link === null) { + link = document.createElement('link'); + link.rel = 'icon'; + link.id = '-gd-engine-icon'; + document.head.appendChild(link); + } + const png = new Blob([GodotRuntime.heapSlice(HEAPU8, p_ptr, p_len)], { type: 'image/png' }); + GodotDisplay.window_icon = URL.createObjectURL(png); + link.href = GodotDisplay.window_icon; + } else { + if (link) { + link.remove(); + } + GodotDisplay.window_icon = null; + } if (old_icon) { URL.revokeObjectURL(old_icon); } |