www.pudn.com > Flirt.zip > color_class.c


/* 
 Flirt, an SWF rendering library 
 Copyright (c) 2004-2006 Dave Hayden  
 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  
 
#include "color_class.h" 
#include "movieclip_class.h" 
#include "object_class.h" 
#include "../function.h" 
 
ddActionClass* ddActionColorClass = NULL; 
 
static void 
Color_destroy(ddActionObject* object) 
{ 
	ddActionColor* color = (ddActionColor*)object; 
	 
	ddActionObject_release((ddActionObject*)color->clip); 
	color->clip = NULL; 
} 
 
 
static ddActionValue 
Color_constructor(ddActionObject* object, ddActionContext* context, int nargs) 
{ 
	ddActionColor* color; 
	ddActionValue val = ddActionStack_pop(&context->stack); 
	ddActionObject* obj; 
	 
	if ( val.type == VALUE_STRING ) 
	{ 
		char* name = ddActionValue_getStringValue_release(context, val); 
		val = ddActionObject_getProperty(context, context->object, name); 
	} 
 
	obj = ddActionValue_getObjectValue(val); 
	ddActionValue_release(val); 
	 
	if ( obj == NULL || !ddActionObject_isKindOfClass(obj, ddActionMovieClipClass) ) 
		return ddNullValue; 
 
	color = dd_malloc(sizeof(ddActionColor)); 
 
	ddActionObject_init((ddActionObject*)color); 
	ddActionObject_setClass((ddActionObject*)color, ddActionColorClass); 
	 
	color->clip = (ddActionMovieClip*)ddActionObject_retain(obj); 
 
	return dd_newActionValue_object((ddActionObject*)color); 
} 
 
 
static ddActionValue 
Color_getRGB(ddActionObject* object, ddActionContext* context, int nargs) 
{ 
	ddActionColor* color = (ddActionColor*)object; 
	ddDrawClip* drawclip; 
	ddCXform xform; 
	 
	if ( !ddActionObject_isKindOfClass(object, ddActionColorClass) ) 
		return ddUndefValue; 
	 
	drawclip = color->clip->movieClip; 
 
	if ( drawclip == NULL ) 
		return ddUndefValue; 
	 
	xform = ddDrawable_getCXform((ddDrawable*)drawclip); 
	 
	/* XXX - doesn't deal with negative values properly! */ 
 
	return dd_newActionValue_int((xform.rAdd << 16) | (xform.gAdd << 8) | xform.bAdd); 
} 
 
 
static ddActionValue 
Color_setRGB(ddActionObject* object, ddActionContext* context, int nargs) 
{ 
	ddActionColor* color = (ddActionColor*)object; 
	ddDrawClip* drawclip; 
	ddCXform xform = { 0, 0, 0, 0, 0, 0, 0, 0 }; 
	 
	ddActionValue val; 
	int num; 
	 
	if ( !ddActionObject_isKindOfClass(object, ddActionColorClass) ) 
		return ddUndefValue; 
 
	drawclip = color->clip->movieClip; 
 
	if ( drawclip == NULL ) 
		return ddNullValue; 
	 
	val = ddActionStack_pop(&context->stack); 
	num = ddActionValue_getIntValue(val); 
	ddActionValue_release(val); 
	 
	xform.aMult = 0x100; 
	xform.rAdd = (num & 0xff0000) >> 16; 
	xform.gAdd = (num & 0x00ff00) >> 8; 
	xform.bAdd = (num & 0x0000ff); 
 
	ddDrawable_setCXform((ddDrawable*)drawclip, xform, DD_FALSE); 
 
	return ddNullValue; 
} 
 
 
static ddActionValue 
Color_getTransform(ddActionObject* object, ddActionContext* context, int nargs) 
{ 
	ddActionColor* color = (ddActionColor*)object; 
	ddDrawClip* drawclip; 
	ddCXform xform; 
	ddActionObject* obj; 
	 
	if ( !ddActionObject_isKindOfClass(object, ddActionColorClass) ) 
		return ddUndefValue; 
	 
	drawclip = color->clip->movieClip; 
 
	if ( drawclip == NULL ) 
		return ddUndefValue; 
		 
	xform = ddDrawable_getCXform((ddDrawable*)drawclip); 
	obj = dd_newActionObject(); 
	 
	ddActionHash_addValue(obj->properties, strdup("aa"), dd_newActionValue_int(100 * xform.aMult / 256)); 
	ddActionHash_addValue(obj->properties, strdup("ra"), dd_newActionValue_int(100 * xform.rMult / 256)); 
	ddActionHash_addValue(obj->properties, strdup("ga"), dd_newActionValue_int(100 * xform.gMult / 256)); 
	ddActionHash_addValue(obj->properties, strdup("ba"), dd_newActionValue_int(100 * xform.bMult / 256)); 
	ddActionHash_addValue(obj->properties, strdup("ab"), dd_newActionValue_int(100 * xform.aAdd / 256)); 
	ddActionHash_addValue(obj->properties, strdup("rb"), dd_newActionValue_int(100 * xform.rAdd / 256)); 
	ddActionHash_addValue(obj->properties, strdup("gb"), dd_newActionValue_int(100 * xform.gAdd / 256)); 
	ddActionHash_addValue(obj->properties, strdup("bb"), dd_newActionValue_int(100 * xform.bAdd / 256)); 
 
	return dd_newActionValue_object(obj); 
} 
 
static ddActionValue 
Color_setTransform(ddActionObject* object, ddActionContext* context, int nargs) 
{ 
	ddActionColor* color = (ddActionColor*)object; 
 
	ddCXform xform; 
	ddActionValue val; 
	ddActionObject* obj; 
 
	if ( !ddActionObject_isKindOfClass(object, ddActionColorClass) ) 
		return ddUndefValue; 
	 
	xform = ddDrawable_getCXform((ddDrawable*)color->clip->movieClip); 
	val = ddActionStack_pop(&context->stack); 
	obj = ddActionValue_getObjectValue(val); 
	 
	if ( obj == NULL ) 
		return ddNullValue; 
	 
	xform.aMult = 256 * ddActionValue_getIntValue(ddActionHash_findValue(obj->properties, "aa")) / 100; 
	xform.rMult = 256 * ddActionValue_getIntValue(ddActionHash_findValue(obj->properties, "ra")) / 100; 
	xform.gMult = 256 * ddActionValue_getIntValue(ddActionHash_findValue(obj->properties, "ga")) / 100; 
	xform.bMult = 256 * ddActionValue_getIntValue(ddActionHash_findValue(obj->properties, "ba")) / 100; 
	xform.aAdd = 256 * ddActionValue_getIntValue(ddActionHash_findValue(obj->properties, "ab")) / 100; 
	xform.rAdd = 256 * ddActionValue_getIntValue(ddActionHash_findValue(obj->properties, "rb")) / 100; 
	xform.gAdd = 256 * ddActionValue_getIntValue(ddActionHash_findValue(obj->properties, "gb")) / 100; 
	xform.bAdd = 256 * ddActionValue_getIntValue(ddActionHash_findValue(obj->properties, "bb")) / 100; 
 
	ddDrawable_setCXform((ddDrawable*)color->clip->movieClip, xform, DD_FALSE); 
 
	return ddNullValue; 
} 
 
 
ddActionFunction* 
dd_initColorClass() 
{ 
	ddActionFunction* ctor = dd_newActionNativeFunction(Color_constructor, 1); 
	ddActionObject* classObject; 
	 
	ddActionColorClass = dd_newActionClass(); 
	classObject = (ddActionObject*)ddActionColorClass; 
 
	ddActionObject_addNativeMethod(classObject, strdup("getRGB"), Color_getRGB, 0); 
	ddActionObject_addNativeMethod(classObject, strdup("setRGB"), Color_setRGB, 1); 
	ddActionObject_addNativeMethod(classObject, strdup("getTransform"), Color_getTransform, 0); 
	ddActionObject_addNativeMethod(classObject, strdup("setTransform"), Color_setTransform, 1); 
 
	ddActionColorClass->destroy = Color_destroy; 
 
	ddActionFunction_setPrototype(ctor, classObject); 
 
	return ctor; 
}