#ifndef __RESOURCE_H
#define __RESOURCE_H

#include <exec/types.h>
#include <intuition/intuition.h>
#include <graphics/gfx.h>
#include <libraries/gadtools.h>
#include <utility/tagitem.h>

#define R_MEMORY 		0
#define R_SCREEN		1
#define R_LIBRARY		2
#define R_BLANK		3
#define R_MSGPORT		4
#define R_IOREQUEST	5
#define R_DEVICE		6
#define R_FUNCTION	7
#define R_VEC			8
#define R_SIGNAL		9
#define R_FILE			10
#define R_VISUAL		11
#define R_MENU			12
#define R_WINDOW		13
#define R_MENUSTRIP	14
#define R_LOCKSCREEN 15
#define R_BITMAP 16

#define E_RETRYERROR		0x0001
#define E_NOTIFYERROR	0x0002
#define E_FATALERROR		0x0004
#define E_PLACE			0x0008

typedef struct s_ResourceList {
	struct s_ResourceList *prev;
	struct s_ResourceList *next;
	int type;
	APTR item;
} ResourceList;


extern struct Bitmap *R_AllocBitMap(register __d0 ULONG width,register __d1 ULONG height,register __d2 ULONG depth,register __d3 UWORD flags);
extern struct Screen *R_LockPubScreen(register __a0 UBYTE *scrName,register __d0 UWORD flags);
extern void R_SetMenuStrip(register __a0 struct Window *w_Win,register __a1 struct Menu *w_menu,register __d0 UWORD flags);
extern APTR R_GetVisualInfo(register __a0 struct Screen *g_Scr,register __a1 struct TagItem *g_Tags,register __d0 UWORD flags);
extern struct Menu *R_CreateMenus(register __a0 struct NewMenu *,register __a1 struct TagItem *g_Tags,register __d0 UWORD flags);
extern struct Window *R_OpenWindowTags(register __a0 struct NewWindow *nWin,register __a1 struct TagItem *w_Tags,register __d0 UWORD flags);
extern ULONG OpenFile(register __d1 STRPTR fileName,register __d2 ULONG accessMode,register __d3 UWORD flags);
extern void StartResource(void);
extern APTR GetMem(register __d0 ULONG memSize,register __d1 ULONG memType,register __d2 UWORD flags);
extern struct Library *R_OpenLibrary(register __a1 STRPTR libName,register __d0 ULONG version,register __d1 UWORD flags);
extern struct MsgPort *R_NewMsgPort(register __d0 UWORD flags);
extern struct IORequest *R_NewIORequest(register __a0 struct MsgPort *msgPort,register __d0 ULONG size,register __d1 flags);
extern UWORD OpenDeviceRes(register __a0 STRPTR devName,register __d0 ULONG devNum,register __a1 struct IORequest *devIO,register __d1 ULONG devFlags,register __a2 UBYTE *useF,register __d2 UWORD flags);
extern BYTE NewSignal(register __d0 BYTE signalNum,register __d1 UWORD flags);
extern APTR GetVec(register __d0 ULONG byteSize,register __d1 ULONG attributes,register __d2 UWORD flags);
extern register __a0 ResourceList *Res_PlaceList(register __d0 UWORD type,register __d1 ULONG itemSize,register __d2 APTR item);
extern ResourceList *ActivateNewResource(void);
extern void RemoveResource(register __d0 ResourceList *oldList);
extern void ActivateResource(register __d0 ResourceList *actList);
extern void FreeAll(void);
extern void Res_FreeResource(void);
extern UWORD ProduceError(register __a0 STRPTR errorMsg,register __d0 UWORD errFlags);
extern UWORD RetryError(register __a0 STRPTR errorMsg);
extern void NotifyError(register __a0 STRPTR errorMsg);
extern void FatalError(register __a0 STRPTR errorMsg);

#endif