[Bf-blender-cvs] [27da43ba86a] master: UI: refactor color picker flags out of buttons

Campbell Barton noreply at git.blender.org
Fri Mar 22 05:46:52 CET 2019


Commit: 27da43ba86a8160a5bcb52b9d4a214f80800db25
Author: Campbell Barton
Date:   Fri Mar 22 14:01:11 2019 +1100
Branches: master
https://developer.blender.org/rB27da43ba86a8160a5bcb52b9d4a214f80800db25

UI: refactor color picker flags out of buttons

These are specialized color picker options which don't need to be
stored in the button (frees of flags for buttons too).

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

M	source/blender/editors/include/UI_interface.h
M	source/blender/editors/interface/interface_handlers.c
M	source/blender/editors/interface/interface_intern.h
M	source/blender/editors/interface/interface_templates.c
M	source/blender/editors/interface/interface_widgets.c

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

diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index d330014d277..45b379f42ee 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -181,7 +181,7 @@ enum {
 	UI_BUT_DRAG_LOCK       = 1 << 10,
 	/** grayed out and uneditable */
 	UI_BUT_DISABLED        = 1 << 11,
-	UI_BUT_COLOR_LOCK      = 1 << 12,
+
 	UI_BUT_ANIMATED        = 1 << 13,
 	UI_BUT_ANIMATED_KEY    = 1 << 14,
 	UI_BUT_DRIVEN          = 1 << 15,
@@ -193,10 +193,6 @@ enum {
 	UI_BUT_IMMEDIATE       = 1 << 20,
 	UI_BUT_NO_UTF8         = 1 << 21,
 
-	/** used to flag if color hsv-circle should keep luminance */
-	UI_BUT_VEC_SIZE_LOCK   = 1 << 22,
-	/** cubic saturation for the color wheel */
-	UI_BUT_COLOR_CUBIC     = 1 << 23,
 	/** This but is "inside" a list item (currently used to change theme colors). */
 	UI_BUT_LIST_ITEM       = 1 << 24,
 	/** edit this button as well as the active button (not just dragging) */
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 5c8099eb205..ed0a9192c8f 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -6130,7 +6130,7 @@ static bool ui_numedit_but_HSVCIRCLE(
 
 	/* exception, when using color wheel in 'locked' value state:
 	 * allow choosing a hue for black values, by giving a tiny increment */
-	if (but->flag & UI_BUT_COLOR_LOCK) {
+	if (cpicker->use_color_lock) {
 		if (U.color_picker_type == USER_CP_CIRCLE_HSV) { // lock
 			if (hsv[2] == 0.f) hsv[2] = 0.0001f;
 		}
@@ -6151,7 +6151,7 @@ static bool ui_numedit_but_HSVCIRCLE(
 		ui_rgb_to_color_picker_compat_v(rgbo, hsvo);
 
 		/* and original position */
-		ui_hsvcircle_pos_from_vals(but, &rect, hsvo, &xpos, &ypos);
+		ui_hsvcircle_pos_from_vals(cpicker, &rect, hsvo, &xpos, &ypos);
 
 		mx_fl = xpos - (data->dragstartx - mx_fl);
 		my_fl = ypos - (data->dragstarty - my_fl);
@@ -6160,8 +6160,9 @@ static bool ui_numedit_but_HSVCIRCLE(
 
 	ui_hsvcircle_vals_from_pos(hsv, hsv + 1, &rect, mx_fl, my_fl);
 
-	if ((but->flag & UI_BUT_COLOR_CUBIC) && (U.color_picker_type == USER_CP_CIRCLE_HSV))
+	if ((cpicker->use_color_cubic) && (U.color_picker_type == USER_CP_CIRCLE_HSV)) {
 		hsv[1] = 1.0f - sqrt3f(1.0f - hsv[1]);
+	}
 
 	if (snap != SNAP_OFF) {
 		ui_color_snap_hue(snap, &hsv[0]);
@@ -6169,8 +6170,10 @@ static bool ui_numedit_but_HSVCIRCLE(
 
 	ui_color_picker_to_rgb_v(hsv, rgb);
 
-	if ((but->flag & UI_BUT_VEC_SIZE_LOCK) && (rgb[0] || rgb[1] || rgb[2])) {
-		normalize_v3_length(rgb, but->a2);
+	if ((cpicker->use_luminosity_lock)) {
+		if (!is_zero_v3(rgb)) {
+			normalize_v3_length(rgb, cpicker->luminosity_lock_value);
+		}
 	}
 
 	ui_color_picker_to_scene_linear_space(but, rgb);
@@ -6224,7 +6227,7 @@ static void ui_ndofedit_but_HSVCIRCLE(
 
 	/* exception, when using color wheel in 'locked' value state:
 	 * allow choosing a hue for black values, by giving a tiny increment */
-	if (but->flag & UI_BUT_COLOR_LOCK) {
+	if (cpicker->use_color_lock) {
 		if (U.color_picker_type == USER_CP_CIRCLE_HSV) { // lock
 			if (hsv[2] == 0.f) hsv[2] = 0.0001f;
 		}
@@ -6242,8 +6245,10 @@ static void ui_ndofedit_but_HSVCIRCLE(
 
 	ui_color_picker_to_rgb_v(hsv, data->vec);
 
-	if ((but->flag & UI_BUT_VEC_SIZE_LOCK) && (data->vec[0] || data->vec[1] || data->vec[2])) {
-		normalize_v3_length(data->vec, but->a2);
+	if (cpicker->use_luminosity_lock) {
+		if (!is_zero_v3(data->vec)) {
+			normalize_v3_length(data->vec, cpicker->luminosity_lock_value);
+		}
 	}
 
 	ui_color_picker_to_scene_linear_space(but, data->vec);
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index 369a067f7a3..1ca83b929e7 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -341,6 +341,11 @@ typedef struct ColorPicker {
 	/** Initial color data (detect changes). */
 	float color_data_init[3];
 	bool is_init;
+	/** Cubic saturation for the color wheel. */
+	bool use_color_cubic;
+	bool use_color_lock;
+	bool use_luminosity_lock;
+	float luminosity_lock_value;
 } ColorPicker;
 
 typedef struct ColorPickerData {
@@ -506,8 +511,8 @@ extern void ui_but_v3_set(uiBut *but, const float vec[3]);
 extern void ui_hsvcircle_vals_from_pos(
         float *val_rad, float *val_dist, const rcti *rect,
         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);
+extern void ui_hsvcircle_pos_from_vals(const ColorPicker *cpicker, const rcti *rect, const float *hsv, float *xpos, float *ypos);
+extern void ui_hsvcube_pos_from_vals(const struct uiBut *but, const rcti *rect, const float *hsv, float *xp, float *yp);
 
 extern void ui_but_string_get_ex(
         uiBut *but, char *str, const size_t maxlen,
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index e63b4572894..f0763b71d7e 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -3347,20 +3347,17 @@ void uiTemplateColorPicker(
 
 	but->custom_data = cpicker;
 
-	if (lock) {
-		but->flag |= UI_BUT_COLOR_LOCK;
-	}
+	cpicker->use_color_lock = lock;
+	cpicker->use_color_cubic = cubic;
+	cpicker->use_luminosity_lock = lock_luminosity;
 
 	if (lock_luminosity) {
 		float color[4]; /* in case of alpha */
-		but->flag |= UI_BUT_VEC_SIZE_LOCK;
 		RNA_property_float_get_array(ptr, prop, color);
 		but->a2 = len_v3(color);
+		cpicker->luminosity_lock_value = len_v3(color);
 	}
 
-	if (cubic)
-		but->flag |= UI_BUT_COLOR_CUBIC;
-
 
 	if (value_slider) {
 		switch (U.color_picker_type) {
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index 47f29eaed2f..4c92ca14bce 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -2575,7 +2575,9 @@ void ui_hsvcircle_vals_from_pos(
 }
 
 /* cursor in hsv circle, in float units -1 to 1, to map on radius */
-void ui_hsvcircle_pos_from_vals(uiBut *but, const rcti *rect, float *hsv, float *xpos, float *ypos)
+void ui_hsvcircle_pos_from_vals(
+        const ColorPicker *cpicker, const rcti *rect, const float *hsv,
+        float *r_xpos, float *r_ypos)
 {
 	/* duplication of code... well, simple is better now */
 	const float centx = BLI_rcti_cent_x_fl(rect);
@@ -2585,14 +2587,14 @@ void ui_hsvcircle_pos_from_vals(uiBut *but, const rcti *rect, float *hsv, float
 
 	ang = 2.0f * (float)M_PI * hsv[0] + (float)M_PI_2;
 
-	if ((but->flag & UI_BUT_COLOR_CUBIC) && (U.color_picker_type == USER_CP_CIRCLE_HSV))
+	if (cpicker->use_color_cubic && (U.color_picker_type == USER_CP_CIRCLE_HSV))
 		radius_t = (1.0f - pow3f(1.0f - hsv[1]));
 	else
 		radius_t = hsv[1];
 
 	radius = clamp_f(radius_t, 0.0f, 1.0f) * radius;
-	*xpos = centx + cosf(-ang) * radius;
-	*ypos = centy + sinf(-ang) * radius;
+	*r_xpos = centx + cosf(-ang) * radius;
+	*r_ypos = centy + sinf(-ang) * radius;
 }
 
 static void ui_draw_but_HSVCIRCLE(uiBut *but, const uiWidgetColors *wcol, const rcti *rect)
@@ -2622,11 +2624,13 @@ static void ui_draw_but_HSVCIRCLE(uiBut *but, const uiWidgetColors *wcol, const
 	/* exception: if 'lock' is set
 	 * lock the value of the color wheel to 1.
 	 * Useful for color correction tools where you're only interested in hue. */
-	if (but->flag & UI_BUT_COLOR_LOCK) {
-		if (U.color_picker_type == USER_CP_CIRCLE_HSV)
+	if (cpicker->use_color_lock) {
+		if (U.color_picker_type == USER_CP_CIRCLE_HSV) {
 			hsv[2] = 1.0f;
-		else
+		}
+		else {
 			hsv[2] = 0.5f;
+		}
 	}
 
 	const float hsv_center[3] = {0.0f, 0.0f, hsv[2]};
@@ -2694,7 +2698,7 @@ static void ui_draw_but_HSVCIRCLE(uiBut *but, const uiWidgetColors *wcol, const
 	ui_rgb_to_color_picker_compat_v(rgb, hsv);
 
 	float xpos, ypos;
-	ui_hsvcircle_pos_from_vals(but, rect, hsv, &xpos, &ypos);
+	ui_hsvcircle_pos_from_vals(cpicker, rect, hsv, &xpos, &ypos);
 	ui_hsv_cursor(xpos, ypos);
 }
 
@@ -2851,7 +2855,9 @@ void ui_draw_gradient(const rcti *rect, const float hsv[3], const int type, cons
 	immUnbindProgram();
 }
 
-void ui_hsvcube_pos_from_vals(uiBut *but, const rcti *rect, float *hsv, float *xp, float *yp)
+void ui_hsvcube_pos_from_vals(
+        const uiBut *but, const rcti *rect, const float *hsv,
+        float *r_xp, float *r_yp)
 {
 	float x = 0.0f, y = 0.0f;
 
@@ -2881,8 +2887,8 @@ void ui_hsvcube_pos_from_vals(uiBut *but, const rcti *rect, float *hsv, float *x
 	}
 
 	/* cursor */
-	*xp = rect->xmin + x * BLI_rcti_size_x(rect);
-	*yp = rect->ymin + y * BLI_rcti_size_y(rect);
+	*r_xp = rect->xmin + x * BLI_rcti_size_x(rect);
+	*r_yp = rect->ymin + y * BLI_rcti_size_y(rect);
 }
 
 static void ui_draw_but_HSVCUBE(uiBut *but, const rcti *rect)



More information about the Bf-blender-cvs mailing list