diff --git a/doc/cookbook/Makefile.am b/doc/cookbook/Makefile.am
index 3752f5d5e..d13cbf195 100644
--- a/doc/cookbook/Makefile.am
+++ b/doc/cookbook/Makefile.am
@@ -34,6 +34,7 @@ IMAGE_FILES = \
images/textures-reflection.png \
images/actors-opacity.png \
images/actors-opacity-container-affects-opacity.png \
+ images/text-shadow.png \
$(NULL)
VIDEO_FILES = \
videos/animations-fading-out.ogv \
diff --git a/doc/cookbook/clutter-cookbook.xml.in b/doc/cookbook/clutter-cookbook.xml.in
index fce2d3a12..646d942a1 100644
--- a/doc/cookbook/clutter-cookbook.xml.in
+++ b/doc/cookbook/clutter-cookbook.xml.in
@@ -43,6 +43,7 @@
+
Contributing to this document
diff --git a/doc/cookbook/examples/.gitignore b/doc/cookbook/examples/.gitignore
index 2bf0d0198..7f90480bd 100644
--- a/doc/cookbook/examples/.gitignore
+++ b/doc/cookbook/examples/.gitignore
@@ -1 +1,2 @@
+/text-shadow
/textures-reflection
diff --git a/doc/cookbook/examples/Makefile.am b/doc/cookbook/examples/Makefile.am
index 16cad26e4..5353a9d93 100644
--- a/doc/cookbook/examples/Makefile.am
+++ b/doc/cookbook/examples/Makefile.am
@@ -4,6 +4,7 @@ NULL =
noinst_PROGRAMS = \
textures-reflection \
+ text-shadow \
$(NULL)
INCLUDES = \
@@ -26,3 +27,5 @@ AM_CFLAGS = \
AM_LDFLAGS = $(CLUTTER_LIBS)
textures_reflection_SOURCES = textures-reflection.c
+
+text_shadow_SOURCES = text-shadow.c
diff --git a/doc/cookbook/examples/text-shadow.c b/doc/cookbook/examples/text-shadow.c
new file mode 100644
index 000000000..4afe62c4a
--- /dev/null
+++ b/doc/cookbook/examples/text-shadow.c
@@ -0,0 +1,59 @@
+#include
+#include
+#include
+#include
+
+#define SHADOW_X_OFFSET 3
+#define SHADOW_Y_OFFSET 3
+
+static void
+_text_paint_cb (ClutterActor *actor)
+{
+ ClutterText *text = CLUTTER_TEXT (actor);
+
+ ClutterActorBox alloc = { 0, };
+ clutter_actor_get_allocation_box (actor, &alloc);
+
+ PangoLayout *layout;
+ layout = clutter_text_get_layout (text);
+
+ ClutterColor text_color = { 0, };
+ clutter_text_get_color (text, &text_color);
+
+ guint8 real_opacity;
+ real_opacity = clutter_actor_get_paint_opacity (actor)
+ * text_color.alpha
+ / 255;
+
+ CoglColor color;
+ cogl_color_set_from_4ub (&color, 0xcc, 0xcc, 0xcc, real_opacity);
+ cogl_pango_render_layout (layout, SHADOW_X_OFFSET, SHADOW_Y_OFFSET, &color, 0);
+}
+
+int
+main (int argc, char *argv[])
+{
+ clutter_init (&argc, &argv);
+
+ ClutterActor *stage;
+
+ stage = clutter_stage_new ();
+ clutter_stage_set_title (CLUTTER_STAGE (stage), "Text shadow");
+ g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL);
+
+ ClutterActor *text;
+ text = clutter_text_new ();
+ clutter_text_set_text (CLUTTER_TEXT (text), "Hello, World!");
+ clutter_text_set_font_name (CLUTTER_TEXT (text), "Sans 64px");
+ clutter_actor_add_constraint (text, clutter_align_constraint_new (stage, CLUTTER_ALIGN_X_AXIS, 0.5));
+ clutter_actor_add_constraint (text, clutter_align_constraint_new (stage, CLUTTER_ALIGN_Y_AXIS, 0.5));
+ g_signal_connect (text, "paint", G_CALLBACK (_text_paint_cb), NULL);
+
+ clutter_container_add (CLUTTER_CONTAINER (stage), text, NULL);
+
+ clutter_actor_show (stage);
+
+ clutter_main ();
+
+ return EXIT_SUCCESS;
+}
diff --git a/doc/cookbook/images/text-shadow.png b/doc/cookbook/images/text-shadow.png
new file mode 100644
index 000000000..61824ef14
Binary files /dev/null and b/doc/cookbook/images/text-shadow.png differ
diff --git a/doc/cookbook/text.xml b/doc/cookbook/text.xml
new file mode 100644
index 000000000..6ec3a5cf1
--- /dev/null
+++ b/doc/cookbook/text.xml
@@ -0,0 +1,40 @@
+
+
+
+ Text
+
+
+ Antoine de Saint-Exupery
+ A rock pile ceases to be a rock pile the moment a single man
+ contemplates it, bearing within him the image of a cathedral.
+
+
+
+
+
+ Drawing a shadow under the text
+
+
+ Problem
+
+ You want to draw a shadow under the text displayed by a
+ ClutterText actor.
+
+
+
+
+
+
+
+
+