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

  by Maciej 'YTM/Elysium' Witkowiak
*/

#ifndef _GGRAPH_H
#define _GGRAPH_H

#include <geos/gstruct.h>

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);

#ifdef __GEOS_CBM__
void SetNewMode(void);
#endif

/* 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
/* 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
#ifdef __GEOS_CBM__
#define SC_BYTE_WIDTH   40
#define SC_PIX_HEIGHT   200
#define SC_PIX_WIDTH    320
#define SC_SIZE         8000
#else
#define SC_BYTE_WIDTH   70
#define SC_PIX_HEIGHT   192
#define SC_PIX_WIDTH    560
#define SC_SIZE         13440
#endif
/* 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
