[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