[clutter] actor: Move ClutterShader-related code out of clutter-actor.c
- From: Emmanuele Bassi <ebassi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [clutter] actor: Move ClutterShader-related code out of clutter-actor.c
- Date: Tue, 31 Jan 2012 12:48:13 +0000 (UTC)
commit 8ee6d106812788c0465845fccb9216c50fe8c27f
Author: Emmanuele Bassi <ebassi gnome org>
Date: Sun Dec 18 22:52:49 2011 +0000
actor: Move ClutterShader-related code out of clutter-actor.c
Since the code dealing with ClutterShader is pretty self-contained, now,
we can safely move it outside of the main ClutterActor source file and
into its own. This will allow us to just drop a bunch of files when
branching for 2.0.
clutter/Makefile.am | 1 +
clutter/clutter-actor-private.h | 4 +
clutter/clutter-actor.c | 320 +------------------------
clutter/deprecated/clutter-actor-deprecated.c | 318 ++++++++++++++++++++++++
4 files changed, 326 insertions(+), 317 deletions(-)
---
diff --git a/clutter/Makefile.am b/clutter/Makefile.am
index 1bb9adc..c77d247 100644
--- a/clutter/Makefile.am
+++ b/clutter/Makefile.am
@@ -252,6 +252,7 @@ deprecated_h = \
# deprecated source code
deprecated_c = \
+ $(srcdir)/deprecated/clutter-actor-deprecated.c \
$(srcdir)/deprecated/clutter-behaviour.c \
$(srcdir)/deprecated/clutter-behaviour-depth.c \
$(srcdir)/deprecated/clutter-behaviour-ellipse.c \
diff --git a/clutter/clutter-actor-private.h b/clutter/clutter-actor-private.h
index 968dbef..6b91405 100644
--- a/clutter/clutter-actor-private.h
+++ b/clutter/clutter-actor-private.h
@@ -267,6 +267,10 @@ void _clutter_actor_pop_clone_paint (void);
guint32 _clutter_actor_get_pick_id (ClutterActor *self);
+void _clutter_actor_shader_pre_paint (ClutterActor *actor,
+ gboolean repeat);
+void _clutter_actor_shader_post_paint (ClutterActor *actor);
+
G_END_DECLS
#endif /* __CLUTTER_ACTOR_PRIVATE_H__ */
diff --git a/clutter/clutter-actor.c b/clutter/clutter-actor.c
index 803fa41..4dc97b9 100644
--- a/clutter/clutter-actor.c
+++ b/clutter/clutter-actor.c
@@ -318,12 +318,8 @@
#include "clutter-stage-private.h"
#include "clutter-units.h"
-#define CLUTTER_DISABLE_DEPRECATION_WARNINGS
#include "deprecated/clutter-behaviour.h"
#include "deprecated/clutter-container.h"
-#include "deprecated/clutter-shader.h"
-
-typedef struct _ShaderData ShaderData;
#define CLUTTER_ACTOR_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), CLUTTER_TYPE_ACTOR, ClutterActorPrivate))
@@ -632,10 +628,6 @@ static void clutter_scriptable_iface_init (ClutterScriptableIface *iface);
static void clutter_animatable_iface_init (ClutterAnimatableIface *iface);
static void atk_implementor_iface_init (AtkImplementorIface *iface);
-static void clutter_actor_shader_pre_paint (ClutterActor *actor,
- gboolean repeat);
-static void clutter_actor_shader_post_paint (ClutterActor *actor);
-
/* These setters are all static for now, maybe they should be in the
* public API, but they are perhaps obscure enough to leave only as
* properties
@@ -3245,9 +3237,10 @@ clutter_actor_paint (ClutterActor *self)
if (pick_mode == CLUTTER_PICK_NONE &&
actor_has_shader_data (self))
{
- clutter_actor_shader_pre_paint (self, FALSE);
+ _clutter_actor_shader_pre_paint (self, FALSE);
shader_applied = TRUE;
}
+
priv->next_effect_to_paint = NULL;
}
else
@@ -3257,7 +3250,7 @@ clutter_actor_paint (ClutterActor *self)
clutter_actor_continue_paint (self);
if (shader_applied)
- clutter_actor_shader_post_paint (self);
+ _clutter_actor_shader_post_paint (self);
if (G_UNLIKELY (clutter_paint_debug_flags & CLUTTER_DEBUG_PAINT_VOLUMES &&
pick_mode == CLUTTER_PICK_NONE))
@@ -12328,313 +12321,6 @@ G_DEFINE_BOXED_TYPE_WITH_CODE (ClutterVertex, clutter_vertex,
clutter_vertex_free,
CLUTTER_REGISTER_INTERVAL_PROGRESS (clutter_vertex_progress));
-struct _ShaderData
-{
- ClutterShader *shader;
-
- /* back pointer to the actor */
- ClutterActor *actor;
-
- /* list of values that should be set on the shader
- * before each paint cycle
- */
- GHashTable *value_hash;
-};
-
-static void
-shader_value_free (gpointer data)
-{
- GValue *var = data;
- g_value_unset (var);
- g_slice_free (GValue, var);
-}
-
-static void
-destroy_shader_data (gpointer data)
-{
- ShaderData *shader_data = data;
-
- if (shader_data == NULL)
- return;
-
- if (shader_data->shader != NULL)
- {
- g_object_unref (shader_data->shader);
- shader_data->shader = NULL;
- }
-
- if (shader_data->value_hash != NULL)
- {
- g_hash_table_destroy (shader_data->value_hash);
- shader_data->value_hash = NULL;
- }
-
- g_slice_free (ShaderData, shader_data);
-}
-
-
-/**
- * clutter_actor_get_shader:
- * @self: a #ClutterActor
- *
- * Queries the currently set #ClutterShader on @self.
- *
- * Return value: (transfer none): The currently set #ClutterShader
- * or %NULL if no shader is set.
- *
- * Since: 0.6
- *
- * Deprecated: 1.8: Use clutter_actor_get_effect() instead.
- */
-ClutterShader *
-clutter_actor_get_shader (ClutterActor *self)
-{
- ShaderData *shader_data;
-
- g_return_val_if_fail (CLUTTER_IS_ACTOR (self), NULL);
-
- shader_data = g_object_get_qdata (G_OBJECT (self), quark_shader_data);
- if (shader_data != NULL)
- return shader_data->shader;
-
- return NULL;
-}
-
-/**
- * clutter_actor_set_shader:
- * @self: a #ClutterActor
- * @shader: (allow-none): a #ClutterShader or %NULL to unset the shader.
- *
- * Sets the #ClutterShader to be used when rendering @self.
- *
- * If @shader is %NULL this function will unset any currently set shader
- * for the actor.
- *
- * <note>Any #ClutterEffect applied to @self will take the precedence
- * over the #ClutterShader set using this function.</note>
- *
- * Return value: %TRUE if the shader was successfully applied
- * or removed
- *
- * Since: 0.6
- *
- * Deprecated: 1.8: Use #ClutterShaderEffect and
- * clutter_actor_add_effect() instead.
- */
-gboolean
-clutter_actor_set_shader (ClutterActor *self,
- ClutterShader *shader)
-{
- ShaderData *shader_data;
-
- g_return_val_if_fail (CLUTTER_IS_ACTOR (self), FALSE);
- g_return_val_if_fail (shader == NULL || CLUTTER_IS_SHADER (shader), FALSE);
-
- if (shader != NULL)
- g_object_ref (shader);
- else
- {
- /* if shader passed in is NULL we destroy the shader */
- g_object_set_qdata (G_OBJECT (self), quark_shader_data, NULL);
- return TRUE;
- }
-
- shader_data = g_object_get_qdata (G_OBJECT (self), quark_shader_data);
- if (shader_data == NULL)
- {
- shader_data = g_slice_new (ShaderData);
- shader_data->actor = self;
- shader_data->shader = NULL;
- shader_data->value_hash =
- g_hash_table_new_full (g_str_hash, g_str_equal,
- g_free,
- shader_value_free);
-
- g_object_set_qdata_full (G_OBJECT (self), quark_shader_data,
- shader_data,
- destroy_shader_data);
- }
-
- if (shader_data->shader != NULL)
- g_object_unref (shader_data->shader);
-
- shader_data->shader = shader;
-
- clutter_actor_queue_redraw (self);
-
- return TRUE;
-}
-
-
-static void
-set_each_param (gpointer key,
- gpointer value,
- gpointer user_data)
-{
- ClutterShader *shader = user_data;
- const gchar *uniform = key;
- GValue *var = value;
-
- clutter_shader_set_uniform (shader, uniform, var);
-}
-
-static void
-clutter_actor_shader_pre_paint (ClutterActor *actor,
- gboolean repeat)
-{
- ShaderData *shader_data;
- ClutterShader *shader;
-
- shader_data = g_object_get_qdata (G_OBJECT (actor), quark_shader_data);
- if (shader_data == NULL)
- return;
-
- shader = shader_data->shader;
- if (shader != NULL)
- {
- clutter_shader_set_is_enabled (shader, TRUE);
-
- g_hash_table_foreach (shader_data->value_hash, set_each_param, shader);
-
- if (!repeat)
- _clutter_context_push_shader_stack (actor);
- }
-}
-
-static void
-clutter_actor_shader_post_paint (ClutterActor *actor)
-{
- ShaderData *shader_data;
- ClutterShader *shader;
-
- shader_data = g_object_get_qdata (G_OBJECT (actor), quark_shader_data);
- if (shader_data == NULL)
- return;
-
- shader = shader_data->shader;
- if (shader != NULL)
- {
- ClutterActor *head;
-
- clutter_shader_set_is_enabled (shader, FALSE);
-
- /* remove the actor from the shaders stack; if there is another
- * actor inside it, then call pre-paint again to set its shader
- * but this time with the second argument being TRUE, indicating
- * that we are re-applying an existing shader and thus should it
- * not be prepended to the stack
- */
- head = _clutter_context_pop_shader_stack (actor);
- if (head != NULL)
- clutter_actor_shader_pre_paint (head, TRUE);
- }
-}
-
-static inline void
-clutter_actor_set_shader_param_internal (ClutterActor *self,
- const gchar *param,
- const GValue *value)
-{
- ShaderData *shader_data;
- GValue *var;
-
- shader_data = g_object_get_qdata (G_OBJECT (self), quark_shader_data);
- if (shader_data == NULL)
- return;
-
- var = g_slice_new0 (GValue);
- g_value_init (var, G_VALUE_TYPE (value));
- g_value_copy (value, var);
- g_hash_table_insert (shader_data->value_hash, g_strdup (param), var);
-
- clutter_actor_queue_redraw (self);
-}
-
-/**
- * clutter_actor_set_shader_param:
- * @self: a #ClutterActor
- * @param: the name of the parameter
- * @value: the value of the parameter
- *
- * Sets the value for a named parameter of the shader applied
- * to @actor.
- *
- * Since: 1.0
- *
- * Deprecated: 1.8: Use clutter_shader_effect_set_uniform_value() instead
- */
-void
-clutter_actor_set_shader_param (ClutterActor *self,
- const gchar *param,
- const GValue *value)
-{
- g_return_if_fail (CLUTTER_IS_ACTOR (self));
- g_return_if_fail (param != NULL);
- g_return_if_fail (CLUTTER_VALUE_HOLDS_SHADER_FLOAT (value) ||
- CLUTTER_VALUE_HOLDS_SHADER_INT (value) ||
- CLUTTER_VALUE_HOLDS_SHADER_MATRIX (value) ||
- G_VALUE_HOLDS_FLOAT (value) ||
- G_VALUE_HOLDS_INT (value));
-
- clutter_actor_set_shader_param_internal (self, param, value);
-}
-
-/**
- * clutter_actor_set_shader_param_float:
- * @self: a #ClutterActor
- * @param: the name of the parameter
- * @value: the value of the parameter
- *
- * Sets the value for a named float parameter of the shader applied
- * to @actor.
- *
- * Since: 0.8
- *
- * Deprecated: 1.8: Use clutter_shader_effect_set_uniform() instead
- */
-void
-clutter_actor_set_shader_param_float (ClutterActor *self,
- const gchar *param,
- gfloat value)
-{
- GValue var = { 0, };
-
- g_value_init (&var, G_TYPE_FLOAT);
- g_value_set_float (&var, value);
-
- clutter_actor_set_shader_param_internal (self, param, &var);
-
- g_value_unset (&var);
-}
-
-/**
- * clutter_actor_set_shader_param_int:
- * @self: a #ClutterActor
- * @param: the name of the parameter
- * @value: the value of the parameter
- *
- * Sets the value for a named int parameter of the shader applied to
- * @actor.
- *
- * Since: 0.8
- *
- * Deprecated: 1.8: Use clutter_shader_effect_set_uniform() instead
- */
-void
-clutter_actor_set_shader_param_int (ClutterActor *self,
- const gchar *param,
- gint value)
-{
- GValue var = { 0, };
-
- g_value_init (&var, G_TYPE_INT);
- g_value_set_int (&var, value);
-
- clutter_actor_set_shader_param_internal (self, param, &var);
-
- g_value_unset (&var);
-}
-
/**
* clutter_actor_is_rotated:
* @self: a #ClutterActor
diff --git a/clutter/deprecated/clutter-actor-deprecated.c b/clutter/deprecated/clutter-actor-deprecated.c
new file mode 100644
index 0000000..9a8c32e
--- /dev/null
+++ b/clutter/deprecated/clutter-actor-deprecated.c
@@ -0,0 +1,318 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <glib-object.h>
+
+#define CLUTTER_DISABLE_DEPRECATION_WARNINGS
+
+#include "clutter-actor-private.h"
+#include "clutter-private.h"
+#include "clutter-shader.h"
+
+typedef struct _ShaderData ShaderData;
+
+struct _ShaderData
+{
+ ClutterShader *shader;
+
+ /* back pointer to the actor */
+ ClutterActor *actor;
+
+ /* list of values that should be set on the shader
+ * before each paint cycle
+ */
+ GHashTable *value_hash;
+};
+
+static void
+shader_value_free (gpointer data)
+{
+ GValue *var = data;
+ g_value_unset (var);
+ g_slice_free (GValue, var);
+}
+
+static void
+destroy_shader_data (gpointer data)
+{
+ ShaderData *shader_data = data;
+
+ if (shader_data == NULL)
+ return;
+
+ if (shader_data->shader != NULL)
+ {
+ g_object_unref (shader_data->shader);
+ shader_data->shader = NULL;
+ }
+
+ if (shader_data->value_hash != NULL)
+ {
+ g_hash_table_destroy (shader_data->value_hash);
+ shader_data->value_hash = NULL;
+ }
+
+ g_slice_free (ShaderData, shader_data);
+}
+
+/**
+ * clutter_actor_get_shader:
+ * @self: a #ClutterActor
+ *
+ * Queries the currently set #ClutterShader on @self.
+ *
+ * Return value: (transfer none): The currently set #ClutterShader
+ * or %NULL if no shader is set.
+ *
+ * Since: 0.6
+ *
+ * Deprecated: 1.8: Use clutter_actor_get_effect() instead.
+ */
+ClutterShader *
+clutter_actor_get_shader (ClutterActor *self)
+{
+ ShaderData *shader_data;
+
+ g_return_val_if_fail (CLUTTER_IS_ACTOR (self), NULL);
+
+ shader_data = g_object_get_data (G_OBJECT (self), "-clutter-actor-shader-data");
+ if (shader_data != NULL)
+ return shader_data->shader;
+
+ return NULL;
+}
+
+/**
+ * clutter_actor_set_shader:
+ * @self: a #ClutterActor
+ * @shader: (allow-none): a #ClutterShader or %NULL to unset the shader.
+ *
+ * Sets the #ClutterShader to be used when rendering @self.
+ *
+ * If @shader is %NULL this function will unset any currently set shader
+ * for the actor.
+ *
+ * <note>Any #ClutterEffect applied to @self will take the precedence
+ * over the #ClutterShader set using this function.</note>
+ *
+ * Return value: %TRUE if the shader was successfully applied
+ * or removed
+ *
+ * Since: 0.6
+ *
+ * Deprecated: 1.8: Use #ClutterShaderEffect and
+ * clutter_actor_add_effect() instead.
+ */
+gboolean
+clutter_actor_set_shader (ClutterActor *self,
+ ClutterShader *shader)
+{
+ ShaderData *shader_data;
+
+ g_return_val_if_fail (CLUTTER_IS_ACTOR (self), FALSE);
+ g_return_val_if_fail (shader == NULL || CLUTTER_IS_SHADER (shader), FALSE);
+
+ if (shader != NULL)
+ g_object_ref (shader);
+ else
+ {
+ /* if shader passed in is NULL we destroy the shader */
+ g_object_set_data (G_OBJECT (self), "-clutter-actor-shader-data", NULL);
+ return TRUE;
+ }
+
+ shader_data = g_object_get_data (G_OBJECT (self), "-clutter-actor-shader-data");
+ if (shader_data == NULL)
+ {
+ shader_data = g_slice_new (ShaderData);
+ shader_data->actor = self;
+ shader_data->shader = NULL;
+ shader_data->value_hash =
+ g_hash_table_new_full (g_str_hash, g_str_equal,
+ g_free,
+ shader_value_free);
+
+ g_object_set_data_full (G_OBJECT (self), "-clutter-actor-shader-data",
+ shader_data,
+ destroy_shader_data);
+ }
+
+ if (shader_data->shader != NULL)
+ g_object_unref (shader_data->shader);
+
+ shader_data->shader = shader;
+
+ clutter_actor_queue_redraw (self);
+
+ return TRUE;
+}
+
+static void
+set_each_param (gpointer key,
+ gpointer value,
+ gpointer user_data)
+{
+ ClutterShader *shader = user_data;
+ const gchar *uniform = key;
+ GValue *var = value;
+
+ clutter_shader_set_uniform (shader, uniform, var);
+}
+
+void
+_clutter_actor_shader_pre_paint (ClutterActor *actor,
+ gboolean repeat)
+{
+ ShaderData *shader_data;
+ ClutterShader *shader;
+
+ shader_data = g_object_get_data (G_OBJECT (actor), "-clutter-actor-shader-data");
+ if (shader_data == NULL)
+ return;
+
+ shader = shader_data->shader;
+ if (shader != NULL)
+ {
+ clutter_shader_set_is_enabled (shader, TRUE);
+
+ g_hash_table_foreach (shader_data->value_hash, set_each_param, shader);
+
+ if (!repeat)
+ _clutter_context_push_shader_stack (actor);
+ }
+}
+
+void
+_clutter_actor_shader_post_paint (ClutterActor *actor)
+{
+ ShaderData *shader_data;
+ ClutterShader *shader;
+
+ shader_data = g_object_get_data (G_OBJECT (actor), "-clutter-actor-shader-data");
+ if (G_LIKELY (shader_data == NULL))
+ return;
+
+ shader = shader_data->shader;
+ if (shader != NULL)
+ {
+ ClutterActor *head;
+
+ clutter_shader_set_is_enabled (shader, FALSE);
+
+ /* remove the actor from the shaders stack; if there is another
+ * actor inside it, then call pre-paint again to set its shader
+ * but this time with the second argument being TRUE, indicating
+ * that we are re-applying an existing shader and thus should it
+ * not be prepended to the stack
+ */
+ head = _clutter_context_pop_shader_stack (actor);
+ if (head != NULL)
+ _clutter_actor_shader_pre_paint (head, TRUE);
+ }
+}
+
+static inline void
+clutter_actor_set_shader_param_internal (ClutterActor *self,
+ const gchar *param,
+ const GValue *value)
+{
+ ShaderData *shader_data;
+ GValue *var;
+
+ shader_data = g_object_get_data (G_OBJECT (self), "-clutter-actor-shader-data");
+ if (shader_data == NULL)
+ return;
+
+ var = g_slice_new0 (GValue);
+ g_value_init (var, G_VALUE_TYPE (value));
+ g_value_copy (value, var);
+ g_hash_table_insert (shader_data->value_hash, g_strdup (param), var);
+
+ clutter_actor_queue_redraw (self);
+}
+
+/**
+ * clutter_actor_set_shader_param:
+ * @self: a #ClutterActor
+ * @param: the name of the parameter
+ * @value: the value of the parameter
+ *
+ * Sets the value for a named parameter of the shader applied
+ * to @actor.
+ *
+ * Since: 1.0
+ *
+ * Deprecated: 1.8: Use clutter_shader_effect_set_uniform_value() instead
+ */
+void
+clutter_actor_set_shader_param (ClutterActor *self,
+ const gchar *param,
+ const GValue *value)
+{
+ g_return_if_fail (CLUTTER_IS_ACTOR (self));
+ g_return_if_fail (param != NULL);
+ g_return_if_fail (CLUTTER_VALUE_HOLDS_SHADER_FLOAT (value) ||
+ CLUTTER_VALUE_HOLDS_SHADER_INT (value) ||
+ CLUTTER_VALUE_HOLDS_SHADER_MATRIX (value) ||
+ G_VALUE_HOLDS_FLOAT (value) ||
+ G_VALUE_HOLDS_INT (value));
+
+ clutter_actor_set_shader_param_internal (self, param, value);
+}
+
+/**
+ * clutter_actor_set_shader_param_float:
+ * @self: a #ClutterActor
+ * @param: the name of the parameter
+ * @value: the value of the parameter
+ *
+ * Sets the value for a named float parameter of the shader applied
+ * to @actor.
+ *
+ * Since: 0.8
+ *
+ * Deprecated: 1.8: Use clutter_shader_effect_set_uniform() instead
+ */
+void
+clutter_actor_set_shader_param_float (ClutterActor *self,
+ const gchar *param,
+ gfloat value)
+{
+ GValue var = { 0, };
+
+ g_value_init (&var, G_TYPE_FLOAT);
+ g_value_set_float (&var, value);
+
+ clutter_actor_set_shader_param_internal (self, param, &var);
+
+ g_value_unset (&var);
+}
+
+/**
+ * clutter_actor_set_shader_param_int:
+ * @self: a #ClutterActor
+ * @param: the name of the parameter
+ * @value: the value of the parameter
+ *
+ * Sets the value for a named int parameter of the shader applied to
+ * @actor.
+ *
+ * Since: 0.8
+ *
+ * Deprecated: 1.8: Use clutter_shader_effect_set_uniform() instead
+ */
+void
+clutter_actor_set_shader_param_int (ClutterActor *self,
+ const gchar *param,
+ gint value)
+{
+ GValue var = { 0, };
+
+ g_value_init (&var, G_TYPE_INT);
+ g_value_set_int (&var, value);
+
+ clutter_actor_set_shader_param_internal (self, param, &var);
+
+ g_value_unset (&var);
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]