color: Add Color.interpolate() method
authorEmmanuele Bassi <ebassi@linux.intel.com>
Mon, 11 Oct 2010 14:04:54 +0000 (15:04 +0100)
committerEmmanuele Bassi <ebassi@linux.intel.com>
Mon, 11 Oct 2010 14:39:19 +0000 (15:39 +0100)
The interpolate() method does what it says on the tin: it interpolates
between two colors using the given factor.

ClutterColor uses it to register a progress function for Intervals.

clutter/clutter-color.c
clutter/clutter-color.h
doc/reference/clutter/clutter-sections.txt

index 9f2862c..7b1e620 100644 (file)
@@ -41,6 +41,7 @@
 
 #include <pango/pango-attributes.h>
 
+#include "clutter-interval.h"
 #include "clutter-main.h"
 #include "clutter-color.h"
 #include "clutter-private.h"
@@ -556,6 +557,50 @@ clutter_color_hash (gconstpointer v)
 }
 
 /**
+ * clutter_color_interpolate:
+ * @initial: the initial #ClutterColor
+ * @final: the final #ClutterColor
+ * @progress: the interpolation progress
+ * @result: (out): return location for the interpolation
+ *
+ * Interpolates between @initial and @final #ClutterColor<!-- -->s
+ * using @progress
+ *
+ * Since: 1.6
+ */
+void
+clutter_color_interpolate (const ClutterColor *initial,
+                           const ClutterColor *final,
+                           gdouble             progress,
+                           ClutterColor       *result)
+{
+  g_return_if_fail (initial != NULL);
+  g_return_if_fail (final != NULL);
+  g_return_if_fail (result != NULL);
+
+  result->red   = initial->red   + (final->red   - initial->red)   * progress;
+  result->green = initial->green + (final->green - initial->green) * progress;
+  result->blue  = initial->blue  + (final->blue  - initial->blue)  * progress;
+  result->alpha = initial->alpha + (final->alpha - initial->alpha) * progress;
+}
+
+static gboolean
+clutter_color_progress (const GValue *a,
+                        const GValue *b,
+                        gdouble       progress,
+                        GValue       *retval)
+{
+  const ClutterColor *a_color = clutter_value_get_color (a);
+  const ClutterColor *b_color = clutter_value_get_color (b);
+  ClutterColor res = { 0, };
+
+  clutter_color_interpolate (a_color, b_color, progress, &res);
+  clutter_value_set_color (retval, &res);
+
+  return TRUE;
+}
+
+/**
  * clutter_color_copy:
  * @color: a #ClutterColor
  *
@@ -672,6 +717,9 @@ clutter_color_get_type (void)
                                         clutter_value_transform_color_string);
        g_value_register_transform_func (G_TYPE_STRING, _clutter_color_type,
                                         clutter_value_transform_string_color);
+
+       clutter_interval_register_progress_func (_clutter_color_type,
+                                                clutter_color_progress);
     }
 
   return _clutter_color_type;
index eaf1aba..a9863b1 100644 (file)
@@ -102,6 +102,11 @@ guint         clutter_color_hash        (gconstpointer       v);
 gboolean      clutter_color_equal       (gconstpointer       v1,
                                          gconstpointer       v2);
 
+void          clutter_color_interpolate (const ClutterColor *initial,
+                                         const ClutterColor *final,
+                                         gdouble             progress,
+                                         ClutterColor       *result);
+
 #define CLUTTER_TYPE_PARAM_COLOR           (clutter_param_color_get_type ())
 #define CLUTTER_PARAM_SPEC_COLOR(pspec)    (G_TYPE_CHECK_INSTANCE_CAST ((pspec), CLUTTER_TYPE_PARAM_COLOR, ClutterParamSpecColor))
 #define CLUTTER_IS_PARAM_SPEC_COLOR(pspec) (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), CLUTTER_TYPE_PARAM_COLOR))
index 4d46148..2025dfa 100644 (file)
@@ -973,6 +973,7 @@ clutter_color_subtract
 clutter_color_lighten
 clutter_color_darken
 clutter_color_shade
+clutter_color_interpolate
 
 <SUBSECTION>
 ClutterParamSpecColor