/*
  GEOS graphic (non icon/menu/sprite) functions

  by Maciej 'YTM/Elysium' Witkowiak
*/

#ifndef	_GGRAPH_H
#define _GGRAPH_H

#ifndef _GSTRUCT_H
#include <geos/gstruct.h>
#endif

void __fastcall__ cpputs(char *s);
void __fastcall__ cpputsxy(unsigned x, unsigned y, char *s);

void __fastcall__ SetPattern(char newpattern);

void __fastcall__ HorizontalLine(char pattern, char y, unsigned xstart, unsigned xend);
void __fastcall__ InvertLine(char y, unsigned xstart, unsigned xend);
void __fastcall__ RecoverLine(char y, unsigned xstart, unsigned xend);
void __fastcall__ VerticalLine(char pattern, char ystart, char yend, unsigned x);

void __fastcall__ InitDrawWindow(struct window *myRectangle);
void Rectangle(void);
void __fastcall__ FrameRectangle(char pattern);
void InvertRectangle(void);
void ImprintRectangle(void);
void RecoverRectangle(void);

void __fastcall__ DrawLine(char mode, struct window *topBotCoords);

void __fastcall__ DrawPoint(char mode, struct pixel *myPixel);
char __fastcall__ TestPoint(struct pixel *myPixel);

void __fastcall__ PutChar(char character, char y, unsigned x);
void __fastcall__ PutString(char *myString, char y, unsigned x);
void __fastcall__ PutDecimal(char style, unsigned value, char y, unsigned x);

char __fastcall__ GetCharWidth(char character);
void __fastcall__ LoadCharSet(struct fontdesc *myFont);
void UseSystemFont(void);

void __fastcall__ BitmapUp(struct iconpic *myIcon);
void __fastcall__ BitmapClip(char skipl, char skipr, unsigned skiptop,
			     struct iconpic *myIcon);
void __fastcall__ BitOtherClip(void *proc1, void *proc2, char skipl,
			       char skipr, unsigned skiptop,
			       struct iconpic *myIcon);

void __fastcall__ GraphicsString(char *myGfxString);

/* VIC colour constants */
#define	BLACK		0
#define	WHITE		1
#define	RED		2
#define	CYAN		3
#define	PURPLE		4
#define	GREEN		5
#define	BLUE		6
#define	YELLOW		7
#define	ORANGE		8
#define	BROWN		9
#define	LTRED		10
#define	DKGREY		11
#define	GREY		12
#define	MEDGREY		12
#define	LTGREEN		13
#define	LTBLUE		14
#define	LTGREY		15
/* once again for cc65 compatibility */
#define COLOR_BLACK  	       	0x00
#define COLOR_WHITE  	       	0x01
#define COLOR_RED    	       	0x02
#define COLOR_CYAN      	0x03
#define COLOR_VIOLET 	       	0x04
#define COLOR_GREEN  	       	0x05
#define COLOR_BLUE   	       	0x06
#define COLOR_YELLOW 	       	0x07
#define COLOR_ORANGE 	       	0x08
#define COLOR_BROWN  	       	0x09
#define COLOR_LIGHTRED       	0x0A
#define COLOR_GRAY1  	       	0x0B
#define COLOR_GRAY2  	       	0x0C
#define COLOR_LIGHTGREEN     	0x0D
#define COLOR_LIGHTBLUE      	0x0E
#define COLOR_GRAY3  	       	0x0F
/* VIC memory banks - lowest 2 bits of cia2base+0 */
#define	GRBANK0		3
#define	GRBANK1		2
#define	GRBANK2		1
#define	GRBANK3		0
/* VIC screen sizes */
#define	VIC_X_POS_OFF	24
#define	VIC_Y_POS_OFF	50
#define	SC_BYTE_WIDTH	40
#define	SC_PIX_HEIGHT	200
#define	SC_PIX_WIDTH	320
#define	SC_SIZE		8000
/* VDC screen constants	*/
#define	SCREENBYTEWIDTH		80
#define	SCREENPIXELWIDTH	640
/* control characters for use as numbers, not characters */
#define	BACKSPACE	8
#define	FORWARDSPACE	9
#define	TAB		9
#define	LF		10
#define	HOME		11
#define	PAGE_BREAK	12
#define	UPLINE		12
#define	CR		13
#define	ULINEON		14
#define	ULINEOFF	15
#define	ESC_GRAPHICS	16
#define	ESC_RULER	17
#define	REV_ON		18
#define	REV_OFF		19
#define	GOTOX		20
#define	GOTOY		21
#define	GOTOXY		22
#define	NEWCARDSET	23
#define	BOLDON		24
#define	ITALICON	25
#define	OUTLINEON	26
#define	PLAINTEXT	27
/* control characters for use in
   strings: eg: str[10]=CBOLDON "Hello"; */
#define CCR		"\015"
#define CULINEON	"\016"
#define CULINEOFF	"\017"
#define CREV_ON		"\022"
#define CREV_OFF	"\023"
#define CBOLDON		"\030"
#define CITALICON	"\031"
#define COUTLINEON	"\032"
#define CPLAINTEXT	"\033"

/*values of currentMode	*/
/* bitNumbers */
#define	UNDERLINE_BIT	7
#define	BOLD_BIT	6
#define	REVERSE_BIT	5
#define	ITALIC_BIT	4
#define	OUTLINE_BIT	3
#define	SUPERSCRIPT_BIT	2
#define	SUBSCRIPT_BIT	1
/* bitMasks */
#define	SET_UNDERLINE	0x80
#define	SET_BOLD	0x40
#define	SET_REVERSE	0x20
#define	SET_ITALIC	0x10
#define	SET_OUTLINE	0x08
#define	SET_SUPERSCRIPT	0x04
#define	SET_SUBSCRIPT	0x02
#define	SET_PLAINTEXT	0
/* values of dispBufferOn */
#define	ST_WRGS_FORE	0x20
#define	ST_WR_BACK	0x40
#define	ST_WR_FORE	0x80
/* PutDecimal parameters */
/* leading zeros? */
#define	SET_NOSURPRESS	0
#define	SET_SURPRESS	0x40
/* justification */
#define	SET_RIGHTJUST	0
#define	SET_LEFTJUST	0x80
/* C128 x-extension flags */
#define	ADD1_W		0x2000
#define	DOUBLE_B	0x80
#define	DOUBLE_W	0x8000
/* DrawLine/DrawPoint mode values */
#define DRAW_ERASE	0x00
#define DRAW_DRAW	0x40
#define DRAW_COPY	0x80

typedef void graphicStr;

#define MOVEPENTO(x,y) (char)1, (unsigned)(x), (char)(y)
#define LINETO(x,y) (char)2, (unsigned)(x), (char)(y)
#define RECTANGLETO(x,y) (char)3, (unsigned)(x), (char)(y)
#define NEWPATTERN(p) (char)5, (char)(p)
#define FRAME_RECTO(x,y) (char)7, (unsigned)(x), (char)(y)
#define PEN_X_DELTA(x) (char)8, (unsigned)(x)
#define PEN_Y_DELTA(y) (char)9, (char)(y)
#define PEN_XY_DELTA(x,y) (char)10, (unsigned)(x), (char)(y)
#define GSTR_END (char)NULL
/* ESC_PUTSTRING can't be implemented - it needs text, not pointer to it
   #define ESC_PUTSTRING(x,y,text) (char)6, (unsigned)(x), (char)(y), (text), (char)NULL
*/

#endif