www.pudn.com > C++_Flash.rar > SWFColorTransform.cpp


// SWFColorTransform.cpp: implementation of the CSWFColorTransform class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "SWFColorTransform.h" 
 
 
CSWFColorTransform::CSWFColorTransform(SWF_COLOR_TRANSFORM* colorTransform) 
{ 
	// Init members 
	m_CXForm.Flags = 0; 
	if (colorTransform != NULL) 
	{ 
		m_CXForm.RedMultTerm = (USHORT)(colorTransform->RedMultTerm * 256); 
		m_CXForm.GreenMultTerm = (USHORT)(colorTransform->GreenMultTerm * 256); 
		m_CXForm.BlueMultTerm = (USHORT)(colorTransform->BlueMultTerm * 256); 
		m_CXForm.AlphaMultTerm = (USHORT)(colorTransform->AlphaMultTerm * 256); 
		m_CXForm.RedAddTerm = (USHORT)(colorTransform->RedAddTerm); 
		m_CXForm.GreenAddTerm = (USHORT)(colorTransform->GreenAddTerm); 
		m_CXForm.BlueAddTerm = (USHORT)(colorTransform->BlueAddTerm); 
		m_CXForm.AlphaAddTerm = (USHORT)(colorTransform->AlphaAddTerm); 
	} 
	else 
	{ 
		m_CXForm.RedMultTerm = m_CXForm.GreenMultTerm = m_CXForm.BlueMultTerm = m_CXForm.AlphaMultTerm = 0; 
		m_CXForm.RedAddTerm = m_CXForm.GreenAddTerm = m_CXForm.BlueAddTerm = m_CXForm.AlphaAddTerm = 0; 
	} 
	m_SWFStream = NULL; 
	m_SWFStreamLength = 0; 
} 
 
CSWFColorTransform::~CSWFColorTransform() 
{ 
	if (m_SWFStream != NULL) 
	{ 
		delete m_SWFStream; 
		m_SWFStream = NULL; 
	} 
} 
 
UCHAR* CSWFColorTransform::BuildSWFStream() 
{ 
	int redAdd = abs((int)((short)abs(m_CXForm.RedAddTerm))); 
	int greenAdd = abs((int)((short)abs(m_CXForm.GreenAddTerm))); 
	int blueAdd = abs((int)((short)abs(m_CXForm.BlueAddTerm))); 
	int alphaAdd = abs((int)((short)abs(m_CXForm.AlphaAddTerm))); 
	int maxMultValue = max(max(abs(m_CXForm.RedMultTerm >> 8), abs(m_CXForm.GreenMultTerm >> 8)), max(abs(m_CXForm.BlueMultTerm >> 8), abs(m_CXForm.AlphaMultTerm >> 8))); 
	int maxAddValue = max(max(redAdd >> 8, greenAdd >> 8), max(blueAdd >> 8, alphaAdd >> 8)); 
	int maxValue = max(maxMultValue, maxAddValue); 
	UCHAR bitsNeaded = 0; 
	int currentByte=0, bitOffset=0, i; 
 
	// Calculate bits neaded 
	while (pow(2, bitsNeaded) < maxValue) 
		bitsNeaded++; 
	bitsNeaded += 10; 
 
	m_CXForm.Flags = (0x03 << 4) | bitsNeaded; 
 
	// Create byte field 
	m_SWFStreamLength = (8*bitsNeaded + 6) / 8; 
	if ((8*bitsNeaded + 6) % 8 != 0) 
		m_SWFStreamLength++; 
	if (m_SWFStream != NULL) 
		delete m_SWFStream; 
	m_SWFStream = new UCHAR[m_SWFStreamLength]; 
	memset(m_SWFStream, 0, m_SWFStreamLength); 
 
	// Set bits neaded 
	m_SWFStream[currentByte] = (m_CXForm.Flags << 2); 
	bitOffset = 6; 
 
	// Write RedMultTerm bit-field 
	currentByte = bitOffset / 8; 
	USHORT redMultTerm = m_CXForm.RedMultTerm << (16 - bitsNeaded); 
	USHORT maskRedMultTerm = 0x8000; 
	for (i=0; i> (15-i)) << ((currentByte+1)*8-bitOffset-1)); 
 
		bitOffset++; 
		if ((bitOffset != 0) && (bitOffset % 8) == 0) 
			currentByte++; 
 
		maskRedMultTerm = maskRedMultTerm >> 1; 
	} 
 
	// Write GreenMultTerm bit-field 
	currentByte = bitOffset / 8; 
	USHORT greenMultTerm = m_CXForm.GreenMultTerm << (16 - bitsNeaded); 
	USHORT maskGreenMultTerm = 0x8000; 
	for (i=0; i> (15-i)) << ((currentByte+1)*8-bitOffset-1)); 
 
		bitOffset++; 
		if ((bitOffset != 0) && (bitOffset % 8) == 0) 
			currentByte++; 
 
		maskGreenMultTerm = maskGreenMultTerm >> 1; 
	} 
 
	// Write BlueMultTerm bit-field 
	currentByte = bitOffset / 8; 
	USHORT blueMultTerm = m_CXForm.BlueMultTerm << (16 - bitsNeaded); 
	USHORT maskBlueMultTerm = 0x8000; 
	for (i=0; i> (15-i)) << ((currentByte+1)*8-bitOffset-1)); 
 
		bitOffset++; 
		if ((bitOffset != 0) && (bitOffset % 8) == 0) 
			currentByte++; 
 
		maskBlueMultTerm = maskBlueMultTerm >> 1; 
	} 
 
	// Write AlphaMultTerm bit-field 
	currentByte = bitOffset / 8; 
	USHORT alphaMultTerm = m_CXForm.AlphaMultTerm << (16 - bitsNeaded); 
	USHORT maskAlphaMultTerm = 0x8000; 
	for (i=0; i> (15-i)) << ((currentByte+1)*8-bitOffset-1)); 
 
		bitOffset++; 
		if ((bitOffset != 0) && (bitOffset % 8) == 0) 
			currentByte++; 
 
		maskAlphaMultTerm = maskAlphaMultTerm >> 1; 
	} 
 
	// Write RedAddTerm bit-field 
	currentByte = bitOffset / 8; 
	USHORT redAddTerm = m_CXForm.RedAddTerm << (16 - bitsNeaded); 
	USHORT maskRedAddTerm = 0x8000; 
	for (i=0; i> (15-i)) << ((currentByte+1)*8-bitOffset-1)); 
 
		bitOffset++; 
		if ((bitOffset != 0) && (bitOffset % 8) == 0) 
			currentByte++; 
 
		maskRedAddTerm = maskRedAddTerm >> 1; 
	} 
 
	// Write GreenAddTerm bit-field 
	currentByte = bitOffset / 8; 
	USHORT greenAddTerm = m_CXForm.GreenAddTerm << (16 - bitsNeaded); 
	USHORT maskGreenAddTerm = 0x8000; 
	for (i=0; i> (15-i)) << ((currentByte+1)*8-bitOffset-1)); 
 
		bitOffset++; 
		if ((bitOffset != 0) && (bitOffset % 8) == 0) 
			currentByte++; 
 
		maskGreenAddTerm = maskGreenAddTerm >> 1; 
	} 
 
	// Write BlueAddTerm bit-field 
	currentByte = bitOffset / 8; 
	USHORT blueAddTerm = m_CXForm.BlueAddTerm << (16 - bitsNeaded); 
	USHORT maskBlueAddTerm = 0x8000; 
	for (i=0; i> (15-i)) << ((currentByte+1)*8-bitOffset-1)); 
 
		bitOffset++; 
		if ((bitOffset != 0) && (bitOffset % 8) == 0) 
			currentByte++; 
 
		maskBlueAddTerm = maskBlueAddTerm >> 1; 
	} 
 
	// Write AlphaAddTerm bit-field 
	currentByte = bitOffset / 8; 
	USHORT alphaAddTerm = m_CXForm.AlphaAddTerm << (16 - bitsNeaded); 
	USHORT maskAlphaAddTerm = 0x8000; 
	for (i=0; i> (15-i)) << ((currentByte+1)*8-bitOffset-1)); 
 
		bitOffset++; 
		if ((bitOffset != 0) && (bitOffset % 8) == 0) 
			currentByte++; 
 
		maskAlphaAddTerm = maskAlphaAddTerm >> 1; 
	} 
 
	return m_SWFStream; 
} 
 
int CSWFColorTransform::GetSWFStreamLength() 
{ 
	return m_SWFStreamLength; 
}