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;
}