From 7f8df9d9a156afd6d8051f26dcea891450400cfd Mon Sep 17 00:00:00 2001 From: Joan Torres Date: Fri, 25 Oct 2024 14:41:55 +0200 Subject: [PATCH] clutter/color-state-params: Add new_from_primitives When creating a new color state from the primitives Colorimetry, EOTF and Luminance; it is needed to previously check their tags to properly get their values and avoid UB. This check is duplicated and is a bit unreadable. Using this new function helps keeping readability. Part-of: --- clutter/clutter/clutter-color-state-params.c | 92 ++++++++++++++------ clutter/clutter/clutter-color-state-params.h | 6 ++ src/backends/meta-color-device.c | 57 +++++------- src/wayland/meta-wayland-color-management.c | 41 ++------- 4 files changed, 98 insertions(+), 98 deletions(-) diff --git a/clutter/clutter/clutter-color-state-params.c b/clutter/clutter/clutter-color-state-params.c index 942b89828..ed2a1e45d 100644 --- a/clutter/clutter/clutter-color-state-params.c +++ b/clutter/clutter/clutter-color-state-params.c @@ -1153,9 +1153,9 @@ clutter_color_state_params_get_blending (ClutterColorState *color_state, ClutterColorStateParams *color_state_params = CLUTTER_COLOR_STATE_PARAMS (color_state); ClutterContext *context; - ClutterTransferFunction blending_tf; - ClutterColorspace colorspace; - ClutterPrimaries *primaries; + ClutterEOTF blending_eotf; + + blending_eotf.type = CLUTTER_EOTF_TYPE_NAMED; switch (color_state_params->eotf.type) { @@ -1164,51 +1164,35 @@ clutter_color_state_params_get_blending (ClutterColorState *color_state, { /* effectively this means we will blend sRGB content in sRGB, not linear */ case CLUTTER_TRANSFER_FUNCTION_SRGB: - blending_tf = color_state_params->eotf.tf_name; + blending_eotf.tf_name = CLUTTER_TRANSFER_FUNCTION_SRGB; break; case CLUTTER_TRANSFER_FUNCTION_PQ: case CLUTTER_TRANSFER_FUNCTION_BT709: case CLUTTER_TRANSFER_FUNCTION_LINEAR: - blending_tf = CLUTTER_TRANSFER_FUNCTION_LINEAR; + blending_eotf.tf_name = CLUTTER_TRANSFER_FUNCTION_LINEAR; break; default: g_assert_not_reached (); } break; case CLUTTER_EOTF_TYPE_GAMMA: - blending_tf = CLUTTER_TRANSFER_FUNCTION_LINEAR; + blending_eotf.tf_name = CLUTTER_TRANSFER_FUNCTION_LINEAR; break; } if (force) - blending_tf = CLUTTER_TRANSFER_FUNCTION_LINEAR; + blending_eotf.tf_name = CLUTTER_TRANSFER_FUNCTION_LINEAR; if (color_state_params->eotf.type == CLUTTER_EOTF_TYPE_NAMED && - color_state_params->eotf.tf_name == blending_tf) + color_state_params->eotf.tf_name == blending_eotf.tf_name) return g_object_ref (color_state); - switch (color_state_params->colorimetry.type) - { - case CLUTTER_COLORIMETRY_TYPE_COLORSPACE: - colorspace = color_state_params->colorimetry.colorspace; - primaries = NULL; - break; - case CLUTTER_COLORIMETRY_TYPE_PRIMARIES: - colorspace = CLUTTER_COLORSPACE_SRGB; - primaries = color_state_params->colorimetry.primaries; - break; - } - g_object_get (G_OBJECT (color_state), "context", &context, NULL); - return clutter_color_state_params_new_full (context, - colorspace, - blending_tf, - primaries, - -1.0f, - color_state_params->luminance.min, - color_state_params->luminance.max, - color_state_params->luminance.ref); + return clutter_color_state_params_new_from_primitives (context, + color_state_params->colorimetry, + blending_eotf, + color_state_params->luminance); } static void @@ -1311,3 +1295,55 @@ clutter_color_state_params_new_full (ClutterContext *context, return CLUTTER_COLOR_STATE (color_state_params); } + +/** + * clutter_color_state_params_new_from_primitives: + * + * Create a new ClutterColorState object using the color primitives. + * + * Return value: A new ClutterColorState object. + **/ +ClutterColorState * +clutter_color_state_params_new_from_primitives (ClutterContext *context, + ClutterColorimetry colorimetry, + ClutterEOTF eotf, + ClutterLuminance luminance) +{ + ClutterColorspace colorspace; + ClutterPrimaries *primaries; + ClutterTransferFunction tf_name; + float gamma_exp; + + switch (colorimetry.type) + { + case CLUTTER_COLORIMETRY_TYPE_COLORSPACE: + colorspace = colorimetry.colorspace; + primaries = NULL; + break; + case CLUTTER_COLORIMETRY_TYPE_PRIMARIES: + colorspace = CLUTTER_COLORSPACE_SRGB; + primaries = colorimetry.primaries; + break; + } + + switch (eotf.type) + { + case CLUTTER_EOTF_TYPE_NAMED: + tf_name = eotf.tf_name; + gamma_exp = -1.0f; + break; + case CLUTTER_EOTF_TYPE_GAMMA: + tf_name = CLUTTER_TRANSFER_FUNCTION_SRGB; + gamma_exp = eotf.gamma_exp; + break; + } + + return clutter_color_state_params_new_full (context, + colorspace, + tf_name, + primaries, + gamma_exp, + luminance.min, + luminance.max, + luminance.ref); +} diff --git a/clutter/clutter/clutter-color-state-params.h b/clutter/clutter/clutter-color-state-params.h index c9d92cf16..dcb367c1c 100644 --- a/clutter/clutter/clutter-color-state-params.h +++ b/clutter/clutter/clutter-color-state-params.h @@ -117,6 +117,12 @@ ClutterColorState * clutter_color_state_params_new_full (ClutterContext float max_lum, float ref_lum); +CLUTTER_EXPORT +ClutterColorState * clutter_color_state_params_new_from_primitives (ClutterContext *context, + ClutterColorimetry colorimetry, + ClutterEOTF eotf, + ClutterLuminance luminance); + CLUTTER_EXPORT const ClutterColorimetry * clutter_color_state_params_get_colorimetry (ClutterColorStateParams *color_state_params); diff --git a/src/backends/meta-color-device.c b/src/backends/meta-color-device.c index eec7f0b63..49f70dcf2 100644 --- a/src/backends/meta-color-device.c +++ b/src/backends/meta-color-device.c @@ -625,18 +625,25 @@ on_manager_ready (MetaColorManager *color_manager, create_cd_device (color_device); } -static ClutterColorspace -get_color_space_from_monitor (MetaMonitor *monitor) +static ClutterColorimetry +get_colorimetry_from_monitor (MetaMonitor *monitor) { + ClutterColorimetry colorimetry; + + colorimetry.type = CLUTTER_COLORIMETRY_TYPE_COLORSPACE; + switch (meta_monitor_get_color_space (monitor)) { case META_OUTPUT_COLORSPACE_DEFAULT: case META_OUTPUT_COLORSPACE_UNKNOWN: - return CLUTTER_COLORSPACE_SRGB; + colorimetry.colorspace = CLUTTER_COLORSPACE_SRGB; + break; case META_OUTPUT_COLORSPACE_BT2020: - return CLUTTER_COLORSPACE_BT2020; + colorimetry.colorspace = CLUTTER_COLORSPACE_BT2020; + break; } - g_assert_not_reached (); + + return colorimetry; } static ClutterEOTF @@ -685,51 +692,33 @@ update_color_state (MetaColorDevice *color_device) MetaDebugControl *debug_control = meta_context_get_debug_control (context); ClutterContext *clutter_context = meta_backend_get_clutter_context (backend); g_autoptr (ClutterColorState) color_state = NULL; - ClutterColorspace colorspace; + ClutterColorimetry colorimetry; ClutterEOTF eotf; - ClutterTransferFunction transfer_function; - const ClutterLuminance *luminance; - float gamma_exp; + ClutterLuminance luminance; float reference_luminance_factor; - float new_ref_luminance; UpdateResult result = 0; - colorspace = get_color_space_from_monitor (monitor); + colorimetry = get_colorimetry_from_monitor (monitor); eotf = get_eotf_from_monitor (monitor); if (meta_debug_control_is_hdr_forced (debug_control)) { - colorspace = CLUTTER_COLORSPACE_BT2020; + colorimetry.type = CLUTTER_COLORIMETRY_TYPE_COLORSPACE; + colorimetry.colorspace = CLUTTER_COLORSPACE_BT2020; eotf.type = CLUTTER_EOTF_TYPE_NAMED; eotf.tf_name = CLUTTER_TRANSFER_FUNCTION_PQ; } - luminance = clutter_eotf_get_default_luminance (eotf); + luminance = *clutter_eotf_get_default_luminance (eotf); reference_luminance_factor = meta_debug_control_get_luminance_percentage (debug_control) / 100.0f; - new_ref_luminance = luminance->ref * reference_luminance_factor; + luminance.ref = luminance.ref * reference_luminance_factor; - switch (eotf.type) - { - case CLUTTER_EOTF_TYPE_NAMED: - transfer_function = eotf.tf_name; - gamma_exp = -1.0f; - break; - case CLUTTER_EOTF_TYPE_GAMMA: - transfer_function = CLUTTER_TRANSFER_FUNCTION_SRGB; - gamma_exp = eotf.gamma_exp; - break; - } - - color_state = clutter_color_state_params_new_full (clutter_context, - colorspace, - transfer_function, - NULL, - gamma_exp, - luminance->min, - luminance->max, - new_ref_luminance); + color_state = clutter_color_state_params_new_from_primitives (clutter_context, + colorimetry, + eotf, + luminance); if (!color_device->color_state || !clutter_color_state_equals (color_device->color_state, color_state)) diff --git a/src/wayland/meta-wayland-color-management.c b/src/wayland/meta-wayland-color-management.c index bbc010dff..cf2de9865 100644 --- a/src/wayland/meta-wayland-color-management.c +++ b/src/wayland/meta-wayland-color-management.c @@ -911,10 +911,6 @@ creator_params_create (struct wl_client *client, struct wl_resource *image_desc_resource; g_autoptr (ClutterColorState) color_state = NULL; MetaWaylandImageDescription *image_desc; - ClutterColorspace colorspace; - ClutterPrimaries *primaries; - ClutterTransferFunction tf_name; - float gamma_exp; if (!creator_params->is_colorimetry_set || !creator_params->is_eotf_set) { @@ -930,38 +926,11 @@ creator_params_create (struct wl_client *client, wl_resource_get_version (resource), id); - switch (creator_params->colorimetry.type) - { - case CLUTTER_COLORIMETRY_TYPE_COLORSPACE: - colorspace = creator_params->colorimetry.colorspace; - primaries = NULL; - break; - case CLUTTER_COLORIMETRY_TYPE_PRIMARIES: - colorspace = CLUTTER_COLORSPACE_SRGB; - primaries = creator_params->colorimetry.primaries; - break; - } - - switch (creator_params->eotf.type) - { - case CLUTTER_EOTF_TYPE_NAMED: - tf_name = creator_params->eotf.tf_name; - gamma_exp = -1.0f; - break; - case CLUTTER_EOTF_TYPE_GAMMA: - tf_name = CLUTTER_TRANSFER_FUNCTION_SRGB; - gamma_exp = creator_params->eotf.gamma_exp; - break; - } - - color_state = clutter_color_state_params_new_full (clutter_context, - colorspace, - tf_name, - primaries, - gamma_exp, - creator_params->lum.min, - creator_params->lum.max, - creator_params->lum.ref); + color_state = + clutter_color_state_params_new_from_primitives (clutter_context, + creator_params->colorimetry, + creator_params->eotf, + creator_params->lum); image_desc = meta_wayland_image_description_new_color_state (color_manager,