Blob Blame Raw
// 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: FCT.cpp

  This source file contains the definition for the low-level Control-Tag related functions,
  grouped by classes, which are all derived from class FCT:


		Class						Member Function

		FCTDoAction				FCTDoAction(void);
								~FCTDoAction();
								void AddAction(FActionRecord*);
								void WriteToSWFStream(FSWFStream*);

		FCTFrameLabel			FCTFrameLabel(FString*);
								~FCTFrameLabel();
								void WriteToSWFStream(FSWFStream*);

		FCTPlaceObject			FCTPlaceObject(U16, U16, FMatrix*, FCXForm*);
								~FCTPlaceObject();
								void WriteToSWFStream(FSWFStream*);

		FCTPlaceObject2			FCTPlaceObject2(U16, U16, U16, U16, U16, U16, FMatrix*,
												FCXForm*, U16, FString*, U16);
								~FCTPlaceObject2();
								void WriteToSWFStream(FSWFStream*);

		FCTProtect				FCTProtect();
								void WriteToSWFStream(FSWFStream*);

		FCTRemoveObject			FCTRemoveObject(U16, U16);
								void WriteToSWFStream(FSWFStream*);

		FCTRemoveObject2		FCTRemoveObject2(U16);
								void WriteToSWFStream(FSWFStream*);

		FCTSetBackgroundColor	FCTSetBackgroundColor(FColor*);
								~FCTSetBackgroundColor();
								void WriteToSWFStream(FSWFStream*);

		FCTShowFrame			FCTShowFrame();
								U32 IsShowFrame();
								void WriteToSWFStream(FSWFStream*);

		FCTStartSound			FCTStartSound(U16, FSoundInfo*);
								~FCTStartSound();
								void WriteToSWFStream(FSWFStream*);


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

#include "FCT.h"
#include "FDTShapes.h"
#include "FDTSounds.h"

//////////////////////////////////////////////////////////////////////////////////////
//  --------  FCTDoAction ------------------------------------------------------------

FCTDoAction::FCTDoAction(void)
{
}

FCTDoAction::~FCTDoAction()
{

	while (!actionRecordList.empty()) {

		delete actionRecordList.front();

		actionRecordList.pop_front();
	}
}

void FCTDoAction::AddAction(FActionRecord *_actionRecord)
{

	actionRecordList.push_back(_actionRecord);
}

void FCTDoAction::WriteToSWFStream(FSWFStream *_SWFStream)
{

	FSWFStream body;

	std::list<FActionRecord *>::iterator cursor;
	for (cursor = actionRecordList.begin(); cursor != actionRecordList.end(); cursor++) {

		(*cursor)->WriteToSWFStream(&body);
	}

	body.WriteByte(0);

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

//////////////////////////////////////////////////////////////////////////////////////
//  --------  FCTFrameLabel ----------------------------------------------------------

FCTFrameLabel::FCTFrameLabel(FString *_frameName)
{
	frameName = _frameName;
}

FCTFrameLabel::~FCTFrameLabel()
{
	delete frameName;
}

void FCTFrameLabel::WriteToSWFStream(FSWFStream *_SWFStream)
{
	FSWFStream body;
	frameName->WriteToSWFStream(&body, true);

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

//////////////////////////////////////////////////////////////////////////////////////
//  --------  FCTPlaceObject ----------------------------------------------------------

FCTPlaceObject::FCTPlaceObject(U16 _characterID,
							   U16 _depth,
							   FMatrix *_matrix,
							   FCXForm *_colorTransform)
{
	characterID = _characterID;
	depth = _depth;
	matrix = _matrix;
	colorTransform = _colorTransform;

	FLASHASSERT(_colorTransform);
}

FCTPlaceObject::~FCTPlaceObject()
{
	delete matrix;
	delete colorTransform;
}
void FCTPlaceObject::WriteToSWFStream(FSWFStream *_SWFStream)
{

	FSWFStream body;
	;

	body.WriteWord((U32)characterID);

	body.WriteWord((U32)depth);

	matrix->WriteToSWFStream(&body);

	if (colorTransform) {
		colorTransform->WriteToSWFStream(&body);
	}

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

//////////////////////////////////////////////////////////////////////////////////////
//  --------  FCTPlaceObject2 --------------------------------------------------------

FCTPlaceObject2::FCTPlaceObject2(U16 _hasClipDepth,
								 U16 _hasRatio,
								 U16 _hasChar,
								 U16 _hasMove,
								 U16 _depth,
								 U16 _characterID,
								 FMatrix *_matrix,
								 FCXFormWAlpha *_colorTransform,
								 U16 _ratio,
								 FString *_name,
								 U16 _clipDepth)
{
	SetParameters(_hasClipDepth, _hasRatio, _hasChar, _hasMove, _depth, _characterID,
				  _matrix, _colorTransform, _ratio, _name, _clipDepth);
}

FCTPlaceObject2::FCTPlaceObject2(const FCTPlaceObject2 &obj)
{
	SetParameters(obj.hasClipDepth, obj.hasRatio, obj.hasCharID, obj.hasMove,
				  obj.depth, obj.characterID, 0, obj.colorTransform,
				  obj.ratio, 0, obj.clipDepth);
	matrix = obj.matrix ? new FMatrix(*(obj.matrix)) : 0;
	name = obj.name ? new FString(*(obj.name)) : 0;
}

void FCTPlaceObject2::SetParameters(U16 _hasClipDepth,
									U16 _hasRatio,
									U16 _hasChar,
									U16 _hasMove,
									U16 _depth,
									U16 _characterID,
									FMatrix *_matrix,
									FCXFormWAlpha *_colorTransform,
									U16 _ratio,
									FString *_name,
									U16 _clipDepth)
{
	hasClipAction = 0;
	hasClipDepth = _hasClipDepth;
	hasRatio = _hasRatio;
	hasCharID = _hasChar;
	hasMove = _hasMove;
	depth = _depth;
	characterID = _characterID;
	matrix = _matrix;
	colorTransform = _colorTransform;
	ratio = _ratio;
	name = _name;
	clipDepth = _clipDepth;
	clipAction = NULL;
}

FCTPlaceObject2::FCTPlaceObject2(U16 _hasClipAction,
								 U16 _hasClipDepth,
								 U16 _hasRatio,
								 U16 _hasChar,
								 U16 _hasMove,
								 U16 _depth,
								 U16 _characterID,
								 FMatrix *_matrix,
								 FCXFormWAlpha *_colorTransform,
								 U16 _ratio,
								 FString *_name,
								 U16 _clipDepth,
								 FClipAction *_clipAction)
{
	hasClipAction = _hasClipAction;
	hasClipDepth = _hasClipDepth;
	hasRatio = _hasRatio;
	hasCharID = _hasChar;
	hasMove = _hasMove;
	depth = _depth;
	characterID = _characterID;
	matrix = _matrix;
	colorTransform = _colorTransform;
	ratio = _ratio;
	name = _name;
	clipDepth = _clipDepth;
	clipAction = _clipAction;
}

FCTPlaceObject2::~FCTPlaceObject2()
{

	delete name;
	delete matrix;
	delete colorTransform;
	delete clipAction;
}

U32 FCTPlaceObject2::IsPlaceObject()
{

	return 1;
}

int FCTPlaceObject2::GetPlacedId()
{
	return hasCharID ? characterID : -1;
}

void FCTPlaceObject2::SetId(U16 id)
{
	characterID = id;
	hasMove = 0;
	hasCharID = 1;
}

void FCTPlaceObject2::ChangePlacedId(U16 id)
{
	if (hasCharID) {
		characterID = id;
		//hasMove=0;
	}
}

void FCTPlaceObject2::SetMatrix(FMatrix *_matrix)
{
	matrix = _matrix;
}

void FCTPlaceObject2::WriteToSWFStream(FSWFStream *_SWFStream)
{

	FSWFStream body;

	body.WriteBits(hasClipAction, 1); /*DM*/
	body.WriteBits(hasClipDepth, 1);  /*DM*/
	body.WriteBits((name != 0), 1);
	body.WriteBits(hasRatio, 1);
	body.WriteBits((colorTransform != 0), 1);
	body.WriteBits((matrix != 0), 1);
	body.WriteBits(hasCharID, 1);
	body.WriteBits(hasMove, 1);

	body.WriteWord(depth);

	if (hasCharID)
		body.WriteWord((U32)characterID);
	if (matrix)
		matrix->WriteToSWFStream(&body);
	if (colorTransform)
		colorTransform->WriteToSWFStream(&body);
	if (hasRatio)
		body.WriteWord((U32)ratio);
	if (name)
		name->WriteToSWFStream(&body, true);
	if (hasClipDepth)					/*DM*/
		body.WriteWord((U32)clipDepth); /*DM*/
	if (hasClipAction)
		clipAction->WriteToSWFStream(&body);

	body.FlushBits();

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

/////////////////////////////////////////////////////////////////////////////////
//  --------  FCTProtect --------------------------------------------------------

FCTProtect::FCTProtect()
{
}

void FCTProtect::WriteToSWFStream(FSWFStream *_SWFStream)
{
	_SWFStream->AppendTag(stagProtect, 0, 0);
}

/////////////////////////////////////////////////////////////////////////////////
//  --------  FCTRemoveObject ---------------------------------------------------

FCTRemoveObject::FCTRemoveObject(U16 _characterID, U16 _depth)
{
	characterID = _characterID;
	depth = _depth;
}

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

	body.WriteWord((U32)characterID);
	body.WriteWord((U32)depth);

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

/////////////////////////////////////////////////////////////////////////////////
//  --------  FCTRemoveObject2 --------------------------------------------------

FCTRemoveObject2::FCTRemoveObject2(U16 _depth)
{
	depth = _depth;
}

void FCTRemoveObject2::WriteToSWFStream(FSWFStream *_SWFStream)
{
	FSWFStream body;
	body.WriteWord((U32)depth);

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

/////////////////////////////////////////////////////////////////////////////////
//  --------  FCTSetBackgroundColor --------------------------------------------------

FCTSetBackgroundColor::FCTSetBackgroundColor(FColor *_color)
{
	color = _color;
	// here changed.
	// Background color is always opaque, i.e. no alpha channel.
	color->AlphaChannel(false);
}

FCTSetBackgroundColor::~FCTSetBackgroundColor()
{
	delete (color);
}

void FCTSetBackgroundColor::WriteToSWFStream(FSWFStream *_SWFStream)
{

	FSWFStream body;
	// here changed.
	color->WriteToSWFStream(&body);

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

/////////////////////////////////////////////////////////////////////////////////
//  --------  FCTUnparsedTag --------------------------------------------------

FCTUnparsedTag::FCTUnparsedTag(U16 _tagId, U32 _lenght, U8 *_data)
{
	lenght = _lenght;
	if (lenght > 0) {
		data = new U8[lenght];
		memcpy(data, _data, lenght);
	} else
		data = 0;

	tagId = _tagId;
}

FCTUnparsedTag::~FCTUnparsedTag()
{
	delete data;
}

void FCTUnparsedTag::WriteToSWFStream(FSWFStream *_SWFStream)
{

	FSWFStream body;
	// here changed.
	if (lenght > 0)
		body.WriteLargeData(data, lenght);

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

USHORT FCTUnparsedTag::GetID()
{
	if (tagId == stagDefineButton2 ||
		tagId == stagDefineButton ||
		tagId == stagDefineText ||
		tagId == stagDefineText2 ||
		tagId == stagDefineEditText ||
		tagId == stagDefineMorphShape ||
		tagId == stagDefineBitsLossless2 ||
		tagId == stagDefineBitsLossless ||
		tagId == stagDefineBitsJPEG3)
		return (USHORT)(data[0] | (data[1] << 8));
	return 0;
}

void FCTUnparsedTag::SetID(USHORT id)
{
	if (tagId == stagDefineButton2 ||
		tagId == stagDefineButton ||
		tagId == stagDefineText ||
		tagId == stagDefineText2 ||
		tagId == stagDefineEditText ||
		tagId == stagDefineMorphShape ||
		tagId == stagDefineBitsLossless2 ||
		tagId == stagDefineBitsLossless ||
		tagId == stagDefineBitsJPEG3) {
		data[0] = (id & 0xff);
		data[1] = (id >> 8);
	}
}

/////////////////////////////////////////////////////////////////////////////
//  --------  FCTShowFrame --------------------------------------------------

FCTShowFrame::FCTShowFrame()
{
}

U32 FCTShowFrame::IsShowFrame()
{

	return 1;
}

void FCTShowFrame::WriteToSWFStream(FSWFStream *_SWFStream)
{

	_SWFStream->AppendTag(stagShowFrame, 0, 0);
}

/////////////////////////////////////////////////////////////////////////////
//  --------  FCTStartSound --------------------------------------------------

FCTStartSound::FCTStartSound(U16 _soundID, FSoundInfo *_soundInfo)
{

	soundID = _soundID;
	soundInfo = _soundInfo;
}

FCTStartSound::~FCTStartSound()
{

	delete soundInfo;
}

void FCTStartSound::WriteToSWFStream(FSWFStream *_SWFStream)
{

	FSWFStream body;

	body.WriteWord((U32)soundID);
	soundInfo->WriteToSWFStream(&body);

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