[Swfdec-commits] 3 commits - swfdec/swfdec_movie_asprops.c swfdec/swfdec_movie.c swfdec/swfdec_movie.h swfdec/swfdec_player.c swfdec/swfdec_resource.c swfdec/swfdec_sprite_movie_as.c

Benjamin Otte company at kemper.freedesktop.org
Wed May 7 07:39:25 PDT 2008


 swfdec/swfdec_movie.c           |   31 +++++++++++++++----------------
 swfdec/swfdec_movie.h           |    3 ++-
 swfdec/swfdec_movie_asprops.c   |   25 ++++++++++++++++---------
 swfdec/swfdec_player.c          |    3 ++-
 swfdec/swfdec_resource.c        |    3 ++-
 swfdec/swfdec_sprite_movie_as.c |    8 +++++++-
 6 files changed, 44 insertions(+), 29 deletions(-)

New commits:
commit 6438586c8e06a6fbe626cc1bf9a2fa5812699b38
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed May 7 16:37:36 2008 +0200

    updates matrices immediately
    
    no more SWFDEC_MOVIE_INVALID_MATRIX, but instead people have to use
    swfdec_movie_begin_update_matrix()/swfdec_movie_end_update_matrix() when
    changing matrix parameters.

diff --git a/swfdec/swfdec_movie.c b/swfdec/swfdec_movie.c
index 7677aeb..8ff6213 100644
--- a/swfdec/swfdec_movie.c
+++ b/swfdec/swfdec_movie.c
@@ -217,11 +217,19 @@ swfdec_movie_update_extents (SwfdecMovie *movie)
   }
 }
 
-static void
-swfdec_movie_update_matrix (SwfdecMovie *movie)
+void
+swfdec_movie_begin_update_matrix (SwfdecMovie *movie)
+{
+  swfdec_movie_invalidate_next (movie);
+}
+
+void
+swfdec_movie_end_update_matrix (SwfdecMovie *movie)
 {
   double d, e;
 
+  swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_EXTENTS);
+
   /* we operate on x0 and y0 when setting movie._x and movie._y */
   if (movie->modified) {
     movie->matrix.xx = movie->original_transform.xx;
@@ -255,9 +263,6 @@ swfdec_movie_do_update (SwfdecMovie *movie)
   }
 
   switch (movie->cache_state) {
-    case SWFDEC_MOVIE_INVALID_MATRIX:
-      swfdec_movie_update_matrix (movie);
-      /* fall through */
     case SWFDEC_MOVIE_INVALID_EXTENTS:
       swfdec_movie_update_extents (movie);
       /* fall through */
@@ -475,8 +480,6 @@ swfdec_movie_local_to_global (SwfdecMovie *movie, double *x, double *y)
   g_return_if_fail (y != NULL);
 
   do {
-    if (movie->cache_state >= SWFDEC_MOVIE_INVALID_MATRIX)
-      swfdec_movie_update (movie);
     cairo_matrix_transform_point (&movie->matrix, x, y);
   } while ((movie = movie->parent));
 }
@@ -509,8 +512,6 @@ swfdec_movie_global_to_local_matrix (SwfdecMovie *movie, cairo_matrix_t *matrix)
 
   cairo_matrix_init_identity (matrix);
   while (movie) {
-    if (movie->cache_state >= SWFDEC_MOVIE_INVALID_MATRIX)
-      swfdec_movie_update (movie);
     cairo_matrix_multiply (matrix, &movie->inverse_matrix, matrix);
     movie = movie->parent;
   }
@@ -524,8 +525,6 @@ swfdec_movie_local_to_global_matrix (SwfdecMovie *movie, cairo_matrix_t *matrix)
 
   cairo_matrix_init_identity (matrix);
   while (movie) {
-    if (movie->cache_state >= SWFDEC_MOVIE_INVALID_MATRIX)
-      swfdec_movie_update (movie);
     cairo_matrix_multiply (matrix, matrix, &movie->matrix);
     movie = movie->parent;
   }
@@ -541,8 +540,6 @@ swfdec_movie_global_to_local (SwfdecMovie *movie, double *x, double *y)
   if (movie->parent) {
     swfdec_movie_global_to_local (movie->parent, x, y);
   }
-  if (movie->cache_state >= SWFDEC_MOVIE_INVALID_MATRIX)
-    swfdec_movie_update (movie);
   cairo_matrix_transform_point (&movie->inverse_matrix, x, y);
 }
 
@@ -1452,13 +1449,14 @@ swfdec_movie_set_static_properties (SwfdecMovie *movie, const cairo_matrix_t *tr
     return;
   }
   if (transform) {
-    swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_MATRIX);
+    swfdec_movie_begin_update_matrix (movie);
     movie->original_transform = *transform;
     movie->matrix.x0 = movie->original_transform.x0;
     movie->matrix.y0 = movie->original_transform.y0;
     movie->xscale = swfdec_matrix_get_xscale (&movie->original_transform);
     movie->yscale = swfdec_matrix_get_yscale (&movie->original_transform);
     movie->rotation = swfdec_matrix_get_rotation (&movie->original_transform);
+    swfdec_movie_end_update_matrix (movie);
   }
   if (ctrans) {
     swfdec_movie_invalidate_last (movie);
diff --git a/swfdec/swfdec_movie.h b/swfdec/swfdec_movie.h
index e23557d..0ef2a01 100644
--- a/swfdec/swfdec_movie.h
+++ b/swfdec/swfdec_movie.h
@@ -80,7 +80,6 @@ typedef enum {
   SWFDEC_MOVIE_UP_TO_DATE = 0,		/* everything OK */
   SWFDEC_MOVIE_INVALID_CHILDREN,	/* call update on children */
   SWFDEC_MOVIE_INVALID_EXTENTS,		/* recalculate extents */
-  SWFDEC_MOVIE_INVALID_MATRIX		/* matrix is invalid, recalculate */
 } SwfdecMovieCacheState;
 
 typedef void (*SwfdecMovieVariableListenerFunction) (SwfdecAsObject *object,
@@ -213,6 +212,8 @@ void		swfdec_movie_invalidate		(SwfdecMovie *		movie,
 void		swfdec_movie_queue_update	(SwfdecMovie *		movie,
 						 SwfdecMovieCacheState	state);
 void		swfdec_movie_update		(SwfdecMovie *		movie);
+void		swfdec_movie_begin_update_matrix(SwfdecMovie *		movie);
+void		swfdec_movie_end_update_matrix	(SwfdecMovie *		movie);
 void		swfdec_movie_local_to_global	(SwfdecMovie *		movie,
 						 double *		x,
 						 double *		y);
diff --git a/swfdec/swfdec_movie_asprops.c b/swfdec/swfdec_movie_asprops.c
index eb701c7..0724557 100644
--- a/swfdec/swfdec_movie_asprops.c
+++ b/swfdec/swfdec_movie_asprops.c
@@ -58,8 +58,9 @@ mc_x_set (SwfdecMovie *movie, const SwfdecAsValue *val)
   movie->modified = TRUE;
   d = SWFDEC_DOUBLE_TO_TWIPS (d);
   if (d != movie->matrix.x0) {
-    swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_MATRIX);
+    swfdec_movie_begin_update_matrix (movie);
     movie->matrix.x0 = d;
+    swfdec_movie_end_update_matrix (movie);
   }
 }
 
@@ -86,8 +87,9 @@ mc_y_set (SwfdecMovie *movie, const SwfdecAsValue *val)
   movie->modified = TRUE;
   d = SWFDEC_DOUBLE_TO_TWIPS (d);
   if (d != movie->matrix.y0) {
-    swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_MATRIX);
+    swfdec_movie_begin_update_matrix (movie);
     movie->matrix.y0 = d;
+    swfdec_movie_end_update_matrix (movie);
   }
 }
 
@@ -109,8 +111,9 @@ mc_xscale_set (SwfdecMovie *movie, const SwfdecAsValue *val)
   }
   movie->modified = TRUE;
   if (movie->xscale != d) {
-    swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_MATRIX);
+    swfdec_movie_begin_update_matrix (movie);
     movie->xscale = d;
+    swfdec_movie_end_update_matrix (movie);
   }
 }
 
@@ -132,8 +135,9 @@ mc_yscale_set (SwfdecMovie *movie, const SwfdecAsValue *val)
   }
   movie->modified = TRUE;
   if (movie->yscale != d) {
-    swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_MATRIX);
+    swfdec_movie_begin_update_matrix (movie);
     movie->yscale = d;
+    swfdec_movie_end_update_matrix (movie);
   }
 }
 
@@ -249,13 +253,14 @@ mc_width_set (SwfdecMovie *movie, const SwfdecAsValue *val)
     d = 100 * d / cur;
     if (d == movie->xscale)
       return;
-    swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_MATRIX);
+    swfdec_movie_begin_update_matrix (movie);
     movie->xscale = d;
   } else {
-    swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_MATRIX);
+    swfdec_movie_begin_update_matrix (movie);
     movie->xscale = 0;
     movie->yscale = 0;
   }
+  swfdec_movie_end_update_matrix (movie);
 }
 
 static void
@@ -290,13 +295,14 @@ mc_height_set (SwfdecMovie *movie, const SwfdecAsValue *val)
     d = 100 * d / cur;
     if (d == movie->yscale)
       return;
-    swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_MATRIX);
+    swfdec_movie_begin_update_matrix (movie);
     movie->yscale = d;
   } else {
-    swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_MATRIX);
+    swfdec_movie_begin_update_matrix (movie);
     movie->xscale = 0;
     movie->yscale = 0;
   }
+  swfdec_movie_end_update_matrix (movie);
 }
 
 static void
@@ -328,8 +334,9 @@ mc_rotation_set (SwfdecMovie *movie, const SwfdecAsValue *val)
   }
   movie->modified = TRUE;
   if (movie->rotation != d) {
-    swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_MATRIX);
+    swfdec_movie_begin_update_matrix (movie);
     movie->rotation = d;
+    swfdec_movie_end_update_matrix (movie);
   }
 }
 
diff --git a/swfdec/swfdec_player.c b/swfdec/swfdec_player.c
index 89c75b1..78f3ed0 100644
--- a/swfdec/swfdec_player.c
+++ b/swfdec/swfdec_player.c
@@ -1879,9 +1879,10 @@ swfdec_player_update_drag_movie (SwfdecPlayer *player)
   y = CLAMP (y, priv->mouse_drag_rect.y0, priv->mouse_drag_rect.y1);
   SWFDEC_LOG ("mouse is at %g %g, originally (%g %g)", x, y, priv->mouse_x, priv->mouse_y);
   if (x != movie->matrix.x0 || y != movie->matrix.y0) {
-    swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_MATRIX);
+    swfdec_movie_begin_update_matrix (movie);
     movie->matrix.x0 = x;
     movie->matrix.y0 = y;
+    swfdec_movie_end_update_matrix (movie);
   }
 }
 
diff --git a/swfdec/swfdec_resource.c b/swfdec/swfdec_resource.c
index d9e1259..deb7d91 100644
--- a/swfdec/swfdec_resource.c
+++ b/swfdec/swfdec_resource.c
@@ -180,6 +180,7 @@ swfdec_resource_replace_movie (SwfdecSpriteMovie *movie, SwfdecResource *resourc
       mov->depth, mov->parent, resource, NULL, mov->name);
   if (copy == NULL)
     return FALSE;
+  swfdec_movie_begin_update_matrix (copy);
   copy->matrix = mov->matrix;
   copy->original_name = mov->original_name;
   copy->modified = mov->modified;
@@ -187,12 +188,12 @@ swfdec_resource_replace_movie (SwfdecSpriteMovie *movie, SwfdecResource *resourc
   copy->yscale = mov->yscale;
   copy->rotation = mov->rotation;
   copy->lockroot = mov->lockroot;
+  swfdec_movie_end_update_matrix (copy);
   /* FIXME: are events copied? If so, wouldn't that be a security issue? */
   swfdec_movie_set_static_properties (copy, &mov->original_transform,
       &mov->original_ctrans, mov->original_ratio, mov->clip_depth, 
       mov->blend_mode, NULL);
   swfdec_movie_remove (mov);
-  swfdec_movie_queue_update (copy, SWFDEC_MOVIE_INVALID_MATRIX);
   return SWFDEC_SPRITE_MOVIE (copy);
 }
 
diff --git a/swfdec/swfdec_sprite_movie_as.c b/swfdec/swfdec_sprite_movie_as.c
index 502797c..1b50643 100644
--- a/swfdec/swfdec_sprite_movie_as.c
+++ b/swfdec/swfdec_sprite_movie_as.c
@@ -653,7 +653,7 @@ swfdec_sprite_movie_createEmptyMovieClip (SwfdecAsContext *cx, SwfdecAsObject *o
 static void
 swfdec_sprite_movie_copy_props (SwfdecMovie *target, SwfdecMovie *src)
 {
-  swfdec_movie_queue_update (target, SWFDEC_MOVIE_INVALID_MATRIX);
+  swfdec_movie_begin_update_matrix (target);
   target->matrix = src->matrix;
   target->modified = src->modified;
   target->xscale = src->xscale;
@@ -661,6 +661,7 @@ swfdec_sprite_movie_copy_props (SwfdecMovie *target, SwfdecMovie *src)
   target->rotation = src->rotation;
   target->lockroot = src->lockroot;
   target->color_transform = src->color_transform;
+  swfdec_movie_end_update_matrix (target);
 }
 
 static gboolean
commit 01f03f94af28a0345e9ae2585ceb0bd65a8ae3db
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed May 7 16:33:57 2008 +0200

    Video objects aren't actors, but they can be referenced
    
    Something is seriously broken in our object system.
    This patch makes Youtube work again (oops)

diff --git a/swfdec/swfdec_movie.c b/swfdec/swfdec_movie.c
index c88f598..7677aeb 100644
--- a/swfdec/swfdec_movie.c
+++ b/swfdec/swfdec_movie.c
@@ -29,6 +29,7 @@
 
 #include "swfdec_movie.h"
 #include "swfdec_as_context.h"
+#include "swfdec_as_internal.h"
 #include "swfdec_as_strings.h"
 #include "swfdec_button_movie.h"
 #include "swfdec_debug.h"
@@ -45,7 +46,7 @@
 #include "swfdec_system.h"
 #include "swfdec_text_field_movie.h"
 #include "swfdec_utils.h"
-#include "swfdec_as_internal.h"
+#include "swfdec_video_movie.h"
 
 /*** MOVIE ***/
 
@@ -1033,7 +1034,7 @@ swfdec_movie_get_variable (SwfdecAsObject *object, SwfdecAsObject *orig,
   
   ret = swfdec_movie_get_by_name (movie, variable, FALSE);
   if (ret) {
-    if (!SWFDEC_IS_ACTOR (ret) ||
+    if ((!SWFDEC_IS_ACTOR (ret) && !SWFDEC_IS_VIDEO_MOVIE (ret)) ||
 	(swfdec_movie_get_version (movie) <= 5 && SWFDEC_IS_TEXT_FIELD_MOVIE (ret)))
       ret = movie;
     SWFDEC_AS_VALUE_SET_OBJECT (val, SWFDEC_AS_OBJECT (ret));
commit 8bb00d8d8d8d8b2cb253ef8eeea1212939bfc96a
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed May 7 16:08:14 2008 +0200

    copy more properties
    
    I detected this while auditing code, it may as well be wrong, but I don't
    think so as we copy ->matrix

diff --git a/swfdec/swfdec_sprite_movie_as.c b/swfdec/swfdec_sprite_movie_as.c
index b848bfb..502797c 100644
--- a/swfdec/swfdec_sprite_movie_as.c
+++ b/swfdec/swfdec_sprite_movie_as.c
@@ -655,6 +655,11 @@ swfdec_sprite_movie_copy_props (SwfdecMovie *target, SwfdecMovie *src)
 {
   swfdec_movie_queue_update (target, SWFDEC_MOVIE_INVALID_MATRIX);
   target->matrix = src->matrix;
+  target->modified = src->modified;
+  target->xscale = src->xscale;
+  target->yscale = src->yscale;
+  target->rotation = src->rotation;
+  target->lockroot = src->lockroot;
   target->color_transform = src->color_transform;
 }
 


More information about the Swfdec-commits mailing list