// MPMorph - Amiga Morphing program
// Copyright (C) © 1996 Mark John Paddock

// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

// mpaddock@cix.compulink.co.uk

#ifndef MPMORPH_H
#define MPMORPH_H

/* GUI stuff from GadTools	*/
#include "gui.h"

/* Message keys				*/
#ifndef CATCOMP_NUMBERS
#define CATCOMP_NUMBERS
#include "Messages.h"
#endif

/* defines for the IDs of the gadgets in the control window	*/
#define ONEGADGET		1
#define TWOGADGET		2
#define RELGADGET		3
#define ADDGADGET		4
#define DELGADGET		5
#define LINKGADGET	6
#define UNLINKGADGET	7
#define NONEGADGET	8
#define STGADGET		9
#define PREVGADGET	10
#define GOTOGADGET	11
#define NEXTGADGET	12
#define LASTGADGET	13

/* Defined externally	*/
extern struct DosLibrary *DOSBase;
extern struct ExecBase *SysBase;

/*	Structure definitions	*/

/* Picture structure
 * This holds all information for a picture displayed in a window
 */
struct Picture {						// Structure used for each picture
	struct Screen		*Screen;		// Screen to display on
	struct Window		*Win;			// Window
	struct EI_Window	*EGS_Win;	// EGS Window
	struct DrawInfo	*DRI;			// Draw Info
	struct Gadget		*BotGad;		// Bottom slider gadget
	struct Gadget		*SideGad;	// Side slider gadget
	struct Gadget		*Lgad;		// Left arrow gadget
	struct Gadget		*Rgad;		// Right arrow gadget
	struct Gadget		*Ugad;		// Up arrow gadget
	struct Gadget		*Dgad;		// Down arrow gadget
	struct Image		*Limage;		// Left arrow
	struct Image		*Rimage;		// Right arrow
	struct Image		*Uimage;		// Up arrow
	struct Image		*Dimage;		// Down arrow
	UWORD					Left;			// Left edge
	UWORD					Top;			// Top edge
	UWORD					XLeft;		// Old left edge
	UWORD					XTop;			// Old top edge
	UWORD					ALeft;		// Left movement 10% of window
	UWORD					ATop;			// down movement 10% of window
	UWORD					MLeft;		// Max left edge
	UWORD					MTop;			// Max top edge
	UWORD					currentg;	// Current gadgetID
	char					*filename;	// For Window title
	ULONG					JustSeconds;//	Time window was activated - to ignore first click
	struct MPImage		*MPi;			//	The loaded bitmap
	struct BitMap		*BitMap;		// The zoomed image bitmap
	struct BitScaleArgs BitScaleArgs;	// For zooming image
	struct {
		WORD				Left;			// Window Zoom tags - nothing to do with Zoom
		WORD				Top;
		WORD				Width;
		WORD				Height;
	} Zoom;
	struct AppWindow *AppWindow;
};

#define MAX_LINKS 16

/* Point structure
 * Holds all information for each point
 */
struct MyPoint {
	struct MinNode MyNode;				// Node to link in a list
	LONG x,y;								// Coordinates in the 1st image
	LONG x1,y1;								// Coordinates in the 2nd image
	WORD	NumLinks;						// Number of links on this point
	BOOL Drawn1;							// Drawn 1?
	BOOL Drawn2;							// Drawn 2?
	UBYTE Pen1[16];						// Border Pens
	UBYTE Pen2[16];						// Border Pens
	struct MyPoint *p[MAX_LINKS];		// Pointers to up to MAX_LINKS linked points
};

/* Structure for size of system gadgets
 * based on Screen resolution
 * This enables windows to open with correct
 * gadgets on lo-res screens
 */
struct gadgetsizing {
	ULONG sysisize;		// tag for SYSISIZE_???RES
	int sizeimagew;
	int sizeimageh;
	int leftimagew;
	int leftimageh;
	int downimagew;
	int downimageh;
	int rightimagew;
	int rightimageh;
	int upimagew;
	int upimageh;
	int closeimagew;
	int zoomimagew;
	int depthimagew;
	int vscrollw;
	int vscrolll;
};

/* Macro for finding gadget	*/
#define PointInBox(x,y,mx,my,MX,MY) ((x>=mx)&&(y>=my)&&(x<=MX)&&(y<=MY))

/* Macros to access system gadget sizes	*/
#define SYSISIZE(n)		gs[n].sysisize
#define SIZEIMAGE_W(n)	gs[n].sizeimagew
#define SIZEIMAGE_H(n)	gs[n].sizeimageh
#define LEFTIMAGE_W(n)	gs[n].leftimagew
#define LEFTIMAGE_H(n)	gs[n].leftimageh
#define DOWNIMAGE_W(n)	gs[n].downimagew
#define DOWNIMAGE_H(n)	gs[n].downimageh
#define UPIMAGE_W(n)		gs[n].upimagew
#define UPIMAGE_H(n)		gs[n].upimageh
#define RIGHTIMAGE_W(n)	gs[n].rightimagew
#define RIGHTIMAGE_H(n)	gs[n].rightimageh
#define CLOSEIMAGE_W(n)	gs[n].closeimagew
#define ZOOMIMAGE_W(n)	gs[n].zoomimagew
#define DEPTHIMAGE_W(n)	gs[n].depthimagew
#define VSCROLL_W(n)		gs[n].vscrollw
#define VSCROLL_L(n)		gs[n].vscrolll

/* defines for resolution for index	*/
#define GS_LOWRES			0
#define GS_MEDRES			1

/* Pointer image structures */
extern UWORD __chip Add[];
extern UWORD __chip Del[];
extern UWORD __chip L1[];
extern UWORD __chip L2[];
extern UWORD __chip Mov[];
extern UWORD __chip One[];
extern UWORD __chip Rel[];
extern UWORD __chip Two[];
extern UWORD __chip U1[];
extern UWORD __chip U2[];

extern APTR Add_o,Del_o,L1_o,L2_o,Mov_o,One_o,Rel_o,
				Two_o,U1_o,U2_o;

/* Defines for the help system nodes
 * See "help.c" for the node text
 */

enum Messages {
// Parameters
H_P_CI=0,
H_P_ZO,
H_P_PS,
H_PCUSTM,
H_P_Preview,
H_P_CIP,
H_P_KS,
H_P_HE,

// Main Window
H_IWindow,

// Main window gadgets
H_IClose,
H_IDrag,
H_IZoom,
H_IDepth,
H_HelpGad,
H_FileOne,
H_GFileOne,
H_FileTwo,
H_GFileTwo,
H_24File1,
H_G24File1,
H_24File2,
H_G24File2,
H_Width,
H_Height,
H_SetSize,
H_Scale,
H_Single,
H_Frames,
H_Start,
H_Name,
H_GName,
H_EPoints,

// Main window Menus
H_IM,

H_IMP,

H_IMPN,
H_IMPO,
H_IMPR,
H_IMPR1,
H_IMPR2,
H_IMPR3,
H_IMPR4,
H_IMPR5,
H_IMPS,
H_IMPSA,
H_IMPD,
H_IMPA,
H_IMPE,
H_IMPQ,

H_IMS,

H_P_LOADS,
H_P_SAVES,
H_P_SAVESAS,
H_S_RD,
H_S_LS,
H_S_R,

H_IMU,

H_IMUP,
H_IMU2,
H_IMU3,
H_IMU4,
H_IMU5,
H_IMU6,
H_IMU7,
H_IMU8,
H_IMU9,
H_IMUStart,
H_IMUStop,
H_IMUM,

// Errors
HE_Grid0,
HE_MPoints,
HE_OMorph,
HE_Screen,
HE_Library,
HE_FileReq,
HE_WPort,
HE_IDevice,
HE_ZRaster,
HE_Menu,
HE_OWindow,
HE_MemFile,
HE_AllocGadget,
HE_AllocImage,
HE_LoadImage,
HE_GetDRI,
HE_LockScreen,
HE_FileFormat,
HE_MemPoints,
HE_InvLink,
HE_Close,
HE_Open,
HE_Write,
HE_4points,
HE_MemNewPoint,
HE_OldFormat,
HE_OneFrame,
HE_SaveSettings,
HE_LoadSettings,
HE_OScreen,
HE_DrawI,
HE_LockW,
HE_ScreenMode,
HE_CScreen,
HE_MPILoad,
HE_MPIScale,
HE_MPG,
HE_APort,
HE_GENT,

// Control Window
H_CWindow,

// Control Window gadgets
H_CClose,
H_CDrag,
H_CDepth,

HC_First,
HC_Previous,
HC_Goto,
HC_Next,
HC_Last,

// Control Window Menus
H_CM,

H_CMP,

H_CMPN,
H_CMPO,
H_CMPS,
H_CMPSA,
H_CMPA,
H_CMPE,
H_CMPQ,

H_CME,

H_CMEG,
H_CMET,

H_CMEF,

H_CMEFF,
H_CMEFP,
H_CMEFG,
H_CMEFN,
H_CMEFL,

H_CMSM,

// Edit Modes
H_EOne,
H_ETwo,
H_ERel,
H_EAdd,
H_EDel,
H_ELnk,
H_EUnl,
H_EMov,

// Edit Window
H_EWindow,

// Edit Window Gadgets
H_EClose,
H_EDrag,
H_EZoom,
H_EDepth,
H_Vert,
H_Up,
H_Down,
H_Horiz,
H_Left,
H_Right,
H_ESize,

// Requesters

// Unsaved Project
H_Unsaved,

// Goto Frame Number
H_FrameNumber,

// About
H_ABOUT,

};

/* Defines for the Disabled Messages */
#define DI_Zoom		1000
#define DI_WaitSS		1001
#define DI_WaitOpen	1002
#define DI_WaitSave	1003
#define DI_Delete		1004
#define DI_About		1005
#define DI_Image1		1006
#define DI_Image2		1007
#define DI_Draw		1008
#define DI_Grid		1009
#define DI_Unsaved	1010
#define DI_Preview	1011
#define DI_LoadBrush	1012
#define DI_New			1013
#define DI_GetFrame	1014
#define DI_NextFrame	1015
#define DI_Triangulate	1016
#define DI_Scale2		1017
#define DI_SetSize	1018
#define DI_Scale		1019
#define DI_Rexx		1020
#define DI_RexxScr	1021
#define DI_Macro		1022
#define DI_Learn		1023

/* MPMorph.c	*/

/* Libraries	*/
extern struct IntuitionBase *IntuitionBase;
extern struct Library	*GfxBase,
					*LayersBase,
					*InputBase,
					*GadToolsBase,
					*AslBase,
					*UtilityBase,
					*DiskfontBase,
					*AmigaGuideBase,
					*IconBase,
					*ReqToolsBase,
					*WorkbenchBase,
					*LocaleBase;
extern struct RxsLib *RexxSysBase;

extern struct Catalog *Catalog;

/* Externals defined	*/
extern struct gadgetsizing		gs[];			/* Size of system gadgets		*/

extern UWORD 						Mode;			/* Current editing mode			*/
extern struct List				PointList;	/* List of Points					*/
extern struct Picture 			Pic1,			/* 1st								*/
										Pic2;			/* and 2nd images					*/
extern BOOL							Pic1_Open;	/* If 1st							*/
extern BOOL							Pic2_Open;	/* and 2nd images are open		*/
extern struct FileRequester	*filereq;	/* General use file requester	*/
extern BOOL							Saved;		/* Set to FALSE after editing	*/
extern char							savedfilename[256];	/* Current project file name	*/
extern LONG							Width,		/* Width and						*/
										Height;		/* Height of project				*/
extern LONG							SinglePicture;	/* TRUE for Warps				*/
extern BOOL							Zoom;				/* TRUE if current Zoomed	*/
extern BOOL							ZoomAllowed;	/* FALSE to save memory		*/
extern char							**ArgArray;			/* Parameter/ToolTypes				*/
extern char							**ArgArraySettings;/* From settings file				*/
extern AMIGAGUIDECONTEXT		handle;		/* Help handle						*/
extern BOOL							CreateIcons;/* TRUE if to write Icons		*/
extern BOOL							CreateIconsP;/* TRUE if to write prefs Icons	*/
extern BOOL							KeepSettings;/* TRUE to save settings on quit */
extern char							ScreenName[];
extern char							PreviewScript[];
extern char							CustomName[];
extern ULONG						CustomDepth;
extern BOOL							OpenedScreen;
extern ULONG						ASig;			/* Amiga guide signal			*/
extern int							changedboxcount;	// Used to redraw points after resizing BOTH windows
extern UWORD						n;					// Holds screen resolution
extern LONG 						MaxWidth;		// Max x of points
extern LONG							MaxHeight;		// Max y of points
extern BOOL							GHelp;			// Gadget Help?
extern struct NewAmigaGuide	nag;				// .guide stuff
extern BOOL							EGS;				// Use EGS picture window
extern ULONG						HelpGroup;		// Help Group for GadgetHelp
extern float						xfact;			//	X Scale to get from image size to point size
extern float						yfact;			// Y Scale
extern int							RexxQuitFlag;	// Quit from ARexx
extern BOOL							Disabled;		// Set if we are disabled
extern char							Recent1[256];	// Recently opened files
extern char							Recent2[256];
extern char							Recent3[256];
extern char							Recent4[256];
extern char							Recent5[256];
extern char							User2[128];
extern char							User3[128];
extern char							User4[128];
extern char							User5[128];
extern char							User6[128];
extern char							User7[128];
extern char							User8[128];
extern char							User9[128];
extern struct MsgPort			*AMsgPortp;			// Message port for AppWindows
extern struct AppWindow			*AppWindow;
extern struct MsgPort			*WMsgPortp;
extern ULONG 						USecs,Um;			// Time of last update

extern LONG							Start;

extern BPTR RecordBPTR;
extern char RecordFName[];

extern LONG FrameNumber;
extern BOOL ARexxLock;

extern struct RexxHost *myhost;

// Arb stuff
#include "a/MPMorph.h"

/* Prototypes	*/
void About(void);
extern struct Hook ProgressHook;
int main(int argc,char **argv);
BOOL openAPicture(char *filename,struct Picture *Pic,BOOL Gui);
void CloseAPicture(struct Picture *pic);
void doNewSize(struct Picture *pic);
void checkGadget(struct Picture *pic);
void UpdatePens(struct MyPoint *MyPoint);
void DrawPixels(struct Picture *pic,SHORT x,SHORT y,struct MyPoint *MyPoint);
void DeleteAllPoints(void);
BOOL MyOpen(char *filename,BOOL JustPoints,BOOL Gui);
BOOL ISaveAs(char *filename,BOOL errors);
BOOL SaveAs(char *filename);
void MySetMode(UWORD NewMode);
void doMsgLoop(void);
void SetMyPointer(void);
int DoMenu(struct Picture *pic,UWORD Selection);
void DisableWindows(ULONG dnum);
void EnableWindows(void);
void Vanilla(ULONG code);
void MouseButtons(struct Picture *pic,ULONG code,ULONG seconds);
void MouseMove(struct Picture *pic);

/* Defines for Image movement gadgets IDS	*/
#define NO_GADGET				(0)
#define UP_DOWN_GADGET		(1)
#define LEFT_RIGHT_GADGET	(2)
#define UP_GADGET				(3)
#define DOWN_GADGET			(4)
#define LEFT_GADGET			(5)
#define RIGHT_GADGET			(6)

/* Defines for Edit mode	*/
#define EDIT1		1	// moving points in one window
#define EDIT2		2	// moving points in both windows absolutely
#define EDITREL	3	// moving points in both windows relatively
#define ADD			4	// Adding points
#define DELETE		5	// Deleting points
#define LINK1		6	// Linking points - select 1st point
#define UNLINK1	7	// Unlinkg points
#define LINK2		8	// Linking points - select 2nd point
#define LINK2A		9	// Linking points - 2nd point selected
#define UNLINK2	10	// Unlinking points - select 2nd point
#define UNLINK2A	11	// Unlinking points - 2n point selected
#define NONE		12	// Just scrolling the windows

/* Defines for MPMorph project menus */
#define M_M_PROJECT 		0

#define M_MM_NEW			0
#define M_MM_OPEN			1
#define M_MM_RECENT		2

#define M_MI_RECENT1		0
#define M_MI_RECENT2		1
#define M_MI_RECENT3		2
#define M_MI_RECENT4		3
#define M_MI_RECENT5		4

#define M_MM_B1			3
#define M_MM_SAVE			4
#define M_MM_SAVEAS		5
#define M_MM_DELETE		6
#define M_MM_B2			7
#define M_MM_ABOUT		8
#define M_MM_B3			9
#define M_MM_EDITPOINTS	10
#define M_MM_B4			11
#define M_MM_QUIT			12

#define M_M_SETTINGS		1

#define M_M_USER			2

/* Defines for menu items	*/
#define M_PROJECT			0	// Project menu

#define MM_NEW				0
#define MM_OPEN			1
#define MM_B1				2
#define MM_SAVE			3
#define MM_SAVEAS			4
#define MM_B2				5
#define MM_ABOUT			6
#define MM_B3				7
#define MM_EXITPOINTS	8
#define MM_B4				9
#define MM_QUIT			10

#define M_EDIT				1	// Edit menu

#define MM_GRID			0
#define MM_TRIANGULATE	1
#define MM_FRAME			2	// Frame sub-menu

#define MI_FIRST			0
#define MI_PREV			1
#define MI_GOTO			2
#define MI_NEXT			3
#define MI_LAST			4

#define MM_MODE			3	// Mode sub-menu

#define MI_EDITONE		0
#define MI_EDITTWO		1
#define MI_EDITREL		2
#define MI_ADD				3
#define MI_DELETE			4
#define MI_LINK			5
#define MI_UNLINK			6
#define MI_NONE			7

#define M_SETTINGS		2	// Settings menu

#define MM_ICONS			0
#define MM_ZOOM			1

#define MM_SCREEN			2
#define MM_CUSTOM			3
#define MM_SPREVIEW		4

#define MM_C1				5
#define MM_ICONSP			6
#define MM_KEEPS			7
#define MM_LOADS			8
#define MM_SAVES			9
#define MM_SAVESAS		10
#define MM_C2				11
#define MM_RESETD			12
#define MM_LASTS			13
#define MM_RESTORE		14
#define MM_C4				15
#define MM_HELP			16

#define M_USER				3
#define MM_PREVIEW		0
#define MM_USER2			1
#define MM_USER3			2
#define MM_USER4			3
#define MM_USER5			4
#define MM_USER6			5
#define MM_USER7			6
#define MM_USER8			7
#define MM_USER9			8
#define MM_D1				9
#define MM_STARTLEARN	10
#define MM_STOPLEARN		11
#define MM_MACRO			12

/* Subroutines.c	*/

extern char TempFilename[256];		// File name used to get a file name
extern struct Screen *myscreen;		// Opened screen
extern int MPHnum;						// Help Num for gui

/* Prototypes	*/
ULONG __saveds __asm HelpHook(register __a0 struct Hook *hook,
								  register __a2 char *name,
								  register __a1 APTR notused);
void ihelp(ULONG helpnum);
void help(ULONG helpnum);
void MyArgArrayInit(int argc,char **argv,char *prefsfile,char *prefsdir);
void MyArgArrayDone(void);
UBYTE *MyArgString(UBYTE *arg2,UBYTE *arg3,BOOL reopen);
ULONG MyArgInt(UBYTE *arg2, long arg3,BOOL reopen);
BOOL MyFindToolType(UBYTE *arg2,BOOL reopen);
void OpenNewArgs(UBYTE *filename);
void CloseWindowSafely(struct Window *win);
void StripIntuiMessages(struct MsgPort *mp,struct Window *win);
void Error(char *ErrorMessage,char *Gadget,char *extra,ULONG helpnum);
void DrawAllPoints(void);
BOOL ReallySetSize(int x,int y);
BOOL ReallyScale(int x,int y);
void OpenPointsEdit(void);
void AddGrid(void);
BOOL ReallyAddGrid(int xgrid,int ygrid);
void DoMenuHelp(USHORT code);
BOOL SaveRequester(void);
void LinkPoints(struct MyPoint* MyPoint,struct MyPoint *MyPoint1);
void UnlinkPoints(struct MyPoint* MyPoint,struct MyPoint *MyPoint1,BOOL Draw);
void UnlinkAllPoints(BOOL Draw);
struct MyPoint *FindPoint(struct Picture *pic,WORD x,WORD y);
VOID DeletePoint(struct MyPoint* MyPoint);
void MyDraw(struct RastPort *rp, LONG x, LONG y, LONG oldx, LONG oldy);
BOOL GetAFile(char *name,char *Prompt,ULONG flags, UBYTE *Pattern,char *positive);
void LimitPoints(LONG *x,LONG *y,struct Picture *pic);
void InitParams(BOOL firstcall);
void UpdateParams(ULONG OZoom);
int Preview(void);
LONG SendRxMsg(char *msgtxt,BOOL IgnoreError);
BOOL OpenCustomScreen(void);
void CloseCustomScreen(void);
BOOL Triangulate(void);
BOOL GenerateTriangles(void);
int *IntVect(int ncols);
void MyFreeVecti(int *vectptr);
int **IntMatrix(int nrows, int ncols);
void FreeMatrixi(int **matptr);
double **DoubleMatrix(int nrows, int ncols);
void FreeMatrixd(double **matptr);
extern void UserMenu(ULONG Selection);
extern void Record(char *Main,ULONG first,...);
extern int HelpLeft;
extern int HelpTop;
extern int HelpWidth;
extern int HelpHeight;
extern void SetMax(int max);
extern void SetCurr(int curr);
extern void SetMessage(char *message);

/* Brush images	*/
extern struct Image Add_im;
extern struct Image Del_im;
extern struct Image Link_im;
extern struct Image None_im;
extern struct Image One_im;
extern struct Image Rel_im;
extern struct Image Two_im;
extern struct Image Unlink_im;
extern struct Image st_im;
extern struct Image prev_im;
extern struct Image goto_im;
extern struct Image next_im;
extern struct Image last_im;

extern struct Image Add_imx;
extern struct Image Del_imx;
extern struct Image Link_imx;
extern struct Image None_imx;
extern struct Image One_imx;
extern struct Image Rel_imx;
extern struct Image Two_imx;
extern struct Image Unlink_imx;
extern struct Image st_imx;
extern struct Image prev_imx;
extern struct Image goto_imx;
extern struct Image next_imx;
extern struct Image last_imx;

/* LoadBrushes.c		*/
int myloadbrush(UBYTE *filename);
void mycopysprite(UWORD *address,UBYTE *filaname);
void mycopybrush(struct Image *im,UBYTE *filename,UWORD size);
void invertbrush(struct Image *im,UWORD size);
void LoadBrushes(void);

/* ControlWindow.c	*/
extern struct Image *Check;
extern struct Image *Amiga;

/* Gadgets	*/
extern struct Gadget OneGadget;
extern struct Gadget TwoGadget;
extern struct Gadget RelGadget;
extern struct Gadget MyAddGadget;
extern struct Gadget DelGadget;
extern struct Gadget LinkGadget;
extern struct Gadget UnlinkGadget;
extern struct Gadget NoneGadget;
extern struct Gadget stGadget;
extern struct Gadget prevGadget;
extern struct Gadget gotoGadget;
extern struct Gadget nextGadget;
extern struct Gadget lastGadget;

/* Defines for Image sizes	*/
#define IMAGE_WIDTH	38		/* The width of a Control Window gadget 	*/
#define IMAGE_HEIGHT	34		/* and the Height									*/
#define AIMAGE			15		/* Arrow image size								*/

/* Defines for MPMorph project menus in array*/
#define M_NM_PROJECT 	0

#define M_NM_NEW			1
#define M_NM_OPEN			2
#define M_NM_RECENT		3
#define M_NM_RECENT1		4
#define M_NM_RECENT2		5
#define M_NM_RECENT3		6
#define M_NM_RECENT4		7
#define M_NM_RECENT5		8
#define M_NM_B1			9
#define M_NM_SAVE			10
#define M_NM_SAVEAS		11
#define M_NM_DELETE		12
#define M_NM_B2			13
#define M_NM_ABOUT		14
#define M_NM_B4			15
#define M_NM_EDITPOINTS	16
#define M_NM_B3			17
#define M_NM_QUIT			18

#define M_NM_SETTINGS	19

#define M_NM_CREATEICONS		20
#define M_NM_ZOOM				21
#define M_NM_SCREEN				22
#define M_NM_CUSTOM				23
#define M_NM_SPREVIEW			24

#define M_NM_ICONSP				26
#define M_NM_KEEPS				27
#define M_NM_LOADS				28
#define M_NM_SAVES				29
#define M_NM_SAVESAS			30

#define M_NM_RESETD				32
#define M_NM_LASTS				33
#define M_NM_RESTORE			34

#define M_NM_HELP				36

#define M_NM_USER				37
#define M_NM_UPREVIEW			38
#define M_NM_USER2				39
#define M_NM_USER3				40
#define M_NM_USER4				41
#define M_NM_USER5				42
#define M_NM_USER6				43
#define M_NM_USER7				44
#define M_NM_USER8				45
#define M_NM_USER9				46

#define M_NM_STARTLEARNING		48
#define M_NM_STOPLEARNING		49
#define M_NM_MACRO				50

/* Defines for menu items in array */
#define NM_PROJECT			0
#define NM_NEWPOINTS			1
#define NM_OPENPOINTS		2

#define NM_SAVE				4
#define NM_SAVEAS				5

#define NM_ABOUT				7

#define NM_EXITPOINTS		9

#define NM_QUIT				11

#define NM_EDIT				12
#define NM_ADDGRID			13
#define NM_TRIANGULATE		14
#define NM_FRAME				15
#define NM_FIRST				16
#define NM_PREVIOUS			17
#define NM_GOTO				18
#define NM_NEXT				19
#define NM_LAST				20
#define NM_EMODE				21
#define NM_M_ONE				22
#define NM_M_TWO				23
#define NM_M_REL				24
#define NM_M_ADD				25
#define NM_M_DEL				26
#define NM_M_LNK				27
#define NM_M_UNL				28
#define NM_M_MOV				29
#define NM_SETTINGS			30
#define NM_CREATEICONS		31
#define NM_ZOOM				32
#define NM_SCREEN				33
#define NM_CUSTOM				34
#define NM_SPREVIEW			35

#define NM_ICONSP				37
#define NM_KEEPS				38
#define NM_LOADS				39
#define NM_SAVES				40
#define NM_SAVESAS			41

#define NM_RESETD				43
#define NM_LASTS				44
#define NM_RESTORE			45

#define NM_HELP				47

#define NM_USER				48
#define NM_UPREVIEW			49
#define NM_USER2				50
#define NM_USER3				51
#define NM_USER4				52
#define NM_USER5				53
#define NM_USER6				54
#define NM_USER7				55
#define NM_USER8				56
#define NM_USER9				57

#define NM_STARTLEARNING	59
#define NM_STOPLEARNING		60
#define NM_MACRO				61

/* IDCMP without verify */
#define MYIDCMP_NOVERIFY	(IDCMP_IDCMPUPDATE | IDCMP_GADGETUP | IDCMP_GADGETDOWN |\
	IDCMP_NEWSIZE | IDCMP_MOUSEBUTTONS | IDCMP_MOUSEMOVE |\
   IDCMP_MENUPICK | IDCMP_CLOSEWINDOW |\
   IDCMP_MENUHELP | IDCMP_RAWKEY | IDCMP_VANILLAKEY |\
   IDCMP_ACTIVEWINDOW | IDCMP_INACTIVEWINDOW | IDCMP_CHANGEWINDOW |\
   IDCMP_GADGETHELP)

/* IDCMP with verify    */
#define MYIDCMP_VERIFY (MYIDCMP_NOVERIFY | IDCMP_MENUVERIFY)

/* Externals defined	*/
extern struct NewMenu MyNewMenu[];
extern struct Window	*ControlWindow;
extern struct Menu 	*MyMenu;
extern UBYTE			*CWTitle;

/* Prototypes	*/
struct Window *OpenControlWindow(void);
void CloseControlWindow(void);
void UpdateMenuDefs(void);

/* help.c */
extern unsigned char *context[];
extern short ShortHelp[];
extern short disabled[];

/* Args.c	*/
void argArrayDone( void );
char **argArrayInit( LONG argc, char **argv, char *prefsfile);

/* Frames.c	*/
int FirstFrame(void);
int PrevFrame(void);
int GotoFrame(void);
int NextFrame(void);
int LastFrame(void);
BOOL GetFrameNumber(void);
int ReopenPictures(void);
BOOL ReopenAPicture(char *filename,struct Picture *pic);

/* HandleSettings.c */
void RemoveMenus(void);
void AddMenus(void);
void UnZoom(void);
void ReZoom(void);
void SwitchMenuItem(UWORD pos,BOOL setting,BOOL remove);
void HandleSettings(UWORD Selection,struct Picture *pic);

void SaveSettings(char *filename);
void LoadSettings(char *filename);

/* Messages.c */
char *MyGetMsg(UWORD MsgNo);

#include "EGSStuff.h"

#endif
