
#pragma hdrstop

#include "TFEngine.h"

int		TFMultiThreadNum = 2;

int		TFGenerator::ID = 0;
int		TFEffector::ID = 0;
int		TFMixer::ID = 0;
TList		*TFGenerator::List = new TList;
TList		*TFEffector::List = new TList;
TList		*TFMixer::List = new TList;

TFFractalMethod_Z2	FractalMethod_Z2;
TFFractalMethod_Z3	FractalMethod_Z3;
TFFractalMethod		*TFFractalMethod::List[] =
{
	&FractalMethod_Z2,
	&FractalMethod_Z3,
};
int	TFFractalMethod::MethodNum = sizeof(TFFractalMethod::List)/sizeof(TFFractalMethod::List[0]);

TFDivergenceMethod_Norm	DivergenceMethod_Norm;
TFDivergenceMethod_Stalks DivergenceMethod_Stalks;
TFDivergenceMethod	*TFDivergenceMethod::List[] =
{
	&DivergenceMethod_Norm,
	&DivergenceMethod_Stalks,
};
int	TFDivergenceMethod::MethodNum = sizeof(TFDivergenceMethod::List)/sizeof(TFDivergenceMethod::List[0]);

TFOutputMethod_EndPoint	OutputMethod_EndPoint;
TFOutputMethod_Ball	OutputMethod_Ball;
TFOutputMethod		*TFOutputMethod::List[] =
{
	&OutputMethod_EndPoint,
	&OutputMethod_Ball,
};
int	TFOutputMethod::MethodNum = sizeof(TFOutputMethod::List)/sizeof(TFOutputMethod::List[0]);

TFRenderingMethod_Count	RenderingMethod_Count;
TFRenderingMethod_Count0 RenderingMethod_Count0;
TFRenderingMethod_REAL	RenderingMethod_REAL;
TFRenderingMethod_IMAG	RenderingMethod_IMAG;
TFRenderingMethod_ABS	RenderingMethod_ABS;
TFRenderingMethod_ARG	RenderingMethod_ARG;
TFRenderingMethod	*TFRenderingMethod::List[] =
{
	&RenderingMethod_Count,
	&RenderingMethod_Count0,
	&RenderingMethod_REAL,
	&RenderingMethod_IMAG,
	&RenderingMethod_ABS,
	&RenderingMethod_ARG,
};
int	TFRenderingMethod::MethodNum = sizeof(TFRenderingMethod::List)/sizeof(TFRenderingMethod::List[0]);


/* Thread Starter ************************************************************/
void __fastcall TFThreadGenerator::Execute(void)
{
	Generator->Generate0 (Offset);
}

void __fastcall TFThreadEffector::Execute(void)
{
	Effector->Effect0 (Offset);
}

void __fastcall TFThreadMixer::Execute(void)
{
	Mixer->Mix0 (Offset);
}

void __fastcall TFThreadMain::Execute(void)
{
	Main->Draw0 (Canvas);
	Synchronize ((TThreadMethod)&DrawCanvas);
}

void __fastcall TFThreadMain::DrawCanvas(void)
{
	TFMixer		*output_mixer;

	output_mixer = (TFMixer *)TFMixer::List->Last();
	output_mixer->Draw (Canvas);
}


/*****************************************************************************/


TFMain	TFMain0;

/* Test Program ***********************************

void __fastcall TForm1::FormCreate(TObject *Sender)
{
	extern void TFTest (TCanvas *canvas, TMemo *memo);

	TFTest (Image1->Canvas, Memo1);
}

void __fastcall TForm1::ButtonSaveClick(TObject *Sender)
{
	extern	AnsiString	SaveSource(void);

	Memo1->Lines->Text = SaveSource();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ButtonLoadClick(TObject *Sender)
{
	extern	void	LoadSource(AnsiString *, TCanvas *);
	AnsiString	source;

	source = Memo1->Lines->Text;
	LoadSource (&source, Image1->Canvas);
}

 **************************************************/

void
LoadSource(AnsiString *source, TCanvas *canvas)
{
	if (TFMain0.InputSource(source)) return;
	TFMain0.Draw (canvas);
}

AnsiString
SaveSource(void)
{
	return (TFMain0.OutputSource());
}


void
TFTest (TCanvas *canvas, TMemo *memo)
{
	AnsiString	source;

	{
	TFMain	TFMain0;

	TFParameter	*p;
	TFGenerator	*g;
	TFEffector	*e;
	TFMixer		*m;

	p = TFMain0.Parameter;
//	p->FractalType = TF_FRACTAL_TYPE_JULIA;
//	p->FractalMethod = FractalMethod_Z3.New();
//	p->FractalParameter = complex<double>(-0.79404,0.15981);
	p->Viewpoint = complex<double>(-0.79404,0.15981);
//	p->Viewpoint = complex<double>(-0.5 ,0);
//	p->Scale = 0.000015;
	p->Scale = 0.0005;
//	p->Width = 160;
//	p->Height = 160;

	g = TFMain0.Generator[0];
//	g->DivergenceMethod = DivergenceMethod_Stalks.New();
//	g->OutputMethod = OutputMethod_Ball.New();
	g->OutputMethod->Param[0] = complex<double>(0.5, 0.5);
	g->OutputMethod->Param[1] = 1;
	g->Depth = 512;

	e = TFMain0.Effector[0];
	e->RenderingMethod = RenderingMethod_Count0.New();
	e->Differential = true;
	e->AddEntry(-92, TFLib::ToColor(255, 255, 255) );
	e->AddEntry(-91, TFLib::ToColor(0, 0, 0) );
	e->AddEntry(91, TFLib::ToColor(0, 0, 0) );
	e->AddEntry(92, TFLib::ToColor(255, 255, 255) );

	e = new TFEffector();
	e->Generator = g;
	e->AddEntry(0.2, TFLib::ToColor(255, 128, 128) );
	e->AddEntry(0.3, TFLib::ToColor(128, 128, 255) );
	e->AddEntry(0.5, TFLib::ToColor(240, 255, 240) );

	m = TFMain0.Mixer[0];
	m->AddMask(e);

	source = TFMain0.OutputSource();
	}

	{
	TFMain	TFMain2;

	if (TFMain2.InputSource(&source)) return;
	memo->Lines->Text = TFMain2.OutputSource();
	TFMain2.Draw (canvas);
	}
}




