diff options
author | Hans Goudey <h.goudey@me.com> | 2022-04-03 00:17:48 +0300 |
---|---|---|
committer | Hans Goudey <h.goudey@me.com> | 2022-04-03 00:17:48 +0300 |
commit | 4537eb0c3b1678a623510570fb7528bf53174b2f (patch) | |
tree | 6d91005449c641b5116cbbf96780159e540b13a1 /source/blender/editors/interface/interface_style.c | |
parent | 351c00d29ab1d41867bfbae77b92625e5bf442e6 (diff) |
Cleanup: Remove interface region files to C++
Moves all `interface_region*` files to C++ except for the tooptip region
which is slightly more complicated. Also move a few other files as well.
This helps to simplify and speed up code, especially through the use
of better C++ data structures. This change builds on all platforms on
the buildbot.
Diffstat (limited to 'source/blender/editors/interface/interface_style.c')
-rw-r--r-- | source/blender/editors/interface/interface_style.c | 512 |
1 files changed, 0 insertions, 512 deletions
diff --git a/source/blender/editors/interface/interface_style.c b/source/blender/editors/interface/interface_style.c deleted file mode 100644 index 76023f3033f..00000000000 --- a/source/blender/editors/interface/interface_style.c +++ /dev/null @@ -1,512 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-or-later - * Copyright 2009 Blender Foundation. All rights reserved. */ - -/** \file - * \ingroup edinterface - */ - -#include <limits.h> -#include <math.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "MEM_guardedalloc.h" - -#include "DNA_userdef_types.h" - -#include "BLI_listbase.h" -#include "BLI_rect.h" -#include "BLI_string.h" -#include "BLI_utildefines.h" - -#include "BKE_global.h" - -#include "BLF_api.h" - -#include "BLT_translation.h" - -#include "UI_interface.h" - -#include "ED_datafiles.h" - -#include "interface_intern.h" - -#ifdef WIN32 -# include "BLI_math_base.h" /* M_PI */ -#endif - -/* style + theme + layout-engine = UI */ - -/** - * This is a complete set of layout rules, the 'state' of the Layout - * Engine. Multiple styles are possible, defined via C or Python. Styles - * get a name, and will typically get activated per region type, like - * "Header", or "Listview" or "Toolbar". Properties of Style definitions - * are: - * - * - default column properties, internal spacing, aligning, min/max width - * - button alignment rules (for groups) - * - label placement rules - * - internal labeling or external labeling default - * - default minimum widths for buttons/labels (in amount of characters) - * - font types, styles and relative sizes for Panel titles, labels, etc. - */ - -/* ********************************************** */ - -static uiStyle *ui_style_new(ListBase *styles, const char *name, short uifont_id) -{ - uiStyle *style = MEM_callocN(sizeof(uiStyle), "new style"); - - BLI_addtail(styles, style); - BLI_strncpy(style->name, name, MAX_STYLE_NAME); - - style->panelzoom = 1.0; /* unused */ - - style->paneltitle.uifont_id = uifont_id; - style->paneltitle.points = UI_DEFAULT_TITLE_POINTS; - style->paneltitle.shadow = 3; - style->paneltitle.shadx = 0; - style->paneltitle.shady = -1; - style->paneltitle.shadowalpha = 0.5f; - style->paneltitle.shadowcolor = 0.0f; - - style->grouplabel.uifont_id = uifont_id; - style->grouplabel.points = UI_DEFAULT_TITLE_POINTS; - style->grouplabel.shadow = 3; - style->grouplabel.shadx = 0; - style->grouplabel.shady = -1; - style->grouplabel.shadowalpha = 0.5f; - style->grouplabel.shadowcolor = 0.0f; - - style->widgetlabel.uifont_id = uifont_id; - style->widgetlabel.points = UI_DEFAULT_TEXT_POINTS; - style->widgetlabel.shadow = 3; - style->widgetlabel.shadx = 0; - style->widgetlabel.shady = -1; - style->widgetlabel.shadowalpha = 0.5f; - style->widgetlabel.shadowcolor = 0.0f; - - style->widget.uifont_id = uifont_id; - style->widget.points = UI_DEFAULT_TEXT_POINTS; - style->widget.shadow = 1; - style->widget.shady = -1; - style->widget.shadowalpha = 0.5f; - style->widget.shadowcolor = 0.0f; - - style->columnspace = 8; - style->templatespace = 5; - style->boxspace = 5; - style->buttonspacex = 8; - style->buttonspacey = 2; - style->panelspace = 8; - style->panelouter = 4; - - return style; -} - -static uiFont *uifont_to_blfont(int id) -{ - uiFont *font = U.uifonts.first; - - for (; font; font = font->next) { - if (font->uifont_id == id) { - return font; - } - } - return U.uifonts.first; -} - -/* *************** draw ************************ */ - -void UI_fontstyle_draw_ex(const uiFontStyle *fs, - const rcti *rect, - const char *str, - const size_t str_len, - const uchar col[4], - const struct uiFontStyleDraw_Params *fs_params, - int *r_xofs, - int *r_yofs, - struct ResultBLF *r_info) -{ - int xofs = 0, yofs; - int font_flag = BLF_CLIPPING; - - UI_fontstyle_set(fs); - - /* set the flag */ - if (fs->shadow) { - font_flag |= BLF_SHADOW; - const float shadow_color[4] = { - fs->shadowcolor, fs->shadowcolor, fs->shadowcolor, fs->shadowalpha}; - BLF_shadow(fs->uifont_id, fs->shadow, shadow_color); - BLF_shadow_offset(fs->uifont_id, fs->shadx, fs->shady); - } - if (fs_params->word_wrap == 1) { - font_flag |= BLF_WORD_WRAP; - } - if (fs->bold) { - font_flag |= BLF_BOLD; - } - if (fs->italic) { - font_flag |= BLF_ITALIC; - } - - BLF_enable(fs->uifont_id, font_flag); - - if (fs_params->word_wrap == 1) { - /* Draw from bound-box top. */ - yofs = BLI_rcti_size_y(rect) - BLF_height_max(fs->uifont_id); - } - else { - /* Draw from bound-box center. */ - const float height = BLF_ascender(fs->uifont_id) + BLF_descender(fs->uifont_id); - yofs = ceil(0.5f * (BLI_rcti_size_y(rect) - height)); - } - - if (fs_params->align == UI_STYLE_TEXT_CENTER) { - xofs = floor(0.5f * (BLI_rcti_size_x(rect) - BLF_width(fs->uifont_id, str, str_len))); - } - else if (fs_params->align == UI_STYLE_TEXT_RIGHT) { - xofs = BLI_rcti_size_x(rect) - BLF_width(fs->uifont_id, str, str_len); - } - - yofs = MAX2(0, yofs); - xofs = MAX2(0, xofs); - - BLF_clipping(fs->uifont_id, rect->xmin, rect->ymin, rect->xmax, rect->ymax); - BLF_position(fs->uifont_id, rect->xmin + xofs, rect->ymin + yofs, 0.0f); - BLF_color4ubv(fs->uifont_id, col); - - BLF_draw_ex(fs->uifont_id, str, str_len, r_info); - - BLF_disable(fs->uifont_id, font_flag); - - if (r_xofs) { - *r_xofs = xofs; - } - if (r_yofs) { - *r_yofs = yofs; - } -} - -void UI_fontstyle_draw(const uiFontStyle *fs, - const rcti *rect, - const char *str, - const size_t str_len, - const uchar col[4], - const struct uiFontStyleDraw_Params *fs_params) -{ - UI_fontstyle_draw_ex(fs, rect, str, str_len, col, fs_params, NULL, NULL, NULL); -} - -void UI_fontstyle_draw_rotated(const uiFontStyle *fs, - const rcti *rect, - const char *str, - const uchar col[4]) -{ - float height; - int xofs, yofs; - float angle; - rcti txtrect; - - UI_fontstyle_set(fs); - - height = BLF_ascender(fs->uifont_id) + BLF_descender(fs->uifont_id); - /* becomes x-offset when rotated */ - xofs = ceil(0.5f * (BLI_rcti_size_y(rect) - height)); - - /* ignore UI_STYLE, always aligned to top */ - - /* Rotate counter-clockwise for now (assumes left-to-right language). */ - xofs += height; - yofs = BLF_width(fs->uifont_id, str, BLF_DRAW_STR_DUMMY_MAX) + 5; - angle = M_PI_2; - - /* translate rect to vertical */ - txtrect.xmin = rect->xmin - BLI_rcti_size_y(rect); - txtrect.ymin = rect->ymin - BLI_rcti_size_x(rect); - txtrect.xmax = rect->xmin; - txtrect.ymax = rect->ymin; - - /* clip is very strict, so we give it some space */ - /* clipping is done without rotation, so make rect big enough to contain both positions */ - BLF_clipping(fs->uifont_id, - txtrect.xmin - 1, - txtrect.ymin - yofs - xofs - 4, - rect->xmax + 1, - rect->ymax + 4); - BLF_enable(fs->uifont_id, BLF_CLIPPING); - BLF_position(fs->uifont_id, txtrect.xmin + xofs, txtrect.ymax - yofs, 0.0f); - - BLF_enable(fs->uifont_id, BLF_ROTATION); - BLF_rotation(fs->uifont_id, angle); - BLF_color4ubv(fs->uifont_id, col); - - if (fs->shadow) { - BLF_enable(fs->uifont_id, BLF_SHADOW); - const float shadow_color[4] = { - fs->shadowcolor, fs->shadowcolor, fs->shadowcolor, fs->shadowalpha}; - BLF_shadow(fs->uifont_id, fs->shadow, shadow_color); - BLF_shadow_offset(fs->uifont_id, fs->shadx, fs->shady); - } - - BLF_draw(fs->uifont_id, str, BLF_DRAW_STR_DUMMY_MAX); - BLF_disable(fs->uifont_id, BLF_ROTATION); - BLF_disable(fs->uifont_id, BLF_CLIPPING); - if (fs->shadow) { - BLF_disable(fs->uifont_id, BLF_SHADOW); - } -} - -void UI_fontstyle_draw_simple( - const uiFontStyle *fs, float x, float y, const char *str, const uchar col[4]) -{ - UI_fontstyle_set(fs); - BLF_position(fs->uifont_id, x, y, 0.0f); - BLF_color4ubv(fs->uifont_id, col); - BLF_draw(fs->uifont_id, str, BLF_DRAW_STR_DUMMY_MAX); -} - -void UI_fontstyle_draw_simple_backdrop(const uiFontStyle *fs, - float x, - float y, - const char *str, - const float col_fg[4], - const float col_bg[4]) -{ - UI_fontstyle_set(fs); - - { - const float width = BLF_width(fs->uifont_id, str, BLF_DRAW_STR_DUMMY_MAX); - const float height = BLF_height_max(fs->uifont_id); - const float decent = BLF_descender(fs->uifont_id); - const float margin = height / 4.0f; - - UI_draw_roundbox_corner_set(UI_CNR_ALL); - UI_draw_roundbox_4fv( - &(const rctf){ - .xmin = x - margin, - .xmax = x + width + margin, - .ymin = (y + decent) - margin, - .ymax = (y + decent) + height + margin, - }, - true, - margin, - col_bg); - } - - BLF_position(fs->uifont_id, x, y, 0.0f); - BLF_color4fv(fs->uifont_id, col_fg); - BLF_draw(fs->uifont_id, str, BLF_DRAW_STR_DUMMY_MAX); -} - -/* ************** helpers ************************ */ - -const uiStyle *UI_style_get(void) -{ -#if 0 - uiStyle *style = NULL; - /* offset is two struct uiStyle pointers */ - style = BLI_findstring(&U.uistyles, "Unifont Style", sizeof(style) * 2); - return (style != NULL) ? style : U.uistyles.first; -#else - return U.uistyles.first; -#endif -} - -const uiStyle *UI_style_get_dpi(void) -{ - const uiStyle *style = UI_style_get(); - static uiStyle _style; - - _style = *style; - - _style.paneltitle.shadx = (short)(UI_DPI_FAC * _style.paneltitle.shadx); - _style.paneltitle.shady = (short)(UI_DPI_FAC * _style.paneltitle.shady); - _style.grouplabel.shadx = (short)(UI_DPI_FAC * _style.grouplabel.shadx); - _style.grouplabel.shady = (short)(UI_DPI_FAC * _style.grouplabel.shady); - _style.widgetlabel.shadx = (short)(UI_DPI_FAC * _style.widgetlabel.shadx); - _style.widgetlabel.shady = (short)(UI_DPI_FAC * _style.widgetlabel.shady); - - _style.columnspace = (short)(UI_DPI_FAC * _style.columnspace); - _style.templatespace = (short)(UI_DPI_FAC * _style.templatespace); - _style.boxspace = (short)(UI_DPI_FAC * _style.boxspace); - _style.buttonspacex = (short)(UI_DPI_FAC * _style.buttonspacex); - _style.buttonspacey = (short)(UI_DPI_FAC * _style.buttonspacey); - _style.panelspace = (short)(UI_DPI_FAC * _style.panelspace); - _style.panelouter = (short)(UI_DPI_FAC * _style.panelouter); - - return &_style; -} - -int UI_fontstyle_string_width(const uiFontStyle *fs, const char *str) -{ - UI_fontstyle_set(fs); - return (int)BLF_width(fs->uifont_id, str, BLF_DRAW_STR_DUMMY_MAX); -} - -int UI_fontstyle_string_width_with_block_aspect(const uiFontStyle *fs, - const char *str, - const float aspect) -{ - uiFontStyle fs_buf; - if (aspect != 1.0f) { - fs_buf = *fs; - ui_fontscale(&fs_buf.points, aspect); - fs = &fs_buf; - } - - int width = UI_fontstyle_string_width(fs, str); - - if (aspect != 1.0f) { - /* While in most cases rounding up isn't important, it can make a difference - * with small fonts (3px or less), zooming out in the node-editor for e.g. */ - width = (int)ceilf(width * aspect); - } - return width; -} - -int UI_fontstyle_height_max(const uiFontStyle *fs) -{ - UI_fontstyle_set(fs); - return BLF_height_max(fs->uifont_id); -} - -/* ************** init exit ************************ */ - -void uiStyleInit(void) -{ - const uiStyle *style = U.uistyles.first; - - /* recover from uninitialized dpi */ - if (U.dpi == 0) { - U.dpi = 72; - } - CLAMP(U.dpi, 48, 144); - - LISTBASE_FOREACH (uiFont *, font, &U.uifonts) { - BLF_unload_id(font->blf_id); - } - - if (blf_mono_font != -1) { - BLF_unload_id(blf_mono_font); - blf_mono_font = -1; - } - - if (blf_mono_font_render != -1) { - BLF_unload_id(blf_mono_font_render); - blf_mono_font_render = -1; - } - - uiFont *font_first = U.uifonts.first; - - /* default builtin */ - if (font_first == NULL) { - font_first = MEM_callocN(sizeof(uiFont), "ui font"); - BLI_addtail(&U.uifonts, font_first); - } - - if (U.font_path_ui[0]) { - BLI_strncpy(font_first->filepath, U.font_path_ui, sizeof(font_first->filepath)); - font_first->uifont_id = UIFONT_CUSTOM1; - } - else { - BLI_strncpy(font_first->filepath, "default", sizeof(font_first->filepath)); - font_first->uifont_id = UIFONT_DEFAULT; - } - - LISTBASE_FOREACH (uiFont *, font, &U.uifonts) { - const bool unique = false; - - if (font->uifont_id == UIFONT_DEFAULT) { - font->blf_id = BLF_load_default(unique); - } - else { - font->blf_id = BLF_load(font->filepath); - if (font->blf_id == -1) { - font->blf_id = BLF_load_default(unique); - } - } - - BLF_default_set(font->blf_id); - - if (font->blf_id == -1) { - if (G.debug & G_DEBUG) { - printf("%s: error, no fonts available\n", __func__); - } - } - } - - if (style == NULL) { - style = ui_style_new(&U.uistyles, "Default Style", UIFONT_DEFAULT); - } - - BLF_cache_flush_set_fn(UI_widgetbase_draw_cache_flush); - - BLF_default_size(style->widgetlabel.points); - - /* XXX, this should be moved into a style, - * but for now best only load the monospaced font once. */ - BLI_assert(blf_mono_font == -1); - /* Use unique font loading to avoid thread safety issues with mono font - * used for render metadata stamp in threads. */ - if (U.font_path_ui_mono[0]) { - blf_mono_font = BLF_load_unique(U.font_path_ui_mono); - } - if (blf_mono_font == -1) { - const bool unique = true; - blf_mono_font = BLF_load_mono_default(unique); - } - - /* Set default flags based on UI preferences (not render fonts) */ - { - const int flag_disable = (BLF_MONOCHROME | BLF_HINTING_NONE | BLF_HINTING_SLIGHT | - BLF_HINTING_FULL); - int flag_enable = 0; - - if (U.text_render & USER_TEXT_HINTING_NONE) { - flag_enable |= BLF_HINTING_NONE; - } - else if (U.text_render & USER_TEXT_HINTING_SLIGHT) { - flag_enable |= BLF_HINTING_SLIGHT; - } - else if (U.text_render & USER_TEXT_HINTING_FULL) { - flag_enable |= BLF_HINTING_FULL; - } - - if (U.text_render & USER_TEXT_DISABLE_AA) { - flag_enable |= BLF_MONOCHROME; - } - - LISTBASE_FOREACH (uiFont *, font, &U.uifonts) { - if (font->blf_id != -1) { - BLF_disable(font->blf_id, flag_disable); - BLF_enable(font->blf_id, flag_enable); - } - } - if (blf_mono_font != -1) { - BLF_disable(blf_mono_font, flag_disable); - BLF_enable(blf_mono_font, flag_enable); - } - } - - /** - * Second for rendering else we get threading problems, - * - * \note This isn't good that the render font depends on the preferences, - * keep for now though, since without this there is no way to display many unicode chars. - */ - if (blf_mono_font_render == -1) { - const bool unique = true; - blf_mono_font_render = BLF_load_mono_default(unique); - } -} - -void UI_fontstyle_set(const uiFontStyle *fs) -{ - uiFont *font = uifont_to_blfont(fs->uifont_id); - - BLF_size(font->blf_id, fs->points * U.pixelsize, U.dpi); -} |