Benjamin Otte
2007-Jul-12 13:36 UTC
[Swfdec] Branch 'as' - 6 commits - libswfdec/swfdec_as_interpret.c libswfdec/swfdec_movie.c libswfdec/swfdec_sprite_movie_as.c test/trace
libswfdec/swfdec_as_interpret.c | 5 + libswfdec/swfdec_movie.c | 21 +++++--- libswfdec/swfdec_sprite_movie_as.c | 19 ++++--- test/trace/Makefile.am | 18 +++++++ test/trace/clonesprite-events-5.swf |binary test/trace/clonesprite-events-5.swf.trace | 4 + test/trace/clonesprite-events-6.swf |binary test/trace/clonesprite-events-6.swf.trace | 8 +++ test/trace/clonesprite-events-7.swf |binary test/trace/clonesprite-events-7.swf.trace | 8 +++ test/trace/clonesprite-events-8.swf |binary test/trace/clonesprite-events-8.swf.trace | 8 +++ test/trace/clonesprite-events.c | 58 +++++++++++++++++++++++ test/trace/duplicateMovieClip-events-5.swf |binary test/trace/duplicateMovieClip-events-5.swf.trace | 4 + test/trace/duplicateMovieClip-events-6.swf |binary test/trace/duplicateMovieClip-events-6.swf.trace | 8 +++ test/trace/duplicateMovieClip-events-7.swf |binary test/trace/duplicateMovieClip-events-7.swf.trace | 8 +++ test/trace/duplicateMovieClip-events-8.swf |binary test/trace/duplicateMovieClip-events-8.swf.trace | 8 +++ test/trace/duplicateMovieClip-events.c | 53 +++++++++++++++++++++ 22 files changed, 217 insertions(+), 13 deletions(-) New commits: diff-tree a2cf4afefe143cf37e570b7570cf11b3c8975467 (from fab49ea40c543dbda12db379c5b439f0b4487f24) Author: Benjamin Otte <otte at gnome.org> Date: Thu Jul 12 15:28:36 2007 +0200 add tests for CloneSprite event handling It's the same as duplicateMovieClip(), maybe that bytecode really is just calling that function internally diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am index 493004f..fc32e6a 100644 --- a/test/trace/Makefile.am +++ b/test/trace/Makefile.am @@ -116,6 +116,15 @@ EXTRA_DIST = \ chr-7.swf.trace \ classes.swf \ classes.swf.trace \ + clonesprite-events.c \ + clonesprite-events-5.swf \ + clonesprite-events-5.swf.trace \ + clonesprite-events-6.swf \ + clonesprite-events-6.swf.trace \ + clonesprite-events-7.swf \ + clonesprite-events-7.swf.trace \ + clonesprite-events-8.swf \ + clonesprite-events-8.swf.trace \ color-getters.swf \ color-getters.swf.trace \ color-new.swf \ diff --git a/test/trace/clonesprite-events-5.swf b/test/trace/clonesprite-events-5.swf new file mode 100644 index 0000000..09034ee Binary files /dev/null and b/test/trace/clonesprite-events-5.swf differ diff --git a/test/trace/clonesprite-events-5.swf.trace b/test/trace/clonesprite-events-5.swf.trace new file mode 100644 index 0000000..ac9f23e --- /dev/null +++ b/test/trace/clonesprite-events-5.swf.trace @@ -0,0 +1,4 @@ +_level0.movie: init +duplicating... +...done +_level0.foo: init diff --git a/test/trace/clonesprite-events-6.swf b/test/trace/clonesprite-events-6.swf new file mode 100644 index 0000000..9ab7119 Binary files /dev/null and b/test/trace/clonesprite-events-6.swf differ diff --git a/test/trace/clonesprite-events-6.swf.trace b/test/trace/clonesprite-events-6.swf.trace new file mode 100644 index 0000000..50d9531 --- /dev/null +++ b/test/trace/clonesprite-events-6.swf.trace @@ -0,0 +1,8 @@ +_level0.movie: init +_level0.movie: construct +duplicating... +_level0.foo: construct +...done +_level0.foo: init +_level0.movie: load +_level0.foo: load diff --git a/test/trace/clonesprite-events-7.swf b/test/trace/clonesprite-events-7.swf new file mode 100644 index 0000000..c54ef7e Binary files /dev/null and b/test/trace/clonesprite-events-7.swf differ diff --git a/test/trace/clonesprite-events-7.swf.trace b/test/trace/clonesprite-events-7.swf.trace new file mode 100644 index 0000000..50d9531 --- /dev/null +++ b/test/trace/clonesprite-events-7.swf.trace @@ -0,0 +1,8 @@ +_level0.movie: init +_level0.movie: construct +duplicating... +_level0.foo: construct +...done +_level0.foo: init +_level0.movie: load +_level0.foo: load diff --git a/test/trace/clonesprite-events-8.swf b/test/trace/clonesprite-events-8.swf new file mode 100644 index 0000000..225b74e Binary files /dev/null and b/test/trace/clonesprite-events-8.swf differ diff --git a/test/trace/clonesprite-events-8.swf.trace b/test/trace/clonesprite-events-8.swf.trace new file mode 100644 index 0000000..50d9531 --- /dev/null +++ b/test/trace/clonesprite-events-8.swf.trace @@ -0,0 +1,8 @@ +_level0.movie: init +_level0.movie: construct +duplicating... +_level0.foo: construct +...done +_level0.foo: init +_level0.movie: load +_level0.foo: load diff --git a/test/trace/clonesprite-events.c b/test/trace/clonesprite-events.c new file mode 100644 index 0000000..42c09e5 --- /dev/null +++ b/test/trace/clonesprite-events.c @@ -0,0 +1,58 @@ +/* gcc `pkg-config --libs --cflags libming` clonesprite-events.c -o clonesprite-events && ./clonesprite-events + */ + +#include <ming.h> + +static void +do_movie (int version) +{ + SWFMovie movie; + SWFMovieClip clip; + SWFDisplayItem item; + char name[100]; + + movie = newSWFMovieWithVersion (version); + movie = newSWFMovie(); + SWFMovie_setRate (movie, 1); + SWFMovie_setDimension (movie, 200, 150); + + clip = newSWFMovieClip (); + item = SWFMovie_add (movie, (SWFBlock) clip); + SWFDisplayItem_setName (item, "movie"); + SWFDisplayItem_addAction (item, newSWFAction ("trace (this + \": init\");"), SWFACTION_INIT); + SWFDisplayItem_addAction (item, newSWFAction ("trace (this + \": construct\");"), SWFACTION_CONSTRUCT); + SWFDisplayItem_addAction (item, newSWFAction ("trace (this + \": load\");"), SWFACTION_ONLOAD); + SWFDisplayItem_addAction (item, newSWFAction ("trace (this + \": unload\");"), SWFACTION_UNLOAD); + SWFMovie_add (movie, (SWFBlock) newSWFAction ("" + "trace (\"duplicating...\");" + "asm {" + " push \"movie\"" + " getvariable" + " push \"foo\", 10" + " duplicatemovieclip" + "};" + "trace (\"...done\");" + "")); + SWFMovie_nextFrame (movie); + SWFMovie_add (movie, (SWFBlock) newSWFAction ("" + "loadMovie (\"FSCommand:quit\", \"\");" + "")); + SWFMovie_nextFrame (movie); + + sprintf (name, "clonesprite-events-%d.swf", version); + SWFMovie_save (movie, name); +} + +int +main (int argc, char **argv) +{ + int i; + + if (Ming_init ()) + return 1; + + for (i = 5; i < 9; i++) + do_movie (i); + + return 0; +} diff-tree fab49ea40c543dbda12db379c5b439f0b4487f24 (from 5a0de2944bba30fd70804ba25412e589ef62e666) Author: Benjamin Otte <otte at gnome.org> Date: Thu Jul 12 15:26:06 2007 +0200 queue the same events for CloneSprite diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index ae14f4f..938165e 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -2113,6 +2113,11 @@ swfdec_action_clone_sprite (SwfdecAsCont new_movie = swfdec_movie_duplicate (movie, new_name, depth); if (new_movie) { SWFDEC_LOG ("duplicated %s as %s to depth %u", movie->name, new_movie->name, new_movie->depth); + if (SWFDEC_IS_SPRITE_MOVIE (new_movie)) { + g_queue_push_tail (SWFDEC_PLAYER (cx)->init_queue, new_movie); + swfdec_movie_queue_script (new_movie, SWFDEC_EVENT_LOAD); + swfdec_movie_run_construct (new_movie); + } swfdec_movie_initialize (new_movie); } swfdec_as_stack_pop_n (cx, 3); diff-tree 5a0de2944bba30fd70804ba25412e589ef62e666 (from b7672f1e4e0ee0a598397080589d6a2a156bf2cf) Author: Benjamin Otte <otte at gnome.org> Date: Thu Jul 12 15:16:34 2007 +0200 return the path of the movie as debug string diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c index ce3abc2..7ae2a67 100644 --- a/libswfdec/swfdec_movie.c +++ b/libswfdec/swfdec_movie.c @@ -837,6 +837,14 @@ swfdec_movie_set_variable (SwfdecAsObjec SWFDEC_AS_OBJECT_CLASS (swfdec_movie_parent_class)->set (object, variable, val); } +static char * +swfdec_movie_get_debug (SwfdecAsObject *object) +{ + SwfdecMovie *movie = SWFDEC_MOVIE (object); + + return swfdec_movie_get_path (movie); +} + static gboolean swfdec_movie_iterate_end (SwfdecMovie *movie) { @@ -855,6 +863,7 @@ swfdec_movie_class_init (SwfdecMovieClas asobject_class->mark = swfdec_movie_mark; asobject_class->get = swfdec_movie_get_variable; asobject_class->set = swfdec_movie_set_variable; + asobject_class->debug = swfdec_movie_get_debug; movie_class->iterate_end = swfdec_movie_iterate_end; } diff-tree b7672f1e4e0ee0a598397080589d6a2a156bf2cf (from f1abcd7d6b8131f774fd41152091a759d64a2d10) Author: Benjamin Otte <otte at gnome.org> Date: Thu Jul 12 15:16:05 2007 +0200 queue the right events for duplicateMovieClip diff --git a/libswfdec/swfdec_sprite_movie_as.c b/libswfdec/swfdec_sprite_movie_as.c index 58e40f0..e5b9954 100644 --- a/libswfdec/swfdec_sprite_movie_as.c +++ b/libswfdec/swfdec_sprite_movie_as.c @@ -348,7 +348,7 @@ swfdec_sprite_movie_duplicateMovieClip ( guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval) { SwfdecMovie *movie = SWFDEC_MOVIE (obj); - SwfdecMovie *ret; + SwfdecMovie *new; const char *name; int depth; @@ -356,13 +356,18 @@ swfdec_sprite_movie_duplicateMovieClip ( depth = swfdec_as_value_to_integer (cx, &argv[1]); if (swfdec_depth_classify (depth) == SWFDEC_DEPTH_CLASS_EMPTY) return; - ret = swfdec_movie_duplicate (movie, name, depth); - if (ret == NULL) + new = swfdec_movie_duplicate (movie, name, depth); + if (new == NULL) return; - swfdec_sprite_movie_copy_props (ret, movie); - swfdec_movie_initialize (ret); - SWFDEC_LOG ("duplicated %s as %s to depth %u", movie->name, ret->name, ret->depth); - SWFDEC_AS_VALUE_SET_OBJECT (rval, SWFDEC_AS_OBJECT (ret)); + swfdec_sprite_movie_copy_props (new, movie); + if (SWFDEC_IS_SPRITE_MOVIE (new)) { + g_queue_push_tail (SWFDEC_PLAYER (cx)->init_queue, new); + swfdec_movie_queue_script (new, SWFDEC_EVENT_LOAD); + swfdec_movie_run_construct (new); + } + swfdec_movie_initialize (new); + SWFDEC_LOG ("duplicated %s as %s to depth %u", movie->name, new->name, new->depth); + SWFDEC_AS_VALUE_SET_OBJECT (rval, SWFDEC_AS_OBJECT (new)); } static void diff-tree f1abcd7d6b8131f774fd41152091a759d64a2d10 (from 40c7abd66881409f3ee95b84704f4ff6f187e478) Author: Benjamin Otte <otte at gnome.org> Date: Thu Jul 12 15:15:40 2007 +0200 add a test that checks duplicateMovieClip events are dispatched properly diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am index f15f8e7..493004f 100644 --- a/test/trace/Makefile.am +++ b/test/trace/Makefile.am @@ -195,6 +195,15 @@ EXTRA_DIST = \ double-to-string-7.swf \ double-to-string-7.swf.trace \ double-to-string-7.swf.trace.org \ + duplicateMovieClip-events.c \ + duplicateMovieClip-events-5.swf \ + duplicateMovieClip-events-5.swf.trace \ + duplicateMovieClip-events-6.swf \ + duplicateMovieClip-events-6.swf.trace \ + duplicateMovieClip-events-7.swf \ + duplicateMovieClip-events-7.swf.trace \ + duplicateMovieClip-events-8.swf \ + duplicateMovieClip-events-8.swf.trace \ duplicate-names.as \ duplicate-names-5.swf \ duplicate-names-5.swf.trace \ diff --git a/test/trace/duplicateMovieClip-events-5.swf b/test/trace/duplicateMovieClip-events-5.swf new file mode 100644 index 0000000..95d87b0 Binary files /dev/null and b/test/trace/duplicateMovieClip-events-5.swf differ diff --git a/test/trace/duplicateMovieClip-events-5.swf.trace b/test/trace/duplicateMovieClip-events-5.swf.trace new file mode 100644 index 0000000..ac9f23e --- /dev/null +++ b/test/trace/duplicateMovieClip-events-5.swf.trace @@ -0,0 +1,4 @@ +_level0.movie: init +duplicating... +...done +_level0.foo: init diff --git a/test/trace/duplicateMovieClip-events-6.swf b/test/trace/duplicateMovieClip-events-6.swf new file mode 100644 index 0000000..ffbc8e1 Binary files /dev/null and b/test/trace/duplicateMovieClip-events-6.swf differ diff --git a/test/trace/duplicateMovieClip-events-6.swf.trace b/test/trace/duplicateMovieClip-events-6.swf.trace new file mode 100644 index 0000000..50d9531 --- /dev/null +++ b/test/trace/duplicateMovieClip-events-6.swf.trace @@ -0,0 +1,8 @@ +_level0.movie: init +_level0.movie: construct +duplicating... +_level0.foo: construct +...done +_level0.foo: init +_level0.movie: load +_level0.foo: load diff --git a/test/trace/duplicateMovieClip-events-7.swf b/test/trace/duplicateMovieClip-events-7.swf new file mode 100644 index 0000000..d0d2c01 Binary files /dev/null and b/test/trace/duplicateMovieClip-events-7.swf differ diff --git a/test/trace/duplicateMovieClip-events-7.swf.trace b/test/trace/duplicateMovieClip-events-7.swf.trace new file mode 100644 index 0000000..50d9531 --- /dev/null +++ b/test/trace/duplicateMovieClip-events-7.swf.trace @@ -0,0 +1,8 @@ +_level0.movie: init +_level0.movie: construct +duplicating... +_level0.foo: construct +...done +_level0.foo: init +_level0.movie: load +_level0.foo: load diff --git a/test/trace/duplicateMovieClip-events-8.swf b/test/trace/duplicateMovieClip-events-8.swf new file mode 100644 index 0000000..c375ce3 Binary files /dev/null and b/test/trace/duplicateMovieClip-events-8.swf differ diff --git a/test/trace/duplicateMovieClip-events-8.swf.trace b/test/trace/duplicateMovieClip-events-8.swf.trace new file mode 100644 index 0000000..50d9531 --- /dev/null +++ b/test/trace/duplicateMovieClip-events-8.swf.trace @@ -0,0 +1,8 @@ +_level0.movie: init +_level0.movie: construct +duplicating... +_level0.foo: construct +...done +_level0.foo: init +_level0.movie: load +_level0.foo: load diff --git a/test/trace/duplicateMovieClip-events.c b/test/trace/duplicateMovieClip-events.c new file mode 100644 index 0000000..5e1f904 --- /dev/null +++ b/test/trace/duplicateMovieClip-events.c @@ -0,0 +1,53 @@ +/* gcc `pkg-config --libs --cflags libming` duplicateMovieClip-events.c -o duplicateMovieClip-events && ./duplicateMovieClip-events + */ + +#include <ming.h> + +static void +do_movie (int version) +{ + SWFMovie movie; + SWFMovieClip clip; + SWFDisplayItem item; + char name[100]; + + movie = newSWFMovieWithVersion (version); + movie = newSWFMovie(); + SWFMovie_setRate (movie, 1); + SWFMovie_setDimension (movie, 200, 150); + + clip = newSWFMovieClip (); + item = SWFMovie_add (movie, (SWFBlock) clip); + SWFDisplayItem_setName (item, "movie"); + SWFDisplayItem_addAction (item, newSWFAction ("trace (this + \": init\");"), SWFACTION_INIT); + SWFDisplayItem_addAction (item, newSWFAction ("trace (this + \": construct\");"), SWFACTION_CONSTRUCT); + SWFDisplayItem_addAction (item, newSWFAction ("trace (this + \": load\");"), SWFACTION_ONLOAD); + SWFDisplayItem_addAction (item, newSWFAction ("trace (this + \": unload\");"), SWFACTION_UNLOAD); + SWFMovie_add (movie, (SWFBlock) newSWFAction ("" + "trace (\"duplicating...\");" + "movie.duplicateMovieClip (\"foo\", 0);" + "trace (\"...done\");" + "")); + SWFMovie_nextFrame (movie); + SWFMovie_add (movie, (SWFBlock) newSWFAction ("" + "loadMovie (\"FSCommand:quit\", \"\");" + "")); + SWFMovie_nextFrame (movie); + + sprintf (name, "duplicateMovieClip-events-%d.swf", version); + SWFMovie_save (movie, name); +} + +int +main (int argc, char **argv) +{ + int i; + + if (Ming_init ()) + return 1; + + for (i = 5; i < 9; i++) + do_movie (i); + + return 0; +} diff-tree 40c7abd66881409f3ee95b84704f4ff6f187e478 (from d5f8ba68c26452741aba41ffc48e697e0aafe4b4) Author: Benjamin Otte <otte at gnome.org> Date: Thu Jul 12 11:30:29 2007 +0200 fix function names diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c index 3c2462f..ce3abc2 100644 --- a/libswfdec/swfdec_movie.c +++ b/libswfdec/swfdec_movie.c @@ -749,7 +749,7 @@ swfdec_movie_dispose (GObject *object) } static void -swfdec_movie_class_mark (SwfdecAsObject *object) +swfdec_movie_mark (SwfdecAsObject *object) { SwfdecMovie *movie = SWFDEC_MOVIE (object); GList *walk; @@ -792,7 +792,7 @@ swfdec_movie_get_by_name (SwfdecPlayer * } static gboolean -swfdec_movie_class_get_variable (SwfdecAsObject *object, const char *variable, +swfdec_movie_get_variable (SwfdecAsObject *object, const char *variable, SwfdecAsValue *val, guint *flags) { SwfdecMovie *movie = SWFDEC_MOVIE (object); @@ -825,7 +825,7 @@ swfdec_movie_class_get_variable (SwfdecA } static void -swfdec_movie_class_set_variable (SwfdecAsObject *object, const char *variable, +swfdec_movie_set_variable (SwfdecAsObject *object, const char *variable, const SwfdecAsValue *val) { SwfdecMovie *movie = SWFDEC_MOVIE (object); @@ -852,9 +852,9 @@ swfdec_movie_class_init (SwfdecMovieClas object_class->dispose = swfdec_movie_dispose; - asobject_class->mark = swfdec_movie_class_mark; - asobject_class->get = swfdec_movie_class_get_variable; - asobject_class->set = swfdec_movie_class_set_variable; + asobject_class->mark = swfdec_movie_mark; + asobject_class->get = swfdec_movie_get_variable; + asobject_class->set = swfdec_movie_set_variable; movie_class->iterate_end = swfdec_movie_iterate_end; }
Seemingly Similar Threads
- 6 commits - libswfdec/swfdec_as_interpret.c libswfdec/swfdec_movie.c test/trace
- 7 commits - libswfdec/swfdec_movie.c libswfdec/swfdec_sprite_movie_as.c test/image
- 4 commits - libswfdec/swfdec_flv_decoder.c libswfdec/swfdec_flv_decoder.h libswfdec/swfdec_movie.c test/trace
- 11 commits - libswfdec/swfdec_color.c libswfdec/swfdec_flv_decoder.c libswfdec/swfdec_js_net_stream.c libswfdec/swfdec_movie.c libswfdec/swfdec_net_stream.c libswfdec/swfdec_net_stream.h libswfdec/swfdec_pattern.c libswfdec/swfdec_script.c NEWS test/trace
- Branch 'as' - 4 commits - libswfdec/swfdec_codec_video.c libswfdec/swfdec_movie.c test/trace