www.pudn.com > C++_Flash.rar > SWFRectangle.cpp
// SWFRectangle.cpp: implementation of the CSWFRectangle class.
//
//////////////////////////////////////////////////////////////////////
#include "SWFRectangle.h"
CSWFRectangle::CSWFRectangle()
{
// Init members
m_SWFRectangle.Nbits = 0;
m_SWFRectangle.Xmin = m_SWFRectangle.Ymin = 0;
m_SWFRectangle.Xmax = m_SWFRectangle.Ymax = 100;
m_SWFStream = NULL;
m_SWFStreamLength = 0;
}
CSWFRectangle::~CSWFRectangle()
{
if (m_SWFStream != NULL)
{
delete m_SWFStream;
m_SWFStream = NULL;
}
}
void CSWFRectangle::SetRectangle(RECT_F rectangle)
{
// Copy rectangle
memcpy(&m_Rectangle, &rectangle, sizeof(RECT_F));
m_SWFRectangle.Xmin = (SHORT)(rectangle.left * 20);
m_SWFRectangle.Xmax = (SHORT)(rectangle.right * 20);
m_SWFRectangle.Ymin = (SHORT)(rectangle.top * 20);
m_SWFRectangle.Ymax = (SHORT)(rectangle.bottom * 20);
}
void CSWFRectangle::SetRectangle(POINT_F location, SIZE_F size)
{
// Copy rectangle
RECT_F rectangle = {location.x, location.y, (location.x+size.cx), (location.y+size.cy)};
memcpy(&m_Rectangle, &rectangle, sizeof(RECT_F));
m_SWFRectangle.Xmin = (SHORT)(location.x * 20);
m_SWFRectangle.Ymin = (SHORT)(location.y * 20);
m_SWFRectangle.Xmax = (SHORT)((location.x + size.cx) * 20);
m_SWFRectangle.Ymax = (SHORT)((location.y + size.cy) * 20);
}
void CSWFRectangle::GetRectangle(RECT_F& rectangle)
{
// Copy rectangle
memcpy(&rectangle, &m_Rectangle, sizeof(RECT_F));
}
UCHAR* CSWFRectangle::BuildSWFStream()
{
int maxValue = max(max(m_SWFRectangle.Xmin, m_SWFRectangle.Xmax), max(m_SWFRectangle.Ymin, m_SWFRectangle.Ymax));
UCHAR bitsNeaded = 0;
int byteIndex=0, bitOffset=0, i;
USHORT xMin, xMax, yMin, yMax, mask, nextWord;
// Calculate bits neaded
while (pow(2, bitsNeaded) < maxValue)
bitsNeaded++;
bitsNeaded++;
m_SWFRectangle.Nbits = bitsNeaded;
xMin = m_SWFRectangle.Xmin << (16-bitsNeaded);
xMax = m_SWFRectangle.Xmax << (16-bitsNeaded);
yMin = m_SWFRectangle.Ymin << (16-bitsNeaded);
yMax = m_SWFRectangle.Ymax << (16-bitsNeaded);
// Create byte field
m_SWFStreamLength = (4*bitsNeaded + 5) / 8;
if ((4*bitsNeaded + 5) % 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[byteIndex] = (bitsNeaded << 3);
bitOffset = 5;
// Set xMin
mask = 0x8000;
for (i=0; i> (15-i);
nextWord = nextWord << ((byteIndex+1)*8-bitOffset-1);
m_SWFStream[byteIndex] |= LOBYTE(nextWord);
bitOffset++;
if ((bitOffset % 8) == 0)
byteIndex++;
mask = mask >> 1;
}
// Set xMax
mask = 0x8000;
for (i=0; i> (15-i);
nextWord = nextWord << ((byteIndex+1)*8-bitOffset-1);
m_SWFStream[byteIndex] |= LOBYTE(nextWord);
bitOffset++;
if ((bitOffset % 8) == 0)
byteIndex++;
mask = mask >> 1;
}
// Set yMin
mask = 0x8000;
for (i=0; i> (15-i);
nextWord = nextWord << ((byteIndex+1)*8-bitOffset-1);
m_SWFStream[byteIndex] |= LOBYTE(nextWord);
bitOffset++;
if ((bitOffset % 8) == 0)
byteIndex++;
mask = mask >> 1;
}
// Set yMax
mask = 0x8000;
for (i=0; i> (15-i);
nextWord = nextWord << ((byteIndex+1)*8-bitOffset-1);
m_SWFStream[byteIndex] |= LOBYTE(nextWord);
bitOffset++;
if ((bitOffset % 8) == 0)
byteIndex++;
mask = mask >> 1;
}
return m_SWFStream;
}
int CSWFRectangle::GetSWFStreamLength()
{
return m_SWFStreamLength;
}