// FILE: winbgim.h // WINBGIM Version 3.4 -- Dec 21, 1999 // modified to run under Borland C++ 5.02 for Windows OR under the // mingw32 g++ compiler for Windows. There are also some additions // for mouse control and RGB colors. Documentation on how to use these // functions is available in www.cs.colorado.edu/~main/bgi/docs/ // // Modification log by Michael Main: // --Version 2.1: Oct 17, 1998 // Some mouse additions to Konstantin's original code // --Version 2.2: November 1, 1998 // Modified getch so that it can get the arrows and other keypad keys. // --Version 2.3: November 17, 1998 // Fixed a bug in getpixel. // --Version 2.4: November 25, 1998 // Added functions getactivepage() and getvisualpage() to get the current // page number of the active and visual pages. In this implementation, the // MAX_PAGES is set to 16, but I have used only pages 0 and 1 myself. // --Version 3.1: June 17, 1999 // Mostly implemented by Mark Richardson: // Implements getimage and putimage. // Adds new support for rgb colors. // --Version 3.2: June 21, 1999 // Made modifications so that everything works with the mingw32 // G++ compiler for Windows. Details for installing and using this // free compiler are in www.cs.colorado.edu/~main/mingw32/README.html // --Version 3.3: Oct 4, 1999 // Added ismouseclick and getmouseclick // --Version 3.4: Dec 21, 1999 // Added clearmouseclick. // Fixed bug causing getmouseclick to fail when x and y are same variable. // Fixed bug in setcolor that sometimes caused the fill color to change // to the drawing color. #ifndef __GRAPHICS_H__ #define __GRAPHICS_H__ #define far #define huge #include #include #include /** Some different definitions for the Mingw32 g++ compiler and * the Borland 5.0 compiler. Added by Michael Main, June 21, 1999. * Michael Main -- 10/17/98 */ #define _WINDOWS_H #if defined(_WINDOWS_H) || defined(_GNU_H_WINDOWS_H) /* MINGW32 G++ Compiler: * Define the colors type in the same way that Borland does. * Define CLR_INVALID from Borlands /win32/wingdi.h. * Get the memset prototype from string.h. Note that sometimes is * actually for the Windows compiler because. In this case * _STRING_H_ will not be defined but we can still pick it up from <../string.h>. * Also define random for the bgidemo function. */ enum colors { BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, BROWN, LIGHTGRAY, DARKGRAY, LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED, LIGHTMAGENTA, YELLOW, WHITE }; #if !defined(CLR_INVALID) #define CLR_INVALID 0xFFFFFFFF #endif #include #else /* BORLAND Compiler: * Colors are already defined in the BC5 conio.h, using COLORS. * So for Borland I'll replace this enum with a #define definition. */ #define colors COLORS #endif #ifndef random #define random(range) (rand() % (range)) #endif // A definition to fix a misspelling of MAGENTA throughout this file: #define MAGENT MAGENTA enum write_modes { COPY_PUT, XOR_PUT, OR_PUT, AND_PUT, NOT_PUT }; enum line_styles { SOLID_LINE, DOTTED_LINE, CENTER_LINE, DASHED_LINE, USERBIT_LINE }; enum fill_styles { EMPTY_FILL, SOLID_FILL, LINE_FILL, LTSLASH_FILL, SLASH_FILL, BKSLASH_FILL, LTBKSLASH_FILL, HATCH_FILL, XHATCH_FILL, INTERLEAVE_FILL, WIDE_DOT_FILL, CLOSE_DOT_FILL, USER_FILL }; enum text_directions { HORIZ_DIR, VERT_DIR }; enum font_types { DEFAULT_FONT, TRIPLEX_FONT, SMALL_FONT, SANSSERIF_FONT, GOTHIC_FONT }; #define LEFT_TEXT 0 #define CENTER_TEXT 1 #define RIGHT_TEXT 2 #define BOTTOM_TEXT 0 #define TOP_TEXT 2 #define NORM_WIDTH 1 #define THICK_WIDTH 3 #define DOTTEDLINE_LENGTH 2 #define CENTRELINE_LENGTH 4 #define USER_CHAR_SIZE 0 #define MAXCOLORS 15 #define CLIP_ON 1 #define CLIP_OFF 0 #define TOP_ON 1 #define TOP_OFF 0 // Definitions for the key pad extended keys are added here. I have also // modified getch() so that when one of these keys are pressed, getch will // return a zero followed by one of these values. This is the same way // that it works in conio for dos applications. // M. Main -- Nov 3, 1998 #define KEY_HOME 71 #define KEY_UP 72 #define KEY_PGUP 73 #define KEY_LEFT 75 #define KEY_CENTER 76 #define KEY_RIGHT 77 #define KEY_END 79 #define KEY_DOWN 80 #define KEY_PGDN 81 #define KEY_INSERT 82 #define KEY_DELETE 83 #define KEY_F1 59 #define KEY_F2 60 #define KEY_F3 61 #define KEY_F4 62 #define KEY_F5 63 #define KEY_F6 64 #define KEY_F7 65 #define KEY_F8 66 #define KEY_F9 67 enum graphics_errors { grOk = 0, grNoInitGraph = -1, grNotDetected = -2, grFileNotFound = -3, grInvalidDriver = -4, grNoLoadMem = -5, grNoScanMem = -6, grNoFloodMem = -7, grFontNotFound = -8, grNoFontMem = -9, grInvalidMode = -10, grError = -11, grIOerror = -12, grInvalidFont = -13, grInvalidFontNum = -14, grInvalidDeviceNum = -15, grInvalidVersion = -18 }; /* Graphics drivers constants, includes X11 which is particular to XBGI. */ #define DETECT 0 #define CGA 1 #define MCGA 2 #define EGA 3 #define EGA64 4 #define EGAMONO 5 #define IBM8514 6 #define HERCMONO 7 #define ATT400 8 #define VGA 9 #define PC3270 10 /* Graphics modes constants. */ #define CGAC0 0 #define CGAC1 1 #define CGAC2 2 #define CGAC3 3 #define CGAHI 4 #define MCGAC0 0 #define MCGAC1 1 #define MCGAC2 2 #define MCGAC3 3 #define MCGAMED 4 #define MCGAHI 5 #define EGALO 0 #define EGAHI 1 #define EGA64LO 0 #define EGA64HI 1 #define EGAMONOHI 3 #define HERCMONOHI 0 #define ATT400C0 0 #define ATT400C1 1 #define ATT400C2 2 #define ATT400C3 3 #define ATT400MED 4 #define ATT400HI 5 #define VGALO 0 #define VGAMED 1 #define VGAHI 2 #define VGAMAX 3 #define PC3270HI 0 #define IBM8514LO 0 #define IBM8514HI 1 typedef struct arccoordstype { int x; int y; int xstart; int ystart; int xend; int yend; } arccoordstype; typedef char fillpatterntype[8]; typedef struct fillsettingstype { int pattern; int color; } fillsettingstype; typedef struct linesettingstype { int linestyle; unsigned int upattern; int thickness; } linesettingstype; typedef struct palettetype { unsigned char size; signed char colors[16]; } palettetype; typedef struct textsettingstype { int font; int direction; int charsize; int horiz; int vert; } textsettingstype; typedef struct viewporttype { int left; int top; int right; int bottom; int clip; } viewporttype; // This struct was moved here to allow access to the struct (Mark Richardson 11/29/98) struct BGIimage { short width; // 2 bytes short height; // 2 bytes Note:This means bits is also aligned to 32bit(DWORD) boundry char bits[1]; }; #ifndef NOT_USE_PROTOTYPES #define PROTO(ARGS) ARGS #else #define PROTO(ARGS) () #endif #if defined(__cplusplus) extern "C" { #endif // // Setting this variable to 0 increase speed of drawing but // correct redraw is not possible. By default this variable is initialized by 1 // extern int bgiemu_handle_redraw; // // Default mode choosed by WinBGI if DETECT value is specified for // device parameter of initgraoh(). Default value is VGAMAX which // cause creation of maximized window (resolution depends on display mode) // extern int bgiemu_default_mode; void _graphfreemem PROTO((void *ptr, unsigned int size)); void* _graphgetmem PROTO((unsigned int size)); void arc PROTO((int, int, int, int, int)); void bar PROTO((int, int, int, int)); void bar3d PROTO((int, int, int, int, int, int)); void circle PROTO((int, int, int)); void cleardevice PROTO((void)); void clearviewport PROTO((void)); void closegraph PROTO((void)); void detectgraph PROTO((int *, int *)); void drawpoly PROTO((int, int *)); void ellipse PROTO((int, int, int, int, int, int)); void fillellipse PROTO((int, int, int, int)); void fillpoly PROTO((int, int *)); void floodfill PROTO((int, int, int)); void getarccoords PROTO((arccoordstype *)); void getaspectratio PROTO((int *, int *)); int getbkcolor PROTO((void)); int getcolor PROTO((void)); palettetype* getdefaultpalette PROTO((void)); char* getdrivername PROTO((void)); void getfillpattern PROTO((char const *)); void getfillsettings PROTO((fillsettingstype *)); int getgraphmode PROTO((void)); void getimage PROTO((int, int, int, int, void *)); void getlinesettings PROTO((linesettingstype *)); int getmaxcolor PROTO((void)); int getmaxmode PROTO((void)); int getmaxx PROTO((void)); int getmaxy PROTO((void)); char* getmodename PROTO((int)); void getmoderange PROTO((int, int *, int *)); void getpalette PROTO((palettetype *)); int getpalettesize PROTO((void)); unsigned int getpixel PROTO((int, int)); void gettextsettings PROTO((textsettingstype *)); void getviewsettings PROTO((viewporttype *)); int getx PROTO((void)); int gety PROTO((void)); void graphdefaults PROTO((void)); char* grapherrormsg PROTO((int)); int graphresult PROTO((void)); unsigned int imagesize PROTO((int, int, int, int)); void initgraph PROTO((int *, int *, char const *)); int installuserdriver PROTO((char const *, int *)); int installuserfont PROTO((char const *)); void line PROTO((int, int, int, int)); void linerel PROTO((int, int)); void lineto PROTO((int, int)); void moverel PROTO((int, int)); void moveto PROTO((int, int)); void outtext PROTO((char const *)); void outtextxy PROTO((int, int, char const *)); void pieslice PROTO((int, int, int, int, int)); void putimage PROTO((int, int, void *, int)); void putpixel PROTO((int, int, int)); void rectangle PROTO((int, int, int, int)); int registerbgidriver PROTO((void *)); int registerbgifont PROTO((void *)); void restorecrtmode PROTO((void)); void sector PROTO((int, int, int, int, int, int)); void setactivepage PROTO((int)); void setallpalette PROTO((palettetype *)); void setaspectratio PROTO((int, int)); void setbkcolor PROTO((int)); void setcolor PROTO((int)); void setfillpattern PROTO((char const *, int)); void setfillstyle PROTO((int, int)); unsigned int setgraphbufsize PROTO((unsigned int)); void setgraphmode PROTO((int)); void setlinestyle PROTO((int, unsigned int, int)); void setpalette PROTO((int, int)); void setrgbpalette PROTO((int, int, int, int)); void settextjustify PROTO((int, int)); void settextstyle PROTO((int, int, int)); void setusercharsize PROTO((int, int, int, int)); void setviewport PROTO((int, int, int, int, int)); void setvisualpage PROTO((int)); void setwritemode PROTO((int)); int textheight PROTO((char const *)); int textwidth PROTO((char const *)); int getch_graph PROTO((void)); int kbhit_graph PROTO((void)); void delay PROTO((unsigned msec)); void restorecrtmode PROTO((void)); /* Prototypes for mouse handling functions. The mousex( ) and mousey( ) * functions return the most recent x and y coordinates detected from the * mouse. For the other functions, the kind parameter should be one of these: * WM_MOUSEMOVE -- mouse movement * WM_LBUTTONDBLCLK -- left mouse button double-click * WM_LBUTTONDOWN -- left mouse button pushed down * WM_LBUTTONUP -- left mouse button released up * WM_MBUTTONDBLCLK -- middle mouse button double-click (might not work!) * WM_MBUTTONDOWN -- middle mouse button pushed down (might not work!) * WM_MBUTTONUP -- middle mouse button released up (might not work!) * WM_RBUTTONDBLCLK -- right mouse button double-click * WM_RBUTTONDOWN -- right mouse button pushed down * WM_RBUTTONUP -- right mouse button released up * The parameter h must be a void function with two integer parameters. * This function will be called whenever the corresponding event occurs. * The two integer parameters will be the x- and y-coordinates where the * event happened. * * NOTE: The middle button events aren't being caught on my Windows 95 system. * I don't know why. * Added by Michael Main -- 11/3/98 and 10/4/99 and 12/21/99. */ int mousex PROTO(( )); int mousey PROTO(( )); void registermousehandler PROTO((UINT kind, void h(int, int))); int ismouseclick PROTO((UINT kind)); void getmouseclick PROTO((UINT kind, int * x, int * y)); void clearmouseclick PROTO((UINT kind)); /* Prototypes for other new functions, not in the original BGI graphics. * There is also a new initwindow function that can be called instead of * initgraph. The arguments are an explicit width and height. * As of 11/3, the width is now the first parameter. * The getactivepage() and getvisualpage() functions get the number of the * current active or visual page. */ void initwindow PROTO((int, int)); int getactivepage PROTO(( )); int getvisualpage PROTO(( )); /* Colors can be original bgi colors (ints in the range 0...MAXCOLORS) or * RGB colors constructed from red, green and blue components between * 0 and 255. * IS_BGI_COLOR(v): true if v is one of the original BGI colors * IS_RGB_COLOR(v): true if v is one of the new RGB colors * RED_VALUE(v) is the red value of an RGB color v * GREEN_VALUE(v) is the red value of an RGB color v * BLUE_VALUE(v) is the red value of an RGB color v * COLOR(r,g,b): is the rgb color formed from a red, green and blue * value (all in the range 0...255). */ #define IS_BGI_COLOR(c) (((c) >= 0) && ((c) <= MAXCOLORS)) #define IS_RGB_COLOR(c) ((c) & 0x04000000) #define RED_VALUE(v) ((v) & 0xFF) #define GREEN_VALUE(v) (((v) >> 8) & 0xFF) #define BLUE_VALUE(v) (((v) >> 16)& 0xFF) #define COLOR(r,g,b) (0x04000000 | RGB(r,g,b)) #if defined(__cplusplus) }; #endif #endif