diff --git a/clutter/clutter/clutter-actor.c b/clutter/clutter/clutter-actor.c index b31a4d01d..722b5cbda 100644 --- a/clutter/clutter/clutter-actor.c +++ b/clutter/clutter/clutter-actor.c @@ -616,6 +616,7 @@ #include "clutter-action-private.h" #include "clutter-actor-meta-private.h" #include "clutter-animatable.h" +#include "clutter-color-state.h" #include "clutter-color-static.h" #include "clutter-color.h" #include "clutter-constraint-private.h" @@ -755,6 +756,10 @@ struct _ClutterActorPrivate /* used when painting, to update the paint volume */ ClutterEffect *current_effect; + /* color state contains properties like colorspace for + * each clutter actor */ + ClutterColorState *color_state; + /* This is used to store an effect which needs to be redrawn. A redraw can be queued to start from a particular effect. This is used by parametrised effects that can cache an image of the @@ -959,6 +964,8 @@ enum PROP_MAGNIFICATION_FILTER, PROP_CONTENT_REPEAT, + PROP_COLOR_STATE, + PROP_LAST }; @@ -5078,6 +5085,10 @@ clutter_actor_set_property (GObject *object, clutter_actor_set_content_repeat (actor, g_value_get_flags (value)); break; + case PROP_COLOR_STATE: + clutter_actor_set_color_state (actor, g_value_get_object (value)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -5527,6 +5538,10 @@ clutter_actor_get_property (GObject *object, g_value_set_flags (value, priv->content_repeat); break; + case PROP_COLOR_STATE: + g_value_set_object (value, priv->color_state); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -5574,6 +5589,7 @@ clutter_actor_dispose (GObject *object) g_clear_object (&priv->pango_context); g_clear_object (&priv->actions); + g_clear_object (&priv->color_state); g_clear_object (&priv->constraints); g_clear_object (&priv->effects); g_clear_object (&priv->flatten_effect); @@ -7334,6 +7350,20 @@ clutter_actor_class_init (ClutterActorClass *klass) G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); + /** + * ClutterActor:color-state: + * + * The #ClutterColorState contains the properties like colorspace for each + * actors. + */ + obj_props[PROP_COLOR_STATE] = + g_param_spec_object ("color-state", + P_("ColorState"), + P_("ColorState of the each actors"), + CLUTTER_TYPE_COLOR_STATE, + CLUTTER_PARAM_READWRITE | + G_PARAM_CONSTRUCT); + g_object_class_install_properties (object_class, PROP_LAST, obj_props); /** @@ -19044,6 +19074,65 @@ clutter_actor_get_content_repeat (ClutterActor *self) return self->priv->content_repeat; } +static ClutterColorState * +create_srgb_color_state (ClutterActor *self) +{ + ClutterColorState *color_state; + + /* create default sRGB color state */ + color_state = clutter_color_state_new (CLUTTER_COLORSPACE_SRGB); + + return color_state; +} + +/** + * clutter_actor_set_color_state: + * @self: a #ClutterActor + * @color_state: a #ClutterColorState, or defaults to sRGB if %NULL + * + * Attaches color state properties to [class@Actor] + * default color state representing sRGB. + */ +void +clutter_actor_set_color_state (ClutterActor *self, + ClutterColorState *color_state) +{ + ClutterActorPrivate *priv; + + g_return_if_fail (CLUTTER_IS_ACTOR (self)); + + priv = self->priv; + + if (!color_state) + color_state = create_srgb_color_state (self); + else + g_object_ref (color_state); + + g_set_object (&priv->color_state, color_state); + + g_object_unref (color_state); + + g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_COLOR_STATE]); +} + +/** + * clutter_actor_get_color_state: + * @self: a #ClutterActor + * + * Retrieves the color_state of a [class@Actor] set by + * [method@Actor.set_color_state]. + * + * Return value: (transfer full): a pointer to the #ClutterColorState + * instance, or %NULL + */ +ClutterColorState * +clutter_actor_get_color_state (ClutterActor *self) +{ + g_return_val_if_fail (CLUTTER_IS_ACTOR (self), NULL); + + return self->priv->color_state; +} + void _clutter_actor_handle_event (ClutterActor *self, ClutterActor *root, diff --git a/clutter/clutter/clutter-actor.h b/clutter/clutter/clutter-actor.h index 10b0a2174..5707aa672 100644 --- a/clutter/clutter/clutter-actor.h +++ b/clutter/clutter/clutter-actor.h @@ -624,6 +624,13 @@ void clutter_actor_set_content_repeat ClutterContentRepeat repeat); CLUTTER_EXPORT ClutterContentRepeat clutter_actor_get_content_repeat (ClutterActor *self); + +CLUTTER_EXPORT +void clutter_actor_set_color_state (ClutterActor *self, + ClutterColorState *color_state); +CLUTTER_EXPORT +ClutterColorState *clutter_actor_get_color_state (ClutterActor *self); + CLUTTER_EXPORT void clutter_actor_get_content_box (ClutterActor *self, ClutterActorBox *box); diff --git a/clutter/clutter/clutter-color-state.c b/clutter/clutter/clutter-color-state.c new file mode 100644 index 000000000..8d80fa523 --- /dev/null +++ b/clutter/clutter/clutter-color-state.c @@ -0,0 +1,182 @@ +/* + * Clutter. + * + * An OpenGL based 'interactive canvas' library. + * + * Copyright (C) 2022 Intel Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * Author: + * Naveen Kumar + */ + +/** + * ClutterColorState: + * + * Color state of each ClutterActor + * + * The #ClutterColorState class contains the colorspace of each color + * states (e.g. sRGB colorspace). + * + * Each [class@Actor] would own such an object. + * + * A single #ClutterColorState object can be shared by multiple [class@Actor] + * or maybe a separate color state for each [class@Actor] (depending on whether + * #ClutterColorState would be statefull or stateless). + * + * #ClutterColorState, if not set during construction, it will default to sRGB + * color state + * + * The #ClutterColorState would have API to get the colorspace, whether the + * actor content is in pq or not, and things like that + */ + +#include "clutter-build-config.h" + +#include "clutter-color-state.h" + +#include "clutter-debug.h" +#include "clutter-enum-types.h" +#include "clutter-private.h" + +enum +{ + PROP_0, + + PROP_COLORSPACE, + + N_PROPS +}; + +static GParamSpec *obj_props[N_PROPS]; + +typedef struct _ClutterColorStatePrivate ClutterColorStatePrivate; + +struct _ClutterColorState +{ + GObject parent_instance; +}; + +struct _ClutterColorStatePrivate +{ + ClutterColorspace colorspace; +}; + +G_DEFINE_TYPE_WITH_PRIVATE (ClutterColorState, + clutter_color_state, + G_TYPE_OBJECT) + +ClutterColorspace +clutter_color_state_get_colorspace (ClutterColorState *color_state) +{ + ClutterColorStatePrivate *priv; + + g_return_val_if_fail (CLUTTER_IS_COLOR_STATE (color_state), + CLUTTER_COLORSPACE_UNKNOWN); + + priv = clutter_color_state_get_instance_private (color_state); + + return priv->colorspace; +} + +static void +clutter_color_state_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + ClutterColorState *color_state = CLUTTER_COLOR_STATE (object); + ClutterColorStatePrivate *priv; + + priv = clutter_color_state_get_instance_private (color_state); + + switch (prop_id) + { + case PROP_COLORSPACE: + priv->colorspace = g_value_get_enum (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +clutter_color_state_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + ClutterColorState *color_state = CLUTTER_COLOR_STATE (object); + + switch (prop_id) + { + case PROP_COLORSPACE: + g_value_set_enum (value, + clutter_color_state_get_colorspace (color_state)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +clutter_color_state_class_init (ClutterColorStateClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->set_property = clutter_color_state_set_property; + gobject_class->get_property = clutter_color_state_get_property; + + /** + * ClutterColorState:colorspace: + * + * Colorspace information of the each color state, + * defaults to sRGB colorspace + */ + obj_props[PROP_COLORSPACE] = + g_param_spec_enum ("colorspace", + P_("Colorspace"), + P_("Colorspace information of the color state"), + CLUTTER_TYPE_COLORSPACE, + CLUTTER_COLORSPACE_SRGB, + CLUTTER_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY); + + g_object_class_install_properties (gobject_class, N_PROPS, obj_props); +} + +static void +clutter_color_state_init (ClutterColorState *color_state) +{ +} + +/** + * clutter_color_state_new: + * + * Create a new ClutterColorState object. + * + * Return value: A new ClutterColorState object. + **/ +ClutterColorState* +clutter_color_state_new (ClutterColorspace colorspace) +{ + return g_object_new (CLUTTER_TYPE_COLOR_STATE, + "colorspace", colorspace, + NULL); +} diff --git a/clutter/clutter/clutter-color-state.h b/clutter/clutter/clutter-color-state.h new file mode 100644 index 000000000..5046253cd --- /dev/null +++ b/clutter/clutter/clutter-color-state.h @@ -0,0 +1,50 @@ +/* + * Clutter. + * + * An OpenGL based 'interactive canvas' library. + * + * Copyright (C) 2022 Intel Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * Author: + * Naveen Kumar + */ + +#ifndef CLUTTER_COLOR_STATE_H +#define CLUTTER_COLOR_STATE_H + +#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define CLUTTER_TYPE_COLOR_STATE (clutter_color_state_get_type ()) +CLUTTER_EXPORT +G_DECLARE_FINAL_TYPE (ClutterColorState, clutter_color_state, + CLUTTER, COLOR_STATE, + GObject) + +CLUTTER_EXPORT +ClutterColorState * clutter_color_state_new (ClutterColorspace colorspace); + +CLUTTER_EXPORT +ClutterColorspace clutter_color_state_get_colorspace (ClutterColorState *color_state); + +G_END_DECLS + +#endif /* CLUTTER_COLOR_STATE_H */ diff --git a/clutter/clutter/clutter-enums.h b/clutter/clutter/clutter-enums.h index a5c9d6ad0..6a4734d88 100644 --- a/clutter/clutter/clutter-enums.h +++ b/clutter/clutter/clutter-enums.h @@ -1424,6 +1424,21 @@ typedef enum CLUTTER_REPEAT_BOTH = CLUTTER_REPEAT_X_AXIS | CLUTTER_REPEAT_Y_AXIS } ClutterContentRepeat; +/** + * ClutterColorspace: + * @CLUTTER_COLORSPACE_UNKNOWN: Unknown colorspace + * @CLUTTER_COLORSPACE_SRGB: Default sRGB colorspace + * @CLUTTER_COLORSPACE_BT2020: BT2020 colorspace + * + * Colorspace informations. + */ +typedef enum +{ + CLUTTER_COLORSPACE_UNKNOWN, + CLUTTER_COLORSPACE_SRGB, + CLUTTER_COLORSPACE_BT2020 +} ClutterColorspace; + /** * ClutterStepMode: * @CLUTTER_STEP_MODE_START: The change in the value of a diff --git a/clutter/clutter/clutter-types.h b/clutter/clutter/clutter-types.h index 569e36604..b6ea8fb66 100644 --- a/clutter/clutter/clutter-types.h +++ b/clutter/clutter/clutter-types.h @@ -76,6 +76,7 @@ typedef struct _ClutterPathNode ClutterPathNode; typedef struct _ClutterActorBox ClutterActorBox; typedef struct _ClutterColor ClutterColor; +typedef struct _ClutterColorState ClutterColorState; typedef struct _ClutterKnot ClutterKnot; typedef struct _ClutterMargin ClutterMargin; typedef struct _ClutterPerspective ClutterPerspective; diff --git a/clutter/clutter/clutter.h b/clutter/clutter/clutter.h index 0d43ce478..3ba51c16b 100644 --- a/clutter/clutter/clutter.h +++ b/clutter/clutter/clutter.h @@ -48,6 +48,7 @@ #include "clutter-click-action.h" #include "clutter-clone.h" #include "clutter-color.h" +#include "clutter-color-state.h" #include "clutter-color-static.h" #include "clutter-colorize-effect.h" #include "clutter-constraint.h" diff --git a/clutter/clutter/meson.build b/clutter/clutter/meson.build index f30edadd5..b4ee4b782 100644 --- a/clutter/clutter/meson.build +++ b/clutter/clutter/meson.build @@ -21,6 +21,7 @@ clutter_headers = [ 'clutter-child-meta.h', 'clutter-click-action.h', 'clutter-clone.h', + 'clutter-color-state.h', 'clutter-color-static.h', 'clutter-color.h', 'clutter-colorize-effect.h', @@ -113,6 +114,7 @@ clutter_sources = [ 'clutter-click-action.c', 'clutter-clone.c', 'clutter-color.c', + 'clutter-color-state.c', 'clutter-colorize-effect.c', 'clutter-constraint.c', 'clutter-container.c',