Hi,

I wanted a way to move a region of a ClutterCairoTexture to a new
location within the texture.  I created
clutter_cairo_texture_move_region() which is attached.

My purpose for this is to make side-scrolling graphs; if there is a
better way to do this I'm all ears!

Thanks!

-- Christian

>From 43bad801bd5232ba076848000c02983a11f5fad6 Mon Sep 17 00:00:00 2001
From: Christian Hergert <ch...@dronelabs.com>
Date: Tue, 2 Mar 2010 02:00:46 -0800
Subject: [PATCH] Add clutter_cairo_texture_move_region.

Provides support for moving a region of a clutter texture to
another region of the texture.
---
 clutter/clutter-cairo-texture.c |   54 +++++++++++++++++++++++++++++++++++++++
 clutter/clutter-cairo-texture.h |   10 ++++++-
 2 files changed, 62 insertions(+), 2 deletions(-)

diff --git a/clutter/clutter-cairo-texture.c b/clutter/clutter-cairo-texture.c
index 88cf5d8..e678a9b 100644
--- a/clutter/clutter-cairo-texture.c
+++ b/clutter/clutter-cairo-texture.c
@@ -761,3 +761,57 @@ clutter_cairo_texture_clear (ClutterCairoTexture *self)
 
   memset (priv->cr_surface_data, 0, priv->height * priv->rowstride);
 }
+
+/**
+ * clutter_cairo_texture_move_region:
+ * @self: a #ClutterCairoTexture.
+ * @src_x: upper left coordinate to use from source data.
+ * @src_y: upper left coordinate to use from source data.
+ * @dst_x: upper left destination horizontal coordinate.
+ * @dst_y: upper left destination vertical coordinate.
+ * @width: width of the source region.
+ * @height: height of the source region.
+ *
+ * Moves a rectangular region of the texture to a new location within the
+ * texture.  The existing region is left in place.
+ *
+ * Since: 1.2
+ */
+void
+clutter_cairo_texture_move_region (ClutterCairoTexture *self,
+                                   guint                src_x,
+                                   guint                src_y,
+                                   guint                width,
+                                   guint                height,
+                                   guint                dst_x,
+                                   guint                dst_y)
+{
+  ClutterCairoTexturePrivate *priv;
+  CoglHandle cogl_texture;
+
+  g_return_if_fail (CLUTTER_IS_CAIRO_TEXTURE (self));
+  g_return_if_fail (width > 0);
+  g_return_if_fail (height > 0);
+
+  priv = self->priv;
+
+  if (!priv->cr_surface_data)
+    return;
+
+  if (dst_x + width > priv->width)
+    width = priv->width - dst_x;
+
+  if (dst_y + height > priv->height)
+    height = priv->height - dst_y;
+
+  cogl_texture = clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (self));
+  cogl_texture_set_region (cogl_texture,
+                           src_x, src_y,
+                           dst_x, dst_y,
+                           width, height,
+                           priv->width, priv->height,
+                           CLUTTER_CAIRO_TEXTURE_PIXEL_FORMAT,
+                           priv->rowstride,
+                           priv->cr_surface_data);
+  clutter_actor_queue_redraw (CLUTTER_ACTOR (self));
+}
diff --git a/clutter/clutter-cairo-texture.h b/clutter/clutter-cairo-texture.h
index 675adfa..7368260 100644
--- a/clutter/clutter-cairo-texture.h
+++ b/clutter/clutter-cairo-texture.h
@@ -96,11 +96,17 @@ void          clutter_cairo_texture_set_surface_size (ClutterCairoTexture *self,
 void          clutter_cairo_texture_get_surface_size (ClutterCairoTexture *self,
                                                       guint               *width,
                                                       guint               *height);
-
+void          clutter_cairo_texture_move_region      (ClutterCairoTexture *self,
+                                                      guint                src_x,
+                                                      guint                src_y,
+                                                      guint                width,
+                                                      guint                height,
+                                                      guint                dst_x,
+                                                      guint                dst_y);
 void          clutter_cairo_texture_clear            (ClutterCairoTexture *self);
 
 void          clutter_cairo_set_source_color         (cairo_t             *cr,
-						      const ClutterColor  *color);
+                                                      const ClutterColor  *color);
 
 G_END_DECLS
 
-- 
1.7.0

Reply via email to