[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