From 99a4bc325ef9e85a47d0daca2477026226865553 Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Tue, 13 Aug 2024 03:31:43 +0200 Subject: [PATCH] UI: Allow Theme Coloring for Color SVG Extraction For the times we need to obtain the bitmap of an SVG icon, send these through the new theme coloring callback if they are multi-color. This removes some code duplication by adding a new function that gets an imBuf from SVG Icon. This allows, for "About" logo, Dialog icons, and file system icons the optional ability to use a single SVG source file that works as both monochrome (themed by text color) or multicolor with internal parts themed. Pull Request: https://projects.blender.org/blender/blender/pulls/126215 --- .../icons_svg/blender_logo_large.svg | 2 +- release/datafiles/icons_svg/cancel_large.svg | 2 +- release/datafiles/icons_svg/info_large.svg | 2 +- .../datafiles/icons_svg/question_large.svg | 2 +- release/datafiles/icons_svg/warning_large.svg | 2 +- source/blender/blenfont/BLF_api.hh | 7 ++- source/blender/blenfont/intern/blf.cc | 10 ++-- source/blender/blenfont/intern/blf_font.cc | 11 +++-- .../blender/blenfont/intern/blf_internal.hh | 8 +++- .../editors/include/UI_interface_icons.hh | 2 + .../editors/interface/interface_icons.cc | 47 +++++++++++++------ source/blender/editors/space_file/filelist.cc | 10 +--- .../windowmanager/intern/wm_splash_screen.cc | 15 +----- 13 files changed, 71 insertions(+), 49 deletions(-) diff --git a/release/datafiles/icons_svg/blender_logo_large.svg b/release/datafiles/icons_svg/blender_logo_large.svg index b4034647c9e..28cbbd4fc8b 100644 --- a/release/datafiles/icons_svg/blender_logo_large.svg +++ b/release/datafiles/icons_svg/blender_logo_large.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/release/datafiles/icons_svg/cancel_large.svg b/release/datafiles/icons_svg/cancel_large.svg index 85467ff3ef8..f6114491bc4 100644 --- a/release/datafiles/icons_svg/cancel_large.svg +++ b/release/datafiles/icons_svg/cancel_large.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/release/datafiles/icons_svg/info_large.svg b/release/datafiles/icons_svg/info_large.svg index 8dd2858f563..117992bc11f 100644 --- a/release/datafiles/icons_svg/info_large.svg +++ b/release/datafiles/icons_svg/info_large.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/release/datafiles/icons_svg/question_large.svg b/release/datafiles/icons_svg/question_large.svg index 9f57bff48d9..51bfca7587b 100644 --- a/release/datafiles/icons_svg/question_large.svg +++ b/release/datafiles/icons_svg/question_large.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/release/datafiles/icons_svg/warning_large.svg b/release/datafiles/icons_svg/warning_large.svg index 27a9eee8be1..95f6250817c 100644 --- a/release/datafiles/icons_svg/warning_large.svg +++ b/release/datafiles/icons_svg/warning_large.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/source/blender/blenfont/BLF_api.hh b/source/blender/blenfont/BLF_api.hh index 95538a7e2c5..f7c14cd026e 100644 --- a/source/blender/blenfont/BLF_api.hh +++ b/source/blender/blenfont/BLF_api.hh @@ -157,7 +157,12 @@ void BLF_draw_svg_icon(uint icon_id, blender::FunctionRef edit_source_cb = nullptr); blender::Array BLF_svg_icon_bitmap( - uint icon_id, float size, int *r_width, int *r_height, bool multicolor = false); + uint icon_id, + float size, + int *r_width, + int *r_height, + bool multicolor = false, + blender::FunctionRef edit_source_cb = nullptr); typedef bool (*BLF_GlyphBoundsFn)(const char *str, size_t str_step_ofs, diff --git a/source/blender/blenfont/intern/blf.cc b/source/blender/blenfont/intern/blf.cc index 4f2cc1a1ae8..4a50edc2d51 100644 --- a/source/blender/blenfont/intern/blf.cc +++ b/source/blender/blenfont/intern/blf.cc @@ -632,13 +632,17 @@ void BLF_draw_svg_icon(uint icon_id, #endif /* WITH_HEADLESS */ } -blender::Array BLF_svg_icon_bitmap( - uint icon_id, float size, int *r_width, int *r_height, bool multicolor) +blender::Array BLF_svg_icon_bitmap(uint icon_id, + float size, + int *r_width, + int *r_height, + bool multicolor, + blender::FunctionRef edit_source_cb) { #ifndef WITH_HEADLESS FontBLF *font = global_font[0]; if (font) { - return blf_svg_icon_bitmap(font, icon_id, size, r_width, r_height, multicolor); + return blf_svg_icon_bitmap(font, icon_id, size, r_width, r_height, multicolor, edit_source_cb); } #else UNUSED_VARS(icon_id, size, r_width, r_height, multicolor); diff --git a/source/blender/blenfont/intern/blf_font.cc b/source/blender/blenfont/intern/blf_font.cc index 8a4592bdefc..03c03604672 100644 --- a/source/blender/blenfont/intern/blf_font.cc +++ b/source/blender/blenfont/intern/blf_font.cc @@ -571,12 +571,17 @@ void blf_draw_svg_icon(FontBLF *font, blf_glyph_cache_release(font); } -blender::Array blf_svg_icon_bitmap( - FontBLF *font, uint icon_id, float size, int *r_width, int *r_height, bool multicolor) +blender::Array blf_svg_icon_bitmap(FontBLF *font, + uint icon_id, + float size, + int *r_width, + int *r_height, + bool multicolor, + blender::FunctionRef edit_source_cb) { blf_font_size(font, size); GlyphCacheBLF *gc = blf_glyph_cache_acquire(font); - GlyphBLF *g = blf_glyph_ensure_icon(gc, icon_id, multicolor); + GlyphBLF *g = blf_glyph_ensure_icon(gc, icon_id, multicolor, edit_source_cb); if (!g) { blf_glyph_cache_release(font); diff --git a/source/blender/blenfont/intern/blf_internal.hh b/source/blender/blenfont/intern/blf_internal.hh index 95e5b8b8f71..b75d337b4d3 100644 --- a/source/blender/blenfont/intern/blf_internal.hh +++ b/source/blender/blenfont/intern/blf_internal.hh @@ -112,7 +112,13 @@ void blf_draw_svg_icon(FontBLF *font, blender::FunctionRef edit_source_cb = nullptr); blender::Array blf_svg_icon_bitmap( - FontBLF *font, uint icon_id, float size, int *r_width, int *r_height, bool multicolor = false); + FontBLF *font, + uint icon_id, + float size, + int *r_width, + int *r_height, + bool multicolor = false, + blender::FunctionRef edit_source_cb = nullptr); blender::Vector blf_font_string_wrap(FontBLF *font, blender::StringRef str, diff --git a/source/blender/editors/include/UI_interface_icons.hh b/source/blender/editors/include/UI_interface_icons.hh index 16f0b86994d..fffadc95cb1 100644 --- a/source/blender/editors/include/UI_interface_icons.hh +++ b/source/blender/editors/include/UI_interface_icons.hh @@ -98,6 +98,8 @@ void UI_icon_draw_ex(float x, const IconTextOverlay *text_overlay, const bool inverted = false); +ImBuf *UI_svg_icon_bitmap(uint icon_id, float size, bool multicolor = false); + void UI_icons_free(); void UI_icons_free_drawinfo(void *drawinfo); diff --git a/source/blender/editors/interface/interface_icons.cc b/source/blender/editors/interface/interface_icons.cc index 03ec4709f4c..349b99b320a 100644 --- a/source/blender/editors/interface/interface_icons.cc +++ b/source/blender/editors/interface/interface_icons.cc @@ -2005,6 +2005,38 @@ void UI_icon_draw_ex(float x, inverted); } +ImBuf *UI_svg_icon_bitmap(uint icon_id, float size, bool multicolor) +{ + if (icon_id >= ICON_BLANK_LAST_SVG_ITEM) { + return nullptr; + } + + ImBuf *ibuf = nullptr; + int width; + int height; + blender::Array bitmap; + + if (multicolor) { + bitmap = BLF_svg_icon_bitmap(icon_id, size, &width, &height, true, icon_source_edit_cb); + } + else { + bitmap = BLF_svg_icon_bitmap(icon_id, size, &width, &height, false, nullptr); + } + + if (!bitmap.is_empty()) { + ibuf = IMB_allocFromBuffer(bitmap.data(), nullptr, width, height, 4); + } + + if (ibuf) { + IMB_flipy(ibuf); + if (multicolor) { + IMB_premultiply_alpha(ibuf); + } + } + + return ibuf; +} + void UI_icon_text_overlay_init_from_count(IconTextOverlay *text_overlay, const int icon_indicator_number) { @@ -2025,8 +2057,6 @@ ImBuf *UI_icon_alert_imbuf_get(eAlertIcon icon, float size) return nullptr; #else - constexpr bool show_color = false; - int icon_id = ICON_NONE; switch (icon) { case ALERT_ICON_WARNING: @@ -2049,17 +2079,6 @@ ImBuf *UI_icon_alert_imbuf_get(eAlertIcon icon, float size) return nullptr; } - int width; - int height; - blender::Array bitmap = BLF_svg_icon_bitmap(icon_id, size, &width, &height, show_color); - if (bitmap.is_empty()) { - return nullptr; - } - ImBuf *ibuf = IMB_allocFromBuffer(bitmap.data(), nullptr, width, height, 4); - IMB_flipy(ibuf); - if (show_color) { - IMB_premultiply_alpha(ibuf); - } - return ibuf; + return UI_svg_icon_bitmap(icon_id, size, false); #endif } diff --git a/source/blender/editors/space_file/filelist.cc b/source/blender/editors/space_file/filelist.cc index 87535f10c65..2d830845006 100644 --- a/source/blender/editors/space_file/filelist.cc +++ b/source/blender/editors/space_file/filelist.cc @@ -1134,15 +1134,7 @@ void filelist_setlibrary(FileList *filelist, const AssetLibraryReference *asset_ static ImBuf *fileimage_from_icon(int icon_id) { - int width; - int height; - blender::Array bitmap = BLF_svg_icon_bitmap(icon_id, 256.0f, &width, &height); - if (bitmap.is_empty()) { - return nullptr; - } - ImBuf *ibuf = IMB_allocFromBuffer(bitmap.data(), nullptr, width, height, 4); - IMB_flipy(ibuf); - return ibuf; + return UI_svg_icon_bitmap(icon_id, 256.0f, false); } void filelist_init_icons() diff --git a/source/blender/windowmanager/intern/wm_splash_screen.cc b/source/blender/windowmanager/intern/wm_splash_screen.cc index 0950e0af76a..8ef59e5dc63 100644 --- a/source/blender/windowmanager/intern/wm_splash_screen.cc +++ b/source/blender/windowmanager/intern/wm_splash_screen.cc @@ -314,21 +314,10 @@ static uiBlock *wm_block_about_create(bContext *C, ARegion *region, void * /*arg #ifndef WITH_HEADLESS float size = 0.2f * dialog_width; - ImBuf *ibuf = nullptr; - int width; - int height; - blender::Array bitmap = BLF_svg_icon_bitmap( - ICON_BLENDER_LOGO_LARGE, size, &width, &height, show_color); - if (!bitmap.is_empty()) { - ibuf = IMB_allocFromBuffer(bitmap.data(), nullptr, width, height, 4); - } + + ImBuf *ibuf = UI_svg_icon_bitmap(ICON_BLENDER_LOGO_LARGE, size, show_color); if (ibuf) { - IMB_flipy(ibuf); - if (show_color) { - IMB_premultiply_alpha(ibuf); - } - bTheme *btheme = UI_GetTheme(); const uchar *color = btheme->tui.wcol_menu_back.text_sel;