#include	<clib/all_protos.h>
#include	<exec/types.h>
#include	<math.h>
#include	<float.h>

extern double TwoPi,Limit,PiD2,XCenter,YCenter,Factor,Two,PowerN,Pi;
extern double PowerF;
extern SHORT Power;
extern UWORD Color;
extern LONG xtemp,ytemp,RightEdge,MaxCnt;
extern ULONG *ColorTable32,*LPixelBuf;
extern int BPP;

extern void PlotIt(void);

void UseLib(double);

void UseLib(double yRel)
{
double	Zr4,Zr6,Zi6,xRel,Zr,Zi,Zr2,Zi2,Z2,Zr3,Zi3;
ULONG *ColSrc;
int CurCnt;
	xRel = xtemp;
	xRel = xRel - XCenter;
	Zr = xRel/Factor;
	Zi = yRel;
	xRel = Zr;
	CurCnt = 1;			/* Initialize Counter */
	while (CurCnt < MaxCnt)	{
		Zr2 = Zr*Zr;	/* Find Zr^2 */
		Zi2 = Zi*Zi;	/* Find Zi^2 */
		Z2 = Zr2+Zi2;		/* Find Zr^2 + Zi^2 */
		if (Z2 > Limit)	{	/* is |Z| > 2*Factor */
        	if (BPP == 4) {
				ColSrc = (ULONG *)ColorTable32 + (ULONG)CurCnt;
				*LPixelBuf++ = *ColSrc;
				}
			else	{
				Color = CurCnt;
				PlotIt();
				}
			return;
			}
		if (Power == 2)	{
			Zi = Two*Zi*Zr;		/* Find original Zi * Zr */
			Zr2 = Zr2 - Zi2;	/* Find Zr^2 - Zi^2 */
			}
		if (Power == 3)	{
			Zr3 = Zr*(Zr2 - 3*Zi2);
			Zi = Zi*(3*Zr2 - Zi2);
			Zr2 = Zr3;		/* Divide by Factor to get part of new Zr */
			}
		if (Power == 4)	{
			Zr4 = (Zr2 - Zi2)*(Zr2 - Zi2) - 4*Zr2*Zi2;
			Zi = 4*(Zr2 - Zi2)*Zi*Zr;
			Zr2 = Zr4;
			}
		if (Power == 5)	{
			Zr3 = Zr*(Zr2 - 3*Zi2)*(Zr2 - Zi2) + 2*Zi2*Zr*(Zi2 - 3*Zr2);
			Zi = 2*Zi*Zr2*(Zr2 - 3*Zi2) - Zi*(Zi2 - 3*Zr2)*(Zr2 - Zi2);
			Zr2 = Zr3;
			}
		if (Power == 6)	{
			Zr3 = Zr*(Zr2 - 3*Zi2);
			Zi3 = Zi*(3*Zr2 - Zi2);
			Zr6 = Zr3*Zr3 - Zi3*Zi3;
			Zi6 = 2*Zr3*Zi3;
			Zr2 = Zr6;
			Zi = Zi6;
			}
		if (Power == 7)	{
			Zr3 = Zr*(Zr2 - 3*Zi2);
			Zi3 = Zi*(3*Zr2 - Zi2);
			Zr6 = Zr3*Zr3 - Zi3*Zi3;
			Zi6 = 2*Zr3*Zi3;
			Zr2 = Zr6*Zr - Zi6*Zi;
			Zi = Zr6*Zi+Zi6*Zr;
			}
		Zr = xRel + Zr2;	/* Find New Zr */
		Zi = yRel + Zi;	 /*Add in original Zi to get new Zi */
		CurCnt++;
		}
	if (BPP == 4) {
			ColSrc = (ULONG *)ColorTable32 + 0xffff;
			*LPixelBuf++ = *ColSrc;
			}
		else	{
			Color = 0xffff;
			PlotIt();
			}
	return;
}

