Listing 4 Supporting graphics functions
/******************************************************* * BGIGRH.C -- required graphics functions * using Borland Graphic Interface * * The routines in this module adapt themselves to * whatever video hardware a driver is available for. * * for TurboC V2.0 * * by Anton Treuenfels * * first created: 01/01/93 * last revision: 04/11/94 ******************************************************/ /****************************** * Header Section -- BGIGRH.H * *****************************/ #ifndef SEEN_BGIGRH #define SEEN_BGIGRH /* exported variables */ extern long MaxXPos. MaxYPos; extern int MaxColor; /* function prototypes */ void abspoint(int *, int *); void grhopen(void); void grhclose(void); void grhfpair(int, int, int, int); void grhrect(int, int, int, int); void grhcircle(int, int, int, int); #endif /*************************** * Code Section -- BGIGRH.C * **************************/ #include <stdio.h> #include <stdlib.h> #include <graphics.h> #include "usrdef.h" /* change the following definition if the driver files are not there or in the current directory */ #define DRIVERPATH "C:\\TURBOC\\BGI" long MaxXPos, MaxYPos; /* physical screen size */ int MaxColor; /* maximum color index */ /***************************************************** /* convert relative point to absolute */ void abspoint(int *xpos, int *ypos) { if (*xpos <= 0) *xpos = 0; else if (*xpos >= 100) *xpos = (int)MaxXPos; else *xpos = (int)(*xpos * MaxXPos / 100); if (*ypos <= 0) *ypos = 0; else if (*ypos >= 100) *ypos = (int)MaxYPos; else *ypos = (int)(*ypos * MaxYPos / 100); } /* convert relative rectangle to absolute */ static void absrect(int *lft, int *top, int *rgt, int *bot) { int tmp; if (*lft > *rgt) { tmp = *lft; *lft = *rgt; *rgt = tmp; } if (*top > *bot) { tmp = *top; *top = *bot; *bot = tmp; } abspoint(lft, top); abspoint(rgt, bot); } /* init bitmapped graphics operations */ void grhopen(void) { int gdriver, gmode, gerror; gdriver = DETECT; initgraph(&gdriver, &gmode, DRIVERPATH); gerror = graphresult(); if (gerror < 0) { printf("\ngraphics error: %s.\n", grapherrormsg(gerror)); exit(EXIT_FAILURE); } MaxXPos = getmaxx(); MaxYPos = getmaxy(); MaxColor = getmaxcolor(); setcolor(MaxColor); setbkcolor(0); } /* end bitmapped graphics operations */ void grhclose(void) { closegraph(); } /* draw sideways 'F' pair */ void grhfpair(int lft, int top, int rgt, int bot) { int dx, dy, dx2, dx3, dy3; setlinestyle(SOLID_LINE, 0x0000, NORM_WIDTH); absrect(&lft, &top, &rgt, &bot); dx = (rgt -- lft + 1) / 7; dy = (bot -- top + 1) / 5; dx2 = 2* dx; dx3 = 3 * dx; dy3 = 3 * dy; rectangle(lft, top, rgt, top + dy); rectangle(lft, bot -- dy, rgt, bot); rectangle(rgt -- dx, top + dy, rgt, top + dy3); rectangle(lft, bot -- dy3, lft + dx. bot -- dy); rectangle(lft + dx2, top + dy, lft + dx3, top + dy3); rectangle(rgt -- dx3, bot -- dy3, rgt -- dx2, bot -- dy); } /* draw rectangle */ void grhrect(int lft, int top, int rgt, int bot) { setlinestyle(SOLID_LINE, 0x0000, NORM_WIDTH); absrect(&lft, &top, &rgt, &bot); rectangle(lft, top, rgt, bot); } /* draw circle */ void grhcircle(int lft, int top, int rgt, int bot) { int radius; setlinestyle(SOLID_LINE, 0x0000, NORM_WIDTH); absrect(&lft, &top, &rgt, &bot); radius = min((rgt -- lft)/2, (bot -- top)/2); circle((lft + rgt)/2, (top + bot)/2, radius); } /* End of File */