From 25560a3734a18657518652366fe24ce4574d54ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20T=C3=B6nne?= Date: Wed, 20 Nov 2013 11:34:18 +0100 Subject: [PATCH] Fix T37545: SV+H color cube display changes H slider position when modifying S or V. The widget for the SV gradient was disabling display colorspace transform, but this was not happening for the H slider below, leading to varying H values used to calculate the slider position. --- .../editors/interface/interface_handlers.c | 27 ++++++------------- .../editors/interface/interface_intern.h | 1 + .../editors/interface/interface_widgets.c | 20 ++++++++++---- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 05d7700f634..2b8b7643f39 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -3879,8 +3879,8 @@ static bool ui_numedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data, float x, y; float mx_fl, my_fl; bool changed = true; - int color_profile = but->block->color_profile; - + bool use_display_colorspace = ui_hsvcube_use_display_colorspace(but); + ui_mouse_scale_warp(data, mx, my, &mx_fl, &my_fl, shift); #ifdef USE_CONT_MOUSE_CORRECT @@ -3892,14 +3892,9 @@ static bool ui_numedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data, } #endif - if (but->rnaprop) { - if (RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA) - color_profile = FALSE; - } - ui_get_but_vectorf(but, rgb); - if (color_profile && (int)but->a1 != UI_GRAD_SV) + if (use_display_colorspace) ui_block_to_display_space_v3(but->block, rgb); rgb_to_hsv_compat_v(rgb, hsv); @@ -3913,7 +3908,7 @@ static bool ui_numedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data, /* calculate original hsv again */ copy_v3_v3(rgb, data->origvec); - if (color_profile && (int)but->a1 != UI_GRAD_SV) + if (use_display_colorspace) ui_block_to_display_space_v3(but->block, rgb); copy_v3_v3(hsvo, ui_block_hsv_get(but->block)); @@ -3974,7 +3969,7 @@ static bool ui_numedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data, hsv_to_rgb_v(hsv, rgb); - if (color_profile && ((int)but->a1 != UI_GRAD_SV)) + if (use_display_colorspace) ui_block_to_scene_linear_v3(but->block, rgb); /* clamp because with color conversion we can exceed range [#34295] */ @@ -3997,17 +3992,11 @@ static void ui_ndofedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data, float *hsv = ui_block_hsv_get(but->block); float rgb[3]; float sensitivity = (shift ? 0.15f : 0.3f) * ndof->dt; - - int color_profile = but->block->color_profile; - - if (but->rnaprop) { - if (RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA) - color_profile = FALSE; - } + bool use_display_colorspace = ui_hsvcube_use_display_colorspace(but); ui_get_but_vectorf(but, rgb); - if (color_profile && (int)but->a1 != UI_GRAD_SV) + if (use_display_colorspace) ui_block_to_display_space_v3(but->block, rgb); rgb_to_hsv_compat_v(rgb, hsv); @@ -4055,7 +4044,7 @@ static void ui_ndofedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data, hsv_to_rgb_v(hsv, rgb); - if (color_profile && (int)but->a1 != UI_GRAD_SV) + if (use_display_colorspace) ui_block_to_scene_linear_v3(but->block, rgb); copy_v3_v3(data->vec, rgb); diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h index be0a2810d2e..5ecd1e55086 100644 --- a/source/blender/editors/interface/interface_intern.h +++ b/source/blender/editors/interface/interface_intern.h @@ -385,6 +385,7 @@ extern void ui_hsvcircle_vals_from_pos(float *val_rad, float *val_dist, const rc const float mx, const float my); extern void ui_hsvcircle_pos_from_vals(struct uiBut *but, const rcti *rect, float *hsv, float *xpos, float *ypos); extern void ui_hsvcube_pos_from_vals(struct uiBut *but, const rcti *rect, float *hsv, float *xp, float *yp); +bool ui_hsvcube_use_display_colorspace(struct uiBut *but); extern void ui_get_but_string_ex(uiBut *but, char *str, const size_t maxlen, const int float_precision); extern void ui_get_but_string(uiBut *but, char *str, const size_t maxlen); diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index c26998a7541..97dd4f59ff6 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -2146,6 +2146,19 @@ void ui_draw_gradient(const rcti *rect, const float hsv[3], const int type, cons } +bool ui_hsvcube_use_display_colorspace(uiBut *but) +{ + bool color_profile = but->block->color_profile; + + if (but->rnaprop) { + if (RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA) + color_profile = FALSE; + } + + /* SV+H gradient does not use display colorspace */ + return color_profile && !ELEM((int)but->a1, UI_GRAD_SV, UI_GRAD_H); +} + void ui_hsvcube_pos_from_vals(uiBut *but, const rcti *rect, float *hsv, float *xp, float *yp) { float x, y; @@ -2182,16 +2195,13 @@ static void ui_draw_but_HSVCUBE(uiBut *but, const rcti *rect) float x = 0.0f, y = 0.0f; float *hsv = ui_block_hsv_get(but->block); float hsv_n[3]; - int color_profile = but->block->color_profile; - - if (but->rnaprop && RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA) - color_profile = FALSE; + bool use_display_colorspace = ui_hsvcube_use_display_colorspace(but); copy_v3_v3(hsv_n, hsv); ui_get_but_vectorf(but, rgb); - if (color_profile && (int)but->a1 != UI_GRAD_SV) + if (use_display_colorspace) ui_block_to_display_space_v3(but->block, rgb); rgb_to_hsv_compat_v(rgb, hsv_n);