From 12c02b3f1a31699f7a2a2ab207322acd5c1bce4c Mon Sep 17 00:00:00 2001 From: Naveen Kumar Date: Fri, 20 May 2022 15:47:16 +0000 Subject: [PATCH] clutter: Attach color state information to actors ClutterColorState, that is a GObject. each ClutterActor would own such an object, and it'd be set via a GObject property. It would have an API to get the colorspace, whether the actor content is in pq or not, and things like that. if it is NULL, it will default to color state with sRGB colorspace. Part-of: --- clutter/clutter/clutter-actor.c | 89 +++++++++++++ clutter/clutter/clutter-actor.h | 7 + clutter/clutter/clutter-color-state.c | 182 ++++++++++++++++++++++++++ clutter/clutter/clutter-color-state.h | 50 +++++++ clutter/clutter/clutter-enums.h | 15 +++ clutter/clutter/clutter-types.h | 1 + clutter/clutter/clutter.h | 1 + clutter/clutter/meson.build | 2 + 8 files changed, 347 insertions(+) create mode 100644 clutter/clutter/clutter-color-state.c create mode 100644 clutter/clutter/clutter-color-state.h 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',