[Swfdec-commits] 3 commits - swfdec-gtk/swfdec_gtk_loader.c swfdec/swfdec_movie.c swfdec/swfdec_movie.h tools/swfdec-extract.c
Benjamin Otte
company at kemper.freedesktop.org
Mon Jun 9 14:28:05 PDT 2008
swfdec-gtk/swfdec_gtk_loader.c | 5 +++
swfdec/swfdec_movie.c | 54 +++++++++++++++++++++++------------------
swfdec/swfdec_movie.h | 3 --
tools/swfdec-extract.c | 7 ++++-
4 files changed, 42 insertions(+), 27 deletions(-)
New commits:
commit 04b75f40746b3724e320e66d90fd465aea8d5d1c
Author: Benjamin Otte <otte at gnome.org>
Date: Mon Jun 9 23:23:44 2008 +0200
fix masking
Since some time now the code computed mask matrices incorrectly which caused
stuff to be only partially masked or not at all.
diff --git a/swfdec/swfdec_movie.c b/swfdec/swfdec_movie.c
index 8cfa5a8..95e4a81 100644
--- a/swfdec/swfdec_movie.c
+++ b/swfdec/swfdec_movie.c
@@ -733,12 +733,13 @@ swfdec_movie_get_operator_for_blend_mode (guint blend_mode)
* @movie: The movie to act as the mask
* @cr: a cairo context which should be used for masking. The cairo context's
* matrix is assumed to be in the coordinate system of the movie's parent.
+ * @matrix: matrix to apply before rendering
* @inval: The region that is relevant for masking
*
* Creates a pattern suitable for masking. To do rendering using the returned
* mask, you want to use code like this:
* <informalexample><programlisting>
- * mask = swfdec_movie_mask (cr, movie, inval);
+ * mask = swfdec_movie_mask (cr, movie, matrix, inval);
* cairo_push_group (cr);
* // do rendering here
* cairo_pop_group_to_source (cr);
@@ -748,14 +749,27 @@ swfdec_movie_get_operator_for_blend_mode (guint blend_mode)
*
* Returns: A new cairo_patten_t to be used as the mask.
**/
-cairo_pattern_t *
-swfdec_movie_mask (cairo_t *cr, SwfdecMovie *movie, const SwfdecRect *inval)
+static cairo_pattern_t *
+swfdec_movie_mask (cairo_t *cr, SwfdecMovie *movie,
+ const cairo_matrix_t *matrix, const SwfdecRect *inval)
{
SwfdecColorTransform black;
+ cairo_matrix_t inv;
+ SwfdecRect rect;
swfdec_color_transform_init_mask (&black);
cairo_push_group_with_content (cr, CAIRO_CONTENT_ALPHA);
- swfdec_movie_render (movie, cr, &black, inval);
+ cairo_transform (cr, matrix);
+ inv = *matrix;
+ if (cairo_matrix_invert (&inv) == CAIRO_STATUS_SUCCESS && FALSE) {
+ swfdec_rect_transform (&rect, inval, &inv);
+ } else {
+ SWFDEC_INFO ("non-invertible matrix when computing invalid area");
+ rect.x0 = rect.y0 = -G_MAXDOUBLE;
+ rect.x1 = rect.y1 = G_MAXDOUBLE;
+ }
+
+ swfdec_movie_render (movie, cr, &black, &rect);
return cairo_pop_group (cr);
}
@@ -847,24 +861,17 @@ swfdec_movie_render (SwfdecMovie *movie, cairo_t *cr,
}
if (movie->masked_by) {
cairo_pattern_t *mask;
- if (movie->parent == movie->masked_by->parent) {
- cairo_transform (cr, &movie->inverse_matrix);
- rect = *inval;
- } else {
- cairo_matrix_t mat, mat2;
- swfdec_movie_local_to_global_matrix (movie, &mat);
- swfdec_movie_global_to_local_matrix (movie->masked_by, &mat2);
- cairo_matrix_multiply (&mat, &mat2, &mat);
- cairo_transform (cr, &mat);
- if (cairo_matrix_invert (&mat) == CAIRO_STATUS_SUCCESS && FALSE) {
- swfdec_rect_transform (&rect, &rect, &mat);
- } else {
- SWFDEC_INFO ("non-invertible matrix when computing invalid area");
- rect.x0 = rect.y0 = -G_MAXDOUBLE;
- rect.x1 = rect.y1 = G_MAXDOUBLE;
- }
+ cairo_matrix_t mat;
+ if (movie->parent)
+ swfdec_movie_global_to_local_matrix (movie->parent, &mat);
+ else
+ cairo_matrix_init_identity (&mat);
+ if (movie->masked_by->parent) {
+ cairo_matrix_t mat2;
+ swfdec_movie_local_to_global_matrix (movie->masked_by->parent, &mat2);
+ cairo_matrix_multiply (&mat, &mat, &mat2);
}
- mask = swfdec_movie_mask (cr, movie->masked_by, &rect);
+ mask = swfdec_movie_mask (cr, movie->masked_by, &mat, inval);
cairo_pop_group_to_source (cr);
cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
cairo_mask (cr, mask);
@@ -1191,6 +1198,7 @@ static void
swfdec_movie_do_render (SwfdecMovie *movie, cairo_t *cr,
const SwfdecColorTransform *ctrans, const SwfdecRect *inval)
{
+ static const cairo_matrix_t ident = { 1, 0, 0, 1, 0, 0};
GList *g;
GSList *walk;
GSList *clips = NULL;
@@ -1238,7 +1246,7 @@ swfdec_movie_do_render (SwfdecMovie *movie, cairo_t *cr,
while (clip && clip->depth < child->depth) {
cairo_pattern_t *mask;
SWFDEC_INFO ("unsetting clip depth %d for depth %d", clip->depth, child->depth);
- mask = swfdec_movie_mask (cr, clip->movie, inval);
+ mask = swfdec_movie_mask (cr, clip->movie, &ident, inval);
cairo_pop_group_to_source (cr);
cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
cairo_mask (cr, mask);
@@ -1265,7 +1273,7 @@ swfdec_movie_do_render (SwfdecMovie *movie, cairo_t *cr,
while (clip) {
cairo_pattern_t *mask;
SWFDEC_INFO ("unsetting clip depth %d", clip->depth);
- mask = swfdec_movie_mask (cr, clip->movie, inval);
+ mask = swfdec_movie_mask (cr, clip->movie, &ident, inval);
cairo_pop_group_to_source (cr);
cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
cairo_mask (cr, mask);
diff --git a/swfdec/swfdec_movie.h b/swfdec/swfdec_movie.h
index 455c747..718eed9 100644
--- a/swfdec/swfdec_movie.h
+++ b/swfdec/swfdec_movie.h
@@ -285,9 +285,6 @@ void swfdec_movie_render (SwfdecMovie * movie,
cairo_t * cr,
const SwfdecColorTransform *trans,
const SwfdecRect * inval);
-cairo_pattern_t *swfdec_movie_mask (cairo_t * cr,
- SwfdecMovie * movie,
- const SwfdecRect * inval);
SwfdecMovie * swfdec_movie_resolve (SwfdecMovie * movie);
guint swfdec_movie_get_version (SwfdecMovie * movie);
commit da5b285f014488a41a0333ed491a96d53135b868
Author: Benjamin Otte <otte at gnome.org>
Date: Mon Jun 9 13:36:17 2008 +0200
set a url before emitting an error
diff --git a/swfdec-gtk/swfdec_gtk_loader.c b/swfdec-gtk/swfdec_gtk_loader.c
index 51bb8aa..b3b0f1f 100644
--- a/swfdec-gtk/swfdec_gtk_loader.c
+++ b/swfdec-gtk/swfdec_gtk_loader.c
@@ -107,6 +107,11 @@ swfdec_gtk_loader_finished (SoupMessage *msg, gpointer loader)
swfdec_gtk_loader_ensure_open (loader);
swfdec_stream_eof (loader);
} else {
+ if (!SWFDEC_GTK_LOADER (loader)->opened) {
+ char *real_uri = soup_uri_to_string (soup_message_get_uri (msg), FALSE);
+ swfdec_loader_set_url (loader, real_uri);
+ g_free (real_uri);
+ }
swfdec_stream_error (loader, "%u %s", msg->status_code, msg->reason_phrase);
}
}
commit 85b60cc231ce99589c8f25d9f159a8abfee4f20f
Author: Benjamin Otte <otte at gnome.org>
Date: Mon Jun 9 13:35:54 2008 +0200
make this render png images again
rendering images requires a SwfdecRenderer
diff --git a/tools/swfdec-extract.c b/tools/swfdec-extract.c
index f8ec144..01c7965 100644
--- a/tools/swfdec-extract.c
+++ b/tools/swfdec-extract.c
@@ -1,5 +1,5 @@
/* Swfdec
- * Copyright (C) 2006 Benjamin Otte <otte at gnome.org>
+ * Copyright (C) 2006-2008 Benjamin Otte <otte at gnome.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -41,6 +41,7 @@
#include <swfdec/swfdec_sprite.h>
#include <swfdec/swfdec_sprite_movie.h>
#include <swfdec/swfdec_swf_decoder.h>
+#include <swfdec/swfdec_renderer_internal.h>
#include <swfdec/swfdec_resource.h>
static SwfdecBuffer *
@@ -181,6 +182,7 @@ surface_destroy_for_type (cairo_surface_t *surface, const char *filename)
static gboolean
export_graphic (SwfdecGraphic *graphic, const char *filename)
{
+ SwfdecRenderer *renderer;
cairo_surface_t *surface;
cairo_t *cr;
guint width, height;
@@ -203,9 +205,12 @@ export_graphic (SwfdecGraphic *graphic, const char *filename)
cairo_translate (cr, - floor (graphic->extents.x0 / SWFDEC_TWIPS_SCALE_FACTOR),
- floor (graphic->extents.y0 / SWFDEC_TWIPS_SCALE_FACTOR));
cairo_scale (cr, 1.0 / SWFDEC_TWIPS_SCALE_FACTOR, 1.0 / SWFDEC_TWIPS_SCALE_FACTOR);
+ renderer = swfdec_renderer_new (surface);
+ swfdec_renderer_attach (renderer, cr);
swfdec_graphic_render (graphic, cr, &trans, &graphic->extents);
cairo_show_page (cr);
cairo_destroy (cr);
+ g_object_unref (renderer);
return surface_destroy_for_type (surface, filename);
}
More information about the Swfdec-commits
mailing list