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