[Swfdec] Branch 'as' - libswfdec/Makefile.am libswfdec/swfdec_root_movie.c libswfdec/swfdec_root_sprite.c libswfdec/swfdec_root_sprite.h libswfdec/swfdec_swf_decoder.c libswfdec/swfdec_swf_decoder.h libswfdec/swfdec_tag.c
Benjamin Otte
company at kemper.freedesktop.org
Wed Jun 6 08:40:11 PDT 2007
libswfdec/Makefile.am | 2
libswfdec/swfdec_root_movie.c | 10 +-
libswfdec/swfdec_root_sprite.c | 178 -----------------------------------------
libswfdec/swfdec_root_sprite.h | 65 --------------
libswfdec/swfdec_swf_decoder.c | 64 ++++++++++++++
libswfdec/swfdec_swf_decoder.h | 20 ++++
libswfdec/swfdec_tag.c | 65 ++++++++++++++
7 files changed, 149 insertions(+), 255 deletions(-)
New commits:
diff-tree d06b5d5094832befb740170c297bd3861fc7068c (from bf3f17bb8f8aa3d5a9cf4d4121e77efc2c1f048c)
Author: Benjamin Otte <otte at gnome.org>
Date: Wed Jun 6 17:29:39 2007 +0200
get rid of the root sprite and put the relevant information into the SwfdecSwfDecoder
diff --git a/libswfdec/Makefile.am b/libswfdec/Makefile.am
index 68350fc..5d8a92a 100644
--- a/libswfdec/Makefile.am
+++ b/libswfdec/Makefile.am
@@ -98,7 +98,6 @@ libswfdec_ at SWFDEC_MAJORMINOR@_la_SOURCES
swfdec_rect.c \
swfdec_ringbuffer.c \
swfdec_root_movie.c \
- swfdec_root_sprite.c \
swfdec_script.c \
swfdec_shape.c \
swfdec_sound.c \
@@ -194,7 +193,6 @@ noinst_HEADERS = \
swfdec_rect.h \
swfdec_ringbuffer.h \
swfdec_root_movie.h \
- swfdec_root_sprite.h \
swfdec_script.h \
swfdec_shape.h \
swfdec_sound.h \
diff --git a/libswfdec/swfdec_root_movie.c b/libswfdec/swfdec_root_movie.c
index 1fcba46..74e2c9a 100644
--- a/libswfdec/swfdec_root_movie.c
+++ b/libswfdec/swfdec_root_movie.c
@@ -33,8 +33,8 @@
#include "swfdec_loader_internal.h"
#include "swfdec_loadertarget.h"
#include "swfdec_player_internal.h"
-#include "swfdec_root_sprite.h"
#include "swfdec_script.h"
+#include "swfdec_sprite.h"
#include "swfdec_swf_decoder.h"
@@ -216,7 +216,7 @@ swfdec_root_movie_load (SwfdecRootMovie
void
swfdec_root_movie_perform_root_actions (SwfdecRootMovie *root, guint frame)
{
- SwfdecRootSprite *sprite;
+ SwfdecSwfDecoder *s;
GArray *array;
guint i;
@@ -226,12 +226,12 @@ swfdec_root_movie_perform_root_actions (
if (frame < root->root_actions_performed)
return;
- sprite = SWFDEC_ROOT_SPRITE (SWFDEC_SPRITE_MOVIE (root)->sprite);
+ s = SWFDEC_SWF_DECODER (root->decoder);
SWFDEC_LOG ("performing root actions for frame %u", root->root_actions_performed);
root->root_actions_performed++;
- if (!sprite->root_actions)
+ if (!s->root_actions)
return;
- array = sprite->root_actions[frame];
+ array = s->root_actions[frame];
if (array == NULL)
return;
for (i = 0; i < array->len; i++) {
diff --git a/libswfdec/swfdec_root_sprite.c b/libswfdec/swfdec_root_sprite.c
deleted file mode 100644
index 7323a1e..0000000
--- a/libswfdec/swfdec_root_sprite.c
+++ /dev/null
@@ -1,178 +0,0 @@
-/* Swfdec
- * 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 <string.h>
-
-#include "swfdec_root_sprite.h"
-#include "swfdec_debug.h"
-#include "swfdec_player_internal.h"
-#include "swfdec_script.h"
-#include "swfdec_swf_decoder.h"
-
-G_DEFINE_TYPE (SwfdecRootSprite, swfdec_root_sprite, SWFDEC_TYPE_SPRITE)
-
-void
-swfdec_root_sprite_dispose (GObject *object)
-{
- SwfdecSprite *sprite = SWFDEC_SPRITE (object);
- SwfdecRootSprite *root = SWFDEC_ROOT_SPRITE (object);
- guint i,j;
-
- if (root->root_actions) {
- for (i = 0; i < sprite->n_frames; i++) {
- GArray *array = root->root_actions[i];
- if (array) {
- for (j = 0; j < array->len; j++) {
- SwfdecSpriteAction *action = &g_array_index (array, SwfdecSpriteAction, j);
-
- switch (action->type) {
- case SWFDEC_ROOT_ACTION_EXPORT:
- {
- SwfdecRootExportData *data = action->data;
- g_free (data->name);
- g_object_unref (data->character);
- g_free (data);
- }
- break;
- case SWFDEC_ROOT_ACTION_INIT_SCRIPT:
- swfdec_script_unref (action->data);
- break;
- default:
- g_assert_not_reached ();
- break;
- }
- }
- g_array_free (array, TRUE);
- }
- }
- g_free (root->root_actions);
- root->root_actions = NULL;
- }
-
- G_OBJECT_CLASS (swfdec_root_sprite_parent_class)->dispose (object);
-}
-
-static void
-swfdec_root_sprite_class_init (SwfdecRootSpriteClass * g_class)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (g_class);
-
- object_class->dispose = swfdec_root_sprite_dispose;
-}
-
-static void
-swfdec_root_sprite_init (SwfdecRootSprite * root_sprite)
-{
-}
-
-void
-swfdec_root_sprite_add_root_action (SwfdecRootSprite *root,
- SwfdecRootActionType type, gpointer data)
-{
- SwfdecSprite *sprite;
- GArray *array;
- SwfdecSpriteAction action;
-
- g_return_if_fail (SWFDEC_IS_ROOT_SPRITE (root));
- sprite = SWFDEC_SPRITE (root);
- g_return_if_fail (sprite->parse_frame < sprite->n_frames);
-
- if (root->root_actions == NULL)
- root->root_actions = g_new0 (GArray *, sprite->n_frames);
-
- array = root->root_actions[sprite->parse_frame];
- if (array == NULL) {
- root->root_actions[sprite->parse_frame] =
- g_array_new (FALSE, FALSE, sizeof (SwfdecSpriteAction));
- array = root->root_actions[sprite->parse_frame];
- }
- action.type = type;
- action.data = data;
- g_array_append_val (array, action);
-}
-
-int
-tag_func_export_assets (SwfdecSwfDecoder * s)
-{
- SwfdecBits *bits = &s->b;
- guint count, i;
-
- count = swfdec_bits_get_u16 (bits);
- SWFDEC_LOG ("exporting %u assets", count);
- for (i = 0; i < count && swfdec_bits_left (bits); i++) {
- guint id;
- SwfdecCharacter *object;
- char *name;
- id = swfdec_bits_get_u16 (bits);
- object = swfdec_swf_decoder_get_character (s, id);
- name = swfdec_bits_get_string (bits);
- if (object == NULL) {
- SWFDEC_ERROR ("cannot export id %u as %s, id wasn't found", id, name);
- g_free (name);
- } else if (name == NULL) {
- SWFDEC_ERROR ("cannot export id %u, no name was given", id);
- } else {
- SwfdecRootExportData *data = g_new (SwfdecRootExportData, 1);
- data->name = name;
- data->character = object;
- SWFDEC_LOG ("exporting %s %u as %s", G_OBJECT_TYPE_NAME (object), id, name);
- g_object_ref (object);
- swfdec_root_sprite_add_root_action (SWFDEC_ROOT_SPRITE (s->main_sprite),
- SWFDEC_ROOT_ACTION_EXPORT, data);
- }
- }
-
- return SWFDEC_STATUS_OK;
-}
-
-int
-tag_func_do_init_action (SwfdecSwfDecoder * s)
-{
- SwfdecBits *bits = &s->b;
- guint id;
- SwfdecSprite *sprite;
- char *name;
-
- id = swfdec_bits_get_u16 (bits);
- SWFDEC_LOG (" id = %u", id);
- sprite = swfdec_swf_decoder_get_character (s, id);
- if (!SWFDEC_IS_SPRITE (sprite)) {
- SWFDEC_ERROR ("character %u is not a sprite", id);
- return SWFDEC_STATUS_OK;
- }
- if (sprite->init_action != NULL) {
- SWFDEC_ERROR ("sprite %u already has an init action", id);
- return SWFDEC_STATUS_OK;
- }
- name = g_strdup_printf ("InitAction %u", id);
- sprite->init_action = swfdec_script_new_for_context (SWFDEC_AS_CONTEXT (SWFDEC_DECODER (s)->player),
- bits, name, s->version);
- g_free (name);
- if (sprite->init_action) {
- swfdec_script_ref (sprite->init_action);
- swfdec_root_sprite_add_root_action (SWFDEC_ROOT_SPRITE (s->main_sprite),
- SWFDEC_ROOT_ACTION_INIT_SCRIPT, sprite->init_action);
- }
-
- return SWFDEC_STATUS_OK;
-}
-
diff --git a/libswfdec/swfdec_root_sprite.h b/libswfdec/swfdec_root_sprite.h
deleted file mode 100644
index 3414164..0000000
--- a/libswfdec/swfdec_root_sprite.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/* Swfdec
- * 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
- */
-
-#ifndef _SWFDEC_ROOT_SPRITE_H_
-#define _SWFDEC_ROOT_SPRITE_H_
-
-#include <libswfdec/swfdec_sprite.h>
-
-G_BEGIN_DECLS
-
-typedef struct _SwfdecRootSpriteClass SwfdecRootSpriteClass;
-typedef struct _SwfdecRootExportData SwfdecRootExportData;
-
-typedef enum {
- SWFDEC_ROOT_ACTION_EXPORT, /* contains a SwfdecExportData */
- SWFDEC_ROOT_ACTION_INIT_SCRIPT, /* contains a SwfdecScript */
-} SwfdecRootActionType;
-
-struct _SwfdecRootExportData {
- char * name;
- SwfdecCharacter * character;
-};
-
-#define SWFDEC_TYPE_ROOT_SPRITE (swfdec_root_sprite_get_type())
-#define SWFDEC_IS_ROOT_SPRITE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_ROOT_SPRITE))
-#define SWFDEC_IS_ROOT_SPRITE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_ROOT_SPRITE))
-#define SWFDEC_ROOT_SPRITE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_ROOT_SPRITE, SwfdecRootSprite))
-#define SWFDEC_ROOT_SPRITE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_ROOT_SPRITE, SwfdecRootSpriteClass))
-
-struct _SwfdecRootSprite
-{
- SwfdecSprite sprite;
-
- GArray ** root_actions; /* n_frames of root actions */
-};
-
-struct _SwfdecRootSpriteClass
-{
- SwfdecGraphicClass graphic_class;
-};
-
-GType swfdec_root_sprite_get_type (void);
-
-int tag_func_export_assets (SwfdecSwfDecoder * s);
-int tag_func_do_init_action (SwfdecSwfDecoder * s);
-
-
-G_END_DECLS
-#endif
diff --git a/libswfdec/swfdec_swf_decoder.c b/libswfdec/swfdec_swf_decoder.c
index 3163448..66c6e34 100644
--- a/libswfdec/swfdec_swf_decoder.c
+++ b/libswfdec/swfdec_swf_decoder.c
@@ -35,7 +35,8 @@
#include "swfdec_cached.h"
#include "swfdec_debug.h"
#include "swfdec_player_internal.h"
-#include "swfdec_root_sprite.h"
+#include "swfdec_script.h"
+#include "swfdec_sprite.h"
enum {
SWFDEC_STATE_INIT1 = 0,
@@ -50,6 +51,38 @@ static void
swfdec_decoder_dispose (GObject *object)
{
SwfdecSwfDecoder *s = SWFDEC_SWF_DECODER (object);
+ guint i,j;
+
+ if (s->root_actions) {
+ for (i = 0; i < s->main_sprite->n_frames; i++) {
+ GArray *array = s->root_actions[i];
+ if (array) {
+ for (j = 0; j < array->len; j++) {
+ SwfdecSpriteAction *action = &g_array_index (array, SwfdecSpriteAction, j);
+
+ switch (action->type) {
+ case SWFDEC_ROOT_ACTION_EXPORT:
+ {
+ SwfdecRootExportData *data = action->data;
+ g_free (data->name);
+ g_object_unref (data->character);
+ g_free (data);
+ }
+ break;
+ case SWFDEC_ROOT_ACTION_INIT_SCRIPT:
+ swfdec_script_unref (action->data);
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+ }
+ g_array_free (array, TRUE);
+ }
+ }
+ g_free (s->root_actions);
+ s->root_actions = NULL;
+ }
g_hash_table_destroy (s->characters);
g_object_unref (s->main_sprite);
@@ -350,7 +383,7 @@ swfdec_swf_decoder_class_init (SwfdecSwf
static void
swfdec_swf_decoder_init (SwfdecSwfDecoder *s)
{
- s->main_sprite = g_object_new (SWFDEC_TYPE_ROOT_SPRITE, NULL);
+ s->main_sprite = g_object_new (SWFDEC_TYPE_SPRITE, NULL);
s->characters = g_hash_table_new_full (g_direct_hash, g_direct_equal,
NULL, g_object_unref);
@@ -400,3 +433,30 @@ swfdec_swf_decoder_create_character (Swf
return result;
}
+
+void
+swfdec_swf_decoder_add_root_action (SwfdecSwfDecoder *s,
+ SwfdecRootActionType type, gpointer data)
+{
+ SwfdecSprite *sprite;
+ GArray *array;
+ SwfdecSpriteAction action;
+
+ g_return_if_fail (SWFDEC_IS_SWF_DECODER (s));
+ sprite = s->main_sprite;
+ g_return_if_fail (sprite->parse_frame < sprite->n_frames);
+
+ if (s->root_actions == NULL)
+ s->root_actions = g_new0 (GArray *, sprite->n_frames);
+
+ array = s->root_actions[sprite->parse_frame];
+ if (array == NULL) {
+ s->root_actions[sprite->parse_frame] =
+ g_array_new (FALSE, FALSE, sizeof (SwfdecSpriteAction));
+ array = s->root_actions[sprite->parse_frame];
+ }
+ action.type = type;
+ action.data = data;
+ g_array_append_val (array, action);
+}
+
diff --git a/libswfdec/swfdec_swf_decoder.h b/libswfdec/swfdec_swf_decoder.h
index 63dec23..a913447 100644
--- a/libswfdec/swfdec_swf_decoder.h
+++ b/libswfdec/swfdec_swf_decoder.h
@@ -35,6 +35,17 @@ G_BEGIN_DECLS
//typedef struct _SwfdecSwfDecoder SwfdecSwfDecoder;
typedef struct _SwfdecSwfDecoderClass SwfdecSwfDecoderClass;
typedef int SwfdecTagFunc (SwfdecSwfDecoder *);
+typedef struct _SwfdecRootExportData SwfdecRootExportData;
+
+typedef enum {
+ SWFDEC_ROOT_ACTION_EXPORT, /* contains a SwfdecExportData */
+ SWFDEC_ROOT_ACTION_INIT_SCRIPT, /* contains a SwfdecScript */
+} SwfdecRootActionType;
+
+struct _SwfdecRootExportData {
+ char * name;
+ SwfdecCharacter * character;
+};
#define SWFDEC_TYPE_SWF_DECODER (swfdec_swf_decoder_get_type())
#define SWFDEC_IS_SWF_DECODER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_SWF_DECODER))
@@ -62,6 +73,7 @@ struct _SwfdecSwfDecoder
GHashTable *characters; /* list of all objects with an id (called characters) */
SwfdecSprite *main_sprite;
SwfdecSprite *parse_sprite;
+ GArray **root_actions; /* actions to be executed by the root sprite */
gboolean protection; /* TRUE is this file is protected and may not be edited */
char *password; /* MD5'd password to open for editing or NULL if may not be opened */
@@ -77,11 +89,15 @@ struct _SwfdecSwfDecoderClass {
GType swfdec_swf_decoder_get_type (void);
gpointer swfdec_swf_decoder_get_character (SwfdecSwfDecoder * s,
- guint id);
+ guint id);
gpointer swfdec_swf_decoder_create_character (SwfdecSwfDecoder * s,
- guint id,
+ guint id,
GType type);
+void swfdec_swf_decoder_add_root_action (SwfdecSwfDecoder * s,
+ SwfdecRootActionType type,
+ gpointer data);
+
SwfdecTagFunc *swfdec_swf_decoder_get_tag_func (int tag);
const char *swfdec_swf_decoder_get_tag_name (int tag);
int swfdec_swf_decoder_get_tag_flag (int tag);
diff --git a/libswfdec/swfdec_tag.c b/libswfdec/swfdec_tag.c
index 10a33b6..9fc60f5 100644
--- a/libswfdec/swfdec_tag.c
+++ b/libswfdec/swfdec_tag.c
@@ -39,7 +39,6 @@
#include "swfdec_movie.h" /* for SwfdecContent */
#include "swfdec_pattern.h"
#include "swfdec_player_internal.h"
-#include "swfdec_root_sprite.h"
#include "swfdec_script.h"
#include "swfdec_shape.h"
#include "swfdec_sound.h"
@@ -532,6 +531,70 @@ tag_func_file_attributes (SwfdecSwfDecod
return SWFDEC_STATUS_OK;
}
+int
+tag_func_export_assets (SwfdecSwfDecoder * s)
+{
+ SwfdecBits *bits = &s->b;
+ guint count, i;
+
+ count = swfdec_bits_get_u16 (bits);
+ SWFDEC_LOG ("exporting %u assets", count);
+ for (i = 0; i < count && swfdec_bits_left (bits); i++) {
+ guint id;
+ SwfdecCharacter *object;
+ char *name;
+ id = swfdec_bits_get_u16 (bits);
+ object = swfdec_swf_decoder_get_character (s, id);
+ name = swfdec_bits_get_string (bits);
+ if (object == NULL) {
+ SWFDEC_ERROR ("cannot export id %u as %s, id wasn't found", id, name);
+ g_free (name);
+ } else if (name == NULL) {
+ SWFDEC_ERROR ("cannot export id %u, no name was given", id);
+ } else {
+ SwfdecRootExportData *data = g_new (SwfdecRootExportData, 1);
+ data->name = name;
+ data->character = object;
+ SWFDEC_LOG ("exporting %s %u as %s", G_OBJECT_TYPE_NAME (object), id, name);
+ g_object_ref (object);
+ swfdec_swf_decoder_add_root_action (s, SWFDEC_ROOT_ACTION_EXPORT, data);
+ }
+ }
+
+ return SWFDEC_STATUS_OK;
+}
+
+int
+tag_func_do_init_action (SwfdecSwfDecoder * s)
+{
+ SwfdecBits *bits = &s->b;
+ guint id;
+ SwfdecSprite *sprite;
+ char *name;
+
+ id = swfdec_bits_get_u16 (bits);
+ SWFDEC_LOG (" id = %u", id);
+ sprite = swfdec_swf_decoder_get_character (s, id);
+ if (!SWFDEC_IS_SPRITE (sprite)) {
+ SWFDEC_ERROR ("character %u is not a sprite", id);
+ return SWFDEC_STATUS_OK;
+ }
+ if (sprite->init_action != NULL) {
+ SWFDEC_ERROR ("sprite %u already has an init action", id);
+ return SWFDEC_STATUS_OK;
+ }
+ name = g_strdup_printf ("InitAction %u", id);
+ sprite->init_action = swfdec_script_new_for_context (SWFDEC_AS_CONTEXT (SWFDEC_DECODER (s)->player),
+ bits, name, s->version);
+ g_free (name);
+ if (sprite->init_action) {
+ swfdec_script_ref (sprite->init_action);
+ swfdec_swf_decoder_add_root_action (s, SWFDEC_ROOT_ACTION_INIT_SCRIPT, sprite->init_action);
+ }
+
+ return SWFDEC_STATUS_OK;
+}
+
/* may appear inside DefineSprite */
#define SPRITE 1
struct tag_func_struct
More information about the Swfdec
mailing list