/*
 * :ts=8 Common DEFINEs and external declarations for the Mandelbrot
 * Construction Set...
 */

#undef LIBRARY_VERSION
#define LIBRARY_VERSION     33L /* V1.2 */


#define MYFRONTPEN  2		/* Black */

/* Menus */
#define CPRMENU     0		/* Copyright Menu */
#define PRJMENU     1		/* Poject Menu */
#define OPTMENU     2		/* Option Menu */
#define DRWMENU     3		/* Draw functions Menu */
#define BATMENU     4		/* Batch Menu */

/* Menu items */
#define PRJNEW	    0		/* Project Menu: New */
#define PRJOPN	    1		/* Open */
#define PRJSVE	    2		/* Save */
#define PRJSVA	    3		/* Save As */
#define PRJSTP	    4		/* Stop */
#define PRJQUI	    5		/* Quit */

#define PNABS	    0		/* Project New: Absolute */
#define PNENL	    1		/* Enlarge */
#define PNRED	    2		/* Reduce */
#define PNSHF	    3		/* Shift */
#define PNZI	    4		/* Zoom In */
#define PNZO	    5		/* Zoom Out */

#define OPTCOL	    0		/* Option Menu: Colors */
#define OPTRES	    1		/* Resolution */
#define OPTPAR	    2		/* Parameters */
#define OPTPRI	    3		/* Priority */

#define OCSEL	    0		/* Opt Color: Select */
#define OCMOD	    1		/* Modulo */
#define OCRAN	    2		/* Ranges */
#define OCPAL	    3		/* Palette */

#define ORNRM	    0		/* Opt Resl: Normal */
#define OR12	    1		/* 1/2 */
#define OR13	    2		/* 1/3 */
#define OR14	    3		/* 1/4 */
#define ORFIL	    4		/* Fill In */
#define ORHI	    5		/* HiRes */
#define ORILC	    6		/* Interlace */
#define ORBCK	    7		/* Borderless */
#define OREHB	    8		/* Extra Half Brite */

#define OPNOR	    0		/* Normal priority */
#define OPLOW	    1		/* Low priority */

#define DRWFUN	    0		/* Draw functions */
#define DRWIPL	    1		/* - Iteration plot */
#define DRWEPL	    2		/* - End plot */

#define DF1	    0		/* Functions Menu: Z^2-C */
#define DF2	    1		/* ZC1MinZ */
#define DF3	    2		/* Z3PlusZCMin1MinC */
#define DFUPF	    3		/* Not on the menu for now */
#define DF5	    4		/* i:Z^2 - C */

#define DINONE	    0		/* draw iplot none */
#define DIZ	    1		/* iplot Z */

#define DEDEPTH     0		/* draw eplot depth */
#define DEZ	    1		/* eplot Z */

#define BATFILE     0		/* Batch Menu: File... */
#define BATWAIT     1		/* Wait */
#define BATCONT     2		/* Continue */
#define BATABORT    3		/* Abort */


#define POSGADGETID 10		/* For Positive Gadget */
#define NEGGADGETID 11		/* For Negative Gadget */

#define FNAME_SIZE  32L 	/* Filename size */
#define DNAME_SIZE  66L 	/* Directoryname size */

#define MAXDEPTH    512 	/* Maximum maximum depth */
#define BMDEPTH     5		/* Depth of our bitmap */
#define MAXCOL (1<<BMDEPTH)     /* Maximum number of colors */

#define NOTFRAMING  0		/* We are not framing */
#define NOPOINT     1		/* We have no points of a frame */
#define POINT1	    2		/* We have 1 point of a frame */
#define CENTERFRAMING 3 	/* We have a center and are busy with a
				 * corner */
#define FLASHING    4		/* We are still flashing the frame */

#define MODULO	    0		/* Pen assignment to the depths */
#define RANGES	    1
#define SELECT	    2

#define MAND	    ((ULONG)'M'<<24 | (ULONG)'A'<<16 | 'N'<<8 | 'D')

#define MINSCREENHEIGHT 150	/* Minimum required screen sizes */
#define MINSCREENWIDTH	320

/* Let's try to make `goto' a little more structured... :-) */

#define skipto	    goto
#define backto	    goto

#define OFFSETOF(member, structure) ((long) &((struct structure *)0)->member)

/* Type definitions */

typedef short bool;

struct BitMapHeader {
    UWORD	    w,
		    h;
    UWORD	    x,
		    y;
    UBYTE	    nPlanes;
    UBYTE	    masking;
    UBYTE	    compression;
    UBYTE	    pad1;
    UWORD	    transparentColor;
    UBYTE	    xAspect,
		    yAspect;
    WORD	    pageWidth,
		    pageHeight;
};

/*
 * ILBM_info is the structure read_iff returns, and is hopefully all you
 * need to deal with out of the iff reader routines below
 */
struct ILBM_info {
    struct BitMapHeader header;
    UBYTE	    cmap[MAXCOL * 3];
    struct BitMap   bitmap;
    struct Mand    *mand;
    long	    mandsize;
};

struct Mand {
    ULONG	    MandID;	/* 'MAND' */
    LONG	    Size;	/* sizeof(struct Mand) */
    WORD	    MaxDepth;	/* Maximum iteration count */
    WORD	    RangeWidth;
    BYTE	    RainDist;	/* From the palette Rainbow mode */
    BYTE	    RainRMax;	/* From the palette Rainbow mode */
    BYTE	    RainGMax;	/* From the palette Rainbow mode */
    BYTE	    RainBMax;	/* From the palette Rainbow mode */
    BYTE	    Coords[4 * 18];	/* Ascii representation */
    BYTE	    FunctionNr; /* Which function was used (1...4) */
    BYTE	    PenTableMode;	/* MODULO, RANGES, SELECT */
    USHORT	    WBWidth;
    USHORT	    WBHeight;
};

struct BorderInfo {
    BYTE	    SizeX,
		    SizeY;
    BYTE	    MoveX,
		    MoveY;
};

/* Some definitions for the User Programmed Functions */

struct Program {
    char	    pr_OpCode;
    char	    pr_Dest;
    char	    pr_Op1;
    char	    pr_Op2;
    long	    pr__Reserved;
};

enum Opcode {
    End, Rassign, Cassign, Ri, Ci, Rplus, Cplus, Rminus, Cminus,
    Rtimes, Ctimes,
};

#define PROGRAMSIZE	64
#define PROGRAMREGS	16

extern struct Program Program[PROGRAMSIZE];
extern double	PrgReg[2 * PROGRAMREGS];

#define RE(x)           (x)     /* These RE and IM cannot */
#define IM(x)           ((x) + PROGRAMREGS)     /* be exchanged! */

/* Some Other Macros */

#define MENU(menu,item,subitem)\
	(LONG)(SHIFTMENU(menu)|SHIFTITEM(item)|SHIFTSUB(subitem))

/* External declarations */

#include <functions.h>
extern long	GetScreenData();

/*
 * extern struct Screen *OpenScreen(); extern struct Window *OpenWindow();
 * extern struct IntuiMessage *GetMsg(); extern struct Library
 * *OpenLibrary(); extern struct MenuItem *ItemAddress(); extern long
 * AutoRequest(), DisplayAlert(), Request(), MoveLayer(), SizeLayer();
 * extern void SetAPen(), WritePixel(), WindowLimits(), EndRequest();
 * extern struct Task *FindTask(); extern long Wait();
 */


/* Forward POINTER declarations */

extern struct Screen *MandelScreen;
extern struct Window *MainWindow;
extern struct IntuiMessage *message;
extern int	(*DepthFunc) ();
extern void	(*IPlotFunc) ();
extern void	(*EPlotFunc) ();
extern struct IntuitionBase *IntuitionBase;
extern struct LayersBase *LayersBase;
extern struct GfxBase *GfxBase;
extern FILE    *BatchFILE;
extern struct Task *MandelTask,
	       *DrawTask;


/* Forward STRUCT declarations */

extern struct Menu MandelMenu[];
extern struct NewScreen MandelNScreen;
extern struct NewWindow MainNWindow;
extern struct TextAttr Topaz60,
		Topaz80;
extern struct IntuiText PositiveText,
		NegativeText;
extern struct Gadget PositiveGadget,
		NegativeGadget;
extern struct BorderInfo borderinfo;


/* Forward ARRAY declarations */

extern TEXT	FileName[FNAME_SIZE + 1];
extern TEXT	DirName[DNAME_SIZE + 2];


/* Forward `SIMPLE' declarations */

extern int	NumColors,
		MaxDepth,
		PixelStep,
		RangeWidth;
extern int	DrawPri;
extern unsigned PenTableMode;
extern unsigned short FrameX1,
		FrameX2,
		FrameY1,
		FrameY2;
extern short	MouseStatus;
extern bool	finished,
		StillDrawing,
		Saved,
		NameValid;
extern double	LeftEdge,
		RightEdge,
		TopEdge,
		BottomEdge,
		CXStep,
		CYStep;
extern UBYTE	PenTable[MAXDEPTH];
extern UBYTE	FunctionNr;

extern SHORT	RainbowDistance,
		RainbowRMax,
		RainbowGMax,
		RainbowBMax;
extern long	DrawSigMask;
extern int	DrawSigBit;
extern USHORT	WBWidth,
		WBHeight;


/* Forward FUNCTION declarations */

extern bool	InitDisplay();
extern bool	ReInitDisplay();
extern bool	Sure();
extern bool	CleanupDisplay();
extern bool	InterpretMAND();
extern bool	DoBorderless();
extern bool	DrawPicture();
extern bool	OpenAs();
extern bool	SaveAs();
extern bool	OpenBatch();

extern int	WaitMyRequest();
extern int	write_iff();
extern int	ZQuadMinC();
extern int	ZC1MinZ();
extern int	Z3PlusZCMin1MinC();
extern int	UserProgFunc();
extern int	I_ZQuadMinC();

extern float	Ratio();
extern char    *get_fname();
extern char    *index();
extern struct ILBM_info *win_read_iff();
extern struct Window *MyRequest();

extern void	MyExit();
extern void	GotMenu();
extern void	UndoBorderless();
extern void	CprMenu();
extern void	PrjMenu();
extern void	EdtMenu();
extern void	OptMenu();
extern void	DrwMenu();
extern void	BatchMenu();
extern void	UnImpl();
extern void	EndMyRequest();
extern void	CloseWindowSafely();
extern void	get_ea_cmap();
extern void	put_ea_cmap();
extern void	free_planes();
extern void	RectDraw();
extern void	CrossDraw();
extern void	CheckMouse();
extern void	InitPenTable();
extern void	StopFraming();
extern void	EnableSystemGadgets();
extern void	DisableSystemGadgets();
extern void	Parameters();
extern void	Palette();
extern void	MakeMAND();
extern void	StopDrawing();
extern void	CalcCSteps();
extern void	None();
extern void	PlotZ();
extern void	PlotIterationCount();
extern void	SelectMenu();
extern void	SuspendDrawing();
extern void	ResumeDrawing();
extern void	UpdateCheckmarks();
extern void	UpdateDrwFunCm();
extern void	UpdateDrwIplotCm();
extern void	UpdateDrwEplotCm();
extern void	UpdateOptColorCm();
extern void	UpdateOptDrawResCm();
extern void	UpdateOptViewResCm();
extern void	UpdateOptPriCm();
extern void	CloseBatch();

#ifdef AREXX
/*
 *   This is the list of functions we can access.  (Cheap forward
 *   declarations, too.)
 */
extern long upRexxPort() ;
extern void dnRexxPort() ;
extern void dispRexxPort() ;
extern struct RexxMsg *sendRexxCmd() ;
extern struct RexxMsg *syncRexxCmd() ;
extern struct RexxMsg *asyncRexxCmd() ;
extern void replyRexxCmd() ;

extern long RexxMask;
#endif

