[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