doxygen: add newline after \file
[blender.git] / source / blender / editors / interface / interface_widgets.c
index b358f87..7e43ac8 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
  * as published by the Free Software Foundation; either version 2
  *
  * The Original Code is Copyright (C) 2009 Blender Foundation.
  * All rights reserved.
- *
- * Contributor(s): Blender Foundation
- *
- * ***** END GPL LICENSE BLOCK *****
  */
 
-/** \file blender/editors/interface/interface_widgets.c
- *  \ingroup edinterface
+/** \file
+ * \ingroup edinterface
  */
 
 #include <limits.h>
@@ -104,12 +98,12 @@ enum {
 /* it has outline, back, and two optional tria meshes */
 
 typedef struct uiWidgetTrias {
-       unsigned int tot;
+       uint tot;
        int type;
        float size, center[2];
 
        float vec[16][2];
-       const unsigned int (*index)[3];
+       const uint (*index)[3];
 
 } uiWidgetTrias;
 
@@ -140,7 +134,7 @@ typedef struct uiWidgetBase {
 typedef struct uiWidgetType {
 
        /* pointer to theme color definition */
-       uiWidgetColors *wcol_theme;
+       const uiWidgetColors *wcol_theme;
        uiWidgetStateColors *wcol_state;
 
        /* converted colors for state */
@@ -149,7 +143,7 @@ typedef struct uiWidgetType {
        void (*state)(struct uiWidgetType *, int state, int drawflag);
        void (*draw)(uiWidgetColors *, rcti *, int state, int roundboxalign);
        void (*custom)(uiBut *, uiWidgetColors *, rcti *, int state, int roundboxalign);
-       void (*text)(uiFontStyle *, uiWidgetColors *, uiBut *, rcti *);
+       void (*text)(const uiFontStyle *, const uiWidgetColors *, uiBut *, rcti *);
 
 } uiWidgetType;
 
@@ -159,7 +153,7 @@ typedef struct uiWidgetType {
 static const float cornervec[WIDGET_CURVE_RESOLU][2] = {
        {0.0, 0.0}, {0.195, 0.02}, {0.383, 0.067},
        {0.55, 0.169}, {0.707, 0.293}, {0.831, 0.45},
-       {0.924, 0.617}, {0.98, 0.805}, {1.0, 1.0}
+       {0.924, 0.617}, {0.98, 0.805}, {1.0, 1.0},
 };
 
 
@@ -167,7 +161,7 @@ const float ui_pixel_jitter[UI_PIXEL_AA_JITTER][2] = {
        { 0.468813, -0.481430}, {-0.155755, -0.352820},
        { 0.219306, -0.238501}, {-0.393286, -0.110949},
        {-0.024699,  0.013908}, { 0.343805,  0.147431},
-       {-0.272855,  0.269918}, { 0.095909,  0.388710}
+       {-0.272855,  0.269918}, { 0.095909,  0.388710},
 };
 #define WIDGET_AA_JITTER UI_PIXEL_AA_JITTER
 #define jit ui_pixel_jitter
@@ -177,36 +171,36 @@ const float ui_pixel_jitter[UI_PIXEL_AA_JITTER][2] = {
  * \{ */
 
 static const float g_shape_preset_number_arrow_vert[3][2] = {
-       {-0.352077, 0.532607}, {-0.352077, -0.549313}, {0.330000, -0.008353}
+       {-0.352077, 0.532607}, {-0.352077, -0.549313}, {0.330000, -0.008353},
 };
 static const uint g_shape_preset_number_arrow_face[1][3] = {
-       {0, 1, 2}
+       {0, 1, 2},
 };
 
 static const float g_shape_preset_scroll_circle_vert[16][2] = {
        {0.382684, 0.923879}, {0.000001, 1.000000}, {-0.382683, 0.923880}, {-0.707107, 0.707107},
        {-0.923879, 0.382684}, {-1.000000, 0.000000}, {-0.923880, -0.382684}, {-0.707107, -0.707107},
        {-0.382683, -0.923880}, {0.000000, -1.000000}, {0.382684, -0.923880}, {0.707107, -0.707107},
-       {0.923880, -0.382684}, {1.000000, -0.000000}, {0.923880, 0.382683}, {0.707107, 0.707107}
+       {0.923880, -0.382684}, {1.000000, -0.000000}, {0.923880, 0.382683}, {0.707107, 0.707107},
 };
 static const uint g_shape_preset_scroll_circle_face[14][3] = {
        {0, 1, 2}, {2, 0, 3}, {3, 0, 15}, {3, 15, 4}, {4, 15, 14}, {4, 14, 5}, {5, 14, 13}, {5, 13, 6},
-       {6, 13, 12}, {6, 12, 7}, {7, 12, 11}, {7, 11, 8}, {8, 11, 10}, {8, 10, 9}
+       {6, 13, 12}, {6, 12, 7}, {7, 12, 11}, {7, 11, 8}, {8, 11, 10}, {8, 10, 9},
 };
 
 static const float g_shape_preset_menu_arrow_vert[6][2] = {
        {-0.33, 0.16}, {0.33, 0.16}, {0, 0.82},
-       {0, -0.82}, {-0.33, -0.16}, {0.33, -0.16}
+       {0, -0.82}, {-0.33, -0.16}, {0.33, -0.16},
 };
 static const uint g_shape_preset_menu_arrow_face[2][3] = {{2, 0, 1}, {3, 5, 4}};
 
 static const float g_shape_preset_checkmark_vert[6][2] = {
        {-0.578579, 0.253369},  {-0.392773, 0.412794},  {-0.004241, -0.328551},
-       {-0.003001, 0.034320},  {1.055313, 0.864744},   {0.866408, 1.026895}
+       {-0.003001, 0.034320},  {1.055313, 0.864744},   {0.866408, 1.026895},
 };
 
 static const uint g_shape_preset_checkmark_face[4][3] = {
-       {3, 2, 4}, {3, 4, 5}, {1, 0, 3}, {0, 2, 3}
+       {3, 2, 4}, {3, 4, 5}, {1, 0, 3}, {0, 2, 3},
 };
 
 #define OY (-0.2 / 2)
@@ -368,7 +362,8 @@ GPUBatch *ui_batch_roundbox_widget_get(int tria)
                set_roundbox_vertex_data(&vflag_step, last_data);
                set_roundbox_vertex(&vflag_step, 0, 0, 0, false, false, EMBOSS);
                /* Emboss */
-               bool rev = false; /* go back and forth : avoid degenerate triangle (but beware of backface cull) */
+               /* go back and forth : avoid degenerate triangle (but beware of backface cull) */
+               bool rev = false;
                for (int j = 0; j < WIDGET_AA_JITTER; j++, rev = !rev) {
                        for (int c = (rev) ? 1 : 0; (rev) ? c >= 0 : c < 2; (rev) ? c-- : c++) {
                                int sta = (rev) ? WIDGET_CURVE_RESOLU - 1 : 0;
@@ -546,7 +541,7 @@ void ui_draw_anti_tria_rect(const rctf *rect, char dir, const float color[4])
 }
 
 
-void UI_draw_anti_fan(float tri_array[][2], unsigned int length, const float color[4])
+void UI_draw_anti_fan(float tri_array[][2], uint length, const float color[4])
 {
        float draw_color[4];
 
@@ -685,7 +680,8 @@ static void round_box__edges(uiWidgetBase *wt, int roundboxalign, const rcti *re
        float maxxi = maxx - U.pixelsize;
        float minyi = miny + U.pixelsize;
        float maxyi = maxy - U.pixelsize;
-       float facxi = (maxxi != minxi) ? 1.0f / (maxxi - minxi) : 0.0f; /* for uv, can divide by zero */
+       /* for uv, can divide by zero */
+       float facxi = (maxxi != minxi) ? 1.0f / (maxxi - minxi) : 0.0f;
        float facyi = (maxyi != minyi) ? 1.0f / (maxyi - minyi) : 0.0f;
        int a, tot = 0, minsize;
        const int hnum = (
@@ -855,7 +851,7 @@ static void shape_preset_init_trias_ex(
         uiWidgetTrias *tria, const rcti *rect, float triasize, char where,
         /* input data */
         const float verts[][2], const int verts_tot,
-        const unsigned int tris[][3], const int tris_tot)
+        const uint tris[][3], const int tris_tot)
 {
        float centx, centy, sizex, sizey, minsize;
        int a, i1 = 0, i2 = 1;
@@ -932,10 +928,10 @@ static void shape_preset_init_scroll_circle(uiWidgetTrias *tria, const rcti *rec
                g_shape_preset_scroll_circle_face, ARRAY_SIZE(g_shape_preset_scroll_circle_face));
 }
 
-static void widget_draw_vertex_buffer(unsigned int pos, unsigned int col, int mode,
+static void widget_draw_vertex_buffer(uint pos, uint col, int mode,
                                       const float quads_pos[WIDGET_SIZE_MAX][2],
-                                      const unsigned char quads_col[WIDGET_SIZE_MAX][4],
-                                      unsigned int totvert)
+                                      const uchar quads_col[WIDGET_SIZE_MAX][4],
+                                      uint totvert)
 {
        immBegin(mode, totvert);
        for (int i = 0; i < totvert; ++i) {
@@ -948,16 +944,23 @@ static void widget_draw_vertex_buffer(unsigned int pos, unsigned int col, int mo
 
 static void shape_preset_trias_from_rect_menu(uiWidgetTrias *tria, const rcti *rect)
 {
+       float width = BLI_rcti_size_x(rect);
+       float height = BLI_rcti_size_y(rect);
        float centx, centy, size;
-       int a;
+
        tria->type = ROUNDBOX_TRIA_MENU;
 
-       /* center position and size */
-       tria->center[0] = centx = rect->xmax - 0.32f * BLI_rcti_size_y(rect);
-       tria->center[1] = centy = rect->ymin + 0.50f * BLI_rcti_size_y(rect);
-       tria->size = size = 0.4f * BLI_rcti_size_y(rect);
+       /* Center position and size. */
+       tria->center[0] = centx = rect->xmin + 0.52f * BLI_rcti_size_y(rect);
+       tria->center[1] = centy = rect->ymin + 0.52f * BLI_rcti_size_y(rect);
+       tria->size = size = 0.4f * height;
 
-       for (a = 0; a < 6; a++) {
+       if (width > height * 1.1f) {
+               /* For wider buttons align tighter to the right. */
+               tria->center[0] = centx = rect->xmax - 0.32f * height;
+       }
+
+       for (int a = 0; a < 6; a++) {
                tria->vec[a][0] = size * g_shape_preset_menu_arrow_vert[a][0] + centx;
                tria->vec[a][1] = size * g_shape_preset_menu_arrow_vert[a][1] + centy;
        }
@@ -969,15 +972,15 @@ static void shape_preset_trias_from_rect_menu(uiWidgetTrias *tria, const rcti *r
 static void shape_preset_trias_from_rect_checkmark(uiWidgetTrias *tria, const rcti *rect)
 {
        float centx, centy, size;
-       int a;
+
        tria->type = ROUNDBOX_TRIA_CHECK;
 
-       /* center position and size */
+       /* Center position and size. */
        tria->center[0] = centx = rect->xmin + 0.5f * BLI_rcti_size_y(rect);
        tria->center[1] = centy = rect->ymin + 0.5f * BLI_rcti_size_y(rect);
        tria->size = size = 0.5f * BLI_rcti_size_y(rect);
 
-       for (a = 0; a < 6; a++) {
+       for (int a = 0; a < 6; a++) {
                tria->vec[a][0] = size * g_shape_preset_checkmark_vert[a][0] + centx;
                tria->vec[a][1] = size * g_shape_preset_checkmark_vert[a][1] + centy;
        }
@@ -1003,7 +1006,7 @@ static void shadecolors4(char coltop[4], char coldown[4], const char *color, sho
        coldown[3] = color[3];
 }
 
-static void round_box_shade_col4_r(unsigned char r_col[4], const char col1[4], const char col2[4], const float fac)
+static void round_box_shade_col4_r(uchar r_col[4], const char col1[4], const char col2[4], const float fac)
 {
        const int faci = unit_float_to_uchar_clamp(fac);
        const int facm = 255 - faci;
@@ -1025,7 +1028,7 @@ static void widget_verts_to_triangle_strip(uiWidgetBase *wtb, const int totvert,
        copy_v2_v2(triangle_strip[a * 2 + 1], wtb->inner_v[0]);
 }
 
-static void widgetbase_outline(uiWidgetBase *wtb, unsigned int pos)
+static void widgetbase_outline(uiWidgetBase *wtb, uint pos)
 {
        float triangle_strip[WIDGET_SIZE_MAX * 2 + 2][2]; /* + 2 because the last pair is wrapped */
        widget_verts_to_triangle_strip(wtb, wtb->totvert, triangle_strip);
@@ -1064,10 +1067,10 @@ static void widgetbase_set_uniform_discard_factor(
 
 static void widgetbase_set_uniform_colors_ubv(
         uiWidgetBase *wtb,
-        const unsigned char *col1, const unsigned char *col2,
-        const unsigned char *outline,
-        const unsigned char *emboss,
-        const unsigned char *tria,
+        const uchar *col1, const uchar *col2,
+        const uchar *outline,
+        const uchar *emboss,
+        const uchar *tria,
         const bool alpha_check)
 {
        widgetbase_set_uniform_alpha_check(wtb, alpha_check);
@@ -1181,11 +1184,11 @@ static void widgetbase_draw_ex(
         uiWidgetBase *wtb, const uiWidgetColors *wcol,
         bool show_alpha_checkers)
 {
-       unsigned char inner_col1[4] = {0};
-       unsigned char inner_col2[4] = {0};
-       unsigned char emboss_col[4] = {0};
-       unsigned char outline_col[4] = {0};
-       unsigned char tria_col[4] = {0};
+       uchar inner_col1[4] = {0};
+       uchar inner_col2[4] = {0};
+       uchar emboss_col[4] = {0};
+       uchar outline_col[4] = {0};
+       uchar tria_col[4] = {0};
        /* For color widget. */
        if (wcol->shaded != 0) {
                show_alpha_checkers = false;
@@ -1197,10 +1200,10 @@ static void widgetbase_draw_ex(
        if (wtb->draw_inner) {
                if (wcol->shaded == 0) {
                        /* simple fill */
-                       inner_col1[0] = inner_col2[0] = (unsigned char)wcol->inner[0];
-                       inner_col1[1] = inner_col2[1] = (unsigned char)wcol->inner[1];
-                       inner_col1[2] = inner_col2[2] = (unsigned char)wcol->inner[2];
-                       inner_col1[3] = inner_col2[3] = (unsigned char)wcol->inner[3];
+                       inner_col1[0] = inner_col2[0] = (uchar)wcol->inner[0];
+                       inner_col1[1] = inner_col2[1] = (uchar)wcol->inner[1];
+                       inner_col1[2] = inner_col2[2] = (uchar)wcol->inner[2];
+                       inner_col1[3] = inner_col2[3] = (uchar)wcol->inner[3];
                }
                else {
                        /* gradient fill */
@@ -1224,7 +1227,7 @@ static void widgetbase_draw_ex(
                tria_col[0] = wcol->item[0];
                tria_col[1] = wcol->item[1];
                tria_col[2] = wcol->item[2];
-               tria_col[3] = (unsigned char)((float)wcol->item[3] / WIDGET_AA_JITTER);
+               tria_col[3] = (uchar)((float)wcol->item[3] / WIDGET_AA_JITTER);
        }
 
        /* Draw everything in one drawcall */
@@ -1401,7 +1404,7 @@ static void ui_text_clip_give_next_off(uiBut *but, const char *str)
  * 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 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;
@@ -1435,13 +1438,14 @@ static void ui_text_clip_right_ex(
  * 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 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 ellipsis... */
+        * Better to have a small piece of the last char cut out,
+        * than two remaining chars replaced by an ellipsis... */
        okwidth += 1.0f + UI_DPI_FAC;
 
        BLI_assert(str[0]);
@@ -1456,7 +1460,8 @@ float UI_text_clip_middle_ex(
        strwidth = BLF_width(fstyle->uifont_id, str, max_len);
 
        if ((okwidth > 0.0f) && (strwidth > okwidth)) {
-               /* utf8 two-dots leader '..' (shorter than ellipsis '...'), some compilers complain with real litteral string. */
+               /* utf8 two-dots leader '..' (shorter than ellipsis '...'),
+                * some compilers complain with real litteral string. */
                const char sep[] = {0xe2, 0x80, 0xA5, 0x0};
                const int sep_len = sizeof(sep) - 1;
                const float sep_strwidth = BLF_width(fstyle->uifont_id, sep, sep_len + 1);
@@ -1520,7 +1525,8 @@ float UI_text_clip_middle_ex(
                        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'! */
+                               /* -1 to remove trailing '\0'! */
+                               final_lpart_len = (size_t)(l_end + sep_len + r_len - 1);
 
                                while (BLF_width(fstyle->uifont_id, str, max_len) > okwidth) {
                                        /* This will happen because a lot of string width processing is done in integer pixels,
@@ -1555,7 +1561,7 @@ float UI_text_clip_middle_ex(
 /**
  * Wrapper around UI_text_clip_middle_ex.
  */
-static void ui_text_clip_middle(uiFontStyle *fstyle, uiBut *but, const rcti *rect)
+static void ui_text_clip_middle(const uiFontStyle *fstyle, uiBut *but, const rcti *rect)
 {
        /* No margin for labels! */
        const int border = ELEM(but->type, UI_BTYPE_LABEL, UI_BTYPE_MENU, UI_BTYPE_POPOVER) ? 0 : (int)(UI_TEXT_CLIP_MARGIN + 0.5f);
@@ -1571,7 +1577,7 @@ static void ui_text_clip_middle(uiFontStyle *fstyle, uiBut *but, const rcti *rec
  * 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 rsep)
+static void ui_text_clip_middle_protect_right(const uiFontStyle *fstyle, uiBut *but, const rcti *rect, const char rsep)
 {
        /* No margin for labels! */
        const int border = ELEM(but->type, UI_BTYPE_LABEL, UI_BTYPE_MENU, UI_BTYPE_POPOVER) ? 0 : (int)(UI_TEXT_CLIP_MARGIN + 0.5f);
@@ -1586,7 +1592,7 @@ static void ui_text_clip_middle_protect_right(uiFontStyle *fstyle, uiBut *but, c
 /**
  * Cut off the text, taking into account the cursor location (text display while editing).
  */
-static void ui_text_clip_cursor(uiFontStyle *fstyle, uiBut *but, const rcti *rect)
+static void ui_text_clip_cursor(const uiFontStyle *fstyle, uiBut *but, const rcti *rect)
 {
        const int border = (int)(UI_TEXT_CLIP_MARGIN + 0.5f);
        const int okwidth = max_ii(BLI_rcti_size_x(rect) - border, 0);
@@ -1648,7 +1654,7 @@ static void ui_text_clip_cursor(uiFontStyle *fstyle, uiBut *but, const rcti *rec
  *
  * \note deals with ': ' especially for number buttons
  */
-static void ui_text_clip_right_label(uiFontStyle *fstyle, uiBut *but, const rcti *rect)
+static void ui_text_clip_right_label(const uiFontStyle *fstyle, uiBut *but, const rcti *rect)
 {
        const int border = UI_TEXT_CLIP_MARGIN + 1;
        const int okwidth = max_ii(BLI_rcti_size_x(rect) - border, 0);
@@ -1683,7 +1689,8 @@ static void ui_text_clip_right_label(uiFontStyle *fstyle, uiBut *but, const rcti
                        const char *prev_utf8 = BLI_str_find_prev_char_utf8(but->drawstr, cp2);
                        int bytes = cp2 - prev_utf8;
 
-                       /* shift the text after and including cp2 back by 1 char, +1 to include null terminator */
+                       /* shift the text after and including cp2 back by 1 char,
+                        * +1 to include null terminator */
                        memmove(cp2 - bytes, cp2, drawstr_len + 1);
                        cp2 -= bytes;
 
@@ -1766,7 +1773,7 @@ static void widget_draw_text_ime_underline(
 }
 #endif  /* WITH_INPUT_IME */
 
-static void widget_draw_text(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *but, rcti *rect)
+static void widget_draw_text(const uiFontStyle *fstyle, const uiWidgetColors *wcol, uiBut *but, rcti *rect)
 {
        int drawstr_left_len = UI_MAX_DRAW_STR;
        const char *drawstr = but->drawstr;
@@ -1779,12 +1786,16 @@ static void widget_draw_text(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *b
 
        UI_fontstyle_set(fstyle);
 
-       if (but->editstr || (but->drawflag & UI_BUT_TEXT_LEFT))
-               fstyle->align = UI_STYLE_TEXT_LEFT;
-       else if (but->drawflag & UI_BUT_TEXT_RIGHT)
-               fstyle->align = UI_STYLE_TEXT_RIGHT;
-       else
-               fstyle->align = UI_STYLE_TEXT_CENTER;
+       eFontStyle_Align align;
+       if (but->editstr || (but->drawflag & UI_BUT_TEXT_LEFT)) {
+               align = UI_STYLE_TEXT_LEFT;
+       }
+       else if (but->drawflag & UI_BUT_TEXT_RIGHT) {
+               align = UI_STYLE_TEXT_RIGHT;
+       }
+       else {
+               align = UI_STYLE_TEXT_CENTER;
+       }
 
        if (fstyle->kerning == 1) /* for BLF_width */
                BLF_enable(fstyle->uifont_id, BLF_KERNING_DEFAULT);
@@ -1796,7 +1807,7 @@ static void widget_draw_text(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *b
                uiBut *but_edit = ui_but_drag_multi_edit_get(but);
                if (but_edit) {
                        drawstr = but_edit->editstr;
-                       fstyle->align = UI_STYLE_TEXT_LEFT;
+                       align = UI_STYLE_TEXT_LEFT;
                }
        }
        else {
@@ -1852,7 +1863,7 @@ static void widget_draw_text(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *b
                                uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_I32, 2, GPU_FETCH_INT_TO_FLOAT);
                                immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
 
-                               immUniformColor4ubv((unsigned char *)wcol->item);
+                               immUniformColor4ubv((uchar *)wcol->item);
                                immRecti(pos, rect->xmin + selsta_draw,
                                         rect->ymin + 2,
                                         min_ii(rect->xmin + selwidth_draw, rect->xmax - 2),
@@ -1964,8 +1975,10 @@ static void widget_draw_text(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *b
                int drawlen = (drawstr_left_len == INT_MAX) ? strlen(drawstr + but->ofs) : (drawstr_left_len - but->ofs);
 
                if (drawlen > 0) {
-                       UI_fontstyle_draw_ex(fstyle, rect, drawstr + but->ofs, (unsigned char *)wcol->text,
-                                            drawlen, &font_xofs, &font_yofs);
+                       UI_fontstyle_draw_ex(
+                               fstyle, rect, drawstr + but->ofs, (uchar *)wcol->text,
+                               &(struct uiFontStyleDraw_Params) { .align = align, },
+                               drawlen, &font_xofs, &font_yofs);
 
                        if (but->menu_key != '\0') {
                                char fixedbuf[128];
@@ -1991,7 +2004,7 @@ static void widget_draw_text(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *b
                                        ul_advance = BLF_width(fstyle->uifont_id, fixedbuf, ul_index) + (1.0f * UI_DPI_FAC);
 
                                        BLF_position(fstyle->uifont_id, rect->xmin + font_xofs + ul_advance, rect->ymin + font_yofs, 0.0f);
-                                       BLF_color4ubv(fstyle->uifont_id, (unsigned char *)wcol->text);
+                                       BLF_color4ubv(fstyle->uifont_id, (uchar *)wcol->text);
                                        BLF_draw(fstyle->uifont_id, "_", 2);
 
                                        if (fstyle->kerning == 1) {
@@ -2010,9 +2023,10 @@ static void widget_draw_text(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *b
                        col[3] *= 0.5f;
                }
 
-               fstyle->align = UI_STYLE_TEXT_RIGHT;
                rect->xmax -= UI_TEXT_CLIP_MARGIN;
-               UI_fontstyle_draw(fstyle, rect, drawstr_right, (const uchar *)col);
+               UI_fontstyle_draw(
+                       fstyle, rect, drawstr_right, (const uchar *)col,
+                       &(struct uiFontStyleDraw_Params) { .align = UI_STYLE_TEXT_RIGHT, });
        }
 }
 
@@ -2032,7 +2046,7 @@ static BIFIconID widget_icon_id(uiBut *but)
 }
 
 /* draws text and icons for buttons */
-static void widget_draw_text_icon(uiFontStyle *fstyle, uiWidgetColors *wcol, uiBut *but, rcti *rect)
+static void widget_draw_text_icon(const uiFontStyle *fstyle, const uiWidgetColors *wcol, uiBut *but, rcti *rect)
 {
        const uiButExtraIconType extra_icon_type = ui_but_icon_extra_get(but);
        const bool show_menu_icon = ui_but_draw_menu_icon(but);
@@ -2309,7 +2323,8 @@ static void widget_state(uiWidgetType *wt, int state, int drawflag)
 static void widget_state_numslider(uiWidgetType *wt, int state, int drawflag)
 {
        uiWidgetStateColors *wcol_state = wt->wcol_state;
-       float blend = wcol_state->blend - 0.2f; /* XXX special tweak to make sure that bar will still be visible */
+       /* XXX special tweak to make sure that bar will still be visible */
+       float blend = wcol_state->blend - 0.2f;
 
        /* call this for option button */
        widget_state(wt, state, drawflag);
@@ -2570,7 +2585,7 @@ void ui_hsvcircle_pos_from_vals(uiBut *but, const rcti *rect, float *hsv, float
        *ypos = centy + sinf(-ang) * radius;
 }
 
-static void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, const rcti *rect)
+static void ui_draw_but_HSVCIRCLE(uiBut *but, const uiWidgetColors *wcol, const rcti *rect)
 {
        /* TODO(merwin): reimplement as shader for pixel-perfect colors */
 
@@ -2581,23 +2596,16 @@ static void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, const rcti *
        float radius = (float)min_ii(BLI_rcti_size_x(rect), BLI_rcti_size_y(rect)) / 2.0f;
 
        ColorPicker *cpicker = but->custom_data;
-       const float *hsv_ptr = cpicker->color_data;
-       float rgb[3], hsvo[3], hsv[3], col[3], colcent[3];
-       bool color_profile = ui_but_is_colorpicker_display_space(but);
+       float rgb[3], hsv[3], rgb_center[3];
+       bool is_color_gamma = ui_but_is_color_gamma(but);
 
-       /* color */
-       ui_but_v3_get(but, rgb);
-
-       /* since we use compat functions on both 'hsv' and 'hsvo', they need to be initialized */
-       hsvo[0] = hsv[0] = hsv_ptr[0];
-       hsvo[1] = hsv[1] = hsv_ptr[1];
-       hsvo[2] = hsv[2] = hsv_ptr[2];
-
-       if (color_profile)
-               ui_block_cm_to_display_space_v3(but->block, rgb);
+       /* Initialize for compatibility. */
+       copy_v3_v3(hsv, cpicker->color_data);
 
+       /* Compute current hue. */
+       ui_but_v3_get(but, rgb);
+       ui_scene_linear_to_color_picker_space(but, rgb);
        ui_rgb_to_color_picker_compat_v(rgb, hsv);
-       copy_v3_v3(hsvo, hsv);
 
        CLAMP(hsv[2], 0.0f, 1.0f); /* for display only */
 
@@ -2611,7 +2619,13 @@ static void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, const rcti *
                        hsv[2] = 0.5f;
        }
 
-       ui_color_picker_to_rgb(0.0f, 0.0f, hsv[2], colcent, colcent + 1, colcent + 2);
+       const float hsv_center[3] = {0.0f, 0.0f, hsv[2]};
+       ui_color_picker_to_rgb_v(hsv_center, rgb_center);
+       ui_color_picker_to_scene_linear_space(but, rgb_center);
+
+       if (!is_color_gamma) {
+               ui_block_cm_to_display_space_v3(but->block, rgb_center);
+       }
 
        GPUVertFormat *format = immVertexFormat();
        uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
@@ -2620,19 +2634,27 @@ static void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, const rcti *
        immBindBuiltinProgram(GPU_SHADER_2D_SMOOTH_COLOR);
 
        immBegin(GPU_PRIM_TRI_FAN, tot + 2);
-       immAttr3fv(color, colcent);
+       immAttr3fv(color, rgb_center);
        immVertex2f(pos, centx, centy);
 
        float ang = 0.0f;
        for (int a = 0; a <= tot; a++, ang += radstep) {
                float si = sinf(ang);
                float co = cosf(ang);
+               float hsv_ang[3];
+               float rgb_ang[3];
+
+               ui_hsvcircle_vals_from_pos(hsv_ang, hsv_ang + 1, rect, centx + co * radius, centy + si * radius);
+               hsv_ang[2] = hsv[2];
 
-               ui_hsvcircle_vals_from_pos(hsv, hsv + 1, rect, centx + co * radius, centy + si * radius);
+               ui_color_picker_to_rgb_v(hsv_ang, rgb_ang);
+               ui_color_picker_to_scene_linear_space(but, rgb_ang);
 
-               ui_color_picker_to_rgb_v(hsv, col);
+               if (!is_color_gamma) {
+                       ui_block_cm_to_display_space_v3(but->block, rgb_ang);
+               }
 
-               immAttr3fv(color, col);
+               immAttr3fv(color, rgb_ang);
                immVertex2f(pos, centx + co * radius, centy + si * radius);
        }
        immEnd();
@@ -2647,7 +2669,7 @@ static void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, const rcti *
        GPU_blend(true);
        GPU_line_smooth(true);
 
-       immUniformColor3ubv((unsigned char *)wcol->outline);
+       immUniformColor3ubv((uchar *)wcol->outline);
        imm_draw_circle_wire_2d(pos, centx, centy, radius, tot);
 
        immUnbindProgram();
@@ -2656,8 +2678,13 @@ static void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, const rcti *
        GPU_line_smooth(false);
 
        /* cursor */
+       copy_v3_v3(hsv, cpicker->color_data);
+       ui_but_v3_get(but, rgb);
+       ui_scene_linear_to_color_picker_space(but, rgb);
+       ui_rgb_to_color_picker_compat_v(rgb, hsv);
+
        float xpos, ypos;
-       ui_hsvcircle_pos_from_vals(but, rect, hsvo, &xpos, &ypos);
+       ui_hsvcircle_pos_from_vals(but, rect, hsv, &xpos, &ypos);
        ui_hsv_cursor(xpos, ypos);
 }
 
@@ -2730,7 +2757,9 @@ void ui_draw_gradient(const rcti *rect, const float hsv[3], const int type, cons
        immBindBuiltinProgram(GPU_SHADER_2D_SMOOTH_COLOR);
 
        immBegin(GPU_PRIM_TRIS, steps * 3 * 6);
-       for (dx = 0.0f; dx < 0.999f; dx += color_step) { /* 0.999 = prevent float inaccuracy for steps */
+
+       /* 0.999 = prevent float inaccuracy for steps */
+       for (dx = 0.0f; dx < 0.999f; dx += color_step) {
                const float dx_next = dx + color_step;
 
                /* previous color */
@@ -2812,18 +2841,6 @@ void ui_draw_gradient(const rcti *rect, const float hsv[3], const int type, cons
        immUnbindProgram();
 }
 
-bool ui_but_is_colorpicker_display_space(uiBut *but)
-{
-       bool color_profile = but->block->color_profile;
-
-       if (but->rnaprop) {
-               if (RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA)
-                       color_profile = false;
-       }
-
-       return color_profile;
-}
-
 void ui_hsvcube_pos_from_vals(uiBut *but, const rcti *rect, float *hsv, float *xp, float *yp)
 {
        float x = 0.0f, y = 0.0f;
@@ -2865,15 +2882,12 @@ static void ui_draw_but_HSVCUBE(uiBut *but, const rcti *rect)
        ColorPicker *cpicker = but->custom_data;
        float *hsv = cpicker->color_data;
        float hsv_n[3];
-       bool use_display_colorspace = ui_but_is_colorpicker_display_space(but);
 
+       /* Initialize for compatibility. */
        copy_v3_v3(hsv_n, hsv);
 
        ui_but_v3_get(but, rgb);
-
-       if (use_display_colorspace)
-               ui_block_cm_to_display_space_v3(but->block, rgb);
-
+       ui_scene_linear_to_color_picker_space(but, rgb);
        rgb_to_hsv_compat_v(rgb, hsv_n);
 
        ui_draw_gradient(rect, hsv_n, but->a1, 1.0f);
@@ -2901,15 +2915,9 @@ static void ui_draw_but_HSV_v(uiBut *but, const rcti *rect)
        const float rad = wcol->roundness * BLI_rcti_size_x(rect);
        float x, y;
        float rgb[3], hsv[3], v;
-       bool color_profile = but->block->color_profile;
-
-       if (but->rnaprop && RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA)
-               color_profile = false;
 
        ui_but_v3_get(but, rgb);
-
-       if (color_profile)
-               ui_block_cm_to_display_space_v3(but->block, rgb);
+       ui_scene_linear_to_color_picker_space(but, rgb);
 
        if (but->a1 == UI_GRAD_L_ALT)
                rgb_to_hsl_v(rgb, hsv);
@@ -2920,9 +2928,6 @@ static void ui_draw_but_HSV_v(uiBut *but, const rcti *rect)
        /* map v from property range to [0,1] */
        if (but->a1 == UI_GRAD_V_ALT) {
                float min = but->softmin, max = but->softmax;
-               if (color_profile) {
-                       ui_block_cm_to_display_space_range(but->block, &min, &max);
-               }
                v = (v - min) / (max - min);
        }
 
@@ -2972,14 +2977,14 @@ static void ui_draw_roundbox(const rcti *rect, const float rad, const uiWidgetCo
 
 
 /* ************ separator, for menus etc ***************** */
-static void ui_draw_separator(const rcti *rect,  uiWidgetColors *wcol)
+static void ui_draw_separator(const rcti *rect, const uiWidgetColors *wcol)
 {
        int y = rect->ymin + BLI_rcti_size_y(rect) / 2 - 1;
-       unsigned char col[4] = {
+       uchar col[4] = {
                wcol->text[0],
                wcol->text[1],
                wcol->text[2],
-               30
+               30,
        };
 
        uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
@@ -3364,7 +3369,8 @@ static void widget_numslider(uiBut *but, uiWidgetColors *wcol, rcti *rect, int s
        wtb.draw_inner = false;
        widgetbase_draw(&wtb, wcol);
 
-       /* Add space at either side of the button so text aligns with numbuttons (which have arrow icons). */
+       /* Add space at either side of the button so text aligns with numbuttons
+        * (which have arrow icons). */
        if (!(state & UI_STATE_TEXT_INPUT)) {
                rect->xmax -= toffs;
                rect->xmin += toffs;
@@ -3378,16 +3384,12 @@ static void widget_swatch(uiBut *but, uiWidgetColors *wcol, rcti *rect, int stat
 {
        uiWidgetBase wtb;
        float rad, col[4];
-       bool color_profile = but->block->color_profile;
 
        col[3] = 1.0f;
 
        if (but->rnaprop) {
                BLI_assert(but->rnaindex == -1);
 
-               if (RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA)
-                       color_profile = false;
-
                if (RNA_property_array_length(&but->rnapoin, but->rnaprop) == 4) {
                        col[3] = RNA_property_float_get_index(&but->rnapoin, but->rnaprop, 3);
                }
@@ -3401,7 +3403,8 @@ static void widget_swatch(uiBut *but, uiWidgetColors *wcol, rcti *rect, int stat
        ui_but_v3_get(but, col);
 
        if ((state & (UI_BUT_ANIMATED | UI_BUT_ANIMATED_KEY | UI_BUT_DRIVEN | UI_BUT_OVERRIDEN | UI_BUT_REDALERT)) ||
-           (but->drawflag & UI_BUT_ANIMATED_CHANGED)) {
+           (but->drawflag & UI_BUT_ANIMATED_CHANGED))
+       {
                /* draw based on state - color for keyed etc */
                widgetbase_draw(&wtb, wcol);
 
@@ -3414,10 +3417,10 @@ static void widget_swatch(uiBut *but, uiWidgetColors *wcol, rcti *rect, int stat
                round_box_edges(&wtb, roundboxalign, rect, rad);
        }
 
-       if (color_profile)
+       if (!ui_but_is_color_gamma(but))
                ui_block_cm_to_display_space_v3(but->block, col);
 
-       rgba_float_to_uchar((unsigned char *)wcol->inner, col);
+       rgba_float_to_uchar((uchar *)wcol->inner, col);
        const bool show_alpha_checkers = (wcol->inner[3] < 255);
 
        wcol->shaded = 0;
@@ -3663,9 +3666,9 @@ static void widget_state_label(uiWidgetType *wt, int state, int drawflag)
                /* call this for option button */
                widget_state(wt, state, drawflag);
                if (state & UI_SELECT)
-                       UI_GetThemeColor3ubv(TH_TEXT_HI, (unsigned char *)wt->wcol.text);
+                       UI_GetThemeColor3ubv(TH_TEXT_HI, (uchar *)wt->wcol.text);
                else
-                       UI_GetThemeColor3ubv(TH_TEXT, (unsigned char *)wt->wcol.text);
+                       UI_GetThemeColor3ubv(TH_TEXT, (uchar *)wt->wcol.text);
        }
 
        if (state & UI_BUT_REDALERT) {
@@ -3764,21 +3767,22 @@ static void widget_tab(uiWidgetColors *wcol, rcti *rect, int state, int roundbox
        const float rad = wcol->roundness * U.widget_unit;
        const bool is_active = (state & UI_SELECT);
 
-/* Draw shaded outline - Disabled for now, seems incorrect and also looks nicer without it imho ;) */
+/* Draw shaded outline - Disabled for now,
+ * seems incorrect and also looks nicer without it imho ;) */
 //#define USE_TAB_SHADED_HIGHLIGHT
 
        uiWidgetBase wtb;
-       unsigned char theme_col_tab_highlight[3];
+       uchar theme_col_tab_highlight[3];
 
 #ifdef USE_TAB_SHADED_HIGHLIGHT
        /* create outline highlight colors */
        if (is_active) {
-               interp_v3_v3v3_uchar(theme_col_tab_highlight, (unsigned char *)wcol->inner_sel,
-                                    (unsigned char *)wcol->outline, 0.2f);
+               interp_v3_v3v3_uchar(theme_col_tab_highlight, (uchar *)wcol->inner_sel,
+                                    (uchar *)wcol->outline, 0.2f);
        }
        else {
-               interp_v3_v3v3_uchar(theme_col_tab_highlight, (unsigned char *)wcol->inner,
-                                    (unsigned char *)wcol->outline, 0.12f);
+               interp_v3_v3v3_uchar(theme_col_tab_highlight, (uchar *)wcol->inner,
+                                    (uchar *)wcol->outline, 0.12f);
        }
 #endif
 
@@ -3800,7 +3804,7 @@ static void widget_tab(uiWidgetColors *wcol, rcti *rect, int state, int roundbox
 
 #ifdef USE_TAB_SHADED_HIGHLIGHT
        /* draw outline (3d look) */
-       ui_draw_but_TAB_outline(rect, rad, theme_col_tab_highlight, (unsigned char *)wcol->inner);
+       ui_draw_but_TAB_outline(rect, rad, theme_col_tab_highlight, (uchar *)wcol->inner);
 #endif
 
 #ifndef USE_TAB_SHADED_HIGHLIGHT
@@ -3814,7 +3818,7 @@ static void widget_draw_extra_mask(const bContext *C, uiBut *but, uiWidgetType *
        uiWidgetColors *wcol = &btheme->tui.wcol_radio;
        uiWidgetBase wtb;
        const float rad = wcol->roundness * U.widget_unit;
-       unsigned char col[4];
+       uchar col[4];
 
        /* state copy! */
        wt->wcol = *(wt->wcol_theme);
@@ -4083,8 +4087,8 @@ static int widget_roundbox_set(uiBut *but, rcti *rect)
 void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rcti *rect)
 {
        bTheme *btheme = UI_GetTheme();
-       ThemeUI *tui = &btheme->tui;
-       uiFontStyle *fstyle = &style->widget;
+       const ThemeUI *tui = &btheme->tui;
+       const uiFontStyle *fstyle = &style->widget;
        uiWidgetType *wt = NULL;
 
 #ifdef USE_UI_POPOVER_ONCE
@@ -4253,7 +4257,8 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct
                                break;
 
                        case UI_BTYPE_HSVCUBE:
-                               if (ELEM(but->a1, UI_GRAD_V_ALT, UI_GRAD_L_ALT)) {  /* vertical V slider, uses new widget draw now */
+                               if (ELEM(but->a1, UI_GRAD_V_ALT, UI_GRAD_L_ALT)) {
+                                       /* vertical V slider, uses new widget draw now */
                                        ui_draw_but_HSV_v(but, rect);
                                }
                                else {  /* other HSV pickers... */
@@ -4402,7 +4407,7 @@ static void ui_draw_clip_tri(uiBlock *block, rcti *rect, uiWidgetType *wt)
 {
        if (block) {
                float draw_color[4];
-               unsigned char *color = (unsigned char *)wt->wcol.text;
+               uchar *color = (uchar *)wt->wcol.text;
 
                draw_color[0] = ((float)color[0]) / 255.0f;
                draw_color[1] = ((float)color[1]) / 255.0f;
@@ -4466,7 +4471,7 @@ static void ui_draw_popover_back_impl(
        if (ELEM(direction, UI_DIR_UP, UI_DIR_DOWN)) {
                uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
                immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
-               immUniformColor4ubv((unsigned char *)wcol->inner);
+               immUniformColor4ubv((uchar *)wcol->inner);
                GPU_blend(true);
                immBegin(GPU_PRIM_TRIS, 3);
                if (direction == UI_DIR_DOWN) {
@@ -4517,8 +4522,8 @@ static void draw_disk_shaded(
        float s, c;
        float y1, y2;
        float fac;
-       unsigned char r_col[4];
-       unsigned int pos, col;
+       uchar r_col[4];
+       uint pos, col;
 
        GPUVertFormat *format = immVertexFormat();
        pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
@@ -4528,7 +4533,7 @@ static void draw_disk_shaded(
        }
        else {
                immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
-               immUniformColor4ubv((unsigned char *)col1);
+               immUniformColor4ubv((uchar *)col1);
        }
 
        immBegin(GPU_PRIM_TRI_STRIP, subd * 2);
@@ -4603,7 +4608,7 @@ void ui_draw_pie_center(uiBlock *block)
        GPUVertFormat *format = immVertexFormat();
        uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
        immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
-       immUniformColor4ubv((unsigned char *)btheme->tui.wcol_pie_menu.outline);
+       immUniformColor4ubv((uchar *)btheme->tui.wcol_pie_menu.outline);
 
        imm_draw_circle_wire_2d(pos, 0.0f, 0.0f, pie_radius_internal, subd);
        imm_draw_circle_wire_2d(pos, 0.0f, 0.0f, pie_radius_external, subd);
@@ -4627,7 +4632,7 @@ void ui_draw_pie_center(uiBlock *block)
 }
 
 
-uiWidgetColors *ui_tooltip_get_theme(void)
+const uiWidgetColors *ui_tooltip_get_theme(void)
 {
        uiWidgetType *wt = widget_type(UI_WTYPE_TOOLTIP);
        return wt->wcol_theme;
@@ -4652,7 +4657,7 @@ void ui_draw_widget_back_color(
        rcti rect_copy = *rect;
        wt->state(wt, 0, 0);
        if (color) {
-               rgba_float_to_uchar((unsigned char *)wt->wcol.inner, color);
+               rgba_float_to_uchar((uchar *)wt->wcol.inner, color);
        }
        wt->draw(&wt->wcol, &rect_copy, 0, UI_CNR_ALL);
 }
@@ -4671,7 +4676,7 @@ void ui_draw_tooltip_background(uiStyle *UNUSED(style), uiBlock *UNUSED(block),
 
 /* helper call to draw a menu item without button */
 /* state: UI_ACTIVE or 0 */
-void ui_draw_menu_item(uiFontStyle *fstyle, rcti *rect, const char *name, int iconid, int state, bool use_sep)
+void ui_draw_menu_item(const uiFontStyle *fstyle, rcti *rect, const char *name, int iconid, int state, bool use_sep)
 {
        uiWidgetType *wt = widget_type(UI_WTYPE_MENU_ITEM);
        rcti _rect = *rect;
@@ -4681,7 +4686,6 @@ void ui_draw_menu_item(uiFontStyle *fstyle, rcti *rect, const char *name, int ic
        wt->draw(&wt->wcol, rect, 0, 0);
 
        UI_fontstyle_set(fstyle);
-       fstyle->align = UI_STYLE_TEXT_LEFT;
 
        /* text location offset */
        rect->xmin += 0.25f * UI_UNIT_X;
@@ -4719,15 +4723,18 @@ void ui_draw_menu_item(uiFontStyle *fstyle, rcti *rect, const char *name, int ic
                        UI_text_clip_middle_ex(fstyle, drawstr, okwidth, minwidth, max_len, '\0');
                }
 
-               UI_fontstyle_draw(fstyle, rect, drawstr, (unsigned char *)wt->wcol.text);
+               UI_fontstyle_draw(
+                       fstyle, rect, drawstr, (uchar *)wt->wcol.text,
+                       &(struct uiFontStyleDraw_Params) { .align = UI_STYLE_TEXT_LEFT, });
        }
 
        /* part text right aligned */
        if (use_sep) {
                if (cpoin) {
-                       fstyle->align = UI_STYLE_TEXT_RIGHT;
                        rect->xmax = _rect.xmax - 5;
-                       UI_fontstyle_draw(fstyle, rect, cpoin + 1, (unsigned char *)wt->wcol.text);
+                       UI_fontstyle_draw(
+                               fstyle, rect, cpoin + 1, (uchar *)wt->wcol.text,
+                               &(struct uiFontStyleDraw_Params) { .align = UI_STYLE_TEXT_RIGHT, });
                        *cpoin = UI_SEP_CHAR;
                }
        }
@@ -4744,12 +4751,13 @@ void ui_draw_menu_item(uiFontStyle *fstyle, rcti *rect, const char *name, int ic
                aspect = ICON_DEFAULT_HEIGHT / height;
 
                GPU_blend(true);
-               UI_icon_draw_aspect(xs, ys, iconid, aspect, 1.0f, wt->wcol.text); /* XXX scale weak get from fstyle? */
+               /* XXX scale weak get from fstyle? */
+               UI_icon_draw_aspect(xs, ys, iconid, aspect, 1.0f, wt->wcol.text);
                GPU_blend(false);
        }
 }
 
-void ui_draw_preview_item(uiFontStyle *fstyle, rcti *rect, const char *name, int iconid, int state)
+void ui_draw_preview_item(const uiFontStyle *fstyle, rcti *rect, const char *name, int iconid, int state)
 {
        rcti trect = *rect;
        const float text_size = UI_UNIT_Y;
@@ -4785,7 +4793,9 @@ void ui_draw_preview_item(uiFontStyle *fstyle, rcti *rect, const char *name, int
                BLI_strncpy(drawstr, name, sizeof(drawstr));
                UI_text_clip_middle_ex(fstyle, drawstr, okwidth, minwidth, max_len, '\0');
 
-               UI_fontstyle_draw(fstyle, &trect, drawstr, (unsigned char *)wt->wcol.text);
+               UI_fontstyle_draw(
+                       fstyle, &trect, drawstr, (uchar *)wt->wcol.text,
+                       &(struct uiFontStyleDraw_Params) { .align = UI_STYLE_TEXT_CENTER, });
        }
 }