Merge pull request #74551 from YuriSizov/theme-abyss-looks-back-at-you

Generate empty textures for theme icons if the SVG module is disabled
This commit is contained in:
Rémi Verschelde 2023-03-08 08:57:47 +01:00
commit bf6b6b18f3
No known key found for this signature in database
GPG Key ID: C3336907360768E1
2 changed files with 14 additions and 6 deletions

View File

@ -231,11 +231,11 @@ static Ref<StyleBoxLine> make_line_stylebox(Color p_color, int p_thickness = 1,
return style; return style;
} }
#ifdef MODULE_SVG_ENABLED
// See also `generate_icon()` in `scene/resources/default_theme.cpp`. // See also `generate_icon()` in `scene/resources/default_theme.cpp`.
static Ref<ImageTexture> editor_generate_icon(int p_index, float p_scale, float p_saturation, const HashMap<Color, Color> &p_convert_colors = HashMap<Color, Color>()) { static Ref<ImageTexture> editor_generate_icon(int p_index, float p_scale, float p_saturation, const HashMap<Color, Color> &p_convert_colors = HashMap<Color, Color>()) {
Ref<Image> img = memnew(Image); Ref<Image> img = memnew(Image);
#ifdef MODULE_SVG_ENABLED
// Upsample icon generation only if the editor scale isn't an integer multiplier. // Upsample icon generation only if the editor scale isn't an integer multiplier.
// Generating upsampled icons is slower, and the benefit is hardly visible // Generating upsampled icons is slower, and the benefit is hardly visible
// with integer editor scales. // with integer editor scales.
@ -246,13 +246,16 @@ static Ref<ImageTexture> editor_generate_icon(int p_index, float p_scale, float
if (p_saturation != 1.0) { if (p_saturation != 1.0) {
img->adjust_bcs(1.0, 1.0, p_saturation); img->adjust_bcs(1.0, 1.0, p_saturation);
} }
#else
// If the SVG module is disabled, we can't really display the UI well, but at least we won't crash.
// 16 pixels is used as it's the most common base size for Godot icons.
img = Image::create_empty(16 * p_scale, 16 * p_scale, false, Image::FORMAT_RGBA8);
#endif
return ImageTexture::create_from_image(img); return ImageTexture::create_from_image(img);
} }
#endif
void editor_register_and_generate_icons(Ref<Theme> p_theme, bool p_dark_theme, float p_icon_saturation, int p_thumb_size, bool p_only_thumbs = false) { void editor_register_and_generate_icons(Ref<Theme> p_theme, bool p_dark_theme, float p_icon_saturation, int p_thumb_size, bool p_only_thumbs = false) {
#ifdef MODULE_SVG_ENABLED
// Before we register the icons, we adjust their colors and saturation. // Before we register the icons, we adjust their colors and saturation.
// Most icons follow the standard rules for color conversion to follow the editor // Most icons follow the standard rules for color conversion to follow the editor
// theme's polarity (dark/light). We also adjust the saturation for most icons, // theme's polarity (dark/light). We also adjust the saturation for most icons,
@ -379,9 +382,6 @@ void editor_register_and_generate_icons(Ref<Theme> p_theme, bool p_dark_theme, f
p_theme->set_icon(editor_icons_names[index], SNAME("EditorIcons"), icon); p_theme->set_icon(editor_icons_names[index], SNAME("EditorIcons"), icon);
} }
} }
#else
WARN_PRINT("SVG support disabled, editor icons won't be rendered.");
#endif
} }
Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
@ -618,6 +618,10 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
regenerate_thumb_icons = !Math::is_equal_approx(prev_thumb_size, thumb_size); regenerate_thumb_icons = !Math::is_equal_approx(prev_thumb_size, thumb_size);
} }
#ifndef MODULE_SVG_ENABLED
WARN_PRINT("SVG support disabled, editor icons won't be rendered.");
#endif
if (keep_old_icons) { if (keep_old_icons) {
for (int i = 0; i < editor_icons_count; i++) { for (int i = 0; i < editor_icons_count; i++) {
theme->set_icon(editor_icons_names[i], SNAME("EditorIcons"), p_theme->get_icon(editor_icons_names[i], SNAME("EditorIcons"))); theme->set_icon(editor_icons_names[i], SNAME("EditorIcons"), p_theme->get_icon(editor_icons_names[i], SNAME("EditorIcons")));

View File

@ -86,6 +86,10 @@ static Ref<ImageTexture> generate_icon(int p_index) {
ImageLoaderSVG img_loader; ImageLoaderSVG img_loader;
Error err = img_loader.create_image_from_string(img, default_theme_icons_sources[p_index], scale, upsample, HashMap<Color, Color>()); Error err = img_loader.create_image_from_string(img, default_theme_icons_sources[p_index], scale, upsample, HashMap<Color, Color>());
ERR_FAIL_COND_V_MSG(err != OK, Ref<ImageTexture>(), "Failed generating icon, unsupported or invalid SVG data in default theme."); ERR_FAIL_COND_V_MSG(err != OK, Ref<ImageTexture>(), "Failed generating icon, unsupported or invalid SVG data in default theme.");
#else
// If the SVG module is disabled, we can't really display the UI well, but at least we won't crash.
// 16 pixels is used as it's the most common base size for Godot icons.
img = Image::create_empty(16 * scale, 16 * scale, false, Image::FORMAT_RGBA8);
#endif #endif
return ImageTexture::create_from_image(img); return ImageTexture::create_from_image(img);