[Swfdec-commits] 25 commits - player/swfdec_debug_script.c player/swfdec_debug_script.h player/swfdec_debug_scripts.c player/swfdec_debug_scripts.h player/swfdec_debug_stack.c player/swfdec_debug_stack.h player/swfdec_player_manager.c player/swfdec_player_manager.h swfdec-gtk/swfdec_gtk_widget.c swfdec/swfdec_as_types.c swfdec/swfdec_audio_decoder.c swfdec/swfdec_audio_decoder_uncompressed.c swfdec/swfdec_audio_stream.c swfdec/swfdec_internal.h swfdec/swfdec_movie_asprops.c swfdec/swfdec_movie.c swfdec/swfdec_player.c swfdec/swfdec_player_internal.h swfdec/swfdec_renderer.c swfdec/swfdec_renderer_internal.h swfdec/swfdec_sprite_movie.c swfdec/swfdec_text_field_movie_as.c swfdec/swfdec_text_field_movie.c swfdec/swfdec_text_field_movie.h swfdec/swfdec_text_layout.c swfdec/swfdec_text_layout.h swfdec/swfdec_url.c test/trace
Benjamin Otte
company at kemper.freedesktop.org
Sun Jun 22 08:20:46 PDT 2008
player/swfdec_debug_script.c | 219 -----
player/swfdec_debug_script.h | 58 -
player/swfdec_debug_scripts.c | 150 ---
player/swfdec_debug_scripts.h | 55 -
player/swfdec_debug_stack.c | 180 ----
player/swfdec_debug_stack.h | 54 -
player/swfdec_player_manager.c | 673 -----------------
player/swfdec_player_manager.h | 82 --
swfdec-gtk/swfdec_gtk_widget.c | 4
swfdec/swfdec_as_types.c | 30
swfdec/swfdec_audio_decoder.c | 6
swfdec/swfdec_audio_decoder_uncompressed.c | 10
swfdec/swfdec_audio_stream.c | 1
swfdec/swfdec_internal.h | 7
swfdec/swfdec_movie.c | 3
swfdec/swfdec_movie_asprops.c | 25
swfdec/swfdec_player.c | 15
swfdec/swfdec_player_internal.h | 2
swfdec/swfdec_renderer.c | 20
swfdec/swfdec_renderer_internal.h | 2
swfdec/swfdec_sprite_movie.c | 6
swfdec/swfdec_text_field_movie.c | 164 +++-
swfdec/swfdec_text_field_movie.h | 54 -
swfdec/swfdec_text_field_movie_as.c | 14
swfdec/swfdec_text_layout.c | 13
swfdec/swfdec_text_layout.h | 2
swfdec/swfdec_url.c | 4
test/trace/Makefile.am | 14
test/trace/crash-0.7.1-uncompressed-half-samples-5.swf |binary
test/trace/crash-0.7.1-uncompressed-half-samples-6.swf |binary
test/trace/crash-0.7.1-uncompressed-half-samples-7.swf |binary
test/trace/crash-0.7.1-uncompressed-half-samples-8.swf |binary
test/trace/crash-0.7.1-uncompressed-half-samples.xml | 19
test/trace/textfield-x-and-width-6.swf |binary
test/trace/textfield-x-and-width-6.swf.trace | 410 ++++++++++
test/trace/textfield-x-and-width-7.swf |binary
test/trace/textfield-x-and-width-7.swf.trace | 410 ++++++++++
test/trace/textfield-x-and-width.as | 22
38 files changed, 1148 insertions(+), 1580 deletions(-)
New commits:
commit 0df43c7173fd96d75045129ce30b1dd2c0c3f8d8
Author: Benjamin Otte <otte at gnome.org>
Date: Sun Jun 22 17:14:29 2008 +0200
fix to-identity-matrix functionality in text fields
The previous code did not take into account swfdec_player_render() being called
with modified matrices on the cr
diff --git a/swfdec/swfdec_renderer.c b/swfdec/swfdec_renderer.c
index cd8c071..59db44b 100644
--- a/swfdec/swfdec_renderer.c
+++ b/swfdec/swfdec_renderer.c
@@ -314,10 +314,13 @@ swfdec_renderer_new_default (SwfdecPlayer *player)
}
static const cairo_user_data_key_t cr_key;
+static const cairo_user_data_key_t matrix_key;
void
swfdec_renderer_attach (SwfdecRenderer *renderer, cairo_t *cr)
{
+ cairo_matrix_t *matrix;
+
g_return_if_fail (SWFDEC_IS_RENDERER (renderer));
g_return_if_fail (cr != NULL);
@@ -325,6 +328,11 @@ swfdec_renderer_attach (SwfdecRenderer *renderer, cairo_t *cr)
if (cairo_set_user_data (cr, &cr_key, renderer, g_object_unref) != CAIRO_STATUS_SUCCESS) {
g_warning ("could not attach user data");
}
+ matrix = g_new (cairo_matrix_t, 1);
+ cairo_get_matrix (cr, matrix);
+ if (cairo_set_user_data (cr, &matrix_key, matrix, g_free) != CAIRO_STATUS_SUCCESS) {
+ g_warning ("could not attach user data");
+ }
}
SwfdecRenderer *
@@ -335,6 +343,18 @@ swfdec_renderer_get (cairo_t *cr)
return cairo_get_user_data (cr, &cr_key);
}
+void
+swfdec_renderer_reset_matrix (cairo_t *cr)
+{
+ cairo_matrix_t *matrix;
+
+ g_return_if_fail (cr != NULL);
+
+ matrix = cairo_get_user_data (cr, &matrix_key);
+ g_return_if_fail (matrix != NULL);
+ cairo_set_matrix (cr, matrix);
+}
+
/**
* swfdec_renderer_create_similar:
* @renderer: a renderer
diff --git a/swfdec/swfdec_renderer_internal.h b/swfdec/swfdec_renderer_internal.h
index 7186ab0..e2bc1b4 100644
--- a/swfdec/swfdec_renderer_internal.h
+++ b/swfdec/swfdec_renderer_internal.h
@@ -33,6 +33,8 @@ SwfdecRenderer * swfdec_renderer_new_default (SwfdecPlayer * player);
void swfdec_renderer_attach (SwfdecRenderer * renderer,
cairo_t * cr);
SwfdecRenderer * swfdec_renderer_get (cairo_t * cr);
+void swfdec_renderer_reset_matrix (cairo_t * cr);
+
void swfdec_renderer_add_cache (SwfdecRenderer * renderer,
gboolean replace,
gpointer key,
diff --git a/swfdec/swfdec_text_field_movie.c b/swfdec/swfdec_text_field_movie.c
index bd892d4..cc889f7 100644
--- a/swfdec/swfdec_text_field_movie.c
+++ b/swfdec/swfdec_text_field_movie.c
@@ -33,6 +33,7 @@
#include "swfdec_debug.h"
#include "swfdec_internal.h"
#include "swfdec_player_internal.h"
+#include "swfdec_renderer_internal.h"
#include "swfdec_resource.h"
#include "swfdec_sandbox.h"
#include "swfdec_text_format.h"
@@ -216,7 +217,6 @@ static void
swfdec_text_field_movie_render (SwfdecMovie *movie, cairo_t *cr,
const SwfdecColorTransform *ctrans, const SwfdecRect *inval)
{
- static const cairo_matrix_t identity = { 1, 0, 0, 1, 0, 0 };
SwfdecTextFieldMovie *text = SWFDEC_TEXT_FIELD_MOVIE (movie);
SwfdecRectangle *area;
SwfdecColor color;
@@ -226,8 +226,7 @@ swfdec_text_field_movie_render (SwfdecMovie *movie, cairo_t *cr,
swfdec_rectangle_is_empty (&text->stage_area))
return;
- /* FIXME: need to handle the case where we're not drawing with identity */
- cairo_set_matrix (cr, &identity);
+ swfdec_renderer_reset_matrix (cr);
if (text->background) {
cairo_rectangle (cr, text->stage_area.x, text->stage_area.y,
commit fe58a70614baf72fd910c33922c0f95c05739e82
Author: Benjamin Otte <otte at gnome.org>
Date: Sun Jun 22 17:10:42 2008 +0200
also respect device offset when painting surface
diff --git a/swfdec-gtk/swfdec_gtk_widget.c b/swfdec-gtk/swfdec_gtk_widget.c
index 473eade..f6eb96e 100644
--- a/swfdec-gtk/swfdec_gtk_widget.c
+++ b/swfdec-gtk/swfdec_gtk_widget.c
@@ -283,7 +283,7 @@ swfdec_gtk_widget_expose (GtkWidget *gtkwidget, GdkEventExpose *event)
if (surface) {
cairo_t *crw = gdk_cairo_create (gtkwidget->window);
- cairo_set_source_surface (crw, surface, event->area.x, event->area.y);
+ cairo_set_source_surface (crw, surface, 0, 0);
cairo_paint (crw);
cairo_destroy (crw);
cairo_surface_destroy (surface);
commit 40df1c699d5be87b61f153ca43fe656dfcb5efa1
Author: Benjamin Otte <otte at gnome.org>
Date: Sun Jun 22 16:08:20 2008 +0200
use device offset for partial redraw
diff --git a/swfdec-gtk/swfdec_gtk_widget.c b/swfdec-gtk/swfdec_gtk_widget.c
index 801cbce..473eade 100644
--- a/swfdec-gtk/swfdec_gtk_widget.c
+++ b/swfdec-gtk/swfdec_gtk_widget.c
@@ -273,8 +273,8 @@ swfdec_gtk_widget_expose (GtkWidget *gtkwidget, GdkEventExpose *event)
event->area.width, event->area.height)) == NULL) {
cr = gdk_cairo_create (gtkwidget->window);
} else {
+ cairo_surface_set_device_offset (surface, -event->area.x, -event->area.y);
cr = cairo_create (surface);
- cairo_translate (cr, -event->area.x, -event->area.y);
}
swfdec_player_render (priv->player, cr,
event->area.x, event->area.y, event->area.width, event->area.height);
commit a76ce6a62ec9c6c34149ae62e0f6be5e618b7f99
Author: Benjamin Otte <otte at gnome.org>
Date: Sun Jun 22 14:23:23 2008 +0200
don't cache layout size in the movie
diff --git a/swfdec/swfdec_text_field_movie.c b/swfdec/swfdec_text_field_movie.c
index 0af701b..bd892d4 100644
--- a/swfdec/swfdec_text_field_movie.c
+++ b/swfdec/swfdec_text_field_movie.c
@@ -129,8 +129,8 @@ swfdec_text_field_movie_autosize (SwfdecTextFieldMovie *text)
if (text->auto_size == SWFDEC_AUTO_SIZE_NONE)
return;
- x1 = text->layout_width;
- z1 = text->layout_height;
+ x1 = swfdec_text_layout_get_width (text->layout);
+ z1 = swfdec_text_layout_get_height (text->layout);
cairo_matrix_transform_distance (&text->from_layout, &x1, &z1);
x1 += (BORDER_LEFT + BORDER_RIGHT) * SWFDEC_TWIPS_SCALE_FACTOR;
z1 += (BORDER_TOP + BORDER_BOTTOM) * SWFDEC_TWIPS_SCALE_FACTOR;
@@ -353,19 +353,11 @@ static void
swfdec_text_field_movie_layout_changed (SwfdecTextLayout *layout,
SwfdecTextFieldMovie *text)
{
- guint w, h, max;
+ guint max;
if (swfdec_player_is_locked (SWFDEC_PLAYER (SWFDEC_AS_OBJECT (text)->context)))
swfdec_movie_invalidate_last (SWFDEC_MOVIE (text));
- w = swfdec_text_layout_get_width (layout);
- h = swfdec_text_layout_get_height (layout);
-
- if (w != text->layout_width || h != text->layout_height) {
- text->layout_width = w;
- text->layout_height = h;
- }
-
swfdec_text_field_movie_update_scroll (text);
max = swfdec_text_field_movie_get_hscroll_max (text);
@@ -1119,7 +1111,7 @@ swfdec_text_field_movie_get_hscroll_max (SwfdecTextFieldMovie *text)
g_return_val_if_fail (SWFDEC_IS_TEXT_FIELD_MOVIE (text), 0);
- width = text->layout_width;
+ width = swfdec_text_layout_get_width (text->layout);
if ((guint) text->layout_area.width >= width)
return 0;
else
diff --git a/swfdec/swfdec_text_field_movie.h b/swfdec/swfdec_text_field_movie.h
index e4584d2..226ae47 100644
--- a/swfdec/swfdec_text_field_movie.h
+++ b/swfdec/swfdec_text_field_movie.h
@@ -64,8 +64,6 @@ struct _SwfdecTextFieldMovie {
SwfdecTextBuffer * text; /* the text + formatting */
SwfdecTextLayout * layout; /* the layouted text */
- guint layout_width; /* text width in pixels */
- guint layout_height; /* text height in pixels */
const char * variable;
diff --git a/swfdec/swfdec_text_field_movie_as.c b/swfdec/swfdec_text_field_movie_as.c
index 69620f6..9202b3d 100644
--- a/swfdec/swfdec_text_field_movie_as.c
+++ b/swfdec/swfdec_text_field_movie_as.c
@@ -424,11 +424,13 @@ swfdec_text_field_movie_get_textHeight (SwfdecAsContext *cx,
SwfdecAsValue *ret)
{
SwfdecTextFieldMovie *text;
+ guint height;
SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
swfdec_movie_update (SWFDEC_MOVIE (text));
- SWFDEC_AS_VALUE_SET_INT (ret, floor (text->layout_height *
+ height = swfdec_text_layout_get_height (text->layout);
+ SWFDEC_AS_VALUE_SET_INT (ret, floor (height *
text->from_layout.yy / SWFDEC_TWIPS_SCALE_FACTOR));
}
@@ -438,11 +440,13 @@ swfdec_text_field_movie_get_textWidth (SwfdecAsContext *cx,
SwfdecAsValue *ret)
{
SwfdecTextFieldMovie *text;
+ double width;
SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
swfdec_movie_update (SWFDEC_MOVIE (text));
- SWFDEC_AS_VALUE_SET_INT (ret, floor (text->layout_width *
+ width = swfdec_text_layout_get_width (text->layout);
+ SWFDEC_AS_VALUE_SET_INT (ret, floor (width *
text->from_layout.xx / SWFDEC_TWIPS_SCALE_FACTOR));
}
commit e79242195deb41ad2330ec29cca7486a628b5c13
Author: Benjamin Otte <otte at gnome.org>
Date: Sun Jun 22 14:20:12 2008 +0200
cache layout width in the layout
diff --git a/swfdec/swfdec_text_layout.c b/swfdec/swfdec_text_layout.c
index 5b8da74..1fea5fa 100644
--- a/swfdec/swfdec_text_layout.c
+++ b/swfdec/swfdec_text_layout.c
@@ -442,8 +442,11 @@ swfdec_text_layout_invalidate (SwfdecTextLayout *layout)
if (g_sequence_iter_is_end (g_sequence_get_begin_iter (layout->blocks)))
return;
+ /* clear caches */
g_sequence_remove_range (g_sequence_get_begin_iter (layout->blocks),
g_sequence_get_end_iter (layout->blocks));
+ layout->layout_width = 0;
+
g_signal_emit (layout, signals[CHANGED], 0);
}
@@ -601,20 +604,22 @@ swfdec_text_layout_get_width (SwfdecTextLayout *layout)
{
GSequenceIter *iter;
SwfdecTextBlock *block;
- guint width = 0;
g_return_val_if_fail (SWFDEC_IS_TEXT_LAYOUT (layout), 0);
+ if (layout->layout_width)
+ return layout->layout_width;
+
swfdec_text_layout_ensure (layout);
for (iter = g_sequence_get_begin_iter (layout->blocks);
!g_sequence_iter_is_end (iter);
iter = g_sequence_iter_next (iter)) {
block = g_sequence_get (iter);
- width = MAX (width, (guint) block->rect.x + block->rect.width);
+ layout->layout_width = MAX (layout->layout_width, (guint) block->rect.x + block->rect.width);
}
- return width;
+ return layout->layout_width;
}
/**
diff --git a/swfdec/swfdec_text_layout.h b/swfdec/swfdec_text_layout.h
index 3ad0e7f..b181360 100644
--- a/swfdec/swfdec_text_layout.h
+++ b/swfdec/swfdec_text_layout.h
@@ -50,6 +50,8 @@ struct _SwfdecTextLayout
/* layout data */
GSequence * blocks; /* ordered list of blocks */
+ /* cached values */
+ guint layout_width; /* width of layout or 0 if not computed yet */
};
struct _SwfdecTextLayoutClass
commit 6ac3e746bc7ac644a115e4c8acb30573241cc08b
Author: Benjamin Otte <otte at gnome.org>
Date: Sun Jun 22 14:15:17 2008 +0200
more docs
diff --git a/swfdec/swfdec_text_field_movie.h b/swfdec/swfdec_text_field_movie.h
index 492f192..e4584d2 100644
--- a/swfdec/swfdec_text_field_movie.h
+++ b/swfdec/swfdec_text_field_movie.h
@@ -43,7 +43,8 @@ typedef struct _SwfdecTextFieldMovieClass SwfdecTextFieldMovieClass;
struct _SwfdecTextFieldMovie {
SwfdecActor actor;
- SwfdecRect extents; /* original extents (copied from graphic) */
+ SwfdecRect extents; /* original extents (copied from graphic) - queue extents update when modifying */
+ /* these are updated with the movie's extents - so call swfdec_movie_update() */
cairo_matrix_t to_layout; /* matrix to go from movie => layout */
cairo_matrix_t from_layout; /* matrix to go from layout => movie */
SwfdecRectangle layout_area; /* layout we render to in stage coordinates */
commit a798c1b298a8cdc932dd9c13ad813374b1984adb
Author: Benjamin Otte <otte at gnome.org>
Date: Sun Jun 22 14:14:37 2008 +0200
We need the correct matrix for textWidth/textHeight computation
diff --git a/swfdec/swfdec_text_field_movie_as.c b/swfdec/swfdec_text_field_movie_as.c
index 8fed43b..69620f6 100644
--- a/swfdec/swfdec_text_field_movie_as.c
+++ b/swfdec/swfdec_text_field_movie_as.c
@@ -427,6 +427,7 @@ swfdec_text_field_movie_get_textHeight (SwfdecAsContext *cx,
SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
+ swfdec_movie_update (SWFDEC_MOVIE (text));
SWFDEC_AS_VALUE_SET_INT (ret, floor (text->layout_height *
text->from_layout.yy / SWFDEC_TWIPS_SCALE_FACTOR));
}
@@ -440,6 +441,7 @@ swfdec_text_field_movie_get_textWidth (SwfdecAsContext *cx,
SWFDEC_AS_CHECK (SWFDEC_TYPE_TEXT_FIELD_MOVIE, &text, "");
+ swfdec_movie_update (SWFDEC_MOVIE (text));
SWFDEC_AS_VALUE_SET_INT (ret, floor (text->layout_width *
text->from_layout.xx / SWFDEC_TWIPS_SCALE_FACTOR));
}
commit 5a3d5f09e9c115fcc81cc8a6056f6ee256a3d066
Author: Benjamin Otte <otte at gnome.org>
Date: Sun Jun 22 14:14:22 2008 +0200
Flash does word wrapping, no matter what
diff --git a/swfdec/swfdec_text_layout.c b/swfdec/swfdec_text_layout.c
index c359824..5b8da74 100644
--- a/swfdec/swfdec_text_layout.c
+++ b/swfdec/swfdec_text_layout.c
@@ -169,7 +169,7 @@ swfdec_text_block_new (PangoContext *context)
block = g_slice_new0 (SwfdecTextBlock);
block->layout = pango_layout_new (context);
- pango_layout_set_wrap (block->layout, PANGO_WRAP_WORD_CHAR);
+ pango_layout_set_wrap (block->layout, PANGO_WRAP_WORD);
return block;
}
commit b67f3524d82b497b1a1855099243e232f3550071
Author: Benjamin Otte <otte at gnome.org>
Date: Sat Jun 21 18:26:31 2008 +0200
remove outdated files
diff --git a/player/swfdec_debug_script.c b/player/swfdec_debug_script.c
deleted file mode 100644
index 8b551ef..0000000
--- a/player/swfdec_debug_script.c
+++ /dev/null
@@ -1,219 +0,0 @@
-/* Swfdec
- * Copyright (C) 2006 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
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301 USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "swfdec_debug_script.h"
-
-G_DEFINE_TYPE (SwfdecDebugScript, swfdec_debug_script, GTK_TYPE_TREE_VIEW)
-
-enum {
- COLUMN_COMMAND,
- COLUMN_LINE,
- COLUMN_BREAKPOINT,
- COLUMN_DESC,
- N_COLUMNS
-};
-
-static void
-breakpoint_added_cb (SwfdecDebugger *debugger, guint id, SwfdecDebugScript *debug)
-{
- GtkTreeModel *model;
- GtkTreeIter iter;
- SwfdecDebuggerScript *script;
- guint line;
-
- if (!swfdec_debugger_get_breakpoint (debugger, id, &script, &line))
- return;
- if (script != debug->script)
- return;
-
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (debug));
- if (!gtk_tree_model_get_iter_first (model, &iter))
- return;
- while (line--)
- if (!gtk_tree_model_iter_next (model, &iter))
- return;
-
- gtk_list_store_set (GTK_LIST_STORE (model), &iter, COLUMN_BREAKPOINT, id, -1);
-}
-
-static void
-breakpoint_removed_cb (SwfdecDebugger *debugger, guint id, SwfdecDebugScript *debug)
-{
- GtkTreeModel *model;
- GtkTreeIter iter;
- SwfdecDebuggerScript *script;
- guint line;
-
- if (!swfdec_debugger_get_breakpoint (debugger, id, &script, &line))
- return;
- if (script != debug->script)
- return;
-
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (debug));
- if (!gtk_tree_model_get_iter_first (model, &iter))
- return;
- while (line--)
- if (!gtk_tree_model_iter_next (model, &iter))
- return;
-
- gtk_list_store_set (GTK_LIST_STORE (model), &iter, COLUMN_BREAKPOINT, 0, -1);
-}
-
-static void
-swfdec_debug_script_set_debugger (SwfdecDebugScript *debug, SwfdecDebugger *debugger)
-{
- if (debug->debugger) {
- g_signal_handlers_disconnect_by_func (debug->debugger, breakpoint_removed_cb, debug);
- g_signal_handlers_disconnect_by_func (debug->debugger, breakpoint_added_cb, debug);
- }
- debug->debugger = debugger;
- swfdec_debug_script_set_script (debug, NULL);
- if (debugger) {
- g_signal_connect (debugger, "breakpoint-added", G_CALLBACK (breakpoint_added_cb), debug);
- g_signal_connect (debugger, "breakpoint-removed", G_CALLBACK (breakpoint_removed_cb), debug);
- };
-}
-
-static void
-swfdec_debug_script_dispose (GObject *object)
-{
- SwfdecDebugScript *debug = SWFDEC_DEBUG_SCRIPT (object);
-
- swfdec_debug_script_set_debugger (debug, NULL);
-
- G_OBJECT_CLASS (swfdec_debug_script_parent_class)->dispose (object);
-}
-
-static void
-swfdec_debug_script_class_init (SwfdecDebugScriptClass * g_class)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (g_class);
-
- object_class->dispose = swfdec_debug_script_dispose;
-}
-
-static void
-swfdec_debug_script_init (SwfdecDebugScript * debug)
-{
-}
-
-static void
-breakpoint_row_toggled_cb (GtkCellRendererToggle *cell, gchar *path,
- SwfdecDebugScript *debug)
-{
- GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (debug));
- GtkTreeIter iter;
- guint br, line;
-
- if (!gtk_tree_model_get_iter_from_string (model, &iter, path))
- return;
- gtk_tree_model_get (model, &iter, COLUMN_BREAKPOINT, &br, COLUMN_LINE, &line, -1);
- if (br) {
- swfdec_debugger_unset_breakpoint (debug->debugger, br);
- } else {
- swfdec_debugger_set_breakpoint (debug->debugger, debug->script, line);
- }
-}
-
-static void
-swfdec_debug_script_add_columns (GtkTreeView *treeview)
-{
- GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
-
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Line", renderer,
- "text", COLUMN_LINE, NULL);
- gtk_tree_view_column_set_sort_column_id (column, COLUMN_LINE);
- gtk_tree_view_column_set_resizable (column, TRUE);
- gtk_tree_view_append_column (treeview, column);
-
- renderer = gtk_cell_renderer_toggle_new ();
- column = gtk_tree_view_column_new_with_attributes ("Br", renderer,
- "active", COLUMN_BREAKPOINT, NULL);
- g_signal_connect (renderer, "toggled", G_CALLBACK (breakpoint_row_toggled_cb), treeview);
- gtk_tree_view_column_set_sort_column_id (column, COLUMN_LINE);
- gtk_tree_view_column_set_resizable (column, TRUE);
- gtk_tree_view_append_column (treeview, column);
-
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Command", renderer,
- "text", COLUMN_DESC, NULL);
- g_object_set (renderer, "width-chars", 30, NULL);
- gtk_tree_view_column_set_sort_column_id (column, COLUMN_DESC);
- gtk_tree_view_column_set_resizable (column, TRUE);
- gtk_tree_view_append_column (treeview, column);
-}
-
-GtkWidget *
-swfdec_debug_script_new (SwfdecDebugger *debugger)
-{
- SwfdecDebugScript *debug;
-
- g_return_val_if_fail (SWFDEC_IS_DEBUGGER (debugger), NULL);
-
- debug = g_object_new (SWFDEC_TYPE_DEBUG_SCRIPT, 0);
- swfdec_debug_script_add_columns (GTK_TREE_VIEW (debug));
- swfdec_debug_script_set_debugger (debug, debugger);
-
- return GTK_WIDGET (debug);
-}
-
-static void
-swfdec_debug_script_set_model (SwfdecDebugScript *debug)
-{
- guint i;
- GtkListStore *store = gtk_list_store_new (N_COLUMNS, G_TYPE_POINTER,
- G_TYPE_UINT, G_TYPE_UINT, G_TYPE_STRING);
-
- for (i = 0; i < debug->script->n_commands; i++) {
- SwfdecDebuggerCommand *command = &debug->script->commands[i];
- GtkTreeIter iter;
-
- gtk_list_store_append (store, &iter);
- gtk_list_store_set (store, &iter, COLUMN_COMMAND, command, COLUMN_LINE, i,
- COLUMN_BREAKPOINT, swfdec_debugger_script_has_breakpoint (debug->debugger, debug->script, i),
- COLUMN_DESC, command->description, -1);
- }
-
- gtk_tree_view_set_model (GTK_TREE_VIEW (debug), GTK_TREE_MODEL (store));
- g_object_unref (store);
-}
-
-void
-swfdec_debug_script_set_script (SwfdecDebugScript *debug, SwfdecDebuggerScript *dscript)
-{
- g_return_if_fail (SWFDEC_IS_DEBUG_SCRIPT (debug));
-
- if (debug->debugger == NULL)
- return;
- if (debug->script == dscript)
- return;
- debug->script = dscript;
- if (dscript) {
- swfdec_debug_script_set_model (debug);
- } else {
- gtk_tree_view_set_model (GTK_TREE_VIEW (debug), NULL);
- }
-}
-
diff --git a/player/swfdec_debug_script.h b/player/swfdec_debug_script.h
deleted file mode 100644
index 318a3be..0000000
--- a/player/swfdec_debug_script.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* Swfdec
- * Copyright (C) 2006 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
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301 USA
- */
-
-#ifndef _SWFDEC_DEBUG_SCRIPT_H_
-#define _SWFDEC_DEBUG_SCRIPT_H_
-
-#include <gtk/gtk.h>
-#include <swfdec/swfdec_debugger.h>
-
-G_BEGIN_DECLS
-
-typedef struct _SwfdecDebugScript SwfdecDebugScript;
-typedef struct _SwfdecDebugScriptClass SwfdecDebugScriptClass;
-
-#define SWFDEC_TYPE_DEBUG_SCRIPT (swfdec_debug_script_get_type())
-#define SWFDEC_IS_DEBUG_SCRIPT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_DEBUG_SCRIPT))
-#define SWFDEC_IS_DEBUG_SCRIPT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_DEBUG_SCRIPT))
-#define SWFDEC_DEBUG_SCRIPT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_DEBUG_SCRIPT, SwfdecDebugScript))
-#define SWFDEC_DEBUG_SCRIPT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_DEBUG_SCRIPT, SwfdecDebugScriptClass))
-
-struct _SwfdecDebugScript
-{
- GtkTreeView treeview;
-
- SwfdecDebugger * debugger;
- SwfdecDebuggerScript *script;
-};
-
-struct _SwfdecDebugScriptClass
-{
- GtkTreeViewClass treeview_class;
-};
-
-GType swfdec_debug_script_get_type (void);
-
-GtkWidget * swfdec_debug_script_new (SwfdecDebugger * debugger);
-
-void swfdec_debug_script_set_script (SwfdecDebugScript * script,
- SwfdecDebuggerScript * dscript);
-
-G_END_DECLS
-#endif
diff --git a/player/swfdec_debug_scripts.c b/player/swfdec_debug_scripts.c
deleted file mode 100644
index b845f84..0000000
--- a/player/swfdec_debug_scripts.c
+++ /dev/null
@@ -1,150 +0,0 @@
-/* Swfdec
- * Copyright (C) 2006 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
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301 USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "swfdec_debug_scripts.h"
-#include <swfdec/swfdec_script_internal.h>
-
-G_DEFINE_TYPE (SwfdecDebugScripts, swfdec_debug_scripts, GTK_TYPE_TREE_VIEW)
-
-enum {
- COLUMN_SCRIPT,
- COLUMN_NAME,
- N_COLUMNS
-};
-
-static void
-add_row (gpointer scriptp, gpointer storep)
-{
- SwfdecDebuggerScript *script = scriptp;
- GtkListStore *store = storep;
- GtkTreeIter iter;
-
- gtk_list_store_append (store, &iter);
- gtk_list_store_set (store, &iter, COLUMN_SCRIPT, script,
- COLUMN_NAME, script->script->name, -1);
-}
-
-static void
-swfdec_debug_scripts_set_model (SwfdecDebugScripts *debug)
-{
- GtkListStore *store = gtk_list_store_new (N_COLUMNS, G_TYPE_POINTER, G_TYPE_STRING);
-
- swfdec_debugger_foreach_script (debug->debugger, add_row, store);
- gtk_tree_view_set_model (GTK_TREE_VIEW (debug), GTK_TREE_MODEL (store));
- g_object_unref (store);
-}
-
-static void
-swfdec_debug_scripts_add_script_cb (SwfdecDebugger *debugger,
- SwfdecDebuggerScript *script, SwfdecDebugScripts *debug)
-{
- add_row (script, gtk_tree_view_get_model (GTK_TREE_VIEW (debug)));
-}
-
-static void
-swfdec_debug_scripts_remove_script_cb (SwfdecDebugger *debugger,
- SwfdecDebuggerScript *script, SwfdecDebugScripts *debug)
-{
- GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (debug));
- GtkTreeIter iter;
-
- gtk_tree_model_get_iter_first (model, &iter);
- do {
- gpointer p;
- gtk_tree_model_get (model, &iter, COLUMN_SCRIPT, &p, -1);
- if (p == script) {
- gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
- return;
- }
- } while (gtk_tree_model_iter_next (model, &iter));
- g_assert_not_reached ();
-}
-
-static void
-swfdec_debug_scripts_set_debugger (SwfdecDebugScripts *debug, SwfdecDebugger *debugger)
-{
- if (debug->debugger) {
- g_signal_handlers_disconnect_by_func (debug->debugger, swfdec_debug_scripts_remove_script_cb, debug);
- g_signal_handlers_disconnect_by_func (debug->debugger, swfdec_debug_scripts_add_script_cb, debug);
- }
- debug->debugger = debugger;
- if (debugger) {
- g_signal_connect (debugger, "script-added", G_CALLBACK (swfdec_debug_scripts_add_script_cb), debug);
- g_signal_connect (debugger, "script-removed", G_CALLBACK (swfdec_debug_scripts_remove_script_cb), debug);
- swfdec_debug_scripts_set_model (debug);
- } else {
- gtk_tree_view_set_model (GTK_TREE_VIEW (debug), NULL);
- }
-}
-
-static void
-swfdec_debug_scripts_dispose (GObject *object)
-{
- SwfdecDebugScripts *debug = SWFDEC_DEBUG_SCRIPTS (object);
-
- swfdec_debug_scripts_set_debugger (debug, NULL);
-
- G_OBJECT_CLASS (swfdec_debug_scripts_parent_class)->dispose (object);
-}
-
-static void
-swfdec_debug_scripts_class_init (SwfdecDebugScriptsClass * g_class)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (g_class);
-
- object_class->dispose = swfdec_debug_scripts_dispose;
-}
-
-static void
-swfdec_debug_scripts_init (SwfdecDebugScripts * debug)
-{
-}
-
-static void
-swfdec_debug_scripts_add_columns (GtkTreeView *treeview)
-{
- GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
-
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Script", renderer,
- "text", COLUMN_NAME, NULL);
- gtk_tree_view_column_set_sort_column_id (column, COLUMN_NAME);
- gtk_tree_view_column_set_resizable (column, TRUE);
- gtk_tree_view_append_column (treeview, column);
-}
-
-GtkWidget *
-swfdec_debug_scripts_new (SwfdecDebugger *debugger)
-{
- SwfdecDebugScripts *debug;
-
- g_return_val_if_fail (SWFDEC_IS_DEBUGGER (debugger), NULL);
-
- debug = g_object_new (SWFDEC_TYPE_DEBUG_SCRIPTS, 0);
- swfdec_debug_scripts_add_columns (GTK_TREE_VIEW (debug));
- swfdec_debug_scripts_set_debugger (debug, debugger);
-
- return GTK_WIDGET (debug);
-}
-
diff --git a/player/swfdec_debug_scripts.h b/player/swfdec_debug_scripts.h
deleted file mode 100644
index bfb65ff..0000000
--- a/player/swfdec_debug_scripts.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* Swfdec
- * Copyright (C) 2006 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
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301 USA
- */
-
-#ifndef _SWFDEC_DEBUG_SCRIPTS_H_
-#define _SWFDEC_DEBUG_SCRIPTS_H_
-
-#include <gtk/gtk.h>
-#include <swfdec/swfdec_debugger.h>
-
-G_BEGIN_DECLS
-
-typedef struct _SwfdecDebugScripts SwfdecDebugScripts;
-typedef struct _SwfdecDebugScriptsClass SwfdecDebugScriptsClass;
-
-#define SWFDEC_TYPE_DEBUG_SCRIPTS (swfdec_debug_scripts_get_type())
-#define SWFDEC_IS_DEBUG_SCRIPTS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_DEBUG_SCRIPTS))
-#define SWFDEC_IS_DEBUG_SCRIPTS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_DEBUG_SCRIPTS))
-#define SWFDEC_DEBUG_SCRIPTS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_DEBUG_SCRIPTS, SwfdecDebugScripts))
-#define SWFDEC_DEBUG_SCRIPTS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_DEBUG_SCRIPTS, SwfdecDebugScriptsClass))
-
-struct _SwfdecDebugScripts
-{
- GtkTreeView treeview;
-
- SwfdecDebugger * debugger;
-};
-
-struct _SwfdecDebugScriptsClass
-{
- GtkTreeViewClass treeview_class;
-};
-
-GType swfdec_debug_scripts_get_type (void);
-
-GtkWidget * swfdec_debug_scripts_new (SwfdecDebugger * debugger);
-
-
-G_END_DECLS
-#endif
diff --git a/player/swfdec_debug_stack.c b/player/swfdec_debug_stack.c
deleted file mode 100644
index 452ec0b..0000000
--- a/player/swfdec_debug_stack.c
+++ /dev/null
@@ -1,180 +0,0 @@
-/* Swfdec
- * Copyright (C) 2006 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
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301 USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <swfdec/swfdec.h>
-#include "swfdec_debug_stack.h"
-
-G_DEFINE_TYPE (SwfdecDebugStack, swfdec_debug_stack, GTK_TYPE_TREE_VIEW)
-
-enum {
- COLUMN_LINE,
- COLUMN_TYPE,
- COLUMN_CONTENT,
- N_COLUMNS
-};
-
-static const char *
-swfdec_get_value_type (SwfdecAsContext *cx, SwfdecAsValue *value)
-{
- switch (value->type) {
- case SWFDEC_AS_TYPE_UNDEFINED:
- return "undefined";
- case SWFDEC_AS_TYPE_NULL:
- return "null";
- case SWFDEC_AS_TYPE_NUMBER:
- return "Number";
- case SWFDEC_AS_TYPE_BOOLEAN:
- return "Boolean";
- case SWFDEC_AS_TYPE_STRING:
- return "String";
- case SWFDEC_AS_TYPE_OBJECT:
- /* FIXME: improve */
- return "Object";
- default:
- g_assert_not_reached ();
- return NULL;
- }
-}
-
-static void
-swfdec_debug_stack_set_model (SwfdecDebugStack *debug)
-{
- SwfdecAsContext *context;
- SwfdecAsFrame *frame;
- GtkListStore *store = gtk_list_store_new (N_COLUMNS, G_TYPE_UINT,
- G_TYPE_STRING, G_TYPE_STRING);
- GtkTreeIter iter;
- char *s;
-
- context= SWFDEC_AS_CONTEXT (debug->manager->player);
- frame = swfdec_as_context_get_frame (context);
- if (frame) {
- SwfdecAsStackIterator siter;
- SwfdecAsValue *val;
- guint i = 0;
- for (val = swfdec_as_stack_iterator_init (&siter, frame); val;
- val = swfdec_as_stack_iterator_next (&siter)) {
- s = swfdec_as_value_to_debug (val);
- gtk_list_store_append (store, &iter);
- gtk_list_store_set (store, &iter, COLUMN_LINE, ++i,
- COLUMN_TYPE, swfdec_get_value_type (SWFDEC_AS_CONTEXT (debug->manager->player), val),
- COLUMN_CONTENT, s, -1);
- g_free (s);
- }
- }
-
- gtk_tree_view_set_model (GTK_TREE_VIEW (debug), GTK_TREE_MODEL (store));
- g_object_unref (store);
-}
-
-static void
-update_stack_cb (SwfdecPlayerManager *manager, GParamSpec *pspec, SwfdecDebugStack *debug)
-{
- if (swfdec_player_manager_get_interrupted (manager))
- swfdec_debug_stack_set_model (debug);
- else
- gtk_tree_view_set_model (GTK_TREE_VIEW (debug), NULL);
-}
-
-static void
-swfdec_debug_stack_set_manager (SwfdecDebugStack *debug, SwfdecPlayerManager *manager)
-{
- if (debug->manager) {
- g_signal_handlers_disconnect_by_func (debug->manager, update_stack_cb, debug);
- g_object_unref (debug->manager);
- }
- debug->manager = manager;
- if (manager) {
- g_object_ref (debug->manager);
- g_signal_connect (manager, "notify::interrupted", G_CALLBACK (update_stack_cb), debug);
- update_stack_cb (manager, NULL, debug);
- } else {
- gtk_tree_view_set_model (GTK_TREE_VIEW (debug), NULL);
- }
-}
-
-static void
-swfdec_debug_stack_dispose (GObject *object)
-{
- SwfdecDebugStack *debug = SWFDEC_DEBUG_STACK (object);
-
- swfdec_debug_stack_set_manager (debug, NULL);
-
- G_OBJECT_CLASS (swfdec_debug_stack_parent_class)->dispose (object);
-}
-
-static void
-swfdec_debug_stack_class_init (SwfdecDebugStackClass * g_class)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (g_class);
-
- object_class->dispose = swfdec_debug_stack_dispose;
-}
-
-static void
-swfdec_debug_stack_init (SwfdecDebugStack * debug)
-{
-}
-
-static void
-swfdec_debug_stack_add_columns (GtkTreeView *treeview)
-{
- GtkTreeViewColumn *column;
- GtkCellRenderer *renderer;
-
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Depth", renderer,
- "text", COLUMN_LINE, NULL);
- gtk_tree_view_column_set_sort_column_id (column, COLUMN_LINE);
- gtk_tree_view_column_set_resizable (column, TRUE);
- gtk_tree_view_append_column (treeview, column);
-
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Type", renderer,
- "text", COLUMN_TYPE, NULL);
- gtk_tree_view_column_set_sort_column_id (column, COLUMN_TYPE);
- gtk_tree_view_column_set_resizable (column, TRUE);
- gtk_tree_view_append_column (treeview, column);
-
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("Content", renderer,
- "text", COLUMN_CONTENT, NULL);
- gtk_tree_view_column_set_sort_column_id (column, COLUMN_CONTENT);
- gtk_tree_view_column_set_resizable (column, TRUE);
- gtk_tree_view_append_column (treeview, column);
-}
-
-GtkWidget *
-swfdec_debug_stack_new (SwfdecPlayerManager *manager)
-{
- SwfdecDebugStack *debug;
-
- g_return_val_if_fail (SWFDEC_IS_PLAYER_MANAGER (manager), NULL);
-
- debug = g_object_new (SWFDEC_TYPE_DEBUG_STACK, 0);
- swfdec_debug_stack_add_columns (GTK_TREE_VIEW (debug));
- swfdec_debug_stack_set_manager (debug, manager);
-
- return GTK_WIDGET (debug);
-}
-
diff --git a/player/swfdec_debug_stack.h b/player/swfdec_debug_stack.h
deleted file mode 100644
index b386c1f..0000000
--- a/player/swfdec_debug_stack.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Swfdec
- * Copyright (C) 2006 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
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301 USA
- */
-
-#ifndef _SWFDEC_DEBUG_STACK_H_
-#define _SWFDEC_DEBUG_STACK_H_
-
-#include <gtk/gtk.h>
-#include "swfdec_player_manager.h"
-
-G_BEGIN_DECLS
-
-typedef struct _SwfdecDebugStack SwfdecDebugStack;
-typedef struct _SwfdecDebugStackClass SwfdecDebugStackClass;
-
-#define SWFDEC_TYPE_DEBUG_STACK (swfdec_debug_stack_get_type())
-#define SWFDEC_IS_DEBUG_STACK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_DEBUG_STACK))
-#define SWFDEC_IS_DEBUG_STACK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_DEBUG_STACK))
-#define SWFDEC_DEBUG_STACK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_DEBUG_STACK, SwfdecDebugStack))
-#define SWFDEC_DEBUG_STACK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_DEBUG_STACK, SwfdecDebugStackClass))
-
-struct _SwfdecDebugStack
-{
- GtkTreeView treeview;
-
- SwfdecPlayerManager * manager;
-};
-
-struct _SwfdecDebugStackClass
-{
- GtkTreeViewClass treeview_class;
-};
-
-GType swfdec_debug_stack_get_type (void);
-
-GtkWidget * swfdec_debug_stack_new (SwfdecPlayerManager * manager);
-
-G_END_DECLS
-#endif
diff --git a/player/swfdec_player_manager.c b/player/swfdec_player_manager.c
deleted file mode 100644
index 9d67709..0000000
--- a/player/swfdec_player_manager.c
+++ /dev/null
@@ -1,673 +0,0 @@
-/* Swfdec
- * Copyright (C) 2006 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
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301 USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include <swfdec/swfdec_debugger.h>
-#include <swfdec/swfdec_as_object.h>
-#include "swfdec_player_manager.h"
-#include <swfdec/swfdec_script_internal.h>
-#include <swfdec-gtk/swfdec_source.h>
-
-enum {
- PROP_0,
- PROP_PLAYING,
- PROP_SPEED,
- PROP_INTERRUPTED
-};
-
-enum {
- MESSAGE,
- LAST_SIGNAL
-};
-guint signals[LAST_SIGNAL];
-
-/*** command handling ***/
-
-typedef enum {
- SWFDEC_MESSAGE_INPUT,
- SWFDEC_MESSAGE_OUTPUT,
- SWFDEC_MESSAGE_ERROR
-} SwfdecMessageType;
-
-static void
-swfdec_player_manager_send_message (SwfdecPlayerManager *manager,
- SwfdecMessageType type, const char *format, ...) G_GNUC_PRINTF (3, 4);
-static void
-swfdec_player_manager_send_message (SwfdecPlayerManager *manager,
- SwfdecMessageType type, const char *format, ...)
-{
- va_list args;
- char *msg;
-
- va_start (args, format);
- msg = g_strdup_vprintf (format, args);
- va_end (args);
- g_signal_emit (manager, signals[MESSAGE], 0, (guint) type, msg);
- g_free (msg);
-}
-#define swfdec_player_manager_output(manager, ...) \
- swfdec_player_manager_send_message (manager, SWFDEC_MESSAGE_OUTPUT, __VA_ARGS__)
-#define swfdec_player_manager_error(manager, ...) \
- swfdec_player_manager_send_message (manager, SWFDEC_MESSAGE_ERROR, __VA_ARGS__)
-
-/*** SWFDEC_PLAYER_MANAGER ***/
-
-G_DEFINE_TYPE (SwfdecPlayerManager, swfdec_player_manager, G_TYPE_OBJECT)
-
-static void
-swfdec_player_manager_get_property (GObject *object, guint param_id, GValue *value,
- GParamSpec * pspec)
-{
- SwfdecPlayerManager *manager = SWFDEC_PLAYER_MANAGER (object);
-
- switch (param_id) {
- case PROP_PLAYING:
- g_value_set_boolean (value, swfdec_player_manager_get_playing (manager));
- break;
- case PROP_SPEED:
- g_value_set_double (value, swfdec_player_manager_get_speed (manager));
- break;
- case PROP_INTERRUPTED:
- g_value_set_boolean (value, swfdec_player_manager_get_interrupted (manager));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- }
-}
-
-static void
-swfdec_player_manager_set_property (GObject *object, guint param_id, const GValue *value,
- GParamSpec *pspec)
-{
- SwfdecPlayerManager *manager = SWFDEC_PLAYER_MANAGER (object);
-
- switch (param_id) {
- case PROP_PLAYING:
- swfdec_player_manager_set_playing (manager, g_value_get_boolean (value));
- break;
- case PROP_SPEED:
- swfdec_player_manager_set_speed (manager, g_value_get_double (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- }
-}
-
-static void breakpoint_hit_cb (SwfdecDebugger *debugger, guint id, SwfdecPlayerManager *manager);
-
-static void
-trace_cb (SwfdecPlayer *player, const char *str, SwfdecPlayerManager *manager)
-{
- swfdec_player_manager_output (manager, "Trace: %s", str);
-}
-
-static void
-swfdec_player_manager_set_player (SwfdecPlayerManager *manager, SwfdecPlayer *player)
-{
- if (manager->player == player)
- return;
-
- if (manager->player) {
- g_signal_handlers_disconnect_by_func (manager->player, breakpoint_hit_cb, manager);
- g_signal_handlers_disconnect_by_func (manager->player, trace_cb, manager);
- g_object_unref (manager->player);
- }
- manager->player = player;
- if (player) {
- g_object_ref (player);
- g_signal_connect (player, "breakpoint", G_CALLBACK (breakpoint_hit_cb), manager);
- g_signal_connect (player, "trace", G_CALLBACK (trace_cb), manager);
- }
-}
-
-static void
-swfdec_player_manager_dispose (GObject *object)
-{
- SwfdecPlayerManager *manager = SWFDEC_PLAYER_MANAGER (object);
-
- swfdec_player_manager_set_playing (manager, FALSE);
- swfdec_player_manager_set_player (manager, FALSE);
-
- G_OBJECT_CLASS (swfdec_player_manager_parent_class)->dispose (object);
-}
-
-static void
-swfdec_player_manager_class_init (SwfdecPlayerManagerClass * g_class)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (g_class);
-
- object_class->dispose = swfdec_player_manager_dispose;
- object_class->set_property = swfdec_player_manager_set_property;
- object_class->get_property = swfdec_player_manager_get_property;
-
- g_object_class_install_property (object_class, PROP_SPEED,
- g_param_spec_double ("speed", "speed", "playback speed of movie",
- G_MINDOUBLE, 16.0, 1.0, G_PARAM_READWRITE));
- g_object_class_install_property (object_class, PROP_PLAYING,
- g_param_spec_boolean ("playing", "playing", "if the movie is played back",
- FALSE, G_PARAM_READWRITE));
- g_object_class_install_property (object_class, PROP_INTERRUPTED,
- g_param_spec_boolean ("interrupted", "interrupted", "TRUE if we're handling a breakpoint",
- FALSE, G_PARAM_READABLE));
-
- signals[MESSAGE] = g_signal_new ("message", G_TYPE_FROM_CLASS (g_class),
- G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__UINT_POINTER, /* FIXME */
- G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_POINTER);
-}
-
-static void
-swfdec_player_manager_init (SwfdecPlayerManager *manager)
-{
- manager->speed = 1.0;
-}
-
-SwfdecPlayerManager *
-swfdec_player_manager_new (SwfdecPlayer *player)
-{
- SwfdecPlayerManager *manager;
-
- g_return_val_if_fail (player == NULL || SWFDEC_IS_PLAYER (player), NULL);
-
- manager = g_object_new (SWFDEC_TYPE_PLAYER_MANAGER, 0);
- swfdec_player_manager_set_player (manager, player);
-
- return manager;
-}
-
-void
-swfdec_player_manager_set_speed (SwfdecPlayerManager *manager, double speed)
-{
- g_return_if_fail (SWFDEC_IS_PLAYER_MANAGER (manager));
- g_return_if_fail (speed > 0.0);
-
- if (manager->speed == speed)
- return;
- if (manager->source) {
- swfdec_player_manager_set_playing (manager, FALSE);
- manager->speed = speed;
- swfdec_player_manager_set_playing (manager, TRUE);
- } else {
- manager->speed = speed;
- }
- g_object_notify (G_OBJECT (manager), "speed");
-}
-
-double
-swfdec_player_manager_get_speed (SwfdecPlayerManager *manager)
-{
- g_return_val_if_fail (SWFDEC_IS_PLAYER_MANAGER (manager), 1.0);
-
- return manager->speed;
-}
-
-gboolean
-swfdec_player_manager_get_interrupted (SwfdecPlayerManager *manager)
-{
- g_return_val_if_fail (SWFDEC_IS_PLAYER_MANAGER (manager), FALSE);
-
- return manager->interrupt_loop != NULL;
-}
-
-void
-swfdec_player_manager_get_interrupt (SwfdecPlayerManager *manager,
- SwfdecDebuggerScript **script, guint *line)
-{
- g_return_if_fail (SWFDEC_IS_PLAYER_MANAGER (manager));
- g_return_if_fail (swfdec_player_manager_get_interrupted (manager));
-
- if (script)
- *script = manager->interrupt_script;
- if (line)
- *line = manager->interrupt_line;
-}
-
-static void
-swfdec_player_manager_update_playing (SwfdecPlayerManager *manager)
-{
- gboolean should_have_source = manager->playing &&
- !swfdec_player_manager_get_interrupted (manager);
-
- if (should_have_source && manager->source == NULL) {
- manager->source = swfdec_iterate_source_new (manager->player, manager->speed);
- g_source_attach (manager->source, NULL);
- } else if (!should_have_source && manager->source != NULL) {
- g_source_destroy (manager->source);
- g_source_unref (manager->source);
- manager->source = NULL;
- }
-}
-
-void
-swfdec_player_manager_set_playing (SwfdecPlayerManager *manager, gboolean playing)
-{
- g_return_if_fail (SWFDEC_IS_PLAYER_MANAGER (manager));
-
- if (manager->playing == playing)
- return;
- manager->playing = playing;
- swfdec_player_manager_update_playing (manager);
- g_object_notify (G_OBJECT (manager), "playing");
-}
-
-gboolean
-swfdec_player_manager_get_playing (SwfdecPlayerManager *manager)
-{
- g_return_val_if_fail (SWFDEC_IS_PLAYER_MANAGER (manager), FALSE);
-
- return manager->playing;
-}
-
-guint
-swfdec_player_manager_iterate (SwfdecPlayerManager *manager)
-{
- guint msecs;
-
- g_return_val_if_fail (SWFDEC_IS_PLAYER_MANAGER (manager), 0);
- g_return_val_if_fail (!swfdec_player_manager_get_interrupted (manager), 0);
-
- swfdec_player_manager_set_playing (manager, FALSE);
- msecs = swfdec_player_get_next_event (manager->player);
- if (msecs)
- swfdec_player_advance (manager->player, msecs);
-
- return msecs;
-}
-
-static void
-swfdec_player_manager_do_interrupt (SwfdecPlayerManager *manager)
-{
- swfdec_debugger_set_stepping (SWFDEC_DEBUGGER (manager->player), FALSE);
- g_object_ref (manager);
- manager->interrupt_loop = g_main_loop_new (NULL, FALSE);
- swfdec_player_manager_update_playing (manager);
- g_object_notify (G_OBJECT (manager), "interrupted");
- g_main_loop_run (manager->interrupt_loop);
- g_main_loop_unref (manager->interrupt_loop);
- manager->interrupt_loop = NULL;
- g_object_notify (G_OBJECT (manager), "interrupted");
- swfdec_player_manager_update_playing (manager);
- g_object_unref (manager);
-}
-
-void
-swfdec_player_manager_next (SwfdecPlayerManager *manager)
-{
- g_return_if_fail (SWFDEC_IS_PLAYER_MANAGER (manager));
- g_return_if_fail (swfdec_player_manager_get_interrupted (manager));
-
- swfdec_debugger_set_stepping (SWFDEC_DEBUGGER (manager->player), TRUE);
- swfdec_player_manager_continue (manager);
-}
-
-void
-swfdec_player_manager_continue (SwfdecPlayerManager *manager)
-{
- g_return_if_fail (SWFDEC_IS_PLAYER_MANAGER (manager));
- g_return_if_fail (swfdec_player_manager_get_interrupted (manager));
-
- g_main_loop_quit (manager->interrupt_loop);
-}
-
-/*** commands ***/
-
-static const char *
-parse_skip (const char *input)
-{
- g_assert (input);
- if (g_ascii_isspace (*input))
- input++;
- return input;
-}
-
-static const char *
-parse_string (const char *input, char **output)
-{
- const char *start = input;
-
- g_assert (output);
- if (input == NULL)
- return NULL;
-
- while (*input && !g_ascii_isspace (*input))
- input++;
- if (input == start)
- return NULL;
- *output = g_strndup (start, input - start);
- return parse_skip (input);
-}
-
-static const char *
-parse_uint (const char *input, guint *output)
-{
- char *end;
- guint result;
-
- g_assert (output);
- if (input == NULL)
- return NULL;
-
- result = strtoul (input, &end, 10);
- if (input == end || (*end != '\0' && !g_ascii_isspace (*end)))
- return NULL;
- *output = result;
- return parse_skip (end);
-}
-
-static void
-breakpoint_hit_cb (SwfdecDebugger *debugger, guint id, SwfdecPlayerManager *manager)
-{
- if (id == 0) {
- if (!swfdec_debugger_get_current (debugger,
- &manager->interrupt_script, &manager->interrupt_line)) {
- g_assert_not_reached ();
- }
- } else {
- if (!swfdec_debugger_get_breakpoint (debugger, id,
- &manager->interrupt_script, &manager->interrupt_line)) {
- g_assert_not_reached ();
- }
- swfdec_player_manager_output (manager, "Breakpoint %u", id);
- }
- swfdec_player_manager_do_interrupt (manager);
-}
-
-static void
-command_run (SwfdecPlayerManager *manager, const char *arg)
-{
- const char *s;
-
- if (arg == NULL) {
- swfdec_player_manager_error (manager, "Must give something to run");
- }
- s = swfdec_debugger_run (SWFDEC_DEBUGGER (manager->player), arg);
- if (s)
- swfdec_player_manager_output (manager, "%s", s);
- else
- swfdec_player_manager_error (manager, "Error running given command");
-}
-
-static void
-command_play (SwfdecPlayerManager *manager, const char *arg)
-{
- swfdec_player_manager_set_playing (manager, TRUE);
-}
-
-static void
-command_stop (SwfdecPlayerManager *manager, const char *arg)
-{
- swfdec_player_manager_set_playing (manager, FALSE);
-}
-
-static void
-command_iterate (SwfdecPlayerManager *manager, const char *arg)
-{
- guint msecs = swfdec_player_manager_iterate (manager);
-
- if (msecs == 0) {
- swfdec_player_manager_error (manager, "Cannot iterate this player");
- } else {
- swfdec_player_manager_error (manager, "advanced player %u.%03us",
- msecs / 1000, msecs % 1000);
- }
-}
-
-static void
-command_continue (SwfdecPlayerManager *manager, const char *arg)
-{
- if (swfdec_player_manager_get_interrupted (manager))
- swfdec_player_manager_continue (manager);
- else
- swfdec_player_manager_error (manager, "Not interrupted, cannot continue");
-}
-
-static void
-command_next (SwfdecPlayerManager *manager, const char *arg)
-{
- if (!swfdec_player_manager_get_interrupted (manager))
- swfdec_player_manager_error (manager, "Not interrupted, cannot continue");
- else
- swfdec_player_manager_next (manager);
-}
-
-static void
-set_breakpoint (gpointer scriptp, gpointer debugger)
-{
- SwfdecDebuggerScript *script = scriptp;
-
- if (script->n_commands > 0)
- swfdec_debugger_set_breakpoint (debugger, script, 0);
-}
-
-static void
-command_break (SwfdecPlayerManager *manager, const char *arg)
-{
- char *str;
- const char *next;
- guint line;
-
- next = parse_uint (arg, &line);
- if (next) {
- if (swfdec_player_manager_get_interrupted (manager)) {
- if (line < manager->interrupt_script->n_commands) {
- guint id = swfdec_debugger_set_breakpoint (SWFDEC_DEBUGGER (manager->player),
- manager->interrupt_script, line);
- swfdec_player_manager_output (manager, "%u: %s line %u: %s",
- id, manager->interrupt_script->script->name, line,
- manager->interrupt_script->commands[line].description);
- } else {
- swfdec_player_manager_error (manager,
- "Can't set breakpoint at line %u, script only has %u lines",
- line, manager->interrupt_script->n_commands);
- }
- } else {
- swfdec_player_manager_error (manager, "Not interrupted");
- }
- return;
- }
- next = parse_string (arg, &str);
- if (next) {
- if (g_ascii_strcasecmp (str, "start") == 0) {
- swfdec_debugger_foreach_script (SWFDEC_DEBUGGER (manager->player),
- set_breakpoint, manager->player);
- swfdec_player_manager_output (manager, "set breakpoint at start of every script");
- } else {
- swfdec_player_manager_error (manager, "FIXME: implement");
- }
- }
-}
-
-static void
-command_breakpoints (SwfdecPlayerManager *manager, const char *arg)
-{
- guint i, n, line;
- SwfdecDebugger *debugger;
- SwfdecDebuggerScript *script;
-
- debugger = SWFDEC_DEBUGGER (manager->player);
- n = swfdec_debugger_get_n_breakpoints (debugger);
- for (i = 1; i <= n; i++) {
- if (swfdec_debugger_get_breakpoint (debugger, i, &script, &line)) {
- swfdec_player_manager_output (manager, "%u: %s line %u: %s",
- i, script->script->name, line, script->commands[line].description);
- }
- }
-}
-
-static void
-command_delete (SwfdecPlayerManager *manager, const char *arg)
-{
- guint id;
-
- if (arg == NULL) {
- guint i, n;
- SwfdecDebugger *debugger = SWFDEC_DEBUGGER (manager->player);
- n = swfdec_debugger_get_n_breakpoints (debugger);
- for (i = 1; i <= n; i++) {
- swfdec_debugger_unset_breakpoint (debugger, i);
- }
- } else if (parse_uint (arg, &id)) {
- swfdec_debugger_unset_breakpoint (SWFDEC_DEBUGGER (manager->player), id);
- } else {
- swfdec_player_manager_error (manager, "no breakpoint '%s'", arg);
- }
-}
-
-typedef struct {
- SwfdecPlayerManager *manager;
- const char * string;
-} FindData;
-
-static void
-do_find (gpointer scriptp, gpointer datap)
-{
- SwfdecDebuggerScript *script = scriptp;
- FindData *data = datap;
- guint i;
-
- for (i = 0; i < script->n_commands; i++) {
- if (strstr (script->commands[i].description, data->string)) {
- swfdec_player_manager_output (data->manager, "%s %u: %s",
- script->script->name, i, script->commands[i].description);
- }
- }
-}
-
-static void
-command_find (SwfdecPlayerManager *manager, const char *arg)
-{
- FindData data = { manager, arg };
- if (arg == NULL) {
- swfdec_player_manager_error (manager, "What should be found?");
- }
- swfdec_debugger_foreach_script (SWFDEC_DEBUGGER (manager->player), do_find, &data);
-}
-
-static gboolean
-enumerate_foreach (SwfdecAsObject *object, const char *variable,
- SwfdecAsValue *value, guint flags, gpointer manager)
-{
- char *s;
-
- s = swfdec_as_value_to_debug (value);
- swfdec_player_manager_output (manager, " %s: %s", variable, s);
- g_free (s);
-
- return TRUE;
-}
-
-static void
-command_enumerate (SwfdecPlayerManager *manager, const char *arg)
-{
- SwfdecAsValue val;
- char *s;
- SwfdecAsObject *object;
-
- if (arg == NULL)
- return;
-
- swfdec_as_context_eval (SWFDEC_AS_CONTEXT (manager->player), NULL, arg, &val);
- s = swfdec_as_value_to_debug (&val);
- swfdec_player_manager_output (manager, "%s", s);
- g_free (s);
- if (!SWFDEC_AS_VALUE_IS_OBJECT (&val))
- return;
- object = SWFDEC_AS_VALUE_GET_OBJECT (&val);
- swfdec_as_object_foreach (object, enumerate_foreach, manager);
-}
-
-static void
-command_where (SwfdecPlayerManager *manager, const char *arg)
-{
- SwfdecAsFrame *frame;
- guint i = 0;
-
- for (frame = swfdec_as_context_get_frame (SWFDEC_AS_CONTEXT (manager->player)); frame;
- frame = swfdec_as_frame_get_next (frame)) {
- char *s = swfdec_as_object_get_debug (SWFDEC_AS_OBJECT (frame));
- i++;
- swfdec_player_manager_output (manager, "%u: %s", i, s);
- g_free (s);
- }
-}
-
-static void command_help (SwfdecPlayerManager *manager, const char *arg);
-/* NB: the first word in the command string is used, partial matches are ok */
-struct {
- const char * name;
- void (* func) (SwfdecPlayerManager *manager, const char *arg);
- const char * description;
-} commands[] = {
- { "help", command_help, "print all available commands and a quick description" },
- { "run", command_run, "run the argument as a JavaScript script" },
- { "play", command_play, "play the movie" },
- { "stop", command_stop, "stop the movie" },
- { "iterate", command_iterate, "iterate the movie once" },
- { "break", command_break, "add breakpoint at [start]" },
- { "breakpoints", command_breakpoints, "show all breakpoints" },
- { "delete", command_delete, "delete a breakpoint" },
- { "continue", command_continue, "continue when stopped inside a breakpoint" },
- { "next", command_next, "step forward one command when stopped inside a breakpoint" },
- { "find", command_find, "find the given argument verbatim in all scripts" },
- { "enumerate",command_enumerate, "enumerate all properties of the given object" },
- { "where", command_where, "print a backtrace" },
-};
-
-static void
-command_help (SwfdecPlayerManager *manager, const char *arg)
-{
- guint i;
- swfdec_player_manager_output (manager, "The following commands are available:");
- for (i = 0; i < G_N_ELEMENTS (commands); i++) {
- swfdec_player_manager_output (manager, "%s: %s", commands[i].name, commands[i].description);
- }
-}
-
-void
-swfdec_player_manager_execute (SwfdecPlayerManager *manager, const char *command)
-{
- guint i;
- const char *args;
- char *run;
-
- g_return_if_fail (SWFDEC_IS_PLAYER_MANAGER (manager));
- g_return_if_fail (command != NULL);
-
- parse_skip (command);
- swfdec_player_manager_send_message (manager, SWFDEC_MESSAGE_INPUT, "%s", command);
- args = parse_string (command, &run);
- if (args == NULL)
- return;
- for (i = 0; i < G_N_ELEMENTS(commands); i++) {
- if (g_ascii_strncasecmp (commands[i].name, run, strlen (run)) == 0) {
- commands[i].func (manager, *args == '\0' ? NULL : args);
- g_free (run);
- return;
- }
- }
- swfdec_player_manager_error (manager, "No such command '%s'", run);
- g_free (run);
-}
-
diff --git a/player/swfdec_player_manager.h b/player/swfdec_player_manager.h
deleted file mode 100644
index 31e99a4..0000000
--- a/player/swfdec_player_manager.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/* Swfdec
- * Copyright (C) 2006 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
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301 USA
- */
-
-#ifndef _SWFDEC_PLAYER_MANAGER_H_
-#define _SWFDEC_PLAYER_MANAGER_H_
-
-#include <gtk/gtk.h>
-#include <swfdec/swfdec.h>
-#include <swfdec/swfdec_debugger.h>
-
-G_BEGIN_DECLS
-
-typedef struct _SwfdecPlayerManager SwfdecPlayerManager;
-typedef struct _SwfdecPlayerManagerClass SwfdecPlayerManagerClass;
-
-#define SWFDEC_TYPE_PLAYER_MANAGER (swfdec_player_manager_get_type())
-#define SWFDEC_IS_PLAYER_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_PLAYER_MANAGER))
-#define SWFDEC_IS_PLAYER_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_PLAYER_MANAGER))
-#define SWFDEC_PLAYER_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_PLAYER_MANAGER, SwfdecPlayerManager))
-#define SWFDEC_PLAYER_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_PLAYER_MANAGER, SwfdecPlayerManagerClass))
-
-struct _SwfdecPlayerManager
-{
- GObject object;
-
- SwfdecPlayer * player; /* the video we play */
- GSource * source; /* the source that is ticking */
- double speed; /* speed of playback */
- gboolean playing; /* if we should be playing */
- SwfdecDebuggerScript *interrupt_script; /* script that caused the interrupt */
- guint interrupt_line; /* line in script that caused the interrupt */
- GMainLoop * interrupt_loop; /* loop we run during an interruption */
- guint next_id; /* id of breakpoint for "next" command */
-};
-
-struct _SwfdecPlayerManagerClass
-{
- GObjectClass object_class;
-};
-
-GType swfdec_player_manager_get_type (void);
-
-SwfdecPlayerManager *
- swfdec_player_manager_new (SwfdecPlayer * player);
-
-void swfdec_player_manager_set_speed (SwfdecPlayerManager * manager,
- double speed);
-double swfdec_player_manager_get_speed (SwfdecPlayerManager * manager);
-void swfdec_player_manager_set_playing (SwfdecPlayerManager * manager,
- gboolean playing);
-gboolean swfdec_player_manager_get_playing (SwfdecPlayerManager * manager);
-gboolean swfdec_player_manager_get_interrupted (SwfdecPlayerManager * manager);
-
-guint swfdec_player_manager_iterate (SwfdecPlayerManager * manager);
-
-void swfdec_player_manager_continue (SwfdecPlayerManager * manager);
-void swfdec_player_manager_next (SwfdecPlayerManager * manager);
-void swfdec_player_manager_get_interrupt (SwfdecPlayerManager * manager,
- SwfdecDebuggerScript **script,
- guint * line);
-
-void swfdec_player_manager_execute (SwfdecPlayerManager * manager,
- const char * command);
-
-G_END_DECLS
-#endif
commit 72968282baa314e05756fc2f5e1f6ecac3e3cef4
Author: Benjamin Otte <otte at gnome.org>
Date: Sat Jun 21 18:26:25 2008 +0200
remove unused code
diff --git a/swfdec/swfdec_movie.c b/swfdec/swfdec_movie.c
index 95e4a81..4779c4e 100644
--- a/swfdec/swfdec_movie.c
+++ b/swfdec/swfdec_movie.c
@@ -182,9 +182,6 @@ swfdec_movie_queue_update (SwfdecMovie *movie, SwfdecMovieCacheState state)
{
g_return_if_fail (SWFDEC_IS_MOVIE (movie));
- if (state > SWFDEC_MOVIE_INVALID_EXTENTS) {
- swfdec_movie_invalidate_next (movie);
- }
while (movie && movie->cache_state < state) {
movie->cache_state = state;
movie = movie->parent;
commit 861a38144734b87a99347b9493cbd7e2200add9e
Author: Benjamin Otte <otte at gnome.org>
Date: Sat Jun 21 18:15:03 2008 +0200
rewrite autoSize code
fixes testsuite failures
diff --git a/swfdec/swfdec_player.c b/swfdec/swfdec_player.c
index eb5f08e..40abb7c 100644
--- a/swfdec/swfdec_player.c
+++ b/swfdec/swfdec_player.c
@@ -1992,6 +1992,19 @@ swfdec_player_unlock_soft (SwfdecPlayer *player)
player->priv->locked = FALSE;
}
+/* This function does all the things that happen during rendering */
+static void
+swfdec_player_pretend_to_render (SwfdecPlayer *player)
+{
+ SwfdecPlayerPrivate *priv = player->priv;
+ GList *walk;
+
+ for (walk = priv->actors; walk; walk = walk->next) {
+ if (SWFDEC_IS_TEXT_FIELD_MOVIE (walk->data))
+ swfdec_text_field_movie_autosize (walk->data);
+ }
+}
+
void
swfdec_player_unlock (SwfdecPlayer *player)
{
@@ -2005,6 +2018,8 @@ swfdec_player_unlock (SwfdecPlayer *player)
context = SWFDEC_AS_CONTEXT (player);
g_return_if_fail (context->state != SWFDEC_AS_CONTEXT_INTERRUPTED);
+ swfdec_player_pretend_to_render (player);
+
if (context->state == SWFDEC_AS_CONTEXT_RUNNING)
swfdec_as_context_maybe_gc (SWFDEC_AS_CONTEXT (player));
swfdec_player_unlock_soft (player);
diff --git a/swfdec/swfdec_text_field_movie.c b/swfdec/swfdec_text_field_movie.c
index 7a26608..0af701b 100644
--- a/swfdec/swfdec_text_field_movie.c
+++ b/swfdec/swfdec_text_field_movie.c
@@ -56,8 +56,9 @@ swfdec_text_field_movie_compute_layout_area (SwfdecTextFieldMovie *text)
tmpy = round ((BORDER_TOP + BORDER_BOTTOM) * SWFDEC_TWIPS_SCALE_FACTOR * text->to_layout.yy);
text->layout_area = text->stage_area;
if (tmpx >= text->layout_area.width ||
- tmpy >= text->layout_area.height)
+ tmpy >= text->layout_area.height) {
return;
+ }
text->layout_area.x += tmpx / 2;
text->layout_area.y += tmpy / 2;
@@ -119,8 +120,8 @@ swfdec_text_field_movie_update_area (SwfdecTextFieldMovie *text)
swfdec_text_layout_set_wrap_width (text->layout, text->layout_area.width);
}
-static void
-swfdec_text_field_movie_auto_size (SwfdecTextFieldMovie *text)
+void
+swfdec_text_field_movie_autosize (SwfdecTextFieldMovie *text)
{
SwfdecMovie *movie = SWFDEC_MOVIE (text);
double x0, z0, x1, z1; /* y0 and y1 are taken by math.h */
@@ -128,15 +129,20 @@ swfdec_text_field_movie_auto_size (SwfdecTextFieldMovie *text)
if (text->auto_size == SWFDEC_AUTO_SIZE_NONE)
return;
- x1 = (double) text->layout_width - text->layout_area.width;
- z1 = (double) text->layout_height - text->layout_area.height;
+ x1 = text->layout_width;
+ z1 = text->layout_height;
+ cairo_matrix_transform_distance (&text->from_layout, &x1, &z1);
+ x1 += (BORDER_LEFT + BORDER_RIGHT) * SWFDEC_TWIPS_SCALE_FACTOR;
+ z1 += (BORDER_TOP + BORDER_BOTTOM) * SWFDEC_TWIPS_SCALE_FACTOR;
+ cairo_matrix_transform_distance (&movie->inverse_matrix, &x1, &z1);
+ x1 -= text->extents.x1 - text->extents.x0;
+ z1 -= text->extents.y1 - text->extents.y0;
if (x1 == 0 && z1 == 0)
return;
- /* FIXME: rounding */
- x1 *= text->from_layout.xx;
- z1 *= text->from_layout.yy;
+ x1 = ceil (x1);
+ z1 = ceil (z1);
switch (text->auto_size) {
case SWFDEC_AUTO_SIZE_LEFT:
@@ -156,11 +162,11 @@ swfdec_text_field_movie_auto_size (SwfdecTextFieldMovie *text)
}
z0 = 0;
- cairo_matrix_transform_distance (&movie->inverse_matrix, &x0, &z0);
+ swfdec_movie_invalidate_next (movie);
+ swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_EXTENTS);
+
text->extents.x0 += x0;
text->extents.y0 += z0;
-
- cairo_matrix_transform_distance (&movie->inverse_matrix, &x1, &z1);
text->extents.x1 += x1;
text->extents.y1 += z1;
@@ -173,19 +179,6 @@ swfdec_text_field_movie_update_extents (SwfdecMovie *movie,
{
SwfdecTextFieldMovie *text = SWFDEC_TEXT_FIELD_MOVIE (movie);
- /* Doing auto-size when invalidating extents is a nasty trick that is
- * supposed to help in calculating the correct size with the same caching
- * algorithm as the official player. Consider the following code:
- * text.autoSize = "left";
- * if (foo)
- * y = text._width;
- * text.autoSize = "right";
- * If foo is set, querying width will cause the autosize to happen, which
- * will cause text to be left-aligned. If foo is not set, autosize doesn't
- * happen until after it's set to right-aligned.
- */
- swfdec_text_field_movie_auto_size (text);
-
swfdec_rect_union (extents, extents, &text->extents);
}
@@ -225,6 +218,7 @@ swfdec_text_field_movie_render (SwfdecMovie *movie, cairo_t *cr,
{
static const cairo_matrix_t identity = { 1, 0, 0, 1, 0, 0 };
SwfdecTextFieldMovie *text = SWFDEC_TEXT_FIELD_MOVIE (movie);
+ SwfdecRectangle *area;
SwfdecColor color;
/* textfields don't mask */
@@ -266,13 +260,13 @@ swfdec_text_field_movie_render (SwfdecMovie *movie, cairo_t *cr,
}
/* render the layout */
- cairo_rectangle (cr, text->layout_area.x, text->layout_area.y,
- text->layout_area.width, text->layout_area.height);
+ area = &text->layout_area;
+ cairo_rectangle (cr, area->x, area->y, area->width, area->height);
cairo_clip (cr);
/* FIXME: This -1 is spacing? */
- cairo_translate (cr, (double) text->layout_area.x - text->hscroll, text->layout_area.y - 1);
+ cairo_translate (cr, (double) area->x - text->hscroll, area->y - 1);
swfdec_text_layout_render (text->layout, cr, ctrans,
- text->scroll, text->layout_area.height, color);
+ text->scroll, area->height, color);
}
static void
@@ -370,8 +364,6 @@ swfdec_text_field_movie_layout_changed (SwfdecTextLayout *layout,
if (w != text->layout_width || h != text->layout_height) {
text->layout_width = w;
text->layout_height = h;
- if (text->auto_size != SWFDEC_AUTO_SIZE_NONE)
- swfdec_movie_queue_update (SWFDEC_MOVIE (text), SWFDEC_MOVIE_INVALID_EXTENTS);
}
swfdec_text_field_movie_update_scroll (text);
@@ -749,15 +741,21 @@ swfdec_text_field_movie_property_get (SwfdecMovie *movie, guint prop_id,
switch (prop_id) {
case SWFDEC_MOVIE_PROPERTY_X:
+ swfdec_text_field_movie_autosize (text);
swfdec_movie_update (movie);
d = SWFDEC_TWIPS_TO_DOUBLE (movie->matrix.x0 + text->extents.x0);
SWFDEC_AS_VALUE_SET_NUMBER (val, d);
return;
case SWFDEC_MOVIE_PROPERTY_Y:
+ swfdec_text_field_movie_autosize (text);
swfdec_movie_update (movie);
d = SWFDEC_TWIPS_TO_DOUBLE (movie->matrix.y0 + text->extents.y0);
SWFDEC_AS_VALUE_SET_NUMBER (val, d);
return;
+ case SWFDEC_MOVIE_PROPERTY_WIDTH:
+ case SWFDEC_MOVIE_PROPERTY_HEIGHT:
+ swfdec_text_field_movie_autosize (text);
+ break;
default:
break;
}
@@ -800,8 +798,10 @@ swfdec_text_field_movie_property_set (SwfdecMovie *movie, guint prop_id,
if (swfdec_as_value_to_twips (cx, val, TRUE, &twips)) {
movie->modified = TRUE;
if (text->extents.x1 != text->extents.x0 + twips) {
- text->extents.x1 = text->extents.x0 + twips;
+ swfdec_movie_invalidate_next (movie);
swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_EXTENTS);
+ text->extents.x1 = text->extents.x0 + twips;
+ swfdec_text_field_movie_update_area (text);
}
}
return;
@@ -810,8 +810,10 @@ swfdec_text_field_movie_property_set (SwfdecMovie *movie, guint prop_id,
if (swfdec_as_value_to_twips (cx, val, TRUE, &twips)) {
movie->modified = TRUE;
if (text->extents.y1 != text->extents.y0 + twips) {
- text->extents.y1 = text->extents.y0 + twips;
+ swfdec_movie_invalidate_next (movie);
swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_EXTENTS);
+ text->extents.y1 = text->extents.y0 + twips;
+ swfdec_text_field_movie_update_area (text);
}
}
return;
diff --git a/swfdec/swfdec_text_field_movie.h b/swfdec/swfdec_text_field_movie.h
index 613965b..492f192 100644
--- a/swfdec/swfdec_text_field_movie.h
+++ b/swfdec/swfdec_text_field_movie.h
@@ -102,6 +102,7 @@ GType swfdec_text_field_movie_get_type (void);
void swfdec_text_field_movie_set_text (SwfdecTextFieldMovie * movie,
const char * str,
gboolean html);
+void swfdec_text_field_movie_autosize (SwfdecTextFieldMovie * text);
void swfdec_text_field_movie_update_scroll (SwfdecTextFieldMovie * text);
const char * swfdec_text_field_movie_get_text (SwfdecTextFieldMovie * text);
void swfdec_text_field_movie_set_listen_variable
diff --git a/swfdec/swfdec_text_field_movie_as.c b/swfdec/swfdec_text_field_movie_as.c
index 940a77f..8fed43b 100644
--- a/swfdec/swfdec_text_field_movie_as.c
+++ b/swfdec/swfdec_text_field_movie_as.c
@@ -766,10 +766,6 @@ swfdec_text_field_movie_set_autoSize (SwfdecAsContext *cx,
text->auto_size = SWFDEC_AUTO_SIZE_CENTER;
}
}
-
- if (text->auto_size != old) {
- swfdec_movie_queue_update (SWFDEC_MOVIE (text), SWFDEC_MOVIE_INVALID_EXTENTS);
- }
}
static void
commit 827ab25d9bc8359860e86ec3edc4d37d2c6b8ae3
Author: Benjamin Otte <otte at gnome.org>
Date: Sat Jun 21 15:10:06 2008 +0200
add test for recent twips fixes
Does not yet work on Flash 5 and 8 though
diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index 515dd5d..1083b42 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -3668,6 +3668,11 @@ EXTRA_DIST = \
text-snapshot-properties-7.swf.trace \
text-snapshot-properties-8.swf \
text-snapshot-properties-8.swf.trace \
+ textfield-x-and-width-6.swf \
+ textfield-x-and-width-6.swf.trace \
+ textfield-x-and-width-7.swf \
+ textfield-x-and-width-7.swf.trace \
+ textfield-x-and-width.as \
textformat.as \
textformat-5.swf \
textformat-5.swf.trace \
diff --git a/test/trace/textfield-x-and-width-6.swf b/test/trace/textfield-x-and-width-6.swf
new file mode 100644
index 0000000..060366c
Binary files /dev/null and b/test/trace/textfield-x-and-width-6.swf differ
diff --git a/test/trace/textfield-x-and-width-6.swf.trace b/test/trace/textfield-x-and-width-6.swf.trace
new file mode 100644
index 0000000..83a8309
--- /dev/null
+++ b/test/trace/textfield-x-and-width-6.swf.trace
@@ -0,0 +1,410 @@
+valueOf called
+toString called
+toString called with
+valueOf called with
+0: valueOf!
+1: valueOf!
+2: valueOf!
+3: valueOf!
+4: valueOf!
+5: valueOf!
+6: valueOf!
+7: valueOf!
+8: valueOf!
+9: valueOf!
+10: valueOf!
+11: valueOf!
+12: valueOf!
+13: valueOf!
+14: valueOf!
+15: valueOf!
+16: valueOf!
+17: valueOf!
+18: valueOf!
+19: valueOf!
+20: valueOf!
+21: valueOf!
+22: valueOf!
+22: toString!
+23: valueOf!
+23: toString!
+24: valueOf!
+24: toString!
+25: valueOf!
+25: toString!
+26: valueOf!
+26: toString!
+27: valueOf!
+27: toString!
+28: valueOf!
+28: toString!
+29: valueOf!
+29: toString!
+0
+(0) (undefined): 100
+0
+(1) null (null): 100
+1
+(2) true (boolean): 1
+0
+(3) false (boolean): 0
+0
+(4) 0 (number): 0
+1
+(5) 1 (number): 1
+0.5
+(6) 0.5 (number): 0.5
+-1
+(7) -1 (number): 100
+-0.5
+(8) -0.5 (number): 100
+Infinity
+(9) Infinity (number): 0
+-Infinity
+(10) -Infinity (number): 100
+NaN
+(11) NaN (number): 100
+NaN
+(12) (string): 100
+0
+(13) 0 (string): 0
+0
+(14) -0 (string): 0
+0
+(15) 0.0 (string): 0
+1
+(16) 1 (string): 1
+NaN
+(17) Hello World! (string): 100
+NaN
+(18) true (string): 100
+NaN
+(19) _level0 (string): 100
+NaN
+(20) äöü (string): 100
+NaN
+(21) _level0 (movieclip): 100
+NaN
+(22) [object Object] (object): 100
+103584024400.25
+(23) Fri Apr 13 21:20:24 GMT+0000 1973 (object): 75312566.65
+NaN
+(24) (object): 100
+NaN
+(25) [type Function] (function): 100
+valueOf called
+valueOf called
+NaN
+(26) [type Object] (object): 100
+NaN
+(27) [type Object] (object): 100
+valueOf called with
+valueOf called with
+NaN
+(28) [object Object] (object): 100
+0
+(29) (object): 0
+0: valueOf!
+0: valueOf!
+0
+(30) (object): 0
+1: valueOf!
+1: valueOf!
+0
+(31) null (object): 0
+2: valueOf!
+2: valueOf!
+1
+(32) true (object): 1
+3: valueOf!
+3: valueOf!
+0
+(33) false (object): 0
+4: valueOf!
+4: valueOf!
+0
+(34) 0 (object): 0
+5: valueOf!
+5: valueOf!
+1
+(35) 1 (object): 1
+6: valueOf!
+6: valueOf!
+0.5
+(36) 0.5 (object): 0.5
+7: valueOf!
+7: valueOf!
+-1
+(37) -1 (object): 100
+8: valueOf!
+8: valueOf!
+-0.5
+(38) -0.5 (object): 100
+9: valueOf!
+9: valueOf!
+Infinity
+(39) Infinity (object): 0
+10: valueOf!
+10: valueOf!
+-Infinity
+(40) -Infinity (object): 100
+11: valueOf!
+11: valueOf!
+NaN
+(41) NaN (object): 100
+12: valueOf!
+12: valueOf!
+NaN
+(42) (object): 100
+13: valueOf!
+13: valueOf!
+0
+(43) 0 (object): 0
+14: valueOf!
+14: valueOf!
+0
+(44) -0 (object): 0
+15: valueOf!
+15: valueOf!
+0
+(45) 0.0 (object): 0
+16: valueOf!
+16: valueOf!
+1
+(46) 1 (object): 1
+17: valueOf!
+17: valueOf!
+NaN
+(47) Hello World! (object): 100
+18: valueOf!
+18: valueOf!
+NaN
+(48) true (object): 100
+19: valueOf!
+19: valueOf!
+NaN
+(49) _level0 (object): 100
+20: valueOf!
+20: valueOf!
+NaN
+(50) äöü (object): 100
+21: valueOf!
+21: valueOf!
+NaN
+(51) _level0 (object): 100
+22: valueOf!
+22: valueOf!
+NaN
+(52) [type Object] (object): 100
+23: valueOf!
+23: valueOf!
+NaN
+(53) [type Object] (object): 100
+24: valueOf!
+24: valueOf!
+NaN
+(54) [type Object] (object): 100
+25: valueOf!
+25: valueOf!
+NaN
+(55) [type Object] (object): 100
+26: valueOf!
+26: valueOf!
+NaN
+(56) [type Object] (object): 100
+27: valueOf!
+27: valueOf!
+NaN
+(57) [type Object] (object): 100
+28: valueOf!
+28: valueOf!
+NaN
+(58) [type Object] (object): 100
+29: valueOf!
+29: valueOf!
+NaN
+(59) [type Object] (object): 100
+0
+(0) (undefined): 100
+0
+(1) null (null): 100
+1
+(2) true (boolean): 1
+0
+(3) false (boolean): 0
+0
+(4) 0 (number): 0
+1
+(5) 1 (number): 1
+0.5
+(6) 0.5 (number): 0.5
+-1
+(7) -1 (number): -1
+-0.5
+(8) -0.5 (number): -0.5
+Infinity
+(9) Infinity (number): 0
+-Infinity
+(10) -Infinity (number): 0
+NaN
+(11) NaN (number): 100
+NaN
+(12) (string): 100
+0
+(13) 0 (string): 0
+0
+(14) -0 (string): 0
+0
+(15) 0.0 (string): 0
+1
+(16) 1 (string): 1
+NaN
+(17) Hello World! (string): 100
+NaN
+(18) true (string): 100
+NaN
+(19) _level0 (string): 100
+NaN
+(20) äöü (string): 100
+NaN
+(21) _level0 (movieclip): 100
+NaN
+(22) [object Object] (object): 100
+103584024400.25
+(23) Fri Apr 13 21:20:24 GMT+0000 1973 (object): 75312566.65
+NaN
+(24) (object): 100
+NaN
+(25) [type Function] (function): 100
+valueOf called
+valueOf called
+NaN
+(26) [type Object] (object): 100
+NaN
+(27) [type Object] (object): 100
+valueOf called with
+valueOf called with
+NaN
+(28) [object Object] (object): 100
+0
+(29) (object): 0
+0: valueOf!
+0: valueOf!
+0
+(30) (object): 0
+1: valueOf!
+1: valueOf!
+0
+(31) null (object): 0
+2: valueOf!
+2: valueOf!
+1
+(32) true (object): 1
+3: valueOf!
+3: valueOf!
+0
+(33) false (object): 0
+4: valueOf!
+4: valueOf!
+0
+(34) 0 (object): 0
+5: valueOf!
+5: valueOf!
+1
+(35) 1 (object): 1
+6: valueOf!
+6: valueOf!
+0.5
+(36) 0.5 (object): 0.5
+7: valueOf!
+7: valueOf!
+-1
+(37) -1 (object): -1
+8: valueOf!
+8: valueOf!
+-0.5
+(38) -0.5 (object): -0.5
+9: valueOf!
+9: valueOf!
+Infinity
+(39) Infinity (object): 0
+10: valueOf!
+10: valueOf!
+-Infinity
+(40) -Infinity (object): 0
+11: valueOf!
+11: valueOf!
+NaN
+(41) NaN (object): 100
+12: valueOf!
+12: valueOf!
+NaN
+(42) (object): 100
+13: valueOf!
+13: valueOf!
+0
+(43) 0 (object): 0
+14: valueOf!
+14: valueOf!
+0
+(44) -0 (object): 0
+15: valueOf!
+15: valueOf!
+0
+(45) 0.0 (object): 0
+16: valueOf!
+16: valueOf!
+1
+(46) 1 (object): 1
+17: valueOf!
+17: valueOf!
+NaN
+(47) Hello World! (object): 100
+18: valueOf!
+18: valueOf!
+NaN
+(48) true (object): 100
+19: valueOf!
+19: valueOf!
+NaN
+(49) _level0 (object): 100
+20: valueOf!
+20: valueOf!
+NaN
+(50) äöü (object): 100
+21: valueOf!
+21: valueOf!
+NaN
+(51) _level0 (object): 100
+22: valueOf!
+22: valueOf!
+NaN
+(52) [type Object] (object): 100
+23: valueOf!
+23: valueOf!
+NaN
+(53) [type Object] (object): 100
+24: valueOf!
+24: valueOf!
+NaN
+(54) [type Object] (object): 100
+25: valueOf!
+25: valueOf!
+NaN
+(55) [type Object] (object): 100
+26: valueOf!
+26: valueOf!
+NaN
+(56) [type Object] (object): 100
+27: valueOf!
+27: valueOf!
+NaN
+(57) [type Object] (object): 100
+28: valueOf!
+28: valueOf!
+NaN
+(58) [type Object] (object): 100
+29: valueOf!
+29: valueOf!
+NaN
+(59) [type Object] (object): 100
diff --git a/test/trace/textfield-x-and-width-7.swf b/test/trace/textfield-x-and-width-7.swf
new file mode 100644
index 0000000..54d0802
Binary files /dev/null and b/test/trace/textfield-x-and-width-7.swf differ
diff --git a/test/trace/textfield-x-and-width-7.swf.trace b/test/trace/textfield-x-and-width-7.swf.trace
new file mode 100644
index 0000000..ebc285e
--- /dev/null
+++ b/test/trace/textfield-x-and-width-7.swf.trace
@@ -0,0 +1,410 @@
+valueOf called
+toString called
+toString called with
+valueOf called with
+0: valueOf!
+1: valueOf!
+2: valueOf!
+3: valueOf!
+4: valueOf!
+5: valueOf!
+6: valueOf!
+7: valueOf!
+8: valueOf!
+9: valueOf!
+10: valueOf!
+11: valueOf!
+12: valueOf!
+13: valueOf!
+14: valueOf!
+15: valueOf!
+16: valueOf!
+17: valueOf!
+18: valueOf!
+19: valueOf!
+20: valueOf!
+21: valueOf!
+22: valueOf!
+22: toString!
+23: valueOf!
+23: toString!
+24: valueOf!
+24: toString!
+25: valueOf!
+25: toString!
+26: valueOf!
+26: toString!
+27: valueOf!
+27: toString!
+28: valueOf!
+28: toString!
+29: valueOf!
+29: toString!
+NaN
+(0) undefined (undefined): 100
+NaN
+(1) null (null): 100
+1
+(2) true (boolean): 1
+0
+(3) false (boolean): 0
+0
+(4) 0 (number): 0
+1
+(5) 1 (number): 1
+0.5
+(6) 0.5 (number): 0.5
+-1
+(7) -1 (number): 100
+-0.5
+(8) -0.5 (number): 100
+Infinity
+(9) Infinity (number): 0
+-Infinity
+(10) -Infinity (number): 100
+NaN
+(11) NaN (number): 100
+NaN
+(12) (string): 100
+0
+(13) 0 (string): 0
+0
+(14) -0 (string): 0
+0
+(15) 0.0 (string): 0
+1
+(16) 1 (string): 1
+NaN
+(17) Hello World! (string): 100
+NaN
+(18) true (string): 100
+NaN
+(19) _level0 (string): 100
+NaN
+(20) äöü (string): 100
+NaN
+(21) _level0 (movieclip): 100
+NaN
+(22) [object Object] (object): 100
+103584024400.25
+(23) Fri Apr 13 21:20:24 GMT+0000 1973 (object): 75312566.65
+NaN
+(24) (object): 100
+NaN
+(25) [type Function] (function): 100
+valueOf called
+valueOf called
+NaN
+(26) [type Object] (object): 100
+NaN
+(27) [type Object] (object): 100
+valueOf called with
+valueOf called with
+NaN
+(28) [object Object] (object): 100
+NaN
+(29) undefined (object): 100
+0: valueOf!
+0: valueOf!
+NaN
+(30) undefined (object): 100
+1: valueOf!
+1: valueOf!
+NaN
+(31) null (object): 100
+2: valueOf!
+2: valueOf!
+1
+(32) true (object): 1
+3: valueOf!
+3: valueOf!
+0
+(33) false (object): 0
+4: valueOf!
+4: valueOf!
+0
+(34) 0 (object): 0
+5: valueOf!
+5: valueOf!
+1
+(35) 1 (object): 1
+6: valueOf!
+6: valueOf!
+0.5
+(36) 0.5 (object): 0.5
+7: valueOf!
+7: valueOf!
+-1
+(37) -1 (object): 100
+8: valueOf!
+8: valueOf!
+-0.5
+(38) -0.5 (object): 100
+9: valueOf!
+9: valueOf!
+Infinity
+(39) Infinity (object): 0
+10: valueOf!
+10: valueOf!
+-Infinity
+(40) -Infinity (object): 100
+11: valueOf!
+11: valueOf!
+NaN
+(41) NaN (object): 100
+12: valueOf!
+12: valueOf!
+NaN
+(42) (object): 100
+13: valueOf!
+13: valueOf!
+0
+(43) 0 (object): 0
+14: valueOf!
+14: valueOf!
+0
+(44) -0 (object): 0
+15: valueOf!
+15: valueOf!
+0
+(45) 0.0 (object): 0
+16: valueOf!
+16: valueOf!
+1
+(46) 1 (object): 1
+17: valueOf!
+17: valueOf!
+NaN
+(47) Hello World! (object): 100
+18: valueOf!
+18: valueOf!
+NaN
+(48) true (object): 100
+19: valueOf!
+19: valueOf!
+NaN
+(49) _level0 (object): 100
+20: valueOf!
+20: valueOf!
+NaN
+(50) äöü (object): 100
+21: valueOf!
+21: valueOf!
+NaN
+(51) _level0 (object): 100
+22: valueOf!
+22: valueOf!
+NaN
+(52) [type Object] (object): 100
+23: valueOf!
+23: valueOf!
+NaN
+(53) [type Object] (object): 100
+24: valueOf!
+24: valueOf!
+NaN
+(54) [type Object] (object): 100
+25: valueOf!
+25: valueOf!
+NaN
+(55) [type Object] (object): 100
+26: valueOf!
+26: valueOf!
+NaN
+(56) [type Object] (object): 100
+27: valueOf!
+27: valueOf!
+NaN
+(57) [type Object] (object): 100
+28: valueOf!
+28: valueOf!
+NaN
+(58) [type Object] (object): 100
+29: valueOf!
+29: valueOf!
+NaN
+(59) [type Object] (object): 100
+NaN
+(0) undefined (undefined): 100
+NaN
+(1) null (null): 100
+1
+(2) true (boolean): 1
+0
+(3) false (boolean): 0
+0
+(4) 0 (number): 0
+1
+(5) 1 (number): 1
+0.5
+(6) 0.5 (number): 0.5
+-1
+(7) -1 (number): -1
+-0.5
+(8) -0.5 (number): -0.5
+Infinity
+(9) Infinity (number): 0
+-Infinity
+(10) -Infinity (number): 0
+NaN
+(11) NaN (number): 100
+NaN
+(12) (string): 100
+0
+(13) 0 (string): 0
+0
+(14) -0 (string): 0
+0
+(15) 0.0 (string): 0
+1
+(16) 1 (string): 1
+NaN
+(17) Hello World! (string): 100
+NaN
+(18) true (string): 100
+NaN
+(19) _level0 (string): 100
+NaN
+(20) äöü (string): 100
+NaN
+(21) _level0 (movieclip): 100
+NaN
+(22) [object Object] (object): 100
+103584024400.25
+(23) Fri Apr 13 21:20:24 GMT+0000 1973 (object): 75312566.65
+NaN
+(24) (object): 100
+NaN
+(25) [type Function] (function): 100
+valueOf called
+valueOf called
+NaN
+(26) [type Object] (object): 100
+NaN
+(27) [type Object] (object): 100
+valueOf called with
+valueOf called with
+NaN
+(28) [object Object] (object): 100
+NaN
+(29) undefined (object): 100
+0: valueOf!
+0: valueOf!
+NaN
+(30) undefined (object): 100
+1: valueOf!
+1: valueOf!
+NaN
+(31) null (object): 100
+2: valueOf!
+2: valueOf!
+1
+(32) true (object): 1
+3: valueOf!
+3: valueOf!
+0
+(33) false (object): 0
+4: valueOf!
+4: valueOf!
+0
+(34) 0 (object): 0
+5: valueOf!
+5: valueOf!
+1
+(35) 1 (object): 1
+6: valueOf!
+6: valueOf!
+0.5
+(36) 0.5 (object): 0.5
+7: valueOf!
+7: valueOf!
+-1
+(37) -1 (object): -1
+8: valueOf!
+8: valueOf!
+-0.5
+(38) -0.5 (object): -0.5
+9: valueOf!
+9: valueOf!
+Infinity
+(39) Infinity (object): 0
+10: valueOf!
+10: valueOf!
+-Infinity
+(40) -Infinity (object): 0
+11: valueOf!
+11: valueOf!
+NaN
+(41) NaN (object): 100
+12: valueOf!
+12: valueOf!
+NaN
+(42) (object): 100
+13: valueOf!
+13: valueOf!
+0
+(43) 0 (object): 0
+14: valueOf!
+14: valueOf!
+0
+(44) -0 (object): 0
+15: valueOf!
+15: valueOf!
+0
+(45) 0.0 (object): 0
+16: valueOf!
+16: valueOf!
+1
+(46) 1 (object): 1
+17: valueOf!
+17: valueOf!
+NaN
+(47) Hello World! (object): 100
+18: valueOf!
+18: valueOf!
+NaN
+(48) true (object): 100
+19: valueOf!
+19: valueOf!
+NaN
+(49) _level0 (object): 100
+20: valueOf!
+20: valueOf!
+NaN
+(50) äöü (object): 100
+21: valueOf!
+21: valueOf!
+NaN
+(51) _level0 (object): 100
+22: valueOf!
+22: valueOf!
+NaN
+(52) [type Object] (object): 100
+23: valueOf!
+23: valueOf!
+NaN
+(53) [type Object] (object): 100
+24: valueOf!
+24: valueOf!
+NaN
+(54) [type Object] (object): 100
+25: valueOf!
+25: valueOf!
+NaN
+(55) [type Object] (object): 100
+26: valueOf!
+26: valueOf!
+NaN
+(56) [type Object] (object): 100
+27: valueOf!
+27: valueOf!
+NaN
+(57) [type Object] (object): 100
+28: valueOf!
+28: valueOf!
+NaN
+(58) [type Object] (object): 100
+29: valueOf!
+29: valueOf!
+NaN
+(59) [type Object] (object): 100
diff --git a/test/trace/textfield-x-and-width.as b/test/trace/textfield-x-and-width.as
new file mode 100644
index 0000000..f5d3c19
--- /dev/null
+++ b/test/trace/textfield-x-and-width.as
@@ -0,0 +1,22 @@
+// makeswf -v 7 -s 200x150 -r 1 -o textfield-x-and-width.swf textfield-x-and-width.as
+
+#include "values.as"
+
+createTextField ("t", 0, 100, 0, 100, 50);
+
+for (i = 0; i < values.length; i++) {
+ t._width = 100;
+ t._width = values[i];
+ trace (Number (values[i]));
+ trace (names[i] + ": " + t._width);
+};
+
+t._width = 100;
+for (i = 0; i < values.length; i++) {
+ t._x = 100;
+ t._x = values[i];
+ trace (Number (values[i]));
+ trace (names[i] + ": " + t._x);
+};
+
+getURL ("fscommand:quit", "");
commit 0f19665748356cbb4eacf91bfba4c02fb5748d7b
Author: Benjamin Otte <otte at gnome.org>
Date: Sat Jun 21 15:09:50 2008 +0200
fail for null and undefined, too (in version 6)
diff --git a/swfdec/swfdec_as_types.c b/swfdec/swfdec_as_types.c
index 2415620..16010df 100644
--- a/swfdec/swfdec_as_types.c
+++ b/swfdec/swfdec_as_types.c
@@ -690,6 +690,9 @@ swfdec_as_value_to_twips (SwfdecAsContext *context, const SwfdecAsValue *val,
g_return_val_if_fail (val != NULL, FALSE);
g_return_val_if_fail (result != NULL, FALSE);
+ if (SWFDEC_AS_VALUE_IS_UNDEFINED (val) || SWFDEC_AS_VALUE_IS_NULL (val))
+ return FALSE;
+
d = swfdec_as_value_to_number (context, val);
if (isnan (d))
return FALSE;
commit 052da7f6541a72e164a01f027617b74bfbbbb8f4
Author: Benjamin Otte <otte at gnome.org>
Date: Sat Jun 21 12:34:03 2008 +0200
typo
diff --git a/swfdec/swfdec_player_internal.h b/swfdec/swfdec_player_internal.h
index fa39462..8a83bf4 100644
--- a/swfdec/swfdec_player_internal.h
+++ b/swfdec/swfdec_player_internal.h
@@ -150,7 +150,7 @@ struct _SwfdecPlayerPrivate
SwfdecRingBuffer * external_actions; /* external actions we've queued up, like resize or loader stuff */
SwfdecTimeout external_timeout; /* callback for iterating */
/* iterating */
- GList * actors; /* list of all SwfdecActor isntances active in this player */
+ GList * actors; /* list of all SwfdecActor instances active in this player */
SwfdecRingBuffer * actions[SWFDEC_PLAYER_N_ACTION_QUEUES]; /* all actions we've queued up so far */
/* security */
commit 1066c4065c4959926d3a29f7886e8d14b152c51f
Author: Benjamin Otte <otte at gnome.org>
Date: Sat Jun 21 12:31:06 2008 +0200
override _x, _y, _width and _height properties
diff --git a/swfdec/swfdec_text_field_movie.c b/swfdec/swfdec_text_field_movie.c
index a231b12..7a26608 100644
--- a/swfdec/swfdec_text_field_movie.c
+++ b/swfdec/swfdec_text_field_movie.c
@@ -31,6 +31,7 @@
#include "swfdec_as_strings.h"
#include "swfdec_as_interpret.h"
#include "swfdec_debug.h"
+#include "swfdec_internal.h"
#include "swfdec_player_internal.h"
#include "swfdec_resource.h"
#include "swfdec_sandbox.h"
@@ -740,6 +741,88 @@ swfdec_text_field_movie_key_release (SwfdecActor *actor, guint keycode, guint ch
}
static void
+swfdec_text_field_movie_property_get (SwfdecMovie *movie, guint prop_id,
+ SwfdecAsValue *val)
+{
+ SwfdecTextFieldMovie *text = SWFDEC_TEXT_FIELD_MOVIE (movie);
+ double d;
+
+ switch (prop_id) {
+ case SWFDEC_MOVIE_PROPERTY_X:
+ swfdec_movie_update (movie);
+ d = SWFDEC_TWIPS_TO_DOUBLE (movie->matrix.x0 + text->extents.x0);
+ SWFDEC_AS_VALUE_SET_NUMBER (val, d);
+ return;
+ case SWFDEC_MOVIE_PROPERTY_Y:
+ swfdec_movie_update (movie);
+ d = SWFDEC_TWIPS_TO_DOUBLE (movie->matrix.y0 + text->extents.y0);
+ SWFDEC_AS_VALUE_SET_NUMBER (val, d);
+ return;
+ default:
+ break;
+ }
+
+ SWFDEC_MOVIE_CLASS (swfdec_text_field_movie_parent_class)->property_get (movie, prop_id, val);
+}
+
+static void
+swfdec_text_field_movie_property_set (SwfdecMovie *movie, guint prop_id,
+ const SwfdecAsValue *val)
+{
+ SwfdecTextFieldMovie *text = SWFDEC_TEXT_FIELD_MOVIE (movie);
+ SwfdecAsContext *cx = SWFDEC_AS_OBJECT (movie)->context;
+ SwfdecTwips twips;
+
+ switch (prop_id) {
+ case SWFDEC_MOVIE_PROPERTY_X:
+ if (!swfdec_as_value_to_twips (SWFDEC_AS_OBJECT (movie)->context, val, FALSE, &twips))
+ return;
+ movie->modified = TRUE;
+ twips -= text->extents.x0;
+ if (twips != movie->matrix.x0) {
+ swfdec_movie_begin_update_matrix (movie);
+ movie->matrix.x0 = twips;
+ swfdec_movie_end_update_matrix (movie);
+ }
+ return;
+ case SWFDEC_MOVIE_PROPERTY_Y:
+ if (!swfdec_as_value_to_twips (SWFDEC_AS_OBJECT (movie)->context, val, FALSE, &twips))
+ return;
+ movie->modified = TRUE;
+ twips -= text->extents.y0;
+ if (twips != movie->matrix.y0) {
+ swfdec_movie_begin_update_matrix (movie);
+ movie->matrix.y0 = twips;
+ swfdec_movie_end_update_matrix (movie);
+ }
+ return;
+ case SWFDEC_MOVIE_PROPERTY_WIDTH:
+ if (swfdec_as_value_to_twips (cx, val, TRUE, &twips)) {
+ movie->modified = TRUE;
+ if (text->extents.x1 != text->extents.x0 + twips) {
+ text->extents.x1 = text->extents.x0 + twips;
+ swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_EXTENTS);
+ }
+ }
+ return;
+ case SWFDEC_MOVIE_PROPERTY_HEIGHT:
+ movie->modified = TRUE;
+ if (swfdec_as_value_to_twips (cx, val, TRUE, &twips)) {
+ movie->modified = TRUE;
+ if (text->extents.y1 != text->extents.y0 + twips) {
+ text->extents.y1 = text->extents.y0 + twips;
+ swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_EXTENTS);
+ }
+ }
+ return;
+ default:
+ break;
+ }
+
+ SWFDEC_MOVIE_CLASS (swfdec_text_field_movie_parent_class)->property_set (movie, prop_id, val);
+}
+
+static void
swfdec_text_field_movie_class_init (SwfdecTextFieldMovieClass * g_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (g_class);
@@ -757,6 +840,8 @@ swfdec_text_field_movie_class_init (SwfdecTextFieldMovieClass * g_class)
movie_class->render = swfdec_text_field_movie_render;
movie_class->invalidate = swfdec_text_field_movie_invalidate;
movie_class->contains = swfdec_text_field_movie_contains;
+ movie_class->property_get = swfdec_text_field_movie_property_get;
+ movie_class->property_set = swfdec_text_field_movie_property_set;
actor_class->mouse_cursor = swfdec_text_field_movie_mouse_cursor;
actor_class->mouse_events = swfdec_text_field_movie_mouse_events;
commit 78081a681e75f90a1066960364fe6646bf9971a0
Author: Benjamin Otte <otte at gnome.org>
Date: Sat Jun 21 12:29:44 2008 +0200
make swfdec_as_value_to_twips() a real function
I still don't like that function btw, neither its existance nor the files
it's defined in. But there seem to be multiple uses of this functionality,
so I kept it for now.
diff --git a/swfdec/swfdec_as_internal.h b/swfdec/swfdec_as_internal.h
index bc7e268..7b634d7 100644
--- a/swfdec/swfdec_as_internal.h
+++ b/swfdec/swfdec_as_internal.h
@@ -74,9 +74,5 @@ void swfdec_as_object_add_native_variable (SwfdecAsObject * object,
SwfdecAsNative set);
-#define swfdec_as_value_to_twips(cx, val) \
- (swfdec_as_double_to_integer (swfdec_as_value_to_number ((cx), (val)) * SWFDEC_TWIPS_SCALE_FACTOR))
-
-
G_END_DECLS
#endif
diff --git a/swfdec/swfdec_as_types.c b/swfdec/swfdec_as_types.c
index 8ecfbd8..2415620 100644
--- a/swfdec/swfdec_as_types.c
+++ b/swfdec/swfdec_as_types.c
@@ -1,5 +1,5 @@
/* Swfdec
- * Copyright (C) 2007 Benjamin Otte <otte at gnome.org>
+ * Copyright (C) 2007-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
@@ -34,6 +34,7 @@
#include "swfdec_as_strings.h"
#include "swfdec_as_super.h"
#include "swfdec_debug.h"
+#include "swfdec_internal.h"
#include "swfdec_movie.h"
/*** GTK-DOC ***/
@@ -678,3 +679,27 @@ swfdec_as_value_to_primitive (SwfdecAsValue *value)
}
}
+/* from swfdec_internal.h */
+gboolean
+swfdec_as_value_to_twips (SwfdecAsContext *context, const SwfdecAsValue *val,
+ gboolean is_length, SwfdecTwips *result)
+{
+ double d;
+
+ g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), FALSE);
+ g_return_val_if_fail (val != NULL, FALSE);
+ g_return_val_if_fail (result != NULL, FALSE);
+
+ d = swfdec_as_value_to_number (context, val);
+ if (isnan (d))
+ return FALSE;
+ if (is_length && d < 0)
+ return FALSE;
+
+ d *= SWFDEC_TWIPS_SCALE_FACTOR;
+ *result = swfdec_as_double_to_integer (d);
+ if (is_length)
+ *result = ABS (*result);
+ return TRUE;
+}
+
diff --git a/swfdec/swfdec_internal.h b/swfdec/swfdec_internal.h
index 126e391..6af7e94 100644
--- a/swfdec/swfdec_internal.h
+++ b/swfdec/swfdec_internal.h
@@ -1,7 +1,7 @@
/* Swfdec
* Copyright (C) 2003-2006 David Schleef <ds at schleef.org>
* 2005-2006 Eric Anholt <eric at anholt.net>
- * 2006 Benjamin Otte <otte at gnome.org>
+ * 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
@@ -50,6 +50,11 @@ void swfdec_video_movie_init_context (SwfdecPlayer * player);
char * swfdec_buffer_queue_pull_text (SwfdecBufferQueue * queue,
guint version);
+gboolean swfdec_as_value_to_twips (SwfdecAsContext * context,
+ const SwfdecAsValue * val,
+ gboolean is_length,
+ SwfdecTwips * result);
+
G_END_DECLS
#endif
diff --git a/swfdec/swfdec_movie_asprops.c b/swfdec/swfdec_movie_asprops.c
index b053005..1786236 100644
--- a/swfdec/swfdec_movie_asprops.c
+++ b/swfdec/swfdec_movie_asprops.c
@@ -26,11 +26,11 @@
#include <math.h>
#include "swfdec_movie.h"
-#include "swfdec_as_internal.h"
#include "swfdec_as_strings.h"
#include "swfdec_bits.h"
#include "swfdec_debug.h"
#include "swfdec_decoder.h"
+#include "swfdec_internal.h"
#include "swfdec_player_internal.h"
#include "swfdec_sprite.h"
#include "swfdec_sprite_movie.h"
@@ -51,7 +51,8 @@ mc_x_set (SwfdecMovie *movie, const SwfdecAsValue *val)
{
SwfdecTwips x;
- x = swfdec_as_value_to_twips (SWFDEC_AS_OBJECT (movie)->context, val);
+ if (!swfdec_as_value_to_twips (SWFDEC_AS_OBJECT (movie)->context, val, FALSE, &x))
+ return;
movie->modified = TRUE;
if (x != movie->matrix.x0) {
swfdec_movie_begin_update_matrix (movie);
@@ -75,7 +76,8 @@ mc_y_set (SwfdecMovie *movie, const SwfdecAsValue *val)
{
SwfdecTwips y;
- y = swfdec_as_value_to_twips (SWFDEC_AS_OBJECT (movie)->context, val);
+ if (!swfdec_as_value_to_twips (SWFDEC_AS_OBJECT (movie)->context, val, FALSE, &y))
+ return;
movie->modified = TRUE;
if (y != movie->matrix.y0) {
swfdec_movie_begin_update_matrix (movie);
commit efc1809dd54f1c5a808206a2ee944bb55ebd47c5
Author: Benjamin Otte <otte at gnome.org>
Date: Fri Jun 20 18:06:20 2008 +0200
use swfdec_as_value_to_twips() when assigning _x and _y
diff --git a/swfdec/swfdec_movie_asprops.c b/swfdec/swfdec_movie_asprops.c
index 0b82f0c..b053005 100644
--- a/swfdec/swfdec_movie_asprops.c
+++ b/swfdec/swfdec_movie_asprops.c
@@ -26,6 +26,7 @@
#include <math.h>
#include "swfdec_movie.h"
+#include "swfdec_as_internal.h"
#include "swfdec_as_strings.h"
#include "swfdec_bits.h"
#include "swfdec_debug.h"
@@ -48,18 +49,13 @@ mc_x_get (SwfdecMovie *movie, SwfdecAsValue *rval)
static void
mc_x_set (SwfdecMovie *movie, const SwfdecAsValue *val)
{
- double d;
+ SwfdecTwips x;
- d = swfdec_as_value_to_number (SWFDEC_AS_OBJECT (movie)->context, val);
- if (!isfinite (d)) {
- SWFDEC_WARNING ("trying to move %s._x to a non-finite value, ignoring", movie->name);
- return;
- }
+ x = swfdec_as_value_to_twips (SWFDEC_AS_OBJECT (movie)->context, val);
movie->modified = TRUE;
- d = SWFDEC_DOUBLE_TO_TWIPS (d);
- if (d != movie->matrix.x0) {
+ if (x != movie->matrix.x0) {
swfdec_movie_begin_update_matrix (movie);
- movie->matrix.x0 = d;
+ movie->matrix.x0 = x;
swfdec_movie_end_update_matrix (movie);
}
}
@@ -77,18 +73,13 @@ mc_y_get (SwfdecMovie *movie, SwfdecAsValue *rval)
static void
mc_y_set (SwfdecMovie *movie, const SwfdecAsValue *val)
{
- double d;
+ SwfdecTwips y;
- d = swfdec_as_value_to_number (SWFDEC_AS_OBJECT (movie)->context, val);
- if (!isfinite (d)) {
- SWFDEC_WARNING ("trying to move %s._y to a non-finite value, ignoring", movie->name);
- return;
- }
+ y = swfdec_as_value_to_twips (SWFDEC_AS_OBJECT (movie)->context, val);
movie->modified = TRUE;
- d = SWFDEC_DOUBLE_TO_TWIPS (d);
- if (d != movie->matrix.y0) {
+ if (y != movie->matrix.y0) {
swfdec_movie_begin_update_matrix (movie);
- movie->matrix.y0 = d;
+ movie->matrix.y0 = y;
swfdec_movie_end_update_matrix (movie);
}
}
commit d44397b0b8e0eb2a372a3d1e23ba60c60976ecca
Author: Benjamin Otte <otte at gnome.org>
Date: Fri Jun 20 16:26:52 2008 +0200
add a swfdec_as_value_to_twips() macro
diff --git a/swfdec/swfdec_as_internal.h b/swfdec/swfdec_as_internal.h
index 7b634d7..bc7e268 100644
--- a/swfdec/swfdec_as_internal.h
+++ b/swfdec/swfdec_as_internal.h
@@ -74,5 +74,9 @@ void swfdec_as_object_add_native_variable (SwfdecAsObject * object,
SwfdecAsNative set);
+#define swfdec_as_value_to_twips(cx, val) \
+ (swfdec_as_double_to_integer (swfdec_as_value_to_number ((cx), (val)) * SWFDEC_TWIPS_SCALE_FACTOR))
+
+
G_END_DECLS
#endif
commit ee562594bfa0caadd7c74ebee8f63e6fb71ea42f
Author: Benjamin Otte <otte at gnome.org>
Date: Fri Jun 20 16:26:13 2008 +0200
make swfdec_url_new_relative() work correctly with ../ urls
diff --git a/swfdec/swfdec_url.c b/swfdec/swfdec_url.c
index ec07686..4f893b0 100644
--- a/swfdec/swfdec_url.c
+++ b/swfdec/swfdec_url.c
@@ -273,9 +273,9 @@ swfdec_url_new_relative (const SwfdecURL *url, const char *string)
/* relative URL */
char *cur = g_strdup (url->path);
while (g_str_has_prefix (string, "../")) {
- if (!cur || !swfdec_url_path_to_parent_path (cur)) {
+ if (cur && !swfdec_url_path_to_parent_path (cur)) {
g_free (cur);
- return NULL;
+ cur = NULL;
}
string += 3;
}
commit c8d687dc83c9502a6d21d252d1daf962c67d85dd
Author: Benjamin Otte <otte at gnome.org>
Date: Fri Jun 20 16:25:33 2008 +0200
actually check the buffer size correctly
diff --git a/swfdec/swfdec_audio_decoder.c b/swfdec/swfdec_audio_decoder.c
index 81d432e..7da1a86 100644
--- a/swfdec/swfdec_audio_decoder.c
+++ b/swfdec/swfdec_audio_decoder.c
@@ -169,7 +169,7 @@ swfdec_audio_decoder_pull (SwfdecAudioDecoder *decoder)
klass = SWFDEC_AUDIO_DECODER_GET_CLASS (decoder);
result = klass->pull (decoder);
/* result must be n samples of 44.1kHz stereo 16bit - and one sample is 4 bytes */
- g_assert (result == NULL || result->length % 4);
+ g_assert (result == NULL || result->length % 4 == 0);
return result;
}
commit 4b75ec8487a620b7cc4e16426532146502d35f0f
Author: Benjamin Otte <otte at gnome.org>
Date: Fri Jun 20 11:01:02 2008 +0200
add testcase for recent fix
diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index 0051372..515dd5d 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -815,6 +815,15 @@ EXTRA_DIST = \
crash-0.7.1-throw-8.swf \
crash-0.7.1-throw-8.swf.trace \
crash-0.7.1-throw.as \
+ crash-0.7.1-uncompressed-half-samples-5.swf \
+ crash-0.7.1-uncompressed-half-samples-5.swf.trace \
+ crash-0.7.1-uncompressed-half-samples-6.swf \
+ crash-0.7.1-uncompressed-half-samples-6.swf.trace \
+ crash-0.7.1-uncompressed-half-samples-7.swf \
+ crash-0.7.1-uncompressed-half-samples-7.swf.trace \
+ crash-0.7.1-uncompressed-half-samples-8.swf \
+ crash-0.7.1-uncompressed-half-samples-8.swf.trace \
+ crash-0.7.1-uncompressed-half-samples.xml \
createTextField-returnvalue-5.swf \
createTextField-returnvalue-5.swf.trace \
createTextField-returnvalue-6.swf \
diff --git a/test/trace/crash-0.7.1-uncompressed-half-samples-5.swf b/test/trace/crash-0.7.1-uncompressed-half-samples-5.swf
new file mode 100644
index 0000000..8524169
Binary files /dev/null and b/test/trace/crash-0.7.1-uncompressed-half-samples-5.swf differ
diff --git a/test/trace/crash-0.7.1-uncompressed-half-samples-5.swf.trace b/test/trace/crash-0.7.1-uncompressed-half-samples-5.swf.trace
new file mode 100644
index 0000000..e69de29
diff --git a/test/trace/crash-0.7.1-uncompressed-half-samples-6.swf b/test/trace/crash-0.7.1-uncompressed-half-samples-6.swf
new file mode 100644
index 0000000..c5a53c4
Binary files /dev/null and b/test/trace/crash-0.7.1-uncompressed-half-samples-6.swf differ
diff --git a/test/trace/crash-0.7.1-uncompressed-half-samples-6.swf.trace b/test/trace/crash-0.7.1-uncompressed-half-samples-6.swf.trace
new file mode 100644
index 0000000..e69de29
diff --git a/test/trace/crash-0.7.1-uncompressed-half-samples-7.swf b/test/trace/crash-0.7.1-uncompressed-half-samples-7.swf
new file mode 100644
index 0000000..35ea6db
Binary files /dev/null and b/test/trace/crash-0.7.1-uncompressed-half-samples-7.swf differ
diff --git a/test/trace/crash-0.7.1-uncompressed-half-samples-7.swf.trace b/test/trace/crash-0.7.1-uncompressed-half-samples-7.swf.trace
new file mode 100644
index 0000000..e69de29
diff --git a/test/trace/crash-0.7.1-uncompressed-half-samples-8.swf b/test/trace/crash-0.7.1-uncompressed-half-samples-8.swf
new file mode 100644
index 0000000..a5dadc9
Binary files /dev/null and b/test/trace/crash-0.7.1-uncompressed-half-samples-8.swf differ
diff --git a/test/trace/crash-0.7.1-uncompressed-half-samples-8.swf.trace b/test/trace/crash-0.7.1-uncompressed-half-samples-8.swf.trace
new file mode 100644
index 0000000..e69de29
diff --git a/test/trace/crash-0.7.1-uncompressed-half-samples.xml b/test/trace/crash-0.7.1-uncompressed-half-samples.xml
new file mode 100644
index 0000000..b0317a4
--- /dev/null
+++ b/test/trace/crash-0.7.1-uncompressed-half-samples.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<swf version="7" compressed="1">
+ <Header framerate="1" frames="1">
+ <size>
+ <Rectangle left="0" right="4000" top="0" bottom="3000"/>
+ </size>
+ <tags>
+ <SoundStreamHead playbackRate="1" playbackSize="1" playbackStereo="0" compression="3" soundRate="1" soundSize="1" soundStereo="1" sampleSize="1">
+ </SoundStreamHead>
+ <SoundStreamBlock>
+ <data>
+ <data>AA==</data>
+ </data>
+ </SoundStreamBlock>
+ <ShowFrame/>
+ <End/>
+ </tags>
+ </Header>
+</swf>
commit 6f223efa3d81f33350fdf56f080f70b5d6828570
Author: Benjamin Otte <otte at gnome.org>
Date: Fri Jun 20 10:56:50 2008 +0200
fix uncompressed audio not ensuring sample-alignment (fixes #16239)
I hope it fixes it, I haven't downloaded the actual test file and am without
internet curently.
diff --git a/swfdec/swfdec_audio_decoder_uncompressed.c b/swfdec/swfdec_audio_decoder_uncompressed.c
index 6681f2a..9a6388d 100644
--- a/swfdec/swfdec_audio_decoder_uncompressed.c
+++ b/swfdec/swfdec_audio_decoder_uncompressed.c
@@ -120,6 +120,16 @@ swfdec_audio_decoder_uncompressed_push (SwfdecAudioDecoder *decoder,
else
tmp = swfdec_audio_decoder_uncompressed_decode_8bit (buffer);
+ if (tmp->length % 4) {
+ SwfdecBuffer *correct;
+ SWFDEC_ERROR ("incorrect buffer size, %"G_GSIZE_FORMAT" bytes overhead",
+ tmp->length % 4);
+ /* we don't just truncate the length here as it might be the original
+ * buffer we got passed, and we must not modify that one */
+ correct = swfdec_buffer_new_subbuffer (tmp, 0, tmp->length & ~3);
+ swfdec_buffer_unref (tmp);
+ tmp = correct;
+ }
tmp = swfdec_audio_decoder_uncompressed_upscale (tmp, decoder->format);
swfdec_buffer_queue_push (SWFDEC_AUDIO_DECODER_UNCOMPRESSED (decoder)->queue,
tmp);
commit ccce90e870e1543d9916a81875bd9be967df976a
Author: Benjamin Otte <otte at gnome.org>
Date: Fri Jun 20 10:48:46 2008 +0200
move buffer size assertion to decoder
diff --git a/swfdec/swfdec_audio_decoder.c b/swfdec/swfdec_audio_decoder.c
index ebe963a..81d432e 100644
--- a/swfdec/swfdec_audio_decoder.c
+++ b/swfdec/swfdec_audio_decoder.c
@@ -160,13 +160,17 @@ SwfdecBuffer *
swfdec_audio_decoder_pull (SwfdecAudioDecoder *decoder)
{
SwfdecAudioDecoderClass *klass;
+ SwfdecBuffer *result;
g_return_val_if_fail (SWFDEC_IS_AUDIO_DECODER (decoder), NULL);
if (decoder->error)
return NULL;
klass = SWFDEC_AUDIO_DECODER_GET_CLASS (decoder);
- return klass->pull (decoder);
+ result = klass->pull (decoder);
+ /* result must be n samples of 44.1kHz stereo 16bit - and one sample is 4 bytes */
+ g_assert (result == NULL || result->length % 4);
+ return result;
}
void
diff --git a/swfdec/swfdec_audio_stream.c b/swfdec/swfdec_audio_stream.c
index 2869804..857fecd 100644
--- a/swfdec/swfdec_audio_stream.c
+++ b/swfdec/swfdec_audio_stream.c
@@ -61,7 +61,6 @@ swfdec_audio_stream_require (SwfdecAudioStream *stream, guint n_samples)
/* if the decoder still has data */
buffer = swfdec_audio_decoder_pull (stream->decoder);
if (buffer) {
- g_assert (buffer->length %4 == 0);
g_queue_push_tail (stream->queue, buffer);
stream->queue_size += buffer->length / 4;
continue;
commit 17a7bf4590986199d2c3daa680d6806c99fedfe6
Author: Benjamin Otte <otte at gnome.org>
Date: Fri Jun 20 10:48:14 2008 +0200
don't use the tag, but the action index (oops)
diff --git a/swfdec/swfdec_sprite_movie.c b/swfdec/swfdec_sprite_movie.c
index b74d61f..367cc29 100644
--- a/swfdec/swfdec_sprite_movie.c
+++ b/swfdec/swfdec_sprite_movie.c
@@ -492,8 +492,10 @@ swfdec_sprite_movie_perform_one_action (SwfdecSpriteMovie *movie, guint tag, Swf
return TRUE;
case SWFDEC_TAG_SOUNDSTREAMBLOCK:
if (!fast_forward) {
- if (movie->sound_stream == NULL)
- movie->sound_stream = swfdec_audio_swf_stream_new (player, movie->sprite, tag);
+ if (movie->sound_stream == NULL) {
+ movie->sound_stream = swfdec_audio_swf_stream_new (player, movie->sprite,
+ movie->next_action - 1);
+ }
movie->sound_active = TRUE;
}
return TRUE;
commit 3995bb40b17ba08d828c8045ce64c58570f6fc9c
Author: Benjamin Otte <otte at gnome.org>
Date: Thu Jun 19 19:37:49 2008 +0200
indentation
diff --git a/swfdec/swfdec_text_field_movie.h b/swfdec/swfdec_text_field_movie.h
index 98a17ee..613965b 100644
--- a/swfdec/swfdec_text_field_movie.h
+++ b/swfdec/swfdec_text_field_movie.h
@@ -43,11 +43,11 @@ typedef struct _SwfdecTextFieldMovieClass SwfdecTextFieldMovieClass;
struct _SwfdecTextFieldMovie {
SwfdecActor actor;
- SwfdecRect extents; /* original extents (copied from graphic) */
- cairo_matrix_t to_layout; /* matrix to go from movie => layout */
- cairo_matrix_t from_layout; /* matrix to go from layout => movie */
- SwfdecRectangle layout_area; /* layout we render to in stage coordinates */
- SwfdecRectangle stage_area; /* complete size of textfield in stage coordinates */
+ SwfdecRect extents; /* original extents (copied from graphic) */
+ cairo_matrix_t to_layout; /* matrix to go from movie => layout */
+ cairo_matrix_t from_layout; /* matrix to go from layout => movie */
+ SwfdecRectangle layout_area; /* layout we render to in stage coordinates */
+ SwfdecRectangle stage_area; /* complete size of textfield in stage coordinates */
/* properties copied from textfield */
gboolean html;
@@ -60,11 +60,11 @@ struct _SwfdecTextFieldMovie {
gboolean border;
gboolean background;
- SwfdecTextBuffer * text; /* the text + formatting */
+ SwfdecTextBuffer * text; /* the text + formatting */
- SwfdecTextLayout * layout; /* the layouted text */
- guint layout_width; /* text width in pixels */
- guint layout_height; /* text height in pixels */
+ SwfdecTextLayout * layout; /* the layouted text */
+ guint layout_width; /* text width in pixels */
+ guint layout_height; /* text height in pixels */
const char * variable;
@@ -73,15 +73,15 @@ struct _SwfdecTextFieldMovie {
gboolean condense_white;
SwfdecAsObject * style_sheet;
- const char * style_sheet_input; /* saved input, so it can be used to apply stylesheet again */
+ const char * style_sheet_input; /* saved input, so it can be used to apply stylesheet again */
- gboolean scroll_changed; /* if any of the scroll attributes have changed and we haven't fired the event yet */
- guint changed; /* number of onChanged events we have to emit */
+ gboolean scroll_changed; /* if any of the scroll attributes have changed and we haven't fired the event yet */
+ guint changed; /* number of onChanged events we have to emit */
/* scroll variables */
- guint scroll; /* current scroll offset in lines (0-indexed) */
- guint scroll_max; /* scroll must be smaller than this value */
- guint lines_visible; /* number of lines currently visible */
- guint hscroll; /* horizontal scrolling offset in pixels */
+ guint scroll; /* current scroll offset in lines (0-indexed) */
+ guint scroll_max; /* scroll must be smaller than this value */
+ guint lines_visible; /* number of lines currently visible */
+ guint hscroll; /* horizontal scrolling offset in pixels */
gboolean mouse_wheel_enabled;
const char * restrict_;
@@ -103,15 +103,17 @@ void swfdec_text_field_movie_set_text (SwfdecTextFieldMovie * movie,
const char * str,
gboolean html);
void swfdec_text_field_movie_update_scroll (SwfdecTextFieldMovie * text);
-const char * swfdec_text_field_movie_get_text (SwfdecTextFieldMovie * text);
-void swfdec_text_field_movie_set_listen_variable (SwfdecTextFieldMovie * text,
- const char * value);
-void swfdec_text_field_movie_set_listen_variable_text (SwfdecTextFieldMovie *text,
- const char * value);
-void swfdec_text_field_movie_replace_text (SwfdecTextFieldMovie * text,
- guint start_index,
- guint end_index,
- const char * str);
+const char * swfdec_text_field_movie_get_text (SwfdecTextFieldMovie * text);
+void swfdec_text_field_movie_set_listen_variable
+ (SwfdecTextFieldMovie * text,
+ const char * value);
+void swfdec_text_field_movie_set_listen_variable_text
+ (SwfdecTextFieldMovie * text,
+ const char * value);
+void swfdec_text_field_movie_replace_text (SwfdecTextFieldMovie * text,
+ guint start_index,
+ guint end_index,
+ const char * str);
guint swfdec_text_field_movie_get_hscroll_max (SwfdecTextFieldMovie * text);
@@ -121,7 +123,7 @@ void swfdec_text_field_movie_init_properties (SwfdecAsContext * cx);
/* implemented in swfdec_html_parser.c */
void swfdec_text_field_movie_html_parse (SwfdecTextFieldMovie * text,
const char * str);
-const char * swfdec_text_field_movie_get_html_text (SwfdecTextFieldMovie * text);
+const char * swfdec_text_field_movie_get_html_text (SwfdecTextFieldMovie * text);
G_END_DECLS
#endif
More information about the Swfdec-commits
mailing list