Benjamin Otte
2007-Mar-07 12:24 UTC
[Swfdec] 13 commits - libswfdec/Makefile.am libswfdec/swfdec_js_global.c libswfdec/swfdec_js_movie.c libswfdec/swfdec_root_movie.c libswfdec/swfdec_root_movie.h libswfdec/swfdec_script.c libswfdec/swfdec_sprite.h libswfdec/swfdec_sprite_movie.c libswfdec/swfdec_swf_decoder.c libswfdec/swfdec_swf_decoder.h libswfdec/swfdec_tag.c libswfdec/swfdec_types.h test/trace
libswfdec/Makefile.am | 2 libswfdec/swfdec_js_global.c | 11 +++- libswfdec/swfdec_js_movie.c | 52 +++++++++++++++++++ libswfdec/swfdec_root_movie.c | 86 +++++++++++++++------------------ libswfdec/swfdec_root_movie.h | 10 +-- libswfdec/swfdec_script.c | 4 - libswfdec/swfdec_sprite.h | 2 libswfdec/swfdec_sprite_movie.c | 41 --------------- libswfdec/swfdec_swf_decoder.c | 18 ------ libswfdec/swfdec_swf_decoder.h | 4 - libswfdec/swfdec_tag.c | 52 ------------------- libswfdec/swfdec_types.h | 1 test/trace/DoInitAction-once.swf |binary test/trace/DoInitAction-once.swf.trace | 12 ++++ test/trace/DoInitAction-this.swf |binary test/trace/DoInitAction-this.swf.trace | 4 + test/trace/ExportAssets.swf |binary test/trace/ExportAssets.swf.trace | 9 +++ test/trace/Makefile.am | 2 test/trace/classes.swf |binary test/trace/classes.swf.trace | 3 + test/trace/event-order.swf |binary test/trace/event-order.swf.trace | 26 +++++++++ 23 files changed, 171 insertions(+), 168 deletions(-) New commits: diff-tree 079beedc71d1fc60cf29451ba622c1d576b6a019 (from 9257bc0640a582b887816bdc7bd96ca3ec8b724f) Author: Benjamin Otte <otte@gnome.org> Date: Wed Mar 7 21:23:11 2007 +0100 add 2 testcases classes.swf tests importing a simple class and the associated DoInitAction ExportAssets.swf tests that assets aren't exported too early diff --git a/test/trace/ExportAssets.swf b/test/trace/ExportAssets.swf new file mode 100755 index 0000000..7b1897a Binary files /dev/null and b/test/trace/ExportAssets.swf differ diff --git a/test/trace/ExportAssets.swf.trace b/test/trace/ExportAssets.swf.trace new file mode 100755 index 0000000..2bdcdde --- /dev/null +++ b/test/trace/ExportAssets.swf.trace @@ -0,0 +1,9 @@ +Test ExportAssets only works after passing the frame with the ExportAssets Tag +Frame 1 +undefined +init +Frame 4 +Test ExportAssets only works after passing the frame with the ExportAssets Tag +Frame 1 +_level0.foo +Frame 4 diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am index a0fa2ca..19a1340 100644 --- a/test/trace/Makefile.am +++ b/test/trace/Makefile.am @@ -17,6 +17,8 @@ EXTRA_DIST = \ case1-7.swf.trace \ children.swf \ children.swf.trace \ + classes.swf \ + classes.swf.trace \ color-getters.swf \ color-getters.swf.trace \ color-new.swf \ diff --git a/test/trace/classes.swf b/test/trace/classes.swf new file mode 100755 index 0000000..49fa5be Binary files /dev/null and b/test/trace/classes.swf differ diff --git a/test/trace/classes.swf.trace b/test/trace/classes.swf.trace new file mode 100755 index 0000000..e45cc82 --- /dev/null +++ b/test/trace/classes.swf.trace @@ -0,0 +1,3 @@ +test simple classes +constructed a Simple +called Simple.trace diff-tree 9257bc0640a582b887816bdc7bd96ca3ec8b724f (from 31292f06096109f9428e93036b37c4ff4fe40dd2) Author: Benjamin Otte <otte@gnome.org> Date: Wed Mar 7 21:07:15 2007 +0100 implement attachMovie diff --git a/libswfdec/swfdec_js_movie.c b/libswfdec/swfdec_js_movie.c index 2a860a4..3d04d92 100644 --- a/libswfdec/swfdec_js_movie.c +++ b/libswfdec/swfdec_js_movie.c @@ -382,6 +382,57 @@ swfdec_js_copy_props (SwfdecMovie *targe } static JSBool +swfdec_js_movie_attachMovie (JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + SwfdecMovie *movie, *ret; + const char *name, *export; + int depth; + SwfdecContent *content; + SwfdecGraphic *sprite; + + movie = JS_GetPrivate (cx, obj); + g_assert (movie); + + export = swfdec_js_to_string (cx, argv[0]); + name = swfdec_js_to_string (cx, argv[1]); + if (export == NULL || name == NULL) + return JS_FALSE; + sprite = swfdec_root_movie_get_export (SWFDEC_ROOT_MOVIE (movie->root), export); + if (!SWFDEC_IS_SPRITE (sprite)) { + if (sprite == NULL) { + SWFDEC_WARNING ("no symbol with name %s exported", export); + } else { + SWFDEC_WARNING ("can only use attachMovie with sprites"); + } + return JS_TRUE; + } + if (!JS_ValueToECMAInt32 (cx, argv[1], &depth)) + return JS_FALSE; + if (swfdec_depth_classify (depth) == SWFDEC_DEPTH_CLASS_EMPTY) + return JS_TRUE; + ret = swfdec_movie_find (movie, depth); + if (ret) + swfdec_movie_remove (ret); + content = swfdec_content_new (depth); + content->graphic = sprite; + content->depth = depth; + content->clip_depth = 0; /* FIXME: check this */ + content->name = g_strdup (name); + content->sequence = content; + content->start = 0; + content->end = G_MAXUINT; + ret = swfdec_movie_new (movie, content); + g_object_weak_ref (G_OBJECT (ret), (GWeakNotify) swfdec_content_free, content); + /* must be set by now, the movie has a name */ + if (SWFDEC_SCRIPTABLE (ret)->jsobj == NULL) + return JS_FALSE; + SWFDEC_LOG ("attached %s (%u) as %s to depth %u", export, SWFDEC_CHARACTER (sprite)->id, + ret->name, ret->depth); + *rval = OBJECT_TO_JSVAL (SWFDEC_SCRIPTABLE (ret)->jsobj); + return JS_TRUE; +} + +static JSBool swfdec_js_movie_duplicateMovieClip (JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { SwfdecMovie *movie, *ret; @@ -501,6 +552,7 @@ swfdec_js_movie_to_string (JSContext *cx } static JSFunctionSpec movieclip_methods[] = { + { "attachMovie", swfdec_js_movie_attachMovie, 3, 0, 0 }, { "duplicateMovieClip", swfdec_js_movie_duplicateMovieClip, 2, 0, 0 }, { "eval", swfdec_js_global_eval, 1, 0, 0 }, { "getBytesLoaded", mc_getBytesLoaded, 0, 0, 0 }, diff-tree 31292f06096109f9428e93036b37c4ff4fe40dd2 (from 7e360bf529767e33970858e3a79e8b54569a2cc7) Author: Benjamin Otte <otte@gnome.org> Date: Wed Mar 7 21:06:36 2007 +0100 implement ExportAssets functionality diff --git a/libswfdec/swfdec_root_movie.c b/libswfdec/swfdec_root_movie.c index 6d12de1..e7a97f4 100644 --- a/libswfdec/swfdec_root_movie.c +++ b/libswfdec/swfdec_root_movie.c @@ -129,6 +129,7 @@ swfdec_root_movie_dispose (GObject *obje g_object_unref (root->decoder); root->decoder = NULL; } + g_hash_table_destroy (root->exports); G_OBJECT_CLASS (swfdec_root_movie_parent_class)->dispose (object); } @@ -168,8 +169,9 @@ swfdec_root_movie_class_init (SwfdecRoot } static void -swfdec_root_movie_init (SwfdecRootMovie *decoder) +swfdec_root_movie_init (SwfdecRootMovie *root) { + root->exports = g_hash_table_new (g_str_hash, g_str_equal); } void @@ -240,9 +242,22 @@ swfdec_root_movie_perform_root_actions ( swfdec_script_execute (action->data, SWFDEC_SCRIPTABLE (root)); break; case SWFDEC_ROOT_ACTION_EXPORT: + { + SwfdecRootExportData *data = action->data; + g_hash_table_insert (root->exports, data->name, data->character); + } break; default: g_assert_not_reached (); } } } + +gpointer +swfdec_root_movie_get_export (SwfdecRootMovie *root, const char *name) +{ + g_return_val_if_fail (SWFDEC_IS_ROOT_MOVIE (root), NULL); + g_return_val_if_fail (name != NULL, NULL); + + return g_hash_table_lookup (root->exports, name); +} diff-tree 7e360bf529767e33970858e3a79e8b54569a2cc7 (from 5300ffc82f575563dd81f7213db86b55facc83b6) Author: Benjamin Otte <otte@gnome.org> Date: Wed Mar 7 19:39:00 2007 +0100 implement the DoInitAction part of root actions diff --git a/libswfdec/swfdec_root_movie.c b/libswfdec/swfdec_root_movie.c index aeaa529..6d12de1 100644 --- a/libswfdec/swfdec_root_movie.c +++ b/libswfdec/swfdec_root_movie.c @@ -32,6 +32,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_swf_decoder.h" #include "js/jsapi.h" @@ -213,12 +215,34 @@ swfdec_root_movie_load (SwfdecRootMovie void swfdec_root_movie_perform_root_actions (SwfdecRootMovie *root, guint frame) { + SwfdecRootSprite *sprite; + GArray *array; + guint i; + g_return_if_fail (SWFDEC_IS_ROOT_MOVIE (root)); g_return_if_fail (frame <= root->root_actions_performed); if (frame < root->root_actions_performed) return; - g_print ("performing root actions for frame %u\n", root->root_actions_performed); + sprite = SWFDEC_ROOT_SPRITE (SWFDEC_SPRITE_MOVIE (root)->sprite); + SWFDEC_LOG ("performing root actions for frame %u", root->root_actions_performed); root->root_actions_performed++; + if (!sprite->root_actions) + return; + array = sprite->root_actions[frame]; + if (array == NULL) + return; + for (i = 0; i < array->len; i++) { + SwfdecSpriteAction *action = &g_array_index (array, SwfdecSpriteAction, i); + switch (action->type) { + case SWFDEC_ROOT_ACTION_INIT_SCRIPT: + swfdec_script_execute (action->data, SWFDEC_SCRIPTABLE (root)); + break; + case SWFDEC_ROOT_ACTION_EXPORT: + break; + default: + g_assert_not_reached (); + } + } } diff-tree 5300ffc82f575563dd81f7213db86b55facc83b6 (from b5f4d15eb14eb32cc526ec0817d85bfba5f59ede) Author: Benjamin Otte <otte@gnome.org> Date: Wed Mar 7 19:30:05 2007 +0100 support _global variable diff --git a/libswfdec/swfdec_js_global.c b/libswfdec/swfdec_js_global.c index 06e83e1..0a3b6f3 100644 --- a/libswfdec/swfdec_js_global.c +++ b/libswfdec/swfdec_js_global.c @@ -245,8 +245,15 @@ static JSFunctionSpec global_methods[] void swfdec_js_add_globals (SwfdecPlayer *player) { - if (!JS_DefineFunctions (player->jscx, player->jsobj, global_methods)) { - SWFDEC_ERROR ("failed to initialize global methods"); + JSBool found = JS_FALSE; + jsval val = OBJECT_TO_JSVAL (player->jsobj); + + if (!JS_DefineFunctions (player->jscx, player->jsobj, global_methods) || + !JS_SetProperty (player->jscx, player->jsobj, "_global", &val) || + !JS_SetPropertyAttributes (player->jscx, player->jsobj, "_global", + JSPROP_READONLY | JSPROP_PERMANENT, &found) || + found != JS_TRUE) { + SWFDEC_ERROR ("failed to initialize global object"); } } diff-tree b5f4d15eb14eb32cc526ec0817d85bfba5f59ede (from 05d20a38550a904965e3152708991d2b62d89f24) Author: Benjamin Otte <otte@gnome.org> Date: Wed Mar 7 19:29:41 2007 +0100 omit object name for missing functions instead of always printing "global" diff --git a/libswfdec/swfdec_script.c b/libswfdec/swfdec_script.c index 7d93740..927aa67 100644 --- a/libswfdec/swfdec_script.c +++ b/libswfdec/swfdec_script.c @@ -653,8 +653,8 @@ swfdec_action_call_function (JSContext * if (!JS_GetProperty (cx, obj, s, &fun)) return JS_FALSE; if (!JSVAL_IS_OBJECT (fun)) { - SWFDEC_WARNING ("%s:%s is not a function", - JS_GetClass (obj)->name, s); + /* FIXME: figure out what class we operate on */ + SWFDEC_WARNING ("%s is not a function", s); } fp->sp[-1] = fun; fp->sp[-2] = OBJECT_TO_JSVAL (obj); diff-tree 05d20a38550a904965e3152708991d2b62d89f24 (from c9453f8b81e8e7ccde2e98f1ec922f6634f3bfda) Author: Benjamin Otte <otte@gnome.org> Date: Wed Mar 7 18:15:44 2007 +0100 use the right variable here diff --git a/libswfdec/swfdec_sprite_movie.c b/libswfdec/swfdec_sprite_movie.c index 91e27f6..74d2160 100644 --- a/libswfdec/swfdec_sprite_movie.c +++ b/libswfdec/swfdec_sprite_movie.c @@ -150,10 +150,8 @@ swfdec_sprite_movie_do_goto_frame (gpoin start, goto_frame, SWFDEC_CHARACTER (movie->sprite)->id); for (i = start; i <= movie->current_frame; i++) { SwfdecSpriteFrame *frame = &movie->sprite->frames[i]; - if (SWFDEC_IS_ROOT_MOVIE (movie)) { - swfdec_root_movie_perform_root_actions (SWFDEC_ROOT_MOVIE (movie), - movie->current_frame); - } + if (SWFDEC_IS_ROOT_MOVIE (movie)) + swfdec_root_movie_perform_root_actions (SWFDEC_ROOT_MOVIE (movie), i); if (frame->actions == NULL) continue; for (j = 0; j < frame->actions->len; j++) { diff-tree c9453f8b81e8e7ccde2e98f1ec922f6634f3bfda (from b168c2c784a6b4e3f5ddb800f8b9d47c32f71fbc) Author: Benjamin Otte <otte@gnome.org> Date: Wed Mar 7 17:45:33 2007 +0100 remove any mention of character data and SwfdecSpriteInfo I didn't like that concept anyway and it was only used for init actions. And init actions are going to use root actions now. diff --git a/libswfdec/swfdec_root_movie.c b/libswfdec/swfdec_root_movie.c index d01b8e4..aeaa529 100644 --- a/libswfdec/swfdec_root_movie.c +++ b/libswfdec/swfdec_root_movie.c @@ -127,10 +127,6 @@ swfdec_root_movie_dispose (GObject *obje g_object_unref (root->decoder); root->decoder = NULL; } - if (root->character_data != NULL) { - g_hash_table_destroy (root->character_data); - root->character_data = NULL; - } G_OBJECT_CLASS (swfdec_root_movie_parent_class)->dispose (object); } @@ -214,60 +210,6 @@ swfdec_root_movie_load (SwfdecRootMovie swfdec_player_launch (root->player, url, target); } -typedef struct { - gpointer data; - GDestroyNotify free; -} CharacterData; - -static void -character_data_free (gpointer datap) -{ - CharacterData *data = datap; - - if (data->free) - data->free (data->data); - - g_free (data); -} - -void -swfdec_root_movie_set_character_data (SwfdecRootMovie *movie, - SwfdecCharacter *character, gpointer data, GDestroyNotify destroy) -{ - CharacterData *cdata; - - g_return_if_fail (SWFDEC_IS_ROOT_MOVIE (movie)); - g_return_if_fail (SWFDEC_IS_CHARACTER (character)); - g_return_if_fail (data != NULL); - - cdata = g_new (CharacterData, 1); - cdata->data = data; - cdata->free = destroy; - - if (movie->character_data == NULL) { - movie->character_data = g_hash_table_new_full (g_direct_hash, - g_direct_equal, NULL, character_data_free); - } - g_hash_table_insert (movie->character_data, character, cdata); -} - -gpointer -swfdec_root_movie_get_character_data (SwfdecRootMovie *movie, - SwfdecCharacter *character) -{ - CharacterData *data; - - g_return_val_if_fail (SWFDEC_IS_ROOT_MOVIE (movie), NULL); - g_return_val_if_fail (SWFDEC_IS_CHARACTER (character), NULL); - - if (movie->character_data == NULL) - return NULL; - data = g_hash_table_lookup (movie->character_data, character); - if (!data) - return NULL; - return data->data; -} - void swfdec_root_movie_perform_root_actions (SwfdecRootMovie *root, guint frame) { diff --git a/libswfdec/swfdec_root_movie.h b/libswfdec/swfdec_root_movie.h index a7b981a..f1ae02b 100644 --- a/libswfdec/swfdec_root_movie.h +++ b/libswfdec/swfdec_root_movie.h @@ -45,7 +45,6 @@ struct _SwfdecRootMovie guint unnamed_count; /* variable used for naming unnamed movies */ guint root_actions_performed; /* root actions been performed in all frames < this*/ - GHashTable * character_data; /* custom data per character to be set by the movie using them */ }; struct _SwfdecRootMovieClass @@ -59,13 +58,6 @@ void swfdec_root_movie_load (SwfdecRo const char * url, const char * target); -void swfdec_root_movie_set_character_data (SwfdecRootMovie * movie, - SwfdecCharacter * character, - gpointer data, - GDestroyNotify destroy); -gpointer swfdec_root_movie_get_character_data (SwfdecRootMovie * movie, - SwfdecCharacter * character); - void swfdec_root_movie_perform_root_actions (SwfdecRootMovie * root, guint frame); diff --git a/libswfdec/swfdec_sprite_movie.c b/libswfdec/swfdec_sprite_movie.c index a7f728c..91e27f6 100644 --- a/libswfdec/swfdec_sprite_movie.c +++ b/libswfdec/swfdec_sprite_movie.c @@ -32,36 +32,6 @@ #include "swfdec_script.h" #include "swfdec_sprite.h" -/*** SWFDEC_SPRITE_INFO ***/ - -typedef struct _SwfdecSpriteInfo SwfdecSpriteInfo; -struct _SwfdecSpriteInfo { - gboolean init_action_has_run; /* TRUE if init actions have been run */ -}; - -static void -swfdec_sprite_info_free (gpointer infop) -{ - SwfdecSpriteInfo *info = infop; - - g_free (info); -} - -static SwfdecSpriteInfo * -swfdec_sprite_info_get (SwfdecMovie *movie, SwfdecSprite *sprite) -{ - SwfdecRootMovie *root = SWFDEC_ROOT_MOVIE (movie->root); - SwfdecSpriteInfo *info; - - info = swfdec_root_movie_get_character_data (root, SWFDEC_CHARACTER (sprite)); - if (info == NULL) { - info = g_new0 (SwfdecSpriteInfo, 1); - swfdec_root_movie_set_character_data (root, SWFDEC_CHARACTER (sprite), - info, swfdec_sprite_info_free); - } - return info; -} - /*** SWFDEC_SPRITE_MOVIE ***/ static SwfdecMovie * @@ -347,15 +317,6 @@ swfdec_sprite_movie_init_movie (SwfdecMo SwfdecSpriteMovie *movie = SWFDEC_SPRITE_MOVIE (mov); mov->n_frames = movie->sprite->n_frames; - if (movie->sprite->init_action) { - SwfdecSpriteInfo *info = swfdec_sprite_info_get (mov, movie->sprite); - - if (!info->init_action_has_run) { - swfdec_script_execute (movie->sprite->init_action, - SWFDEC_SCRIPTABLE (mov->root)); - info->init_action_has_run = TRUE; - } - } swfdec_sprite_movie_do_goto_frame (mov, GUINT_TO_POINTER (0)); if (!swfdec_sprite_movie_iterate_end (mov)) { g_assert_not_reached (); diff-tree b168c2c784a6b4e3f5ddb800f8b9d47c32f71fbc (from 2a49deac251c3b7d956508e80fa7da73956977c2) Author: Benjamin Otte <otte@gnome.org> Date: Wed Mar 7 17:37:10 2007 +0100 exports are no longer handled in the SwfDecoder diff --git a/libswfdec/swfdec_swf_decoder.c b/libswfdec/swfdec_swf_decoder.c index c1629bc..f205eed 100644 --- a/libswfdec/swfdec_swf_decoder.c +++ b/libswfdec/swfdec_swf_decoder.c @@ -54,7 +54,6 @@ swfdec_decoder_dispose (GObject *object) g_hash_table_destroy (s->characters); g_object_unref (s->main_sprite); - g_hash_table_destroy (s->exports); if (s->uncompressed_buffer) { inflateEnd (&s->z); @@ -347,19 +346,6 @@ swfdec_swf_decoder_init (SwfdecSwfDecode s->characters = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_object_unref); s->input_queue = swfdec_buffer_queue_new (); - s->exports = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); -} - -gpointer -swfdec_swf_decoder_get_export (SwfdecSwfDecoder * s, const char *name) -{ - gpointer result; - - g_return_val_if_fail (SWFDEC_IS_SWF_DECODER (s), NULL); - g_return_val_if_fail (name != NULL, NULL); - - result = g_hash_table_lookup (s->exports, name); - return result; } gpointer diff --git a/libswfdec/swfdec_swf_decoder.h b/libswfdec/swfdec_swf_decoder.h index 48541eb..6000e24 100644 --- a/libswfdec/swfdec_swf_decoder.h +++ b/libswfdec/swfdec_swf_decoder.h @@ -68,8 +68,6 @@ struct _SwfdecSwfDecoder SwfdecBuffer *jpegtables; char *url; - - GHashTable * exports; /* string->character mapping of exported characters */ }; struct _SwfdecSwfDecoderClass { @@ -83,8 +81,6 @@ gpointer swfdec_swf_decoder_get_characte gpointer swfdec_swf_decoder_create_character (SwfdecSwfDecoder * s, unsigned int id, GType type); -gpointer swfdec_swf_decoder_get_export (SwfdecSwfDecoder * s, - const char * name); SwfdecTagFunc *swfdec_swf_decoder_get_tag_func (int tag); const char *swfdec_swf_decoder_get_tag_name (int tag); diff-tree 2a49deac251c3b7d956508e80fa7da73956977c2 (from c89b368b4dc42d581d8461242c471de9d67c9487) Author: Benjamin Otte <otte@gnome.org> Date: Wed Mar 7 17:30:32 2007 +0100 add SwfdecRootSprite - a sprite that manages "root actions" "root actions" are actions that are only executed once when the root movie instance first arrives at the given frame. diff --git a/libswfdec/Makefile.am b/libswfdec/Makefile.am index cce0bbc..ecd16aa 100644 --- a/libswfdec/Makefile.am +++ b/libswfdec/Makefile.am @@ -69,6 +69,7 @@ libswfdec_@SWFDEC_MAJORMINOR@_la_SOURCES swfdec_rect.c \ swfdec_ringbuffer.c \ swfdec_root_movie.c \ + swfdec_root_sprite.c \ swfdec_script.c \ swfdec_scriptable.c \ swfdec_shape.c \ @@ -142,6 +143,7 @@ noinst_HEADERS = \ swfdec_rect.h \ swfdec_ringbuffer.h \ swfdec_root_movie.h \ + swfdec_root_sprite.h \ swfdec_script.h \ swfdec_scriptable.h \ swfdec_shape.h \ diff --git a/libswfdec/swfdec_root_movie.c b/libswfdec/swfdec_root_movie.c index c21d32d..d01b8e4 100644 --- a/libswfdec/swfdec_root_movie.c +++ b/libswfdec/swfdec_root_movie.c @@ -267,3 +267,16 @@ swfdec_root_movie_get_character_data (Sw return NULL; return data->data; } + +void +swfdec_root_movie_perform_root_actions (SwfdecRootMovie *root, guint frame) +{ + g_return_if_fail (SWFDEC_IS_ROOT_MOVIE (root)); + g_return_if_fail (frame <= root->root_actions_performed); + + if (frame < root->root_actions_performed) + return; + + g_print ("performing root actions for frame %u\n", root->root_actions_performed); + root->root_actions_performed++; +} diff --git a/libswfdec/swfdec_root_movie.h b/libswfdec/swfdec_root_movie.h index 22fa503..a7b981a 100644 --- a/libswfdec/swfdec_root_movie.h +++ b/libswfdec/swfdec_root_movie.h @@ -44,6 +44,7 @@ struct _SwfdecRootMovie SwfdecDecoder * decoder; /* decoder that decoded all the stuff used by us */ guint unnamed_count; /* variable used for naming unnamed movies */ + guint root_actions_performed; /* root actions been performed in all frames < this*/ GHashTable * character_data; /* custom data per character to be set by the movie using them */ }; @@ -65,5 +66,8 @@ void swfdec_root_movie_set_character_da gpointer swfdec_root_movie_get_character_data (SwfdecRootMovie * movie, SwfdecCharacter * character); +void swfdec_root_movie_perform_root_actions (SwfdecRootMovie * root, + guint frame); + G_END_DECLS #endif diff --git a/libswfdec/swfdec_sprite_movie.c b/libswfdec/swfdec_sprite_movie.c index 22e0458..a7f728c 100644 --- a/libswfdec/swfdec_sprite_movie.c +++ b/libswfdec/swfdec_sprite_movie.c @@ -180,6 +180,10 @@ swfdec_sprite_movie_do_goto_frame (gpoin start, goto_frame, SWFDEC_CHARACTER (movie->sprite)->id); for (i = start; i <= movie->current_frame; i++) { SwfdecSpriteFrame *frame = &movie->sprite->frames[i]; + if (SWFDEC_IS_ROOT_MOVIE (movie)) { + swfdec_root_movie_perform_root_actions (SWFDEC_ROOT_MOVIE (movie), + movie->current_frame); + } if (frame->actions == NULL) continue; for (j = 0; j < frame->actions->len; j++) { diff --git a/libswfdec/swfdec_swf_decoder.c b/libswfdec/swfdec_swf_decoder.c index 5ceb57b..c1629bc 100644 --- a/libswfdec/swfdec_swf_decoder.c +++ b/libswfdec/swfdec_swf_decoder.c @@ -36,7 +36,7 @@ #include "swfdec_debug.h" #include "swfdec_js.h" #include "swfdec_player_internal.h" -#include "swfdec_sprite.h" +#include "swfdec_root_sprite.h" enum { SWFDEC_STATE_INIT1 = 0, @@ -342,7 +342,7 @@ swfdec_swf_decoder_class_init (SwfdecSwf static void swfdec_swf_decoder_init (SwfdecSwfDecoder *s) { - s->main_sprite = g_object_new (SWFDEC_TYPE_SPRITE, NULL); + s->main_sprite = g_object_new (SWFDEC_TYPE_ROOT_SPRITE, NULL); s->characters = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_object_unref); diff --git a/libswfdec/swfdec_tag.c b/libswfdec/swfdec_tag.c index c356852..d2649b1 100644 --- a/libswfdec/swfdec_tag.c +++ b/libswfdec/swfdec_tag.c @@ -38,6 +38,7 @@ #include "swfdec_morphshape.h" #include "swfdec_movie.h" /* for SwfdecContent */ #include "swfdec_pattern.h" +#include "swfdec_root_sprite.h" #include "swfdec_script.h" #include "swfdec_shape.h" #include "swfdec_sound.h" @@ -281,30 +282,6 @@ tag_func_do_action (SwfdecSwfDecoder * s 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); - - return SWFDEC_STATUS_OK; -} - static void swfdec_button_append_content (SwfdecButton *button, guint states, SwfdecContent *content) { @@ -492,34 +469,6 @@ tag_func_define_button (SwfdecSwfDecoder } static 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 { - SWFDEC_LOG ("exporting %s %u as %s", G_OBJECT_TYPE_NAME (object), id, name); - g_object_ref (object); - g_hash_table_insert (s->exports, name, object); - } - } - - return SWFDEC_STATUS_OK; -} - -static int tag_func_define_font_info_1 (SwfdecSwfDecoder *s) { return tag_func_define_font_info (s, 1); diff --git a/libswfdec/swfdec_types.h b/libswfdec/swfdec_types.h index f601dff..0603754 100644 --- a/libswfdec/swfdec_types.h +++ b/libswfdec/swfdec_types.h @@ -49,6 +49,7 @@ typedef struct _SwfdecShape SwfdecShape; typedef struct _SwfdecShapeVec SwfdecShapeVec; typedef struct _SwfdecRect SwfdecRect; typedef struct _SwfdecRootMovie SwfdecRootMovie; +typedef struct _SwfdecRootSprite SwfdecRootSprite; typedef struct _SwfdecScript SwfdecScript; typedef struct _SwfdecScriptable SwfdecScriptable; typedef struct _SwfdecSound SwfdecSound; diff-tree c89b368b4dc42d581d8461242c471de9d67c9487 (from 939761e1986fec8be37dd6b41bee8def46bba3a8) Author: Benjamin Otte <otte@gnome.org> Date: Wed Mar 7 16:57:37 2007 +0100 make SwfdecSpriteAction type be a uint so we can use different enums diff --git a/libswfdec/swfdec_sprite.h b/libswfdec/swfdec_sprite.h index f2e7be5..779cd43 100644 --- a/libswfdec/swfdec_sprite.h +++ b/libswfdec/swfdec_sprite.h @@ -41,7 +41,7 @@ typedef enum { } SwfdecSpriteActionType; struct _SwfdecSpriteAction { - SwfdecSpriteActionType type; + guint type; gpointer data; }; diff-tree 939761e1986fec8be37dd6b41bee8def46bba3a8 (from c10f7ebd804d3331f00b0076fe28c41c9b421219) Author: Benjamin Otte <otte@gnome.org> Date: Wed Mar 7 15:04:38 2007 +0100 add debugging output diff --git a/libswfdec/swfdec_tag.c b/libswfdec/swfdec_tag.c index c81d3b9..c356852 100644 --- a/libswfdec/swfdec_tag.c +++ b/libswfdec/swfdec_tag.c @@ -289,6 +289,7 @@ tag_func_do_init_action (SwfdecSwfDecode 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); diff-tree c10f7ebd804d3331f00b0076fe28c41c9b421219 (from 12348410a3509928a6e8e4c8ca00292a58ff542c) Author: Benjamin Otte <otte@gnome.org> Date: Wed Mar 7 15:01:29 2007 +0100 seems I'm too stupid to really add files diff --git a/test/trace/DoInitAction-once.swf b/test/trace/DoInitAction-once.swf new file mode 100755 index 0000000..19bcfb7 Binary files /dev/null and b/test/trace/DoInitAction-once.swf differ diff --git a/test/trace/DoInitAction-once.swf.trace b/test/trace/DoInitAction-once.swf.trace new file mode 100755 index 0000000..2cb5c39 --- /dev/null +++ b/test/trace/DoInitAction-once.swf.trace @@ -0,0 +1,12 @@ +Check that init actions are only executed once +1 +2 +1 +2 +1 +2 +1 +2 +1 +2 +1 diff --git a/test/trace/DoInitAction-this.swf b/test/trace/DoInitAction-this.swf new file mode 100755 index 0000000..4b8b17b Binary files /dev/null and b/test/trace/DoInitAction-this.swf differ diff --git a/test/trace/DoInitAction-this.swf.trace b/test/trace/DoInitAction-this.swf.trace new file mode 100755 index 0000000..63fd536 --- /dev/null +++ b/test/trace/DoInitAction-this.swf.trace @@ -0,0 +1,4 @@ +Check this in init actions +_level0 +internal +_level0 diff --git a/test/trace/event-order.swf b/test/trace/event-order.swf new file mode 100755 index 0000000..656ac72 Binary files /dev/null and b/test/trace/event-order.swf differ diff --git a/test/trace/event-order.swf.trace b/test/trace/event-order.swf.trace new file mode 100755 index 0000000..896b194 --- /dev/null +++ b/test/trace/event-order.swf.trace @@ -0,0 +1,26 @@ +Check event order with on$Foo and $foo clipevents +load +onLoad +enterFrame +onEnterFrame +unload +onUnload +Check event order with on$Foo and $foo clipevents +load +onLoad +enterFrame +onEnterFrame +unload +onUnload +Check event order with on$Foo and $foo clipevents +load +onLoad +enterFrame +onEnterFrame +unload +onUnload +Check event order with on$Foo and $foo clipevents +load +onLoad +enterFrame +onEnterFrame
Maybe Matching Threads
- 11 commits - configure.ac libswfdec/swfdec_js_movie.c libswfdec/swfdec_root_movie.c libswfdec/swfdec_root_movie.h libswfdec/swfdec_script.c libswfdec/swfdec_sprite.c libswfdec/swfdec_sprite.h libswfdec/swfdec_sprite_movie.c libswfdec/swfdec_swf_decoder.c
- 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
- 2 commits - libswfdec/swfdec_js_movie.c libswfdec/swfdec_root_movie.h
- 17 commits - libswfdec/js libswfdec/swfdec_js.c libswfdec/swfdec_js_global.c libswfdec/swfdec_js.h libswfdec/swfdec_js_movie.c libswfdec/swfdec_movie.c libswfdec/swfdec_player.c libswfdec/swfdec_player_internal.h libswfdec/swfdec_root_movie.c
- Changes to 'refs/tags/0.4.3'