www.pudn.com > FlashFormat.rar > FDTBitmaps.cpp


// Copyright © 1999 Middlesoft, Inc. All rights reserved.
// First Created By Lee Thomason.
// First Created On 09/08/1999.
// Last Modified On 11/09/1999.

/****************************************************************************************

				File Summary: FDTBitmaps.cpp

  This source file contains the definition for all low-level bitmap-related functions,
  grouped by classes, which are all derived from class FDT, and related to bitmaps:


		Class						Member Function

	FDTDefineBits				FDTDefineBits(U32, U8*);
								U16 ID(void);
								void WriteToSWFStream(FSWFStream*);

	FDTDefineBitsJPEG2			FDTDefineBitsJPEG2(U8*, U32);
								U16 FDTDefineBitsJPEG2::ID(void);
								void WriteToSWFStream(FSWFStream*);

	FDTDefineBitsJPEG3			FDTDefineBitsJPEG3(U8*, U32, U8*, U32);
								U16 FDTDefineBitsJPEG3::ID(void);
								void WriteToSWFStream(FSWFStream*);

	FDTDefineBitsLosslessBase	FDTDefineBitsLosslessBase(U8, U8, U16, int, 
														  void*, void*, bool);
								void WriteToSWFStream(FSWFStream*);

	FDTDefineBitsLossless		FDTDefineBitsLossless(U8, U16, U16, int, FRGB*, void*);

	FDTDefineBitsLossless2		FDTDefineBitsLossless(U8, U16, U16, int, FRGBA*, void*);

	FDTJPEGTables				FDTJPEGTables(U32, U8*);
								void WriteToSWFStream(FSWFStream*);



****************************************************************************************/

#pragma warning (disable:4786)	

#include "FObj.h"
#include "FDTBitmaps.h"
#include "./zlib-1.1.3/zlib.h"
#include "FSWFStream.h"


//////////////////////////////////////////////////////////////////////////////////////
//  --------  FDTDefineBits ----------------------------------------------------------

FDTDefineBits::FDTDefineBits(U32 _size, U8* _image){
	size = _size;
	image = _image;
	characterID = FObjCollection::Increment();
}



U16 FDTDefineBits::ID(void){
	return characterID;
}


void FDTDefineBits::WriteToSWFStream(FSWFStream* _SWFStream){
	FSWFStream body;

	body.WriteWord((U32)characterID);
	body.WriteLargeData(image, size);

	_SWFStream->AppendTag( stagDefineBits, body.Size(), &body );	
}


//////////////////////////////////////////////////////////////////////////////////////
//  --------  FDTDefineBitsJPEG2 -----------------------------------------------------

FDTDefineBitsJPEG2::FDTDefineBitsJPEG2(U8* _JPEGStream, U32 _JPEGSize){
	
	JPEGStream = _JPEGStream;
	JPEGSize = _JPEGSize;
	characterID = FObjCollection::Increment();
}



U16 FDTDefineBitsJPEG2::ID(void){
	
	return characterID;

}



void FDTDefineBitsJPEG2::WriteToSWFStream(FSWFStream* _SWFStream){
	
	FSWFStream body;
	
	body.WriteWord((U32)characterID);

	// 2 bytes indicating end of encoding stream
	// no encoding data is written here because it is an empty stream
	body.WriteByte(0xff);
	body.WriteByte(0xd9);
	
	//2 bytes indicating beginning of JPEG stream
	body.WriteByte(0xff);
	body.WriteByte(0xd8);
	
	//the entire JPEG stream
	body.WriteLargeData(JPEGStream, JPEGSize);
	
	//2 bytes indicating end of JPEG stream
	body.WriteByte(0xff);
	body.WriteByte(0xd9);
	
	_SWFStream->AppendTag( stagDefineBitsJPEG2, body.Size(), &body );	
}


//////////////////////////////////////////////////////////////////////////////////////
//  --------  FDTDefineBitsJPEG3 -----------------------------------------------------

FDTDefineBitsJPEG3::FDTDefineBitsJPEG3(U8* _JPEGStream, U32 _JPEGSize,
								 U8* _alphaStream, U32 _alphaSize){
	JPEGStream = _JPEGStream;
	JPEGSize = _JPEGSize;
	alphaStream = _alphaStream;
	alphaSize = _alphaSize;
	characterID = FObjCollection::Increment();
}



U16 FDTDefineBitsJPEG3::ID(void){
	return characterID;
}



void FDTDefineBitsJPEG3::WriteToSWFStream(FSWFStream* _SWFStream){
	
	FSWFStream body;
	
	body.WriteWord( (U32)characterID);
	
	//offset includes the 2 end of stream tags and the 1 beginning stream tag
	U32 offset = JPEGSize+6;
	body.WriteDWord(offset);

	// 2 bytes indicating end of encoding stream
	// no encoding data is written here
	// an empty stream is written
	body.WriteByte(0xff);
	body.WriteByte(0xd9);
	
	//2 bytes indicating begining of JPEG stream
	body.WriteByte(0xff);
	body.WriteByte(0xd8);
	
	//the entire JPEG stream
	body.WriteLargeData(JPEGStream, JPEGSize);
	
	//2 bytes indicating end of JPEG steam
	body.WriteByte(0xff);
	body.WriteByte(0xd9);
	
	// alpha data
	body.WriteLargeData(alphaStream, alphaSize);
	
	_SWFStream->AppendTag( stagDefineBitsJPEG3, body.Size(), &body );	
}



//////////////////////////////////////////////////////////////////////////////////////
//  --------  FDTDefineBitsLosslessBase ----------------------------------------------

FDTDefineBitsLosslessBase::FDTDefineBitsLosslessBase(	U8 _format,
														U16 _width,
														U16 _height, 
														int _colorTableCount,
														const void* _colorTableData,
														const void* _imageData,
														bool _alpha
													 )
{
	format = _format;
	width = _width;
	height = _height;
	colorTableCount = _colorTableCount;
	alpha = _alpha;
	characterID = FObjCollection::Increment();

	// copy the memory to another block to be compressed
	int rgbBytes = ( alpha ) ? 4 : 3;
	int tableBytes = colorTableCount * rgbBytes;
	
	int bits = ( 1 << format );		// how many bits does this format have?

	int imageBytes = ( width * height * bits + 7 ) / 8;
	unsigned long  totalBytes = imageBytes + tableBytes;
	
	// copy the image and the table to a new buffer
	unsigned char* raw = new unsigned char[totalBytes];
	if ( tableBytes )
	{
		memcpy( raw, _colorTableData, tableBytes );
	}
	memcpy( &raw[tableBytes], _imageData, imageBytes );

	// a compressed buffer - the allocated size is based on a zlib formula
	compressedSize = totalBytes + totalBytes / 100 + 12;
	compressed = new unsigned char[ compressedSize ];

	// now compress the raw data - note this will change compressedSize
	int ret = compress2( compressed, &compressedSize, raw, totalBytes, Z_BEST_COMPRESSION );
	FLASHASSERT( ret == Z_OK );

	delete [] raw;
}	

FDTDefineBitsLosslessBase::~FDTDefineBitsLosslessBase()
{
	delete [] compressed;
}

void FDTDefineBitsLosslessBase::WriteToSWFStream(FSWFStream* _SWFStream)
{
	FSWFStream body;
	
	body.WriteWord((U32)characterID);
	body.WriteByte((U32)format);
	body.WriteWord((U32)width);
	body.WriteWord((U32)height);
	
	if ( format <= bm8Bit )
	{
		body.WriteByte((U32)(colorTableCount - 1) );
	}

	body.WriteLargeData(compressed, compressedSize);

	if ( alpha )
		_SWFStream->AppendTag( stagDefineBitsLossless2, body.Size(), &body );	
	else
		_SWFStream->AppendTag( stagDefineBitsLossless, body.Size(), &body );	
}


//////////////////////////////////////////////////////////////////////////////////////
//  --------  FDTDefineBitsLossless --------------------------------------------------

FDTDefineBitsLossless::FDTDefineBitsLossless(	U8 _format,
												U16 _width,
												U16 _height,
												int _colorTableCount,
												const FRGB* _colorTableData,
												const void* _imageData
											 ) 
	: FDTDefineBitsLosslessBase( _format, _width, _height, _colorTableCount, _colorTableData, _imageData, false )
{}


//////////////////////////////////////////////////////////////////////////////////////
//  --------  FDTDefineBitsLossless2 -------------------------------------------------

FDTDefineBitsLossless2::FDTDefineBitsLossless2(	U8 _format,
												U16 _width,
												U16 _height,
												int _colorTableCount,
												const FRGBA* _colorTableData,
												const void* _imageData
											 ) 
	: FDTDefineBitsLosslessBase( _format, _width, _height, _colorTableCount, _colorTableData, _imageData, true )
{}


//////////////////////////////////////////////////////////////////////////////////////
//  --------  FDTJPEGTables ----------------------------------------------------------

//	Constructor.  Currently takes in a U32 indicating the size of the data in bytes, and
//	a pointer to the beginning of the stream of data.
FDTJPEGTables::FDTJPEGTables(U32 encodingDataSize, U8* encodingData){
	this->encodingData = encodingData;
	this->encodingDataSize = encodingDataSize;
}


//	Writes to the given _SWFStream.

void FDTJPEGTables::WriteToSWFStream(FSWFStream *_SWFStream){
	
	FSWFStream body;
	body.WriteLargeData(encodingData, encodingDataSize);
	
	_SWFStream->AppendTag( stagJPEGTables, body.Size(), &body );	
}