📄 swfdec_js_movie.c
字号:
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 = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_MOVIE); if (movie == NULL) { SWFDEC_WARNING ("not a movie"); return JS_TRUE; } export = swfdec_js_to_string (cx, argv[0]); name = swfdec_js_to_string (cx, argv[1]); if (argc > 3) { SWFDEC_ERROR ("attachMovie's initObject isn't implemented"); } 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); /* run init and construct */ swfdec_js_movie_init_from_object (ret, NULL); swfdec_movie_run_construct (ret); *rval = OBJECT_TO_JSVAL (SWFDEC_SCRIPTABLE (ret)->jsobj); return JS_TRUE;}static JSBoolswfdec_js_movie_duplicateMovieClip (JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ SwfdecMovie *movie, *ret; const char *name; int depth; SwfdecContent *content; movie = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_MOVIE); if (movie == NULL) { SWFDEC_WARNING ("not a movie"); return JS_TRUE; }#if 0 /* FIXME: is this still valid? */ if (argc > 2) { const char *str; jsval val; str = swfdec_js_to_string (cx, argv[0]); if (!str) return JS_TRUE; val = swfdec_js_eval (cx, obj, str); movie = swfdec_js_val_to_movie (cx, val); if (!movie) return JS_TRUE; argv++; argc--; }#endif name = swfdec_js_to_string (cx, argv[0]); if (name == NULL) return JS_FALSE; if (!JS_ValueToECMAInt32 (cx, argv[1], &depth)) return JS_FALSE; if (swfdec_depth_classify (depth) == SWFDEC_DEPTH_CLASS_EMPTY) return JS_TRUE; g_assert (movie->parent); ret = swfdec_movie_find (movie->parent, depth); if (ret) swfdec_movie_remove (ret); content = swfdec_content_new (depth); *content = *movie->content; if (content->events) content->events = swfdec_event_list_copy (content->events); 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->parent, 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_js_copy_props (ret, movie); SWFDEC_LOG ("duplicated %s as %s to depth %u", movie->name, ret->name, ret->depth); *rval = OBJECT_TO_JSVAL (SWFDEC_SCRIPTABLE (ret)->jsobj); return JS_TRUE;}static JSBoolswfdec_js_movie_removeMovieClip (JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ SwfdecMovie *movie; movie = JS_GetPrivate (cx, obj); g_assert (movie); if (swfdec_depth_classify (movie->depth) == SWFDEC_DEPTH_CLASS_DYNAMIC) swfdec_movie_remove (movie); return JS_TRUE;}static JSBoolswfdec_js_getURL (JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ const char *url; const char *target; SwfdecMovie *movie; movie = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_MOVIE); if (movie == NULL) { SWFDEC_WARNING ("not a movie"); return JS_TRUE; } url = swfdec_js_to_string (cx, argv[0]); if (!url) return FALSE; if (argc > 1) { target = swfdec_js_to_string (cx, argv[1]); if (!target) return JS_FALSE; } else { /* FIXME: figure out default target */ g_assert_not_reached (); } if (argc > 2) { /* variables not implemented yet */ g_assert_not_reached (); } swfdec_root_movie_load (SWFDEC_ROOT_MOVIE (movie->root), url, target); return JS_TRUE;}static JSBoolswfdec_js_getDepth (JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ SwfdecMovie *movie; movie = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_MOVIE); if (movie == NULL) { SWFDEC_WARNING ("not a movie"); return JS_TRUE; } *rval = INT_TO_JSVAL (movie->depth); return JS_TRUE;}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 }, { "getBytesTotal", mc_getBytesTotal, 0, 0, 0 }, { "getDepth", swfdec_js_getDepth, 0, 0, 0 }, { "getNextHighestDepth", mc_getNextHighestDepth, 0, 0, 0 }, { "getProperty", swfdec_js_getProperty, 2, 0, 0 }, { "getURL", swfdec_js_getURL, 2, 0, 0 }, { "gotoAndPlay", mc_gotoAndPlay, 1, 0, 0 }, { "gotoAndStop", mc_gotoAndStop, 1, 0, 0 }, { "hitTest", mc_hitTest, 1, 0, 0 }, { "nextFrame", swfdec_js_nextFrame, 0, 0, 0 }, { "play", mc_play, 0, 0, 0 }, { "prevFrame", swfdec_js_prevFrame, 0, 0, 0 }, { "removeMovieClip", swfdec_js_movie_removeMovieClip,0, 0, 0 }, { "setProperty", swfdec_js_setProperty, 3, 0, 0 }, { "startDrag", swfdec_js_startDrag, 0, 0, 0 }, { "stop", mc_stop, 0, 0, 0 }, { "stopDrag", swfdec_js_stopDrag, 0, 0, 0 }, { "swapDepths", swfdec_js_movie_swapDepths, 1, 0, 0 }, { NULL }};static JSBoolmc_x_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp){ SwfdecMovie *movie; double d; movie = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_MOVIE); if (movie == NULL) { SWFDEC_WARNING ("not a movie"); return JS_TRUE; } d = SWFDEC_TWIPS_TO_DOUBLE (movie->matrix.x0); return JS_NewNumberValue (cx, d, vp);}static JSBoolmc_x_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp){ SwfdecMovie *movie; double d; movie = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_MOVIE); if (movie == NULL) { SWFDEC_WARNING ("not a movie"); return JS_TRUE; } if (!JS_ValueToNumber (cx, *vp, &d)) return JS_FALSE; if (!finite (d)) { SWFDEC_WARNING ("trying to move %s._x to a non-finite value, ignoring", movie->name); return JS_TRUE; } movie->modified = TRUE; d = SWFDEC_DOUBLE_TO_TWIPS (d); if (d != movie->matrix.x0) { movie->matrix.x0 = d; swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_MATRIX); } return JS_TRUE;}static JSBoolmc_y_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp){ SwfdecMovie *movie; double d; movie = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_MOVIE); if (movie == NULL) { SWFDEC_WARNING ("not a movie"); return JS_TRUE; } swfdec_movie_update (movie); d = SWFDEC_TWIPS_TO_DOUBLE (movie->matrix.y0); return JS_NewNumberValue (cx, d, vp);}static JSBoolmc_y_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp){ SwfdecMovie *movie; double d; movie = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_MOVIE); if (movie == NULL) { SWFDEC_WARNING ("not a movie"); return JS_TRUE; } if (!JS_ValueToNumber (cx, *vp, &d)) return JS_FALSE; if (!finite (d)) { SWFDEC_WARNING ("trying to move %s._y to a non-finite value, ignoring", movie->name); return JS_TRUE; } movie->modified = TRUE; d = SWFDEC_DOUBLE_TO_TWIPS (d); if (d != movie->matrix.y0) { movie->matrix.y0 = d; swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_MATRIX); } return JS_TRUE;}static JSBoolmc_xscale_get (JSContext *cx, JSObject *obj, jsval id, jsval *vp){ SwfdecMovie *movie; double d; movie = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_MOVIE); if (movie == NULL) { SWFDEC_WARNING ("not a movie"); return JS_TRUE; } d = movie->xscale; return JS_NewNumberValue (cx, d, vp);}static JSBoolmc_xscale_set (JSContext *cx, JSObject *obj, jsval id, jsval *vp){ SwfdecMovie *movie; double d; movie = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_MOVIE); if (movie == NULL) { SWFDEC_WARNING ("not a movie"); return JS_TRUE; } if (!JS_ValueToNumber (cx, *vp, &d)) return JS_FALSE; if (!finite (d)) { SWFDEC_WARNING ("trying to set xscale to a non-finite value, ignoring"); return JS_TRUE; } movie->modified = TRUE; movie->xscale = d; swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_MATRIX); return JS_TRUE;}static JSBoolmc_yscale_get (JSContext *cx, JSObject *obj, jsval id, jsval *vp){ SwfdecMovie *movie; double d; movie = JS_GetPrivate (cx, obj); g_assert (movie); d = movie->yscale; return JS_NewNumberValue (cx, d, vp);}static JSBoolmc_yscale_set (JSContext *cx, JSObject *obj, jsval id, jsval *vp){ SwfdecMovie *movie; double d; movie = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_MOVIE); if (movie == NULL) { SWFDEC_WARNING ("not a movie"); return JS_TRUE; } if (!JS_ValueToNumber (cx, *vp, &d)) return JS_FALSE; if (!finite (d)) { SWFDEC_WARNING ("trying to set yscale to a non-finite value, ignoring"); return JS_TRUE; } movie->modified = TRUE; movie->yscale = d; swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_MATRIX); return JS_TRUE;}static JSBoolmc_currentframe (JSContext *cx, JSObject *obj, jsval id, jsval *vp){ SwfdecMovie *movie; movie = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_MOVIE); if (movie == NULL) { SWFDEC_WARNING ("not a movie"); return JS_TRUE; } *vp = INT_TO_JSVAL (movie->frame + 1); return JS_TRUE;}static JSBoolmc_framesloaded (JSContext *cx, JSObject *obj, jsval id, jsval *vp){ SwfdecMovie *movie; guint loaded; movie = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_MOVIE); if (movie == NULL) { SWFDEC_WARNING ("not a movie"); return JS_TRUE; } /* only root movies can be partially loaded */ if (SWFDEC_IS_ROOT_MOVIE (movie)) { SwfdecDecoder *dec = SWFDEC_ROOT_MOVIE (movie->root)->decoder; loaded = dec->frames_loaded; g_assert (loaded <= movie->n_frames); } else { loaded = movie->n_frames; } *vp = INT_TO_JSVAL (loaded); return JS_TRUE;}static JSBoolmc_name_get (JSContext *cx, JSObject *obj, jsval id, jsval *vp){ SwfdecMovie *movie; JSString *string; movie = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_MOVIE); if (movie == NULL) { SWFDEC_WARNING ("not a movie"); return JS_TRUE; } if (movie->has_name) string = JS_NewStringCopyZ (cx, movie->name); else string = JS_NewStringCopyZ (cx, ""); if (string == NULL) return JS_FALSE; *vp = STRING_TO_JSVAL (string); return JS_TRUE;}static JSBoolmc_name_set (JSContext *cx, JSObject *obj, jsval id, jsval *vp){ SwfdecMovie *movie; const char *str; movie = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_MOVIE); if (movie == NULL) { SWFDEC_WARNING ("not a movie"); return JS_TRUE; } str = swfdec_js_to_string (cx, *vp); if (str == NULL) return JS_FALSE; if (!SWFDEC_IS_ROOT_MOVIE (movie)) swfdec_js_movie_remove_property (movie); g_free (movie->name); movie->name = g_strdup (str); movie->has_name = TRUE; if (!SWFDEC_IS_ROOT_MOVIE (movie)) swfdec_js_movie_add_property (movie); return JS_TRUE;}static JSBoolmc_totalframes (JSContext *cx, JSObject *obj, jsval id, jsval *vp){ SwfdecMovie *movie; movie = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_MOVIE); if (movie == NULL) { SWFDEC_WARNING ("not a movie"); return JS_TRUE; } *vp = INT_TO_JSVAL (movie->n_frames); return JS_TRUE;}static JSBoolmc_alpha_get (JSContext *cx, JSObject *obj, jsval id, jsval *vp){ SwfdecMovie *movie; double d; movie = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_MOVIE); if (movie == NULL) { SWFDEC_WARNING ("not a movie"); return JS_TRUE; } d = movie->color_transform.aa * 100.0 / 256.0; return JS_NewNumberValue (cx, d, vp);}static JSBoolmc_alpha_set (JSContext *cx, JSObject *obj, jsval id, jsval *vp){ SwfdecMovie *movie; double d;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -