[Swfdec] 7 commits - libswfdec/swfdec_image.c
libswfdec/swfdec_script.c libswfdec/swfdec_script.h
test/Makefile.am test/swfdec_out.c test/swfdec_out.h
test/swfedit.c test/swfedit_list.c test/swfedit_tag.c
test/swfedit_token.c test/swfedit_token.h test/swfscript.c
Benjamin Otte
company at kemper.freedesktop.org
Wed Feb 14 06:58:25 PST 2007
libswfdec/swfdec_image.c | 2
libswfdec/swfdec_script.c | 25 +++
libswfdec/swfdec_script.h | 3
test/Makefile.am | 6
test/swfdec_out.c | 10 +
test/swfdec_out.h | 3
test/swfedit.c | 2
test/swfedit_list.c | 18 ++
test/swfedit_tag.c | 15 ++
test/swfedit_token.c | 37 +++++
test/swfedit_token.h | 3
test/swfscript.c | 301 ++++++++++++++++++++++++++++++++++++++++++++++
12 files changed, 418 insertions(+), 7 deletions(-)
New commits:
diff-tree 98049e91f2ff8cd1cc2ad5b9ae5952653d065ad7 (from 0a2ba5fca5d5cd32a0161d2c6815166e4a35721c)
Author: Benjamin Otte <otte at gnome.org>
Date: Wed Feb 14 15:58:21 2007 +0100
fix rowstride computation in jpeg3 case
diff --git a/libswfdec/swfdec_image.c b/libswfdec/swfdec_image.c
index 4d59b99..dc96fb6 100644
--- a/libswfdec/swfdec_image.c
+++ b/libswfdec/swfdec_image.c
@@ -249,7 +249,7 @@ swfdec_image_jpeg3_load (SwfdecImage *im
}
swfdec_cached_load (SWFDEC_CACHED (image), 4 * image->width * image->height);
image->data = jpeg_decoder_get_argb_image (dec);
- image->rowstride = image->width;
+ image->rowstride = image->width * 4;
jpeg_decoder_free (dec);
buffer = swfdec_bits_decompress (&bits, -1, image->width * image->height);
diff-tree 0a2ba5fca5d5cd32a0161d2c6815166e4a35721c (from parents)
Merge: dfd539e9810bd1e307838deb89a429ffe41da37a 46831ced770ebb02396352f786f861624f4b424a
Author: Benjamin Otte <otte at gnome.org>
Date: Wed Feb 14 15:36:06 2007 +0100
Merge branch 'master' of ssh://company@git.freedesktop.org/git/swfdec
diff-tree dfd539e9810bd1e307838deb89a429ffe41da37a (from 147c712c0ac2f90a6ecbb83ad067b2fd3efd454f)
Author: Benjamin Otte <otte at gnome.org>
Date: Wed Feb 14 15:35:43 2007 +0100
add swfscript - a tool to batch-modify scripts of existing SWF files
diff --git a/test/Makefile.am b/test/Makefile.am
index b55bf0f..e31046b 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -3,7 +3,7 @@ SUBDIRS = image sound trace various
noinst_LTLIBRARIES = libswfedit.la
if WITH_GTK
-noinst_PROGRAMS = swfdec-extract dump parse swfedit
+noinst_PROGRAMS = swfdec-extract dump parse swfedit swfscript
else
noinst_PROGRAMS = swfdec-extract dump parse
endif
@@ -24,6 +24,10 @@ swfedit_CFLAGS = $(GLOBAL_CFLAGS) $(SWF_
swfedit_LDFLAGS = $(SWF_LIBS) $(GTK_LIBS)
swfedit_LDADD = libswfedit.la
+swfscript_CFLAGS = $(GLOBAL_CFLAGS) $(SWF_CFLAGS) $(GTK_CFLAGS) -DXP_UNIX -I$(top_builddir)/libswfdec/js
+swfscript_LDFLAGS = $(SWF_LIBS) $(GTK_LIBS)
+swfscript_LDADD = libswfedit.la
+
libswfedit_la_SOURCES = \
swfdec_out.c \
swfedit_file.c \
diff --git a/test/swfscript.c b/test/swfscript.c
new file mode 100644
index 0000000..40d0e27
--- /dev/null
+++ b/test/swfscript.c
@@ -0,0 +1,301 @@
+/* Swfedit
+ * Copyright (C) 2007 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 <gtk/gtk.h>
+#include "libswfdec/swfdec_script.h"
+#include "swfdec_out.h"
+#include "swfedit_file.h"
+
+/* the stuff we look for */
+guint *add_trace = NULL;
+
+typedef gboolean ( *SwfeditTokenForeachFunc) (SwfeditToken *token, guint idx,
+ const char *name, SwfeditTokenType type, gconstpointer value, gpointer data);
+
+static gboolean
+swfedit_token_foreach (SwfeditToken *token, SwfeditTokenForeachFunc func,
+ gpointer data)
+{
+ SwfeditTokenEntry *entry;
+ guint i;
+
+ g_return_val_if_fail (SWFEDIT_IS_TOKEN (token), FALSE);
+ g_return_val_if_fail (func != NULL, FALSE);
+
+ for (i = 0; i < token->tokens->len; i++) {
+ entry = &g_array_index (token->tokens, SwfeditTokenEntry, i);
+ if (!func (token, i, entry->name, entry->type, entry->value, data))
+ return FALSE;
+ if (entry->type == SWFEDIT_TOKEN_OBJECT) {
+ if (!swfedit_token_foreach (entry->value, func, data))
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+typedef struct {
+ guint offset; /* offset in bytes from start of script */
+ guint new_offset; /* new offset in bytes from start of script */
+ guint new_actions; /* number of actions in new script */
+} Action;
+
+typedef struct {
+ SwfdecScript * script; /* the original script */
+ SwfdecOut * out; /* output for new script or NULL when buffer is set */
+ SwfdecBuffer * buffer; /* buffer containing new script or NULL while constructing */
+ GArray * actions; /* all actions in the script */
+} State;
+
+static gboolean
+action_in_array (guint *array, guint action)
+{
+ if (array == NULL)
+ return FALSE;
+ while (*array != 0) {
+ if (*array == action)
+ return TRUE;
+ array++;
+ }
+ return FALSE;
+}
+
+static guint
+lookup_offset (GArray *array, guint offset)
+{
+ guint i;
+ for (i = 0; i < array->len; i++) {
+ Action *action = &g_array_index (array, Action, i);
+ if (action->offset == offset)
+ return action->new_offset;
+ }
+ g_assert_not_reached ();
+ return 0;
+}
+
+static gboolean
+fixup_jumps_foreach (gconstpointer bytecode, guint action,
+ const guint8 *data, guint len, gpointer user_data)
+{
+ State *state = user_data;
+
+ if (action == 0x99 || action == 0x9d) {
+ guint offset = (guint8 *) bytecode - state->script->buffer->data;
+ guint jump_offset = offset + 5 + GINT16_FROM_LE (*((gint16 *) data));
+ offset = lookup_offset (state->actions, offset);
+ jump_offset = lookup_offset (state->actions, jump_offset);
+ *((gint16 *) &state->buffer->data[offset + 3]) =
+ GINT16_TO_LE (jump_offset - offset - 5);
+ }
+ if (action == 0x8a || action == 0x8d) {
+ Action *cur;
+ guint id = action == 0x8a ? 2 : 0;
+ guint i, count;
+ guint offset = (guint8 *) bytecode - state->script->buffer->data;
+ for (i = 0; i < state->actions->len; i++) {
+ cur = &g_array_index (state->actions, Action, i);
+ if (cur->offset == offset) {
+ offset = cur->new_offset;
+ break;
+ }
+ }
+ g_assert (i < state->actions->len);
+ i = data[id];
+ count = cur->new_actions - 1; /* FIXME: only works as long as we append actions */
+ while (i > 0) {
+ cur++;
+ count += cur->new_actions;
+ i--;
+ }
+ g_assert (count < 256);
+ state->buffer->data[offset + 3 + id] = count;
+ }
+ return TRUE;
+}
+
+static gboolean
+modify_script_foreach (gconstpointer bytecode, guint action,
+ const guint8 *data, guint len, gpointer user_data)
+{
+ Action next;
+ State *state = user_data;
+
+ next.offset = (guint8 *) bytecode - state->script->buffer->data;
+ next.new_offset = swfdec_out_get_bits (state->out) / 8;
+ next.new_actions = 1;
+ swfdec_out_put_u8 (state->out, action);
+ if (action & 0x80) {
+ swfdec_out_put_u16 (state->out, len);
+ swfdec_out_put_data (state->out, data, len);
+ }
+ if (action_in_array (add_trace, action)) {
+ swfdec_out_put_u8 (state->out, 0x4c); /* PushDuplicate */
+ swfdec_out_put_u8 (state->out, 0x26); /* Trace */
+ next.new_actions += 2;
+ }
+ g_array_append_val (state->actions, next);
+ return TRUE;
+}
+
+static gboolean
+modify_file (SwfeditToken *token, guint idx, const char *name,
+ SwfeditTokenType type, gconstpointer value, gpointer data)
+{
+ Action end;
+ SwfdecBits bits;
+ SwfdecScript *script;
+ State state;
+
+ if (type != SWFEDIT_TOKEN_SCRIPT)
+ return TRUE;
+
+ state.script = (SwfdecScript *) value;
+ state.out = swfdec_out_open ();
+ state.buffer = NULL;
+ state.actions = g_array_new (FALSE, FALSE, sizeof (Action));
+ swfdec_script_foreach (state.script, modify_script_foreach, &state);
+ /* compute end offset */
+ end.offset = g_array_index (state.actions, Action, state.actions->len - 1).offset;
+ if (state.script->buffer->data[end.offset] & 0x80) {
+ end.offset += GUINT16_FROM_LE (*((guint16* ) &state.script->buffer->data[end.offset + 1])) + 3;
+ } else {
+ end.offset++;
+ }
+ end.new_offset = swfdec_out_get_bits (state.out) / 8;
+ end.new_actions = 0;
+ g_array_append_val (state.actions, end);
+#if 0
+ {
+ guint i;
+ for (i = 0; i < state.actions->len; i++) {
+ Action *action = &g_array_index (state.actions, Action, i);
+ g_print ("%u %u => %u (%u actions)\n", i, action->offset,
+ action->new_offset, action->new_actions);
+ }
+ }
+#endif
+ /* maybe append 0 byte */
+ if (end.offset + 1 == state.script->buffer->length) {
+ swfdec_out_put_u8 (state.out, 0);
+ } else {
+ g_assert (end.offset == state.script->buffer->length);
+ }
+ state.buffer = swfdec_out_close (state.out);
+ state.out = NULL;
+ swfdec_script_foreach (state.script, fixup_jumps_foreach, &state);
+ g_array_free (state.actions, TRUE);
+#if 0
+ g_print ("got a new script in %u bytes - old script was %u bytes\n",
+ state.buffer->length, state.script->buffer->length);
+#endif
+ swfdec_bits_init (&bits, state.buffer);
+ script = swfdec_script_new (&bits, state.script->name, state.script->version);
+ swfdec_buffer_unref (state.buffer);
+ g_assert (script);
+ swfedit_token_set (token, idx, script);
+
+ return TRUE;
+}
+
+static guint *
+string_to_action_list (const char *list)
+{
+ char **actions = g_strsplit (list, ",", -1);
+ guint *ret;
+ guint i, len;
+
+ len = g_strv_length (actions);
+ ret = g_new (guint, len + 1);
+ ret[len] = 0;
+ for (i = 0; i < len; i++) {
+ ret[i] = swfdec_action_get_from_name (actions[i]);
+ if (ret[i] == 0) {
+ g_printerr ("No such action \"%s\"\n", actions[i]);
+ g_free (actions);
+ g_free (ret);
+ return NULL;
+ }
+ }
+ g_free (actions);
+ return ret;
+}
+
+int
+main (int argc, char **argv)
+{
+ SwfeditFile *file;
+ GError *error = NULL;
+ char *add_trace_s = NULL;
+ GOptionEntry options[] = {
+ { "add-trace", 't', 0, G_OPTION_ARG_STRING, &add_trace_s, "list of actions to trace", "ACTION, ACTION" },
+ { NULL }
+ };
+ GOptionContext *ctx;
+
+ ctx = g_option_context_new ("");
+ g_option_context_add_main_entries (ctx, options, "options");
+ g_option_context_add_group (ctx, gtk_get_option_group (TRUE));
+ g_option_context_parse (ctx, &argc, &argv, &error);
+ g_option_context_free (ctx);
+ if (error) {
+ g_printerr ("error parsing arguments: %s\n", error->message);
+ g_error_free (error);
+ return 1;
+ }
+
+ if (argc < 2) {
+ g_printerr ("Usage: %s FILENAME [OUTPUT-FILENAME]\n", argv[0]);
+ return 1;
+ }
+ if (add_trace_s) {
+ add_trace = string_to_action_list (add_trace_s);
+ g_free (add_trace_s);
+ if (add_trace == NULL)
+ return 1;
+ }
+ file = swfedit_file_new (argv[1], &error);
+ if (file == NULL) {
+ g_printerr ("error opening file %s: %s\n", argv[1], error->message);
+ g_error_free (error);
+ return 1;
+ }
+ if (!swfedit_token_foreach (SWFEDIT_TOKEN (file), modify_file, NULL)) {
+ g_printerr ("modifying file %s failed.\n", argv[1]);
+ g_object_unref (file);
+ return 1;
+ }
+ g_free (file->filename);
+ if (argc > 2) {
+ file->filename = g_strdup (argv[2]);
+ } else {
+ file->filename = g_strdup_printf ("%s.out.swf", argv[1]);
+ }
+ if (!swfedit_file_save (file, &error)) {
+ g_printerr ("Error saving file: %s\n", error->message);
+ g_error_free (error);
+ }
+ g_print ("saved modified file to %s\n", file->filename);
+ g_object_unref (file);
+ return 0;
+}
+
diff-tree 147c712c0ac2f90a6ecbb83ad067b2fd3efd454f (from e08ecaf9a240b52e46ba4b6da01016420e4943ac)
Author: Benjamin Otte <otte at gnome.org>
Date: Wed Feb 14 15:31:52 2007 +0100
automatically update size fields
diff --git a/test/swfedit_list.c b/test/swfedit_list.c
index 289d7de..36e0295 100644
--- a/test/swfedit_list.c
+++ b/test/swfedit_list.c
@@ -46,9 +46,25 @@ swfedit_list_changed (SwfeditToken *toke
swfedit_token_set_visible (token, j, entry->value != NULL);
}
}
+ /* update length */
+ j = list->def[i % list->n_defs].n_items;
+ if (j != 0) {
+ SwfeditTokenEntry *entry = &g_array_index (token->tokens,
+ SwfeditTokenEntry, j - 1);
+ if (entry->type == SWFEDIT_TOKEN_UINT32) {
+ SwfdecOut *out = swfdec_out_open ();
+ SwfdecBuffer *buffer;
+ swfedit_tag_write_token (token, out, i);
+ buffer = swfdec_out_close (out);
+ if (entry->value != GUINT_TO_POINTER (buffer->length)) {
+ swfedit_token_set (token, i / list->n_defs * list->n_defs + j - 1,
+ GUINT_TO_POINTER (buffer->length));
+ }
+ swfdec_buffer_unref (buffer);
+ }
+ }
/* maybe add items */
if (i == token->tokens->len - 1) {
- g_print ("add fett neue items, man!\n");
for (j = 0; j < list->n_defs; j++) {
const SwfeditTagDefinition *def = &list->def[(j + 1) % list->n_defs];
swfedit_tag_add_token (SWFEDIT_TOKEN (list), def->name, def->type, def->hint);
diff --git a/test/swfedit_tag.c b/test/swfedit_tag.c
index 75137a5..b69a5d5 100644
--- a/test/swfedit_tag.c
+++ b/test/swfedit_tag.c
@@ -396,6 +396,21 @@ swfedit_tag_changed (SwfeditToken *token
swfedit_token_set_visible (token, j, entry->value != NULL);
}
}
+ if (def[i].n_items != 0) {
+ SwfeditTokenEntry *entry = &g_array_index (token->tokens,
+ SwfeditTokenEntry, def[i].n_items - 1);
+ if (entry->type == SWFEDIT_TOKEN_UINT32) {
+ SwfdecOut *out = swfdec_out_open ();
+ SwfdecBuffer *buffer;
+ swfedit_tag_write_token (token, out, def[i].n_items - 1);
+ buffer = swfdec_out_close (out);
+ if (entry->value != GUINT_TO_POINTER (buffer->length)) {
+ swfedit_token_set (token, def[i].n_items - 1,
+ GUINT_TO_POINTER (buffer->length));
+ }
+ swfdec_buffer_unref (buffer);
+ }
+ }
}
static void
diff-tree e08ecaf9a240b52e46ba4b6da01016420e4943ac (from e067398923300c8505c62abd3f0e7c020e9cbe9b)
Author: Benjamin Otte <otte at gnome.org>
Date: Wed Feb 14 15:31:17 2007 +0100
Add swfedit_token_set to set by index
rename swfedit_token_set to swfedit_token_set_iter
diff --git a/test/swfedit.c b/test/swfedit.c
index 7e13bd6..24f2980 100644
--- a/test/swfedit.c
+++ b/test/swfedit.c
@@ -60,7 +60,7 @@ cell_renderer_edited (GtkCellRenderer *r
&iter, path)) {
g_assert_not_reached ();
}
- swfedit_token_set (SWFEDIT_TOKEN (file), &iter, new_text);
+ swfedit_token_set_iter (SWFEDIT_TOKEN (file), &iter, new_text);
}
static gboolean
diff --git a/test/swfedit_token.c b/test/swfedit_token.c
index 005e6c1..06c1aa4 100644
--- a/test/swfedit_token.c
+++ b/test/swfedit_token.c
@@ -314,12 +314,13 @@ swfedit_script_new (void)
static gboolean
swfedit_script_from_string (const char *s, gpointer* result)
{
- SwfdecBuffer *buffer;
+ gpointer buffer;
SwfdecBits bits;
SwfdecScript *script;
- if (swfedit_binary_from_string (s, (gpointer *) &buffer))
+ if (!swfedit_binary_from_string (s, &buffer)) {
return FALSE;
+ }
swfdec_bits_init (&bits, buffer);
script = swfdec_script_new (&bits, "unknown", 6 /* FIXME */);
@@ -703,7 +704,37 @@ swfedit_token_add (SwfeditToken *token,
}
void
-swfedit_token_set (SwfeditToken *token, GtkTreeIter *iter, const char *value)
+swfedit_token_set (SwfeditToken *token, guint i, gpointer value)
+{
+ SwfeditTokenClass *klass;
+ SwfeditTokenEntry *entry;
+ GtkTreePath *path;
+ SwfeditToken *model;
+ GtkTreeIter iter;
+
+ g_return_if_fail (SWFEDIT_IS_TOKEN (token));
+ g_return_if_fail (i < token->tokens->len);
+
+ entry = &g_array_index (token->tokens, SwfeditTokenEntry, i);
+ if (converters[entry->type].free != NULL)
+ converters[entry->type].free (entry->value);
+ entry->value = value;
+ klass = SWFEDIT_TOKEN_GET_CLASS (token);
+ if (klass->changed)
+ klass->changed (token, i);
+
+ model = token;
+ while (model->parent)
+ model = model->parent;
+ iter.user_data = token;
+ iter.user_data2 = GUINT_TO_POINTER (i);
+ path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter);
+ gtk_tree_model_row_changed (GTK_TREE_MODEL (model), path, &iter);
+ gtk_tree_path_free (path);
+}
+
+void
+swfedit_token_set_iter (SwfeditToken *token, GtkTreeIter *iter, const char *value)
{
SwfeditTokenClass *klass;
GtkTreeModel *model;
diff --git a/test/swfedit_token.h b/test/swfedit_token.h
index c9e522f..448f4cb 100644
--- a/test/swfedit_token.h
+++ b/test/swfedit_token.h
@@ -94,6 +94,9 @@ void swfedit_token_add (SwfeditToken *
SwfeditTokenType type,
gpointer value);
void swfedit_token_set (SwfeditToken * token,
+ guint i,
+ gpointer value);
+void swfedit_token_set_iter (SwfeditToken * token,
GtkTreeIter * iter,
const char * value);
void swfedit_token_set_visible (SwfeditToken * token,
diff-tree e067398923300c8505c62abd3f0e7c020e9cbe9b (from cd8d70bf421ec13b317a7f7e682c4fb5d13f2663)
Author: Benjamin Otte <otte at gnome.org>
Date: Wed Feb 14 15:25:06 2007 +0100
Add swfdec_out_put_data
diff --git a/test/swfdec_out.c b/test/swfdec_out.c
index b17cedb..ecf5a83 100644
--- a/test/swfdec_out.c
+++ b/test/swfdec_out.c
@@ -112,6 +112,16 @@ swfdec_out_prepare_bytes (SwfdecOut *out
}
void
+swfdec_out_put_data (SwfdecOut *out, const guint8 *data, guint length)
+{
+ g_return_if_fail (out != NULL);
+
+ swfdec_out_prepare_bytes (out, length);
+ memcpy (out->ptr, data, length);
+ out->ptr += length;
+}
+
+void
swfdec_out_put_buffer (SwfdecOut *out, SwfdecBuffer *buffer)
{
g_return_if_fail (out != NULL);
diff --git a/test/swfdec_out.h b/test/swfdec_out.h
index 3a22f36..e343f9d 100644
--- a/test/swfdec_out.h
+++ b/test/swfdec_out.h
@@ -57,6 +57,9 @@ void swfdec_out_put_bits (SwfdecOut *
void swfdec_out_put_sbits (SwfdecOut * out,
int bits,
guint n_bits);
+void swfdec_out_put_data (SwfdecOut * out,
+ const guint8 * data,
+ guint length);
void swfdec_out_put_buffer (SwfdecOut * out,
SwfdecBuffer * buffer);
void swfdec_out_put_u8 (SwfdecOut * out,
diff-tree cd8d70bf421ec13b317a7f7e682c4fb5d13f2663 (from 634736d7d5ba5b7e3ef43893278b95fac05a3cb2)
Author: Benjamin Otte <otte at gnome.org>
Date: Wed Feb 14 15:24:37 2007 +0100
add swfdec_action_get_name and swfdec_action_get_from_name
Two functions to be used by utilities that do a action code <=> string mapping
diff --git a/libswfdec/swfdec_script.c b/libswfdec/swfdec_script.c
index bf0fb07..14feaa1 100644
--- a/libswfdec/swfdec_script.c
+++ b/libswfdec/swfdec_script.c
@@ -2415,3 +2415,28 @@ swfdec_script_execute (SwfdecScript *scr
return ok ? frame.rval : JSVAL_VOID;
}
+/*** UTILITY FUNCTIONS ***/
+
+const char *
+swfdec_action_get_name (guint action)
+{
+ g_return_val_if_fail (action < 256, NULL);
+
+ return actions[action].name;
+}
+
+guint
+swfdec_action_get_from_name (const char *name)
+{
+ guint i;
+
+ g_return_val_if_fail (name != NULL, 0);
+
+ for (i = 0; i < 256; i++) {
+ if (actions[i].name && g_str_equal (name, actions[i].name))
+ return i;
+ }
+ return 0;
+}
+
+
diff --git a/libswfdec/swfdec_script.h b/libswfdec/swfdec_script.h
index e202aa0..93f59b9 100644
--- a/libswfdec/swfdec_script.h
+++ b/libswfdec/swfdec_script.h
@@ -43,6 +43,9 @@ struct _SwfdecScript {
SwfdecBuffer * constant_pool; /* constant pool action */
};
+const char * swfdec_action_get_name (guint action);
+guint swfdec_action_get_from_name (const char * name);
+
SwfdecScript * swfdec_script_new (SwfdecBits * bits,
const char * name,
unsigned int version);
More information about the Swfdec
mailing list