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

📄 movieclip_class.c

📁 flirt 一款纯c的flash解码程序。
💻 C
📖 第 1 页 / 共 3 页
字号:
/*
 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 + -