/* Graphics Library headerfile */

#ifndef VGAGL_H
#define VGAGL_H

#ifdef __cplusplus
extern "C" {
#endif


/* Graphics context */

#define CONTEXT_VIRTUAL		0x0
#define CONTEXT_PAGED		0x1
#define CONTEXT_LINEAR		0x2
#define CONTEXT_MODEX		0x3
#define CONTEXT_PLANAR16	0x4

#define MODEFLAG_PAGEFLIPPING_CAPABLE		0x01
#define MODEFLAG_TRIPLEBUFFERING_CAPABLE	0x02
#define MODEFLAG_PAGEFLIPPING_ENABLED		0x04
#define MODEFLAG_TRIPLEBUFFERING_ENABLED	0x08
#define MODEFLAG_FLIPPAGE_BANKALIGNED		0x10
#define MODEFLAG_32BPP_SHIFT8			0x20

typedef struct {
	int (*driver_setpixel_func)(int, int, int);
	int (*driver_getpixel_func)(int, int);
	int (*driver_hline_func)(int, int, int, int);
	int (*driver_fillbox_func)(int, int, int, int, int);
	int (*driver_putbox_func)(int, int, int, int, void *, int);
	int (*driver_getbox_func)(int, int, int, int, void *, int);
	int (*driver_putboxmask_func)(int, int, int, int, void *);
	int (*driver_putboxpart_func)(int, int, int, int, int, int, void *,
		int, int);
	int (*driver_getboxpart_func)(int, int, int, int, int, int, void *,
		int, int);
	int (*driver_copybox_func)(int, int, int, int, int, int);
} framebufferfunctions;

typedef struct {
	unsigned char modetype;		/* virtual, paged, linear, mode X */
	unsigned char modeflags;	/* or planar16 */
	unsigned char dummy;
	unsigned char flippage;
	int width;		/* width in pixels */
	int height;		/* height in pixels */
	int bytesperpixel;	/* bytes per pixel (1, 2, 3, or 4) */
	int colors;		/* number of colors */
	int bitsperpixel;	/* bits per pixel (8, 15, 16 or 24) */
	int bytewidth;		/* length of a scanline in bytes */
	char *vbuf;		/* address of framebuffer */
	int clip;		/* clipping enabled? */
	int clipx1;		/* top-left coordinate of clip window */
	int clipy1;
	int clipx2;		/* bottom-right coordinate of clip window */
	int clipy2;
	framebufferfunctions ff;
} GraphicsContext;

extern GraphicsContext currentcontext;

#define BYTESPERPIXEL (currentcontext.bytesperpixel)
#define BYTEWIDTH (currentcontext.bytewidth)
#define WIDTH (currentcontext.width)
#define HEIGHT (currentcontext.height)
#define VBUF (currentcontext.vbuf)
#define MODETYPE (currentcontext.modetype)
#define MODEFLAGS (currentcontext.modeflags)
#define BITSPERPIXEL (currentcontext.bitsperpixel)
#define COLORS (currentcontext.colors)

#define __clip (currentcontext.clip)
#define __clipx1 (currentcontext.clipx1)
#define __clipy1 (currentcontext.clipy1)
#define __clipx2 (currentcontext.clipx2)
#define __clipy2 (currentcontext.clipy2)


/* Configuration */

int gl_setcontextvga( int m );
int gl_setcontextvgavirtual( int m );
void gl_setcontextvirtual( int w, int h, int bpp, int bitspp, void *vbuf );
void gl_setcontextwidth( int w );
void gl_setcontextheight( int h );
void gl_setcontext( GraphicsContext *gc );
void gl_getcontext( GraphicsContext *gc );
void gl_freecontext( GraphicsContext *gc );

/* Line drawing */

void gl_setpixel( int x, int y, int c);
void gl_setpixelrgb( int x, int y, int r, int g, int b );
int gl_getpixel( int x, int y );
void gl_getpixelrgb( int x, int y, int *r, int *g, int *b );
int gl_rgbcolor( int r, int g, int b );
void gl_hline( int x1, int y, int x2, int c );
void gl_line( int x1, int y1, int x2, int y2, int c );
void gl_circle( int x, int y, int r, int c );

/* Box (bitmap) functions */

void gl_fillbox( int x, int y, int w, int h, int c );
void gl_getbox( int x, int y, int w, int h, void *dp );
void gl_putbox( int x, int y, int w, int h, void *dp );
void gl_putboxpart( int x, int y, int w, int h, int bw, int bh, void *b,
	int xo, int yo );
void gl_putboxmask( int x, int y, int w, int h, void *dp );
void gl_copybox( int x1, int y1, int w, int h, int x2, int y2 );
void gl_copyboxtocontext( int x1, int y1, int w, int h, GraphicsContext *gc,
	int x2, int y2 );
void gl_copyboxfromcontext( GraphicsContext *gc, int x1, int y1, int w, int h,
	int x2, int y2 );
/* The following functions only work in 256-color modes: */
void gl_compileboxmask( int w, int h, void *sdp, void *ddp );
int gl_compiledboxmasksize( int w, int h, void *sdp );
void gl_putboxmaskcompiled( int x, int y, int w, int h, void *dp );

/* Miscellaneous */

void gl_clearscreen( int c );
void gl_scalebox( int w1, int h1, void *sb, int w2, int h2, void *db );
void gl_setdisplaystart( int x, int y );
void gl_enableclipping();
void gl_setclippingwindow( int x1, int y1, int x2, int y2 );
void gl_disableclipping();

/* Screen buffering */

void gl_copyscreen( GraphicsContext *gc );
void gl_setscreenoffset( int o );
int gl_enablepageflipping( GraphicsContext *gc );

/* Text */

#define WRITEMODE_OVERWRITE 0
#define WRITEMODE_MASKED 1

void gl_expandfont( int fw, int fh, int c, void *sfdp, void *dfdp );
void gl_setfont( int fw, int fh, void *fdp );
void gl_colorfont( int fw, int fh, int c, void *fdp );
void gl_setwritemode( int wm );
void gl_write( int x, int y, char *s );
void gl_writen( int x, int y, int n, char *s );

extern unsigned char *gl_font8x8;	/* compressed 8x8 font */

/* 256-color Palette */

typedef struct {
	struct {
		unsigned char red;	/* 6-bit values */
		unsigned char green;
		unsigned char blue;
	} color[256];
} Palette;

void gl_setpalettecolor( int c, int r, int b, int g );
void gl_getpalettecolor( int c, int *r, int *b, int *g );
void gl_setpalettecolors( int s, int n, void *dp );
void gl_getpalettecolors( int s, int n, void *dp );
void gl_setpalette( void *p );
void gl_getpalette( void *p );
void gl_setrgbpalette();


#ifdef __cplusplus
}
#endif

#endif
