diff --git a/clutter/clutter/clutter-actor.c b/clutter/clutter/clutter-actor.c index 939df7e62..9ba4ab6b4 100644 --- a/clutter/clutter/clutter-actor.c +++ b/clutter/clutter/clutter-actor.c @@ -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; } diff --git a/clutter/clutter/clutter-color-state.c b/clutter/clutter/clutter-color-state.c index 8312bad3a..abf9df823 100644 --- a/clutter/clutter/clutter-color-state.c +++ b/clutter/clutter/clutter-color-state.c @@ -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); } diff --git a/clutter/clutter/clutter-color-state.h b/clutter/clutter/clutter-color-state.h index 43029c415..837f89e13 100644 --- a/clutter/clutter/clutter-color-state.h +++ b/clutter/clutter/clutter-color-state.h @@ -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 diff --git a/clutter/clutter/clutter-enums.h b/clutter/clutter/clutter-enums.h index 79ae8f053..b2cd0bc4e 100644 --- a/clutter/clutter/clutter-enums.h +++ b/clutter/clutter/clutter-enums.h @@ -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 diff --git a/src/tests/clutter/conform/actor-color-state.c b/src/tests/clutter/conform/actor-color-state.c index cec10b77d..ec1c89dda 100644 --- a/src/tests/clutter/conform/actor-color-state.c +++ b/src/tests/clutter/conform/actor-color-state.c @@ -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); }