1
0
Fork 0

clutter/color-state: Add transfer function

Another enum, defining SRGB gamma transfer function, and the PQ transfer
function. As with color spaces, add a 'default' that for now is treated
as if it was sRGB.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3433>
This commit is contained in:
Jonas Ådahl 2023-10-13 17:18:06 +08:00 committed by Sebastian Wick
parent b74515b8cf
commit af71749e75
5 changed files with 78 additions and 6 deletions

View file

@ -17838,7 +17838,8 @@ create_default_color_state (ClutterActor *self)
{
ClutterColorState *color_state;
color_state = clutter_color_state_new (CLUTTER_COLORSPACE_DEFAULT);
color_state = clutter_color_state_new (CLUTTER_COLORSPACE_DEFAULT,
CLUTTER_TRANSFER_FUNCTION_DEFAULT);
return color_state;
}

View file

@ -56,6 +56,7 @@ enum
PROP_0,
PROP_COLORSPACE,
PROP_TRANSFER_FUNCTION,
N_PROPS
};
@ -72,6 +73,7 @@ struct _ClutterColorState
struct _ClutterColorStatePrivate
{
ClutterColorspace colorspace;
ClutterTransferFunction transfer_function;
};
G_DEFINE_TYPE_WITH_PRIVATE (ClutterColorState,
@ -91,6 +93,19 @@ clutter_color_state_get_colorspace (ClutterColorState *color_state)
return priv->colorspace;
}
ClutterTransferFunction
clutter_color_state_get_transfer_function (ClutterColorState *color_state)
{
ClutterColorStatePrivate *priv;
g_return_val_if_fail (CLUTTER_IS_COLOR_STATE (color_state),
CLUTTER_TRANSFER_FUNCTION_DEFAULT);
priv = clutter_color_state_get_instance_private (color_state);
return priv->transfer_function;
}
static void
clutter_color_state_set_property (GObject *object,
guint prop_id,
@ -108,6 +123,10 @@ clutter_color_state_set_property (GObject *object,
priv->colorspace = g_value_get_enum (value);
break;
case PROP_TRANSFER_FUNCTION:
priv->transfer_function = g_value_get_enum (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@ -129,6 +148,11 @@ clutter_color_state_get_property (GObject *object,
clutter_color_state_get_colorspace (color_state));
break;
case PROP_TRANSFER_FUNCTION:
g_value_set_enum (value,
clutter_color_state_get_transfer_function (color_state));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@ -157,6 +181,19 @@ clutter_color_state_class_init (ClutterColorStateClass *klass)
G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT_ONLY);
/**
* ClutterColorState:transfer-function:
*
* Transfer function.
*/
obj_props[PROP_TRANSFER_FUNCTION] =
g_param_spec_enum ("transfer-function", NULL, NULL,
CLUTTER_TYPE_TRANSFER_FUNCTION,
CLUTTER_TRANSFER_FUNCTION_SRGB,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT_ONLY);
g_object_class_install_properties (gobject_class, N_PROPS, obj_props);
}
@ -172,10 +209,12 @@ clutter_color_state_init (ClutterColorState *color_state)
*
* Return value: A new ClutterColorState object.
**/
ClutterColorState*
clutter_color_state_new (ClutterColorspace colorspace)
ClutterColorState *
clutter_color_state_new (ClutterColorspace colorspace,
ClutterTransferFunction transfer_function)
{
return g_object_new (CLUTTER_TYPE_COLOR_STATE,
"colorspace", colorspace,
"transfer-function", transfer_function,
NULL);
}

View file

@ -39,9 +39,13 @@ G_DECLARE_FINAL_TYPE (ClutterColorState, clutter_color_state,
GObject)
CLUTTER_EXPORT
ClutterColorState * clutter_color_state_new (ClutterColorspace colorspace);
ClutterColorState * clutter_color_state_new (ClutterColorspace colorspace,
ClutterTransferFunction transfer_function);
CLUTTER_EXPORT
ClutterColorspace clutter_color_state_get_colorspace (ClutterColorState *color_state);
CLUTTER_EXPORT
ClutterTransferFunction clutter_color_state_get_transfer_function (ClutterColorState *color_state);
G_END_DECLS

View file

@ -1015,6 +1015,23 @@ typedef enum
CLUTTER_COLORSPACE_BT2020,
} ClutterColorspace;
/**
* ClutterTransferFunction:
* @CLUTTER_TRANSFER_FUNCTION_DEFAULT: Unknown transfer function
* @CLUTTER_TRANSFER_FUNCTION_SRGB: The sRGB gamma transfer function
* @CLUTTER_TRANSFER_FUNCTION_PQ: Perceptual quantizer (PQ)
* @CLUTTER_TRANSFER_FUNCTION_LINEAR: Linear transfer function
*
* Colorspace information.
*/
typedef enum
{
CLUTTER_TRANSFER_FUNCTION_DEFAULT,
CLUTTER_TRANSFER_FUNCTION_SRGB,
CLUTTER_TRANSFER_FUNCTION_PQ,
CLUTTER_TRANSFER_FUNCTION_LINEAR,
} ClutterTransferFunction;
/**
* ClutterStepMode:
* @CLUTTER_STEP_MODE_START: The change in the value of a

View file

@ -49,8 +49,10 @@ actor_color_state_passed (void)
ClutterActor *actor;
ClutterColorState *color_state;
ClutterColorspace colorspace;
ClutterTransferFunction transfer_function;
color_state = clutter_color_state_new (CLUTTER_COLORSPACE_BT2020);
color_state = clutter_color_state_new (CLUTTER_COLORSPACE_BT2020,
CLUTTER_TRANSFER_FUNCTION_PQ);
if (!color_state)
g_critical ("Failed to create color state with provided colorspace.");
@ -67,8 +69,10 @@ actor_color_state_passed (void)
color_state = clutter_actor_get_color_state (actor);
colorspace = clutter_color_state_get_colorspace (color_state);
transfer_function = clutter_color_state_get_transfer_function (color_state);
g_assert_cmpuint (colorspace, ==, CLUTTER_COLORSPACE_BT2020);
g_assert_cmpuint (transfer_function, ==, CLUTTER_TRANSFER_FUNCTION_PQ);
clutter_actor_destroy (actor);
}
@ -80,10 +84,12 @@ actor_change_color_state (void)
ClutterActor *actor;
ClutterColorState *color_state;
ClutterColorspace colorspace;
ClutterTransferFunction transfer_function;
actor = clutter_actor_new ();
color_state = clutter_color_state_new (CLUTTER_COLORSPACE_BT2020);
color_state = clutter_color_state_new (CLUTTER_COLORSPACE_BT2020,
CLUTTER_TRANSFER_FUNCTION_PQ);
if (!color_state)
g_critical ("Failed to create color state with provided colorspace.");
@ -92,8 +98,10 @@ actor_change_color_state (void)
color_state = clutter_actor_get_color_state (actor);
colorspace = clutter_color_state_get_colorspace (color_state);
transfer_function = clutter_color_state_get_transfer_function (color_state);
g_assert_cmpuint (colorspace, ==, CLUTTER_COLORSPACE_BT2020);
g_assert_cmpuint (transfer_function, ==, CLUTTER_TRANSFER_FUNCTION_PQ);
clutter_actor_destroy (actor);
}
@ -106,6 +114,7 @@ actor_change_color_state_to_null (void)
ClutterActor *actor;
ClutterColorState *color_state;
ClutterColorspace colorspace;
ClutterTransferFunction transfer_function;
actor = clutter_actor_new ();
@ -113,8 +122,10 @@ actor_change_color_state_to_null (void)
color_state = clutter_actor_get_color_state (actor);
colorspace = clutter_color_state_get_colorspace (color_state);
transfer_function = clutter_color_state_get_transfer_function (color_state);
g_assert_cmpuint (colorspace, ==, CLUTTER_COLORSPACE_DEFAULT);
g_assert_cmpuint (transfer_function, ==, CLUTTER_TRANSFER_FUNCTION_DEFAULT);
clutter_actor_destroy (actor);
}