// 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*);
****************************************************************************************/
#ifdef WIN32
#pragma warning(disable : 4786)
#endif
#include "FSWFStream.h"
#include "FObj.h"
#include "FDTBitmaps.h"
#include "zlib.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 = new U8[_JPEGSize];
memcpy(JPEGStream, _JPEGStream, _JPEGSize);
JPEGSize = _JPEGSize;
characterID = FObjCollection::Increment();
}
U16 FDTDefineBitsJPEG2::ID(void)
{
return characterID;
}
FDTDefineBitsJPEG2::~FDTDefineBitsJPEG2()
{
}
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;
TUINT32 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, (uLongf *)&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);
}