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

                 FraktalDraw av Johan Sanneblad

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

#include <math.h>
#include <exec/types.h>
#include <intuition/intuition.h>
#include <stdio.h>

	short	testbit(long,short);
	long	iter(double,double,long);

	long	color,i1,i2,XMAX,YMAX,MAXITER;
	double	xcoord,ycoord,scalex,scaley,RE1,RE2,IM1,IM2;

struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;

struct Screen *CustScr;
struct Window *Wdw;
struct ViewPort *WVP;

struct NewScreen NewCustScr =
	{
	0,0,320,256,5,NULL,NULL,NULL,CUSTOMSCREEN,
	NULL,NULL,NULL,NULL,
	};

struct NewWindow NewWdw =
	{
	0,0,320,256,0,0,CLOSEWINDOW|BORDERLESS|SMART_REFRESH|ACTIVATE,
	NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,CUSTOMSCREEN
	};

static USHORT colormap [32] =
	{
	0xFF0,0xFD0,0xFB0,0xF90,0xF70,0xF50,0xF30,0xF10,
	0xD02,0xB04,0x906,0x708,0x50A,0x30C,0x10E,0x00F,
	0x20D,0x04B,0x069,0x087,0x0A5,0x0C3,0x0E1,0x0F0,
	0x2F0,0x4F0,0x6F0,0x8F0,0xAF0,0xCF0,0xEF0,0x000
	};

void main(argc,argv)
long argc;
char *argv[];
{
	if(argc==8)
	{
	XMAX=atol(argv[1]);
	YMAX=atol(argv[2]);
	MAXITER=atol(argv[3]);
	RE1=atof(argv[4]);
	IM1=atof(argv[5]);
	RE2=atof(argv[6]);
	IM2=atof(argv[7]);
	scalex=((RE2+10)-(RE1+10))/XMAX;
	scaley=((IM2+10)-(IM1+10))/YMAX;
	xcoord=RE1-scalex;

	IntuitionBase = (struct IntuitionBase *)
		OpenLibrary("intuition.library",LIBRARY_VERSION);
	if (IntuitionBase == NULL) exit(FALSE);

	GfxBase = (struct GfxBase *)
		OpenLibrary("graphics.library",LIBRARY_VERSION);
	if (GfxBase == NULL) exit(FALSE);

	if ((NewWdw.Screen = CustScr = 
	(struct Screen *)OpenScreen(&NewCustScr)) == NULL)
		exit(FALSE);

	if ((Wdw = (struct Window *)OpenWindow(&NewWdw)) == NULL)
		exit(FALSE);

	WVP = (struct ViewPort *)ViewPortAddress(Wdw);
	LoadRGB4(WVP,&colormap,32);

	for(i1=0;testbit(0xBFE001,6)&&(i1<XMAX);i1++)
	{
		xcoord+=scalex;
		ycoord=IM1-scaley;
		for(i2=0;i2<YMAX;i2++)
		{
			ycoord+=scaley;
			color=iter(xcoord,ycoord,MAXITER);
			if(color==MAXITER) color=31;
			else color%=30;
			SetAPen(Wdw->RPort,color);
			WritePixel(Wdw->RPort,i1,i2);
		}
	}

	for(i1=0;testbit(0xBFE001,6);0)
	{/*Just do nothing until mouseklick*/}

	CloseWindow(Wdw);
	CloseScreen(CustScr);
	CloseLibrary(GfxBase);
	CloseLibrary(IntuitionBase);

	}
else printf("Skriv: FD X-Storlek Y-Storlek 'Max antal iterationer' Re1 Im1 Re2 Im2\n");
}

long iter(xc,yc,maxit)
double xc,yc;
long maxit;
{
	double x2,y2,x,y;
	long count;
	x2=y2=x=y=0;
	for(count=0;((x2+y2)<4) && (count<maxit);count++)
	{
		x2=x*x;
		y2=y*y;
		y=2*x*y+yc;
		x=x2-y2+xc;
	}
	return(count);
}

static short testbit(address,bit)
long address;
short bit;
{
	return(*(char *) address&(1<<bit));
}

