⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 swfdec_js_movie.c

📁 Swfdec still is development software, but has also followed a rigid no-crashes-allowed policy. I b
💻 C
📖 第 1 页 / 共 3 页
字号:
  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 + -