Benjamin Otte
2007-Jun-01 19:32 UTC
[Swfdec] Branch 'as' - 2 commits - libswfdec/Makefile.am libswfdec/swfdec_as_strings.c libswfdec/swfdec_as_types.c libswfdec/swfdec_interval.c libswfdec/swfdec_interval.h libswfdec/swfdec_player_as.c libswfdec/swfdec_player.c
libswfdec/Makefile.am | 2 libswfdec/swfdec_as_strings.c | 2 libswfdec/swfdec_as_types.c | 6 + libswfdec/swfdec_interval.c | 184 ++++++++++++++++++++++++++++++++++++++++++ libswfdec/swfdec_interval.h | 78 +++++++++++++++++ libswfdec/swfdec_player.c | 2 libswfdec/swfdec_player_as.c | 178 ++++++++++------------------------------ 7 files changed, 320 insertions(+), 132 deletions(-) New commits: diff-tree 89c4d90d1c31e4bba4b15f8419f7ebd13cd6cbb8 (from 4576fa2edfba68cb8edc199287ecf773a09cc7df) Author: Benjamin Otte <otte at gnome.org> Date: Fri Jun 1 21:32:43 2007 +0200 reenable intervals setInterval and clearInterval should work now diff --git a/libswfdec/Makefile.am b/libswfdec/Makefile.am index d9b7b68..d701d51 100644 --- a/libswfdec/Makefile.am +++ b/libswfdec/Makefile.am @@ -80,6 +80,7 @@ libswfdec_ at SWFDEC_MAJORMINOR@_la_SOURCES swfdec_graphic_movie.c \ swfdec_html_parser.c \ swfdec_image.c \ + swfdec_interval.c \ swfdec_listener.c \ swfdec_loader.c \ swfdec_loadertarget.c \ @@ -177,6 +178,7 @@ noinst_HEADERS = \ swfdec_graphic.h \ swfdec_graphic_movie.h \ swfdec_image.h \ + swfdec_interval.h \ swfdec_listener.h \ swfdec_loader_internal.h \ swfdec_loadertarget.h \ diff --git a/libswfdec/swfdec_as_strings.c b/libswfdec/swfdec_as_strings.c index a68b8e0..e59c69c 100644 --- a/libswfdec/swfdec_as_strings.c +++ b/libswfdec/swfdec_as_strings.c @@ -199,6 +199,8 @@ const char swfdec_as_strings[] = SWFDEC_AS_CONSTANT_STRING ("toUpperCase") SWFDEC_AS_CONSTANT_STRING ("isFinite") SWFDEC_AS_CONSTANT_STRING ("isNaN") + SWFDEC_AS_CONSTANT_STRING ("setInterval") + SWFDEC_AS_CONSTANT_STRING ("clearInterval") /* add more here */ ; diff --git a/libswfdec/swfdec_interval.c b/libswfdec/swfdec_interval.c new file mode 100644 index 0000000..ab79eb8 --- /dev/null +++ b/libswfdec/swfdec_interval.c @@ -0,0 +1,184 @@ +/* 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 <stdlib.h> +#include <string.h> + +#include "swfdec_interval.h" +#include "swfdec_as_context.h" +#include "swfdec_as_function.h" +#include "swfdec_debug.h" +#include "swfdec_player_internal.h" + +G_DEFINE_TYPE (SwfdecInterval, swfdec_interval, SWFDEC_TYPE_AS_OBJECT) + +static void +swfdec_interval_mark (SwfdecAsObject *object) +{ + guint i; + SwfdecInterval *interval = SWFDEC_INTERVAL (object); + + swfdec_as_object_mark (interval->object); + if (interval->fun_name) + swfdec_as_string_mark (interval->fun_name); + for (i = 0; i < interval->n_args; i++) { + swfdec_as_value_mark (&interval->args[i]); + } + + SWFDEC_AS_OBJECT_CLASS (swfdec_interval_parent_class)->mark (object); +} + +static void +swfdec_interval_dispose (GObject *object) +{ + SwfdecInterval *interval = SWFDEC_INTERVAL (object); + + g_free (interval->args); + interval->args = NULL; + /* needed here when GC'ed by closing the player */ + if (interval->timeout.callback != NULL) { + swfdec_player_remove_timeout (SWFDEC_PLAYER (SWFDEC_AS_OBJECT (object)->context), &interval->timeout); + interval->timeout.callback = NULL; + } + + G_OBJECT_CLASS (swfdec_interval_parent_class)->dispose (object); +} + +static void +swfdec_interval_class_init (SwfdecIntervalClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + SwfdecAsObjectClass *asobject_class = SWFDEC_AS_OBJECT_CLASS (klass); + + object_class->dispose = swfdec_interval_dispose; + + asobject_class->mark = swfdec_interval_mark; +} + +static void +swfdec_interval_init (SwfdecInterval *array) +{ +} + +static void +swfdec_interval_trigger (SwfdecTimeout *timeout) +{ + SwfdecAsValue ret; + SwfdecInterval *interval = SWFDEC_INTERVAL (((guchar *) timeout) + - G_STRUCT_OFFSET (SwfdecInterval, timeout)); + SwfdecAsContext *context = SWFDEC_AS_OBJECT (interval)->context; + + if (interval->repeat) { + timeout->timestamp += SWFDEC_MSECS_TO_TICKS (interval->msecs); + swfdec_player_add_timeout (SWFDEC_PLAYER (context), timeout); + } else { + interval->timeout.callback = NULL; + } + if (interval->fun_name) { + swfdec_as_object_call (interval->object, interval->fun_name, + interval->n_args, interval->args, &ret); + } else { + swfdec_as_function_call (SWFDEC_AS_FUNCTION (interval->object), NULL, + interval->n_args, interval->args, &ret); + swfdec_as_context_run (context); + } +} + +guint +swfdec_interval_new (SwfdecPlayer *player, guint msecs, gboolean repeat, + SwfdecAsObject *object, const char *fun_name, + guint n_args, const SwfdecAsValue *args) +{ + SwfdecAsContext *context; + SwfdecInterval *interval; + guint size; + + context = SWFDEC_AS_CONTEXT (player); + size = sizeof (SwfdecInterval) + n_args * sizeof (SwfdecAsValue); + if (!swfdec_as_context_use_mem (context, size)) + return 0; + interval = g_object_new (SWFDEC_TYPE_INTERVAL, NULL); + swfdec_as_object_add (SWFDEC_AS_OBJECT (interval), context, size); + + interval->id = ++player->interval_id; + interval->msecs = msecs; + interval->repeat = repeat; + interval->object = object; + interval->fun_name = fun_name; + interval->n_args = n_args; + interval->args = g_memdup (args, n_args * sizeof (SwfdecAsValue)); + interval->timeout.timestamp = player->time + SWFDEC_MSECS_TO_TICKS (interval->msecs); + interval->timeout.callback = swfdec_interval_trigger; + swfdec_player_add_timeout (player, &interval->timeout); + + player->intervals = + g_list_prepend (player->intervals, interval); + + return interval->id; +} + +guint +swfdec_interval_new_function (SwfdecPlayer *player, guint msecs, gboolean repeat, + SwfdecAsFunction *fun, guint n_args, const SwfdecAsValue *args) +{ + g_return_val_if_fail (SWFDEC_IS_PLAYER (player), 0); + g_return_val_if_fail (msecs > 0, 0); + g_return_val_if_fail (SWFDEC_IS_AS_FUNCTION (fun), 0); + g_return_val_if_fail (n_args == 0 || args != NULL, 0); + + return swfdec_interval_new (player, msecs, repeat, SWFDEC_AS_OBJECT (fun), NULL, n_args, args); +} + +guint +swfdec_interval_new_object (SwfdecPlayer *player, guint msecs, gboolean repeat, + SwfdecAsObject *thisp, const char *fun_name, + guint n_args, const SwfdecAsValue *args) +{ + g_return_val_if_fail (SWFDEC_IS_PLAYER (player), 0); + g_return_val_if_fail (msecs > 0, 0); + g_return_val_if_fail (SWFDEC_IS_AS_OBJECT (thisp), 0); + g_return_val_if_fail (fun_name != NULL, 0); + g_return_val_if_fail (n_args == 0 || args != NULL, 0); + + return swfdec_interval_new (player, msecs, repeat, thisp, fun_name, n_args, args); +} + +void +swfdec_interval_remove (SwfdecPlayer *player, guint id) +{ + GList *walk; + + g_return_if_fail (SWFDEC_IS_PLAYER (player)); + + for (walk = player->intervals; walk; walk = walk->next) { + SwfdecInterval *interval = walk->data; + if (interval->id != id) + continue; + + player->intervals = g_list_delete_link (player->intervals, walk); + swfdec_player_remove_timeout (player, &interval->timeout); + interval->timeout.callback = NULL; + return; + } +} + diff --git a/libswfdec/swfdec_interval.h b/libswfdec/swfdec_interval.h new file mode 100644 index 0000000..07da0c9 --- /dev/null +++ b/libswfdec/swfdec_interval.h @@ -0,0 +1,78 @@ +/* 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_INTERVAL_H_ +#define _SWFDEC_INTERVAL_H_ + +#include <libswfdec/swfdec_as_object.h> +#include <libswfdec/swfdec_as_types.h> +#include <libswfdec/swfdec_player_internal.h> + +G_BEGIN_DECLS + +typedef struct _SwfdecInterval SwfdecInterval; +typedef struct _SwfdecIntervalClass SwfdecIntervalClass; + +#define SWFDEC_TYPE_INTERVAL (swfdec_interval_get_type()) +#define SWFDEC_IS_INTERVAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_INTERVAL)) +#define SWFDEC_IS_INTERVAL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_INTERVAL)) +#define SWFDEC_INTERVAL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_INTERVAL, SwfdecInterval)) +#define SWFDEC_INTERVAL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_INTERVAL, SwfdecIntervalClass)) +#define SWFDEC_INTERVAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_INTERVAL, SwfdecIntervalClass)) + +struct _SwfdecInterval { + SwfdecAsObject asobject; + + SwfdecTimeout timeout; + guint id; /* id this interval is identified with */ + guint msecs; /* interval in milliseconds */ + gboolean repeat; /* TRUE for calling in intervals, FALSE for single-shot */ + /* if calling named function */ + SwfdecAsObject * object; /* this object or function to call (depending on fun_name) */ + const char * fun_name; /* name of function or NULL if object is function */ + + guint n_args; /* number of arguments to call function with */ + SwfdecAsValue * args; /* arguments for function */ +}; + +struct _SwfdecIntervalClass { + SwfdecAsObjectClass asobject_class; +}; + +GType swfdec_interval_get_type (void); + +guint swfdec_interval_new_function (SwfdecPlayer * player, + guint msecs, + gboolean repeat, + SwfdecAsFunction * fun, + guint n_args, + const SwfdecAsValue * args); +guint swfdec_interval_new_object (SwfdecPlayer * player, + guint msecs, + gboolean repeat, + SwfdecAsObject * thisp, + const char * fun_name, + guint n_args, + const SwfdecAsValue * args); +void swfdec_interval_remove (SwfdecPlayer * player, + guint id); + + +G_END_DECLS +#endif diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index 965f021..54a2707 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -397,6 +397,8 @@ swfdec_player_dispose (GObject *object) swfdec_player_remove_timeout (player, &player->iterate_timeout); } g_assert (player->timeouts == NULL); + g_list_free (player->intervals); + player->intervals = NULL; g_assert (g_queue_is_empty (player->init_queue)); g_assert (g_queue_is_empty (player->construct_queue)); g_queue_free (player->init_queue); diff --git a/libswfdec/swfdec_player_as.c b/libswfdec/swfdec_player_as.c index 6a17cd0..565ed51 100644 --- a/libswfdec/swfdec_player_as.c +++ b/libswfdec/swfdec_player_as.c @@ -22,161 +22,73 @@ #endif #include "swfdec_player_internal.h" +#include "swfdec_as_function.h" #include "swfdec_as_object.h" #include "swfdec_debug.h" +#include "swfdec_interval.h" -#if 0 -/*** INTERVAL ***/ - -typedef struct _SwfdecAsInterval SwfdecAsInterval; -struct _SwfdecAsInterval { - SwfdecTimeout timeout; - SwfdecPlayer * player; /* needed so it can be readded */ - guint id; /* id this interval is identified with */ - guint msecs; /* interval in milliseconds */ - guint n_args; /* number of arguments to call function with */ - SwfdecAsValue vals[0]; /* values: 0 is function, 1 is object, 2-n are arguments */ -}; - -void -swfdec_js_interval_free (SwfdecAsInterval *interval) -{ - JSContext *cx = interval->player->jscx; - guint i; - - swfdec_player_remove_timeout (interval->player, &interval->timeout); - interval->player->intervals = - g_list_remove (interval->player->intervals, interval); - for (i = 0; i < interval->n_args + 2; i++) { - JS_RemoveRoot (cx, &interval->vals[i]); - } - g_free (interval); -} - -static void -swfdec_js_interval_trigger (SwfdecTimeout *timeout) -{ - SwfdecAsInterval *interval = (SwfdecAsInterval *) timeout; - JSContext *cx = interval->player->jscx; - SwfdecAsValue fun, rval; - - timeout->timestamp += SWFDEC_MSECS_TO_TICKS (interval->msecs); - swfdec_player_add_timeout (interval->player, timeout); - g_assert (JSVAL_IS_OBJECT (interval->vals[1])); - if (JSVAL_IS_STRING (interval->vals[0])) { - JSAtom *atom = js_AtomizeString (cx, JSVAL_TO_STRING (interval->vals[0]), 0); - if (!atom) - return; - if (!js_GetProperty (cx, JSVAL_TO_OBJECT (interval->vals[1]), - (jsid) atom, &fun)) - return; - } else { - fun = interval->vals[0]; - } - js_InternalCall (cx, JSVAL_TO_OBJECT (interval->vals[1]), fun, - interval->n_args, &interval->vals[2], &rval); -} - -static SwfdecAsInterval * -swfdec_js_interval_new (guint n_args) -{ - SwfdecAsInterval *ret = g_malloc (sizeof (SwfdecAsInterval) + sizeof (SwfdecAsValue) * (2 + n_args)); - - ret->timeout.callback = swfdec_js_interval_trigger; - ret->n_args = n_args; - return ret; -} +/*** INTERVALS ***/ static void -swfdec_js_global_setInterval (SwfdecAsObject *obj, uintN argc, SwfdecAsValue *argv, SwfdecAsValue *rval) +swfdec_player_do_set_interval (gboolean repeat, SwfdecAsObject *obj, guint argc, + SwfdecAsValue *argv, SwfdecAsValue *rval) { - SwfdecPlayer *player = JS_GetContextPrivate (cx); + SwfdecPlayer *player = SWFDEC_PLAYER (obj->context); SwfdecAsObject *object; - SwfdecAsValue fun; - guint i, n_args, first_arg, msecs; - SwfdecAsInterval *interval; + guint id, msecs; +#define MIN_INTERVAL_TIME 10 - if (!JSVAL_IS_OBJECT (argv[0])) { + if (!SWFDEC_AS_VALUE_IS_OBJECT (&argv[0])) { SWFDEC_WARNING ("first argument to setInterval is not an object"); - return JS_TRUE; + return; } - object = JSVAL_TO_OBJECT (argv[0]); - if (JS_GetClass (object) == &js_FunctionClass) { - fun = argv[0]; - object = JS_GetParent (cx, object); - if (object == NULL) { - SWFDEC_WARNING ("function has no parent?!"); - return JS_TRUE; + object = SWFDEC_AS_VALUE_GET_OBJECT (&argv[0]); + if (SWFDEC_IS_AS_FUNCTION (object)) { + msecs = swfdec_as_value_to_integer (obj->context, &argv[1]); + if (msecs < MIN_INTERVAL_TIME) { + SWFDEC_INFO ("interval duration is %u, making it %u msecs", msecs, MIN_INTERVAL_TIME); + msecs = MIN_INTERVAL_TIME; } - first_arg = 2; + id = swfdec_interval_new_function (player, msecs, TRUE, + SWFDEC_AS_FUNCTION (object), argc - 2, &argv[2]); } else { + const char *name; if (argc < 3) { SWFDEC_WARNING ("setInterval needs 3 arguments when not called with function"); - return JS_TRUE; - } - if (!JSVAL_IS_STRING (argv[1])) { - SWFDEC_WARNING ("function name passed to setInterval is not a string"); - return JS_TRUE; + return; } - fun = argv[1]; - first_arg = 3; - } - if (!JS_ValueToECMAUint32 (cx, argv[first_arg - 1], &msecs)) - return JS_FALSE; -#define MIN_INTERVAL_TIME 10 - if (msecs < MIN_INTERVAL_TIME) { - SWFDEC_INFO ("interval duration is %u, making it %u msecs", msecs, MIN_INTERVAL_TIME); - msecs = MIN_INTERVAL_TIME; - } - n_args = argc - first_arg; - interval = swfdec_js_interval_new (n_args); - interval->player = player; - interval->id = ++player->interval_id; - interval->msecs = msecs; - interval->vals[0] = fun; - interval->vals[1] = OBJECT_TO_JSVAL (object); - memcpy (&interval->vals[2], &argv[first_arg], n_args * sizeof (SwfdecAsValue)); - for (i = 0; i < n_args + 2; i++) { - if (!JS_AddRoot (cx, &interval->vals[i])) { - /* FIXME: is it save roots that weren't added before? */ - swfdec_js_interval_free (interval); - return JS_FALSE; + name = swfdec_as_value_to_string (obj->context, &argv[1]); + msecs = swfdec_as_value_to_integer (obj->context, &argv[2]); + if (msecs < MIN_INTERVAL_TIME) { + SWFDEC_INFO ("interval duration is %u, making it %u msecs", msecs, MIN_INTERVAL_TIME); + msecs = MIN_INTERVAL_TIME; } + id = swfdec_interval_new_object (player, msecs, TRUE, object, name, argc - 2, &argv[2]); } - interval->timeout.timestamp = player->time + SWFDEC_MSECS_TO_TICKS (interval->msecs); - swfdec_player_add_timeout (player, &interval->timeout); - interval->player->intervals = - g_list_prepend (interval->player->intervals, interval); - *rval = INT_TO_JSVAL (interval->id); - return JS_TRUE; + SWFDEC_AS_VALUE_SET_INT (rval, id); } static void -swfdec_js_global_clearInterval (SwfdecAsObject *obj, uintN argc, SwfdecAsValue *argv, SwfdecAsValue *rval) +swfdec_player_setInterval (SwfdecAsObject *obj, guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval) { - SwfdecPlayer *player = JS_GetContextPrivate (cx); - guint id; - GList *walk; + swfdec_player_do_set_interval (TRUE, obj, argc, argv, rval); +} - if (!JSVAL_IS_INT (argv[0])) { - SWFDEC_WARNING ("argument is not an int"); - return JS_TRUE; - } - id = JSVAL_TO_INT (argv[0]); - for (walk = player->intervals; walk; walk = walk->next) { - SwfdecAsInterval *interval = walk->data; - if (interval->id != id) - continue; - swfdec_js_interval_free (interval); - break; - } - return JS_TRUE; +static void +swfdec_player_clearInterval (SwfdecAsObject *obj, guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval) +{ + SwfdecPlayer *player = SWFDEC_PLAYER (obj->context); + guint id; + + id = swfdec_as_value_to_integer (obj->context, &argv[0]); + swfdec_interval_remove (player, id); } /*** VARIOUS ***/ +#if 0 void -swfdec_js_global_eval (SwfdecAsObject *obj, uintN argc, SwfdecAsValue *argv, SwfdecAsValue *rval) +swfdec_js_global_eval (SwfdecAsObject *obj, guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval) { if (JSVAL_IS_STRING (argv[0])) { const char *bytes = swfdec_js_to_string (cx, argv[0]); @@ -190,7 +102,7 @@ swfdec_js_global_eval (SwfdecAsObject *o } static void -swfdec_js_trace (SwfdecAsObject *obj, uintN argc, SwfdecAsValue *argv, SwfdecAsValue *rval) +swfdec_js_trace (SwfdecAsObject *obj, guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval) { SwfdecPlayer *player = JS_GetContextPrivate (cx); const char *bytes; @@ -204,7 +116,7 @@ swfdec_js_trace (SwfdecAsObject *obj, ui } static void -swfdec_js_random (SwfdecAsObject *obj, uintN argc, SwfdecAsValue *argv, SwfdecAsValue *rval) +swfdec_js_random (SwfdecAsObject *obj, guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval) { gint32 max, result; @@ -220,7 +132,7 @@ swfdec_js_random (SwfdecAsObject *obj, u } static void -swfdec_js_stopAllSounds (SwfdecAsObject *obj, uintN argc, SwfdecAsValue *argv, SwfdecAsValue *rval) +swfdec_js_stopAllSounds (SwfdecAsObject *obj, guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval) { SwfdecPlayer *player = JS_GetContextPrivate (cx); @@ -263,5 +175,9 @@ swfdec_player_init_global (SwfdecPlayer swfdec_as_object_add_function (context->Object, SWFDEC_AS_STR_registerClass, 0, swfdec_player_object_registerClass, 2); + swfdec_as_object_add_function (context->global, SWFDEC_AS_STR_setInterval, + 0, swfdec_player_setInterval, 2); + swfdec_as_object_add_function (context->global, SWFDEC_AS_STR_clearInterval, + 0, swfdec_player_clearInterval, 1); } diff-tree 4576fa2edfba68cb8edc199287ecf773a09cc7df (from 3c0a7a24da1aa0e7f87c65deb3872b6e95dfa5e4) Author: Benjamin Otte <otte at gnome.org> Date: Fri Jun 1 10:01:07 2007 +0200 fix _value_to_integer() to not cast negative doubles to uints. It doesn't return the same result on PPC and x86. diff --git a/libswfdec/swfdec_as_types.c b/libswfdec/swfdec_as_types.c index 9105a96..61502a2 100644 --- a/libswfdec/swfdec_as_types.c +++ b/libswfdec/swfdec_as_types.c @@ -292,7 +292,11 @@ swfdec_as_value_to_integer (SwfdecAsCont d = swfdec_as_value_to_number (context, value); if (!isfinite (d)) return 0; - return (guint) fmod (d, 4294967296); + if (d < 0) { + return - (guint) fmod (-d, 4294967296); + } else { + return (guint) fmod (d, 4294967296); + } } /**
Reasonably Related Threads
- 22 commits - libswfdec/js libswfdec/swfdec_debugger.c libswfdec/swfdec_js.c libswfdec/swfdec_js_global.c libswfdec/swfdec_js_movie.c libswfdec/swfdec_movie.c libswfdec/swfdec_player.c libswfdec/swfdec_player_internal.h libswfdec/swfdec_script.c
- 9 commits - libswfdec/swfdec_as_string.c libswfdec/swfdec_color_as.c libswfdec/swfdec_interval.c test/image test/trace
- libswfdec-gtk/swfdec_gtk_player.c libswfdec/swfdec_as_date.c libswfdec/swfdec_audio.c libswfdec/swfdec_audio_event.c libswfdec/swfdec_button_movie.c libswfdec/swfdec_interval.c libswfdec/swfdec_key_as.c libswfdec/swfdec_mouse_as.c libswfdec/swfdec_movie.c
- 5 commits - libswfdec/jpeg libswfdec/swfdec_as_interpret.c libswfdec/swfdec_bits.c libswfdec/swfdec_cached.c libswfdec/swfdec_codec_adpcm.c libswfdec/swfdec_codec_audio.c libswfdec/swfdec_flash_security.c libswfdec/swfdec_image.c
- 12 commits - configure.ac doc/swfdec-sections.txt libswfdec-gtk/swfdec_playback_alsa.c libswfdec/jpeg libswfdec/Makefile.am libswfdec/swfdec_amf.c libswfdec/swfdec_as_array.c libswfdec/swfdec_as_boolean.h libswfdec/swfdec_as_context.c