/*  graphics.h

    Definitions for Graphics Package.

*/

/*
 *      C/C++ Run Time Library - Version 6.5
 *
 *      Copyright (c) 1987, 1994 by Borland International
 *      All Rights Reserved.
 *
 */

#if !defined(__GRAPHICS_H)
#define __GRAPHICS_H

#if defined( _Windows ) && !defined (__DPMI16__) && !defined(__DPMI32__)
#error BGI graphics not supported under Windows
#endif

#if defined(__STDC__)
#error BGI graphics not ANSI compatible
#endif

#if !defined(___DEFS_H)
#include <_defs.h>
#endif

#if !defined(_BGIENTRY)
    #if defined(__DPMI16__)
        #define _BGIENTRY __pascal
    #elif defined(__DPMI32__)
        #define _BGIENTRY _RTLENTRY __import
    #else
        #define _BGIENTRY _RTLENTRY
    #endif
#endif

#if defined(__DPMI32__)
#define far
#define huge
#endif

enum graphics_errors {      /* graphresult error return codes */
    grOk           =   0,
    grNoInitGraph      =  -1,
    grNotDetected      =  -2,
    grFileNotFound     =  -3,
    grInvalidDriver    =  -4,
    grNoLoadMem    =  -5,
    grNoScanMem    =  -6,
    grNoFloodMem       =  -7,
    grFontNotFound     =  -8,
    grNoFontMem    =  -9,
    grInvalidMode      = -10,
    grError        = -11,   /* generic error */
    grIOerror      = -12,
    grInvalidFont      = -13,
    grInvalidFontNum   = -14,
    grInvalidVersion   = -18
};

enum graphics_drivers {     /* define graphics drivers */
    DETECT,         /* requests autodetection */
    CGA, MCGA, EGA, EGA64, EGAMONO, IBM8514,    /* 1 - 6 */
    HERCMONO, ATT400, VGA, PC3270,          /* 7 - 10 */
    CURRENT_DRIVER = -1
};

enum graphics_modes {       /* graphics modes for each driver */
    CGAC0      = 0,  /* 320x200 palette 0; 1 page   */
    CGAC1      = 1,  /* 320x200 palette 1; 1 page   */
    CGAC2      = 2,  /* 320x200 palette 2: 1 page   */
    CGAC3      = 3,  /* 320x200 palette 3; 1 page   */
    CGAHI      = 4,  /* 640x200 1 page          */
    MCGAC0     = 0,  /* 320x200 palette 0; 1 page   */
    MCGAC1     = 1,  /* 320x200 palette 1; 1 page   */
    MCGAC2     = 2,  /* 320x200 palette 2; 1 page   */
    MCGAC3     = 3,  /* 320x200 palette 3; 1 page   */
    MCGAMED    = 4,  /* 640x200 1 page          */
    MCGAHI     = 5,  /* 640x480 1 page          */
    EGALO      = 0,  /* 640x200 16 color 4 pages    */
    EGAHI      = 1,  /* 640x350 16 color 2 pages    */
    EGA64LO    = 0,  /* 640x200 16 color 1 page     */
    EGA64HI    = 1,  /* 640x350 4 color  1 page     */
    EGAMONOHI  = 0,  /* 640x350 64K on card, 1 page - 256K on card, 4 pages */
    HERCMONOHI = 0,  /* 720x348 2 pages         */
    ATT400C0   = 0,  /* 320x200 palette 0; 1 page   */
    ATT400C1   = 1,  /* 320x200 palette 1; 1 page   */
    ATT400C2   = 2,  /* 320x200 palette 2; 1 page   */
    ATT400C3   = 3,  /* 320x200 palette 3; 1 page   */
    ATT400MED  = 4,  /* 640x200 1 page          */
    ATT400HI   = 5,  /* 640x400 1 page          */
    VGALO      = 0,  /* 640x200 16 color 4 pages    */
    VGAMED     = 1,  /* 640x350 16 color 2 pages    */
    VGAHI      = 2,  /* 640x480 16 color 1 page     */
    PC3270HI   = 0,  /* 720x350 1 page          */
    IBM8514LO  = 0,  /* 640x480 256 colors      */
    IBM8514HI  = 1   /*1024x768 256 colors      */
};


#if defined(__DPMI32__)
/*  graphicx.h

    Extended Definitions for Graphics Package.

*/


enum Xgraphics_drivers {     /* define extended graphics drivers */
    DETECTX    = 256,
    VGA256     = 11,
    ATTDEB     = 12,
    TOSHIBA    = 13,

    SVGA16     = 14,
    SVGA256    = 15,
    SVGA32K    = 16,
    SVGA64K    = 17,

    VESA16     = 18,
    VESA256    = 19,
    VESA32K    = 20,
    VESA64K    = 21,
    VESA16M    = 22,

    ATI16      = 23,
    ATI256     = 24,
    ATI32K     = 25,
    COMPAQ     = 26,
    TSENG316   = 27,
    TSENG3256  = 28,
    TSENG416   = 29,
    TSENG4256  = 30,
    TSENG432K  = 31,
    GENOA5     = 32,
    GENOA6     = 33,
    OAK        = 34,
    PARADIS16  = 35,
    PARADIS256 = 36,
    TECMAR     = 37,
    TRIDENT16  = 38,
    TRIDENT256 = 39,
    VIDEO7     = 40,
    VIDEO7II   = 41,

    S3         = 42,
    ATIGUP     = 43

};

enum Xgraphics_modes {       /* graphics modes for each driver */
    RES640x350  = 0,
    RES640x480  = 1,
    RES800x600  = 2,
    RES1024x768 = 3,
    RES1280x1024 = 4,
};


#endif  /* !__DPMI32__ */


/* Colors for setpalette and setallpalette */

#if !defined(__COLORS)
#define __COLORS

enum COLORS {
    BLACK,          /* dark colors */
    BLUE,
    GREEN,
    CYAN,
    RED,
    MAGENTA,
    BROWN,
    LIGHTGRAY,
    DARKGRAY,           /* light colors */
    LIGHTBLUE,
    LIGHTGREEN,
    LIGHTCYAN,
    LIGHTRED,
    LIGHTMAGENTA,
    YELLOW,
    WHITE
};
#endif

enum CGA_COLORS {
    CGA_LIGHTGREEN     = 1,     /* Palette C0 Color Names   */
    CGA_LIGHTRED       = 2,
    CGA_YELLOW         = 3,

    CGA_LIGHTCYAN      = 1,     /* Palette C1 Color Names   */
    CGA_LIGHTMAGENTA   = 2,
    CGA_WHITE          = 3,

    CGA_GREEN          = 1,     /* Palette C2 Color Names   */
    CGA_RED        = 2,
    CGA_BROWN          = 3,

    CGA_CYAN           = 1,     /* Palette C3 Color Names   */
    CGA_MAGENTA        = 2,
    CGA_LIGHTGRAY      = 3
};


enum EGA_COLORS {
    EGA_BLACK        =  0,      /* dark colors */
    EGA_BLUE         =  1,
    EGA_GREEN        =  2,
    EGA_CYAN         =  3,
    EGA_RED      =  4,
    EGA_MAGENTA      =  5,
    EGA_BROWN        =  20,
    EGA_LIGHTGRAY    =  7,
    EGA_DARKGRAY     =  56,     /* light colors */
    EGA_LIGHTBLUE    =  57,
    EGA_LIGHTGREEN   =  58,
    EGA_LIGHTCYAN    =  59,
    EGA_LIGHTRED     =  60,
    EGA_LIGHTMAGENTA     =  61,
    EGA_YELLOW       =  62,
    EGA_WHITE        =  63
};

enum line_styles {      /* Line styles for get/setlinestyle */
    SOLID_LINE   = 0,
    DOTTED_LINE  = 1,
    CENTER_LINE  = 2,
    DASHED_LINE  = 3,
    USERBIT_LINE = 4,   /* User defined line style */
};

enum line_widths {      /* Line widths for get/setlinestyle */
    NORM_WIDTH  = 1,
    THICK_WIDTH = 3,
};

enum font_names {
    DEFAULT_FONT    = 0,    /* 8x8 bit mapped font */
    TRIPLEX_FONT    = 1,    /* "Stroked" fonts */
    SMALL_FONT  = 2,
    SANS_SERIF_FONT = 3,
    GOTHIC_FONT = 4,
    SCRIPT_FONT = 5,
    SIMPLEX_FONT = 6,
    TRIPLEX_SCR_FONT = 7,
    COMPLEX_FONT = 8,
    EUROPEAN_FONT = 9,
    BOLD_FONT = 10
};

#define HORIZ_DIR   0   /* left to right */
#define VERT_DIR    1   /* bottom to top */

#define USER_CHAR_SIZE  0   /* user-defined char size */

enum fill_patterns {        /* Fill patterns for get/setfillstyle */
    EMPTY_FILL,     /* fills area in background color */
    SOLID_FILL,     /* fills area in solid fill color */
    LINE_FILL,      /* --- fill */
    LTSLASH_FILL,       /* /// fill */
    SLASH_FILL,     /* /// fill with thick lines */
    BKSLASH_FILL,       /* \\\ fill with thick lines */
    LTBKSLASH_FILL,     /* \\\ fill */
    HATCH_FILL,     /* light hatch fill */
    XHATCH_FILL,        /* heavy cross hatch fill */
    INTERLEAVE_FILL,    /* interleaving line fill */
    WIDE_DOT_FILL,      /* Widely spaced dot fill */
    CLOSE_DOT_FILL,     /* Closely spaced dot fill */
    USER_FILL       /* user defined fill */
};

enum putimage_ops {     /* BitBlt operators for putimage */
    COPY_PUT,       /* MOV */
    XOR_PUT,        /* XOR */
    OR_PUT,         /* OR  */
    AND_PUT,        /* AND */
    NOT_PUT         /* NOT */
};

enum text_just {        /* Horizontal and vertical justification
                   for settextjustify */
    LEFT_TEXT   = 0,
    CENTER_TEXT = 1,
    RIGHT_TEXT  = 2,

    BOTTOM_TEXT = 0,
     /* CENTER_TEXT = 1,  already defined above */
    TOP_TEXT    = 2
};


#define MAXCOLORS 15

struct palettetype {
    unsigned char size;
    signed char colors[MAXCOLORS+1];
};

struct linesettingstype {
    int linestyle;
    unsigned upattern;
    int thickness;
};

struct textsettingstype {
    int font;
    int direction;
    int charsize;
    int horiz;
    int vert;
};

struct fillsettingstype {
    int pattern;
    int color;
};

struct pointtype {
    int x, y;
};

struct viewporttype {
    int left, top, right, bottom;
    int clip;
};

struct arccoordstype {
    int x, y;
    int xstart, ystart, xend, yend;
};

#ifdef __cplusplus
extern "C" {
#endif

#if defined(__DPMI16__)
void       _bgilink (void);
#pragma    extref _bgilink
#endif

void       far _BGIENTRY arc(int __x, int __y, int __stangle, int __endangle,
                             int __radius);
void       far _BGIENTRY bar(int __left, int __top, int __right, int __bottom);
void       far _BGIENTRY bar3d(int __left, int __top, int __right, int __bottom,
                               int __depth, int __topflag);
void       far _BGIENTRY circle(int __x, int __y, int __radius);
void       far _BGIENTRY cleardevice(void);
void       far _BGIENTRY clearviewport(void);
void       far _BGIENTRY closegraph(void);
void       far _BGIENTRY detectgraph(int far *__graphdriver,int far *__graphmode);
void       far _BGIENTRY drawpoly(int __numpoints, const int far *__polypoints);
void       far _BGIENTRY ellipse(int __x, int __y, int __stangle, int __endangle,
                                 int __xradius, int __yradius);
void       far _BGIENTRY fillellipse( int __x, int __y, int __xradius, int __yradius );
void       far _BGIENTRY fillpoly(int __numpoints, const int far *__polypoints);
void       far _BGIENTRY floodfill(int __x, int __y, int __border);
void       far _BGIENTRY getarccoords(struct arccoordstype far *__arccoords);
void       far _BGIENTRY getaspectratio(int far *__xasp, int far *__yasp);
int        far _BGIENTRY getbkcolor(void);
int        far _BGIENTRY getcolor(void);
struct palettetype far * far _BGIENTRY getdefaultpalette( void );
char *     far _BGIENTRY getdrivername( void );
void       far _BGIENTRY getfillpattern(char far *__pattern);
void       far _BGIENTRY getfillsettings(struct fillsettingstype far *__fillinfo);
int        far _BGIENTRY getgraphmode(void);
void       far _BGIENTRY getimage(int __left, int __top, int __right, int __bottom,
                                  void far *__bitmap);
void       far _BGIENTRY getlinesettings(struct linesettingstype far *__lineinfo);
int        far _BGIENTRY getmaxcolor(void);
int        far _BGIENTRY getmaxmode(void);
int        far _BGIENTRY getmaxx(void);
int        far _BGIENTRY getmaxy(void);
char *     far _BGIENTRY getmodename( int __mode_number );
void       far _BGIENTRY getmoderange(int __graphdriver, int far *__lomode,
                   int far *__himode);
unsigned   far _BGIENTRY getpixel(int __x, int __y);
void       far _BGIENTRY getpalette(struct palettetype far *__palette);
int        far _BGIENTRY getpalettesize( void );
void       far _BGIENTRY gettextsettings(struct textsettingstype far *__texttypeinfo);
void       far _BGIENTRY getviewsettings(struct viewporttype far *__viewport);
int        far _BGIENTRY getx(void);
int        far _BGIENTRY gety(void);
void       far _BGIENTRY graphdefaults(void);
char *     far _BGIENTRY grapherrormsg(int __errorcode);
void       far _BGIENTRY _graphfreemem(void far *__ptr, unsigned __size);
void far * far _BGIENTRY _graphgetmem(unsigned __size);
int        far _BGIENTRY graphresult(void);
unsigned   far _BGIENTRY imagesize(int __left, int __top, int __right, int __bottom);
void       far _BGIENTRY initgraph(int  far *__graphdriver,
                                   int  far *__graphmode,
                                   const char far *__pathtodriver);
int        far _BGIENTRY installuserdriver(const char far *__name,
                                           int huge (*detect)(void));
int        far _BGIENTRY installuserfont(const char far *__name);
void       far _BGIENTRY line(int __x1, int __y1, int __x2, int __y2);
void       far _BGIENTRY linerel(int __dx, int __dy);
void       far _BGIENTRY lineto(int __x, int __y);
void       far _BGIENTRY moverel(int __dx, int __dy);
void       far _BGIENTRY moveto(int __x, int __y);
void       far _BGIENTRY outtext(const char far *__textstring);
void       far _BGIENTRY outtextxy(int __x, int __y, const char far *__textstring);
void       far _BGIENTRY pieslice(int __x, int __y, int __stangle, int __endangle,
                                  int __radius);
void       far _BGIENTRY putimage(int __left, int __top, const void far *__bitmap,
                                  int __op);
void       far _BGIENTRY putpixel(int __x, int __y, int __color);
void       far _BGIENTRY rectangle(int __left, int __top, int __right, int __bottom);
void       far _BGIENTRY restorecrtmode(void);
void       far _BGIENTRY sector(int __X, int __Y, int __StAngle, int __EndAngle,
                                int __XRadius, int __YRadius);
void       far _BGIENTRY setactivepage(int __page);
void       far _BGIENTRY setallpalette(const struct palettetype far *__palette);
void       far _BGIENTRY setaspectratio(int __xasp, int __yasp);
void       far _BGIENTRY setbkcolor(int __color);
void       far _BGIENTRY setcolor(int __color);
void       far _BGIENTRY setfillpattern(const char far *__upattern, int __color);
void       far _BGIENTRY setfillstyle(int __pattern, int __color);
unsigned   far _BGIENTRY setgraphbufsize(unsigned __bufsize);
void       far _BGIENTRY setgraphmode(int __mode);
void       far _BGIENTRY setlinestyle(int __linestyle, unsigned __upattern,
                                      int __thickness);
void       far _BGIENTRY setpalette(int __colornum, int __color);
void       far _BGIENTRY setrgbpalette(int __colornum,
                                       int __red, int __green, int __blue);
void       far _BGIENTRY settextjustify(int __horiz, int __vert);
void       far _BGIENTRY settextstyle(int __font, int __direction, int __charsize);
void       far _BGIENTRY setusercharsize(int __multx, int __divx,
                                         int __multy, int __divy);
void       far _BGIENTRY setviewport(int __left, int __top, int __right, int __bottom,
                                     int __clip);
void       far _BGIENTRY setvisualpage(int __page);
void       far _BGIENTRY setwritemode( int __mode );
int        far _BGIENTRY textheight(const char far *__textstring);
int        far _BGIENTRY textwidth(const char far *__textstring);

/***** graphics drivers *****/

int        _BGIENTRY registerbgidriver(void (*driver)(void));

#if defined(__DPMI16__) || defined(__DPMI32__)
#define registerfarbgidriver registerbgidriver
#else
int    far _BGIENTRY registerfarbgidriver(void far *__driver);
#endif

/* !!        These "functions" are NOT user-callable          !! */
/* !! They are there just so you can link in graphics drivers !! */

void           _RTLENTRY CGA_driver(void);
void           _RTLENTRY EGAVGA_driver(void);
void           _RTLENTRY IBM8514_driver(void);
void           _RTLENTRY Herc_driver(void);
void           _RTLENTRY ATT_driver(void);
void           _RTLENTRY PC3270_driver(void);

#if defined(__DPMI16__)
void           _RTLENTRY CGA_driver_far(void);
void           _RTLENTRY EGAVGA_driver_far(void);
void           _RTLENTRY IBM8514_driver_far(void);
void           _RTLENTRY Herc_driver_far(void);
void           _RTLENTRY ATT_driver_far(void);
void           _RTLENTRY PC3270_driver_far(void);
#else
extern int far _RTLENTRY CGA_driver_far[];
extern int far _RTLENTRY EGAVGA_driver_far[];
extern int far _RTLENTRY IBM8514_driver_far[];
extern int far _RTLENTRY Herc_driver_far[];
extern int far _RTLENTRY ATT_driver_far[];
extern int far _RTLENTRY PC3270_driver_far[];
#endif

/***** graphics fonts *****/

int        _BGIENTRY registerbgifont(void (*font)(void));

#if defined(__DPMI16__) || defined(__DPMI32__)
#define registerfarbgifont registerbgifont
#else
int    far _BGIENTRY registerfarbgifont(void far *__font);
#endif

/* !!   These "functions" are NOT user-callable,   !! */
/* !! they are there just so you can link in fonts !! */

void           _RTLENTRY   triplex_font(void);
void           _RTLENTRY     small_font(void);
void           _RTLENTRY sansserif_font(void);
void           _RTLENTRY    gothic_font(void);

extern int far _RTLENTRY   triplex_font_far[];
extern int far _RTLENTRY     small_font_far[];
extern int far _RTLENTRY sansserif_font_far[];
extern int far _RTLENTRY    gothic_font_far[];

#ifdef __cplusplus
}
#endif

#endif
