diff options
author | Harley Acheson <harley.acheson@gmail.com> | 2022-09-25 21:25:31 +0300 |
---|---|---|
committer | Harley Acheson <harley.acheson@gmail.com> | 2022-09-25 21:25:31 +0300 |
commit | b3714b1e85fd81d4f7db3c562483232fd6a89807 (patch) | |
tree | e2758ecd3624bd7670df77df2c65c004cc510ea5 /source/blender/editors/interface | |
parent | c8ee70c96200548699a2d038a93208c5723f91e7 (diff) |
BLF: Refactor of blf_font_boundbox_foreach_glyph
Refactor of `BLF_boundbox_foreach_glyph` and simplification of its
usage by only passing translated glyph bounds to callbacks.
See D15765 for more details.
Differential Revision: https://developer.blender.org/D15765
Reviewed by Campbell Barton
Diffstat (limited to 'source/blender/editors/interface')
-rw-r--r-- | source/blender/editors/interface/interface_handlers.c | 38 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_widgets.c | 59 |
2 files changed, 15 insertions, 82 deletions
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index a6c700bdc2f..56b550995be 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -3017,23 +3017,6 @@ static bool ui_textedit_delete_selection(uiBut *but, uiHandleButtonData *data) return changed; } -static bool ui_textedit_set_cursor_pos_foreach_glyph(const char *UNUSED(str), - const size_t str_step_ofs, - const rcti *glyph_step_bounds, - const int UNUSED(glyph_advance_x), - const rcti *glyph_bounds, - const int UNUSED(glyph_bearing[2]), - void *user_data) -{ - int *cursor_data = user_data; - const int center = glyph_step_bounds->xmin + (BLI_rcti_size_x(glyph_bounds) / 2.0f); - if (cursor_data[0] < center) { - cursor_data[1] = str_step_ofs; - return false; - } - return true; -} - /** * \param x: Screen space cursor location - #wmEvent.x * @@ -3064,7 +3047,7 @@ static void ui_textedit_set_cursor_pos(uiBut *but, uiHandleButtonData *data, con startx += UI_DPI_ICON_SIZE / aspect; } } - startx += (UI_TEXT_MARGIN_X * U.widget_unit) / aspect; + startx += (UI_TEXT_MARGIN_X * U.widget_unit - U.pixelsize) / aspect; /* mouse dragged outside the widget to the left */ if (x < startx) { @@ -3088,23 +3071,8 @@ static void ui_textedit_set_cursor_pos(uiBut *but, uiHandleButtonData *data, con } /* mouse inside the widget, mouse coords mapped in widget space */ else { - str_last = &str[but->ofs]; - const int str_last_len = strlen(str_last); - const int x_pos = (int)(x - startx); - int glyph_data[2] = { - x_pos, /* horizontal position to test. */ - -1, /* Write the character offset here. */ - }; - BLF_boundbox_foreach_glyph(fstyle.uifont_id, - str + but->ofs, - INT_MAX, - ui_textedit_set_cursor_pos_foreach_glyph, - glyph_data); - /* If value untouched then we are to the right. */ - if (glyph_data[1] == -1) { - glyph_data[1] = str_last_len; - } - but->pos = glyph_data[1] + but->ofs; + but->pos = but->ofs + BLF_str_offset_from_cursor_position( + fstyle.uifont_id, str + but->ofs, INT_MAX, (int)(x - startx)); } ui_but_text_password_hide(password_str, but, true); diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index 1b13632b131..6ba80e2e0d9 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -1858,33 +1858,6 @@ static void widget_draw_text_ime_underline(const uiFontStyle *fstyle, } #endif /* WITH_INPUT_IME */ -struct UnderlineData { - size_t str_offset; /* The string offset of the underlined character. */ - int width_px; /* The underline width in pixels. */ - int r_offset_px[2]; /* Write the X,Y offset here. */ -}; - -static bool widget_draw_text_underline_calc_position(const char *UNUSED(str), - const size_t str_step_ofs, - const rcti *glyph_step_bounds, - const int UNUSED(glyph_advance_x), - const rcti *glyph_bounds, - const int UNUSED(glyph_bearing[2]), - void *user_data) -{ - struct UnderlineData *ul_data = user_data; - if (ul_data->str_offset == str_step_ofs) { - /* Full width of this glyph including both bearings. */ - const int width = glyph_bounds->xmin + BLI_rcti_size_x(glyph_bounds) + glyph_bounds->xmin; - ul_data->r_offset_px[0] = glyph_step_bounds->xmin + ((width - ul_data->width_px) / 2); - /* One line-width below the lower glyph bounds. */ - ul_data->r_offset_px[1] = glyph_bounds->ymin - U.pixelsize; - /* Early exit. */ - return false; - } - return true; -} - static void widget_draw_text(const uiFontStyle *fstyle, const uiWidgetColors *wcol, uiBut *but, @@ -2150,26 +2123,18 @@ static void widget_draw_text(const uiFontStyle *fstyle, } if (ul_index != -1) { - int ul_width = round_fl_to_int(BLF_width(fstyle->uifont_id, "_", 2)); - - struct UnderlineData ul_data = { - .str_offset = ul_index, - .width_px = ul_width, - }; - - BLF_boundbox_foreach_glyph(fstyle->uifont_id, - drawstr_ofs, - ul_index + 1, - widget_draw_text_underline_calc_position, - &ul_data); - - const int pos_x = rect->xmin + font_xofs + ul_data.r_offset_px[0]; - const int pos_y = rect->ymin + font_yofs + ul_data.r_offset_px[1]; - - /* Use text output because direct drawing doesn't always work. See T89246. */ - BLF_position(fstyle->uifont_id, pos_x, pos_y, 0.0f); - BLF_color4ubv(fstyle->uifont_id, wcol->text); - BLF_draw(fstyle->uifont_id, "_", 2); + rcti bounds; + if (BLF_str_offset_to_glyph_bounds(fstyle->uifont_id, drawstr_ofs, ul_index, &bounds) && + !BLI_rcti_is_empty(&bounds)) { + int ul_width = round_fl_to_int(BLF_width(fstyle->uifont_id, "_", 2)); + int pos_x = rect->xmin + font_xofs + bounds.xmin + + (bounds.xmax - bounds.xmin - ul_width) / 2; + int pos_y = rect->ymin + font_yofs + bounds.ymin - U.pixelsize; + /* Use text output because direct drawing doesn't always work. See T89246. */ + BLF_position(fstyle->uifont_id, (float)pos_x, pos_y, 0.0f); + BLF_color4ubv(fstyle->uifont_id, wcol->text); + BLF_draw(fstyle->uifont_id, "_", 2); + } } } } |