[Swfdec-commits] 8 commits - swfdec/swfdec_as_strings.c swfdec/swfdec_bitmap_data.c swfdec/swfdec_color.c swfdec/swfdec_color_transform_as.c swfdec/swfdec_color_transform_as.h swfdec/swfdec_image.c swfdec/swfdec_movie.c swfdec/swfdec_player.c swfdec/swfdec_renderer.c swfdec/swfdec_renderer_internal.h swfdec/swfdec_transform_as.c

Benjamin Otte company at kemper.freedesktop.org
Sat Jul 26 14:22:25 PDT 2008


 swfdec/swfdec_as_strings.c         |    2 
 swfdec/swfdec_bitmap_data.c        |   98 ++++++++++++++++++++++++++++++++++++-
 swfdec/swfdec_color.c              |   12 ++--
 swfdec/swfdec_color_transform_as.c |   20 +++++++
 swfdec/swfdec_color_transform_as.h |    2 
 swfdec/swfdec_image.c              |   25 ---------
 swfdec/swfdec_movie.c              |    8 ---
 swfdec/swfdec_player.c             |    4 +
 swfdec/swfdec_renderer.c           |   41 +++++++++++++++
 swfdec/swfdec_renderer_internal.h  |    4 +
 swfdec/swfdec_transform_as.c       |   13 ----
 11 files changed, 182 insertions(+), 47 deletions(-)

New commits:
commit 85076664610560731ab9b5a9f0a1f556668f2faa
Author: Benjamin Otte <otte at gnome.org>
Date:   Sat Jul 26 23:18:45 2008 +0200

    implement color transforms for BitmapData.draw

diff --git a/swfdec/swfdec_bitmap_data.c b/swfdec/swfdec_bitmap_data.c
index cf9ade7..4944e48 100644
--- a/swfdec/swfdec_bitmap_data.c
+++ b/swfdec/swfdec_bitmap_data.c
@@ -32,6 +32,7 @@
 #include "swfdec_as_native_function.h"
 #include "swfdec_as_strings.h"
 #include "swfdec_color.h"
+#include "swfdec_color_transform_as.h"
 #include "swfdec_debug.h"
 #include "swfdec_image.h"
 #include "swfdec_player_internal.h"
@@ -443,13 +444,14 @@ void
 swfdec_bitmap_data_draw (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
 {
-  SwfdecAsObject *o, *matrix;
+  SwfdecAsObject *o, *matrix, *trans;
   cairo_t *cr;
   SwfdecColorTransform ctrans;
   SwfdecBitmapData *bitmap;
+  SwfdecRenderer *renderer;
   cairo_matrix_t mat;
 
-  SWFDEC_AS_CHECK (SWFDEC_TYPE_BITMAP_DATA, &bitmap, "o|O", &o, &matrix);
+  SWFDEC_AS_CHECK (SWFDEC_TYPE_BITMAP_DATA, &bitmap, "o|OO", &o, &matrix, &trans);
 
   if (argc >= 2) {
     if (matrix == NULL || !swfdec_matrix_from_as_object (&mat, matrix))
@@ -457,20 +459,33 @@ swfdec_bitmap_data_draw (SwfdecAsContext *cx, SwfdecAsObject *object,
   } else {
     cairo_matrix_init_identity (&mat);
   }
-  if (argc > 2) {
-    SWFDEC_FIXME ("only the first 2 arguments to Bitmap.draw() are implemented");
+  if (SWFDEC_IS_COLOR_TRANSFORM_AS (trans)) {
+    swfdec_color_transform_get_transform (SWFDEC_COLOR_TRANSFORM_AS (trans), &ctrans);
+  } else {
+    swfdec_color_transform_init_identity (&ctrans);
+  }
+
+  if (argc > 3) {
+    SWFDEC_FIXME ("only the first 3 arguments to Bitmap.draw() are implemented");
   }
-  swfdec_color_transform_init_identity (&ctrans);
 
   cr = cairo_create (bitmap->surface);
   /* FIXME: Do we have a better renderer? */
-  swfdec_renderer_attach (SWFDEC_PLAYER (cx)->priv->renderer, cr);
+  renderer = SWFDEC_PLAYER (cx)->priv->renderer;
+  swfdec_renderer_attach (renderer, cr);
   cairo_transform (cr, &mat);
 
   if (SWFDEC_IS_BITMAP_DATA (o)) {
     SwfdecBitmapData *src = SWFDEC_BITMAP_DATA (o);
     if (src->surface) {
-      cairo_set_source_surface (cr, SWFDEC_BITMAP_DATA (o)->surface, 0, 0);
+      if (swfdec_color_transform_is_identity (&ctrans)) {
+	cairo_set_source_surface (cr, SWFDEC_BITMAP_DATA (o)->surface, 0, 0);
+      } else {
+	cairo_surface_t *transformed = swfdec_renderer_transform (renderer,
+	    SWFDEC_BITMAP_DATA (o)->surface, &ctrans);
+	cairo_set_source_surface (cr, transformed, 0, 0);
+	cairo_surface_destroy (transformed);
+      }
       cairo_paint (cr);
     }
   } else if (SWFDEC_IS_MOVIE (o)) {
commit 40576cb2af3fb23dfcef3106cc1f240ead47827c
Author: Benjamin Otte <otte at gnome.org>
Date:   Sat Jul 26 23:17:46 2008 +0200

    move color-transforming of images into the renderer's API

diff --git a/swfdec/swfdec_image.c b/swfdec/swfdec_image.c
index 5c79c68..966b6fd 100644
--- a/swfdec/swfdec_image.c
+++ b/swfdec/swfdec_image.c
@@ -658,10 +658,6 @@ swfdec_image_create_surface_transformed (SwfdecImage *image, SwfdecRenderer *ren
   SwfdecColorTransform mask;
   SwfdecCachedImage *cached;
   cairo_surface_t *surface, *source;
-  guint32 *tdata;
-  const guint32 *sdata;
-  guint i, n;
-  gboolean has_alpha = FALSE;
 
   g_return_val_if_fail (SWFDEC_IS_IMAGE (image), NULL);
   g_return_val_if_fail (renderer == NULL || SWFDEC_IS_RENDERER (renderer), NULL);
@@ -693,26 +689,9 @@ swfdec_image_create_surface_transformed (SwfdecImage *image, SwfdecRenderer *ren
     }
   }
 
-  tdata = g_try_malloc (image->width * image->height * 4);
-  if (!tdata) {
-    SWFDEC_ERROR ("failed to allocate memory for transformed image");
-    cairo_surface_destroy (source);
-    return NULL;
-  }
-  /* FIXME: This code assumes a rowstride of 4 * width */
-  /* FIXME: This code assumes an alignment of 4 */
-  sdata = (void *) cairo_image_surface_get_data (source);
-  n = image->width * image->height;
-  for (i = 0; i < n; i++) {
-    tdata[i] = swfdec_color_apply_transform_premultiplied (sdata[i], trans);
-    /* optimization: check for alpha channel to speed up compositing */
-    has_alpha |= SWFDEC_COLOR_ALPHA (tdata[i]) != 0xFF;
-  }
-  cairo_surface_destroy (source);
-  surface = swfdec_image_create_surface_for_data (renderer, (guchar *) tdata,
-      has_alpha ? CAIRO_FORMAT_ARGB32 : CAIRO_FORMAT_RGB24, 
-      image->width, image->height, image->width * 4);
+  surface = swfdec_renderer_transform (renderer, surface, trans);
   if (renderer) {
+    surface = swfdec_renderer_create_similar (renderer, surface);
     /* FIXME: The size is just an educated guess */
     cached = swfdec_cached_image_new (surface, image->width * image->height * 4);
     swfdec_cached_image_set_color_transform (cached, trans);
diff --git a/swfdec/swfdec_renderer.c b/swfdec/swfdec_renderer.c
index 59db44b..00357e8 100644
--- a/swfdec/swfdec_renderer.c
+++ b/swfdec/swfdec_renderer.c
@@ -397,6 +397,47 @@ swfdec_renderer_create_for_data (SwfdecRenderer *renderer, guint8 *data,
   return klass->create_for_data (renderer, data, format, width, height, rowstride);
 }
 
+cairo_surface_t *
+swfdec_renderer_transform (SwfdecRenderer *renderer, cairo_surface_t *surface,
+    const SwfdecColorTransform *trans)
+{
+  cairo_surface_t *target;
+  guint w, h, x, y, sstride, tstride, color;
+  SwfdecColor mask;
+  guint8 *sdata, *tdata;
+
+  g_return_val_if_fail (SWFDEC_IS_RENDERER (renderer), NULL);
+  g_return_val_if_fail (surface != NULL, NULL);
+  g_return_val_if_fail (cairo_surface_get_type (surface) == CAIRO_SURFACE_TYPE_IMAGE, NULL);
+  g_return_val_if_fail (trans != NULL, NULL);
+  g_return_val_if_fail (!swfdec_color_transform_is_mask (trans), NULL);
+
+  /* FIXME: This function should likely be a vfunc. 
+   * Or better: it should compile to a shader */
+  w = cairo_image_surface_get_width (surface);
+  h = cairo_image_surface_get_height (surface);
+  sdata = cairo_image_surface_get_data (surface);
+  sstride = cairo_image_surface_get_stride (surface);
+  mask = cairo_image_surface_get_format (surface) == CAIRO_FORMAT_RGB24 ? 
+    SWFDEC_COLOR_COMBINE (0, 0, 0, 0xFF) : 0;
+
+  target = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w, h);
+  tdata = cairo_image_surface_get_data (target);
+  tstride = cairo_image_surface_get_stride (target);
+  for (y = 0; y < h; y++) {
+    for (x = 0; x < w; x++) {
+      color = ((guint32 *) sdata)[x];
+      color |= mask;
+      color = swfdec_color_apply_transform_premultiplied (color, trans);
+      ((guint32 *) tdata)[x] = color;
+    }
+    sdata += sstride;
+    tdata += tstride;
+  }
+
+  return target;
+}
+
 /*** PUBLIC API ***/
 
 /**
diff --git a/swfdec/swfdec_renderer_internal.h b/swfdec/swfdec_renderer_internal.h
index e2bc1b4..6d69ef2 100644
--- a/swfdec/swfdec_renderer_internal.h
+++ b/swfdec/swfdec_renderer_internal.h
@@ -22,6 +22,7 @@
 
 #include <swfdec/swfdec_renderer.h>
 #include <swfdec/swfdec_cached.h>
+#include <swfdec/swfdec_color.h>
 
 G_BEGIN_DECLS
 
@@ -54,6 +55,9 @@ cairo_surface_t *	swfdec_renderer_create_for_data	(SwfdecRenderer *	renderer,
 							 guint			width,
 							 guint			height,
 							 guint			rowstride);
+cairo_surface_t *	swfdec_renderer_transform	(SwfdecRenderer *	renderer,
+							 cairo_surface_t *	surface,
+							 const SwfdecColorTransform *trans);
 
 
 G_END_DECLS
commit 2244ea20f6d920c964e407121e92926a21431ce6
Author: Benjamin Otte <otte at gnome.org>
Date:   Sat Jul 26 23:16:44 2008 +0200

    add API to transform a ColorTransform object to Swfdec's color transform

diff --git a/swfdec/swfdec_color_transform_as.c b/swfdec/swfdec_color_transform_as.c
index ab6a7d2..a50794d 100644
--- a/swfdec/swfdec_color_transform_as.c
+++ b/swfdec/swfdec_color_transform_as.c
@@ -396,3 +396,23 @@ swfdec_color_transform_as_new_from_transform (SwfdecAsContext *context,
 
   return transform_as;
 }
+
+void
+swfdec_color_transform_get_transform (SwfdecColorTransformAs *trans,
+    SwfdecColorTransform *ctrans)
+{
+  g_return_if_fail (SWFDEC_IS_COLOR_TRANSFORM_AS (trans));
+  g_return_if_fail (ctrans != NULL);
+
+  SWFDEC_FIXME ("This conversion needs serious testing with NaN and overflows");
+  ctrans->mask = FALSE;
+  ctrans->ra = trans->ra * 256.0;
+  ctrans->ga = trans->ga * 256.0;
+  ctrans->ba = trans->ba * 256.0;
+  ctrans->aa = trans->aa * 256.0;
+  ctrans->rb = trans->rb;
+  ctrans->gb = trans->gb;
+  ctrans->bb = trans->bb;
+  ctrans->ab = trans->ab;
+}
+
diff --git a/swfdec/swfdec_color_transform_as.h b/swfdec/swfdec_color_transform_as.h
index 39f69ff..6a0704e 100644
--- a/swfdec/swfdec_color_transform_as.h
+++ b/swfdec/swfdec_color_transform_as.h
@@ -51,6 +51,8 @@ GType			swfdec_color_transform_as_get_type		(void);
 
 SwfdecColorTransformAs *swfdec_color_transform_as_new_from_transform	(SwfdecAsContext *		context,
 									 const SwfdecColorTransform *	transform);
+void			swfdec_color_transform_get_transform		(SwfdecColorTransformAs *	trans,
+									 SwfdecColorTransform *		ctrans);
 
 G_END_DECLS
 #endif
diff --git a/swfdec/swfdec_transform_as.c b/swfdec/swfdec_transform_as.c
index 556852e..3bd4f2b 100644
--- a/swfdec/swfdec_transform_as.c
+++ b/swfdec/swfdec_transform_as.c
@@ -101,7 +101,6 @@ swfdec_transform_as_set_colorTransform (SwfdecAsContext *cx,
 {
   SwfdecTransformAs *self;
   SwfdecColorTransformAs *transform_as;
-  SwfdecColorTransform *transform;
   SwfdecAsObject *color;
 
   SWFDEC_AS_CHECK (SWFDEC_TYPE_TRANSFORM_AS, &self, "o", &color);
@@ -113,17 +112,8 @@ swfdec_transform_as_set_colorTransform (SwfdecAsContext *cx,
     return;
 
   transform_as = SWFDEC_COLOR_TRANSFORM_AS (color);
-  transform = &self->target->color_transform;
-
-  SWFDEC_FIXME ("This conversion needs serious testing with NaN and overflows");
-  transform->ra = transform_as->ra * 256.0;
-  transform->ga = transform_as->ga * 256.0;
-  transform->ba = transform_as->ba * 256.0;
-  transform->aa = transform_as->aa * 256.0;
-  transform->rb = transform_as->rb;
-  transform->gb = transform_as->gb;
-  transform->bb = transform_as->bb;
-  transform->ab = transform_as->ab;
+
+  swfdec_color_transform_get_transform (transform_as, &self->target->color_transform);
 }
 
 SWFDEC_AS_NATIVE (1106, 107, swfdec_transform_as_get_concatenatedColorTransform)
commit 8960736e369bdfecb49657fc91a5d36decebabce
Author: Benjamin Otte <otte at gnome.org>
Date:   Sat Jul 26 23:15:48 2008 +0200

    fix transforms of 0-alpha pixels

diff --git a/swfdec/swfdec_color.c b/swfdec/swfdec_color.c
index cb4ba75..5e5aef4 100644
--- a/swfdec/swfdec_color.c
+++ b/swfdec/swfdec_color.c
@@ -66,15 +66,17 @@ swfdec_color_apply_transform_premultiplied (SwfdecColor in,
     return SWFDEC_COLOR_COMBINE (0, 0, 0, 255);
 
   aold = SWFDEC_COLOR_ALPHA (in);
-  if (aold == 0)
-    return 0;
+  if (aold == 0) {
+    aold = r = g = b = 0xFF;
+  } else {
+    r = SWFDEC_COLOR_RED (in);
+    g = SWFDEC_COLOR_GREEN (in);
+    b = SWFDEC_COLOR_BLUE (in);
+  }
 
   a = (aold * trans->aa >> 8) + trans->ab;
   a = CLAMP (a, 0, 255);
 
-  r = SWFDEC_COLOR_RED (in);
-  g = SWFDEC_COLOR_GREEN (in);
-  b = SWFDEC_COLOR_BLUE (in);
   r = (r * trans->ra * a / aold >> 8) + trans->rb * a / 255;
   r = CLAMP (r, 0, a);
   g = (g * trans->ga * a / aold >> 8) + trans->gb * a / 255;
commit 0fd2c929bd041d3503b840eafd7c2c6104d099ac
Author: Benjamin Otte <otte at gnome.org>
Date:   Sat Jul 26 22:04:55 2008 +0200

    implement matrix argument to BitmapData.draw

diff --git a/swfdec/swfdec_as_strings.c b/swfdec/swfdec_as_strings.c
index f41bf7a..1bb71a6 100644
--- a/swfdec/swfdec_as_strings.c
+++ b/swfdec/swfdec_as_strings.c
@@ -526,5 +526,7 @@ const char swfdec_as_strings[] =
   SWFDEC_AS_CONSTANT_STRING ("__resolve")
   SWFDEC_AS_CONSTANT_STRING ("Rectangle")
   SWFDEC_AS_CONSTANT_STRING ("BitmapData")
+  SWFDEC_AS_CONSTANT_STRING ("tx")
+  SWFDEC_AS_CONSTANT_STRING ("ty")
   /* add more here */
 ;
diff --git a/swfdec/swfdec_bitmap_data.c b/swfdec/swfdec_bitmap_data.c
index 389d1ee..cf9ade7 100644
--- a/swfdec/swfdec_bitmap_data.c
+++ b/swfdec/swfdec_bitmap_data.c
@@ -23,6 +23,9 @@
 #endif
 
 #include "swfdec_bitmap_data.h"
+
+#include <math.h>
+
 #include "swfdec_as_context.h"
 #include "swfdec_as_frame_internal.h"
 #include "swfdec_as_internal.h"
@@ -396,26 +399,73 @@ swfdec_bitmap_data_threshold (SwfdecAsContext *cx, SwfdecAsObject *object,
   SWFDEC_STUB ("BitmapData.threshold");
 }
 
+static gboolean
+swfdec_matrix_from_as_object (cairo_matrix_t *matrix, SwfdecAsObject *object)
+{
+  SwfdecAsValue *val;
+  SwfdecAsContext *cx = swfdec_gc_object_get_context (object);
+
+  val = swfdec_as_object_peek_variable (object, SWFDEC_AS_STR_a);
+  if (val == NULL ||
+      !isfinite (matrix->xx = swfdec_as_value_to_number (cx, val)))
+    return FALSE;
+  val = swfdec_as_object_peek_variable (object, SWFDEC_AS_STR_b);
+  if (val == NULL ||
+      !isfinite (matrix->yx = swfdec_as_value_to_number (cx, val)))
+    return FALSE;
+  val = swfdec_as_object_peek_variable (object, SWFDEC_AS_STR_c);
+  if (val == NULL ||
+      !isfinite (matrix->xy = swfdec_as_value_to_number (cx, val)))
+    return FALSE;
+  val = swfdec_as_object_peek_variable (object, SWFDEC_AS_STR_d);
+  if (val == NULL ||
+      !isfinite (matrix->yy = swfdec_as_value_to_number (cx, val)))
+    return FALSE;
+
+  val = swfdec_as_object_peek_variable (object, SWFDEC_AS_STR_tx);
+  if (val == NULL)
+      return FALSE;
+  matrix->x0 = swfdec_as_value_to_number (cx, val);
+  if (!isfinite (matrix->x0))
+    matrix->x0 = 0;
+  val = swfdec_as_object_peek_variable (object, SWFDEC_AS_STR_ty);
+  if (val == NULL)
+      return FALSE;
+  matrix->y0 = swfdec_as_value_to_number (cx, val);
+  if (!isfinite (matrix->y0))
+    matrix->y0 = 0;
+
+  return TRUE;
+}
+
 SWFDEC_AS_NATIVE (1100, 8, swfdec_bitmap_data_draw)
 void
 swfdec_bitmap_data_draw (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
 {
-  SwfdecAsObject *o;
+  SwfdecAsObject *o, *matrix;
   cairo_t *cr;
   SwfdecColorTransform ctrans;
   SwfdecBitmapData *bitmap;
+  cairo_matrix_t mat;
 
-  SWFDEC_AS_CHECK (SWFDEC_TYPE_BITMAP_DATA, &bitmap, "o", &o);
+  SWFDEC_AS_CHECK (SWFDEC_TYPE_BITMAP_DATA, &bitmap, "o|O", &o, &matrix);
 
-  if (argc > 1) {
-    SWFDEC_FIXME ("only the first argument to Bitmap.draw() is implemented");
+  if (argc >= 2) {
+    if (matrix == NULL || !swfdec_matrix_from_as_object (&mat, matrix))
+      return;
+  } else {
+    cairo_matrix_init_identity (&mat);
+  }
+  if (argc > 2) {
+    SWFDEC_FIXME ("only the first 2 arguments to Bitmap.draw() are implemented");
   }
   swfdec_color_transform_init_identity (&ctrans);
 
   cr = cairo_create (bitmap->surface);
   /* FIXME: Do we have a better renderer? */
   swfdec_renderer_attach (SWFDEC_PLAYER (cx)->priv->renderer, cr);
+  cairo_transform (cr, &mat);
 
   if (SWFDEC_IS_BITMAP_DATA (o)) {
     SwfdecBitmapData *src = SWFDEC_BITMAP_DATA (o);
commit 7d90891dc966985cc12116a7e16176a72a88b393
Author: Benjamin Otte <otte at gnome.org>
Date:   Sat Jul 26 22:04:44 2008 +0200

    add a big FIXME

diff --git a/swfdec/swfdec_transform_as.c b/swfdec/swfdec_transform_as.c
index 2efd3a8..556852e 100644
--- a/swfdec/swfdec_transform_as.c
+++ b/swfdec/swfdec_transform_as.c
@@ -115,6 +115,7 @@ swfdec_transform_as_set_colorTransform (SwfdecAsContext *cx,
   transform_as = SWFDEC_COLOR_TRANSFORM_AS (color);
   transform = &self->target->color_transform;
 
+  SWFDEC_FIXME ("This conversion needs serious testing with NaN and overflows");
   transform->ra = transform_as->ra * 256.0;
   transform->ga = transform_as->ga * 256.0;
   transform->ba = transform_as->ba * 256.0;
commit cfb63c447b54fc1ff8f1bc4dbbd3723d182275fa
Author: Benjamin Otte <otte at gnome.org>
Date:   Sat Jul 26 18:11:45 2008 +0200

    implement a bit of SwfdecBitmapData.draw()

diff --git a/swfdec/swfdec_bitmap_data.c b/swfdec/swfdec_bitmap_data.c
index 975d621..389d1ee 100644
--- a/swfdec/swfdec_bitmap_data.c
+++ b/swfdec/swfdec_bitmap_data.c
@@ -31,7 +31,9 @@
 #include "swfdec_color.h"
 #include "swfdec_debug.h"
 #include "swfdec_image.h"
+#include "swfdec_player_internal.h"
 #include "swfdec_rectangle.h"
+#include "swfdec_renderer_internal.h"
 #include "swfdec_resource.h"
 
 enum {
@@ -399,7 +401,36 @@ void
 swfdec_bitmap_data_draw (SwfdecAsContext *cx, SwfdecAsObject *object,
     guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret)
 {
-  SWFDEC_STUB ("BitmapData.draw");
+  SwfdecAsObject *o;
+  cairo_t *cr;
+  SwfdecColorTransform ctrans;
+  SwfdecBitmapData *bitmap;
+
+  SWFDEC_AS_CHECK (SWFDEC_TYPE_BITMAP_DATA, &bitmap, "o", &o);
+
+  if (argc > 1) {
+    SWFDEC_FIXME ("only the first argument to Bitmap.draw() is implemented");
+  }
+  swfdec_color_transform_init_identity (&ctrans);
+
+  cr = cairo_create (bitmap->surface);
+  /* FIXME: Do we have a better renderer? */
+  swfdec_renderer_attach (SWFDEC_PLAYER (cx)->priv->renderer, cr);
+
+  if (SWFDEC_IS_BITMAP_DATA (o)) {
+    SwfdecBitmapData *src = SWFDEC_BITMAP_DATA (o);
+    if (src->surface) {
+      cairo_set_source_surface (cr, SWFDEC_BITMAP_DATA (o)->surface, 0, 0);
+      cairo_paint (cr);
+    }
+  } else if (SWFDEC_IS_MOVIE (o)) {
+    cairo_scale (cr, 1.0 / SWFDEC_TWIPS_SCALE_FACTOR, 1.0 / SWFDEC_TWIPS_SCALE_FACTOR);
+    swfdec_movie_render (SWFDEC_MOVIE (o), cr, &ctrans);
+  } else {
+    SWFDEC_FIXME ("BitmapData.draw() with a %s?", G_OBJECT_TYPE_NAME (o));
+  }
+
+  cairo_destroy (cr);
 }
 
 SWFDEC_AS_NATIVE (1100, 9, swfdec_bitmap_data_pixelDissolve)
commit f405c3315a2678e506cfab71b5e64a30d5cd4c6b
Author: Benjamin Otte <otte at gnome.org>
Date:   Sat Jul 26 17:26:10 2008 +0200

    make swfdec_movie_render() not check visibility
    
    Of course, visibility is now checked before calling the function

diff --git a/swfdec/swfdec_movie.c b/swfdec/swfdec_movie.c
index 8d1d0d3..3941228 100644
--- a/swfdec/swfdec_movie.c
+++ b/swfdec/swfdec_movie.c
@@ -782,11 +782,6 @@ swfdec_movie_render (SwfdecMovie *movie, cairo_t *cr,
 	G_OBJECT_TYPE_NAME (movie), movie->name);
     return;
   }
-  if (!movie->visible) {
-    SWFDEC_LOG ("not rendering %s %p, movie is invisible",
-	G_OBJECT_TYPE_NAME (movie), movie->name);
-    return;
-  }
 
   if (movie->masked_by != NULL) {
     cairo_push_group (cr);
@@ -1313,7 +1308,8 @@ swfdec_movie_do_render (SwfdecMovie *movie, cairo_t *cr,
     }
 
     SWFDEC_LOG ("rendering %p with depth %d", child, child->depth);
-    swfdec_movie_render (child, cr, ctrans);
+    if (child->visible)
+      swfdec_movie_render (child, cr, ctrans);
   }
   while (clip) {
     cairo_pattern_t *mask;
diff --git a/swfdec/swfdec_player.c b/swfdec/swfdec_player.c
index 76c6c8d..de94f60 100644
--- a/swfdec/swfdec_player.c
+++ b/swfdec/swfdec_player.c
@@ -3089,7 +3089,9 @@ swfdec_player_render_with_renderer (SwfdecPlayer *player, cairo_t *cr,
   cairo_transform (cr, &priv->global_to_stage);
 
   for (walk = priv->roots; walk; walk = walk->next) {
-    swfdec_movie_render (walk->data, cr, &trans);
+    SwfdecMovie *movie = walk->data;
+    if (movie->visible)
+      swfdec_movie_render (movie, cr, &trans);
   }
   cairo_restore (cr);
   /* NB: we render the focusrect after restoring, so the focusrect doesn't scale */


More information about the Swfdec-commits mailing list