[Swfdec-commits] 4 commits - swfdec-gtk/swfdec_gtk_widget.c tools/dump.c vivified/code

Benjamin Otte company at kemper.freedesktop.org
Wed Apr 23 07:25:29 PDT 2008


 swfdec-gtk/swfdec_gtk_widget.c     |   10 ++-
 tools/dump.c                       |    3 +
 vivified/code/rewrite.c            |  100 ++++++++++++++++++++++++++++++++++---
 vivified/code/vivi_code_asm_push.c |    2 
 4 files changed, 104 insertions(+), 11 deletions(-)

New commits:
commit 1b173932ed64fc6fef39225524dd678d54c2a2c3
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Apr 23 16:03:34 2008 +0200

    implement --trace-function-names
    
    This inserts a trace() of the name of a function the first thing when it's
    called.

diff --git a/vivified/code/rewrite.c b/vivified/code/rewrite.c
index 1ae5c66..a94f412 100644
--- a/vivified/code/rewrite.c
+++ b/vivified/code/rewrite.c
@@ -26,22 +26,101 @@
 #include <swfdec/swfdec_script_internal.h>
 #include <swfdec/swfdec_tag.h>
 
+#include <vivified/code/vivi_code_asm_code_default.h>
+#include <vivified/code/vivi_code_asm_function.h>
+#include <vivified/code/vivi_code_asm_function2.h>
+#include <vivified/code/vivi_code_asm_pool.h>
+#include <vivified/code/vivi_code_asm_push.h>
 #include <vivified/code/vivi_code_assembler.h>
 #include <vivified/code/vivi_decompiler.h>
 
+typedef enum {
+  REWRITE_TRACE_FUNCTION_NAME = (1 << 0)
+} RewriteOptions;
+
+static const char *
+assembler_lookup_pool (ViviCodeAssembler *assembler, guint i)
+{
+  ViviCodeAsm *code = vivi_code_assembler_get_code (assembler, 0);
+  SwfdecConstantPool *pool;
+
+  if (!VIVI_IS_CODE_ASM_POOL (code))
+    return NULL;
+  pool = vivi_code_asm_pool_get_pool (VIVI_CODE_ASM_POOL (code));
+  if (i >= swfdec_constant_pool_size (pool))
+    return NULL;
+  return swfdec_constant_pool_get (pool, i);
+}
+
+static void
+insert_trace (ViviCodeAssembler *assembler, guint i, const char *text)
+{
+  ViviCodeAsm *code;
+
+  code = vivi_code_asm_push_new ();
+  vivi_code_asm_push_add_string (VIVI_CODE_ASM_PUSH (code), text);
+  vivi_code_assembler_insert_code (assembler, i, code);
+  g_object_unref (code);
+  code = vivi_code_asm_trace_new ();
+  vivi_code_assembler_insert_code (assembler, i + 1, code);
+  g_object_unref (code);
+}
+
+static void
+insert_function_trace (ViviCodeAssembler *assembler, const char *name)
+{
+  guint i;
+
+  for (i = 0; i < vivi_code_assembler_get_n_codes (assembler); i++) {
+    ViviCodeAsm *code = vivi_code_assembler_get_code (assembler, i);
+    if (VIVI_IS_CODE_ASM_FUNCTION (code) ||
+	VIVI_IS_CODE_ASM_FUNCTION2 (code)) {
+      const char *function_name = NULL;
+      if (i > 0 &&
+	  VIVI_IS_CODE_ASM_PUSH (vivi_code_assembler_get_code (assembler, i - 1))) {
+	ViviCodeAsmPush *push = VIVI_CODE_ASM_PUSH (vivi_code_assembler_get_code (assembler, i - 1));
+	guint n = vivi_code_asm_push_get_n_values (push);
+	if (n > 0) {
+	  ViviCodeConstantType type;
+	  n--;
+	  type = vivi_code_asm_push_get_value_type (push, n);
+	  if (type == VIVI_CODE_CONSTANT_STRING) {
+	    function_name = vivi_code_asm_push_get_string (push, n);
+	  } else if (type == VIVI_CODE_CONSTANT_CONSTANT_POOL ||
+		     type == VIVI_CODE_CONSTANT_CONSTANT_POOL_BIG) {
+	    function_name = assembler_lookup_pool (assembler, 
+		vivi_code_asm_push_get_pool (push, n));
+	  }
+	}
+      }
+      if (function_name == NULL)
+	function_name = "anonymous function";
+      insert_trace (assembler, i + 1, function_name);
+    }
+  }
+  if (VIVI_IS_CODE_ASM_POOL (vivi_code_assembler_get_code (assembler, 0)))
+    insert_trace (assembler, 1, name);
+  else
+    insert_trace (assembler, 0, name);
+}
+
+/*** INFRASTRUCTURE ***/
+
 static SwfdecBuffer *
-do_script (SwfdecBuffer *buffer, guint version)
+do_script (SwfdecBuffer *buffer, guint flags, const char *name, guint version)
 {
   ViviCodeAssembler *assembler;
   SwfdecScript *script;
   GError *error = NULL;
 
-  script = swfdec_script_new (buffer, "script", version);
+  script = swfdec_script_new (buffer, name, version);
 
   assembler = VIVI_CODE_ASSEMBLER (vivi_disassemble_script (script));
   swfdec_script_unref (script);
 
   /* FIXME: modify script here! */
+  if (flags & REWRITE_TRACE_FUNCTION_NAME)
+    insert_function_trace (assembler, name);
 
   script = vivi_code_assembler_assemble_script (assembler, version, &error);
   g_object_unref (assembler);
@@ -60,7 +139,7 @@ do_script (SwfdecBuffer *buffer, guint version)
 }
 
 static SwfdecBuffer *
-process_buffer (SwfdecBuffer *original)
+process_buffer (SwfdecBuffer *original, guint flags)
 {
   SwfdecRect rect;
   SwfdecBits bits;
@@ -103,8 +182,11 @@ process_buffer (SwfdecBuffer *original)
 	{
 	  SwfdecBuffer *sub = swfdec_buffer_new_subbuffer (buffer, 2, buffer->length - 2);
 	  SwfdecBots *bots2 = swfdec_bots_open ();
-	  swfdec_bots_put_u16 (bots2, buffer->data[0] | buffer->data[1] << 8);
-	  sub = do_script (sub, version);
+	  guint sprite = buffer->data[0] | buffer->data[1] << 8;
+	  char *name = g_strdup_printf ("DoInitAction %u", sprite);
+	  swfdec_bots_put_u16 (bots2, sprite);
+	  sub = do_script (sub, flags, name, version);
+	  g_free (name);
 	  if (sub == NULL) {
 	    swfdec_bots_free (bots2);
 	    swfdec_bots_free (bots);
@@ -118,7 +200,7 @@ process_buffer (SwfdecBuffer *original)
 	}
 	break;
       case SWFDEC_TAG_DOACTION:
-	buffer = do_script (buffer, version);
+	buffer = do_script (buffer, flags, "DoAction", version);
 	if (buffer == NULL) {
 	  swfdec_bots_free (bots);
 	  swfdec_buffer_unref (original);
@@ -191,9 +273,10 @@ main (int argc, char *argv[])
 {
   GError *error = NULL;
   SwfdecBuffer *buffer;
+  gboolean trace_function_names = FALSE;
 
   GOptionEntry options[] = {
-    //{ "asm", 'a', 0, G_OPTION_ARG_NONE, &use_asm, "output assembler instead of decompiled script", NULL },
+    { "trace-function-names", 'n', 0, G_OPTION_ARG_NONE, &trace_function_names, "trace names of called functions", NULL },
     { NULL }
   };
   GOptionContext *ctx;
@@ -228,7 +311,8 @@ main (int argc, char *argv[])
     return 1;
   }
 
-  buffer = process_buffer (buffer);
+  buffer = process_buffer (buffer,
+      (trace_function_names ? REWRITE_TRACE_FUNCTION_NAME : 0));
   if (buffer == NULL) {
     g_printerr ("\"%s\": Broken Flash file\n", argv[1]);
     return 1;
commit ee47457d89c4aa6a1a8e84464184d421ac6d458c
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Apr 23 16:03:07 2008 +0200

    use the right variable when getting push types

diff --git a/vivified/code/vivi_code_asm_push.c b/vivified/code/vivi_code_asm_push.c
index e9530eb..add3da3 100644
--- a/vivified/code/vivi_code_asm_push.c
+++ b/vivified/code/vivi_code_asm_push.c
@@ -184,7 +184,7 @@ vivi_code_asm_push_get_value_type (ViviCodeAsmPush *push, guint i)
   g_return_val_if_fail (VIVI_IS_CODE_ASM_PUSH (push), 0);
   g_return_val_if_fail (i < push->offsets->len, 0);
 
-  return push->contents->ptr[GPOINTER_TO_SIZE (g_ptr_array_index (push->offsets, i))];
+  return push->contents->data[GPOINTER_TO_SIZE (g_ptr_array_index (push->offsets, i))];
 }
 
 void
commit 792477c1aeb923eb4b85273996d288c2789a72d8
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Apr 23 16:02:54 2008 +0200

    allow setting the renderer again

diff --git a/swfdec-gtk/swfdec_gtk_widget.c b/swfdec-gtk/swfdec_gtk_widget.c
index bdf0617..9ca4131 100644
--- a/swfdec-gtk/swfdec_gtk_widget.c
+++ b/swfdec-gtk/swfdec_gtk_widget.c
@@ -484,11 +484,17 @@ swfdec_gtk_widget_update_renderer (SwfdecGtkWidget *widget)
        * similar renderer */
       priv->renderer = swfdec_player_get_renderer (priv->player);
       g_object_ref (priv->renderer);
+    } else if (priv->renderer_set) {
+      cairo_surface_t *surface = swfdec_gtk_widget_create_renderer (priv->renderer_type, 1, 1);
+      if (surface) {
+	priv->renderer = swfdec_renderer_new_for_player (
+	    surface, priv->player);
+	swfdec_player_set_renderer (priv->player, priv->renderer);
+	cairo_surface_destroy (surface);
+      }
     } else {
       cairo_t *cr = gdk_cairo_create (GTK_WIDGET (widget)->window);
 
-      if (priv->renderer_set)
-	g_printerr ("FIXME: create the right renderer\n");
       priv->renderer = swfdec_renderer_new_for_player (
 	  cairo_get_target (cr), priv->player);
       swfdec_player_set_renderer (priv->player, priv->renderer);
commit 618567b43d5d6b0e9979c0504e95a86bd4673ee4
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Apr 23 16:02:29 2008 +0200

    parse SETBACKGROUNDCOLOR tag

diff --git a/tools/dump.c b/tools/dump.c
index c6c1da3..87a03f2 100644
--- a/tools/dump.c
+++ b/tools/dump.c
@@ -156,6 +156,9 @@ dump_sprite (SwfdecSwfDecoder *dec, SwfdecSprite *s)
 	case SWFDEC_TAG_DOINITACTION:
 	  g_print ("   %4u init action\n", j);
 	  break;
+	case SWFDEC_TAG_SETBACKGROUNDCOLOR:
+	  g_print ("   %4u background color\n", j);
+	  break;
 	default:
 	  g_assert_not_reached ();
       }


More information about the Swfdec-commits mailing list