/*
 * Scan 'C' Header File
 * Written by Thomas Krehbiel
 *
 * ScanBase prototypes.
 *
 */

#ifndef SCAN_PROTOS_H

#ifndef EXEC_TYPES_H
#include <exec/types.h>
#endif
#ifndef SCAN_DRAW_H
#include <scan/draw.h>
#endif
#ifndef SCAN_WEDGE_H
#include <scan/wedge.h>          /* for WedgeProto */
#endif

#ifndef REGARGS

#define __STD(A,F)    A F
#define __REG(A,F)    A F

#define __D0
#define __D1
#define __D2
#define __D3
#define __D4
#define __D5
#define __D6
#define __D7
#define __A0
#define __A1
#define __A2
#define __A3
#define __A4
#define __A5
#define __A6

#else

#ifdef LATTICE
 #define __STD(A,F)    A F
 #define __REG(A,F)    A __asm F
#endif

#ifdef _DCC
 #define __STD(A,F)    A F
 #define __REG(A,F)    __regargs A F
#endif

#define __D0            register __d0
#define __D1            register __d1
#define __D2            register __d2
#define __D3            register __d3
#define __D4            register __d4
#define __D5            register __d5
#define __D6            register __d6
#define __D7            register __d7
#define __A0            register __a0
#define __A1            register __a1
#define __A2            register __a2
#define __A3            register __a3
#define __A4            register __a4
#define __A5            register __a5
#define __A6            register __a6

#endif

/*
 * Scan.library functions:
 */

__REG(void,             HidePanel) (void);
__REG(void,             ShowPanel) (void);
__REG(void,             ArrangePanel) (void);
__REG(void,             ShowStatus) (__A0 struct Buffer *buf);

__REG(void,             BeginBar) (__A0 char *, __D0 int, __D1 BOOL);
__REG(void,             EndBar) (__A0 char *);
__REG(int,              Bar) (__D0 int);

__REG(void,             Error) (void);
__REG(void,             VErrorf) (__A0 char *, __A1 ULONG *);
__REG(void,             TogglePanel) (void);

__REG(int,              SerOpen) (__A0 char *, __D0 int, __D1 long, __D2 BOOL);
__REG(void,             SerClose) (void);
__REG(void,             SerBaud) (__D0 long);
__REG(void,             SerRead) (__A0 UBYTE *, __D0 int);
__REG(int,              TimedSerRead) (__A0 UBYTE *, __D0 int, __D1 int);
__REG(void,             SerPutc) (__D0 UBYTE);
__REG(void,             SerWrite) (__A0 UBYTE *, __D0 int);
__REG(void,             SerFlush) (void);
__REG(void,             SerDisable) (void);
__REG(void,             SerEnable) (void);
__REG(int,              SerDirect) (void);

__REG(void,             Ged_Set) (__A0 struct Window *, __D0 short, __D1 long);
__REG(long,             Ged_Get) (__A0 struct Window *, __D0 short);
__REG(void,             Ged_Activate) (__A0 struct Window *, __D0 short);
__REG(void,             Ged_Enable) (__A0 struct Window *, __D0 short, __D1 short);

__REG(struct BitMap *,  AllocChipBitMap) (__D0 int w, __D1 int h, __D2 int d);
__REG(struct BitMap *,  AllocFastBitMap) (__D0 int w, __D1 int h, __D2 int d);
__REG(void,             DeleteBitMap) (__A0 struct BitMap *bm);
__REG(void,             ClearBitMap) (__A0 struct BitMap *bm);
__REG(int,              CopyBitMap) (__A0 struct BitMap *src, __A1 struct BitMap *dst);

__REG(void,             SetError) (__D0 int code);
__REG(int,              GetError) (void);

__REG(void *,           DAlloc) (__D0 ULONG, __D1 ULONG, __A0 char *, __A1 char *, __D2 LONG);
__REG(void,             DFree) (__A1 void *, __D0 ULONG, __A0 char *, __A2 char *, __D1 LONG);

__REG(int,              IsBuffer) (void);
__REG(void,             FreeBuffer) (void);
__REG(int,              InitBuffer) (__A0 char *, __D0 LONG, __D1 LONG, __D2 LONG, __D3 LONG, __D4 ULONG);
__REG(struct Buffer *,  ObtainBuffer) (__D0 int);
__REG(void,             ReleaseBuffer) (__A0 struct Buffer *);
__REG(int,              GetBufLine) (__A0 struct Buffer *, __A1 UBYTE **, __A2 UBYTE **, __A3 UBYTE **, __D0 LONG);
__REG(int,              PutBufLine) (__A0 struct Buffer *);
__REG(int,              PutNewBufLine) (__A0 struct Buffer *, __A1 UBYTE *, __A2 UBYTE *, __A3 UBYTE *, __D0 LONG);
__REG(int,              PutNewBufLine1) (__A0 struct Buffer *, __A1 UBYTE *, __D0 LONG, __D1 LONG);
__REG(int,              GetBufVLine) (__A0 struct Buffer *, __A1 UBYTE **, __A2 UBYTE **, __A3 UBYTE **, __D0 LONG);
__REG(int,              PutBufVLine) (__A0 struct Buffer *);
__REG(int,              PutNewBufVLine) (__A0 struct Buffer *, __A1 UBYTE *, __A2 UBYTE *, __A3 UBYTE *, __D0 LONG);
__REG(int,              PutNewBufVLine1) (__A0 struct Buffer *, __A1 UBYTE *, __D0 LONG, __D1 LONG);

__REG(void,             RenderVirtual) (void);
__REG(void,             RenderPartVirtual) (__D0 LONG, __D1 LONG, __D2 LONG, __D3 LONG);
__REG(void,             VirtualTranslate) (__A0 short *, __A1 short *);
__REG(void,             GetVCoords) (__A0 struct IntuiMessage *, __A1 short *, __A2 short *);
__REG(void,             VirtRow24) (__A0 UBYTE *, __A1 UBYTE *, __A2 UBYTE *, __D0 LONG, __D1 LONG);
__REG(void,             ColorVirtual) (__D0 LONG);
__REG(void,             ClearVirtual) (void);
__REG(void,             VirtRow8) (__A0 UBYTE *, __D0 LONG, __D1 LONG, __D2 LONG);
__REG(void,             VirtCol8) (__A0 UBYTE *, __D0 LONG, __D1 LONG, __D2 LONG);
__REG(void,             VirtualTempClose) (void);
__REG(void,             VirtualTempOpen) (void);

__REG(void,             RequestNewRender) (void);

__REG(BOOL,             DoQuantize) (__D0 short, __D1 short, __A0 struct Buffer *, __A1 struct Mask *, __A2 UBYTE *, __D2 short);

__REG(struct Buffer *,  AllocBuffer) (__A0 char *, __D0 short, __D1 short, __D2 short, __D3 short, __D4 short);
__REG(int,              ReplaceBuffer) (__A0 struct Buffer *, __A1 struct Buffer *);
__REG(void,             KillBuffer) (__A0 struct Buffer *);

__REG(BOOL,             ProcessRegion) (__A0 char *, __A1 struct Buffer *, __A2 struct Mask *, __A3 void (*)(UBYTE *, UBYTE *, UBYTE *), __A4 void (*)(UBYTE *));
__REG(BOOL,             ProcessPlane) (__A0 char *, __A1 struct Buffer *, __A2 struct Mask *, __D0 short, __A3 void (*)(UBYTE *));
__REG(BOOL,             SaveUndo) (__A0 struct Buffer *, __D0 short, __D1 short, __D2 short, __D3 short);
__REG(BOOL,             RestoreUndo) (__D0 BOOL);

__REG(BOOL,             InitHook) (void);
__REG(void,             CleanupHook) (void);
__REG(BOOL,             EasyProcess) (__A0 char *, __A1 void (*)(UBYTE *, UBYTE *, UBYTE *, short, short), __A2 void (*)(UBYTE *, short, short));

__REG(void,             PreOverscan) (__A0 struct NewScreen *);
__REG(void,             PostOverscan) (__A0 struct Screen *);

__REG(BOOL,             VBoolRequest) (__A0 char *, __A1 ULONG *);
__REG(char *,           StringRequest) (__A0 char *, __A1 char *);
__REG(long,             IntegerRequest) (__A0 char *, __D0 long, __D1 long, __D2 long);

__REG(BOOL,             SetCurrentPalette) (__A0 UBYTE *pal, __D0 int count);
__REG(BOOL,             GetPaletteStruct) (__A0 struct Palette *pal);
__REG(BOOL,             IsRangeLocked) (__D0 short range);
__REG(BOOL,             IsRegisterLocked) (__D0 short reg);
__REG(void,             ModifyPalette) (__D0 short reg, __D1 short r, __D2 short g, __D3 short b);
__REG(short,            UnlockedColors) (__D0 short);
__REG(void,             RefreshPalette) (void);

__REG(struct Screen *,  OpenRenderScreen) (__A0 struct NewScreen *, __D0 ULONG, __D1 ULONG);
__REG(void,             CloseRenderScreen) (__A0 struct Screen *);
__REG(void,             DrawRenderArea) (void);

__REG(void,             SetModGad) (__A0 struct ModuleBase *, __D0 int, __D1 long);
__REG(short,            Ged_Create) (__A0 struct GedContext *, __A1 struct NewGad *, __A2 char **);
__REG(void,             Ged_Delete) (__A0 struct GedContext *);
__REG(void,             Ged_Add) (__A0 struct GedContext *, __A1 struct Window *);
__REG(void,             Ged_Remove) (__A0 struct GedContext *, __A1 struct Window *);
__REG(int,              ScanWindow) (__A0 struct NewWindow *, __A1 struct NewGad *, __D0 int, __A2 int (*)(struct Window *, struct NewGad *), __A3 int (*)(struct Window *, struct Gadget *), __A4 char **);
__REG(struct IntuiMessage *, Ged_GetIMsg) (__A0 struct Window *, __A1 short *);

__REG(void,             VInfoRequest) (__A0 char *, __A1 ULONG *);

__REG(BOOL,             CheckMask) (__A0 struct Mask *, __D0 short, __D1 short);

__REG(void,             RollScreenUp) (__D0 int);
__REG(void,             RollScreenDown) (void);

__REG(void,             InstallCustomMask) (__A0 struct Mask *);
__REG(void,             FreeMask) (__A0 struct Mask *);
__REG(struct Mask *,    BuildRectMask) (__D0 short, __D1 short, __D2 short, __D3 short);
__REG(struct Mask *,    BuildOvalMask) (__D0 short, __D1 short, __D2 short, __D3 short, __D4 BOOL);
__REG(struct Mask *,    BuildPolyMask) (__A0 POINT *);
__REG(struct Mask *,    BuildFloodMask) (__A0 struct Buffer *, __D0 short, __D1 short, __D2 short);
__REG(void,             SetRegionTool) (__D0 short);

__REG(BOOL,             SaveBuffer) (__A0 char *, __A1 char *, __A2 char *);
__REG(BOOL,             LoadBuffer) (__A0 char *, __A1 char *, __D0 int);

__REG(int,              ParseCommand) (__A0 char *, __A1 struct RexxMsg *);
__REG(BOOL,             RenderPalette) (__A0 struct Buffer *, __A1 struct Mask *, __D0 int, __A2 UBYTE *, __D1 int);

__REG(void,             RedrawFull) (void);
__REG(void,             RedrawArea) (__D0 int, __D1 int, __D2 int, __D3 int);

__REG(int,              ListRequester) (__A0 char *, __A1 struct ListView *, __D0 int);

__REG(int,              VThreeRequest) (__A0 char *, __A1 char *, __A2 char *, __A3 char *, __A4 ULONG *);

__REG(BOOL,             UnlockResource) (__D0 ULONG);
__REG(void,             RelockResource) (__D0 ULONG);
__REG(char *,           NewGetFile) (__A0 struct FileInfo *, __A1 char *, __D0 ULONG);
__REG(BOOL,             TakeOver) (__D0 BOOL);
__REG(struct Buffer *,  ReadBuffer) (__A0 char *, __A1 char *);
__REG(BOOL,             SaveBrush) (__A0 struct Buffer *, __A1 char *, __A2 char *, __A3 char *);

__REG(BOOL,             SaveMapped) (__A0 char *, __A1 char *, __A2 struct MappedImage *, __A3 char *);

__REG(struct BIO *,     BOpen) (__A0 char *, __D0 ULONG, __D1 ULONG);
__REG(void,             BClose) (__A0 struct BIO *);
__REG(BOOL,             BPutc) (__A0 struct BIO *, __D0 UBYTE);
__REG(BOOL,             BPuts) (__A0 struct BIO *, __A1 UBYTE *);
__REG(int,              BGetc) (__A0 struct BIO *);
__REG(int,              BGets) (__A0 struct BIO *, __A1 UBYTE *, __D0 int);
__REG(int,              BWrite) (__A0 struct BIO *, __A1 UBYTE *, __D0 int);
__REG(int,              BRead) (__A0 struct BIO *, __A1 UBYTE *, __D0 int);

__REG(void,             CloseWindowSafely) (__A0 struct Window *);

__REG(void,             RequestNewScanner) (void);
__REG(void,             RequestNewPrinter) (void);

__REG(BOOL,             VSetResult) (__A0 struct RexxMsg *, __A1 char *, __A2 ULONG *);

__REG(void,             PrepareNW) (__A0 struct NewWindow *, __D0 int, __D1 int, __D2 BOOL);

__REG(void,             GetPalette) (__D0 short, __A0 short *, __A1 short *, __A2 short *);

__REG(char **,          ReadText) (__A0 char *, __D0 int);
__REG(void,             FreeText) (__A0 char **, __D0 int);

__REG(struct DitherArgs *, InitDither) (__A0 struct NewGad *, __A1 struct NewGad *, __A2 struct NewGad *);
__REG(void,             FreeDither) (__A0 struct DitherArgs *);
__REG(void,             DoDither) (__A0 struct Buffer *, __A1 struct DitherArgs *);
__REG(void,             Help) (__A0 char *, __A1 char *);

__REG(BOOL,             AddRawWedge) (__A0 char *, __A1 int (*)(WedgeProto), __A2 ULONG);
__REG(void,             RemoveWedge) (__A0 char *, __A1 char *);
__REG(void,             RemoveAllWedges) (void);
__REG(BOOL,             VDoRawWedge) (__A0 char *, __A1 VOID *, __A2 ULONG *);
__REG(void,             QuickPix) (__A0 UBYTE **, __A1 LONG *, __A2 LONG *, __D0 LONG, __D1 LONG);
__REG(void,             QuickLine) (__A0 UBYTE **, __A1 LONG *, __A2 LONG *, __A3 UBYTE *, __D0 LONG, __D1 LONG);

__REG(int,              GedWin) (__A0 struct NewWindow *, __A1 struct NewGad *, __D0 int, __A2 int (*)(), __A3 int (*)(), __A4 char **);
__REG(int,              VMWriteAll) (__A0 struct VM_Handle *);
__REG(void,             VMPageChanged) (__A0 struct VM_Handle *, __D0 ULONG);
__REG(APTR,             VMGetPage) (__A0 struct VM_Handle *, __D0 ULONG);

__REG(long,             NumberRequest) (__A0 char *, __D0 long, __D1 long, __D2 long);

__REG(void,             BFlush) (__A0 struct BIO *);
__REG(int,              BSeek) (__A0 struct BIO *, __D0 int, __D1 int);

__REG(int,              VPickFromList) (__A0 char **, __D0 int, __D1 int, __A1 ULONG *);
__REG(int,              LangListRequest) (__A0 char *, __A1 long **, __D0 int, __D1 int, __D2 int, __D3 int, __A2 char **);
__REG(int,              TextListRequest) (__A0 char *, __A1 char **, __D0 int, __D1 int, __D2 int);
__REG(struct ListNode *, PickFromListA) (__A0 struct MinList *);
__REG(struct Blend *,   CreateBlend) (__A0 struct Mask *);
__REG(void,             DeleteBlend) (__A0 struct Blend *);
__REG(short,            mixer) (__D0 short, __D1 short, __D2 short);

__REG(int,              GetBufLines) (__A0 struct Buffer *, __A1 UBYTE **, __A2 UBYTE **, __A3 UBYTE **, __D0 short, __D1 short);
__REG(int,              PutBufLines) (__A0 struct Buffer *, __D0 short, __D1 short);

__REG(void,             NewPreOverscan) (__A0 struct NewScreen *, __D0 ULONG);
__REG(int,              IsAnimation) (__A0 char *, __A1 char *);
__REG(void,             LearnA) (__A0 char *, __A1 long *);
__REG(BOOL,             NewGetPaletteStruct) (__A0 struct Palette *, __D0 int);
__REG(BOOL,             SeparateBuffer) (__A0 struct Buffer *, __A1 struct SepInfo *, __A2 char *, __A3 char *, __A4 char *);

__REG(struct ProcessInfo *, PrepareProcess) (__A0 char *, __A1 struct Buffer *, __D0 int, __D1 int, __D2 ULONG);
__REG(void,             FinishProcess) (__A0 struct ProcessInfo *);
__REG(BOOL,             GetData) (__A0 struct ProcessInfo *, __D0 int, __D1 int, __D2 int);
__REG(BOOL,             PutData) (__A0 struct ProcessInfo *, __D0 int, __D1 int, __D2 int);

__REG(BOOL,             EnableVMEM) (__D0 int);

__REG(int,              LockBufLine) (__A0 struct Buffer *, __D0 int);
__REG(int,              UnlockBufLine) (__A0 struct Buffer *, __D0 int);

/*
 * Not in scan.library, but usually part of the stub library:
 */

__STD(void,             Errorf) (char *, ...);
__STD(BOOL,             BoolRequest) (char *, ...);
__STD(void,             InfoRequest) (char *, ...);
__STD(int,              ThreeRequest) (char *, char *, char *, char *, ...);
__STD(BOOL,             SetResult) (struct RexxMsg *, char *, ...);
__STD(BOOL,             DoRawWedge) (char *, VOID *, ...);
__STD(int,              PickFromList) (char **, int, int, ...);

__STD(void,             msprintf) (char *, ...);

__STD(int,              ChangeScanner) (GedButtonProto);
__STD(int,              ChangeRender) (GedButtonProto);
__STD(int,              ChangePrinter) (GedButtonProto);

__STD(int,              MatchArg) (char *, ...);

__STD(struct Buffer *,  ObtainCurrentBuffer) (void);

__STD(BOOL,             SkipMacBinary) (BPTR);
__STD(BOOL,             BSkipMacBinary) (struct BIO *);

__STD(void,             Learn) (char *, ...);

__STD(BOOL,             ObtainImageFX) (void);
__STD(void,             ReleaseImageFX) (void);

#define SCAN_PROTOS_H
#endif
