#ifndef CHUNKYPPC_PROTOS_H
#define CHUNKYPPC_PROTOS_H

#include <exec/types.h>
#include <graphics/gfx.h>
#include <intuition/intuition.h>
#include <libraries/asl.h>
#include <cybergraphics/cybergraphics.h>

#ifdef __cplusplus
extern "C" {
#endif

struct Soff
{
 int x;
 int y;
};

struct Buffers
{
 UBYTE *address;
 UBYTE *mask;
};

#define BIT16 1
#define BIT16_SWAP 2
#define BIT16_ROT 4
#define BIT16_SWAP_ROT 8
#define BIT24 16
#define BIT24_ROT 32
#define BIT32 64
#define BIT32_SWAP 128
#define BIT32_ROT 256
#define BIT32_SWAP_ROT 512
#define BIT32_ROT_REVERSE 1024
#define BIT32_SWAP_ROT_REVERSE 2048
#define BIT8 4096

struct Mode_Screen
{
    struct Screen *video_screen;
    struct Window *video_window;
    int bpr;
    int wb_int;
    int pip_int;
    int dbuf_int;
    int oldstyle_int;
    char pubscreenname[512];
    int mode;
    int SCREENWIDTH;
    int SCREENHEIGHT;
    int MAXWIDTH;
    int MAXHEIGHT;
    int MINDEPTH;
    int MAXDEPTH;
    int format;
    int video_depth;
    UWORD *emptypointer;
    struct BitMap *video_tmp_bm;
    int video_is_native_mode;
    int video_is_cyber_mode;
    unsigned char *screen;
    int video_oscan_height;
    int bufnum;
    struct RastPort *video_rastport;
    struct BitMap *bitmapa;
    struct BitMap *bitmapb;
    struct BitMap *bitmapc;
    struct BitMap *thebitmap;
    struct RastPort *video_temprp;
    struct ScreenModeRequester *video_smr;
    int ham_int;
    UBYTE *wbcolors;
    UBYTE *transtable;
    unsigned long *WBColorTable;
    unsigned long *ColorTable;
    int pal_changed;
    int pen_obtained;
    unsigned char *screenb;
    unsigned char *screenc;
    int numbuffers;
    int rtgm_int;
    struct ScreenBuffer *Buf1;
    struct ScreenBuffer *Buf2;
    struct ScreenBuffer *Buf3;
    void * (*algo)(struct Mode_Screen *ms,unsigned char *dest,unsigned char *src, int srcformat,void *(*hook68k)(unsigned char *data),unsigned char *data);
    void (*Internal1)(void);
    void (*Internal2)(void);
    int onlyptr;
    int cgxlike;
};

struct Mode_Screen *OpenGraphics(char *Title, struct Mode_Screen *ms,int override);
void CloseGraphics(struct Mode_Screen *ms, int shutdownlibs);
void LoadColors(struct Mode_Screen *ms, ULONG *Table);
void DoubleBuffer(struct Mode_Screen *ms);
int ChunkyInit68k(struct Mode_Screen *ms, int srcformat);

void ChunkyNoffFast(UBYTE *, UBYTE *, int, int, int);
void ChunkyNoffFastest(UBYTE *, UBYTE *, int, int, int);
void ChunkyNoffNormal(UBYTE *, UBYTE *, int, int, int);
void ChunkyFast(UBYTE *, UBYTE *, int, int, int, int, int);
void ChunkyFastest(UBYTE *, UBYTE *, int, int, int, int, int);
void ChunkyNormal(UBYTE *, UBYTE *, int, int, int, int, int);
void ChunkyFastFull(UBYTE *, UBYTE *, struct Soff *, struct Soff *, int, struct Soff *, int);
void ChunkyFastestFull(UBYTE *, UBYTE *, struct Soff *, struct Soff *, int, struct Soff *, int);
void ChunkyNormalFull(UBYTE *, UBYTE *, struct Soff *, struct Soff *, int, struct Soff *, int);
void c2p_1(UBYTE *, struct BitMap *, int, int);
void c2p_2(UBYTE *, UBYTE *, UBYTE *, int);
void c2p_3(void *, void *, int , int , struct Soff * , int , int);
void c2p_4(void *, UBYTE *, UBYTE *, struct Soff *, struct Soff *, struct Soff *);
void ChunkyNoffFastHT(UBYTE *,UBYTE *,int,int,int,int);
void ChunkyNoffFastestHT(UBYTE *,UBYTE *,int,int,int,int);
void ChunkyNoffNormalHT(UBYTE *,UBYTE *,int,int,int,int);
void ChunkyFastHT(UBYTE *,UBYTE *,struct Soff *,int,int,int,int);
void ChunkyFastestHT(UBYTE *,UBYTE *,struct Soff *,int,int,int,int);
void ChunkyNormalHT(UBYTE *,UBYTE *,struct Soff *,int,int,int,int);
void ChunkyFastFullHT(UBYTE *,UBYTE *,struct Soff *,struct Soff *,struct Soff *,struct Soff *,int);
void ChunkyFastestFullHT(UBYTE *,UBYTE *,struct Soff *,struct Soff *,struct Soff *, struct Soff *, int);
void ChunkyNormalFullHT(UBYTE *,UBYTE *,struct Soff *,struct Soff *,struct Soff *,struct Soff *, int);
void ChunkyNoffMask(struct Buffers *,UBYTE *,int,int,int,int);
void ChunkyMask(struct Buffers *,UBYTE *,struct Soff *,int,int,int,int);
void ChunkyMaskFull(struct Buffers *,UBYTE *,struct Soff *, struct Soff *,struct Soff *,struct Soff *, int);
void c2p_HI(UBYTE *, int, UBYTE *, UBYTE *, UBYTE *, UBYTE *, UBYTE *);
void ham_c2p(unsigned char *chunky, unsigned char *planar, int width, int height, int depth, int qual, int ham_width);
int ChunkyInit(struct Mode_Screen *, int);

#ifdef __cplusplus
};
#endif

#endif
