From 0c2be4d8e853a4c38f073921e9f01a4a7eeae945 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 15 Sep 2015 21:22:33 +1000 Subject: Fix T46113: Color picker erratic outside 0-1 range --- source/blender/editors/interface/interface.c | 14 ++++++++++++++ source/blender/editors/interface/interface_handlers.c | 9 +++++++-- source/blender/editors/interface/interface_intern.h | 1 + source/blender/editors/interface/interface_widgets.c | 7 +++++-- 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index a39990ea060..e40e4f1a1dd 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -3123,6 +3123,20 @@ void ui_block_cm_to_scene_linear_v3(uiBlock *block, float pixel[3]) IMB_colormanagement_display_to_scene_linear_v3(pixel, display); } +void ui_block_cm_to_display_space_range(uiBlock *block, float *min, float *max) +{ + struct ColorManagedDisplay *display = ui_block_cm_display_get(block); + float pixel[3]; + + copy_v3_fl(pixel, *min); + IMB_colormanagement_scene_linear_to_display_v3(pixel, display); + *min = min_fff(UNPACK3(pixel)); + + copy_v3_fl(pixel, *max); + IMB_colormanagement_scene_linear_to_display_v3(pixel, display); + *max = max_fff(UNPACK3(pixel)); +} + /** * \brief ui_def_but is the function that draws many button types * diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 259e2e3a0c9..995dc198cf3 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -5200,11 +5200,16 @@ static bool ui_numedit_but_HSVCUBE( hsv[2] = y; break; case UI_GRAD_V_ALT: + { /* vertical 'value' strip */ - + float min = but->softmin, max = but->softmax; + if (use_display_colorspace) { + ui_block_cm_to_display_space_range(but->block, &min, &max); + } /* exception only for value strip - use the range set in but->min/max */ - hsv[2] = y * (but->softmax - but->softmin) + but->softmin; + hsv[2] = y * (max - min) + min; break; + } default: BLI_assert(0); break; diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h index 575eff50b1e..032efad885e 100644 --- a/source/blender/editors/interface/interface_intern.h +++ b/source/blender/editors/interface/interface_intern.h @@ -498,6 +498,7 @@ extern void ui_block_align_calc(uiBlock *block); extern struct ColorManagedDisplay *ui_block_cm_display_get(uiBlock *block); void ui_block_cm_to_display_space_v3(uiBlock *block, float pixel[3]); void ui_block_cm_to_scene_linear_v3(uiBlock *block, float pixel[3]); +void ui_block_cm_to_display_space_range(uiBlock *block, float *min, float *max); /* interface_regions.c */ diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index b98a29c5b56..369cfaa73a3 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -2587,8 +2587,11 @@ 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 range = but->softmax - but->softmin; - v = (v - but->softmin) / range; + 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); } widget_init(&wtb); -- cgit v1.2.3