2007-06-22 Matthew Allum <mallum@openedhand.com>
authorMatthew Allum <mallum@openedhand.com>
Fri, 22 Jun 2007 15:16:40 +0000 (15:16 +0000)
committerMatthew Allum <mallum@openedhand.com>
Fri, 22 Jun 2007 15:16:40 +0000 (15:16 +0000)
        * NEWS:
        * README.in:
        * TODO:
        Update for 0.3 release.

        * clutter/clutter-actor.c:
        Minor doc fixups

        * clutter/clutter-texture.c:
        Various minor additions for handling non RGBA data.
        Fix a typo breaking clutter_texture_get_pixbuf() on tiled textures.

        * tests/test-actors.c:
        Disable scaling to avoid drifting (temporary till API is fixed)

ChangeLog
NEWS
README.in
TODO
clutter/clutter-actor.c
clutter/clutter-texture.c
tests/test-actors.c

index 168b522..a65d8c6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2007-06-22  Matthew Allum  <mallum@openedhand.com>
+
+       * NEWS:
+       * README.in:
+       * TODO:
+       Update for 0.3 release.
+
+       * clutter/clutter-actor.c:
+       Minor doc fixups 
+       
+       * clutter/clutter-texture.c:
+       Various minor additions for handling non RGBA data.
+       Fix a typo breaking clutter_texture_get_pixbuf() on tiled textures.
+
+       * tests/test-actors.c:
+       Disable scaling to avoid drifting (temporary till API is fixed)
+
 2007-06-21  Emmanuele Bassi  <ebassi@openedhand.com>
 
        * clutter/clutter-timeline.c: Allow disabling the timeline pool
diff --git a/NEWS b/NEWS
index e0c85b7..3a1d376 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,118 @@
-Clutter 0.2 ()
+Clutter 0.3 ()
+========================
+
+ * List of changes between 0.2.3 and 0.3
+   o Clutter now supports both switchable windowing system and GL backends. 
+     Window systems supported include GLX, EGL and SDL. 
+
+     GL support includes OpenGL 1.2+ and OpenGL ES 1.1. This is
+     provided by a small basic abstraction layer 'cogl.h'. Cogl is not
+     yet documented - usage external to Clutter is not yet advised.
+
+     Backends may provide specific command line options.
+
+     Notes;
+
+     GLX 
+     --- 
+     The GLX backend is built by default and is currently the most
+     developed, supported and featured windowing system backend. Only
+     OpenGL is supported via GLX.
+
+     SDL
+     ---
+     Clutter has experimental support for using SDL. Open GL is supported as
+     is OpenGL ES via Dogles (very experimental).
+
+     EGL
+     --- 
+     Clutter has experimental support for using EGL. Only Open GL ES
+     is supported by EGL.
+
+     EGL support assumes an EGL implementation running atop X Windows. 
+
+     Open GL ES.
+     -----------
+
+     Clutter now has experimental support for Open GL ES. 
+     Current known issues;
+
+     + Unrealising a ClutterTexture will not move pixel data from video
+       into system memory but simply destroy it.
+     + BGRA, YUV Texture data not currently supported.
+
+     (Use the clutter_feature API to probe for above at runtime)
+
+     Open Source ES implementations this has been tested against
+     include `Vincent' and `dgles'.  Support for commerical
+     implementations may require modifications to the configure.ac
+     script.
+     
+     vincent: http://ogl-es.sourceforge.net/ 
+              (Also see: http://svn.o-hand.com/repos/misc/trunk/ogles/ )
+
+     dgles: http://developer.hybrid.fi/dgles/index.html
+
+   o New ClutterEffect class provides a simplified (and thus less flexible)
+     API wrapping around behaviours, alphas and timelines.
+   o New Behaviours - bspline, ellipsis, rotation.
+   o New built in Alpha functions;
+      CLUTTER_ALPHA_SINE_INC       
+      CLUTTER_ALPHA_SINE_DEC       
+      CLUTTER_ALPHA_SINE_HALF      
+      CLUTTER_ALPHA_SQUARE         
+      CLUTTER_ALPHA_SMOOTHSTEP_INC 
+      CLUTTER_ALPHA_SMOOTHSTEP_DEC 
+      CLUTTER_ALPHA_EXP_INC        
+      CLUTTER_ALPHA_EXP_DEC        
+   o New Actors
+     + ClutterContainer and ClutterVBox, ClutterHBox layout actors.
+     + ClutterEntry, text entry actor
+   o ClutterTexture now handles BGRA, YUV and premultiplied alpha data.
+   o All internal math now fixed point based.
+   o Clutter now has it own internal event queue.
+   o ClutterStage new features;
+     + Title property for naming in window decorations.
+     + Perspective setting - The stages perspective can now be modified.
+   o New Clutter_actor *project API calls allow for querying of tranformed
+     actor vertices and points.
+   o New Clutter Feature checks.   
+   o Initial ClutterUnit implementation for device independant positioning.  
+ * List of Bugs fixed
+   o Various issues with very poor performance and Intel drivers.
+   o #138 Fix typo in x rotation transform.
+
+
+Clutter 0.2.3 (2007-04-11)
+==========================
+
+ * List of changed between 0.2.2 and 0.2.3
+   o Fixes to tile based textures and again clutter_texture_get_pixbuf(). [Matthew]
+   o Implement Gravity for ClutterScaleBehaviour. [Matthew, Rob]
+
+Clutter 0.2.2 (2007-03-22)
+==========================
+
+ * List of changed between 0.2.1 and 0.2.2
+   o Addition of basic XEMBED support for clutter stage. [Matthew]
+   o Fixes to clutter_texture_get_pixbuf(). [Matthew]
+   o Export clutter_group_remove_all and add associated fixes. [Matthew]
+
+Clutter 0.2.1 (2007-02-07)
+==========================
+
+ * List of changed between 0.2.0 and 0.2.1
+   o Add even faster double to integer (and back) conversion
+     functions. [Tomas]
+   o Fix some errors in the fixed point sine waveform
+     function. [Tomas]
+   o Use fixed point math in the Pango renderer. [Tomas]
+   o Improve the GL version check. [Matthew]
+   o Add a square waveform function. [Emmanuele]
+ * List of bugs fixed
+   o #215 - macro CLUTTER_MARK() not disabled for non-debug builds
+
+Clutter 0.2 (18-01-2007)
 ========================
 
  * List of changes between 0.2 and 0.1
index 31f73da..5e67354 100644 (file)
--- a/README.in
+++ b/README.in
@@ -1,33 +1,34 @@
 Clutter README.
 ===============
 
-This is Clutter @CLUTTER_VERSION@. Clutter aims to give a nice easy
-GObject based API for creating fast, mainly 2D single window stylalised
-applications such as media box UI's, presentaions, kiosk style apps etc.
-It uses OpenGL for rendering.
+This is Clutter 0.3. Clutter is a GObject based user interface toolkit
+intended for the creation of fast, visually bespoke and impressive
+applications. Open GL is used for rendering.
 
 Its not meant to be a full featured GUI toolkit for regular desktop
 apps nor provide a general interface to *all* OpenGL functionality.
 
-It currently uses fairly low end GL functionality with an aim to still
-work well on open source graphics drivers as well as possibly making
-an eventual GL ES port feasable.
-
 Clutter currently requires:
 
   * GLib >= 2.10.0
   * GdkPixbuf
-  * OpenGL >= 1.2
-
-Its also recommended you have some kind of working hardware OpenGL on
-your target system.
+  * Pango 1.x
+  * OpenGL >= 1.2 or OpenGL ES 1.1
+  * GLX, SDL or an EGL Implementation
+
+The official website is:                
+   http://www.clutter-project.org
+The Clutter blog is at
+   http://www.clutter-project.org/blog
+To subscribe to the Clutter mailing list, send mail to: 
+   clutter+subscribe@o-hand.com 
+The official mailing list archive is:   
+   http://lists.o-hand.com/clutter/
+New bug page on Bugzilla:               
+   http://bugzilla.o-hand.com/enter_bug.cgi?product=Clutter
 
 Clutter is LGPL licensed.
 
-The official website is:        http://www.clutter-project.org
-The official mailing list is:   http://lists.o-hand.com/clutter/
-New bug page on Bugzilla:       http://bugzilla.o-hand.com/enter_bug.cgi?product=Clutter
-
 INSTALLATION
 ====
 See the INSTALL file
@@ -35,9 +36,18 @@ See the INSTALL file
 RELEASE NOTES
 ====
 
-Release Notes for Clutter 0.4
+Relevant information for developers with existing Clutter applications
+wanting to port to newer releases;
+
+Release Notes for Clutter 0.3
 -----------------------------
 
+* ClutterTexture changes:
+  + clutter_texture_set_pixbuf() now takes a GError paremeter.
+  + clutter_texture_upload_data has been split into two new and
+    more functional versions; clutter_texture_set_from_rgb_data(),
+    clutter_texture_set_from_yuv_data().
+
 * The GLX specific API has been moved to the GLX backend code and
   it's now under the ClutterGlx namespace. 
 
@@ -45,7 +55,7 @@ Release Notes for Clutter 0.4
   reviewed and changed were necessary. Every paint is queued with a
   priority of G_PRIORITY_DEFAULT + 10; timelines are allocated with
   a G_PRIORITY_DEFAULT + 30 priority; events are processed with a
-  G_PRIORITY_DEFAUTL priority. This ensures that events are processed
+  G_PRIORITY_DEFAULT priority. This ensures that events are processed
   before the paints take place.
 
 * The ClutterActor::allocate_coords() has been renamed to
@@ -71,6 +81,16 @@ Release Notes for Clutter 0.4
   If an application experiences bad behaviours during animations
   use "export CLUTTER_TIMELINE=no-pool" to disable the timeout pool.
 
+* clutter_color_parse() now handles color definitions with alpha. Alpha
+  will default to fully Opaque rather than fully transparent if not specified.
+
+* The Clutter examples/ directory has been removed and replaced with a 
+  tests/ directory.
+
+* Event API changes and event queue (Ebassi) .
+
+* Runtime options now dependant on backend.
+
 HACKING
 ====
 If you want to hack on and improve clutter check the TODO file.
@@ -86,7 +106,8 @@ You will need an account.
 In the report you should include:
 * what system you're running Clutter on;
 * which version of GLib, GdkPixbuf and OpenGL you are using;
-* which video card and which drivers you are using;
+* which video card and which drivers you are using, including output of
+  glxinfo and xdpyinfo.
 * how to reproduce the bug.
 
 If you cannot reproduce the bug with one of the tests that come with Clutter
diff --git a/TODO b/TODO
index afd1fd8..2f9c5da 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,7 +1,7 @@
 TODO
 ====
 
-Last updated 31/05/2007
+Last updated 22/06/2007
 
 
 0.4 (July 07)
@@ -32,8 +32,9 @@ Maybe:
 
 Definetly:
 
- - Fragment shader support infrastructure
+ - More ClutterUnits support, convert actor API to units.
  - Device independant units
+ - Fragment shader support infrastructure
  - XML/JSON type 'layout' files - include actors + behaviours + timeline etc.
  - App developers manual.
 
@@ -43,4 +44,5 @@ Nice/Maybe:
  - Rectangle like props to all actors
  - Glitz integration
  - Some kind of focus model.
- - Apple/Win native backends.
\ No newline at end of file
+ - Apple/Win native backends.
+ - Glitz backend over GLX (would cover above)
\ No newline at end of file
index 0fc5755..fd96965 100644 (file)
@@ -59,10 +59,10 @@ struct _ClutterActorPrivate
 {
   ClutterActorBox coords;
 
-  ClutterGeometry clip;
+  ClutterGeometry clip;                          /* FIXME: Should be Units */  
   guint           has_clip : 1;
   ClutterFixed    rxang, ryang, rzang;           /* Rotation*/
-  gint            rzx, rzy, rxy, rxz, ryx, ryz;
+  gint            rzx, rzy, rxy, rxz, ryx, ryz;         /* FIXME: Should be Units */
   gint            z;
   guint8          opacity;
   ClutterActor   *parent_actor;
@@ -498,9 +498,9 @@ clutter_actor_transform_vertices (ClutterActor    * self,
  * @verts: Pointer to a location of an array of 4 #ClutterVertex where to
  * store the result.
  * 
- * Calculates the screen coordinaces of the four corners or the actor; the
- * returned corners are in the following order: bottomleft, bottomright,
- * topright, topleft.
+ * Calculates the tranformed screen coordinaces of the four corners of
+ * the actor; the returned corners are in the following order:
+ * bottomleft, bottomright, topright, topleft.
  *
  * Since: 0.4
  **/
@@ -706,9 +706,10 @@ clutter_actor_paint (ClutterActor *self)
 /**
  * clutter_actor_request_coords:
  * @self: A #ClutterActor
- * @box: A #ClutterActorBox with requested new co-ordinates.
+ * @box: A #ClutterActorBox with requested new co-ordinates in ClutterUnits
  *
- * Requests new co-ordinates for the #ClutterActor ralative to any parent.
+ * Requests new untransformed co-ordinates for the #ClutterActor
+ * ralative to any parent.
  *
  * This function should not be called directly by applications instead 
  * the various position/geometry methods should be used.
@@ -767,8 +768,8 @@ clutter_actor_request_coords (ClutterActor    *self,
  * @self: A #ClutterActor
  * @box: A location to store the actors #ClutterActorBox co-ordinates
  *
- * Requests the queryd un transformed co-ordinates for the #ClutterActor 
- * relative to any parent.
+ * Requests the untransformed co-ordinates (in ClutterUnits) for the
+ * #ClutterActor relative to any parent.
  *
  * This function should not be called directly by applications instead 
  * the various position/geometry methods should be used.
@@ -1212,7 +1213,8 @@ clutter_actor_queue_redraw (ClutterActor *self)
  * @self: A #ClutterActor
  * @geometry: A #ClutterGeometry
  *
- * Sets the actors geometry in pixels relative to any parent actor.
+ * Sets the actors untransformed geometry in pixels relative to any
+ * parent actor.
  */
 void
 clutter_actor_set_geometry (ClutterActor          *self,
@@ -1233,7 +1235,8 @@ clutter_actor_set_geometry (ClutterActor          *self,
  * @self: A #ClutterActor
  * @geometry: A location to store actors #ClutterGeometry
  *
- * Gets the actors geometry in pixels relative to any parent actor.
+ * Gets the actors untransformed geometry in pixels relative to any
+ * parent actor.
  */
 void
 clutter_actor_get_geometry (ClutterActor    *self,
@@ -1259,7 +1262,7 @@ clutter_actor_get_geometry (ClutterActor    *self,
  * @x2: A location to store actors right position if non NULL.
  * @y2: A location to store actors bottom position if non NULL.
  *
- * Gets the actors bounding rectangle co-ordinates in pixels 
+ * Gets the actors untransformed bounding rectangle co-ordinates in pixels 
  * relative to any parent actor. 
  */
 void
@@ -1324,7 +1327,7 @@ clutter_actor_set_position (ClutterActor *self,
  * @dy: Distance to move Actor on Y axis.
  *
  * Moves an actor by specified distance relative to 
- * current position.
+ * current position in pixels.
  *
  * Since: 0.2
  */
@@ -1355,8 +1358,7 @@ clutter_actor_move_by (ClutterActor *self,
  * @width: New width of actor in pixels 
  * @height: New height of actor in pixels
  *
- * Sets the actors position in pixels relative to any
- * parent actor. 
+ * Sets the actors size in pixels.
  */
 void
 clutter_actor_set_size (ClutterActor *self,
@@ -1381,7 +1383,7 @@ clutter_actor_set_size (ClutterActor *self,
  * @width: Location to store width if non NULL.
  * @height: Location to store height if non NULL.
  *
- * Gets the size of an actor ignoring any scaling factors
+ * Gets the size of an actor in pixels ignoring any scaling factors.
  *
  * Since: 0.2
  */
@@ -1522,7 +1524,7 @@ clutter_actor_get_abs_size (ClutterActor *self,
  * clutter_actor_get_width
  * @self: A #ClutterActor
  *
- * Retrieves the actors width.
+ * Retrieves the actors width ignoring any scaling factors.
  *
  * Return value: The actor width in pixels
  **/
@@ -1542,7 +1544,7 @@ clutter_actor_get_width (ClutterActor *self)
  * clutter_actor_get_height
  * @self: A #ClutterActor
  *
- * Retrieves the actors height.
+ * Retrieves the actors height ignoring any scaling factors.
  * 
  * Return value: The actor height in pixels
  **/
@@ -1599,7 +1601,8 @@ clutter_actor_set_height (ClutterActor *self, guint height)
  *
  * Retrieves the actors x position relative to any parent.
  *
- * Return value: The actor x position in pixels
+ * Return value: The actor x position in pixels ignoring any tranforms
+ * (i.e scaling, rotation).
  **/
 gint
 clutter_actor_get_x (ClutterActor *self)
@@ -1619,7 +1622,8 @@ clutter_actor_get_x (ClutterActor *self)
  *
  * Retrieves the actors y position relative to any parent.
  *
- * Return value: The actor y position in pixels
+ * Return value: The actor y position in pixels ignoring any tranforms
+ * (i.e scaling, rotation).
  **/
 gint
 clutter_actor_get_y (ClutterActor *self)
@@ -1639,7 +1643,7 @@ clutter_actor_get_y (ClutterActor *self)
  * @scale_x: #ClutterFixed factor to scale actor by horizontally.
  * @scale_y: #ClutterFixed factor to scale actor by vertically.
  *
- * Scale an actor.
+ * Scales an actor with fixed point parameters.
  */
 void
 clutter_actor_set_scalex (ClutterActor *self,
@@ -1658,10 +1662,10 @@ clutter_actor_set_scalex (ClutterActor *self,
 /**
  * clutter_actor_set_scale:
  * @self: A #ClutterActor
- * @scale_x: double
- * @scale_y: double
+ * @scale_x: double factor to scale actor by horizontally.
+ * @scale_y: double factor to scale actor by vertically.
  *
- * FIXME
+ * Scales an actor with floating point parameters.
  *
  * Since: 0.2
  */
@@ -1680,10 +1684,10 @@ clutter_actor_set_scale (ClutterActor *self,
 /**
  * clutter_actor_get_scalex:
  * @self: A #ClutterActor
- * @scale_x: FIXME
- * @scale_y: FIXME
+ * @scale_x: Location to store horizonal fixed scale factor if non NULL.
+ * @scale_y: Location to store vertical fixed scale factor if non NULL.
  *
- * FIXME
+ * Retrieves an actors scale in fixed point.
  *
  * Since: 0.2
  */
@@ -1702,10 +1706,10 @@ clutter_actor_get_scalex (ClutterActor *self,
 /**
  * clutter_actor_get_scale:
  * @self: A #ClutterActor
- * @scale_x: FIXME
- * @scale_y: FIXME
+ * @scale_x: Location to store horizonal float scale factor if non NULL.
+ * @scale_y: Location to store vertical float scale factor if non NULL.
  *
- * FIXME
+ * Retrieves an actors scale in floating point.
  *
  * Since: 0.2
  */
@@ -1735,14 +1739,14 @@ clutter_actor_get_scale (ClutterActor *self,
  */
 void
 clutter_actor_set_scale_with_gravity (ClutterActor     *self,
-                                 gfloat            scale_x,
-                                 gfloat            scale_y,
-                                 ClutterGravity    gravity)
+                                     gfloat            scale_x,
+                                     gfloat            scale_y,
+                                     ClutterGravity    gravity)
 {
-    clutter_actor_set_scale_with_gravityx (self,
-                                          CLUTTER_FLOAT_TO_FIXED (scale_x),
-                                          CLUTTER_FLOAT_TO_FIXED (scale_y),
-                                          gravity);
+  clutter_actor_set_scale_with_gravityx (self,
+                                        CLUTTER_FLOAT_TO_FIXED (scale_x),
+                                        CLUTTER_FLOAT_TO_FIXED (scale_y),
+                                        gravity);
 }
 
 /**
@@ -1927,7 +1931,8 @@ clutter_actor_get_id (ClutterActor *self)
  * @self: a #ClutterActor
  * @depth: Z co-ord
  *
- * Sets the Z co-ordinate of @self to @depth.
+ * Sets the Z co-ordinate of @self to @depth. The Units of which are dependant
+ * on the perspective setup. 
  */
 void
 clutter_actor_set_depth (ClutterActor *self,
@@ -1942,7 +1947,7 @@ clutter_actor_set_depth (ClutterActor *self,
   /* Sets Z value. - FIXME: should invert ?*/
   priv->z = depth;
 
-  if (priv->parent_actor)
+  if (priv->parent_actor && CLUTTER_IS_GROUP (priv->parent_actor))
     {
       /* We need to resort the group stacking order as to
        * correctly render alpha values. 
@@ -2060,7 +2065,7 @@ clutter_actor_rotate_y (ClutterActor *self,
  * @width: Width of the clip rectangle
  * @height: Height of the clip rectangle
  *
- * Sets clip area for @self.
+ * Sets clip area in pixels for @self.
  */
 void
 clutter_actor_set_clip (ClutterActor *self,
@@ -2090,7 +2095,7 @@ clutter_actor_set_clip (ClutterActor *self,
  * clutter_actor_remove_clip
  * @self: A #ClutterActor
  *
- * Removes clip area from @self.
+ * Removes clip area in pixels from @self.
  */
 void
 clutter_actor_remove_clip (ClutterActor *self)
@@ -2128,7 +2133,8 @@ clutter_actor_has_clip (ClutterActor *self)
  * Sets the parent of @self to @parent.  The opposite function is
  * clutter_actor_unparent().
  * 
- * This function should not be used by applications.
+ * This function should not be used by applications but by custom
+ * 'composite' actor sub classes.
  */
 void
 clutter_actor_set_parent (ClutterActor *self,
@@ -2265,8 +2271,9 @@ clutter_actor_reparent (ClutterActor *self,
 
       g_object_ref (self);
 
-      /* XXX: below assumes only containers can reparent */
-      clutter_container_remove_actor (CLUTTER_CONTAINER (priv->parent_actor), self);
+      /* FIXME: below assumes only containers can reparent */
+      clutter_container_remove_actor (CLUTTER_CONTAINER (priv->parent_actor), 
+                                     self);
       clutter_container_add_actor (CLUTTER_CONTAINER (new_parent), self);
 
       g_object_unref (self);
index 8ae39fb..e9abb07 100644 (file)
@@ -112,6 +112,77 @@ enum
 
 static int texture_signals[LAST_SIGNAL] = { 0 };
 
+static guchar*
+un_pre_multiply_alpha (const guchar   *data,
+                      gint            width,
+                      gint            height,
+                      gint            rowstride)
+{
+  gint           x,y;
+  unsigned char *ret, *dst, *src;
+
+  ret = dst = g_malloc(sizeof(guchar) * height * rowstride);
+
+  /* FIXME: Optimise */
+  for (y = 0; y < height; y++)
+    {
+      src = (guchar*)data + y * rowstride;
+      for (x = 0; x < width; x++) 
+       {
+         guchar alpha = src[3];
+         if (alpha == 0)
+           {
+             src[0] = src[1] = src[2] = src[3] = alpha;
+           }
+         else
+           {
+             dst[0] = (((src[0] >> 16) & 0xff) * 255 ) / alpha;
+             dst[1] = (((src[1] >> 8) & 0xff) * 255 ) / alpha; 
+             dst[2] = (((src[2] >> 0) & 0xff) * 255 ) / alpha;
+             dst[3] = alpha;
+           }
+         dst += 4;
+         src += 4;
+       }
+    }
+
+  return ret;
+}
+
+static guchar*
+rgb_to_bgr (const guchar   *data,
+           gboolean        has_alpha,
+           gint            width,
+           gint            height,
+           gint            rowstride)
+{
+  gint           x,y, bpp = 4;
+  unsigned char *ret, *dst, *src;
+
+  ret = dst = g_malloc(sizeof(guchar) * height * rowstride);
+
+  if (!has_alpha)
+    bpp = 3;
+
+  /* FIXME: Optimise */
+  for (y = 0; y < height; y++)
+    {
+      src = (guchar*)data + y * rowstride;
+      for (x = 0; x < width; x++) 
+       {
+         dst[0] = src[2];
+         dst[1] = src[1];
+         dst[2] = src[0];
+         if (has_alpha)
+           dst[3] = src[3];
+         dst += bpp;
+         src += bpp;
+       }
+    }
+
+  return ret;
+}
+
 static int
 tile_dimension (int                          to_fill,
                int                          start_size,
@@ -447,11 +518,6 @@ texture_upload_data (ClutterTexture *texture,
        src_w = priv->x_tiles[x].size;
        src_h = priv->y_tiles[y].size;
 
-        pixtmp = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
-                                 has_alpha,
-                                 8,
-                                 src_w, src_h);
-
        /* clip */
        if (priv->x_tiles[x].pos + src_w > priv->width)
          src_w = priv->width - priv->x_tiles[x].pos;
@@ -459,6 +525,11 @@ texture_upload_data (ClutterTexture *texture,
        if (priv->y_tiles[y].pos + src_h > priv->height)
          src_h = priv->height - priv->y_tiles[y].pos;
 
+        pixtmp = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
+                                 has_alpha,
+                                 8,
+                                 src_w, src_h);
+
         gdk_pixbuf_copy_area (master_pixbuf,
                               priv->x_tiles[x].pos,
                               priv->y_tiles[y].pos,
@@ -466,7 +537,6 @@ texture_upload_data (ClutterTexture *texture,
                               src_h,
                               pixtmp,
                               0, 0);
-
 #ifdef CLUTTER_DUMP_TILES
        {
          gchar  *filename;
@@ -543,6 +613,8 @@ clutter_texture_unrealize (ClutterActor *actor)
        * GL/ES cant do this - it probably makes sense   
        * to move this kind of thing into a ClutterProxyTexture
        * where this behaviour can be better controlled.
+       *
+       * Or make it controllable via a property.
        */
       if (priv->local_pixbuf == NULL)
        {
@@ -1009,7 +1081,10 @@ clutter_texture_get_pixbuf (ClutterTexture* texture)
   if (priv->tiles == NULL)
     return NULL; 
 
-  if (priv->pixel_format == CGL_RGB)
+  if (priv->pixel_format == CGL_YCBCR_MESA)
+    return NULL;               /* FIXME: convert YUV */
+
+  if (priv->pixel_format == CGL_RGB || priv->pixel_format == CGL_BGR)
     bpp = 3;
 
   if (!priv->is_tiled)
@@ -1019,8 +1094,6 @@ clutter_texture_get_pixbuf (ClutterTexture* texture)
       if (!pixels)
        return NULL;
 
-      /* FIXME: cogl */
-
       glBindTexture(priv->target_type, priv->tiles[0]);
 
       glPixelStorei (GL_UNPACK_ROW_LENGTH, priv->width);
@@ -1030,13 +1103,16 @@ clutter_texture_get_pixbuf (ClutterTexture* texture)
       /* No such func in gles... */
       glGetTexImage (priv->target_type,
                     0,
-                    priv->pixel_format, 
-                    priv->pixel_type,
+                    (priv->pixel_format == CGL_RGBA 
+                     || priv->pixel_format == CGL_BGRA) ? 
+                    CGL_RGBA : CGL_RGB, 
+                    PIXEL_TYPE,
                     (GLvoid*)pixels);
 
       pixbuf = gdk_pixbuf_new_from_data ((const guchar*)pixels,
                                         GDK_COLORSPACE_RGB,
-                                        (priv->pixel_format == GL_RGBA),
+                                        (priv->pixel_format == CGL_RGBA
+                                         || priv->pixel_format == CGL_BGRA),
                                         8,
                                         priv->width,
                                         priv->height,
@@ -1051,7 +1127,8 @@ clutter_texture_get_pixbuf (ClutterTexture* texture)
       i = 0;
 
       pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
-                              (priv->pixel_format == GL_RGBA),
+                              (priv->pixel_format == CGL_RGBA
+                               || priv->pixel_format == CGL_BGRA),
                               8,
                               priv->width,
                               priv->height);
@@ -1074,8 +1151,10 @@ clutter_texture_get_pixbuf (ClutterTexture* texture)
 
            glGetTexImage (priv->target_type,
                           0,
-                          priv->pixel_format,
-                          priv->pixel_type,
+                          (priv->pixel_format == CGL_RGBA 
+                           || priv->pixel_format == CGL_BGRA) ? 
+                          CGL_RGBA : CGL_RGB, 
+                          PIXEL_TYPE,
                           (GLvoid *) pixels);
        
             /* Clip */
@@ -1083,12 +1162,13 @@ clutter_texture_get_pixbuf (ClutterTexture* texture)
               src_w = priv->width - priv->x_tiles[x].pos;
 
             if (priv->y_tiles[y].pos + src_h > priv->height)
-              src_h = priv->height = priv->y_tiles[y].pos;
+              src_h = priv->height - priv->y_tiles[y].pos;
 
            tmp_pixb =
              gdk_pixbuf_new_from_data ((const guchar*)pixels,
                                        GDK_COLORSPACE_RGB,
-                                       (priv->pixel_format == GL_RGBA),
+                                       (priv->pixel_format == CGL_RGBA
+                                        || priv->pixel_format == CGL_BGRA),
                                        8,
                                        src_w,
                                        src_h,
@@ -1109,7 +1189,7 @@ clutter_texture_get_pixbuf (ClutterTexture* texture)
 
            i++;
          }
-      
+
     }
 
   return pixbuf;
@@ -1154,6 +1234,7 @@ clutter_texture_set_from_rgb_data   (ClutterTexture     *texture,
   ClutterTexturePrivate *priv;
   gboolean               texture_dirty = TRUE, size_change = FALSE;
   COGLenum               prev_format;
+  guchar                *copy_data = NULL;
 
   priv = texture->priv;
 
@@ -1173,13 +1254,20 @@ clutter_texture_set_from_rgb_data   (ClutterTexture     *texture,
 
   if (flags & CLUTTER_TEXTURE_RGB_FLAG_BGR)
     {
-      /* FIXME: We actually need to convert for GLES */
+#if HAVE_COGL_GL
       if (has_alpha)
        priv->pixel_format = CGL_BGRA;
       else
        priv->pixel_format = CGL_BGR;
+#else
+      /* GLES has no BGR format*/
+      copy_data = rgb_to_bgr (data, has_alpha, width, height, rowstride);
+#endif
     }
 
+  if (flags & CLUTTER_TEXTURE_RGB_FLAG_PREMULT)
+    copy_data = un_pre_multiply_alpha (data, width, height, rowstride);
+
   if (prev_format != priv->pixel_format || priv->pixel_type != PIXEL_TYPE)
     texture_dirty = TRUE;
 
@@ -1232,7 +1320,7 @@ clutter_texture_set_from_rgb_data   (ClutterTexture     *texture,
 
   /* Set Error from this */
   texture_upload_data (texture, 
-                      data, 
+                      copy_data != NULL ? copy_data : data, 
                       has_alpha, 
                       width, 
                       height, 
@@ -1259,6 +1347,9 @@ clutter_texture_set_from_rgb_data   (ClutterTexture     *texture,
   if (CLUTTER_ACTOR_IS_MAPPED (CLUTTER_ACTOR(texture)))
     clutter_actor_queue_redraw (CLUTTER_ACTOR(texture));
 
+  if (copy_data != NULL)
+    g_free (copy_data);
+
   return TRUE;
 }
 
index be4e0d8..5f1b30e 100644 (file)
@@ -94,17 +94,23 @@ frame_cb (ClutterTimeline *timeline,
     {
       gdouble scale_x, scale_y;
 
-
       clutter_actor_get_scale (oh->hand[i], &scale_x, &scale_y);
 
       /* Rotate each hand around there centers - to get this we need
        * to take into account any scaling.
+       *
+       * FIXME: scaling causes drift so disabled for now. Need rotation
+       * unit based functions to fix.
       */
       clutter_actor_rotate_z 
              (oh->hand[i],
               - 6.0 * frame_num,
+#if 0
               (clutter_actor_get_width (oh->hand[i]) / 2) * scale_x,
-              (clutter_actor_get_height (oh->hand[i]) / 2) * scale_y);
+              (clutter_actor_get_height (oh->hand[i]) / 2) * scale_y
+#endif
+              (clutter_actor_get_width (oh->hand[i]) / 2),
+              (clutter_actor_get_height (oh->hand[i]) / 2));
     }
 }
 
@@ -203,10 +209,12 @@ main (int argc, char *argv[])
       /* Add to our group group */
       clutter_container_add_actor (CLUTTER_CONTAINER (oh->group), oh->hand[i]);
 
+#if 0 /* FIXME: disabled as causes drift - see comment above */
       if (i % 2)
        clutter_behaviour_apply (scaler_1, oh->hand[i]);
       else
        clutter_behaviour_apply (scaler_2, oh->hand[i]);
+#endif
     }
 
   clutter_actor_show_all (oh->group);