[Swfdec-commits] 6 commits - swfdec/swfdec_movie.c swfdec/swfdec_player.c swfdec/swfdec_player_internal.h swfdec/swfdec_text_field_movie_as.c test/trace

Benjamin Otte company at kemper.freedesktop.org
Tue May 6 14:33:34 PDT 2008


 swfdec/swfdec_movie.c                              |   14 ++-
 swfdec/swfdec_player.c                             |   83 ++++++++++-----------
 swfdec/swfdec_player_internal.h                    |    6 -
 swfdec/swfdec_text_field_movie_as.c                |    3 
 test/trace/Makefile.am                             |    9 ++
 test/trace/createTextField-returnvalue-5.swf       |binary
 test/trace/createTextField-returnvalue-5.swf.trace |    5 +
 test/trace/createTextField-returnvalue-6.swf       |binary
 test/trace/createTextField-returnvalue-6.swf.trace |    5 +
 test/trace/createTextField-returnvalue-7.swf       |binary
 test/trace/createTextField-returnvalue-7.swf.trace |    5 +
 test/trace/createTextField-returnvalue-8.swf       |binary
 test/trace/createTextField-returnvalue-8.swf.trace |    5 +
 test/trace/createTextField-returnvalue.as          |   11 ++
 14 files changed, 94 insertions(+), 52 deletions(-)

New commits:
commit a103fa8dae98379dcc4ac6acb0ea7484ec22fa9c
Merge: c6d8531... 881f351...
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue May 6 23:33:18 2008 +0200

    Merge branch 'master' of ssh://company@git.freedesktop.org/git/swfdec/swfdec

commit c6d853162c846a577e196bd7c3a494984e87b59f
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue May 6 23:31:20 2008 +0200

    add a test for the last 2 commits

diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index 32250e8..2f7f588 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -788,6 +788,15 @@ EXTRA_DIST = \
 	crash-0.7.1-getTextExtent-8.swf \
 	crash-0.7.1-getTextExtent-8.swf.trace \
 	crash-0.7.1-getTextExtent.as \
+	createTextField-returnvalue-5.swf \
+	createTextField-returnvalue-5.swf.trace \
+	createTextField-returnvalue-6.swf \
+	createTextField-returnvalue-6.swf.trace \
+	createTextField-returnvalue-7.swf \
+	createTextField-returnvalue-7.swf.trace \
+	createTextField-returnvalue-8.swf \
+	createTextField-returnvalue-8.swf.trace \
+	createTextField-returnvalue.as \
 	currentframe.swf \
 	currentframe.swf.trace \
 	dangling-compare.as \
diff --git a/test/trace/createTextField-returnvalue-5.swf b/test/trace/createTextField-returnvalue-5.swf
new file mode 100644
index 0000000..07316bc
Binary files /dev/null and b/test/trace/createTextField-returnvalue-5.swf differ
diff --git a/test/trace/createTextField-returnvalue-5.swf.trace b/test/trace/createTextField-returnvalue-5.swf.trace
new file mode 100644
index 0000000..4ed47fe
--- /dev/null
+++ b/test/trace/createTextField-returnvalue-5.swf.trace
@@ -0,0 +1,5 @@
+[type Function]
+undefined
+_level0
+undefined
+_level0
diff --git a/test/trace/createTextField-returnvalue-6.swf b/test/trace/createTextField-returnvalue-6.swf
new file mode 100644
index 0000000..0fa43cc
Binary files /dev/null and b/test/trace/createTextField-returnvalue-6.swf differ
diff --git a/test/trace/createTextField-returnvalue-6.swf.trace b/test/trace/createTextField-returnvalue-6.swf.trace
new file mode 100644
index 0000000..af48d92
--- /dev/null
+++ b/test/trace/createTextField-returnvalue-6.swf.trace
@@ -0,0 +1,5 @@
+[type Function]
+undefined
+_level0.t
+undefined
+_level0.m
diff --git a/test/trace/createTextField-returnvalue-7.swf b/test/trace/createTextField-returnvalue-7.swf
new file mode 100644
index 0000000..584379a
Binary files /dev/null and b/test/trace/createTextField-returnvalue-7.swf differ
diff --git a/test/trace/createTextField-returnvalue-7.swf.trace b/test/trace/createTextField-returnvalue-7.swf.trace
new file mode 100644
index 0000000..af48d92
--- /dev/null
+++ b/test/trace/createTextField-returnvalue-7.swf.trace
@@ -0,0 +1,5 @@
+[type Function]
+undefined
+_level0.t
+undefined
+_level0.m
diff --git a/test/trace/createTextField-returnvalue-8.swf b/test/trace/createTextField-returnvalue-8.swf
new file mode 100644
index 0000000..538274c
Binary files /dev/null and b/test/trace/createTextField-returnvalue-8.swf differ
diff --git a/test/trace/createTextField-returnvalue-8.swf.trace b/test/trace/createTextField-returnvalue-8.swf.trace
new file mode 100644
index 0000000..27e30a0
--- /dev/null
+++ b/test/trace/createTextField-returnvalue-8.swf.trace
@@ -0,0 +1,5 @@
+[type Function]
+_level0.t
+_level0.t
+_level0.m
+_level0.m
diff --git a/test/trace/createTextField-returnvalue.as b/test/trace/createTextField-returnvalue.as
new file mode 100644
index 0000000..c2047d2
--- /dev/null
+++ b/test/trace/createTextField-returnvalue.as
@@ -0,0 +1,11 @@
+// makeswf -v 7 -s 200x150 -r 1 -o createTextField-returnvalue.swf createTextField-returnvalue.as
+
+myCreateTextField = ASnative (104, 200);
+trace (createTextField);
+trace (createTextField ("t", 0, 0, 0, 50, 25));
+trace (t);
+trace (myCreateTextField ("m", 1, 100, 0, 50, 25));
+trace (m);
+
+getURL ("fscommand:quit", "");
+
commit 9bd71d78a819e28829928aabb65b5dfb6e421b04
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue May 6 23:29:23 2008 +0200

    non-actors resolve to the movie itself
    
    FIXME: Should we make createTextField return a non-actor for Flash 5?

diff --git a/swfdec/swfdec_movie.c b/swfdec/swfdec_movie.c
index 48eb40b..6e5ab20 100644
--- a/swfdec/swfdec_movie.c
+++ b/swfdec/swfdec_movie.c
@@ -1008,8 +1008,9 @@ static gboolean
 swfdec_movie_get_variable (SwfdecAsObject *object, SwfdecAsObject *orig,
     const char *variable, SwfdecAsValue *val, guint *flags)
 {
-  SwfdecMovie *movie = SWFDEC_MOVIE (object);
-
+  SwfdecMovie *movie, *ret;
+  
+  movie = SWFDEC_MOVIE (object);
   movie = swfdec_movie_resolve (movie);
   if (movie == NULL)
     return FALSE;
@@ -1030,9 +1031,12 @@ swfdec_movie_get_variable (SwfdecAsObject *object, SwfdecAsObject *orig,
     return TRUE;
   }
   
-  movie = swfdec_movie_get_by_name (movie, variable, FALSE);
-  if (movie) {
-    SWFDEC_AS_VALUE_SET_OBJECT (val, SWFDEC_AS_OBJECT (movie));
+  ret = swfdec_movie_get_by_name (movie, variable, FALSE);
+  if (ret) {
+    if (!SWFDEC_IS_ACTOR (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));
     *flags = 0;
     return TRUE;
   }
commit 8f221af63bbc5f66862c2b2182c389b2544a6dc4
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue May 6 23:13:34 2008 +0200

    createTextField only returns the created textfield in Flash 8+

diff --git a/swfdec/swfdec_text_field_movie_as.c b/swfdec/swfdec_text_field_movie_as.c
index 290de46..166e9ad 100644
--- a/swfdec/swfdec_text_field_movie_as.c
+++ b/swfdec/swfdec_text_field_movie_as.c
@@ -1384,7 +1384,8 @@ swfdec_text_field_movie_createTextField (SwfdecAsContext *cx,
       SWFDEC_AS_STR___constructor__, &val,
       SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_VERSION_6_UP);
 
-  swfdec_as_function_call (fun, SWFDEC_AS_OBJECT (movie), 0, NULL, rval);
+  swfdec_as_function_call (fun, SWFDEC_AS_OBJECT (movie), 0, NULL, 
+      cx->version > 7 ? rval : NULL);
   cx->frame->construct = TRUE;
   swfdec_as_context_run (cx);
 }
commit 855301f67df23e88aad25480d8fb1d245652e966
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue May 6 21:49:39 2008 +0200

    remove debugging print

diff --git a/swfdec/swfdec_player.c b/swfdec/swfdec_player.c
index 2e9f782..4bb4bf6 100644
--- a/swfdec/swfdec_player.c
+++ b/swfdec/swfdec_player.c
@@ -3007,8 +3007,6 @@ swfdec_player_render_with_renderer (SwfdecPlayer *player, cairo_t *cr,
   real.y1 = ceil (real.y1);
   SWFDEC_INFO ("=== %p: START RENDER, area %g %g  %g %g ===", player, 
       real.x0, real.y0, real.x1, real.y1);
-  g_print ("=== %p: START RENDER, area %g %g  %g %g ===\n", player, 
-      real.x0, real.y0, real.x1, real.y1);
   /* convert the cairo matrix */
   cairo_transform (cr, &priv->global_to_stage);
 
commit c41969246f8788e69fbcee5d8c1b9eb2dddc6ba4
Author: Benjamin Otte <otte at gnome.org>
Date:   Tue May 6 21:33:55 2008 +0200

    replace the stage<=>global conversion with a proper matrix

diff --git a/swfdec/swfdec_player.c b/swfdec/swfdec_player.c
index 232521e..2e9f782 100644
--- a/swfdec/swfdec_player.c
+++ b/swfdec/swfdec_player.c
@@ -824,10 +824,10 @@ swfdec_player_update_scale (SwfdecPlayer *player)
   }
 
   if (priv->stage.height == 0 || priv->stage.width == 0) {
-    priv->scale_x = 1.0;
-    priv->scale_y = 1.0;
-    priv->offset_x = 0;
-    priv->offset_y = 0;
+    cairo_matrix_init_scale (&priv->stage_to_global, 
+	SWFDEC_TWIPS_SCALE_FACTOR, SWFDEC_TWIPS_SCALE_FACTOR);
+    priv->global_to_stage = priv->stage_to_global;
+    cairo_matrix_invert (&priv->global_to_stage);
     return;
   }
   if (priv->width == 0 || priv->height == 0) {
@@ -839,42 +839,47 @@ swfdec_player_update_scale (SwfdecPlayer *player)
   }
   switch (priv->scale_mode) {
     case SWFDEC_SCALE_SHOW_ALL:
-      priv->scale_x = MIN (scale_x, scale_y);
-      priv->scale_y = priv->scale_x;
+      scale_x = MIN (scale_x, scale_y);
+      scale_y = scale_x;
       break;
     case SWFDEC_SCALE_NO_BORDER:
-      priv->scale_x = MAX (scale_x, scale_y);
-      priv->scale_y = priv->scale_x;
+      scale_x = MAX (scale_x, scale_y);
+      scale_y = scale_x;
       break;
     case SWFDEC_SCALE_EXACT_FIT:
-      priv->scale_x = scale_x;
-      priv->scale_y = scale_y;
       break;
     case SWFDEC_SCALE_NONE:
-      priv->scale_x = 1.0;
-      priv->scale_y = 1.0;
+      scale_x = 1.0;
+      scale_y = 1.0;
       break;
     default:
       g_assert_not_reached ();
   }
-  width = priv->stage.width - ceil (priv->width * priv->scale_x);
-  height = priv->stage.height - ceil (priv->height * priv->scale_y);
+  width = priv->stage.width - ceil (priv->width * scale_x);
+  height = priv->stage.height - ceil (priv->height * scale_y);
   if (priv->align_flags & SWFDEC_ALIGN_FLAG_LEFT) {
-    priv->offset_x = 0;
+    width = 0;
   } else if (priv->align_flags & SWFDEC_ALIGN_FLAG_RIGHT) {
-    priv->offset_x = width;
+    width = width;
   } else {
-    priv->offset_x = width / 2;
+    width = width / 2;
   }
   if (priv->align_flags & SWFDEC_ALIGN_FLAG_TOP) {
-    priv->offset_y = 0;
+    height = 0;
   } else if (priv->align_flags & SWFDEC_ALIGN_FLAG_BOTTOM) {
-    priv->offset_y = height;
+    height = height;
   } else {
-    priv->offset_y = height / 2;
+    height = height / 2;
   }
   SWFDEC_LOG ("coordinate translation is %g * x + %d - %g * y + %d", 
-      priv->scale_x, priv->offset_x, priv->scale_y, priv->offset_y);
+      scale_x, width, scale_y, height);
+  cairo_matrix_init_translate (&priv->global_to_stage, width, height);
+  cairo_matrix_scale (&priv->global_to_stage, SWFDEC_TWIPS_TO_DOUBLE (scale_x),
+      SWFDEC_TWIPS_TO_DOUBLE (scale_y));
+  priv->stage_to_global = priv->global_to_stage;
+  if (cairo_matrix_invert (&priv->stage_to_global)) {
+    g_assert_not_reached ();
+  }
 #if 0
   /* FIXME: make this emit the signal at the right time */
   priv->invalid.x0 = 0;
@@ -1629,27 +1634,21 @@ swfdec_player_do_handle_mouse (SwfdecPlayer *player,
 void
 swfdec_player_global_to_stage (SwfdecPlayer *player, double *x, double *y)
 {
-  SwfdecPlayerPrivate *priv = player->priv;
-
   g_return_if_fail (SWFDEC_IS_PLAYER (player));
   g_return_if_fail (x != NULL);
   g_return_if_fail (y != NULL);
 
-  *x = *x / SWFDEC_TWIPS_SCALE_FACTOR * priv->scale_x + priv->offset_x;
-  *y = *y / SWFDEC_TWIPS_SCALE_FACTOR * priv->scale_y + priv->offset_y;
+  cairo_matrix_transform_point (&player->priv->global_to_stage, x, y);
 }
 
 void
 swfdec_player_stage_to_global (SwfdecPlayer *player, double *x, double *y)
 {
-  SwfdecPlayerPrivate *priv = player->priv;
-
   g_return_if_fail (SWFDEC_IS_PLAYER (player));
   g_return_if_fail (x != NULL);
   g_return_if_fail (y != NULL);
 
-  *x = (*x - priv->offset_x) / priv->scale_x * SWFDEC_TWIPS_SCALE_FACTOR;
-  *y = (*y - priv->offset_y) / priv->scale_y * SWFDEC_TWIPS_SCALE_FACTOR;
+  cairo_matrix_transform_point (&player->priv->stage_to_global, x, y);
 }
 
 static void
@@ -2298,9 +2297,7 @@ swfdec_player_invalidate (SwfdecPlayer *player, const SwfdecRect *rect)
     if (swfdec_rect_is_empty (rect))
       return;
 
-    tmp = *rect;
-    swfdec_player_global_to_stage (player, &tmp.x0, &tmp.y0);
-    swfdec_player_global_to_stage (player, &tmp.x1, &tmp.y1);
+    swfdec_rect_transform (&tmp, rect, &priv->global_to_stage);
     swfdec_rectangle_init_rect (&r, &tmp);
     /* FIXME: currently we clamp the rectangle to the visible area, it might
      * be useful to allow out-of-bounds drawing. In that case this needs to be
@@ -2905,7 +2902,7 @@ swfdec_player_key_release (SwfdecPlayer *player, guint keycode, guint character)
 }
 
 static void
-swfdec_player_render_focusrect (SwfdecPlayer *player, cairo_t *cr, SwfdecRect *inval)
+swfdec_player_render_focusrect (SwfdecPlayer *player, cairo_t *cr)
 {
 #define LINE_WIDTH (3.0)
   SwfdecPlayerPrivate *priv;
@@ -2999,24 +2996,28 @@ swfdec_player_render_with_renderer (SwfdecPlayer *player, cairo_t *cr,
   cairo_rectangle (cr, x, y, width, height);
   cairo_clip (cr);
   /* compute the rectangle */
-  x -= priv->offset_x;
-  y -= priv->offset_y;
-  real.x0 = floor (x * SWFDEC_TWIPS_SCALE_FACTOR) / priv->scale_x;
-  real.y0 = floor (y * SWFDEC_TWIPS_SCALE_FACTOR) / priv->scale_y;
-  real.x1 = ceil ((x + width) * SWFDEC_TWIPS_SCALE_FACTOR) / priv->scale_x;
-  real.y1 = ceil ((y + height) * SWFDEC_TWIPS_SCALE_FACTOR) / priv->scale_y;
+  real.x0 = x;
+  real.y0 = y;
+  real.x1 = x + width;
+  real.y1 = y + height;
+  swfdec_rect_transform (&real, &real, &priv->stage_to_global);
+  real.x0 = floor (real.x0);
+  real.y0 = floor (real.y0);
+  real.x1 = ceil (real.x1);
+  real.y1 = ceil (real.y1);
   SWFDEC_INFO ("=== %p: START RENDER, area %g %g  %g %g ===", player, 
       real.x0, real.y0, real.x1, real.y1);
+  g_print ("=== %p: START RENDER, area %g %g  %g %g ===\n", player, 
+      real.x0, real.y0, real.x1, real.y1);
   /* convert the cairo matrix */
-  cairo_translate (cr, priv->offset_x, priv->offset_y);
-  cairo_scale (cr, priv->scale_x / SWFDEC_TWIPS_SCALE_FACTOR, priv->scale_y / SWFDEC_TWIPS_SCALE_FACTOR);
+  cairo_transform (cr, &priv->global_to_stage);
 
   for (walk = priv->roots; walk; walk = walk->next) {
     swfdec_movie_render (walk->data, cr, &trans, &real);
   }
   cairo_restore (cr);
   /* NB: we render the focusrect after restoring, so the focusrect doesn't scale */
-  swfdec_player_render_focusrect (player, cr, &real);
+  swfdec_player_render_focusrect (player, cr);
 
   SWFDEC_INFO ("=== %p: END RENDER ===", player);
 }
diff --git a/swfdec/swfdec_player_internal.h b/swfdec/swfdec_player_internal.h
index c2f97e7..1eae3ef 100644
--- a/swfdec/swfdec_player_internal.h
+++ b/swfdec/swfdec_player_internal.h
@@ -91,10 +91,8 @@ struct _SwfdecPlayerPrivate
   SwfdecRectangle     	stage;			/* size of the stage set by user */
   guint			align_flags;		/* SwfdecAlignFlag */
   SwfdecScaleMode	scale_mode;		/* scale mode */
-  double		scale_x;		/* cached x scale value */
-  double		scale_y;		/* cached y scale value */
-  int			offset_x;		/* x offset from top left edge after scaling */
-  int			offset_y;		/* y offset from top left edge after scaling */
+  cairo_matrix_t	stage_to_global;	/* matrix to go from stage to global */
+  cairo_matrix_t	global_to_stage;	/* matrix to go from stage to global */
   SwfdecColor		bgcolor;		/* background color or 0 if unset */
 
   SwfdecFunctionList	resource_requests;	/* all external requested URIs - see swfdec_resource_request.[ch] */


More information about the Swfdec-commits mailing list