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: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4144>
This commit is contained in:
parent
2e2a91a14b
commit
7f8df9d9a1
@ -1153,9 +1153,9 @@ clutter_color_state_params_get_blending (ClutterColorState *color_state,
|
|||||||
ClutterColorStateParams *color_state_params =
|
ClutterColorStateParams *color_state_params =
|
||||||
CLUTTER_COLOR_STATE_PARAMS (color_state);
|
CLUTTER_COLOR_STATE_PARAMS (color_state);
|
||||||
ClutterContext *context;
|
ClutterContext *context;
|
||||||
ClutterTransferFunction blending_tf;
|
ClutterEOTF blending_eotf;
|
||||||
ClutterColorspace colorspace;
|
|
||||||
ClutterPrimaries *primaries;
|
blending_eotf.type = CLUTTER_EOTF_TYPE_NAMED;
|
||||||
|
|
||||||
switch (color_state_params->eotf.type)
|
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 */
|
/* effectively this means we will blend sRGB content in sRGB, not linear */
|
||||||
case CLUTTER_TRANSFER_FUNCTION_SRGB:
|
case CLUTTER_TRANSFER_FUNCTION_SRGB:
|
||||||
blending_tf = color_state_params->eotf.tf_name;
|
blending_eotf.tf_name = CLUTTER_TRANSFER_FUNCTION_SRGB;
|
||||||
break;
|
break;
|
||||||
case CLUTTER_TRANSFER_FUNCTION_PQ:
|
case CLUTTER_TRANSFER_FUNCTION_PQ:
|
||||||
case CLUTTER_TRANSFER_FUNCTION_BT709:
|
case CLUTTER_TRANSFER_FUNCTION_BT709:
|
||||||
case CLUTTER_TRANSFER_FUNCTION_LINEAR:
|
case CLUTTER_TRANSFER_FUNCTION_LINEAR:
|
||||||
blending_tf = CLUTTER_TRANSFER_FUNCTION_LINEAR;
|
blending_eotf.tf_name = CLUTTER_TRANSFER_FUNCTION_LINEAR;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CLUTTER_EOTF_TYPE_GAMMA:
|
case CLUTTER_EOTF_TYPE_GAMMA:
|
||||||
blending_tf = CLUTTER_TRANSFER_FUNCTION_LINEAR;
|
blending_eotf.tf_name = CLUTTER_TRANSFER_FUNCTION_LINEAR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (force)
|
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 &&
|
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);
|
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);
|
g_object_get (G_OBJECT (color_state), "context", &context, NULL);
|
||||||
|
|
||||||
return clutter_color_state_params_new_full (context,
|
return clutter_color_state_params_new_from_primitives (context,
|
||||||
colorspace,
|
color_state_params->colorimetry,
|
||||||
blending_tf,
|
blending_eotf,
|
||||||
primaries,
|
color_state_params->luminance);
|
||||||
-1.0f,
|
|
||||||
color_state_params->luminance.min,
|
|
||||||
color_state_params->luminance.max,
|
|
||||||
color_state_params->luminance.ref);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -1311,3 +1295,55 @@ clutter_color_state_params_new_full (ClutterContext *context,
|
|||||||
|
|
||||||
return CLUTTER_COLOR_STATE (color_state_params);
|
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);
|
||||||
|
}
|
||||||
|
@ -117,6 +117,12 @@ ClutterColorState * clutter_color_state_params_new_full (ClutterContext
|
|||||||
float max_lum,
|
float max_lum,
|
||||||
float ref_lum);
|
float ref_lum);
|
||||||
|
|
||||||
|
CLUTTER_EXPORT
|
||||||
|
ClutterColorState * clutter_color_state_params_new_from_primitives (ClutterContext *context,
|
||||||
|
ClutterColorimetry colorimetry,
|
||||||
|
ClutterEOTF eotf,
|
||||||
|
ClutterLuminance luminance);
|
||||||
|
|
||||||
CLUTTER_EXPORT
|
CLUTTER_EXPORT
|
||||||
const ClutterColorimetry * clutter_color_state_params_get_colorimetry (ClutterColorStateParams *color_state_params);
|
const ClutterColorimetry * clutter_color_state_params_get_colorimetry (ClutterColorStateParams *color_state_params);
|
||||||
|
|
||||||
|
@ -625,18 +625,25 @@ on_manager_ready (MetaColorManager *color_manager,
|
|||||||
create_cd_device (color_device);
|
create_cd_device (color_device);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ClutterColorspace
|
static ClutterColorimetry
|
||||||
get_color_space_from_monitor (MetaMonitor *monitor)
|
get_colorimetry_from_monitor (MetaMonitor *monitor)
|
||||||
{
|
{
|
||||||
|
ClutterColorimetry colorimetry;
|
||||||
|
|
||||||
|
colorimetry.type = CLUTTER_COLORIMETRY_TYPE_COLORSPACE;
|
||||||
|
|
||||||
switch (meta_monitor_get_color_space (monitor))
|
switch (meta_monitor_get_color_space (monitor))
|
||||||
{
|
{
|
||||||
case META_OUTPUT_COLORSPACE_DEFAULT:
|
case META_OUTPUT_COLORSPACE_DEFAULT:
|
||||||
case META_OUTPUT_COLORSPACE_UNKNOWN:
|
case META_OUTPUT_COLORSPACE_UNKNOWN:
|
||||||
return CLUTTER_COLORSPACE_SRGB;
|
colorimetry.colorspace = CLUTTER_COLORSPACE_SRGB;
|
||||||
|
break;
|
||||||
case META_OUTPUT_COLORSPACE_BT2020:
|
case META_OUTPUT_COLORSPACE_BT2020:
|
||||||
return CLUTTER_COLORSPACE_BT2020;
|
colorimetry.colorspace = CLUTTER_COLORSPACE_BT2020;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
g_assert_not_reached ();
|
|
||||||
|
return colorimetry;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ClutterEOTF
|
static ClutterEOTF
|
||||||
@ -685,51 +692,33 @@ update_color_state (MetaColorDevice *color_device)
|
|||||||
MetaDebugControl *debug_control = meta_context_get_debug_control (context);
|
MetaDebugControl *debug_control = meta_context_get_debug_control (context);
|
||||||
ClutterContext *clutter_context = meta_backend_get_clutter_context (backend);
|
ClutterContext *clutter_context = meta_backend_get_clutter_context (backend);
|
||||||
g_autoptr (ClutterColorState) color_state = NULL;
|
g_autoptr (ClutterColorState) color_state = NULL;
|
||||||
ClutterColorspace colorspace;
|
ClutterColorimetry colorimetry;
|
||||||
ClutterEOTF eotf;
|
ClutterEOTF eotf;
|
||||||
ClutterTransferFunction transfer_function;
|
ClutterLuminance luminance;
|
||||||
const ClutterLuminance *luminance;
|
|
||||||
float gamma_exp;
|
|
||||||
float reference_luminance_factor;
|
float reference_luminance_factor;
|
||||||
float new_ref_luminance;
|
|
||||||
UpdateResult result = 0;
|
UpdateResult result = 0;
|
||||||
|
|
||||||
colorspace = get_color_space_from_monitor (monitor);
|
colorimetry = get_colorimetry_from_monitor (monitor);
|
||||||
eotf = get_eotf_from_monitor (monitor);
|
eotf = get_eotf_from_monitor (monitor);
|
||||||
|
|
||||||
if (meta_debug_control_is_hdr_forced (debug_control))
|
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.type = CLUTTER_EOTF_TYPE_NAMED;
|
||||||
eotf.tf_name = CLUTTER_TRANSFER_FUNCTION_PQ;
|
eotf.tf_name = CLUTTER_TRANSFER_FUNCTION_PQ;
|
||||||
}
|
}
|
||||||
|
|
||||||
luminance = clutter_eotf_get_default_luminance (eotf);
|
luminance = *clutter_eotf_get_default_luminance (eotf);
|
||||||
|
|
||||||
reference_luminance_factor =
|
reference_luminance_factor =
|
||||||
meta_debug_control_get_luminance_percentage (debug_control) / 100.0f;
|
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)
|
color_state = clutter_color_state_params_new_from_primitives (clutter_context,
|
||||||
{
|
colorimetry,
|
||||||
case CLUTTER_EOTF_TYPE_NAMED:
|
eotf,
|
||||||
transfer_function = eotf.tf_name;
|
luminance);
|
||||||
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);
|
|
||||||
|
|
||||||
if (!color_device->color_state ||
|
if (!color_device->color_state ||
|
||||||
!clutter_color_state_equals (color_device->color_state, color_state))
|
!clutter_color_state_equals (color_device->color_state, color_state))
|
||||||
|
@ -911,10 +911,6 @@ creator_params_create (struct wl_client *client,
|
|||||||
struct wl_resource *image_desc_resource;
|
struct wl_resource *image_desc_resource;
|
||||||
g_autoptr (ClutterColorState) color_state = NULL;
|
g_autoptr (ClutterColorState) color_state = NULL;
|
||||||
MetaWaylandImageDescription *image_desc;
|
MetaWaylandImageDescription *image_desc;
|
||||||
ClutterColorspace colorspace;
|
|
||||||
ClutterPrimaries *primaries;
|
|
||||||
ClutterTransferFunction tf_name;
|
|
||||||
float gamma_exp;
|
|
||||||
|
|
||||||
if (!creator_params->is_colorimetry_set || !creator_params->is_eotf_set)
|
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),
|
wl_resource_get_version (resource),
|
||||||
id);
|
id);
|
||||||
|
|
||||||
switch (creator_params->colorimetry.type)
|
color_state =
|
||||||
{
|
clutter_color_state_params_new_from_primitives (clutter_context,
|
||||||
case CLUTTER_COLORIMETRY_TYPE_COLORSPACE:
|
creator_params->colorimetry,
|
||||||
colorspace = creator_params->colorimetry.colorspace;
|
creator_params->eotf,
|
||||||
primaries = NULL;
|
creator_params->lum);
|
||||||
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);
|
|
||||||
|
|
||||||
image_desc =
|
image_desc =
|
||||||
meta_wayland_image_description_new_color_state (color_manager,
|
meta_wayland_image_description_new_color_state (color_manager,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user