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',