📄 swfdec_js_movie.c
字号:
int alpha; 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_TRUE; alpha = d * 256.0 / 100.0; if (alpha != movie->color_transform.aa) { movie->color_transform.aa = alpha; swfdec_movie_invalidate (movie); } return JS_TRUE;}static JSBoolmc_visible_get (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 = BOOLEAN_TO_JSVAL (movie->visible ? JS_TRUE : JS_FALSE); return JS_TRUE;}static JSBoolmc_visible_set (JSContext *cx, JSObject *obj, jsval id, jsval *vp){ SwfdecMovie *movie; JSBool b; movie = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_MOVIE); if (movie == NULL) { SWFDEC_WARNING ("not a movie"); return JS_TRUE; } if (!JS_ValueToBoolean (cx, *vp, &b)) return JS_TRUE; /* is there an xor in C? :o */ if ((b && !movie->visible) || (!b && movie->visible)) { movie->visible = !movie->visible; swfdec_movie_invalidate (movie); } return JS_TRUE;}static JSBoolmc_width_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 ((SwfdecTwips) (rint (movie->extents.x1 - movie->extents.x0))); return JS_NewNumberValue (cx, d, vp);}static JSBoolmc_width_set (JSContext *cx, JSObject *obj, jsval id, jsval *vp){ SwfdecMovie *movie; double d, cur; movie = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_MOVIE); if (movie == NULL) { SWFDEC_WARNING ("not a movie"); return JS_TRUE; } /* property was readonly in Flash 4 and before */ if (SWFDEC_SWF_DECODER (SWFDEC_ROOT_MOVIE (movie->root)->decoder)->version < 5) return JS_TRUE; if (!JS_ValueToNumber (cx, *vp, &d)) return JS_FALSE; if (!finite (d)) { SWFDEC_WARNING ("trying to set height to a non-finite value, ignoring"); return JS_TRUE; } swfdec_movie_update (movie); movie->modified = TRUE; cur = SWFDEC_TWIPS_TO_DOUBLE ((SwfdecTwips) (rint (movie->original_extents.x1 - movie->original_extents.x0))); if (cur != 0) { movie->xscale = 100 * d / cur; } else { movie->xscale = 0; movie->yscale = 0; } swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_MATRIX); return JS_TRUE;}static JSBoolmc_height_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 ((SwfdecTwips) (rint (movie->extents.y1 - movie->extents.y0))); return JS_NewNumberValue (cx, d, vp);}static JSBoolmc_height_set (JSContext *cx, JSObject *obj, jsval id, jsval *vp){ SwfdecMovie *movie; double d, cur; movie = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_MOVIE); if (movie == NULL) { SWFDEC_WARNING ("not a movie"); return JS_TRUE; } /* property was readonly in Flash 4 and before */ if (SWFDEC_SWF_DECODER (SWFDEC_ROOT_MOVIE (movie->root)->decoder)->version < 5) return JS_TRUE; if (!JS_ValueToNumber (cx, *vp, &d)) return JS_FALSE; if (!finite (d)) { SWFDEC_WARNING ("trying to set height to a non-finite value, ignoring"); return JS_TRUE; } swfdec_movie_update (movie); movie->modified = TRUE; cur = SWFDEC_TWIPS_TO_DOUBLE ((SwfdecTwips) (rint (movie->original_extents.y1 - movie->original_extents.y0))); if (cur != 0) { movie->yscale = 100 * d / cur; } else { movie->xscale = 0; movie->yscale = 0; } swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_MATRIX); return JS_TRUE;}static JSBoolmc_rotation_get (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; } return JS_NewNumberValue (cx, movie->rotation, vp);}static JSBoolmc_rotation_set (JSContext *cx, JSObject *obj, jsval id, jsval *vp){ SwfdecMovie *movie; double d; movie = JS_GetPrivate (cx, obj); g_assert (movie); /* FIXME: Flash 4 handles this differently */ if (!JS_ValueToNumber (cx, *vp, &d)) return JS_FALSE; d = fmod (d, 360.0); if (d > 180.0) d -= 360.0; if (d < -180.0) d += 360.0; if (SWFDEC_SWF_DECODER (SWFDEC_ROOT_MOVIE (movie->root)->decoder)->version < 5) { if (!finite (d)) return JS_TRUE; SWFDEC_ERROR ("FIXME: implement correct rounding errors here"); } movie->modified = TRUE; movie->rotation = d; swfdec_movie_queue_update (movie, SWFDEC_MOVIE_INVALID_MATRIX); return JS_TRUE;}static JSBoolmc_xmouse_get (JSContext *cx, JSObject *obj, jsval id, jsval *vp){ double x, y; SwfdecMovie *movie; movie = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_MOVIE); if (movie == NULL) { SWFDEC_WARNING ("not a movie"); return JS_TRUE; } swfdec_movie_get_mouse (movie, &x, &y); x = rint (x * SWFDEC_TWIPS_SCALE_FACTOR) / SWFDEC_TWIPS_SCALE_FACTOR; return JS_NewNumberValue (cx, x, vp);}static JSBoolmc_ymouse_get (JSContext *cx, JSObject *obj, jsval id, jsval *vp){ double x, y; SwfdecMovie *movie; movie = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_MOVIE); if (movie == NULL) { SWFDEC_WARNING ("not a movie"); return JS_TRUE; } swfdec_movie_get_mouse (movie, &x, &y); y = rint (y * SWFDEC_TWIPS_SCALE_FACTOR) / SWFDEC_TWIPS_SCALE_FACTOR; return JS_NewNumberValue (cx, y, vp);}/* FIXME: what do we do if we're the root movie? */static JSBoolmc_parent (JSContext *cx, JSObject *obj, jsval id, jsval *vp){ SwfdecMovie *movie; JSObject *jsobj; movie = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_MOVIE); if (movie == NULL) { SWFDEC_WARNING ("not a movie"); return JS_TRUE; } /* FIXME: what do we do if we're the root movie? */ if (movie->parent) { movie = movie->parent; jsobj = swfdec_scriptable_get_object (SWFDEC_SCRIPTABLE (movie)); if (jsobj == NULL) return JS_FALSE; *vp = OBJECT_TO_JSVAL (jsobj); } /* else return JSVAL_VOID */ return JS_TRUE;}static JSBoolmc_root (JSContext *cx, JSObject *obj, jsval id, jsval *vp){ SwfdecMovie *movie; JSObject *jsobj; movie = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_MOVIE); if (movie == NULL) { SWFDEC_WARNING ("not a movie"); return JS_TRUE; } movie = movie->root; jsobj = swfdec_scriptable_get_object (SWFDEC_SCRIPTABLE (movie)); if (jsobj == NULL) return JS_FALSE; *vp = OBJECT_TO_JSVAL (jsobj); return JS_TRUE;}/* Movie AS standard class */enum { PROP_X, PROP_Y, PROP_XSCALE, PROP_YSCALE, PROP_CURRENTFRAME, PROP_TOTALFRAMES, PROP_ALPHA, PROP_VISIBLE, PROP_WIDTH, PROP_HEIGHT, PROP_ROTATION, PROP_FRAMESLOADED, PROP_NAME, PROP_DROPTARGET, PROP_URL, PROP_HIGHQUALITY, PROP_FOCUSRECT, PROP_SOUNDBUFTIME, PROP_QUALITY, PROP_XMOUSE, PROP_YMOUSE};static JSBoolnot_reached (JSContext *cx, JSObject *obj, jsval id, jsval *vp){#ifndef SWFDEC_DISABLE_DEBUG const char *str = swfdec_js_to_string (cx, id);#endif SWFDEC_ERROR ("reading and writing property %s is not implemented", str); return JS_TRUE;}/* NB: order needs to be kept for GetProperty/SetProperty actions */#define MC_PROP_ATTRS (JSPROP_PERMANENT|JSPROP_SHARED)static JSPropertySpec movieclip_props[] = { {"_x", -1, MC_PROP_ATTRS, mc_x_get, mc_x_set }, {"_y", -1, MC_PROP_ATTRS, mc_y_get, mc_y_set }, {"_xscale", -1, MC_PROP_ATTRS, mc_xscale_get, mc_xscale_set }, {"_yscale", -1, MC_PROP_ATTRS, mc_yscale_get, mc_yscale_set }, {"_currentframe", -1, MC_PROP_ATTRS | JSPROP_READONLY, mc_currentframe, NULL }, {"_totalframes", -1, MC_PROP_ATTRS | JSPROP_READONLY, mc_totalframes, NULL }, {"_alpha", -1, MC_PROP_ATTRS, mc_alpha_get, mc_alpha_set }, {"_visible", -1, MC_PROP_ATTRS, mc_visible_get, mc_visible_set }, {"_width", -1, MC_PROP_ATTRS, mc_width_get, mc_width_set }, {"_height", -1, MC_PROP_ATTRS, mc_height_get, mc_height_set }, {"_rotation", -1, MC_PROP_ATTRS, mc_rotation_get, mc_rotation_set }, {"_target", -1, MC_PROP_ATTRS, not_reached, not_reached }, {"_framesloaded", -1, MC_PROP_ATTRS | JSPROP_READONLY, mc_framesloaded, NULL }, {"_name", -1, MC_PROP_ATTRS, mc_name_get, mc_name_set }, {"_droptarget", -1, MC_PROP_ATTRS, not_reached, not_reached }, {"_url", -1, MC_PROP_ATTRS, not_reached, not_reached }, {"_highquality", -1, MC_PROP_ATTRS, not_reached, not_reached }, {"_focusrect", -1, MC_PROP_ATTRS, not_reached, not_reached }, {"_soundbuftime", -1, MC_PROP_ATTRS, not_reached, not_reached }, {"_quality", -1, MC_PROP_ATTRS, not_reached, not_reached }, {"_xmouse", -1, MC_PROP_ATTRS | JSPROP_READONLY, mc_xmouse_get, NULL }, {"_ymouse", -1, MC_PROP_ATTRS | JSPROP_READONLY, mc_ymouse_get, NULL }, {"_parent", -1, MC_PROP_ATTRS | JSPROP_READONLY, mc_parent, NULL }, {"_root", -1, MC_PROP_ATTRS | JSPROP_READONLY, mc_root, NULL }, {NULL}};static JSBoolswfdec_js_movieclip_new (JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ return JS_TRUE;}/** * swfdec_js_add_movieclip_class: * @player: a @SwfdecPlayer * * Adds the movieclip class to the JS Context of @player. **/voidswfdec_js_add_movieclip_class (SwfdecPlayer *player){ JS_InitClass (player->jscx, player->jsobj, NULL, &movieclip_class, swfdec_js_movieclip_new, 0, NULL, movieclip_methods, NULL, NULL);}static jsvalswfdec_js_movie_lookup_class (SwfdecSpriteMovie *movie){ /* FIXME: write tests on how the lookup movie => name => registered class is performed */ SwfdecRootMovie *root; const char *name; /* happens with root movies only */ if (movie->sprite == NULL) return JSVAL_NULL; root = SWFDEC_ROOT_MOVIE (SWFDEC_MOVIE (movie)->root); name = swfdec_root_movie_get_export_name (root, SWFDEC_CHARACTER (movie->sprite)); if (name == NULL) return JSVAL_NULL; SWFDEC_LOG ("found name %s for movie %s", name, SWFDEC_MOVIE (movie)->name); return swfdec_player_get_export_class (root->player, name);}voidswfdec_js_movie_create_jsobject (SwfdecMovie *movie){ SwfdecScriptable *script; jsval fun = JSVAL_NULL; g_return_if_fail (SWFDEC_IS_MOVIE (movie)); script = SWFDEC_SCRIPTABLE (movie); g_return_if_fail (script->jscx != NULL); g_return_if_fail (script->jsobj == NULL); if (SWFDEC_IS_SPRITE_MOVIE (movie) && (fun = swfdec_js_movie_lookup_class (SWFDEC_SPRITE_MOVIE (movie))) != JSVAL_NULL) { swfdec_js_construct_object (script->jscx, &movieclip_class, fun, &script->jsobj); } else { SwfdecScriptableClass *klass = SWFDEC_SCRIPTABLE_GET_CLASS (movie); script->jsobj = JS_NewObject (script->jscx, klass->jsclass, NULL, NULL); } if (!script->jsobj || !JS_AddRoot (script->jscx, &script->jsobj)) { script->jsobj = NULL; SWFDEC_ERROR ("failed to construct JSObject for %s %p", G_OBJECT_TYPE_NAME (movie), movie); return; } g_object_ref (script); JS_SetPrivate (script->jscx, script->jsobj, script); if (!JS_DefineProperties (script->jscx, script->jsobj, movieclip_props)) { SWFDEC_ERROR ("failed to define properties for %s %p", G_OBJECT_TYPE_NAME (movie), movie); return; } swfdec_js_movie_add_property (movie);}/** * swfdec_movie_run_init: * @movie: a #SwfdecMovie * * Runs onClipEvent(initialize) on the given @movie. */voidswfdec_movie_run_init (SwfdecMovie *movie){ SwfdecPlayer *player; g_return_if_fail (SWFDEC_IS_MOVIE (movie)); g_return_if_fail (SWFDEC_SCRIPTABLE (movie)->jsobj != NULL); player = SWFDEC_ROOT_MOVIE (movie->root)->player; g_queue_remove (player->init_queue, movie); swfdec_movie_execute_script (movie, SWFDEC_EVENT_INITIALIZE);}/** * swfdec_movie_run_construct: * @movie: a #SwfdecMovie * * Runs the constructors for @movie. This is (in the given order) * onClipEvent(construct), movie.onConstruct and the constructor registered * via Object.registerClass. **/voidswfdec_movie_run_construct (SwfdecMovie *movie){ SwfdecPlayer *player; jsval fun; g_return_if_fail (SWFDEC_IS_MOVIE (movie)); g_return_if_fail (SWFDEC_SCRIPTABLE (movie)->jsobj != NULL); player = SWFDEC_ROOT_MOVIE (movie->root)->player; g_queue_remove (player->construct_queue, movie); swfdec_movie_execute_script (movie, SWFDEC_EVENT_CONSTRUCT); /* FIXME: need a check if the constructor can be unregistered after construction */ if (SWFDEC_IS_SPRITE_MOVIE (movie) && (fun = swfdec_js_movie_lookup_class (SWFDEC_SPRITE_MOVIE (movie))) != JSVAL_NULL) { SwfdecScriptable *script = SWFDEC_SCRIPTABLE (movie); SWFDEC_LOG ("Executing constructor for %s %p", G_OBJECT_TYPE_NAME (movie), movie); if (!js_InternalCall (script->jscx, script->jsobj, fun, 0, NULL, &fun)) { SWFDEC_ERROR ("constructor execution failed"); } }}voidswfdec_js_movie_remove_jsobject (SwfdecMovie *movie){ SwfdecScriptable *script; g_return_if_fail (SWFDEC_IS_MOVIE (movie)); script = SWFDEC_SCRIPTABLE (movie); g_return_if_fail (script->jscx != NULL); if (script->jsobj == NULL) return; swfdec_js_movie_remove_property (movie); JS_RemoveRoot (script->jscx, &script->jsobj);}gbooleanswfdec_js_is_movieclip (JSContext *cx, JSObject *object){ g_return_val_if_fail (cx != NULL, FALSE); g_return_val_if_fail (object != NULL, FALSE); return JS_InstanceOf (cx, object, &movieclip_class, NULL);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -