[Swfdec] libswfdec/swfdec_root_sprite.c
libswfdec/swfdec_root_sprite.h
Benjamin Otte
company at kemper.freedesktop.org
Fri Mar 9 13:08:46 PST 2007
libswfdec/swfdec_root_sprite.c | 172 +++++++++++++++++++++++++++++++++++++++++
libswfdec/swfdec_root_sprite.h | 65 +++++++++++++++
2 files changed, 237 insertions(+)
New commits:
diff-tree b86811135dd32ae460e5082f4f986664de624b89 (from 09541f87302d441396064f480fa3c8da0a07993e)
Author: Benjamin Otte <otte at gnome.org>
Date: Fri Mar 9 22:08:56 2007 +0100
Those files seem to be missing for ages
diff --git a/libswfdec/swfdec_root_sprite.c b/libswfdec/swfdec_root_sprite.c
new file mode 100644
index 0000000..e8e868b
--- /dev/null
+++ b/libswfdec/swfdec_root_sprite.c
@@ -0,0 +1,172 @@
+/* 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_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;
+ unsigned int count, i;
+
+ count = swfdec_bits_get_u16 (bits);
+ SWFDEC_LOG ("exporting %u assets", count);
+ for (i = 0; i < count; 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 {
+ 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;
+
+ 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;
+ }
+ sprite->init_action = swfdec_script_new_for_player (SWFDEC_DECODER (s)->player,
+ bits, "InitAction", s->version);
+ 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
new file mode 100644
index 0000000..3414164
--- /dev/null
+++ b/libswfdec/swfdec_root_sprite.h
@@ -0,0 +1,65 @@
+/* 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
More information about the Swfdec
mailing list