[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