[Swfdec-commits] 3 commits - swfdec/swfdec_bitmap_data.c swfdec/swfdec_blur_filter.c swfdec/swfdec_blur_filter.h swfdec/swfdec_color_matrix_filter.c swfdec/swfdec_filter.c swfdec/swfdec_filter.h swfdec/swfdec_movie.c

Benjamin Otte company at kemper.freedesktop.org
Wed Sep 17 01:30:20 PDT 2008


 swfdec/swfdec_bitmap_data.c         |    3 ++
 swfdec/swfdec_blur_filter.c         |   42 +++++++++++++++++++++---------------
 swfdec/swfdec_blur_filter.h         |    3 ++
 swfdec/swfdec_color_matrix_filter.c |    4 +--
 swfdec/swfdec_filter.c              |    8 +++---
 swfdec/swfdec_filter.h              |    8 ++++++
 swfdec/swfdec_movie.c               |   22 ++++++++++++------
 7 files changed, 59 insertions(+), 31 deletions(-)

New commits:
commit 05446ede3455a933089a97247c3a12bf234e8aae
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Sep 17 10:23:04 2008 +0200

    BitmapData.draw did not call invalidate()
    
    fixes Slide.com test 28

diff --git a/swfdec/swfdec_bitmap_data.c b/swfdec/swfdec_bitmap_data.c
index dac1dd1..34dd64f 100644
--- a/swfdec/swfdec_bitmap_data.c
+++ b/swfdec/swfdec_bitmap_data.c
@@ -546,6 +546,9 @@ swfdec_bitmap_data_draw (SwfdecAsContext *cx, SwfdecAsObject *object,
   }
 
   cairo_destroy (cr);
+  swfdec_bitmap_data_invalidate (bitmap, 0, 0, 
+      cairo_image_surface_get_width (bitmap->surface),
+      cairo_image_surface_get_height (bitmap->surface));
 }
 
 SWFDEC_AS_NATIVE (1100, 9, swfdec_bitmap_data_pixelDissolve)
commit dee24cd366088e060604cb50887fa5ee41257038
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Sep 17 09:36:08 2008 +0200

    revert a21547aeb5666886f3d0a0201e2a6d5b406d606e
    
    And add a comment of why the extra save/restore is necessary

diff --git a/swfdec/swfdec_movie.c b/swfdec/swfdec_movie.c
index e355a19..0767107 100644
--- a/swfdec/swfdec_movie.c
+++ b/swfdec/swfdec_movie.c
@@ -841,10 +841,11 @@ swfdec_movie_render (SwfdecMovie *movie, cairo_t *cr,
   needs_mask = movie->masked_by != NULL && movie->filters == NULL;
   if (needs_mask) {
     cairo_push_group (cr);
-  } else {
-    cairo_save (cr);
   }
 
+  /* do extra save/restore so the render vfunc can mess with cr */
+  cairo_save (cr);
+
   SWFDEC_LOG ("transforming movie, transform: %g %g  %g %g   %g %g",
       movie->matrix.xx, movie->matrix.yy,
       movie->matrix.xy, movie->matrix.yx,
@@ -872,6 +873,8 @@ swfdec_movie_render (SwfdecMovie *movie, cairo_t *cr,
   if (cairo_status (cr) != CAIRO_STATUS_SUCCESS) {
     g_warning ("error rendering with cairo: %s", cairo_status_to_string (cairo_status (cr)));
   }
+  cairo_restore (cr);
+
   if (needs_mask) {
     cairo_pattern_t *mask;
     cairo_matrix_t mat;
@@ -889,8 +892,6 @@ swfdec_movie_render (SwfdecMovie *movie, cairo_t *cr,
     cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
     cairo_mask (cr, mask);
     cairo_pattern_destroy (mask);
-  } else {
-    cairo_restore (cr);
   }
   if (group == SWFDEC_GROUP_FILTERS) {
     cairo_pattern_t *pattern;
commit 6a63d8e464e7fcb0b127619bb4c5dacccc692e85
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue Sep 16 15:05:14 2008 +0200

    make filters scale with the stage

diff --git a/swfdec/swfdec_blur_filter.c b/swfdec/swfdec_blur_filter.c
index ba4c096..662a09d 100644
--- a/swfdec/swfdec_blur_filter.c
+++ b/swfdec/swfdec_blur_filter.c
@@ -41,32 +41,36 @@ swfdec_blur_filter_clone (SwfdecFilter *dfilter, SwfdecFilter *sfilter)
 }
 
 static void
-swfdec_blur_filter_create_convolution_matrix (SwfdecBlurFilter *blur)
+swfdec_blur_filter_create_convolution_matrix (SwfdecBlurFilter *blur,
+    double xscale, double yscale)
 {
   guint x, y, w, h;
   double div, blurx, blury;
 
-  if (blur->matrix)
+  if (blur->matrix && xscale == blur->xscale && yscale == blur->yscale)
     return;
 
-  blurx = MAX (blur->x, 1);
-  blury = MAX (blur->y, 1);
+  blurx = MAX (blur->x * xscale, 1);
+  blury = MAX (blur->y * yscale, 1);
   w = ceil ((blurx - 1) / 2);
   w = w * 2 + 1;
   h = ceil ((blury - 1) / 2);
   h = h * 2 + 1;
 
   blur->matrix = swfdec_convolution_matrix_new (w, h);
+  blur->xscale = xscale;
+  blur->yscale = yscale;
+
   div = 1.0 / (blurx * blury);
   for (y = 0; y < h; y++) {
     double val = div;
     if (y == 0 || y == w - 1) {
-      val *= (1 - (h - MAX (blur->y, 1)) / 2);
+      val *= (1 - (h - MAX (blury, 1)) / 2);
     }
     for (x = 0; x < w; x++) {
       if (x == 0 || x == w - 1) {
 	swfdec_convolution_matrix_set (blur->matrix, x, y,
-	    val * (1 - (w - MAX (blur->x, 1)) / 2));
+	    val * (1 - (w - MAX (blurx, 1)) / 2));
       } else {
 	swfdec_convolution_matrix_set (blur->matrix, x, y, val);
       }
@@ -76,24 +80,28 @@ swfdec_blur_filter_create_convolution_matrix (SwfdecBlurFilter *blur)
 
 static void
 swfdec_blur_filter_get_rectangle (SwfdecFilter *filter, SwfdecRectangle *dest,
-    const SwfdecRectangle *source)
+    double xscale, double yscale, const SwfdecRectangle *source)
 {
   SwfdecBlurFilter *blur = SWFDEC_BLUR_FILTER (filter);
-  guint x, y;
+  double blurx, blury;
+  guint w, h;
 
-  swfdec_blur_filter_create_convolution_matrix (blur);
-  x = swfdec_convolution_matrix_get_width (blur->matrix) / 2 * blur->quality;
-  y = swfdec_convolution_matrix_get_height (blur->matrix) / 2 * blur->quality;
+  blurx = MAX (blur->x * xscale, 1);
+  blury = MAX (blur->y * yscale, 1);
+  w = ceil ((blurx - 1) / 2);
+  w *= blur->quality;
+  h = ceil ((blury - 1) / 2);
+  h *= blur->quality;
 
-  dest->x = source->x - x;
-  dest->y = source->y - y;
-  dest->width = source->width + 2 * x;
-  dest->height = source->height + 2 * y;
+  dest->x = source->x - w;
+  dest->y = source->y - h;
+  dest->width = source->width + 2 * w;
+  dest->height = source->height + 2 * h;
 }
 
 static cairo_pattern_t *
 swfdec_blur_filter_apply (SwfdecFilter *filter, cairo_pattern_t *pattern,
-    const SwfdecRectangle *rect)
+    double xscale, double yscale, const SwfdecRectangle *rect)
 {
   SwfdecBlurFilter *blur = SWFDEC_BLUR_FILTER (filter);
   cairo_surface_t *a, *b;
@@ -105,7 +113,7 @@ swfdec_blur_filter_apply (SwfdecFilter *filter, cairo_pattern_t *pattern,
   if (blur->x <= 1.0 && blur->y <= 1.0)
     return cairo_pattern_reference (pattern);
 
-  swfdec_blur_filter_create_convolution_matrix (blur);
+  swfdec_blur_filter_create_convolution_matrix (blur, xscale, yscale);
   x = swfdec_convolution_matrix_get_width (blur->matrix) / 2;
   y = swfdec_convolution_matrix_get_height (blur->matrix) / 2;
 
diff --git a/swfdec/swfdec_blur_filter.h b/swfdec/swfdec_blur_filter.h
index 776d59f..249b397 100644
--- a/swfdec/swfdec_blur_filter.h
+++ b/swfdec/swfdec_blur_filter.h
@@ -42,7 +42,10 @@ struct _SwfdecBlurFilter {
   double		x;		/* blur in horizontal direction */
   double		y;		/* blur in vertical direction */
   guint			quality;	/* number of passes */
+
   SwfdecConvolutionMatrix *matrix;	/* matrix if computed or NULL */
+  double		xscale;		/* xscale matrix was computed for */
+  double		yscale;		/* yscale matrix was computed for */
 };
 
 struct _SwfdecBlurFilterClass {
diff --git a/swfdec/swfdec_color_matrix_filter.c b/swfdec/swfdec_color_matrix_filter.c
index 8da4ac7..092a887 100644
--- a/swfdec/swfdec_color_matrix_filter.c
+++ b/swfdec/swfdec_color_matrix_filter.c
@@ -40,7 +40,7 @@ swfdec_color_matrix_filter_clone (SwfdecFilter *dfilter, SwfdecFilter *sfilter)
 
 static void
 swfdec_color_matrix_filter_get_rectangle (SwfdecFilter *filter, SwfdecRectangle *dest,
-    const SwfdecRectangle *source)
+    double xscale, double yscale, const SwfdecRectangle *source)
 {
   if (dest != source)
     *dest = *source;
@@ -48,7 +48,7 @@ swfdec_color_matrix_filter_get_rectangle (SwfdecFilter *filter, SwfdecRectangle
 
 static cairo_pattern_t *
 swfdec_color_matrix_filter_apply (SwfdecFilter *filter, cairo_pattern_t *pattern,
-    const SwfdecRectangle *rect)
+    double xscale, double yscale, const SwfdecRectangle *rect)
 {
   SwfdecColorMatrixFilter *cm = SWFDEC_COLOR_MATRIX_FILTER (filter);
   cairo_surface_t *surface;
diff --git a/swfdec/swfdec_filter.c b/swfdec/swfdec_filter.c
index 87bafb9..de4544d 100644
--- a/swfdec/swfdec_filter.c
+++ b/swfdec/swfdec_filter.c
@@ -57,7 +57,7 @@ swfdec_filter_clone (SwfdecFilter *filter)
 
 cairo_pattern_t *
 swfdec_filter_apply (SwfdecFilter *filter, cairo_pattern_t *pattern,
-    const SwfdecRectangle *rect)
+    double xscale, double yscale, const SwfdecRectangle *rect)
 {
   SwfdecFilterClass *klass;
   cairo_pattern_t *ret;
@@ -69,7 +69,7 @@ swfdec_filter_apply (SwfdecFilter *filter, cairo_pattern_t *pattern,
   klass = SWFDEC_FILTER_GET_CLASS (filter);
   g_assert (klass->apply);
   
-  ret = klass->apply (filter, pattern, rect);
+  ret = klass->apply (filter, pattern, xscale, yscale, rect);
   cairo_pattern_destroy (pattern);
   return ret;
 }
@@ -223,7 +223,7 @@ swfdec_filter_skip (SwfdecBits *bits)
 
 void
 swfdec_filter_get_rectangle (SwfdecFilter *filter, SwfdecRectangle *dest,
-    const SwfdecRectangle *source)
+    double xscale, double yscale, const SwfdecRectangle *source)
 {
   SwfdecFilterClass *klass;
 
@@ -232,5 +232,5 @@ swfdec_filter_get_rectangle (SwfdecFilter *filter, SwfdecRectangle *dest,
   g_return_if_fail (source != NULL);
 
   klass = SWFDEC_FILTER_GET_CLASS (filter);
-  klass->get_rectangle (filter, dest, source);
+  klass->get_rectangle (filter, dest, xscale, yscale, source);
 }
diff --git a/swfdec/swfdec_filter.h b/swfdec/swfdec_filter.h
index 1dea930..65d6ae7 100644
--- a/swfdec/swfdec_filter.h
+++ b/swfdec/swfdec_filter.h
@@ -47,9 +47,13 @@ struct _SwfdecFilterClass {
 						 SwfdecFilter *		source);
   void			(* get_rectangle)	(SwfdecFilter *		filter,
 						 SwfdecRectangle *	dest,
+						 double			xscale,
+						 double			yscale,
 						 const SwfdecRectangle *source);
   cairo_pattern_t *	(* apply)		(SwfdecFilter *		filter,
 						 cairo_pattern_t *	pattern,
+						 double			xscale,
+						 double			yscale,
 						 const SwfdecRectangle *rect);
 };
 
@@ -58,9 +62,13 @@ GType			swfdec_filter_get_type	(void);
 SwfdecFilter *		swfdec_filter_clone		(SwfdecFilter *		filter);
 cairo_pattern_t *	swfdec_filter_apply		(SwfdecFilter *		filter,
 							 cairo_pattern_t *	pattern,
+							 double			xscale,
+							 double			yscale,
 							 const SwfdecRectangle *source);
 void			swfdec_filter_get_rectangle	(SwfdecFilter *		filter,
 							 SwfdecRectangle *	dest,
+							 double			xscale,
+							 double			yscale,
 							 const SwfdecRectangle *source);
 
 GSList *		swfdec_filter_parse		(SwfdecPlayer *		player,
diff --git a/swfdec/swfdec_movie.c b/swfdec/swfdec_movie.c
index b63845c..e355a19 100644
--- a/swfdec/swfdec_movie.c
+++ b/swfdec/swfdec_movie.c
@@ -746,24 +746,29 @@ swfdec_movie_get_operator_for_blend_mode (guint blend_mode)
 static cairo_pattern_t *
 swfdec_movie_apply_filters (SwfdecMovie *movie, cairo_pattern_t *pattern)
 {
-  SwfdecRect rect;
   SwfdecRectangle area;
+  SwfdecPlayer *player;
+  SwfdecRect rect;
   GSList *walk;
+  double xscale, yscale;
 
   if (movie->filters == NULL)
     return pattern;
 
+  player = SWFDEC_PLAYER (swfdec_gc_object_get_context (movie));
   rect = movie->original_extents;
   swfdec_movie_rect_local_to_global (movie, &rect);
   swfdec_rect_transform (&rect, &rect,
-      &SWFDEC_PLAYER (swfdec_gc_object_get_context (movie))->priv->global_to_stage);
+      &player->priv->global_to_stage);
   swfdec_rectangle_init_rect (&area, &rect);
   /* FIXME: hack to make textfield borders work - looks like Adobe does this, too */
   area.width++;
   area.height++;
+  xscale = player->priv->global_to_stage.xx * SWFDEC_TWIPS_SCALE_FACTOR;
+  yscale = player->priv->global_to_stage.yy * SWFDEC_TWIPS_SCALE_FACTOR;
   for (walk = movie->filters; walk; walk = walk->next) {
-    pattern = swfdec_filter_apply (walk->data, pattern, &area);
-    swfdec_filter_get_rectangle (walk->data, &area, &area);
+    pattern = swfdec_filter_apply (walk->data, pattern, xscale, yscale, &area);
+    swfdec_filter_get_rectangle (walk->data, &area, xscale, yscale, &area);
   }
   return pattern;
 }


More information about the Swfdec-commits mailing list