[clutter] Add lightness, brightness, and contrast effects
- From: Joseph Scheuhammer <jscheuhamm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [clutter] Add lightness, brightness, and contrast effects
- Date: Wed, 28 Sep 2011 14:34:35 +0000 (UTC)
commit 4829ae1c79f1ae60d562621b81a7be800e0697bb
Author: Joseph Scheuhammer <clown alum mit edu>
Date: Tue Sep 27 13:01:36 2011 -0400
Add lightness, brightness, and contrast effects
Added three classes for new clutter effects: inverse lightness,
modify brightness, and modify contrast.
https://bugzilla.gnome.org/show_bug.cgi?id=656156
clutter/Makefile.am | 6 +
clutter/clutter-brightness-effect.c | 380 ++++++++++++++++++++++++++
clutter/clutter-brightness-effect.h | 63 +++++
clutter/clutter-contrast-effect.c | 395 ++++++++++++++++++++++++++++
clutter/clutter-contrast-effect.h | 63 +++++
clutter/clutter-invert-lightness-effect.c | 243 +++++++++++++++++
clutter/clutter-invert-lightness-effect.h | 57 ++++
doc/reference/clutter/clutter-docs.xml.in | 3 +
doc/reference/clutter/clutter-sections.txt | 47 ++++
doc/reference/clutter/clutter.types | 3 +
10 files changed, 1260 insertions(+), 0 deletions(-)
---
diff --git a/clutter/Makefile.am b/clutter/Makefile.am
index d9b81a8..cf37c4d 100644
--- a/clutter/Makefile.am
+++ b/clutter/Makefile.am
@@ -71,6 +71,7 @@ source_h = \
$(srcdir)/clutter-blur-effect.h \
$(srcdir)/clutter-box.h \
$(srcdir)/clutter-box-layout.h \
+ $(srcdir)/clutter-brightness-effect.h \
$(srcdir)/clutter-cairo-texture.h \
$(srcdir)/clutter-child-meta.h \
$(srcdir)/clutter-click-action.h \
@@ -80,6 +81,7 @@ source_h = \
$(srcdir)/clutter-colorize-effect.h \
$(srcdir)/clutter-constraint.h \
$(srcdir)/clutter-container.h \
+ $(srcdir)/clutter-contrast-effect.h \
$(srcdir)/clutter-deform-effect.h \
$(srcdir)/clutter-deprecated.h \
$(srcdir)/clutter-desaturate-effect.h \
@@ -96,6 +98,7 @@ source_h = \
$(srcdir)/clutter-gesture-action.h \
$(srcdir)/clutter-group.h \
$(srcdir)/clutter-input-device.h \
+ $(srcdir)/clutter-invert-lightness-effect.h \
$(srcdir)/clutter-interval.h \
$(srcdir)/clutter-keysyms.h \
$(srcdir)/clutter-keysyms-compat.h \
@@ -158,6 +161,7 @@ source_c = \
$(srcdir)/clutter-blur-effect.c \
$(srcdir)/clutter-box.c \
$(srcdir)/clutter-box-layout.c \
+ $(srcdir)/clutter-brightness-effect.c \
$(srcdir)/clutter-cairo-texture.c \
$(srcdir)/clutter-child-meta.c \
$(srcdir)/clutter-click-action.c \
@@ -166,6 +170,7 @@ source_c = \
$(srcdir)/clutter-colorize-effect.c \
$(srcdir)/clutter-constraint.c \
$(srcdir)/clutter-container.c \
+ $(srcdir)/clutter-contrast-effect.c \
$(srcdir)/clutter-deform-effect.c \
$(srcdir)/clutter-desaturate-effect.c \
$(srcdir)/clutter-device-manager.c \
@@ -182,6 +187,7 @@ source_c = \
$(srcdir)/clutter-gesture-action.c \
$(srcdir)/clutter-group.c \
$(srcdir)/clutter-input-device.c \
+ $(srcdir)/clutter-invert-lightness-effect.c \
$(srcdir)/clutter-interval.c \
$(srcdir)/clutter-keysyms-table.c \
$(srcdir)/clutter-layout-manager.c \
diff --git a/clutter/clutter-brightness-effect.c b/clutter/clutter-brightness-effect.c
new file mode 100644
index 0000000..9891156
--- /dev/null
+++ b/clutter/clutter-brightness-effect.c
@@ -0,0 +1,380 @@
+/*
+ * Clutter.
+ *
+ * An OpenGL based 'interactive canvas' library.
+ *
+ * Copyright (C) 2010, 2011 Inclusive Design Research Centre, OCAD University.
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ *
+ * Author:
+ * Joseph Scheuhammer <clown alum mit edu>
+ */
+
+/**
+ * SECTION:clutter-brightness-effect
+ * @short_description: Increase/decrease brightness of actor.
+ * @see_also: #ClutterEffect, #ClutterOffscreenEffect
+ *
+ * #ClutterBrightnessEffect is a sub-class of #ClutterEffect that changes the
+ * overall brightness of a #ClutterActor.
+ *
+ * #ClutterBrightnessEffect is available since Clutter 1.10
+ */
+
+#define CLUTTER_BRIGHTNESS_EFFECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_BRIGHTNESS_EFFECT, ClutterBrightnessEffectClass))
+#define CLUTTER_IS_BRIGHTNESS_EFFECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_BRIGHTNESS_EFFECT))
+#define CLUTTER_BRIGHTNESS_EFFECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_BRIGHTNESS_EFFECT, ClutterBrightnessEffectClass))
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "clutter-brightness-effect.h"
+
+#include "clutter-actor.h"
+#include "clutter-feature.h"
+#include "clutter-offscreen-effect.h"
+#include "clutter-private.h"
+
+struct _ClutterBrightnessEffect
+{
+ ClutterOffscreenEffect parent_instance;
+
+ /* a back pointer to our actor, so that we can query it */
+ ClutterActor *actor;
+
+ CoglHandle shader;
+ CoglHandle program;
+
+ /* Brightness changes. */
+ ClutterColor brightness;
+
+ gint tex_uniform;
+ gint brightness_uniform;
+
+ guint is_compiled : 1;
+};
+
+struct _ClutterBrightnessEffectClass
+{
+ ClutterOffscreenEffectClass parent_class;
+};
+
+/* Brightness effects in GLSL.
+ */
+static const gchar *brightness_glsl_shader =
+"uniform sampler2D tex;\n"
+"uniform vec3 brightness;\n"
+"\n"
+"void main ()\n"
+"{\n"
+" vec4 color = cogl_color_in * texture2D (tex, vec2 (cogl_tex_coord_in[0].xy));\n"
+" vec3 effect = vec3 (color);\n"
+"\n"
+" effect = clamp (effect + brightness, 0.0, 1.0);\n"
+"\n"
+"\n"
+" cogl_color_out = vec4 (effect, color.a);\n"
+"}\n";
+
+/* No brightness change. */
+static const ClutterColor same_brightness = { 0x7f, 0x7f, 0x7f, 0xff };
+
+enum
+{
+ PROP_0,
+
+ PROP_BRIGHTNESS,
+
+ PROP_LAST
+};
+
+static GParamSpec *obj_props[PROP_LAST];
+
+G_DEFINE_TYPE (ClutterBrightnessEffect,
+ clutter_brightness_effect,
+ CLUTTER_TYPE_OFFSCREEN_EFFECT);
+
+static gboolean
+clutter_brightness_effect_pre_paint (ClutterEffect *effect)
+{
+ ClutterBrightnessEffect *self = CLUTTER_BRIGHTNESS_EFFECT (effect);
+ ClutterEffectClass *parent_class;
+
+ if (!clutter_actor_meta_get_enabled (CLUTTER_ACTOR_META (effect)))
+ return FALSE;
+
+ self->actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (effect));
+ if (self->actor == NULL)
+ return FALSE;
+
+ if (!clutter_feature_available (CLUTTER_FEATURE_SHADERS_GLSL))
+ {
+ /* if we don't have support for GLSL shaders then we
+ * forcibly disable the ActorMeta
+ */
+ g_warning ("Unable to use the ShaderEffect: the graphics hardware "
+ "or the current GL driver does not implement support "
+ "for the GLSL shading language.");
+ clutter_actor_meta_set_enabled (CLUTTER_ACTOR_META (effect), FALSE);
+ return FALSE;
+ }
+
+ if (self->shader == COGL_INVALID_HANDLE)
+ {
+ self->shader = cogl_create_shader (COGL_SHADER_TYPE_FRAGMENT);
+ cogl_shader_source (self->shader, brightness_glsl_shader);
+
+ self->is_compiled = FALSE;
+ self->tex_uniform = -1;
+ self->brightness_uniform = -1;
+ }
+
+ if (self->program == COGL_INVALID_HANDLE)
+ self->program = cogl_create_program ();
+
+ if (!self->is_compiled)
+ {
+ g_assert (self->shader != COGL_INVALID_HANDLE);
+ g_assert (self->program != COGL_INVALID_HANDLE);
+
+ cogl_shader_compile (self->shader);
+ if (!cogl_shader_is_compiled (self->shader))
+ {
+ gchar *log_buf = cogl_shader_get_info_log (self->shader);
+
+ g_warning (G_STRLOC ": Unable to compile the brightness effects shader: %s",
+ log_buf);
+ g_free (log_buf);
+
+ cogl_handle_unref (self->shader);
+ cogl_handle_unref (self->program);
+
+ self->shader = COGL_INVALID_HANDLE;
+ self->program = COGL_INVALID_HANDLE;
+ }
+ else
+ {
+ cogl_program_attach_shader (self->program, self->shader);
+ cogl_program_link (self->program);
+
+ cogl_handle_unref (self->shader);
+
+ self->is_compiled = TRUE;
+
+ self->tex_uniform =
+ cogl_program_get_uniform_location (self->program, "tex");
+ self->brightness_uniform =
+ cogl_program_get_uniform_location (self->program, "brightness");
+ }
+ }
+
+ parent_class = CLUTTER_EFFECT_CLASS (clutter_brightness_effect_parent_class);
+ return parent_class->pre_paint (effect);
+}
+
+static void
+clutter_brightness_effect_paint_target (ClutterOffscreenEffect *effect)
+{
+ ClutterBrightnessEffect *self = CLUTTER_BRIGHTNESS_EFFECT (effect);
+ ClutterOffscreenEffectClass *parent;
+ CoglHandle material;
+
+ if (self->program == COGL_INVALID_HANDLE)
+ goto out;
+
+ if (self->tex_uniform > -1)
+ cogl_program_set_uniform_1i (self->program, self->tex_uniform, 0);
+
+ if (self->brightness_uniform > -1)
+ {
+ float brightness[3] = {
+ (self->brightness.red / 127.0) - 1.0,
+ (self->brightness.green / 127.0) - 1.0,
+ (self->brightness.blue / 127.0) - 1.0
+ };
+ cogl_program_set_uniform_float (self->program, self->brightness_uniform,
+ 3, 1,
+ brightness);
+ }
+
+ material = clutter_offscreen_effect_get_target (effect);
+ cogl_material_set_user_program (material, self->program);
+
+out:
+ parent = CLUTTER_OFFSCREEN_EFFECT_CLASS (clutter_brightness_effect_parent_class);
+ parent->paint_target (effect);
+}
+
+static void
+clutter_brightness_effect_dispose (GObject *gobject)
+{
+ ClutterBrightnessEffect *self = CLUTTER_BRIGHTNESS_EFFECT (gobject);
+
+ if (self->program != COGL_INVALID_HANDLE)
+ {
+ cogl_handle_unref (self->program);
+
+ self->program = COGL_INVALID_HANDLE;
+ self->shader = COGL_INVALID_HANDLE;
+ }
+
+ self->actor = NULL;
+
+ G_OBJECT_CLASS (clutter_brightness_effect_parent_class)->dispose (gobject);
+}
+
+static void
+clutter_brightness_effect_set_property (GObject *gobject,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ ClutterBrightnessEffect *effect = CLUTTER_BRIGHTNESS_EFFECT (gobject);
+
+ switch (prop_id)
+ {
+ case PROP_BRIGHTNESS:
+ clutter_brightness_effect_set_brightness (effect,
+ clutter_value_get_color (value));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+clutter_brightness_effect_get_property (GObject *gobject,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ ClutterBrightnessEffect *effect = CLUTTER_BRIGHTNESS_EFFECT (gobject);
+ ClutterColor brightness;
+
+ switch (prop_id)
+ {
+ case PROP_BRIGHTNESS:
+ clutter_brightness_effect_get_brightness (effect, &brightness);
+ clutter_value_set_color (value, &brightness);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+clutter_brightness_effect_class_init (ClutterBrightnessEffectClass *klass)
+{
+ ClutterEffectClass *effect_class = CLUTTER_EFFECT_CLASS (klass);
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ ClutterOffscreenEffectClass *offscreen_class;
+
+ offscreen_class = CLUTTER_OFFSCREEN_EFFECT_CLASS (klass);
+ offscreen_class->paint_target = clutter_brightness_effect_paint_target;
+
+ effect_class->pre_paint = clutter_brightness_effect_pre_paint;
+
+ gobject_class->set_property = clutter_brightness_effect_set_property;
+ gobject_class->get_property = clutter_brightness_effect_get_property;
+ gobject_class->dispose = clutter_brightness_effect_dispose;
+
+ /**
+ * ClutterBrightnessEffect:brightness:
+ *
+ * The brightness change to apply to the actor
+ *
+ * Since: 1.10
+ */
+ obj_props[PROP_BRIGHTNESS] =
+ clutter_param_spec_color ("brightness",
+ P_("Brightness"),
+ P_("The brightness change to apply"),
+ &same_brightness,
+ G_PARAM_READWRITE);
+
+ g_object_class_install_properties (gobject_class, PROP_LAST, obj_props);
+}
+
+static void
+clutter_brightness_effect_init (ClutterBrightnessEffect *self)
+{
+ self->brightness = same_brightness;
+}
+
+/**
+ * clutter_brightness_effect_new:
+ *
+ * Creates a new #ClutterBrightnessEffect to be used with
+ * clutter_actor_add_effect()
+ *
+ * Return value: (transfer full): the newly created #ClutterBrightnessEffect or
+ * or %NULL. Use g_object_unref() when done.
+ *
+ * Since: 1.10
+ */
+ClutterEffect *
+clutter_brightness_effect_new (void)
+{
+ return g_object_new (CLUTTER_TYPE_BRIGHTNESS_EFFECT,
+ NULL);
+}
+
+/**
+ * clutter_brightness_effect_set_brightness:
+ * @effect: a #ClutterBrightnessEffect
+ * @brightness: ClutterColor governing the brightness change.
+ *
+ * Add each of the red, green, blue components of the @brightness to
+ * the red, greeen, or blue components of the actor's colors.
+ *
+ * Since: 1.10
+ */
+void
+clutter_brightness_effect_set_brightness (ClutterBrightnessEffect *effect,
+ const ClutterColor *brightness)
+{
+ g_return_if_fail (CLUTTER_IS_BRIGHTNESS_EFFECT (effect));
+ if (clutter_color_equal (&effect->brightness, brightness))
+ return;
+
+ effect->brightness = *brightness;
+
+ if (effect->actor != NULL)
+ clutter_actor_queue_redraw (effect->actor);
+}
+
+/**
+ * clutter_brightness_effect_get_brightness:
+ * @effect: a #ClutterBrightnessEffect
+ * @brightness: (out caller-allocates): return location for the brightness.
+ *
+ * Retrieves the brightness value used by @effect
+ *
+ * Since: 1.10
+ */
+void
+clutter_brightness_effect_get_brightness (ClutterBrightnessEffect *effect,
+ ClutterColor *brightness)
+{
+ g_return_if_fail (CLUTTER_IS_BRIGHTNESS_EFFECT (effect));
+ g_return_if_fail (brightness != NULL);
+
+ *brightness = effect->brightness;
+}
diff --git a/clutter/clutter-brightness-effect.h b/clutter/clutter-brightness-effect.h
new file mode 100644
index 0000000..6b6fe3b
--- /dev/null
+++ b/clutter/clutter-brightness-effect.h
@@ -0,0 +1,63 @@
+/*
+ * Clutter.
+ *
+ * An OpenGL based 'interactive canvas' library.
+ *
+ * Copyright (C) 2010, 2011 Inclusive Design Research Centre, OCAD University.
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ *
+ * Author:
+ * Joseph Scheuhammer <clown alum mit edu>
+ */
+
+#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
+#error "Only <clutter/clutter.h> can be included directly."
+#endif
+
+#ifndef __CLUTTER_BRIGHTNESS_EFFECT_H__
+#define __CLUTTER_BRIGHTNESS_EFFECT_H__
+
+#include <clutter/clutter-color.h>
+#include <clutter/clutter-effect.h>
+
+G_BEGIN_DECLS
+
+#define CLUTTER_TYPE_BRIGHTNESS_EFFECT (clutter_brightness_effect_get_type ())
+#define CLUTTER_BRIGHTNESS_EFFECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_BRIGHTNESS_EFFECT, ClutterBrightnessEffect))
+#define CLUTTER_IS_BRIGHTNESS_EFFECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_BRIGHTNESS_EFFECT))
+
+/**
+ * ClutterBrightnessEffect:
+ *
+ * <structname>ClutterBrightnessEffect</structname> is an opaque structure
+ * whose members cannot be directly accessed
+ *
+ * Since: 1.10
+ */
+typedef struct _ClutterBrightnessEffect ClutterBrightnessEffect;
+typedef struct _ClutterBrightnessEffectClass ClutterBrightnessEffectClass;
+
+GType clutter_brightness_effect_get_type (void) G_GNUC_CONST;
+
+ClutterEffect *clutter_brightness_effect_new (void);
+
+void clutter_brightness_effect_set_brightness (ClutterBrightnessEffect *effect,
+ const ClutterColor *brightness);
+void clutter_brightness_effect_get_brightness (ClutterBrightnessEffect *effect,
+ ClutterColor *brightness);
+
+G_END_DECLS
+
+#endif /* __CLUTTER_BRIGHTNESS_EFFECT_H__ */
diff --git a/clutter/clutter-contrast-effect.c b/clutter/clutter-contrast-effect.c
new file mode 100644
index 0000000..98a2d90
--- /dev/null
+++ b/clutter/clutter-contrast-effect.c
@@ -0,0 +1,395 @@
+/*
+ * Clutter.
+ *
+ * An OpenGL based 'interactive canvas' library.
+ *
+ * Copyright (C) 2010, 2011 Inclusive Design Research Centre, OCAD University.
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ *
+ * Author:
+ * Joseph Scheuhammer <clown alum mit edu>
+ */
+
+/**
+ * SECTION:clutter-contrast-effect
+ * @short_description: Increase/decrease contrast of actor.
+ * @see_also: #ClutterEffect, #ClutterOffscreenEffect
+ *
+ * #ClutterContrastEffect is a sub-class of #ClutterEffect that changes the
+ * overall contrast of a #ClutterActor.
+ *
+ * #ClutterContrastEffect is available since Clutter 1.10
+ */
+
+#define CLUTTER_CONTRAST_EFFECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_CONTRAST_EFFECT, ClutterContrastEffectClass))
+#define CLUTTER_IS_CONTRAST_EFFECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_CONTRAST_EFFECT))
+#define CLUTTER_CONTRAST_EFFECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_CONTRAST_EFFECT, ClutterContrastEffectClass))
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "clutter-contrast-effect.h"
+
+#include "clutter-actor.h"
+#include "clutter-feature.h"
+#include "clutter-offscreen-effect.h"
+#include "clutter-private.h"
+
+struct _ClutterContrastEffect
+{
+ ClutterOffscreenEffect parent_instance;
+
+ /* a back pointer to our actor, so that we can query it */
+ ClutterActor *actor;
+
+ CoglHandle shader;
+ CoglHandle program;
+
+ /* Contrast changes. */
+ ClutterColor contrast;
+
+ gint tex_uniform;
+ gint contrast_uniform;
+
+ guint is_compiled : 1;
+};
+
+struct _ClutterContrastEffectClass
+{
+ ClutterOffscreenEffectClass parent_class;
+};
+
+/* Contrast effects in GLSL.
+ */
+static const gchar *contrast_glsl_shader =
+"uniform sampler2D tex;\n"
+"uniform vec3 contrast;\n"
+"\n"
+"void main ()\n"
+"{\n"
+" vec4 color = cogl_color_in * texture2D (tex, vec2 (cogl_tex_coord_in[0].xy));\n"
+" vec3 effect = vec3 (color);\n"
+"\n"
+" if (effect.r < 0.5)\n"
+" effect.r = clamp (effect.r - contrast.r, 0.0, 0.5);\n"
+" else\n"
+" effect.r = clamp (effect.r + contrast.r, 0.5, 1.0);\n"
+"\n"
+" if (effect.g < 0.5)\n"
+" effect.g = clamp (effect.g - contrast.g, 0.0, 0.5);\n"
+" else\n"
+" effect.g = clamp (effect.g + contrast.g, 0.5, 1.0);\n"
+"\n"
+" if (effect.b < 0.5)\n"
+" effect.b = clamp (effect.b - contrast.b, 0.0, 0.5);\n"
+" else\n"
+" effect.b = clamp (effect.b + contrast.b, 0.5, 1.0);\n"
+"\n"
+" cogl_color_out = vec4 (effect, color.a);\n"
+"}\n";
+
+/* No contrast change. */
+static const ClutterColor same_contrast = { 0x7f, 0x7f, 0x7f, 0xff };
+
+enum
+{
+ PROP_0,
+
+ PROP_CONTRAST,
+
+ PROP_LAST
+};
+
+static GParamSpec *obj_props[PROP_LAST];
+
+G_DEFINE_TYPE (ClutterContrastEffect,
+ clutter_contrast_effect,
+ CLUTTER_TYPE_OFFSCREEN_EFFECT);
+
+static gboolean
+clutter_contrast_effect_pre_paint (ClutterEffect *effect)
+{
+ ClutterContrastEffect *self = CLUTTER_CONTRAST_EFFECT (effect);
+ ClutterEffectClass *parent_class;
+
+ if (!clutter_actor_meta_get_enabled (CLUTTER_ACTOR_META (effect)))
+ return FALSE;
+
+ self->actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (effect));
+ if (self->actor == NULL)
+ return FALSE;
+
+ if (!clutter_feature_available (CLUTTER_FEATURE_SHADERS_GLSL))
+ {
+ /* if we don't have support for GLSL shaders then we
+ * forcibly disable the ActorMeta
+ */
+ g_warning ("Unable to use the ShaderEffect: the graphics hardware "
+ "or the current GL driver does not implement support "
+ "for the GLSL shading language.");
+ clutter_actor_meta_set_enabled (CLUTTER_ACTOR_META (effect), FALSE);
+ return FALSE;
+ }
+
+ if (self->shader == COGL_INVALID_HANDLE)
+ {
+ self->shader = cogl_create_shader (COGL_SHADER_TYPE_FRAGMENT);
+ cogl_shader_source (self->shader, contrast_glsl_shader);
+
+ self->is_compiled = FALSE;
+ self->tex_uniform = -1;
+ self->contrast_uniform = -1;
+ }
+
+ if (self->program == COGL_INVALID_HANDLE)
+ self->program = cogl_create_program ();
+
+ if (!self->is_compiled)
+ {
+ g_assert (self->shader != COGL_INVALID_HANDLE);
+ g_assert (self->program != COGL_INVALID_HANDLE);
+
+ cogl_shader_compile (self->shader);
+ if (!cogl_shader_is_compiled (self->shader))
+ {
+ gchar *log_buf = cogl_shader_get_info_log (self->shader);
+
+ g_warning (G_STRLOC ": Unable to compile the contrast effects shader: %s",
+ log_buf);
+ g_free (log_buf);
+
+ cogl_handle_unref (self->shader);
+ cogl_handle_unref (self->program);
+
+ self->shader = COGL_INVALID_HANDLE;
+ self->program = COGL_INVALID_HANDLE;
+ }
+ else
+ {
+ cogl_program_attach_shader (self->program, self->shader);
+ cogl_program_link (self->program);
+
+ cogl_handle_unref (self->shader);
+
+ self->is_compiled = TRUE;
+
+ self->tex_uniform =
+ cogl_program_get_uniform_location (self->program, "tex");
+ self->contrast_uniform =
+ cogl_program_get_uniform_location (self->program, "contrast");
+ }
+ }
+
+ parent_class = CLUTTER_EFFECT_CLASS (clutter_contrast_effect_parent_class);
+ return parent_class->pre_paint (effect);
+}
+
+static void
+clutter_contrast_effect_paint_target (ClutterOffscreenEffect *effect)
+{
+ ClutterContrastEffect *self = CLUTTER_CONTRAST_EFFECT (effect);
+ ClutterOffscreenEffectClass *parent;
+ CoglHandle material;
+
+ if (self->program == COGL_INVALID_HANDLE)
+ goto out;
+
+ if (self->tex_uniform > -1)
+ cogl_program_set_uniform_1i (self->program, self->tex_uniform, 0);
+
+ if (self->contrast_uniform > -1)
+ {
+ float contrast[3] = {
+ (self->contrast.red / 255.0) - 0.5,
+ (self->contrast.green / 255.0) - 0.5,
+ (self->contrast.blue / 255.0) - 0.5
+ };
+ cogl_program_set_uniform_float (self->program, self->contrast_uniform,
+ 3, 1,
+ contrast);
+ }
+
+ material = clutter_offscreen_effect_get_target (effect);
+ cogl_material_set_user_program (material, self->program);
+
+out:
+ parent = CLUTTER_OFFSCREEN_EFFECT_CLASS (clutter_contrast_effect_parent_class);
+ parent->paint_target (effect);
+}
+
+static void
+clutter_contrast_effect_dispose (GObject *gobject)
+{
+ ClutterContrastEffect *self = CLUTTER_CONTRAST_EFFECT (gobject);
+
+ if (self->program != COGL_INVALID_HANDLE)
+ {
+ cogl_handle_unref (self->program);
+
+ self->program = COGL_INVALID_HANDLE;
+ self->shader = COGL_INVALID_HANDLE;
+ }
+
+ self->actor = NULL;
+
+ G_OBJECT_CLASS (clutter_contrast_effect_parent_class)->dispose (gobject);
+}
+
+static void
+clutter_contrast_effect_set_property (GObject *gobject,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ ClutterContrastEffect *effect = CLUTTER_CONTRAST_EFFECT (gobject);
+
+ switch (prop_id)
+ {
+ case PROP_CONTRAST:
+ clutter_contrast_effect_set_contrast (effect,
+ clutter_value_get_color (value));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+clutter_contrast_effect_get_property (GObject *gobject,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ ClutterContrastEffect *effect = CLUTTER_CONTRAST_EFFECT (gobject);
+ ClutterColor contrast;
+
+ switch (prop_id)
+ {
+ case PROP_CONTRAST:
+ clutter_contrast_effect_get_contrast (effect, &contrast);
+ clutter_value_set_color (value, &contrast);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+clutter_contrast_effect_class_init (ClutterContrastEffectClass *klass)
+{
+ ClutterEffectClass *effect_class = CLUTTER_EFFECT_CLASS (klass);
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ ClutterOffscreenEffectClass *offscreen_class;
+
+ offscreen_class = CLUTTER_OFFSCREEN_EFFECT_CLASS (klass);
+ offscreen_class->paint_target = clutter_contrast_effect_paint_target;
+
+ effect_class->pre_paint = clutter_contrast_effect_pre_paint;
+
+ gobject_class->set_property = clutter_contrast_effect_set_property;
+ gobject_class->get_property = clutter_contrast_effect_get_property;
+ gobject_class->dispose = clutter_contrast_effect_dispose;
+
+ /**
+ * ClutterContrastEffect:contrast:
+ *
+ * The contrast change to apply to the actor
+ *
+ * Since: 1.10
+ */
+ obj_props[PROP_CONTRAST] =
+ clutter_param_spec_color ("contrast",
+ P_("Contrast"),
+ P_("The contrast change to apply"),
+ &same_contrast,
+ G_PARAM_READWRITE);
+
+ g_object_class_install_properties (gobject_class, PROP_LAST, obj_props);
+}
+
+static void
+clutter_contrast_effect_init (ClutterContrastEffect *self)
+{
+ self->contrast = same_contrast;
+}
+
+/**
+ * clutter_contrast_effect_new:
+ *
+ * Creates a new #ClutterContrastEffect to be used with
+ * clutter_actor_add_effect()
+ *
+ * Return value: (transfer full): the newly created #ClutterContrastEffect or
+ * %NULL. User g_object_unref() when done.
+ *
+ * Since: 1.10
+ */
+ClutterEffect *
+clutter_contrast_effect_new (void)
+{
+ return g_object_new (CLUTTER_TYPE_CONTRAST_EFFECT,
+ NULL);
+}
+
+/**
+ * clutter_contrast_effect_set_contrast:
+ * @effect: a #ClutterContrastEffect
+ * @contrast: A ClutterColor governing the change in contrast.
+ *
+ * Add or subtract each of the red, green, blue components of the @contrast to
+ * the red, greeen, or blue component of the actor's colors. If the actor's
+ * color is less than the midpoint, subtract the contrast; otherwise, add the
+ * contrast.
+ *
+ * Since: 1.10
+ */
+void
+clutter_contrast_effect_set_contrast (ClutterContrastEffect *effect,
+ const ClutterColor *contrast)
+{
+ g_return_if_fail (CLUTTER_IS_CONTRAST_EFFECT (effect));
+
+ if (clutter_color_equal (&effect->contrast, contrast))
+ return;
+
+ effect->contrast = *contrast;
+
+ if (effect->actor != NULL)
+ clutter_actor_queue_redraw (effect->actor);
+}
+
+/**
+ * clutter_contrast_effect_get_contrast:
+ * @effect: a #ClutterContrastEffect
+ * @contrast: (out caller-allocates): return location for the contrast change.
+ *
+ * Retrieves the contrast value used by @effect
+ *
+ * Since 1.10
+ */
+void
+clutter_contrast_effect_get_contrast (ClutterContrastEffect *effect,
+ ClutterColor *contrast)
+{
+ g_return_if_fail (CLUTTER_IS_CONTRAST_EFFECT (effect));
+ g_return_if_fail (contrast != NULL);
+
+ *contrast = effect->contrast;
+}
diff --git a/clutter/clutter-contrast-effect.h b/clutter/clutter-contrast-effect.h
new file mode 100644
index 0000000..d99f22f
--- /dev/null
+++ b/clutter/clutter-contrast-effect.h
@@ -0,0 +1,63 @@
+/*
+ * Clutter.
+ *
+ * An OpenGL based 'interactive canvas' library.
+ *
+ * Copyright (C) 2010, 2011 Inclusive Design Research Centre, OCAD University.
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ *
+ * Author:
+ * Joseph Scheuhammer <clown alum mit edu>
+ */
+
+#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
+#error "Only <clutter/clutter.h> can be included directly."
+#endif
+
+#ifndef __CLUTTER_CONTRAST_EFFECT_H__
+#define __CLUTTER_CONTRAST_EFFECT_H__
+
+#include <clutter/clutter-color.h>
+#include <clutter/clutter-effect.h>
+
+G_BEGIN_DECLS
+
+#define CLUTTER_TYPE_CONTRAST_EFFECT (clutter_contrast_effect_get_type ())
+#define CLUTTER_CONTRAST_EFFECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_CONTRAST_EFFECT, ClutterContrastEffect))
+#define CLUTTER_IS_CONTRAST_EFFECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_CONTRAST_EFFECT))
+
+/**
+ * ClutterContrastEffect:
+ *
+ * <structname>ClutterContrastEffect</structname> is an opaque structure
+ * whose members cannot be directly accessed
+ *
+ * Since: 1.10
+ */
+typedef struct _ClutterContrastEffect ClutterContrastEffect;
+typedef struct _ClutterContrastEffectClass ClutterContrastEffectClass;
+
+GType clutter_contrast_effect_get_type (void) G_GNUC_CONST;
+
+ClutterEffect *clutter_contrast_effect_new (void);
+
+void clutter_contrast_effect_set_contrast (ClutterContrastEffect *effect,
+ const ClutterColor *contrast);
+void clutter_contrast_effect_get_contrast (ClutterContrastEffect *effect,
+ ClutterColor *contrast);
+
+G_END_DECLS
+
+#endif /* __CLUTTER_CONTRAST_EFFECT_H__ */
diff --git a/clutter/clutter-invert-lightness-effect.c b/clutter/clutter-invert-lightness-effect.c
new file mode 100644
index 0000000..3bdeb2c
--- /dev/null
+++ b/clutter/clutter-invert-lightness-effect.c
@@ -0,0 +1,243 @@
+/*
+ * Clutter.
+ *
+ * An OpenGL based 'interactive canvas' library.
+ *
+ * Copyright (C) 2010, 2011 Inclusive Design Research Centre, OCAD University.
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ *
+ * Author:
+ * Joseph Scheuhammer <clown alum mit edu>
+ */
+
+/**
+ * SECTION:clutter-invert-lightness-effect
+ * @short_description: A colorization effect where lightness is inverted but
+ * color is not.
+ * @see_also: #ClutterEffect, #ClutterOffscreenEffect
+ *
+ * #ClutterInvertLightnessEffect is a sub-class of #ClutterEffect that enhances
+ * the appearance of a clutter actor. Specifically it inverts the lightness
+ * of a #ClutterActor (e.g., darker colors become lighter, white becomes black,
+ * and white, black).
+ *
+ * #ClutterInvertLightnessEffect is available since Clutter 1.10
+ */
+
+#define CLUTTER_INVERT_LIGHTNESS_EFFECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_INVERT_LIGHTNESS_EFFECT, ClutterInvertLightnessEffectClass))
+#define CLUTTER_IS_INVERT_EFFECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_INVERT_LIGHTNESS_EFFECT))
+#define CLUTTER_INVERT_LIGHTNESS_EFFECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_INVERT_LIGHTNESS_EFFEC, ClutterInvertLightnessEffectClass))
+
+#include "clutter-invert-lightness-effect.h"
+
+#include "clutter-actor.h"
+#include "clutter-feature.h"
+#include "clutter-offscreen-effect.h"
+
+struct _ClutterInvertLightnessEffect
+{
+ ClutterOffscreenEffect parent_instance;
+
+ /* a back pointer to our actor, so that we can query it */
+ ClutterActor *actor;
+
+ CoglHandle shader;
+ CoglHandle program;
+
+ gint tex_uniform;
+
+ guint is_compiled : 1;
+};
+
+struct _ClutterInvertLightnessEffectClass
+{
+ ClutterOffscreenEffectClass parent_class;
+};
+
+/* Lightness inversion in GLSL.
+ */
+static const gchar *invert_lightness_glsl_shader =
+"uniform sampler2D tex;\n"
+"\n"
+"void main ()\n"
+"{\n"
+" vec4 color = cogl_color_in * texture2D (tex, vec2 (cogl_tex_coord_in[0].xy));\n"
+" vec3 effect = vec3 (color);\n"
+"\n"
+" float maxColor = max (color.r, max (color.g, color.b));\n"
+" float minColor = min (color.r, min (color.g, color.b));\n"
+" float lightness = (maxColor + minColor) / 2.0;\n"
+"\n"
+" float delta = (1.0 - lightness) - lightness;\n"
+" effect.rgb = (effect.rgb + delta);\n"
+"\n"
+" cogl_color_out = vec4 (effect, color.a);\n"
+"}\n";
+
+G_DEFINE_TYPE (ClutterInvertLightnessEffect,
+ clutter_invert_lightness_effect,
+ CLUTTER_TYPE_OFFSCREEN_EFFECT);
+
+static gboolean
+clutter_invert_lightness_effect_pre_paint (ClutterEffect *effect)
+{
+ ClutterInvertLightnessEffect *self = CLUTTER_INVERT_LIGHTNESS_EFFECT (effect);
+ ClutterEffectClass *parent_class;
+
+ if (!clutter_actor_meta_get_enabled (CLUTTER_ACTOR_META (effect)))
+ return FALSE;
+
+ self->actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (effect));
+ if (self->actor == NULL)
+ return FALSE;
+
+ if (!clutter_feature_available (CLUTTER_FEATURE_SHADERS_GLSL))
+ {
+ /* if we don't have support for GLSL shaders then we
+ * forcibly disable the ActorMeta
+ */
+ g_warning ("Unable to use the ShaderEffect: the graphics hardware "
+ "or the current GL driver does not implement support "
+ "for the GLSL shading language.");
+ clutter_actor_meta_set_enabled (CLUTTER_ACTOR_META (effect), FALSE);
+ return FALSE;
+ }
+
+ if (self->shader == COGL_INVALID_HANDLE)
+ {
+ self->shader = cogl_create_shader (COGL_SHADER_TYPE_FRAGMENT);
+ cogl_shader_source (self->shader, invert_lightness_glsl_shader);
+
+ self->is_compiled = FALSE;
+ self->tex_uniform = -1;
+ }
+
+ if (self->program == COGL_INVALID_HANDLE)
+ self->program = cogl_create_program ();
+
+ if (!self->is_compiled)
+ {
+ g_assert (self->shader != COGL_INVALID_HANDLE);
+ g_assert (self->program != COGL_INVALID_HANDLE);
+
+ cogl_shader_compile (self->shader);
+ if (!cogl_shader_is_compiled (self->shader))
+ {
+ gchar *log_buf = cogl_shader_get_info_log (self->shader);
+
+ g_warning (G_STRLOC ": Unable to compile the invert-lightness effects shader: %s",
+ log_buf);
+ g_free (log_buf);
+
+ cogl_handle_unref (self->shader);
+ cogl_handle_unref (self->program);
+
+ self->shader = COGL_INVALID_HANDLE;
+ self->program = COGL_INVALID_HANDLE;
+ }
+ else
+ {
+ cogl_program_attach_shader (self->program, self->shader);
+ cogl_program_link (self->program);
+
+ cogl_handle_unref (self->shader);
+
+ self->is_compiled = TRUE;
+
+ self->tex_uniform =
+ cogl_program_get_uniform_location (self->program, "tex");
+ }
+ }
+
+ parent_class = CLUTTER_EFFECT_CLASS (clutter_invert_lightness_effect_parent_class);
+ return parent_class->pre_paint (effect);
+}
+
+static void
+clutter_invert_lightness_effect_paint_target (ClutterOffscreenEffect *effect)
+{
+ ClutterInvertLightnessEffect *self = CLUTTER_INVERT_LIGHTNESS_EFFECT (effect);
+ ClutterOffscreenEffectClass *parent;
+ CoglHandle material;
+
+ if (self->program == COGL_INVALID_HANDLE)
+ goto out;
+
+ if (self->tex_uniform > -1)
+ cogl_program_set_uniform_1i (self->program, self->tex_uniform, 0);
+
+ material = clutter_offscreen_effect_get_target (effect);
+ cogl_material_set_user_program (material, self->program);
+
+out:
+ parent = CLUTTER_OFFSCREEN_EFFECT_CLASS (clutter_invert_lightness_effect_parent_class);
+ parent->paint_target (effect);
+}
+
+static void
+clutter_invert_lightness_effect_dispose (GObject *gobject)
+{
+ ClutterInvertLightnessEffect *self = CLUTTER_INVERT_LIGHTNESS_EFFECT (gobject);
+
+ if (self->program != COGL_INVALID_HANDLE)
+ {
+ cogl_handle_unref (self->program);
+
+ self->program = COGL_INVALID_HANDLE;
+ self->shader = COGL_INVALID_HANDLE;
+ }
+
+ self->actor = NULL;
+
+ G_OBJECT_CLASS (clutter_invert_lightness_effect_parent_class)->dispose (gobject);
+}
+
+static void
+clutter_invert_lightness_effect_class_init (ClutterInvertLightnessEffectClass *klass)
+{
+ ClutterEffectClass *effect_class = CLUTTER_EFFECT_CLASS (klass);
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ ClutterOffscreenEffectClass *offscreen_class;
+
+ offscreen_class = CLUTTER_OFFSCREEN_EFFECT_CLASS (klass);
+ offscreen_class->paint_target = clutter_invert_lightness_effect_paint_target;
+
+ effect_class->pre_paint = clutter_invert_lightness_effect_pre_paint;
+
+ gobject_class->dispose = clutter_invert_lightness_effect_dispose;
+}
+
+static void
+clutter_invert_lightness_effect_init (ClutterInvertLightnessEffect *self)
+{
+}
+
+/**
+ * clutter_invert_lightness_effect_new:
+ *
+ * Creates a new #ClutterInvertLightnessEffect to be used with
+ * clutter_actor_add_effect()
+ *
+ * Return value: (transfer full): the newly created
+ * #ClutterInvertLightnessEffect or %NULL. Use g_object_unref() when done.
+ *
+ * Since: 1.10
+ */
+ClutterEffect *
+clutter_invert_lightness_effect_new (void)
+{
+ return g_object_new (CLUTTER_TYPE_INVERT_LIGHTNESS_EFFECT,
+ NULL);
+}
diff --git a/clutter/clutter-invert-lightness-effect.h b/clutter/clutter-invert-lightness-effect.h
new file mode 100644
index 0000000..cc54415
--- /dev/null
+++ b/clutter/clutter-invert-lightness-effect.h
@@ -0,0 +1,57 @@
+/*
+ * Clutter.
+ *
+ * An OpenGL based 'interactive canvas' library.
+ *
+ * Copyright (C) 2010, 2011 Inclusive Design Research Centre, OCAD University.
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ *
+ * Author:
+ * Joseph Scheuhammer <clown alum mit edu>
+ */
+
+#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
+#error "Only <clutter/clutter.h> can be included directly."
+#endif
+
+#ifndef __CLUTTER_INVERT_LIGHTNESS_EFFECT_H__
+#define __CLUTTER_INVERT_LIGHTNESS_EFFECT_H__
+
+#include <clutter/clutter-effect.h>
+
+G_BEGIN_DECLS
+
+#define CLUTTER_TYPE_INVERT_LIGHTNESS_EFFECT (clutter_invert_lightness_effect_get_type ())
+#define CLUTTER_INVERT_LIGHTNESS_EFFECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_INVERT_LIGHTNESS_EFFECT, ClutterInvertLightnessEffect))
+#define CLUTTER_IS_INVERT_LIGHTNESS_EFFECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_INVERT_LIGHTNESS_EFFECT))
+
+/**
+ * ClutterInvertLightnessEffect:
+ *
+ * <structname>ClutterInvertLightnessEffect</structname> is an opaque structure
+ * whose members cannot be directly accessed
+ *
+ * Since: 1.10
+ */
+typedef struct _ClutterInvertLightnessEffect ClutterInvertLightnessEffect;
+typedef struct _ClutterInvertLightnessEffectClass ClutterInvertLightnessEffectClass;
+
+GType clutter_invert_lightness_effect_get_type (void) G_GNUC_CONST;
+
+ClutterEffect *clutter_invert_lightness_effect_new (void);
+
+G_END_DECLS
+
+#endif /* __CLUTTER_INVERT_LIGHTNESS_EFFECT_H__ */
diff --git a/doc/reference/clutter/clutter-docs.xml.in b/doc/reference/clutter/clutter-docs.xml.in
index 7a2c7b5..16f8656 100644
--- a/doc/reference/clutter/clutter-docs.xml.in
+++ b/doc/reference/clutter/clutter-docs.xml.in
@@ -120,8 +120,11 @@
<xi:include href="xml/clutter-deform-effect.xml"/>
<xi:include href="xml/clutter-blur-effect.xml"/>
+ <xi:include href="xml/clutter-brightness-effect.xml"/>
<xi:include href="xml/clutter-colorize-effect.xml"/>
+ <xi:include href="xml/clutter-contrast-effect.xml"/>
<xi:include href="xml/clutter-desaturate-effect.xml"/>
+ <xi:include href="xml/clutter-invert-lightness-effect.xml"/>
<xi:include href="xml/clutter-page-turn-effect.xml"/>
</chapter>
diff --git a/doc/reference/clutter/clutter-sections.txt b/doc/reference/clutter/clutter-sections.txt
index 2354712..5765c3b 100644
--- a/doc/reference/clutter/clutter-sections.txt
+++ b/doc/reference/clutter/clutter-sections.txt
@@ -2641,6 +2641,53 @@ clutter_page_turn_effect_get_type
</SECTION>
<SECTION>
+<TITLE>ClutterBrightnessEffect</TITLE>
+<FILE>clutter-brightness-effect</FILE>
+ClutterBrightnessEffect
+clutter_brightness_effect_new
+clutter_brightness_effect_set_brightness
+clutter_brightness_effect_get_brightness
+<SUBSECTION Standard>
+CLUTTER_TYPE_BRIGHTNESS_EFFECT
+CLUTTER_BRIGHTNESS_EFFECT
+CLUTTER_IS_BRIGHTNESS_EFFECT
+<SUBSECTION Private>
+ClutterBrightnessEffectClass
+clutter_brightness_effect_get_type
+</SECTION>
+
+<SECTION>
+<TITLE>ClutterContrastEffect</TITLE>
+<FILE>clutter-contrast-effect</FILE>
+ClutterContrastEffect
+clutter_contrast_effect_new
+clutter_contrast_effect_set_contrast
+clutter_contrast_effect_get_contrast
+<SUBSECTION Standard>
+CLUTTER_TYPE_CONTRAST_EFFECT
+CLUTTER_CONTRAST_EFFECT
+CLUTTER_IS_CONTRAST_EFFECT
+<SUBSECTION Private>
+ClutterContrastEffectClass
+clutter_contrast_effect_get_type
+</SECTION>
+
+<SECTION>
+<TITLE>ClutterInvertLightnessEffect</TITLE>
+<FILE>clutter-invert-lightness-effect</FILE>
+ClutterInvertLightnessEffect
+clutter_contrast_effect_new
+<SUBSECTION Standard>
+CLUTTER_TYPE_INVERT_LIGHTNESS_EFFECT
+CLUTTER_INVERT_LIGHTNESS_EFFECT
+CLUTTER_IS_INVERT_LIGHTNESS_EFFECT
+<SUBSECTION Private>
+ClutterInvertLightnessEffectClass
+clutter_invert_lightness_effect_get_type
+</SECTION>
+
+
+<SECTION>
<FILE>clutter-settings</FILE>
ClutterSettings
clutter_settings_get_default
diff --git a/doc/reference/clutter/clutter.types b/doc/reference/clutter/clutter.types
index 8fc224c..a8ae0a5 100644
--- a/doc/reference/clutter/clutter.types
+++ b/doc/reference/clutter/clutter.types
@@ -21,12 +21,14 @@ clutter_bin_layout_get_type
clutter_blur_effect_get_type
clutter_box_get_type
clutter_box_layout_get_type
+clutter_brightness_effect_get_type
clutter_cairo_texture_get_type
clutter_child_meta_get_type
clutter_click_action_get_type
clutter_clone_get_type
clutter_colorize_effect_get_type
clutter_constraint_get_type
+clutter_contrast_effect_get_type
clutter_deform_effect_get_type
clutter_desaturate_effect_get_type
clutter_device_manager_get_type
@@ -39,6 +41,7 @@ clutter_gesture_action_get_type
clutter_group_get_type
clutter_input_device_get_type
clutter_interval_get_type
+clutter_invert_lightness_effect_get_type
clutter_layout_manager_get_type
clutter_layout_meta_get_type
clutter_list_model_get_type
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]