From a81dbcf4837a589e63bd026fbc3759b109f96a41 Mon Sep 17 00:00:00 2001 From: Elliot Smith Date: Tue, 8 Mar 2011 11:19:13 +0000 Subject: [PATCH 1/4] docs: Add example of a border added through ClutterEffect Add a basic example showing how to implement a ClutterEffect post_paint() function to overlay a highlight border over a rectangular actor. --- doc/cookbook/examples/Makefile.am | 2 + doc/cookbook/examples/cb-border-effect.c | 317 +++++++++++++++++++++++ doc/cookbook/examples/cb-border-effect.h | 54 ++++ doc/cookbook/examples/effects-basic.c | 106 ++++++++ 4 files changed, 479 insertions(+) create mode 100644 doc/cookbook/examples/cb-border-effect.c create mode 100644 doc/cookbook/examples/cb-border-effect.h create mode 100644 doc/cookbook/examples/effects-basic.c diff --git a/doc/cookbook/examples/Makefile.am b/doc/cookbook/examples/Makefile.am index fa7a8781a..6f0c4b396 100644 --- a/doc/cookbook/examples/Makefile.am +++ b/doc/cookbook/examples/Makefile.am @@ -18,6 +18,7 @@ noinst_PROGRAMS = \ animations-rotating \ animations-scaling \ animations-scaling-zoom \ + effects-basic \ effects-built-in \ effects-custom-deform \ text-shadow \ @@ -83,6 +84,7 @@ animations_reuse_SOURCES = animations-reuse.c animations_rotating_SOURCES = animations-rotating.c animations_scaling_SOURCES = animations-scaling.c animations_scaling_zoom_SOURCES = animations-scaling-zoom.c +effects_basic_SOURCES = cb-border-effect.c cb-border-effect.h effects-basic.c effects_built_in_SOURCES = effects-built-in.c effects_custom_deform_SOURCES = cb-page-fold-effect.c cb-page-fold-effect.h effects-custom-deform.c text_shadow_SOURCES = text-shadow.c diff --git a/doc/cookbook/examples/cb-border-effect.c b/doc/cookbook/examples/cb-border-effect.c new file mode 100644 index 000000000..f7bb6b9a6 --- /dev/null +++ b/doc/cookbook/examples/cb-border-effect.c @@ -0,0 +1,317 @@ +#include "cb-border-effect.h" + +G_DEFINE_TYPE (CbBorderEffect, cb_border_effect, CLUTTER_TYPE_EFFECT); + +#define CB_BORDER_EFFECT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \ + CB_TYPE_BORDER_EFFECT, \ + CbBorderEffectPrivate)) + +static const ClutterColor grey = { 0xaa, 0xaa, 0xaa, 0xff }; + +struct _CbBorderEffectPrivate +{ + CoglMaterial *border; + ClutterColor color; + gfloat width; +}; + +enum { + PROP_0, + + PROP_COLOR, + PROP_WIDTH, + + PROP_LAST +}; + +static GParamSpec *obj_props[PROP_LAST]; + +/* ClutterEffect implementation */ +static void +cb_border_effect_post_paint (ClutterEffect *self) +{ + ClutterActor *actor; + gfloat width; + gfloat height; + CbBorderEffectPrivate *priv; + + ClutterActorMeta *meta = CLUTTER_ACTOR_META (self); + + /* check that the effect is enabled before applying it */ + if (!clutter_actor_meta_get_enabled (meta)) + return; + + priv = CB_BORDER_EFFECT (self)->priv; + + /* get the associated actor's dimensions */ + actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (self)); + clutter_actor_get_size (actor, &width, &height); + + /* draw Cogl rectangles on top */ + cogl_set_source (priv->border); + cogl_path_new (); + + /* left rectangle */ + cogl_path_rectangle (0, 0, priv->width, height); + + /* top rectangle */ + cogl_path_rectangle (priv->width, 0, width, priv->width); + + /* right rectangle */ + cogl_path_rectangle (width - priv->width, priv->width, width, height); + + /* bottom rectangle */ + cogl_path_rectangle (priv->width, + height - priv->width, + width - priv->width, + height); + + cogl_path_fill (); +} + +/* GObject implementation */ +static void +cb_border_effect_dispose (GObject *gobject) +{ + CbBorderEffectPrivate *priv = CB_BORDER_EFFECT (gobject)->priv; + + if (priv->border != COGL_INVALID_HANDLE) + { + cogl_handle_unref (priv->border); + priv->border = COGL_INVALID_HANDLE; + } + + G_OBJECT_CLASS (cb_border_effect_parent_class)->dispose (gobject); +} + +static void +cb_border_effect_set_property (GObject *gobject, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + CbBorderEffect *effect = CB_BORDER_EFFECT (gobject); + + switch (prop_id) + { + case PROP_COLOR: + cb_border_effect_set_color (effect, clutter_value_get_color (value)); + break; + + case PROP_WIDTH: + cb_border_effect_set_width (effect, g_value_get_float (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); + break; + } +} + +static void +cb_border_effect_get_property (GObject *gobject, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + CbBorderEffectPrivate *priv = CB_BORDER_EFFECT (gobject)->priv; + + switch (prop_id) + { + case PROP_COLOR: + g_value_set_object (value, &(priv->color)); + break; + + case PROP_WIDTH: + g_value_set_float (value, priv->width); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); + break; + } +} + +/* GObject class and instance init */ +static void +cb_border_effect_class_init (CbBorderEffectClass *klass) +{ + ClutterEffectClass *effect_class = CLUTTER_EFFECT_CLASS (klass); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GParamSpec *pspec; + + effect_class->post_paint = cb_border_effect_post_paint; + + gobject_class->set_property = cb_border_effect_set_property; + gobject_class->get_property = cb_border_effect_get_property; + gobject_class->dispose = cb_border_effect_dispose; + + g_type_class_add_private (klass, sizeof (CbBorderEffectPrivate)); + + /** + * CbBorderEffect:width: + * + * The width of the border + */ + pspec = g_param_spec_float ("width", + "Width", + "The width of the border (in pixels)", + 1.0, 100.0, + 10.0, + G_PARAM_READWRITE); + obj_props[PROP_WIDTH] = pspec; + g_object_class_install_property (gobject_class, PROP_WIDTH, pspec); + + /** + * CbBorderEffect:color: + * + * The color of the border + */ + pspec = clutter_param_spec_color ("color", + "Color", + "The border color", + &grey, + G_PARAM_READWRITE); + obj_props[PROP_COLOR] = pspec; + g_object_class_install_property (gobject_class, PROP_COLOR, pspec); +} + +static void +cb_border_effect_init (CbBorderEffect *self) +{ + CbBorderEffectPrivate *priv; + + priv = self->priv = CB_BORDER_EFFECT_GET_PRIVATE (self); + + priv->border = cogl_material_new (); + + priv->color = grey; +} + +/* called each time a property is set on the effect */ +static void +cb_border_effect_update (CbBorderEffect *self) +{ + ClutterActor *actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (self)); + + if (actor != NULL) + clutter_actor_queue_redraw (actor); +} + +/* public API */ + +/** + * cb_border_effect_new: + * @width: width of the border applied by the effect + * @color: a #ClutterColor + * + * Creates a new #ClutterEffect with the given @width + * and of the given @color. + */ +ClutterEffect * +cb_border_effect_new (gfloat width, + const ClutterColor *color) +{ + return g_object_new (CB_TYPE_BORDER_EFFECT, + "width", width, + "color", color, + NULL); +} + +/** + * cb_border_effect_set_color: + * @self: a #CbBorderEffect + * @color: a #ClutterColor + * + * Sets the color of the border provided by the effect @self. + */ +void +cb_border_effect_set_color (CbBorderEffect *self, + const ClutterColor *color) +{ + CbBorderEffectPrivate *priv; + + g_return_if_fail (CB_IS_BORDER_EFFECT (self)); + g_return_if_fail (color != NULL); + + priv = CB_BORDER_EFFECT_GET_PRIVATE (self); + + priv->color.red = color->red; + priv->color.green = color->green; + priv->color.blue = color->blue; + priv->color.alpha = color->alpha; + + cogl_material_set_color4ub (priv->border, + color->red, + color->green, + color->blue, + color->alpha); + + cb_border_effect_update (self); +} + +/** + * cb_border_effect_get_color: + * @self: a #CbBorderEffect + * @color: return location for a #ClutterColor + * + * Retrieves the color of the border applied by the effect @self. + */ +void +cb_border_effect_get_color (CbBorderEffect *self, + ClutterColor *color) +{ + CbBorderEffectPrivate *priv; + + g_return_if_fail (CB_IS_BORDER_EFFECT (self)); + + priv = CB_BORDER_EFFECT_GET_PRIVATE (self); + + color->red = priv->color.red; + color->green = priv->color.green; + color->blue = priv->color.blue; + color->alpha = priv->color.alpha; +} + +/** + * cb_border_effect_set_width: + * @self: a #CbBorderEffect + * @width: the width of the border + * + * Sets the width (in pixels) of the border applied by the effect @self. + */ +void +cb_border_effect_set_width (CbBorderEffect *self, + gfloat width) +{ + CbBorderEffectPrivate *priv; + + g_return_if_fail (CB_IS_BORDER_EFFECT (self)); + + priv = CB_BORDER_EFFECT_GET_PRIVATE (self); + + priv->width = width; + + cb_border_effect_update (self); +} + +/** + * cb_border_effect_get_width: + * @self: a #CbBorderEffect + * + * Gets the width (in pixels) of the border applied by the effect @self. + * + * Return value: the border's width, or 0.0 if @self is not + * a #CbBorderEffect + */ +gfloat +cb_border_effect_get_width (CbBorderEffect *self) +{ + CbBorderEffectPrivate *priv; + + g_return_val_if_fail (CB_IS_BORDER_EFFECT (self), 0.0); + + priv = CB_BORDER_EFFECT_GET_PRIVATE (self); + + return priv->width; +} diff --git a/doc/cookbook/examples/cb-border-effect.h b/doc/cookbook/examples/cb-border-effect.h new file mode 100644 index 000000000..c4c6a3675 --- /dev/null +++ b/doc/cookbook/examples/cb-border-effect.h @@ -0,0 +1,54 @@ +#ifndef __CB_BORDER_EFFECT_H__ +#define __CB_BORDER_EFFECT_H__ + +#include + +GType cb_border_effect_get_type (void); + +#define CB_TYPE_BORDER_EFFECT (cb_border_effect_get_type ()) +#define CB_BORDER_EFFECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ + CB_TYPE_BORDER_EFFECT, \ + CbBorderEffect)) +#define CB_IS_BORDER_EFFECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \ + CB_TYPE_BORDER_EFFECT)) +#define CB_BORDER_EFFECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), \ + CB_TYPE_BORDER_EFFECT, \ + CbBorderEffectClass)) +#define CB_IS_BORDER_EFFECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), \ + CB_TYPE_BORDER_EFFECT)) +#define CB_BORDER_EFFECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), \ + CB_TYPE_BORDER_EFFECT, \ + CbBorderEffectClass)) + +typedef struct _CbBorderEffectPrivate CbBorderEffectPrivate; +typedef struct _CbBorderEffect CbBorderEffect; +typedef struct _CbBorderEffectClass CbBorderEffectClass; + +/* object */ +struct _CbBorderEffect +{ + ClutterEffect parent_instance; + CbBorderEffectPrivate *priv; +}; + +/* class */ +struct _CbBorderEffectClass +{ + ClutterEffectClass parent_class; +}; + +ClutterEffect *cb_border_effect_new (gfloat width, + const ClutterColor *color); + +void cb_border_effect_set_color (CbBorderEffect *self, + const ClutterColor *color); + +void cb_border_effect_get_color (CbBorderEffect *self, + ClutterColor *color); + +void cb_border_effect_set_width (CbBorderEffect *self, + gfloat width); + +gfloat cb_border_effect_get_width (CbBorderEffect *self); + +#endif /* __CB_BORDER_EFFECT_H__ */ diff --git a/doc/cookbook/examples/effects-basic.c b/doc/cookbook/examples/effects-basic.c new file mode 100644 index 000000000..a59291f24 --- /dev/null +++ b/doc/cookbook/examples/effects-basic.c @@ -0,0 +1,106 @@ +#include +#include + +#include "cb-border-effect.h" + +static const ClutterColor stage_color = { 0x33, 0x33, 0x55, 0xff }; +static ClutterColor red_color = { 0xff, 0x00, 0x00, 0xff }; + +static gboolean +add_highlight (ClutterActor *actor, + ClutterEvent *event, + gpointer user_data) +{ + ClutterActorMeta *meta = CLUTTER_ACTOR_META (user_data); + + gboolean effect_enabled = clutter_actor_meta_get_enabled (meta); + + clutter_actor_meta_set_enabled (meta, !effect_enabled); + + clutter_actor_queue_redraw (actor); + + return TRUE; +} + +int +main (int argc, + char *argv[]) +{ + ClutterActor *stage; + ClutterActor *box; + ClutterLayoutManager *layout_manager; + ClutterActor *texture; + ClutterEffect *effect; + gchar *filename; + guint i; + GError *error = NULL; + + if (argc < 2) + { + g_print ("Usage: %s \n", argv[0]); + return EXIT_FAILURE; + } + + if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS) + return EXIT_FAILURE; + + stage = clutter_stage_new (); + clutter_stage_set_color (CLUTTER_STAGE (stage), &stage_color); + clutter_stage_set_user_resizable (CLUTTER_STAGE (stage), TRUE); + clutter_actor_set_size (stage, 600, 400); + g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL); + + layout_manager = clutter_flow_layout_new (CLUTTER_FLOW_HORIZONTAL); + clutter_flow_layout_set_column_spacing (CLUTTER_FLOW_LAYOUT (layout_manager), + 10); + clutter_flow_layout_set_row_spacing (CLUTTER_FLOW_LAYOUT (layout_manager), + 10); + + box = clutter_box_new (layout_manager); + clutter_actor_add_constraint (box, clutter_bind_constraint_new (stage, CLUTTER_BIND_WIDTH, 0.0)); + + /* loop through the files specified on the command line, adding + * each one into the box + */ + for (i = 1; i < argc; i++) + { + filename = argv[i]; + + texture = clutter_texture_new (); + clutter_texture_set_keep_aspect_ratio (CLUTTER_TEXTURE (texture), TRUE); + clutter_actor_set_width (texture, 150); + clutter_actor_set_reactive (texture, TRUE); + + clutter_texture_set_from_file (CLUTTER_TEXTURE (texture), + filename, + &error); + + if (error != NULL) + g_warning ("Error loading file %s:\n%s", + filename, + error->message); + + /* create a 5 pixel red border effect */ + effect = cb_border_effect_new (5.0, &red_color); + + /* add the effect to the actor, but disabled */ + clutter_actor_add_effect (texture, effect); + clutter_actor_meta_set_enabled (CLUTTER_ACTOR_META (effect), FALSE); + + /* on mouse click, toggle the "enabled" property of the border effect */ + g_signal_connect (texture, + "button-press-event", + G_CALLBACK (add_highlight), + effect); + + clutter_container_add_actor (CLUTTER_CONTAINER (box), texture); + } + + clutter_container_add_actor (CLUTTER_CONTAINER (stage), box); + + clutter_actor_show (stage); + + clutter_main (); + + return EXIT_SUCCESS; +} From 5732b1184f013ce9ca33580e214d60400f00d271 Mon Sep 17 00:00:00 2001 From: Elliot Smith Date: Tue, 8 Mar 2011 14:54:00 +0000 Subject: [PATCH 2/4] docs: Add example of setting background color with ClutterEffect Add example of a simple background color effect applied via pre_paint() implementation in a ClutterEffect subclass. This is a simple effect with an incomplete GObject implementation (no properties, setters or getters) to make it as easy to follow as possible. --- doc/cookbook/examples/Makefile.am | 6 +- doc/cookbook/examples/cb-background-effect.c | 110 +++++++++++++++++++ doc/cookbook/examples/cb-background-effect.h | 42 +++++++ doc/cookbook/examples/effects-basic.c | 37 +++++-- 4 files changed, 182 insertions(+), 13 deletions(-) create mode 100644 doc/cookbook/examples/cb-background-effect.c create mode 100644 doc/cookbook/examples/cb-background-effect.h diff --git a/doc/cookbook/examples/Makefile.am b/doc/cookbook/examples/Makefile.am index 6f0c4b396..52fec52f7 100644 --- a/doc/cookbook/examples/Makefile.am +++ b/doc/cookbook/examples/Makefile.am @@ -84,7 +84,11 @@ animations_reuse_SOURCES = animations-reuse.c animations_rotating_SOURCES = animations-rotating.c animations_scaling_SOURCES = animations-scaling.c animations_scaling_zoom_SOURCES = animations-scaling-zoom.c -effects_basic_SOURCES = cb-border-effect.c cb-border-effect.h effects-basic.c +effects_basic_SOURCES = cb-border-effect.c \ + cb-border-effect.h \ + cb-background-effect.c \ + cb-background-effect.h \ + effects-basic.c effects_built_in_SOURCES = effects-built-in.c effects_custom_deform_SOURCES = cb-page-fold-effect.c cb-page-fold-effect.h effects-custom-deform.c text_shadow_SOURCES = text-shadow.c diff --git a/doc/cookbook/examples/cb-background-effect.c b/doc/cookbook/examples/cb-background-effect.c new file mode 100644 index 000000000..71b2ceee2 --- /dev/null +++ b/doc/cookbook/examples/cb-background-effect.c @@ -0,0 +1,110 @@ +#include "cb-background-effect.h" + +G_DEFINE_TYPE (CbBackgroundEffect, cb_background_effect, CLUTTER_TYPE_EFFECT); + +#define CB_BACKGROUND_EFFECT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \ + CB_TYPE_BACKGROUND_EFFECT, \ + CbBackgroundEffectPrivate)) + +struct _CbBackgroundEffectPrivate +{ + CoglMaterial *background; + CoglColor *color; +}; + +/* ClutterEffect implementation */ + +/* note that if pre_paint() returns FALSE + * any post_paint() defined for the effect will not be called + */ +static gboolean +cb_background_effect_pre_paint (ClutterEffect *self) +{ + ClutterActor *actor; + gfloat width; + gfloat height; + CbBackgroundEffectPrivate *priv; + + ClutterActorMeta *meta = CLUTTER_ACTOR_META (self); + + /* check that the effect is enabled before applying it */ + if (!clutter_actor_meta_get_enabled (meta)) + return TRUE; + + priv = CB_BACKGROUND_EFFECT (self)->priv; + + /* get the associated actor's dimensions */ + actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (self)); + clutter_actor_get_size (actor, &width, &height); + + /* draw a grey Cogl rectangle in the background */ + cogl_set_source (priv->background); + + cogl_rectangle (0, 0, width, height); + + return TRUE; +} + +/* GObject implementation */ +static void +cb_background_effect_dispose (GObject *gobject) +{ + CbBackgroundEffectPrivate *priv = CB_BACKGROUND_EFFECT (gobject)->priv; + + if (priv->background != COGL_INVALID_HANDLE) + { + cogl_handle_unref (priv->background); + priv->background = COGL_INVALID_HANDLE; + } + + if (priv->color != NULL) + { + cogl_color_free (priv->color); + priv->color = NULL; + } + + G_OBJECT_CLASS (cb_background_effect_parent_class)->dispose (gobject); +} + +static void +cb_background_effect_class_init (CbBackgroundEffectClass *klass) +{ + ClutterEffectClass *effect_class = CLUTTER_EFFECT_CLASS (klass); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + effect_class->pre_paint = cb_background_effect_pre_paint; + gobject_class->dispose = cb_background_effect_dispose; + + g_type_class_add_private (klass, sizeof (CbBackgroundEffectPrivate)); +} + +static void +cb_background_effect_init (CbBackgroundEffect *self) +{ + CbBackgroundEffectPrivate *priv; + + priv = self->priv = CB_BACKGROUND_EFFECT_GET_PRIVATE (self); + + priv->background = cogl_material_new (); + + /* grey color for filling the background material */ + priv->color = cogl_color_new (); + cogl_color_init_from_4ub (priv->color, 122, 122, 122, 255); + + cogl_material_set_color (priv->background, priv->color); +} + +/* public API */ + +/** + * cb_background_effect_new: + * + * Creates a new #ClutterEffect which adds a grey background + * when applied to a rectangular actor. + */ +ClutterEffect * +cb_background_effect_new () +{ + return g_object_new (CB_TYPE_BACKGROUND_EFFECT, + NULL); +} diff --git a/doc/cookbook/examples/cb-background-effect.h b/doc/cookbook/examples/cb-background-effect.h new file mode 100644 index 000000000..b2ce987e3 --- /dev/null +++ b/doc/cookbook/examples/cb-background-effect.h @@ -0,0 +1,42 @@ +#ifndef __CB_BACKGROUND_EFFECT_H__ +#define __CB_BACKGROUND_EFFECT_H__ + +#include + +GType cb_background_effect_get_type (void); + +#define CB_TYPE_BACKGROUND_EFFECT (cb_background_effect_get_type ()) +#define CB_BACKGROUND_EFFECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ + CB_TYPE_BACKGROUND_EFFECT, \ + CbBackgroundEffect)) +#define CB_IS_BACKGROUND_EFFECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \ + CB_TYPE_BACKGROUND_EFFECT)) +#define CB_BACKGROUND_EFFECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), \ + CB_TYPE_BACKGROUND_EFFECT, \ + CbBackgroundEffectClass)) +#define CB_IS_BACKGROUND_EFFECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), \ + CB_TYPE_BACKGROUND_EFFECT)) +#define CB_BACKGROUND_EFFECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), \ + CB_TYPE_BACKGROUND_EFFECT, \ + CbBackgroundEffectClass)) + +typedef struct _CbBackgroundEffectPrivate CbBackgroundEffectPrivate; +typedef struct _CbBackgroundEffect CbBackgroundEffect; +typedef struct _CbBackgroundEffectClass CbBackgroundEffectClass; + +/* object */ +struct _CbBackgroundEffect +{ + ClutterEffect parent_instance; + CbBackgroundEffectPrivate *priv; +}; + +/* class */ +struct _CbBackgroundEffectClass +{ + ClutterEffectClass parent_class; +}; + +ClutterEffect *cb_background_effect_new (); + +#endif /* __CB_BACKGROUND_EFFECT_H__ */ diff --git a/doc/cookbook/examples/effects-basic.c b/doc/cookbook/examples/effects-basic.c index a59291f24..875e4c8e5 100644 --- a/doc/cookbook/examples/effects-basic.c +++ b/doc/cookbook/examples/effects-basic.c @@ -2,14 +2,15 @@ #include #include "cb-border-effect.h" +#include "cb-background-effect.h" static const ClutterColor stage_color = { 0x33, 0x33, 0x55, 0xff }; static ClutterColor red_color = { 0xff, 0x00, 0x00, 0xff }; static gboolean -add_highlight (ClutterActor *actor, - ClutterEvent *event, - gpointer user_data) +toggle_highlight (ClutterActor *actor, + ClutterEvent *event, + gpointer user_data) { ClutterActorMeta *meta = CLUTTER_ACTOR_META (user_data); @@ -30,7 +31,9 @@ main (int argc, ClutterActor *box; ClutterLayoutManager *layout_manager; ClutterActor *texture; - ClutterEffect *effect; + ClutterEffect *background_effect; + ClutterEffect *border_effect; + ClutterConstraint *width_constraint; gchar *filename; guint i; GError *error = NULL; @@ -57,7 +60,10 @@ main (int argc, 10); box = clutter_box_new (layout_manager); - clutter_actor_add_constraint (box, clutter_bind_constraint_new (stage, CLUTTER_BIND_WIDTH, 0.0)); + width_constraint = clutter_bind_constraint_new (stage, + CLUTTER_BIND_WIDTH, + 0.0); + clutter_actor_add_constraint (box, width_constraint); /* loop through the files specified on the command line, adding * each one into the box @@ -80,18 +86,25 @@ main (int argc, filename, error->message); - /* create a 5 pixel red border effect */ - effect = cb_border_effect_new (5.0, &red_color); + /* create a grey background effect */ + background_effect = cb_background_effect_new (); - /* add the effect to the actor, but disabled */ - clutter_actor_add_effect (texture, effect); - clutter_actor_meta_set_enabled (CLUTTER_ACTOR_META (effect), FALSE); + /* apply the effect to the actor */ + clutter_actor_add_effect (texture, background_effect); + + /* create a 5 pixel red border effect */ + border_effect = cb_border_effect_new (5.0, &red_color); + + /* apply the effect to the actor, but disabled */ + clutter_actor_add_effect (texture, border_effect); + clutter_actor_meta_set_enabled (CLUTTER_ACTOR_META (border_effect), + FALSE); /* on mouse click, toggle the "enabled" property of the border effect */ g_signal_connect (texture, "button-press-event", - G_CALLBACK (add_highlight), - effect); + G_CALLBACK (toggle_highlight), + border_effect); clutter_container_add_actor (CLUTTER_CONTAINER (box), texture); } From b5af8fbfac405b26fc356ecd27b1eb4de530d838 Mon Sep 17 00:00:00 2001 From: Elliot Smith Date: Wed, 16 Mar 2011 17:44:44 +0000 Subject: [PATCH 3/4] docs: Add recipe about implementing a ClutterEffect Add a recipe showing how to implement two simple effects, based on ClutterEffect: an always gray background, and a border with configurable width and color. Also explains the necessity to queue a redraw on the associated actor if the effect's properties change, and shows how to implement that. The example gives the GObject code for both effects, as well as an example application showing how to use them. The example also demonstrates how to disable/enable an effect, making the border round an actor togglable. --- doc/cookbook/Makefile.am | 2 + doc/cookbook/effects.xml | 537 ++++++++++++++++++ .../images/effects-basic-background.png | Bin 0 -> 10126 bytes doc/cookbook/images/effects-basic.png | Bin 0 -> 72029 bytes 4 files changed, 539 insertions(+) create mode 100644 doc/cookbook/images/effects-basic-background.png create mode 100644 doc/cookbook/images/effects-basic.png diff --git a/doc/cookbook/Makefile.am b/doc/cookbook/Makefile.am index c567cbdeb..5c70e4dfe 100644 --- a/doc/cookbook/Makefile.am +++ b/doc/cookbook/Makefile.am @@ -37,6 +37,8 @@ HTML_FILES = $(top_builddir)/doc/cookbook/html/*.html CSS_FILES = $(top_builddir)/doc/cookbook/html/*.css IMAGE_FILES = \ $(srcdir)/images/clutter-logo.png \ + $(srcdir)/images/effects-basic.png \ + $(srcdir)/images/effects-basic-background.png \ $(srcdir)/images/effects-built-in.png \ $(srcdir)/images/effects-custom-deform.png \ $(srcdir)/images/effects-custom-deform-back-material.png \ diff --git a/doc/cookbook/effects.xml b/doc/cookbook/effects.xml index 2688bc941..d6c02955d 100644 --- a/doc/cookbook/effects.xml +++ b/doc/cookbook/effects.xml @@ -245,6 +245,543 @@ clutter_actor_add_effect (texture, effect); +
+ Changing an actor's paint sequence using + <type>ClutterEffect</type> + +
+ Problem + + You want to paint on top of or under an actor in a generic + way, without editing the actor's paint() + implementation. Example use cases are: + + + + Adding a border on top of an actor. + + + Drawing a background for an actor. + + + + A quick way to achieve the same thing (though not + readily portable between actors) is to connect a callback + before or after an actor's paint signal. + See this recipe for + more details. However, using a ClutterEffect + implementation, as explained in this recipe, is the preferred + approach. +
+ +
+ Solution + + Create a subclass of the ClutterEffect abstract + class; then implement the pre_paint() and/or + post_paint() virtual functions. When the + effect is applied to an actor, these functions will paint + before and after the actor's own paint() + implementation. + + + For this solution, we implement a simple + CbBackgroundEffect which draws a gray rectangle + under an actor. The full source is in + this + section. To keep it simple, the effect has no properties + and isn't configurable (the background is always gray); see the + border + effect for a more detailed implementation with GObject + trimmings. + + + First, create a ClutterEffect subclass. This + requires the trappings of a GObject class; in particular, + it needs a private struct to hold the effect's state. This + should include any CoglMaterials, + CoglColors or other private member variables + you intend to use to draw the effect. + + In the case of the background effect, we have a background + CoglMaterial and a CoglColor for that + material: + + + +struct _CbBackgroundEffectPrivate +{ + CoglMaterial *background; + CoglColor *color; +}; + + + + In the init() function for objects of + your class, create any Cogl resources which you need to draw the + effect. In the case of the background effect, + we need to create the CoglMaterial and + CoglColor for the private struct: + + + +priv = CB_BACKGROUND_EFFECT_GET_PRIVATE (self); + + /* create the background material */ + priv->background = cogl_material_new (); + + /* gray color for filling the background material */ + priv->color = cogl_color_new (); + cogl_color_init_from_4ub (priv->color, 122, 122, 122, 255); + + /* set the color on the material; NB this isn't configurable + * for this effect, and is always gray + */ + cogl_material_set_color (priv->background, priv->color); +} +]]> + + + + Optionally, you can create GObject properties for + the class, if you want a configurable effect: see + this + section for details. + + The dispose() function for your effect + should clean up any Cogl resources: + + + +priv; + + if (priv->background != COGL_INVALID_HANDLE) + { + cogl_handle_unref (priv->background); + priv->background = COGL_INVALID_HANDLE; + } + + if (priv->color != NULL) + { + cogl_color_free (priv->color); + priv->color = NULL; + } + + G_OBJECT_CLASS (cb_background_effect_parent_class)->dispose (gobject); +} +]]> + + + + Now, the important part: implement pre_paint() + and/or post_paint(), using Cogl to draw on the + material(s) set up for the effect. In these functions, you should also + check whether the effect is enabled before drawing. + + For the background effect, we implement pre_paint(), + to draw a gray rectangle under the actor: + + + +priv; + + /* get the associated actor's dimensions */ + actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (self)); + clutter_actor_get_size (actor, &width, &height); + + /* draw a Cogl rectangle in the background using the default color */ + cogl_set_source (priv->background); + + /* the rectangle has the same dimensions as the actor */ + cogl_rectangle (0, 0, width, height); + + return TRUE; +} +]]> + + + + Now, in the init() function for the + effect class, assign your implementations to the + virtual methods of the ClutterEffect abstract class: + + + +pre_paint = cb_background_effect_pre_paint; + gobject_class->dispose = cb_background_effect_dispose; + + g_type_class_add_private (klass, sizeof (CbBackgroundEffectPrivate)); +} +]]> + + + + If you intend to make your effect reusable, provide + a public constructor (as is done for the example effects in this + recipe): + + + +ClutterEffect * +cb_background_effect_new () +{ + return g_object_new (CB_TYPE_BACKGROUND_EFFECT, + NULL); +} + + + + The effect is now ready to be used. The application code + for applying your effect to an actor is the same as for any + other effect: + + + +ClutterActor *texture; +ClutterEffect *background_effect; + +/* ...initialize texture, load image file etc... */ + +/* create a gray background effect */ +background_effect = cb_background_effect_new (); + +/* apply the effect to the actor */ +clutter_actor_add_effect (texture, background_effect); + + + + Below is an example of applying this effect to a texture loaded + with an image; the image has a transparent background, so the + background is visible through it. The screenshot is from + the example + application: + + + + + + + + Applying CbBackgroundEffect + to a texture loaded with an image that has a transparent + background + + + + +
+ +
+ Discussion + + A basic ClutterEffect is particularly useful for + amending the appearance of an actor on the fly: for example, + to highlight an actor in response to a button presses. This + could be done by creating a custom widget + whose appearance could be toggled. But what if you wanted to make + an arbitrary actor's appearance "togglable"? A generic effect + in the style of the border effect in this recipe can be applied + to any actor, and easily toggled by enabling/disabling the + effect. + + ClutterEffect works best where + you want to overlay or underlay the actor with Cogl paths or + primitives, without changing the actor's geometry. If you want + to do complicated geometry transformations, or other subtle + manipulations of an actor's appearance, it is better to use + a ClutterEffect subclass like + ClutterOffscreenEffect, ClutterDeformEffect, + or ClutterShaderEffect. + + In a similar vein, when a ClutterEffect is + applied to an actor, the effect shouldn't paint outside the actor's + allocation. However, if the effect provides a + get_paint_volume() implementation which + returns a volume larger than the actor's allocation, the effect + can paint anywhere within that volume. Though + in most cases, creating a custom paint volume is only going to be + useful for offscreen effects, where you are changing the + actor's geometry. + +
+ Effect properties + + If your effect has GObject properties, you should + ensure that an actor associated with the effect is queued + for a redraw when those properties change. (You only need to + do this for properties which change the effect's appearance; + but this is likely to include most of an effect's properties.) + + In most cases, you're likely define standard GObject + properties for the class; for example, + CbBorderEffect + defines a width property like this: + + + + + + + + It also defines a standard GObject + set_property() function for + width: + + + + + + + + Note that this calls + cb_border_effect_set_width(), which is + also exposed in the public API. This is where the + width member variable is actually set in + the private struct; and also where the redraw for the actor + associated with the effect should be queued: + + + +width = width; + + /* the property has been updated, so queue a redraw of the actor (if set) */ + cb_border_effect_update (self); +} +]]> + + + + Any other property setters which affect the associated + actor's appearance (i.e. color in the case of + CbBorderEffect) should also call the update + function after setting the property. + + + If your effect exposes GObject properties in this way, + it can also be animated with the Clutter animation API as usual. + For example, you could animate the border effect in this recipe + so that the border gradually becomes thinner or thicker. + + +
+ +
+ +
+ Full example + + The example application applies two effects to a + group of ClutterTextures: + + + + A CbBackgroundEffect which draws a gray + background under each actor. The effect is implemented in + a header + file and a C + code file. + + + A CbBorderEffect which draws a + red border on top of an actor; this is toggled by clicking + on the actor. The effect is implemented in + a header + file and a C + code file. + + + + The application + creates textures from the file paths specified + on the command line then applies both of these effects to + each texture. In the case of the CbBorderEffect, + a 5 pixel red border is applied; this is also disabled by default, + and enabled when a texture is clicked. + + Here is an example of the output when the application is loaded + with four images: + + + + + + + + Applying CbBackgroundEffect + and a togglable CbBorderEffect + to a several textures + + + + +
+ <type>CbBackgroundEffect</type> + + + <filename>cb-background-effect.h</filename> (header file) + + + a code sample should be here... but isn't + + + + + + <filename>cb-background-effect.c</filename> (code file) + + + a code sample should be here... but isn't + + + +
+ +
+ <type>CbBorderEffect</type> + + This is a more sophisticated effect with configurable + border color and width. + + + <filename>cb-border-effect.h</filename> (header file) + + + a code sample should be here... but isn't + + + + + + <filename>cb-border-effect.c</filename> (code file) + + + a code sample should be here... but isn't + + + +
+ +
+ Application + + + Application which applies <type>CbBorderEffect</type> + and <type>CbBackgroundEffect</type> to a group of + <type>ClutterTextures</type>. + + + a code sample should be here... but isn't + + + +
+ +
+ +
+
Creating and animating a custom <type>ClutterDeformEffect</type> diff --git a/doc/cookbook/images/effects-basic-background.png b/doc/cookbook/images/effects-basic-background.png new file mode 100644 index 0000000000000000000000000000000000000000..737affe91f7aa9506f75174d03fa64a7e27dfb19 GIT binary patch literal 10126 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 literal 0 HcmV?d00001 From 57a5f2296ae60a72cb64a506060664fb7362e628 Mon Sep 17 00:00:00 2001 From: Elliot Smith Date: Thu, 17 Mar 2011 15:45:57 +0000 Subject: [PATCH 4/4] docs: Remove checks for whether an effect is disabled pre_paint() and post_paint() implementations don't need to check whether an effect is disabled: Clutter will not apply an effect unless it is enabled. So remove code which checks whether the effect is enabled or disabled from the example applications and the documentation. --- doc/cookbook/effects.xml | 9 +-------- doc/cookbook/examples/cb-background-effect.c | 6 ------ doc/cookbook/examples/cb-border-effect.c | 6 ------ 3 files changed, 1 insertion(+), 20 deletions(-) diff --git a/doc/cookbook/effects.xml b/doc/cookbook/effects.xml index d6c02955d..79b5566e3 100644 --- a/doc/cookbook/effects.xml +++ b/doc/cookbook/effects.xml @@ -385,8 +385,7 @@ cb_background_effect_dispose (GObject *gobject) Now, the important part: implement pre_paint() and/or post_paint(), using Cogl to draw on the - material(s) set up for the effect. In these functions, you should also - check whether the effect is enabled before drawing. + material(s) set up for the effect. For the background effect, we implement pre_paint(), to draw a gray rectangle under the actor: @@ -405,12 +404,6 @@ cb_background_effect_pre_paint (ClutterEffect *self) gfloat height; CbBackgroundEffectPrivate *priv; - ClutterActorMeta *meta = CLUTTER_ACTOR_META (self); - - /* check that the effect is enabled before applying it */ - if (!clutter_actor_meta_get_enabled (meta)) - return TRUE; - priv = CB_BACKGROUND_EFFECT (self)->priv; /* get the associated actor's dimensions */ diff --git a/doc/cookbook/examples/cb-background-effect.c b/doc/cookbook/examples/cb-background-effect.c index 71b2ceee2..44a42b8f7 100644 --- a/doc/cookbook/examples/cb-background-effect.c +++ b/doc/cookbook/examples/cb-background-effect.c @@ -25,12 +25,6 @@ cb_background_effect_pre_paint (ClutterEffect *self) gfloat height; CbBackgroundEffectPrivate *priv; - ClutterActorMeta *meta = CLUTTER_ACTOR_META (self); - - /* check that the effect is enabled before applying it */ - if (!clutter_actor_meta_get_enabled (meta)) - return TRUE; - priv = CB_BACKGROUND_EFFECT (self)->priv; /* get the associated actor's dimensions */ diff --git a/doc/cookbook/examples/cb-border-effect.c b/doc/cookbook/examples/cb-border-effect.c index f7bb6b9a6..3de316d44 100644 --- a/doc/cookbook/examples/cb-border-effect.c +++ b/doc/cookbook/examples/cb-border-effect.c @@ -35,12 +35,6 @@ cb_border_effect_post_paint (ClutterEffect *self) gfloat height; CbBorderEffectPrivate *priv; - ClutterActorMeta *meta = CLUTTER_ACTOR_META (self); - - /* check that the effect is enabled before applying it */ - if (!clutter_actor_meta_get_enabled (meta)) - return; - priv = CB_BORDER_EFFECT (self)->priv; /* get the associated actor's dimensions */