📄 movieclip_class.c
字号:
/*
Flirt, an SWF rendering library
Copyright (c) 2004-2006 Dave Hayden <dave@opaque.net>
All rights reserved.
http://www.opaque.net/flirt/
This code is distributed under the two-clause BSD license.
Read the LICENSE file or visit the URL above for details
*/
#include <math.h>
#include <string.h>
#include "movieclip_class.h"
#include "object_class.h"
#include "../actiontypes.h"
#include "../function.h"
#include "../../render/rect.h"
ddActionClass* ddActionMovieClipClass = NULL;
void dd_destroyActionMovieClip(ddActionObject* object)
{
ddActionMovieClip* clip = (ddActionMovieClip*)object;
if ( clip->name != NULL )
dd_free(clip->name);
}
#ifdef DD_INCLUDE_DEBUGGER
/*
properties:
alpha
currentframe
droptarget
focusrect
framesloaded
height
highquality
name
quality
rotation
soundbuftime
target
totalframes
url
visible
width
x
xmouse
xscale
y
ymouse
yscale
_level0, etc.
*/
#endif
void
ddActionMovieClip_setProperty(ddActionContext* context, ddActionObject* object,
char* name, ddActionValue value)
{
ddActionValue val = ddActionHash_findValue(object->properties, name);
ddDrawClip* clip = ((ddActionMovieClip*)object)->movieClip;
if ( val.type == VALUE_TEXTFIELD )
{
ddDrawTextField_setText(val.data.textFieldValue,
ddActionValue_getStringValue_release(context, value));
dd_free(name);
}
else if ( name != NULL && clip != NULL && clip->clip != NULL && name[0] == '_' )
{
/* XXX- can do faster lookup w/ binary search */
if ( strcasecmp(name + 1, "x") == 0 )
{
ddDrawClip_setX(clip, FIXED_D(ddActionValue_getDoubleValue(value)));
dd_free(name);
}
else if ( strcasecmp(name + 1, "y") == 0 )
{
ddDrawClip_setY(clip, FIXED_D(ddActionValue_getDoubleValue(value)));
dd_free(name);
}
else if ( strcasecmp(name + 1, "rotation") == 0 )
{
ddDrawClip_setRotation(clip, M_PI * ddActionValue_getDoubleValue(value) / 180);
dd_free(name);
}
else if ( strcasecmp(name + 1, "xscale") == 0 )
{
ddDrawClip_setXScale(clip, ddActionValue_getDoubleValue(value) / 100);
dd_free(name);
}
else if ( strcasecmp(name + 1, "yscale") == 0 )
{
ddDrawClip_setYScale(clip, ddActionValue_getDoubleValue(value) / 100);
dd_free(name);
}
else if ( strcasecmp(name + 1, "width") == 0 )
{
ddDrawClip_setWidth(clip, FIXED_D(ddActionValue_getDoubleValue(value)));
dd_free(name);
}
else if ( strcasecmp(name + 1, "height") == 0 )
{
ddDrawClip_setHeight(clip, FIXED_D(ddActionValue_getDoubleValue(value)));
dd_free(name);
}
else if ( strcasecmp(name + 1, "alpha") == 0 )
{
ddDrawClip_setAlpha(clip, ddActionValue_getDoubleValue(value) / 100);
dd_free(name);
}
else if ( strcasecmp(name + 1, "visible") == 0 )
{
ddDrawClip_setVisible(clip, ddActionValue_getBooleanValue(value));
dd_free(name);
}
/* XXX - etc */
else
ddActionObject_setProperty_default(context, object, name, value);
}
else
ddActionObject_setProperty_default(context, object, name, value);
/*
if ( strncasecmp(name, "on", 2) == 0 )
{
ddActionFunction* function = ddActionValue_getFunctionValue(value);
ddAction* action;
if ( function == NULL )
return;
action = ddActionFunction_getBytecodeAction(function);
if ( action == NULL )
return;
if ( strcasecmp(name, "onMouseMove") == 0 )
ddPlayer_registerMouseMoveListener(context->player, clip, action);
else if ( strcasecmp(name, "onMouseUp") == 0 )
ddPlayer_registerMouseUpListener(context->player, clip, action);
else if ( strcasecmp(name, "onMouseDown") == 0 )
ddPlayer_registerMouseDownListener(context->player, clip, action);
else if ( strcasecmp(name, "onKeyUp") == 0 )
ddPlayer_registerKeyUpListener(context->player, clip, action);
else if ( strcasecmp(name, "onKeyDown") == 0 )
ddPlayer_registerMouseMoveListener(context->player, clip, action);
else if ( strcasecmp(name, "onEnterFrame") == 0 )
ddPlayer_registerEnterFrameListener(context->player, clip, action);
}
*/
}
ddActionValue
ddActionMovieClip_getPropertyNum(ddPlayer* player, ddActionMovieClip* clip, ddClipProperty num)
{
ddDrawClip* mc = clip->movieClip;
if ( mc == NULL )
return ddUndefValue;
switch ( num )
{
case PROPERTY_X:
return dd_newActionValue_double(DOUBLE_F(ddDrawClip_getX(mc)));
case PROPERTY_Y:
return dd_newActionValue_double(DOUBLE_F(ddDrawClip_getY(mc)));
case PROPERTY_XSCALE:
return dd_newActionValue_double(100 * ddDrawClip_getXScale(mc));
case PROPERTY_YSCALE:
return dd_newActionValue_double(100 * ddDrawClip_getYScale(mc));
case PROPERTY_CURRENTFRAME:
return dd_newActionValue_int(ddDrawClip_getCurrentFrame(mc));
case PROPERTY_TOTALFRAMES:
return dd_newActionValue_int(ddDrawClip_getTotalFrames(mc));
case PROPERTY_ALPHA:
return dd_newActionValue_double(100 * ddDrawClip_getAlpha(mc));
case PROPERTY_VISIBLE:
return dd_newActionValue_boolean(ddDrawClip_isVisible(mc));
case PROPERTY_WIDTH:
return dd_newActionValue_double(ddDrawClip_getWidth(mc));
case PROPERTY_HEIGHT:
return dd_newActionValue_double(ddDrawClip_getWidth(mc));
case PROPERTY_ROTATION:
return dd_newActionValue_double(180 * ddDrawClip_getRotation(mc) / M_PI);
case PROPERTY_FRAMESLOADED:
return dd_newActionValue_int(ddDrawClip_getFramesLoaded(mc));
case PROPERTY_NAME:
return dd_newActionValue_string(clip->name);
case PROPERTY_XMOUSE:
return dd_newActionValue_double(DOUBLE_F(ddDrawClip_getXMouse(player, mc)));
case PROPERTY_YMOUSE:
return dd_newActionValue_double(DOUBLE_F(ddDrawClip_getYMouse(player, mc)));
case PROPERTY_TARGET:
case PROPERTY_DROPTARGET:
case PROPERTY_URL:
case PROPERTY_HIGHQUALITY:
case PROPERTY_FOCUSRECT:
case PROPERTY_SOUNDBUFTIME:
case PROPERTY_QUALITY:
dd_warn("Unimplemented getProperty type: %i", num);
return ddNullValue;
default:
dd_warn("Unknown getProperty type: %i", num);
return ddNullValue;
}
}
ddActionValue
ddActionMovieClip_getProperty(ddActionContext* context, ddActionObject* object, const char* name)
{
ddActionValue val = ddActionHash_findValue(object->properties, name);
ddDrawClip* mc = ((ddActionMovieClip*)object)->movieClip;
if ( val.type == VALUE_TEXTFIELD )
return dd_newActionValue_string(ddDrawTextField_getText(val.data.textFieldValue));
else if ( val.type != VALUE_UNDEF )
return val;
else if ( name[0] == '.' && name[1] == '.' && name[2] == '\0' )
return dd_newActionValue_object((ddActionObject*)mc->parentClip->actionClip);
if ( name[0] == '_' && context != NULL )
{
ddPlayer* player = context->player;
if ( mc != NULL )
{
if ( strcasecmp(name+1, "x") == 0 )
return dd_newActionValue_double(DOUBLE_F(ddDrawClip_getX(mc)));
else if ( strcasecmp(name+1, "y") == 0 )
return dd_newActionValue_double(DOUBLE_F(ddDrawClip_getY(mc)));
else if ( strcasecmp(name+1, "xscale") == 0 )
return dd_newActionValue_double(100*ddDrawClip_getXScale(mc));
else if ( strcasecmp(name+1, "yscale") == 0 )
return dd_newActionValue_double(100*ddDrawClip_getYScale(mc));
else if ( strcasecmp(name+1, "currentframe") == 0 )
return dd_newActionValue_int(ddDrawClip_getCurrentFrame(mc));
else if ( strcasecmp(name+1, "totalframes") == 0 )
return dd_newActionValue_int(ddDrawClip_getTotalFrames(mc));
else if ( strcasecmp(name+1, "alpha") == 0 )
return dd_newActionValue_double(100 * ddDrawClip_getAlpha(mc));
else if ( strcasecmp(name+1, "visible") == 0 )
return dd_newActionValue_boolean(ddDrawClip_isVisible(mc));
else if ( strcasecmp(name+1, "width") == 0 )
return dd_newActionValue_double(ddDrawClip_getWidth(mc));
else if ( strcasecmp(name+1, "height") == 0 )
return dd_newActionValue_double(ddDrawClip_getWidth(mc));
else if ( strcasecmp(name+1, "rotation") == 0 )
return dd_newActionValue_double(180 * ddDrawClip_getRotation(mc) / M_PI);
else if ( strcasecmp(name+1, "framesloaded") == 0 )
return dd_newActionValue_int(ddDrawClip_getFramesLoaded(mc));
else if ( strcasecmp(name+1, "xmouse") == 0 )
return dd_newActionValue_double(DOUBLE_F(ddDrawClip_getXMouse(player, mc)));
else if ( strcasecmp(name+1, "ymouse") == 0 )
return dd_newActionValue_double(DOUBLE_F(ddDrawClip_getYMouse(player, mc)));
else if ( strcasecmp(name+1, "parent" ) == 0 )
return dd_newActionValue_object((ddActionObject*)mc->parentClip->actionClip);
// XXX - these two (and other levels) should probably be available everywhere
else if ( strcasecmp(name+1, "root") == 0 )
return dd_newActionValue_object((ddActionObject*)mc->actionClip->rootClip);
else if ( strcasecmp(name+1, "level0") == 0 )
return dd_newActionValue_object((ddActionObject*)mc->actionClip->rootClip);
}
else if ( strcasecmp(name+1, "name") == 0 )
return dd_newActionValue_string(((ddActionMovieClip*)object)->name);
// _target: slash-path of this clip
// _url: url of file that created this clip
/* XXX - etc */
else
return ddActionObject_getProperty_default(context, object, name);
}
return ddActionObject_getProperty_default(context, object, name);
}
void
ddActionMovieClip_setPropertyNum(ddActionMovieClip* clip, ddClipProperty num, ddActionValue value)
{
ddDrawClip* mc = clip->movieClip;
if ( mc == NULL )
return;
switch ( num )
{
case PROPERTY_X:
ddDrawClip_setX(mc, FIXED_D(ddActionValue_getDoubleValue(value)));
break;
case PROPERTY_Y:
ddDrawClip_setY(mc, FIXED_D(ddActionValue_getDoubleValue(value)));
break;
case PROPERTY_XSCALE:
ddDrawClip_setXScale(mc, ddActionValue_getDoubleValue(value)/100);
break;
case PROPERTY_YSCALE:
ddDrawClip_setYScale(mc, ddActionValue_getDoubleValue(value)/100);
break;
case PROPERTY_ALPHA:
ddDrawClip_setAlpha(mc, ddActionValue_getDoubleValue(value)/100);
break;
case PROPERTY_VISIBLE:
ddDrawClip_setVisible(mc, ddActionValue_getBooleanValue(value));
break;
case PROPERTY_WIDTH:
ddDrawClip_setWidth(mc, FIXED_D(ddActionValue_getDoubleValue(value)));
break;
case PROPERTY_HEIGHT:
ddDrawClip_setHeight(mc, FIXED_D(ddActionValue_getDoubleValue(value)));
break;
case PROPERTY_ROTATION:
ddDrawClip_setRotation(mc, M_PI * ddActionValue_getDoubleValue(value) / 180);
break;
case PROPERTY_HIGHQUALITY:
dd_warn("Unimplemented setProperty: PROPERTY_HIGHQUALITY");
break;
case PROPERTY_SOUNDBUFTIME:
dd_warn("Unimplemented setProperty: PROPERTY_SOUNDBUFTIME");
break;
case PROPERTY_QUALITY:
dd_warn("Unimplemented setProperty: PROPERTY_QUALITY");
break;
case PROPERTY_CURRENTFRAME:
dd_warn("Unimplemented setProperty: PROPERTY_CURRENTFRAME");
break;
case PROPERTY_FRAMESLOADED:
case PROPERTY_NAME:
case PROPERTY_TOTALFRAMES:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -