Pekka Lampila
2007-Oct-17 13:15 UTC
[Swfdec] 4 commits - libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_interpret.h libswfdec/swfdec_movie.c libswfdec/swfdec_system_as.c libswfdec/swfdec_text_field_movie.c test/trace
libswfdec/swfdec_as_interpret.c | 2 - libswfdec/swfdec_as_interpret.h | 6 ++++ libswfdec/swfdec_movie.c | 8 ++++- libswfdec/swfdec_system_as.c | 6 +++- libswfdec/swfdec_text_field_movie.c | 42 ++++++++++++++++++++++++++--- test/trace/Makefile.am | 7 ++++ test/trace/text-field-variable-6.swf |binary test/trace/text-field-variable-6.swf.trace | 9 ++++++ test/trace/text-field-variable-7.swf |binary test/trace/text-field-variable-7.swf.trace | 9 ++++++ test/trace/text-field-variable-8.swf |binary test/trace/text-field-variable-8.swf.trace | 9 ++++++ test/trace/text-field-variable.as | 36 ++++++++++++++++++++++++ 13 files changed, 128 insertions(+), 6 deletions(-) New commits: commit 89ed587507cc1e0687b4e5aa0e8aa142d498487c Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Wed Oct 17 16:14:00 2007 +0300 Add a test for TextField's variable property diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am index cd5b3ba..85c4eb9 100644 --- a/test/trace/Makefile.am +++ b/test/trace/Makefile.am @@ -1841,6 +1841,13 @@ EXTRA_DIST = \ targetpath-6.swf.trace \ targetpath-7.swf \ targetpath-7.swf.trace \ + text-field-variable.as \ + text-field-variable-6.swf \ + text-field-variable-6.swf.trace \ + text-field-variable-7.swf \ + text-field-variable-7.swf.trace \ + text-field-variable-8.swf \ + text-field-variable-8.swf.trace \ textformat.as \ textformat-5.swf \ textformat-5.swf.trace \ diff --git a/test/trace/text-field-variable-6.swf b/test/trace/text-field-variable-6.swf new file mode 100644 index 0000000..277d1b3 Binary files /dev/null and b/test/trace/text-field-variable-6.swf differ diff --git a/test/trace/text-field-variable-6.swf.trace b/test/trace/text-field-variable-6.swf.trace new file mode 100644 index 0000000..2e92da2 --- /dev/null +++ b/test/trace/text-field-variable-6.swf.trace @@ -0,0 +1,9 @@ +1 +2 +3 +1 +undefined +3 +3 +undefined +undefined diff --git a/test/trace/text-field-variable-7.swf b/test/trace/text-field-variable-7.swf new file mode 100644 index 0000000..83d2875 Binary files /dev/null and b/test/trace/text-field-variable-7.swf differ diff --git a/test/trace/text-field-variable-7.swf.trace b/test/trace/text-field-variable-7.swf.trace new file mode 100644 index 0000000..2e92da2 --- /dev/null +++ b/test/trace/text-field-variable-7.swf.trace @@ -0,0 +1,9 @@ +1 +2 +3 +1 +undefined +3 +3 +undefined +undefined diff --git a/test/trace/text-field-variable-8.swf b/test/trace/text-field-variable-8.swf new file mode 100644 index 0000000..a466b89 Binary files /dev/null and b/test/trace/text-field-variable-8.swf differ diff --git a/test/trace/text-field-variable-8.swf.trace b/test/trace/text-field-variable-8.swf.trace new file mode 100644 index 0000000..2e92da2 --- /dev/null +++ b/test/trace/text-field-variable-8.swf.trace @@ -0,0 +1,9 @@ +1 +2 +3 +1 +undefined +3 +3 +undefined +undefined diff --git a/test/trace/text-field-variable.as b/test/trace/text-field-variable.as new file mode 100644 index 0000000..68dee49 --- /dev/null +++ b/test/trace/text-field-variable.as @@ -0,0 +1,36 @@ +// makeswf -v 7 -r 1 -o text-field-variable-7.swf text-field-variable.as + +this.createTextField ("t", 0, 0, 0, 50, 50); + +// movie clip +this.createEmptyMovieClip ("m", 1); +m.test = 1; +t.variable = "m.test"; +trace (t.text); +m.test = 2; +trace (t.text); +t.text = 3; +trace (m.test); + +// object +o = new Object(); +o.test = 1; +t.variable = "o.test"; +trace (t.text); +o.test = 2; +trace (o.text); +t.text = 3; +trace (o.test); + +// nothing +delete n; +n.test = 1; +t.variable = "n.test"; +trace (t.text); +n.test = 2; +trace (o.text); +t.text = 3; +trace (n.test); + +loadMovie ("FSCommand:quit", ""); + commit 8b212c377e8823e46b2ea3d1e11c13a768aec0b9 Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Wed Oct 17 16:09:16 2007 +0300 Fix crash causing errors in TextField's variable stuff, implement proper lookup diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index e11397f..b88f484 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -464,7 +464,7 @@ swfdec_action_get_movie_by_slash_path (SwfdecAsContext *cx, const char *path) return o; } -static SwfdecAsObject * +SwfdecAsObject * swfdec_action_lookup_object (SwfdecAsContext *cx, SwfdecAsObject *o, const char *path, const char *end) { gboolean dot_allowed = TRUE; diff --git a/libswfdec/swfdec_as_interpret.h b/libswfdec/swfdec_as_interpret.h index 557abf4..44f1425 100644 --- a/libswfdec/swfdec_as_interpret.h +++ b/libswfdec/swfdec_as_interpret.h @@ -144,5 +144,11 @@ typedef enum { SWFDEC_AS_ACTION_GOTO_FRAME2 = 0x9F } SwfdecAsAction; +// FIXME: move +SwfdecAsObject * swfdec_action_lookup_object (SwfdecAsContext * cx, + SwfdecAsObject * o, + const char * path, + const char * end); + G_END_DECLS #endif diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c index 937e5a5..65d1116 100644 --- a/libswfdec/swfdec_movie.c +++ b/libswfdec/swfdec_movie.c @@ -1101,9 +1101,9 @@ swfdec_movie_remove_variable_listener (SwfdecMovie *movie, if (iter == NULL) return; + g_free (iter->data); movie->variable_listeners g_slist_remove (movie->variable_listeners, iter->data); - g_free (iter->data); } static void diff --git a/libswfdec/swfdec_text_field_movie.c b/libswfdec/swfdec_text_field_movie.c index 82071ad..4f238b7 100644 --- a/libswfdec/swfdec_text_field_movie.c +++ b/libswfdec/swfdec_text_field_movie.c @@ -28,6 +28,7 @@ #include "swfdec_text_field_movie.h" #include "swfdec_as_context.h" #include "swfdec_as_strings.h" +#include "swfdec_as_interpret.h" #include "swfdec_text_format.h" #include "swfdec_xml.h" #include "swfdec_debug.h" @@ -525,8 +526,6 @@ swfdec_text_field_movie_dispose (GObject *object) text = SWFDEC_TEXT_FIELD_MOVIE (object); - swfdec_text_field_movie_set_listen_variable (text, NULL); - swfdec_text_field_movie_free_paragraphs (text); for (iter = text->formats; iter != NULL; iter = iter->next) { @@ -618,6 +617,14 @@ swfdec_text_field_movie_init_movie (SwfdecMovie *movie) } static void +swfdec_text_field_movie_finish_movie (SwfdecMovie *movie) +{ + SwfdecTextFieldMovie *text = SWFDEC_TEXT_FIELD_MOVIE (movie); + + swfdec_text_field_movie_set_listen_variable (text, NULL); +} + +static void swfdec_text_field_movie_class_init (SwfdecTextFieldMovieClass * g_class) { GObjectClass *object_class = G_OBJECT_CLASS (g_class); @@ -629,6 +636,7 @@ swfdec_text_field_movie_class_init (SwfdecTextFieldMovieClass * g_class) asobject_class->mark = swfdec_text_field_movie_mark; movie_class->init_movie = swfdec_text_field_movie_init_movie; + movie_class->finish_movie = swfdec_text_field_movie_finish_movie; movie_class->update_extents = swfdec_text_field_movie_update_extents; movie_class->render = swfdec_text_field_movie_render; } @@ -722,14 +730,40 @@ static void swfdec_text_field_movie_parse_listen_variable (SwfdecTextFieldMovie *text, const char *variable, SwfdecAsObject **object, const char **name) { + SwfdecAsContext *cx; + SwfdecAsObject *parent; + const char *p1, *p2; + g_return_if_fail (SWFDEC_IS_TEXT_FIELD_MOVIE (text)); g_return_if_fail (variable != NULL); g_return_if_fail (object != NULL); g_return_if_fail (name != NULL); - // FIXME: proper variable lookup (have fun) - *object = SWFDEC_AS_OBJECT (SWFDEC_MOVIE (text)->parent); - *name = variable; + *object = NULL; + *name = NULL; + + if (SWFDEC_MOVIE (text)->parent == NULL) + return; + + g_assert (SWFDEC_IS_AS_OBJECT (SWFDEC_MOVIE (text)->parent)); + cx = SWFDEC_AS_OBJECT (text)->context; + parent = SWFDEC_AS_OBJECT (SWFDEC_MOVIE (text)->parent); + + p1 = strrchr (variable, '.'); + p2 = strrchr (variable, ':'); + if (p1 == NULL && p2 == NULL) { + *object = parent; + *name = variable; + } else { + if (p1 == NULL || (p2 != NULL && p2 > p1)) + p1 = p2; + if (strlen (p1) == 1) + return; + *object = swfdec_action_lookup_object (cx, parent, variable, p1); + if (*object == NULL) + return; + *name = swfdec_as_context_get_string (cx, p1 + 1); + } } void commit 09c3ecd42ccba7f292c65e0464271a942960a449 Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Wed Oct 17 15:25:50 2007 +0300 Format AR number in system query independent of the locale diff --git a/libswfdec/swfdec_system_as.c b/libswfdec/swfdec_system_as.c index a6f594f..4610b96 100644 --- a/libswfdec/swfdec_system_as.c +++ b/libswfdec/swfdec_system_as.c @@ -265,7 +265,11 @@ swfdec_system_query (SwfdecAsContext *cx, SwfdecAsObject *object, if (queries[i].name == SWFDEC_AS_STR_screenResolutionY) { g_string_append_printf (server, "x%d", (int) SWFDEC_AS_VALUE_GET_NUMBER (&val)); } else if (queries[i].name == SWFDEC_AS_STR_pixelAspectRatio) { - g_string_append_printf (server, "&AR=%.1f", SWFDEC_AS_VALUE_GET_NUMBER (&val)); + char buffer[10]; + g_ascii_formatd (buffer, sizeof (buffer), "%.1f", + SWFDEC_AS_VALUE_GET_NUMBER (&val)); + g_string_append (server, "&AR="); + g_string_append (server, buffer); } else if (queries[i].name == SWFDEC_AS_STR_manufacturer) { char *s = swfdec_as_string_escape (cx, player->system->server_manufacturer); g_string_append_printf (server, "&M=%s", s); commit 9f675e25b7e025468fbc7c173d79cd720a27bf36 Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Wed Oct 17 14:53:16 2007 +0300 Clean up variable listener stuff in Movie's and TextMovie's dispose diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c index a5ffa00..937e5a5 100644 --- a/libswfdec/swfdec_movie.c +++ b/libswfdec/swfdec_movie.c @@ -922,6 +922,7 @@ static void swfdec_movie_dispose (GObject *object) { SwfdecMovie * movie = SWFDEC_MOVIE (object); + GSList *iter; g_assert (movie->list == NULL); @@ -938,6 +939,11 @@ swfdec_movie_dispose (GObject *object) g_object_unref (movie->graphic); movie->graphic = NULL; } + for (iter = movie->variable_listeners; iter != NULL; iter = iter->next) { + g_free (iter->data); + } + g_slist_free (movie->variable_listeners); + movie->variable_listeners = NULL; G_OBJECT_CLASS (swfdec_movie_parent_class)->dispose (G_OBJECT (movie)); } diff --git a/libswfdec/swfdec_text_field_movie.c b/libswfdec/swfdec_text_field_movie.c index e9f7800..82071ad 100644 --- a/libswfdec/swfdec_text_field_movie.c +++ b/libswfdec/swfdec_text_field_movie.c @@ -525,6 +525,8 @@ swfdec_text_field_movie_dispose (GObject *object) text = SWFDEC_TEXT_FIELD_MOVIE (object); + swfdec_text_field_movie_set_listen_variable (text, NULL); + swfdec_text_field_movie_free_paragraphs (text); for (iter = text->formats; iter != NULL; iter = iter->next) {
Apparently Analagous Threads
- 6 commits - libswfdec/swfdec_as_strings.c libswfdec/swfdec_movie.c libswfdec/swfdec_movie.h libswfdec/swfdec_text_field.c libswfdec/swfdec_text_field.h libswfdec/swfdec_text_field_movie_as.c libswfdec/swfdec_text_field_movie.c
- 6 commits - libswfdec/Makefile.am libswfdec/swfdec_as_interpret.c libswfdec/swfdec_color_as.c libswfdec/swfdec_graphic_movie.c libswfdec/swfdec_image_decoder.c libswfdec/swfdec_morph_movie.c libswfdec/swfdec_movie_as_drawing.c
- 14 commits - libswfdec/swfdec_as_context.c libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_interpret.h libswfdec/swfdec_net_stream.c libswfdec/swfdec_script.c libswfdec/swfdec_sprite_movie.c libswfdec/swfdec_tag.c libswfdec/swfdec_text_field_movie.c
- 11 commits - libswfdec/swfdec_as_strings.c libswfdec/swfdec_text_field.c libswfdec/swfdec_text_field.h libswfdec/swfdec_text_field_movie_as.c libswfdec/swfdec_text_field_movie.c libswfdec/swfdec_text_field_movie.h test/trace
- 3 commits - libswfdec/swfdec_as_interpret.c libswfdec/swfdec_html_parser.c libswfdec/swfdec_sprite_movie_as.c libswfdec/swfdec_text_field_movie.c