Commit: f45c2a9cb5b37222a40e417a4d8291a480b5843d
Author: Julian Eisel
Date:   Thu Jul 16 19:09:51 2015 +0200
Branches: temp-ui-widget-refactor
https://developer.blender.org/rBf45c2a9cb5b37222a40e417a4d8291a480b5843d

Aaaand finally: Use new pipeline for text drawing as well

===================================================================

M       source/blender/editors/interface/CMakeLists.txt
M       source/blender/editors/interface/interface_widgets.c
M       source/blender/editors/interface/widgets/widgets.h
M       
source/blender/editors/interface/widgets/widgets_draw/drawstyle_classic.c
M       
source/blender/editors/interface/widgets/widgets_draw/widgets_draw_intern.h
A       
source/blender/editors/interface/widgets/widgets_draw/widgets_draw_text.c

===================================================================

diff --git a/source/blender/editors/interface/CMakeLists.txt 
b/source/blender/editors/interface/CMakeLists.txt
index 356c071..68ebb30 100644
--- a/source/blender/editors/interface/CMakeLists.txt
+++ b/source/blender/editors/interface/CMakeLists.txt
@@ -60,6 +60,7 @@ set(SRC
        widgets/widgets.c
        widgets/widgets_draw/drawstyle_classic.c
        widgets/widgets_draw/widgets_draw.c
+       widgets/widgets_draw/widgets_draw_text.c
 
        interface_intern.h
        widgets/widgets.h
diff --git a/source/blender/editors/interface/interface_widgets.c 
b/source/blender/editors/interface/interface_widgets.c
index 4a57b1c..390e3bf 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -202,830 +202,6 @@ static void widgetbase_outline(uiWidgetBase *wtb)
        glDisableClientState(GL_VERTEX_ARRAY);
 }
 
-/* *********************** text/icon ************************************** */
-
-#define UI_TEXT_CLIP_MARGIN (0.25f * U.widget_unit / but->block->aspect)
-
-#define PREVIEW_PAD 4
-
-static void widget_draw_preview(BIFIconID icon, float alpha, const rcti *rect)
-{
-       int w, h, size;
-
-       if (icon == ICON_NONE)
-               return;
-
-       w = BLI_rcti_size_x(rect);
-       h = BLI_rcti_size_y(rect);
-       size = MIN2(w, h);
-       size -= PREVIEW_PAD * 2;  /* padding */
-
-       if (size > 0) {
-               int x = rect->xmin + w / 2 - size / 2;
-               int y = rect->ymin + h / 2 - size / 2;
-
-               UI_icon_draw_preview_aspect_size(x, y, icon, 1.0f, alpha, size);
-       }
-}
-
-
-static int ui_but_draw_menu_icon(const uiBut *but)
-{
-       return (but->flag & UI_BUT_ICON_SUBMENU) && (but->dt == 
UI_EMBOSS_PULLDOWN);
-}
-
-/* icons have been standardized... and this call draws in untransformed 
coordinates */
-
-static void widget_draw_icon(
-        const uiBut *but, BIFIconID icon, float alpha, const rcti *rect,
-        const bool show_menu_icon)
-{
-       float xs = 0.0f, ys = 0.0f;
-       float aspect, height;
-       
-       if (but->flag & UI_BUT_ICON_PREVIEW) {
-               glEnable(GL_BLEND);
-               widget_draw_preview(icon, alpha, rect);
-               glDisable(GL_BLEND);
-               return;
-       }
-       
-       /* this icon doesn't need draw... */
-       if (icon == ICON_BLANK1 && (but->flag & UI_BUT_ICON_SUBMENU) == 0) 
return;
-       
-       aspect = but->block->aspect / UI_DPI_FAC;
-       height = ICON_DEFAULT_HEIGHT / aspect;
-
-       /* calculate blend color */
-       if (ELEM(but->type, UI_BTYPE_TOGGLE, UI_BTYPE_ROW, UI_BTYPE_TOGGLE_N, 
UI_BTYPE_LISTROW)) {
-               if (but->flag & UI_SELECT) {}
-               else if (but->flag & UI_ACTIVE) {}
-               else alpha = 0.5f;
-       }
-       
-       /* extra feature allows more alpha blending */
-       if ((but->type == UI_BTYPE_LABEL) && but->a1 == 1.0f)
-               alpha *= but->a2;
-       
-       glEnable(GL_BLEND);
-       
-       if (icon && icon != ICON_BLANK1) {
-               float ofs = 1.0f / aspect;
-               
-               if (but->drawflag & UI_BUT_ICON_LEFT) {
-                       if (but->block->flag & UI_BLOCK_LOOP) {
-                               if (but->type == UI_BTYPE_SEARCH_MENU)
-                                       xs = rect->xmin + 4.0f * ofs;
-                               else
-                                       xs = rect->xmin + ofs;
-                       }
-                       else {
-                               xs = rect->xmin + 4.0f * ofs;
-                       }
-                       ys = (rect->ymin + rect->ymax - height) / 2.0f;
-               }
-               else {
-                       xs = (rect->xmin + rect->xmax - height) / 2.0f;
-                       ys = (rect->ymin + rect->ymax - height) / 2.0f;
-               }
-
-               /* force positions to integers, for zoom levels near 1. draws 
icons crisp. */
-               if (aspect > 0.95f && aspect < 1.05f) {
-                       xs = (int)(xs + 0.1f);
-                       ys = (int)(ys + 0.1f);
-               }
-               
-               /* to indicate draggable */
-               if (but->dragpoin && (but->flag & UI_ACTIVE)) {
-                       float rgb[3] = {1.25f, 1.25f, 1.25f};
-                       UI_icon_draw_aspect_color(xs, ys, icon, aspect, rgb);
-               }
-               else
-                       UI_icon_draw_aspect(xs, ys, icon, aspect, alpha);
-       }
-
-       if (show_menu_icon) {
-               xs = rect->xmax - UI_DPI_ICON_SIZE - aspect;
-               ys = (rect->ymin + rect->ymax - height) / 2.0f;
-               
-               UI_icon_draw_aspect(xs, ys, ICON_RIGHTARROW_THIN, aspect, 
alpha);
-       }
-       
-       glDisable(GL_BLEND);
-}
-
-static void ui_text_clip_give_prev_off(uiBut *but, const char *str)
-{
-       const char *prev_utf8 = BLI_str_find_prev_char_utf8(str, str + 
but->ofs);
-       int bytes = str + but->ofs - prev_utf8;
-
-       but->ofs -= bytes;
-}
-
-static void ui_text_clip_give_next_off(uiBut *but, const char *str)
-{
-       const char *next_utf8 = BLI_str_find_next_char_utf8(str + but->ofs, 
NULL);
-       int bytes = next_utf8 - (str + but->ofs);
-
-       but->ofs += bytes;
-}
-
-/**
- * Helper.
- * This func assumes things like kerning handling have already been handled!
- * Return the length of modified (right-clipped + ellipsis) string.
- */
-static void ui_text_clip_right_ex(
-        uiFontStyle *fstyle, char *str, const size_t max_len, const float 
okwidth,
-        const char *sep, const int sep_len, const float sep_strwidth, size_t 
*r_final_len)
-{
-       float tmp;
-       int l_end;
-
-       BLI_assert(str[0]);
-
-       /* If the trailing ellipsis takes more than 20% of all available width, 
just cut the string
-        * (as using the ellipsis would remove even more useful chars, and we 
cannot show much already!).
-        */
-       if (sep_strwidth / okwidth > 0.2f) {
-               l_end = BLF_width_to_strlen(fstyle->uifont_id, str, max_len, 
okwidth, &tmp);
-               str[l_end] = '\0';
-               if (r_final_len) {
-                       *r_final_len = (size_t)l_end;
-               }
-       }
-       else {
-               l_end = BLF_width_to_strlen(fstyle->uifont_id, str, max_len, 
okwidth - sep_strwidth, &tmp);
-               memcpy(str + l_end, sep, sep_len + 1);  /* +1 for trailing 
'\0'. */
-               if (r_final_len) {
-                       *r_final_len = (size_t)(l_end + sep_len);
-               }
-       }
-}
-
-/**
- * Cut off the middle of the text to fit into the given width.
- * Note in case this middle clipping would just remove a few chars, it rather 
clips right, which is more readable.
- * If rpart_sep is not Null, the part of str starting to first occurrence of 
rpart_sep is preserved at all cost (useful
- * for strings with shortcuts, like 'AVeryLongFooBarLabelForMenuEntry|Ctrl O' 
-> 'AVeryLong...MenuEntry|Ctrl O').
- */
-float UI_text_clip_middle_ex(
-        uiFontStyle *fstyle, char *str, float okwidth, const float minwidth,
-        const size_t max_len, const char rpart_sep)
-{
-       float strwidth;
-
-       /* Add some epsilon to OK width, avoids 'ellipsing' text that nearly 
fits!
-     * Better to have a small piece of the last char cut out, than two 
remaining chars replaced by an allipsis... */
-       okwidth += 1.0f + UI_DPI_FAC;
-
-       BLI_assert(str[0]);
-
-       /* need to set this first */
-       UI_fontstyle_set(fstyle);
-
-       if (fstyle->kerning == 1) {  /* for BLF_width */
-               BLF_enable(fstyle->uifont_id, BLF_KERNING_DEFAULT);
-       }
-
-       strwidth = BLF_width(fstyle->uifont_id, str, max_len);
-
-       if ((okwidth > 0.0f) && (strwidth > okwidth)) {
-               /* utf8 ellipsis '...', some compilers complain */
-               const char sep[] = {0xe2, 0x80, 0xa6, 0x0};
-               const int sep_len = sizeof(sep) - 1;
-               const float sep_strwidth = BLF_width(fstyle->uifont_id, sep, 
sep_len + 1);
-               float parts_strwidth;
-               size_t l_end;
-
-               char *rpart = NULL, rpart_buf[UI_MAX_DRAW_STR];
-               float rpart_width = 0.0f;
-               size_t rpart_len = 0;
-               size_t final_lpart_len;
-
-               if (rpart_sep) {
-                       rpart = strrchr(str, rpart_sep);
-
-                       if (rpart) {
-                               rpart_len = strlen(rpart);
-                               rpart_width = BLF_width(fstyle->uifont_id, 
rpart, rpart_len);
-                               okwidth -= rpart_width;
-                               strwidth -= rpart_width;
-
-                               if (okwidth < 0.0f) {
-                                       /* Not enough place for actual label, 
just display protected right part.
-                                        * Here just for safety, should never 
happen in real life! */
-                                       memmove(str, rpart, rpart_len + 1);
-                                       rpart = NULL;
-                                       okwidth += rpart_width;
-                                       strwidth = rpart_width;
-                               }
-                       }
-               }
-
-               parts_strwidth = (okwidth - sep_strwidth) / 2.0f;
-
-               if (rpart) {
-                       strcpy(rpart_buf, rpart);
-                       *rpart = '\0';
-                       rpart = rpart_buf;
-               }
-
-               l_end = BLF_width_to_strlen(fstyle->uifont_id, str, max_len, 
parts_strwidth, &rpart_width);
-               if (l_end < 10 || min_ff(parts_strwidth, strwidth - okwidth) < 
minwidth) {
-                       /* If we really have no place, or we would clip a very 
small piece of string in the middle,
-                        * only show start of string.
-                        */
-                       ui_text_clip_right_ex(fstyle, str, max_len, okwidth, 
sep, sep_len, sep_strwidth, &final_lpart_len);
-               }
-               else {
-                       size_t r_offset, r_len;
-
-                       r_offset = BLF_width_to_rstrlen(fstyle->uifont_id, str, 
max_len, parts_strwidth, &rpart_width);
-                       r_len = strlen(str + r_offset) + 1;  /* +1 for the 
trailing '\0'. */
-
-                       if (l_end + sep_len + r_len + rpart_len > max_len) {
-                               /* Corner case, the str already takes all 
available mem, and the ellipsis chars would actually
-                                * add more chars...
-                                * Better to just trim one or two letters to 
the right in this case...
-                                * Note: with a single-char ellipsis, this 
should never happen! But better be safe here...
-                                */
-                               ui_text_clip_right_ex(fstyle, str, max_len, 
okwidth, sep, sep_len, sep_strwidth, &final_lpart_len);
-                       }
-                       else {
-                               memmove(str + l_end + sep_len, str + r_offset, 
r_len);
-                               memcpy(str + l_end, sep, sep_len);
-                               final_lpart_len = (size_t)(l_end + sep_len + 
r_len - 1);  /* -1 to remove trailing '\0'! */
-                       }
-               }
-
-               if (rpart) {
-                       /* Add back preserved right part to our shorten str. */
-                       memcpy(str + final_lpart_len, rpart, rpart_len + 1);  
/* +1 for trailing '\0'. */
-               }
-
-               strwidth = BLF_width(fstyle->uifont_id, str, max_len);
-       }
-
-       if (fstyle->kerning == 1) {
-               BLF_disable(fstyle->uifont_id, BLF_KERNING_DEFAULT);
-       }
-
-       return strwidth;
-}
-
-/**
- * Wrapper around UI_text_clip_middle_ex.
- */
-static void ui_text_clip_middle(uiFontStyle *fstyle, uiBut *but, const rcti 
*rect)
-{
-       /* No margin for labels! */
-       const int border = ELEM(but->type, UI_BTYPE_LABEL, UI_BTYPE_MENU) ? 0 : 
(int)(UI_TEXT_CLIP_MARGIN + 0.5f);
-       const float okwidth = (float)max_ii(BLI_rcti_size_x(rect) - border, 0);
-       const size_t max_len = sizeof(but->drawstr);
-       const float minwidth = (float)(UI_DPI_ICON_SIZE) / but->block->aspect * 
2.0f;
-
-       but->ofs = 0;
-       but->strwidth = UI_text_clip_middle_ex(fstyle, but->drawstr, okwidth, 
minwidth, max_len, '\0');
-}
-
-/**
- * Like ui_text_clip_middle(), but protect/preserve at all cost the right part 
of the string after sep.
- * Useful for strings with shortcuts (like 
'AVeryLongFooBarLabelForMenuEntry|Ctrl O' -> 'AVeryLong...MenuEntry|Ctrl O').
- */
-static void ui_text_clip_middle_protect_right(uiFontStyle *fstyle, uiBut *but, 
const rcti *rect, const char rse

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to