From ee6156cb015efa099c30d11cc1a8c77f9336e87e Mon Sep 17 00:00:00 2001 From: Matthew Allum Date: Fri, 22 Jun 2007 15:16:40 +0000 Subject: [PATCH] 2007-06-22 Matthew Allum * 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 | 17 +++++ NEWS | 116 ++++++++++++++++++++++++++++++++- README.in | 57 +++++++++++------ TODO | 8 ++- clutter/clutter-actor.c | 95 ++++++++++++++------------- clutter/clutter-texture.c | 131 ++++++++++++++++++++++++++++++++------ tests/test-actors.c | 12 +++- 7 files changed, 348 insertions(+), 88 deletions(-) diff --git a/ChangeLog b/ChangeLog index 168b5225a..a65d8c6b5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2007-06-22 Matthew Allum + + * 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 * clutter/clutter-timeline.c: Allow disabling the timeline pool diff --git a/NEWS b/NEWS index e0c85b7e4..3a1d376b3 100644 --- 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 diff --git a/README.in b/README.in index 31f73da55..5e673541e 100644 --- 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 + * Pango 1.x + * OpenGL >= 1.2 or OpenGL ES 1.1 + * GLX, SDL or an EGL Implementation -Its also recommended you have some kind of working hardware OpenGL on -your target system. +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 afd1fd836..2f9c5dafc 100644 --- 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 diff --git a/clutter/clutter-actor.c b/clutter/clutter-actor.c index 0fc5755fc..fd969653f 100644 --- a/clutter/clutter-actor.c +++ b/clutter/clutter-actor.c @@ -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); diff --git a/clutter/clutter-texture.c b/clutter/clutter-texture.c index 8ae39fb51..e9abb077e 100644 --- a/clutter/clutter-texture.c +++ b/clutter/clutter-texture.c @@ -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; } diff --git a/tests/test-actors.c b/tests/test-actors.c index be4e0d8cb..5f1b30eaa 100644 --- a/tests/test-actors.c +++ b/tests/test-actors.c @@ -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);