Benjamin Otte
2007-May-23 14:26 UTC
[Swfdec] Branch 'as' - 7 commits - libswfdec/Makefile.am libswfdec/swfdec_as_context.c libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame.h libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_object.h libswfdec/swfdec_as_strings.c libswfdec/swfdec_as_super.c libswfdec/swfdec_color_as.c libswfdec/swfdec_color_as.h libswfdec/swfdec_js_color.c libswfdec/swfdec_player.c
libswfdec/Makefile.am | 3 libswfdec/swfdec_as_context.c | 4 libswfdec/swfdec_as_frame.c | 4 libswfdec/swfdec_as_frame.h | 2 libswfdec/swfdec_as_interpret.c | 38 +++---- libswfdec/swfdec_as_object.c | 13 +- libswfdec/swfdec_as_object.h | 2 libswfdec/swfdec_as_strings.c | 13 ++ libswfdec/swfdec_as_super.c | 6 - libswfdec/swfdec_color_as.c | 211 ++++++++++++++++++++++++++++++++++++++++ libswfdec/swfdec_color_as.h | 56 ++++++++++ libswfdec/swfdec_js_color.c | 192 ------------------------------------ libswfdec/swfdec_player.c | 2 13 files changed, 318 insertions(+), 228 deletions(-) New commits: diff-tree 37f9a4467fe9e82fdc7fe6d6e73aaf9291cbbe7d (from b4b7b353623ac870903f5a45dbfc85bf03c28513) Author: Benjamin Otte <otte at gnome.org> Date: Wed May 23 16:29:45 2007 +0200 it's the prototype, not the constructor, stupid diff --git a/libswfdec/swfdec_as_super.c b/libswfdec/swfdec_as_super.c index e5b9728..ffbc0b5 100644 --- a/libswfdec/swfdec_as_super.c +++ b/libswfdec/swfdec_as_super.c @@ -79,10 +79,10 @@ swfdec_as_super_new (SwfdecAsFrame *fram if (frame->thisp) { SwfdecAsValue val; super->object = frame->thisp; - swfdec_as_object_get_variable (frame->thisp, SWFDEC_AS_STR_constructor, &val); + swfdec_as_object_get_variable (frame->thisp, SWFDEC_AS_STR___proto__, &val); if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) { - SwfdecAsObject *constructor = SWFDEC_AS_VALUE_GET_OBJECT (&val); - swfdec_as_object_get_variable (constructor, SWFDEC_AS_STR___constructor__, &val); + SwfdecAsObject *proto = SWFDEC_AS_VALUE_GET_OBJECT (&val); + swfdec_as_object_get_variable (proto, SWFDEC_AS_STR___constructor__, &val); if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) { super->constructor = (SwfdecAsFunction *) SWFDEC_AS_VALUE_GET_OBJECT (&val); if (!SWFDEC_IS_AS_FUNCTION (super->constructor)) diff-tree b4b7b353623ac870903f5a45dbfc85bf03c28513 (from 9228f671c687da6698b259fbce8d56ada7ab524a) Author: Benjamin Otte <otte at gnome.org> Date: Tue May 22 21:55:22 2007 +0200 implement InitObject action diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index 63b53a6..f5503fb 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -1192,35 +1192,31 @@ fail: fp->sp[-1] = JSVAL_VOID; return JS_TRUE; } +#endif static void swfdec_action_init_object (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { - JSStackFrame *fp = cx->fp; - JSObject *object; - guint n_args; - gulong i; + SwfdecAsStack *stack = cx->frame->stack; + SwfdecAsObject *object; + guint i, n_args; - if (!JS_ValueToECMAUint32 (cx, fp->sp[-1], &n_args)) - return JS_FALSE; - if (!swfdec_script_ensure_stack (cx, 2 * n_args + 1)) - return JS_FALSE; + n_args = swfdec_as_value_to_integer (cx, swfdec_as_stack_pop (stack)); + if (n_args * 2 < swfdec_as_stack_get_size (stack)) { + SWFDEC_FIXME ("InitObject action with too small stack, help!"); + n_args = swfdec_as_stack_get_size (stack) / 2; + } - object = JS_NewObject (cx, &js_ObjectClass, NULL, NULL); + object = swfdec_as_object_new (cx); if (object == NULL) - return JS_FALSE; + return; for (i = 0; i < n_args; i++) { - const char *s = swfdec_js_to_string (cx, fp->sp[-3 - 2 * i]); - if (s == NULL) - return JS_FALSE; - if (!JS_SetProperty (cx, object, s, &fp->sp[-2 - 2 * i])) - return JS_FALSE; + const char *s = swfdec_as_value_to_string (cx, swfdec_as_stack_peek (stack, 2)); + swfdec_as_object_set_variable (object, s, swfdec_as_stack_peek (stack, 1)); + swfdec_as_stack_pop_n (stack, 2); } - fp->sp -= 2 * n_args; - fp->sp[-1] = OBJECT_TO_JSVAL (object); - return JS_TRUE; + SWFDEC_AS_VALUE_SET_OBJECT (swfdec_as_stack_push (stack), object); } -#endif static void swfdec_action_init_array (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) @@ -2099,9 +2095,7 @@ const SwfdecActionSpec swfdec_as_actions [SWFDEC_AS_ACTION_NEW_OBJECT] = { "NewObject", NULL, -1, 1, { NULL, NULL, swfdec_action_new_object, swfdec_action_new_object, swfdec_action_new_object } }, [SWFDEC_AS_ACTION_DEFINE_LOCAL2] = { "DefineLocal2", NULL, 1, 0, { NULL, NULL, swfdec_action_define_local2, swfdec_action_define_local2, swfdec_action_define_local2 } }, [SWFDEC_AS_ACTION_INIT_ARRAY] = { "InitArray", NULL, -1, 1, { NULL, NULL, swfdec_action_init_array, swfdec_action_init_array, swfdec_action_init_array } }, -#if 0 - [0x43] = { "InitObject", NULL, -1, 1, { NULL, NULL, swfdec_action_init_object, swfdec_action_init_object, swfdec_action_init_object } }, -#endif + [SWFDEC_AS_ACTION_INIT_OBJECT] = { "InitObject", NULL, -1, 1, { NULL, NULL, swfdec_action_init_object, swfdec_action_init_object, swfdec_action_init_object } }, [SWFDEC_AS_ACTION_TYPE_OF] = { "TypeOf", NULL, 1, 1, { NULL, NULL, swfdec_action_type_of, swfdec_action_type_of, swfdec_action_type_of } }, #if 0 [0x45] = { "TargetPath", NULL, 1, 1, { NULL, NULL, swfdec_action_target_path, swfdec_action_target_path, swfdec_action_target_path } }, diff-tree 9228f671c687da6698b259fbce8d56ada7ab524a (from 608fea8b3a14545b57ed30aaccd991bf4ba4933f) Author: Benjamin Otte <otte at gnome.org> Date: Tue May 22 21:25:18 2007 +0200 messed up a check for calling native functions diff --git a/libswfdec/swfdec_as_context.c b/libswfdec/swfdec_as_context.c index 44ee604..c88c66a 100644 --- a/libswfdec/swfdec_as_context.c +++ b/libswfdec/swfdec_as_context.c @@ -420,7 +420,7 @@ start: if (frame->argc >= native->min_args && (native->type == 0 || (frame->thisp != NULL && - !g_type_is_a (G_OBJECT_TYPE (frame->thisp), native->type)))) { + g_type_is_a (G_OBJECT_TYPE (frame->thisp), native->type)))) { native->native (frame->thisp, frame->argc, frame->argv, frame->return_value); } swfdec_as_context_return (context); diff-tree 608fea8b3a14545b57ed30aaccd991bf4ba4933f (from parents) Merge: c99ae0ff12cab447a6c1192f8f68a403a3c937d7 67d689d2c9390a5520e4ccfe9a28313f2e60f1bb Author: Benjamin Otte <otte at gnome.org> Date: Tue May 22 21:09:50 2007 +0200 Merge branch 'as' of ssh://company at git.freedesktop.org/git/swfdec into as diff-tree c99ae0ff12cab447a6c1192f8f68a403a3c937d7 (from ebdd3d457ee189c03941ed1fab0ab14a7f1ee990) Author: Benjamin Otte <otte at gnome.org> Date: Tue May 22 20:58:07 2007 +0200 reenable Color class diff --git a/libswfdec/Makefile.am b/libswfdec/Makefile.am index 7cf86f6..ba1f4d4 100644 --- a/libswfdec/Makefile.am +++ b/libswfdec/Makefile.am @@ -21,7 +21,6 @@ lib_LTLIBRARIES = libswfdec- at SWFDEC_MAJO foofiles = \ swfdec_js.c \ - swfdec_js_color.c \ swfdec_js_connection.c \ swfdec_js_global.c \ swfdec_js_mouse.c \ @@ -64,6 +63,7 @@ libswfdec_ at SWFDEC_MAJORMINOR@_la_SOURCES swfdec_codec_screen.c \ swfdec_codec_video.c \ swfdec_color.c \ + swfdec_color_as.c \ swfdec_connection.c \ swfdec_debug.c \ swfdec_debugger.c \ @@ -160,6 +160,7 @@ noinst_HEADERS = \ swfdec_codec_audio.h \ swfdec_codec_video.h \ swfdec_color.h \ + swfdec_color_as.h \ swfdec_connection.h \ swfdec_debug.h \ swfdec_debugger.h \ diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c index 8153c32..7f8529c 100644 --- a/libswfdec/swfdec_as_object.c +++ b/libswfdec/swfdec_as_object.c @@ -315,9 +315,9 @@ swfdec_as_object_get_variable (SwfdecAsO { guint i; - g_return_if_fail (SWFDEC_IS_AS_OBJECT (object)); - g_return_if_fail (variable != NULL); - g_return_if_fail (value != NULL); + g_return_val_if_fail (SWFDEC_IS_AS_OBJECT (object), FALSE); + g_return_val_if_fail (variable != NULL, FALSE); + g_return_val_if_fail (value != NULL, FALSE); for (i = 0; i < 256 && object != NULL; i++) { if (swfdec_as_object_lookup (object, variable, value, NULL)) @@ -330,7 +330,7 @@ swfdec_as_object_get_variable (SwfdecAsO } //SWFDEC_WARNING ("no such variable %s", variable); SWFDEC_AS_VALUE_SET_UNDEFINED (value); - return FALSE: + return FALSE; } void diff --git a/libswfdec/swfdec_as_strings.c b/libswfdec/swfdec_as_strings.c index bc4b61a..52b4d01 100644 --- a/libswfdec/swfdec_as_strings.c +++ b/libswfdec/swfdec_as_strings.c @@ -150,6 +150,19 @@ const char swfdec_as_strings[] = SWFDEC_AS_CONSTANT_STRING ("registerClass") SWFDEC_AS_CONSTANT_STRING ("__constructor__") SWFDEC_AS_CONSTANT_STRING ("_global") + SWFDEC_AS_CONSTANT_STRING ("aa") + SWFDEC_AS_CONSTANT_STRING ("ab") + SWFDEC_AS_CONSTANT_STRING ("ba") + SWFDEC_AS_CONSTANT_STRING ("bb") + SWFDEC_AS_CONSTANT_STRING ("ga") + SWFDEC_AS_CONSTANT_STRING ("gb") + SWFDEC_AS_CONSTANT_STRING ("ra") + SWFDEC_AS_CONSTANT_STRING ("rb") + SWFDEC_AS_CONSTANT_STRING ("getRGB") + SWFDEC_AS_CONSTANT_STRING ("getTransform") + SWFDEC_AS_CONSTANT_STRING ("setRGB") + SWFDEC_AS_CONSTANT_STRING ("setTransform") + SWFDEC_AS_CONSTANT_STRING ("Color") /* add more here */ ; diff --git a/libswfdec/swfdec_color_as.c b/libswfdec/swfdec_color_as.c new file mode 100644 index 0000000..33ed9ee --- /dev/null +++ b/libswfdec/swfdec_color_as.c @@ -0,0 +1,211 @@ +/* Swfdec + * Copyright (C) 2006-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 "swfdec_color_as.h" +#include "swfdec_as_context.h" +#include "swfdec_debug.h" +#include "swfdec_movie.h" + +G_DEFINE_TYPE (SwfdecMovieColor, swfdec_movie_color, SWFDEC_TYPE_AS_OBJECT) + +static void +swfdec_movie_color_mark (SwfdecAsObject *object) +{ + SwfdecMovieColor *color = SWFDEC_MOVIE_COLOR (object); + + /* FIXME: unset movie when movie is already dead */ + if (color->movie) + swfdec_as_object_mark (SWFDEC_AS_OBJECT (color->movie)); + + SWFDEC_AS_OBJECT_CLASS (swfdec_movie_color_parent_class)->mark (object); +} + +static void +swfdec_movie_color_class_init (SwfdecMovieColorClass *klass) +{ + SwfdecAsObjectClass *asobject_class = SWFDEC_AS_OBJECT_CLASS (klass); + + asobject_class->mark = swfdec_movie_color_mark; +} + +static void +swfdec_movie_color_init (SwfdecMovieColor *color) +{ +} + +/*** AS CODE ***/ + +static void +swfdec_movie_color_getRGB (SwfdecAsObject *obj, guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval) +{ + int result; + SwfdecMovie *movie = SWFDEC_MOVIE_COLOR (obj)->movie; + + if (movie == NULL) + return; + + result = (movie->color_transform.rb << 16) | + ((movie->color_transform.gb % 256) << 8) | + (movie->color_transform.bb % 256); + SWFDEC_AS_VALUE_SET_INT (rval, result); +} + +static inline void +add_variable (SwfdecAsObject *obj, const char *name, double value) +{ + SwfdecAsValue val; + + SWFDEC_AS_VALUE_SET_NUMBER (&val, value); + swfdec_as_object_set_variable (obj, name, &val); +} + +static void +swfdec_movie_color_getTransform (SwfdecAsObject *obj, guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval) +{ + SwfdecAsObject *ret; + SwfdecMovie *movie = SWFDEC_MOVIE_COLOR (obj)->movie; + + if (movie == NULL) + return; + + ret = swfdec_as_object_new (obj->context); + if (ret == NULL) + return; + + add_variable (ret, SWFDEC_AS_STR_ra, movie->color_transform.ra * 100.0 / 256.0); + add_variable (ret, SWFDEC_AS_STR_ga, movie->color_transform.ga * 100.0 / 256.0); + add_variable (ret, SWFDEC_AS_STR_ba, movie->color_transform.ba * 100.0 / 256.0); + add_variable (ret, SWFDEC_AS_STR_aa, movie->color_transform.aa * 100.0 / 256.0); + add_variable (ret, SWFDEC_AS_STR_rb, movie->color_transform.rb); + add_variable (ret, SWFDEC_AS_STR_gb, movie->color_transform.gb); + add_variable (ret, SWFDEC_AS_STR_bb, movie->color_transform.bb); + add_variable (ret, SWFDEC_AS_STR_ab, movie->color_transform.ab); + SWFDEC_AS_VALUE_SET_OBJECT (rval, ret); +} + +static void +swfdec_movie_color_setRGB (SwfdecAsObject *obj, guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval) +{ + guint color; + SwfdecMovie *movie = SWFDEC_MOVIE_COLOR (obj)->movie; + + if (movie == NULL) + return; + + color = swfdec_as_value_to_integer (obj->context, &argv[0]); + + movie->color_transform.ra = 0; + movie->color_transform.rb = (color & 0xFF0000) >> 16; + movie->color_transform.ga = 0; + movie->color_transform.gb = (color & 0xFF00) >> 8; + movie->color_transform.ba = 0; + movie->color_transform.bb = color & 0xFF; + swfdec_movie_invalidate (movie); +} + +static inline void +parse_property (SwfdecAsObject *obj, const char *name, int *target, gboolean scale) +{ + SwfdecAsValue val; + double d; + + if (!swfdec_as_object_get_variable (obj, name, &val)) + return; + d = swfdec_as_value_to_number (obj->context, &val); + if (scale) { + *target = d * 256.0 / 100.0; + } else { + *target = d; + } +} + +static void +swfdec_movie_color_setTransform (SwfdecAsObject *obj, guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval) +{ + SwfdecAsObject *parse; + SwfdecMovie *movie = SWFDEC_MOVIE_COLOR (obj)->movie; + + if (movie == NULL) + return; + + if (!SWFDEC_AS_VALUE_IS_OBJECT (&argv[0])) + return; + parse = SWFDEC_AS_VALUE_GET_OBJECT (&argv[0]); + parse_property (parse, SWFDEC_AS_STR_ra, &movie->color_transform.ra, TRUE); + parse_property (parse, SWFDEC_AS_STR_ga, &movie->color_transform.ga, TRUE); + parse_property (parse, SWFDEC_AS_STR_ba, &movie->color_transform.ba, TRUE); + parse_property (parse, SWFDEC_AS_STR_aa, &movie->color_transform.aa, TRUE); + parse_property (parse, SWFDEC_AS_STR_rb, &movie->color_transform.rb, FALSE); + parse_property (parse, SWFDEC_AS_STR_gb, &movie->color_transform.gb, FALSE); + parse_property (parse, SWFDEC_AS_STR_bb, &movie->color_transform.bb, FALSE); + parse_property (parse, SWFDEC_AS_STR_ab, &movie->color_transform.ab, FALSE); + swfdec_movie_invalidate (movie); +} + +static void +swfdec_movie_color_construct (SwfdecAsObject *obj, guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval) +{ + SwfdecMovieColor *color = SWFDEC_MOVIE_COLOR (obj); + + if (argc > 0 && SWFDEC_AS_VALUE_IS_OBJECT (&argv[0])) { + SwfdecAsObject *object = SWFDEC_AS_VALUE_GET_OBJECT (&argv[0]); + if (SWFDEC_IS_MOVIE (object)) + color->movie = SWFDEC_MOVIE (object); + } + SWFDEC_AS_VALUE_SET_OBJECT (rval, obj); +} + +void +swfdec_movie_color_init_context (SwfdecAsContext *context, guint version) +{ + SwfdecAsObject *color, *proto; + SwfdecAsValue val; + + g_return_if_fail (SWFDEC_IS_AS_CONTEXT (context)); + + color = SWFDEC_AS_OBJECT (swfdec_as_object_add_function (context->global, + SWFDEC_AS_STR_Color, SWFDEC_TYPE_MOVIE_COLOR, swfdec_movie_color_construct, 0)); + if (!color) + return; + if (!swfdec_as_context_use_mem (context, sizeof (SwfdecMovieColor))) + return; + proto = g_object_new (SWFDEC_TYPE_MOVIE_COLOR, NULL); + swfdec_as_object_add (proto, context, sizeof (SwfdecMovieColor)); + /* set the right properties on the Color object */ + SWFDEC_AS_VALUE_SET_OBJECT (&val, proto); + swfdec_as_object_set_variable (color, SWFDEC_AS_STR_prototype, &val); + /* set the right properties on the Color.prototype object */ + SWFDEC_AS_VALUE_SET_OBJECT (&val, context->Object_prototype); + swfdec_as_object_set_variable (proto, SWFDEC_AS_STR___proto__, &val); + SWFDEC_AS_VALUE_SET_OBJECT (&val, color); + swfdec_as_object_set_variable (proto, SWFDEC_AS_STR_constructor, &val); + swfdec_as_object_add_function (proto, SWFDEC_AS_STR_getRGB, SWFDEC_TYPE_MOVIE_COLOR, + swfdec_movie_color_getRGB, 0); + swfdec_as_object_add_function (proto, SWFDEC_AS_STR_getTransform, SWFDEC_TYPE_MOVIE_COLOR, + swfdec_movie_color_getTransform, 0); + swfdec_as_object_add_function (proto, SWFDEC_AS_STR_setRGB, SWFDEC_TYPE_MOVIE_COLOR, + swfdec_movie_color_setRGB, 1); + swfdec_as_object_add_function (proto, SWFDEC_AS_STR_setTransform, SWFDEC_TYPE_MOVIE_COLOR, + swfdec_movie_color_setTransform, 1); +} + diff --git a/libswfdec/swfdec_color_as.h b/libswfdec/swfdec_color_as.h new file mode 100644 index 0000000..7980d5b --- /dev/null +++ b/libswfdec/swfdec_color_as.h @@ -0,0 +1,56 @@ +/* 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_MOVIE_COLOR_H_ +#define _SWFDEC_MOVIE_COLOR_H_ + +#include <libswfdec/swfdec_as_object.h> +#include <libswfdec/swfdec_as_types.h> +#include <libswfdec/swfdec_script.h> + +G_BEGIN_DECLS + +typedef struct _SwfdecMovieColor SwfdecMovieColor; +typedef struct _SwfdecMovieColorClass SwfdecMovieColorClass; + +#define SWFDEC_TYPE_MOVIE_COLOR (swfdec_movie_color_get_type()) +#define SWFDEC_IS_MOVIE_COLOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_MOVIE_COLOR)) +#define SWFDEC_IS_MOVIE_COLOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_MOVIE_COLOR)) +#define SWFDEC_MOVIE_COLOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_MOVIE_COLOR, SwfdecMovieColor)) +#define SWFDEC_MOVIE_COLOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_MOVIE_COLOR, SwfdecMovieColorClass)) +#define SWFDEC_MOVIE_COLOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_MOVIE_COLOR, SwfdecMovieColorClass)) + +struct _SwfdecMovieColor { + SwfdecAsObject object; + + SwfdecMovie * movie; /* movie we set the color for or NULL */ +}; + +struct _SwfdecMovieColorClass { + SwfdecAsObjectClass object_class; +}; + +GType swfdec_movie_color_get_type (void); + +void swfdec_movie_color_init_context (SwfdecAsContext * context, + guint version); + + +G_END_DECLS +#endif diff --git a/libswfdec/swfdec_js_color.c b/libswfdec/swfdec_js_color.c deleted file mode 100644 index fe7b1f0..0000000 --- a/libswfdec/swfdec_js_color.c +++ /dev/null @@ -1,192 +0,0 @@ -/* Swfdec - * Copyright (C) 2006 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 "swfdec_js.h" -#include "swfdec_debug.h" -#include "swfdec_movie.h" -#include "swfdec_player_internal.h" - -static JSBool -swfdec_js_color_get_rgb (JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) -{ - int result; - SwfdecMovie *movie = JS_GetPrivate (cx, obj); - - if (!movie) - return JS_TRUE; - result = (movie->color_transform.rb << 16) | - ((movie->color_transform.gb % 256) << 8) | - (movie->color_transform.bb % 256); - *rval = INT_TO_JSVAL (result); - return JS_TRUE; -} - -static inline void -add_variable (JSContext *cx, JSObject *obj, const char *name, double value) -{ - jsval val; - - if (JS_NewNumberValue (cx, value, &val)) - JS_SetProperty (cx, obj, name, &val); -} - -static JSBool -swfdec_js_color_get_transform (JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) -{ - JSObject *ret; - SwfdecMovie *movie = JS_GetPrivate (cx, obj); - - if (!movie) - return JS_TRUE; - ret = JS_NewObject (cx, NULL, NULL, NULL); - if (ret == NULL) - return JS_TRUE; - - add_variable (cx, ret, "ra", movie->color_transform.ra * 100.0 / 256.0); - add_variable (cx, ret, "ga", movie->color_transform.ga * 100.0 / 256.0); - add_variable (cx, ret, "ba", movie->color_transform.ba * 100.0 / 256.0); - add_variable (cx, ret, "aa", movie->color_transform.aa * 100.0 / 256.0); - add_variable (cx, ret, "rb", movie->color_transform.rb); - add_variable (cx, ret, "gb", movie->color_transform.gb); - add_variable (cx, ret, "bb", movie->color_transform.bb); - add_variable (cx, ret, "ab", movie->color_transform.ab); - *rval = OBJECT_TO_JSVAL (ret); - return JS_TRUE; -} - -static JSBool -swfdec_js_color_set_rgb (JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) -{ - guint color; - SwfdecMovie *movie = JS_GetPrivate (cx, obj); - - if (!movie) - return JS_TRUE; - if (!JS_ValueToECMAUint32 (cx, argv[0], &color)) - return JS_TRUE; - - movie->color_transform.ra = 0; - movie->color_transform.rb = (color & 0xFF0000) >> 16; - movie->color_transform.ga = 0; - movie->color_transform.gb = (color & 0xFF00) >> 8; - movie->color_transform.ba = 0; - movie->color_transform.bb = color & 0xFF; - swfdec_movie_invalidate (movie); - return JS_TRUE; -} - -static inline void -parse_property (JSContext *cx, JSObject *obj, const char *name, int *target, gboolean scale) -{ - jsval val; - double d; - - if (!JS_GetProperty (cx, obj, name, &val)) - return; - if (JSVAL_IS_VOID (val)) - return; - if (!JS_ValueToNumber (cx, val, &d)) - return; - if (scale) { - *target = d * 256.0 / 100.0; - } else { - *target = d; - } -} - -static JSBool -swfdec_js_color_set_transform (JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) -{ - JSObject *parse; - SwfdecMovie *movie = JS_GetPrivate (cx, obj); - - if (!movie) - return JS_TRUE; - if (!movie) - return JS_TRUE; - parse = JSVAL_TO_OBJECT (argv[0]); - parse_property (cx, parse, "ra", &movie->color_transform.ra, TRUE); - parse_property (cx, parse, "ga", &movie->color_transform.ga, TRUE); - parse_property (cx, parse, "ba", &movie->color_transform.ba, TRUE); - parse_property (cx, parse, "aa", &movie->color_transform.aa, TRUE); - parse_property (cx, parse, "rb", &movie->color_transform.rb, FALSE); - parse_property (cx, parse, "gb", &movie->color_transform.gb, FALSE); - parse_property (cx, parse, "bb", &movie->color_transform.bb, FALSE); - parse_property (cx, parse, "ab", &movie->color_transform.ab, FALSE); - swfdec_movie_invalidate (movie); - return JS_TRUE; -} - -static JSFunctionSpec color_methods[] = { - { "getRGB", swfdec_js_color_get_rgb, 1, 0, 0 }, - { "getTransform", swfdec_js_color_get_transform, 1, 0, 0 }, - { "setRGB", swfdec_js_color_set_rgb, 1, 0, 0 }, - { "setTransform", swfdec_js_color_set_transform, 1, 0, 0 }, - {0,0,0,0,0} -}; - -static void -swfdec_js_color_finalize (JSContext *cx, JSObject *obj) -{ - SwfdecMovie *movie; - - movie = JS_GetPrivate (cx, obj); - if (movie) { - g_object_unref (movie); - } -} - -static JSClass color_class = { - "Color", JSCLASS_HAS_PRIVATE, - JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, - JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, swfdec_js_color_finalize, - JSCLASS_NO_OPTIONAL_MEMBERS -}; - -static JSBool -swfdec_js_color_new (JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) -{ - SwfdecMovie *movie; - - if (argc > 0) { - movie = swfdec_scriptable_from_jsval (cx, argv[0], SWFDEC_TYPE_MOVIE); - } else { - movie = NULL; - } - if (movie != NULL) { - if (!JS_SetPrivate (cx, obj, movie)) - return JS_FALSE; - g_object_ref (movie); - } - *rval = OBJECT_TO_JSVAL (obj); - return JS_TRUE; -} - -void -swfdec_js_add_color (SwfdecPlayer *player) -{ - JS_InitClass (player->jscx, player->jsobj, NULL, - &color_class, swfdec_js_color_new, 0, NULL, color_methods, - NULL, NULL); -} - diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index ec783b7..74a8e7c 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -1020,6 +1020,7 @@ swfdec_player_launch (SwfdecPlayer *play extern void swfdec_player_init_global (SwfdecPlayer *player, guint version); extern void swfdec_mouse_init_context (SwfdecPlayer *player, guint version); +extern void swfdec_movie_color_init_context (SwfdecPlayer *player, guint version); extern void swfdec_sprite_movie_init_context (SwfdecPlayer *player, guint version); /** * swfdec_player_initialize: @@ -1052,6 +1053,7 @@ swfdec_player_initialize (SwfdecPlayer * swfdec_player_init_global (player, version); swfdec_mouse_init_context (player, version); swfdec_sprite_movie_init_context (player, version); + swfdec_movie_color_init_context (player, version); if (context->state == SWFDEC_AS_CONTEXT_NEW) { context->state = SWFDEC_AS_CONTEXT_RUNNING; swfdec_as_object_set_constructor (player->roots->data, player->MovieClip); diff-tree ebdd3d457ee189c03941ed1fab0ab14a7f1ee990 (from f847682cb4372a9e77801399bcd57b56ae8eb253) Author: Benjamin Otte <otte at gnome.org> Date: Tue May 22 15:01:16 2007 +0200 make swfdec_as_object_get_variable return TRUE/FALSE if the variable exists diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c index 6152d51..8153c32 100644 --- a/libswfdec/swfdec_as_object.c +++ b/libswfdec/swfdec_as_object.c @@ -309,7 +309,7 @@ swfdec_as_object_lookup (SwfdecAsObject return klass->get (object, variable, value, flags); } -void +gboolean swfdec_as_object_get_variable (SwfdecAsObject *object, const char *variable, SwfdecAsValue *value) { @@ -321,15 +321,16 @@ swfdec_as_object_get_variable (SwfdecAsO for (i = 0; i < 256 && object != NULL; i++) { if (swfdec_as_object_lookup (object, variable, value, NULL)) - return; + return TRUE; object = object->prototype; } if (i == 256) { swfdec_as_context_abort (object->context, "Prototype recursion limit exceeded"); - return; + return FALSE; } //SWFDEC_WARNING ("no such variable %s", variable); SWFDEC_AS_VALUE_SET_UNDEFINED (value); + return FALSE: } void diff --git a/libswfdec/swfdec_as_object.h b/libswfdec/swfdec_as_object.h index c677d51..c834310 100644 --- a/libswfdec/swfdec_as_object.h +++ b/libswfdec/swfdec_as_object.h @@ -110,7 +110,7 @@ void swfdec_as_object_unroot (Swfdec void swfdec_as_object_set_variable (SwfdecAsObject * object, const char * variable, const SwfdecAsValue * value); -void swfdec_as_object_get_variable (SwfdecAsObject * object, +gboolean swfdec_as_object_get_variable (SwfdecAsObject * object, const char * variable, SwfdecAsValue * value); void swfdec_as_object_delete_variable(SwfdecAsObject * object, diff-tree f847682cb4372a9e77801399bcd57b56ae8eb253 (from 9611954464237c3162a09458e506840adb0943e5) Author: Benjamin Otte <otte at gnome.org> Date: Tue May 22 14:48:51 2007 +0200 fix various cases that assumed frame->thisp != NULL diff --git a/libswfdec/swfdec_as_context.c b/libswfdec/swfdec_as_context.c index 1bca426..44ee604 100644 --- a/libswfdec/swfdec_as_context.c +++ b/libswfdec/swfdec_as_context.c @@ -418,7 +418,9 @@ start: if (SWFDEC_IS_AS_NATIVE_FUNCTION (frame->function)) { SwfdecAsNativeFunction *native = SWFDEC_AS_NATIVE_FUNCTION (frame->function); if (frame->argc >= native->min_args && - (native->type == 0 || g_type_is_a (G_OBJECT_TYPE (frame->thisp), native->type))) { + (native->type == 0 || + (frame->thisp != NULL && + !g_type_is_a (G_OBJECT_TYPE (frame->thisp), native->type)))) { native->native (frame->thisp, frame->argc, frame->argv, frame->return_value); } swfdec_as_context_return (context); diff --git a/libswfdec/swfdec_as_frame.c b/libswfdec/swfdec_as_frame.c index 75e0534..2982e3c 100644 --- a/libswfdec/swfdec_as_frame.c +++ b/libswfdec/swfdec_as_frame.c @@ -228,11 +228,13 @@ swfdec_as_frame_find_variable (SwfdecAsF ret = swfdec_as_object_find_variable (frame->target, variable); if (ret) return frame->target; - } else { + } else if (frame->thisp) { /* The default target is the original object that called into us */ ret = swfdec_as_object_find_variable (SWFDEC_AS_FRAME (cur)->thisp, variable); if (ret) return SWFDEC_AS_FRAME (cur)->thisp; + } else { + SWFDEC_ERROR ("FIXME: what happens when no target and no this exists?"); } /* 2) the global object */ ret = swfdec_as_object_find_variable (SWFDEC_AS_OBJECT (frame)->context->global, variable); diff --git a/libswfdec/swfdec_as_frame.h b/libswfdec/swfdec_as_frame.h index 3cacbb1..97f119f 100644 --- a/libswfdec/swfdec_as_frame.h +++ b/libswfdec/swfdec_as_frame.h @@ -40,7 +40,7 @@ struct _SwfdecAsFrame { SwfdecAsFrame * next; /* next frame (FIXME: keep a list in the context instead?) */ SwfdecAsFunction * function; /* function we're executing or NULL if toplevel */ - SwfdecAsObject * thisp; /* this object in current frame */ + SwfdecAsObject * thisp; /* this object in current frame or NULL if none */ gboolean construct; /* TRUE if this is the constructor for thisp */ /* debugging */ char * function_name; /* name of function */
Apparently Analagous Threads
- Branch 'as' - 3 commits - libswfdec/swfdec_as_array.c libswfdec/swfdec_as_context.c libswfdec/swfdec_as_math.c libswfdec/swfdec_as_native_function.c libswfdec/swfdec_as_number.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_string.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
- 4 commits - libswfdec/swfdec_as_array.c libswfdec/swfdec_as_boolean.c libswfdec/swfdec_as_function.c libswfdec/swfdec_as_number.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_string.c libswfdec/swfdec_color_as.c test/trace
- Branch 'as' - 25 commits - libswfdec/Makefile.am libswfdec/swfdec_as_boolean.c libswfdec/swfdec_as_boolean.h libswfdec/swfdec_as_context.c libswfdec/swfdec_as_context.h libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame.h libswfdec/swfdec_as_function.c
- Branch 'as' - 15 commits - libswfdec/swfdec_as_context.c libswfdec/swfdec_as_context.h libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame.h libswfdec/swfdec_as_function.c libswfdec/swfdec_as_function.h libswfdec/swfdec_as_interpret.c