[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