home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / EXAMPLES / DEMOGRAF.C < prev    next >
C/C++ Source or Header  |  1991-03-09  |  18KB  |  790 lines

  1. /*
  2.     demograf.c
  3.  
  4.     C-scape 3.2    Example Program
  5.     Copyright (c) 1989, 1990 by Oakland Group, Inc.
  6.     ALL RIGHTS RESERVED.
  7.  
  8.  
  9.     This program demonstrates how C-scape screens can be placed
  10.     on top of graphics images.
  11.  
  12.     This program relies on the compiler supplied graphics library
  13.     to draw the graphic images.
  14.  
  15.  
  16.     The following graphics libraries are supported:
  17.  
  18.     Note:    THIS PROGRAM MUST BE COMPILED IN LARGE MODEL !!!
  19.             (it needs more than 64k of data)
  20.  
  21.     Note:    If you are running on a CGA then you must run 
  22.             the DOS utility GRAPTABL.COM before running 
  23.             this program.  GRAPTABL.COM loads the extended 
  24.             ASCII character    set for use in graphics mode.
  25.  
  26.     Note:    The Microsoft 5.1 graphics library does not support the
  27.             Hercules card.  The Microsoft 6.0 library does, but first
  28.             you have to install a TSR utility for it to work.
  29.  
  30.     Revision History:
  31.     -----------------
  32.     11/15/89 pmcm    added more detailed error messages
  33.     11/15/89 pmcm    added error checking on modes not supported by TC or MS
  34.     11/15/89 pmcm    added cases for Herc & Cpq40 mode support to TC version
  35.      1/31/90 jmd    added environment variable support
  36.      3/12/90 jql    corrected a spelling error in the horoscopes
  37.      4/01/90 jmd    ansi-fied
  38.      6/06/90 jmd    changed main to return an int
  39.      9/14/90 bkd    changed to use exit(0) instead of return(0).
  40.     10/19/90 pmcm    included ostdlib.h for exit(), added return(1)
  41.     11/02/90 ted    added m6, tc++ support.
  42.     12/01/90 ted    added oak_notused() macro to suppress warnings.
  43.     12/01/90 ted    prototyped main, except if Turbo C++.
  44.     12/04/90 ted    restored "" includes for C-scape headers (not <> includes).
  45.     12/08/90 pmcm    removed reference in note section re: defining M5
  46. */
  47.  
  48. #include <stdio.h>
  49.  
  50. #include "cscape.h"
  51. #include "ostdlib.h"
  52. #include "popdecl.h"
  53. #include "framer.h"
  54. #include "pcmode.h"
  55.  
  56.  
  57. /*** Conditionally include compiler-supplied graphics library header ***/
  58.  
  59. /*-----------------------------    Microsoft C specific ---------------------*/
  60.  
  61. #ifdef M6
  62. #include <graph.h>
  63. #endif
  64.  
  65. /*----------------------------- Borland Turbo C specific -----------------*/
  66.  
  67. #ifdef __TURBOC__
  68. #include <graphics.h>
  69.  
  70. /*     
  71.     Borland Users!
  72.     BGI_PATH is directory in which initgraph looks for the 
  73.     Borland .BGI files.  You may have to change this path 
  74.     depending on how you have installed your Turbo C compiler.
  75.     Consult the Turbo C manual under initgraph for more information.
  76.     Note that the backslashes in the path name must quoted
  77.     with a preceding backslash.
  78.  
  79.     You can also define the environment variable BGIPATH
  80.     which overrides this #define:
  81.     
  82.     set BGIPATH=\tc\bgi
  83. */
  84.  
  85. #define BGI_PATH     "\\TC\\"
  86.  
  87. #endif
  88.  
  89. /*----------------------------- End of Compiler specific includes -------------*/
  90.  
  91.  
  92.  
  93. /*** data structure to hold information about the demo ***/
  94. typedef struct {
  95.  
  96.     int        shape;                /* current shape type    */
  97.     int     size;                /* current shape size    */
  98.     int     color;                /* current painting color */
  99.  
  100.     int        hgt;                /* display height in pixels */
  101.     int        wid;                /* display width in pixels     */
  102.     int        ncolors;            /* number of available colors */
  103.  
  104.     byte     reg;                /* colors used by menus and popups */
  105.     byte     sel;
  106.  
  107. } dgraf_struct;
  108.  
  109.  
  110. /*** Macros and definitions ***/
  111.  
  112. #define nrand(n)    (rand() % n)
  113. #define BLANK    998     /* positive for compat w/ cs31 */
  114. #define QUIT    999
  115. #define MIXED    999
  116.  
  117. /*** Function prototypes ***/
  118.  
  119. /* Turbo C++ complains if main is prototyped */
  120. #ifndef TCP
  121. int main(void);
  122. #endif
  123.  
  124. int     draw(dgraf_struct *dgrafp);
  125.  
  126. /* User functions connected to pulldown menu */
  127.  
  128. int     u_erase(VOID *pdata, int  idata);
  129. int     u_shape(VOID *pdata, int  idata);
  130. int     u_size(VOID *pdata, int  idata);
  131. int     u_color(VOID *pdata, int  idata);
  132. int     u_horoscope(VOID *pdata, int  idata);
  133.  
  134. /* graphics routines */
  135.  
  136. int     dgraf_Init(dgraf_struct *dgrafp);
  137. void     dgraf_Line(opbox *opboxp, int color);
  138. void     dgraf_Rectangle(opbox *opboxp, int color);
  139. void     dgraf_FillRectangle(opbox *opboxp, int color);
  140. void     dgraf_Clear(void);
  141. void     dgraf_Ellipse(opbox *opboxp, int color);
  142.  
  143. /*** The pulldown menu definition ***/
  144.  
  145. struct frame_def main_menu[] = {
  146.  
  147.     {    "Erase",         u_erase,        BLANK},
  148.     { FRAME_END     },
  149.  
  150.     {    "Figure",         FNULL,             BLANK},
  151.     {    " Mixed  ",        u_shape,         MIXED},
  152.     {    " Line   ",     u_shape,         1},
  153.     {    " Circle ",     u_shape,        2},
  154.     {    " Square ",     u_shape,         3},
  155.     { FRAME_END     },
  156.  
  157.     {    "Size",         FNULL,             BLANK},
  158.     {    " Mixed  ",     u_size,         MIXED},
  159.     {    " Small  ",     u_size,         1},
  160.     {    " Medium ",     u_size,         2},
  161.     {    " Large  ",     u_size,            3},
  162.     { FRAME_END     },
  163.  
  164.     {    "Color",         FNULL,             BLANK},
  165.     {    " Mixed  ",     u_color,         MIXED},
  166.     {    " Single ",     u_color,         1},
  167.     { FRAME_END     },
  168.  
  169.     {    "Horoscope",    FNULL,            BLANK},
  170.     {    " Fast   ",     u_horoscope,     5},
  171.     {    " Medium ",     u_horoscope,     3},
  172.     {    " Slow   ",     u_horoscope,     1},
  173.     { FRAME_END     },
  174.  
  175.     {    "Quit",         FNULL,            QUIT},
  176.  
  177.     { FRAME_END     },
  178.     { FRAME_END     },
  179. };
  180.  
  181.  
  182. /*-----------------------------    MAIN -----------------------------------------*/
  183.  
  184. int main(void)
  185. {
  186.     dgraf_struct     dgraf;
  187.     sed_type         frame;
  188.     int             ret, key, x;
  189.  
  190.     /*  
  191.         Initialize the C-scape device interface:
  192.         def_ModeGraphics selects best available graphics mode;
  193.         grwin_Class saves graphic in the background window
  194.     */
  195.  
  196.     if (!disp_Init(def_ModeGraphics, grwin_Class)) {
  197.         printf("\nDEMOGRAF: No graphics hardware found; or, ");
  198.         printf("\n          -- Or, there is insufficient memory to initialize the OWL ...");
  199.         printf("\n             (this program requires a large memory model compilation).\n");
  200.         exit(1);
  201.         return(1);
  202.     }
  203.  
  204.     /* map colors for 2 color video modes */
  205.     if (disp_GetColors() <= 2L) {
  206.         disp_MapMono(TRUE);
  207.     }
  208.  
  209.     /* Initialize Graphics Library */
  210.     if ((x = dgraf_Init(&dgraf)) != 0) {
  211.         disp_Close();
  212.  
  213.  
  214. #ifdef __TURBOC__            /* Turbo C */
  215.     switch(x) {
  216.     case -2:
  217.         printf("\nDEMOGRAF: Turbo C initgraph cannot detect graphics card.\n");
  218.         break;
  219.     case -3:
  220.         printf("\nDEMOGRAF: Turbo C initgraph cannot find BGI driver file.\n");
  221.         break;
  222.     case -4:
  223.         printf("\nDEMOGRAF: Turbo C initgraph does not support this video hardware.\n");
  224.         break;
  225.     case -5:
  226.         printf("\nDEMOGRAF: Turbo C initgraph insufficient memory to load driver.\n");
  227.         break;
  228.     default:    
  229.         printf("\nDEMOGRAF: Turbo C initgraph error %d.\n", x);
  230.         break;
  231.     }
  232. #else
  233.         printf("\nDEMOGRAF: Microsoft C _setvideomode does not support this video hardware.\n");
  234. #endif
  235.  
  236.         exit(1);
  237.         return(1);
  238.     }
  239.  
  240.     /* Create the pulldown menu bar */
  241.     frame = frame_Open(main_menu, bd_1, dgraf.reg, dgraf.sel, dgraf.reg);
  242.     frame_Repaint(frame);
  243.  
  244.     while (TRUE) {
  245.  
  246.         while (!kb_Check()) {
  247.             draw(&dgraf);
  248.         }
  249.  
  250.         /* key pressed, read it and call pulldown menu */
  251.         key = kb_Read();
  252.         if ((ret = frame_Go(frame, key, (VOID *) &dgraf )) == QUIT) {
  253.             /* Quit selected, break out of while loop */
  254.             break;
  255.         }
  256.         /* if first letter search of menu failed, try again */
  257.         else if (ret == 0) {
  258.             if (frame_Go(frame, ' ', (VOID *) &dgraf ) == QUIT) {
  259.                 /* Quit selected, break out of while loop */
  260.                 break;
  261.             }
  262.         }
  263.     }
  264.  
  265.     /* close down device interface */
  266.     disp_Close();
  267.  
  268.     exit(0);
  269.     return(0);
  270. }
  271.  
  272. int draw(dgraf_struct *dgrafp)
  273. /*
  274.     Draws a shape using the current information
  275.     in the dgraf structure.
  276. */
  277. {
  278.     int shape, size, color;
  279.     opbox    box;
  280.  
  281.     shape = (dgrafp->shape == MIXED) ? nrand(3) + 1 : dgrafp->shape;
  282.     size  = (dgrafp->size  == MIXED) ? nrand(3) + 1: dgrafp->size;
  283.     color = (dgrafp->color == MIXED) ? nrand(dgrafp->ncolors) : dgrafp->color;
  284.  
  285.     box.ymin = nrand(dgrafp->hgt);
  286.     box.xmin = nrand(dgrafp->wid);
  287.     box.ymax = box.ymin + (dgrafp->hgt)/10 * size;
  288.     box.xmax = box.xmin + (dgrafp->wid)/10 * size;
  289.  
  290.     switch(shape) {
  291.     case 1:
  292.         dgraf_Line(&box, color);
  293.         break;
  294.     case 2:
  295.         dgraf_Ellipse(&box, color);
  296.         break;
  297.     case 3:
  298.         dgraf_Rectangle(&box, color);
  299.         break;
  300.     }
  301.  
  302.     return(TRUE);
  303. }
  304.  
  305. /*---------------------------------------------------------------------------*/
  306. /*    User functions: functions called from the pull down menu */
  307. /*  pdata is a pointer to the dgraf struct and is passed via frame_Go */
  308.  
  309. int u_erase(VOID *pdata, int  idata)
  310. /*
  311.     Erase the display
  312. */
  313. {
  314.     oak_notused(pdata);
  315.     oak_notused(idata);
  316.  
  317.     dgraf_Clear();
  318.  
  319.     return(1);
  320. }
  321.  
  322. int u_shape(VOID *pdata, int  idata)
  323. /*
  324.     Change the current shape to idata's value
  325.     idata is defined in the menu definition structure.
  326. */
  327. {
  328.     dgraf_struct *dgrafp;
  329.  
  330.     dgrafp = (dgraf_struct *) pdata;
  331.  
  332.     dgrafp->shape = idata;
  333.  
  334.     return(1);
  335. }
  336.  
  337. int u_size(VOID *pdata, int  idata)
  338. /*
  339.     Change the current size to idata's value
  340.     idata is defined in the menu definition structure.
  341. */
  342. {
  343.     dgraf_struct *dgrafp;
  344.  
  345.     dgrafp = (dgraf_struct *)pdata;
  346.  
  347.     dgrafp->size = idata;
  348.  
  349.     return(1);
  350. }
  351.  
  352. int u_color(VOID *pdata, int  idata)
  353. /*
  354.     Change the current color to idata's value
  355.     idata is defined in the menu definition structure.
  356. */
  357. {
  358.     dgraf_struct *dgrafp;
  359.  
  360.     dgrafp = (dgraf_struct *)pdata;
  361.  
  362.     dgrafp->color = idata;
  363.  
  364.     return(1);
  365. }
  366.  
  367. char *horoscope_msg[] = {
  368.   "AQUARIUS\nYou will find a substanstial amount of cash in your toothpaste.",
  369.   "PISCES\nYou will be the Elvis of the nineties.",
  370.   "ARIES\nA surprise gift of a lawn ornament is not out of the question.",
  371.   "TAURUS\nA dream about cows carries a clue to building a better life for yourself.",
  372.   "GEMINI\nAll your hard work will pay off; aluminum siding is yours for the asking.",
  373.   "CANCER\nA ringing pay phone holds your key to a world of fun.",
  374.   "LEO\nYou are too busy to waste time on horoscopes.",
  375.   "VIRGO\nA warped bowling alley will lead you to a major scientific discovery.",
  376.   "LIBRA\nYou will star in a major motion picture with Garrett Morris.",
  377.   "SCORPIO\nYou need a good change of pace.  Purchase some imported cheeses.",
  378.   "SAGITTARIUS\nGood times ahead, despite a boring horoscope.",
  379.   "CAPRICORN\nUnexpected company will be dropping in.  Be sure your bathroom is tidy."
  380. };
  381.  
  382. #define COUNT    (sizeof(horoscope_msg) / sizeof(char *))
  383.  
  384. int u_horoscope(VOID *pdata, int  idata)
  385. /*
  386.     Slides a window across the display.
  387.     idata determines the speed of the horoscope.
  388.     idata comes from the framer definition structure.
  389. */
  390. {
  391.     sed_type     sed;
  392.     int             col;
  393.     dgraf_struct *dgrafp;
  394.  
  395.     dgrafp = (dgraf_struct *)pdata;
  396.  
  397.     /* Create a message window */
  398.     sed = pop_Text(horoscope_msg[nrand(COUNT)], 10, disp_GetWidth(), -1, 22, dgrafp->reg, bd_1);
  399.  
  400.     /* Slide the window across the display */
  401.     for (col = disp_GetWidth(); col > -20; col -= idata) {
  402.         sed_SetPosition(sed, 10, col);
  403.     }
  404.  
  405.     /* Destroy the window */
  406.     sed_Close(sed);
  407.  
  408.     return(TRUE);
  409. }
  410.  
  411.  
  412. /*---------------------------------------------------------------------------*/
  413.  
  414. /*     
  415.     Portable graphics routines:
  416.     The following routines are defined for the various graphics libraries
  417.     supported.
  418. */
  419.  
  420. /*-----------------------------    Microsoft C specific ---------------------*/
  421.  
  422. #ifdef M6            /* Microsoft */
  423.  
  424. int dgraf_Init(dgraf_struct *dgrafp)
  425. /*
  426.     Initialize the graphics library.
  427.     Initialize demo data.
  428.  
  429.     Returns 
  430.             0     if successful    
  431.             -1    if the video hardware is unsupported by MS.
  432.  
  433.     Microsoft version.
  434. */
  435. {
  436.     struct    videoconfig config;        /* Microsoft defined structure */
  437.     int     char_height;            /* height of characters in pixels */
  438.     int     mode;
  439.  
  440.     switch(pc_GetMode()) {
  441.  
  442.        case 0x13:
  443.         mode = _MRES256COLOR;
  444.         char_height = 8;
  445.         break;
  446.  
  447.        case 0x12:
  448.         mode = _VRES16COLOR;
  449.         char_height = 16;
  450.         break;
  451.  
  452.        case 0x11:
  453.         mode = _VRES2COLOR;
  454.         char_height = 16;
  455.         break;
  456.  
  457.        case 0x10:
  458.         mode = _ERESCOLOR;
  459.         char_height = 16;
  460.         break;
  461.  
  462.        case 0x0f:
  463.         mode = _ERESNOCOLOR;
  464.         char_height = 14;
  465.         break;
  466.  
  467.        case 0x0e:
  468.         mode = _HRES16COLOR;
  469.         char_height = 8;
  470.         break;
  471.  
  472.        case 0x0d:
  473.         mode = _MRES16COLOR;
  474.         char_height = 8;
  475.         break;
  476.  
  477.        case 0x06:
  478.         mode = _HRESBW;
  479.         char_height = 8;
  480.         break;
  481.  
  482.        case 0x05:
  483.     case 0x04:
  484.         mode = _MRESNOCOLOR;
  485.         char_height = 8;
  486.         break;
  487.  
  488.     case 0x10A:
  489.     case 0x10B:
  490.         /* 
  491.         The    Hercules graphics card is not supported by Microsoft 5.1.  _HERCMONO
  492.         is in their graphic.h but does not work with _setvideomode, below.
  493.         */
  494.         mode = _HERCMONO;
  495.         char_height = 14;
  496.         break;
  497.  
  498.     case 0x140:
  499.         /* Compaq Plasma 40 not supported by Microsoft, fall through ... */
  500.  
  501.     default:
  502.         return(-1);
  503.     }
  504.  
  505.     /* initialize Microsoft video mode */
  506.     if ((_setvideomode(mode)) == 0) {
  507.         return(-1);    /* unsupported hardware configuration */
  508.     }
  509.  
  510.     /* initialize config structure */
  511.     _getvideoconfig(&config);
  512.  
  513.     dgraf_Clear();
  514.  
  515.     /* Set clip region to avoid drawing over menu bar */
  516.     _setcliprgn(0, char_height, config.numxpixels - 1, config.numypixels - 1);
  517.  
  518.     /* set up dgraf data */
  519.  
  520.     dgrafp->shape = MIXED;
  521.     dgrafp->size  = MIXED;
  522.     dgrafp->color = MIXED;
  523.  
  524.     dgrafp->hgt = config.numypixels;
  525.     dgrafp->wid = config.numxpixels;
  526.     dgrafp->ncolors = config.numcolors;
  527.  
  528.     /* Set up the menu colors */
  529.     if (disp_GetColors() > 2L) {
  530.         dgrafp->reg  = 0x34;
  531.         dgrafp->sel = 0x43;
  532.     }
  533.     else {
  534.         dgrafp->reg  = 0x10;
  535.         dgrafp->sel = 0x01;
  536.     }
  537.  
  538.     return(0);
  539. }
  540.  
  541. void dgraf_Line(opbox *opboxp, int color)
  542. /*
  543.     Draw a line from
  544.     (opboxp->xmin, opboxp->ymax) to (opboxp->xmax, opboxp->ymax)
  545.     with color color.
  546.  
  547.     Microsoft version.
  548. */
  549. {
  550.     _setcolor(color);
  551.     _moveto(opboxp->xmin, opboxp->ymin);
  552.     _lineto(opboxp->xmax, opboxp->ymax);
  553. }
  554.  
  555. void dgraf_Rectangle(opbox *opboxp, int color)
  556. /*
  557.     Draw a rectangle with corners
  558.     (opboxp->xmin, opboxp->ymax) (opboxp->xmax, opboxp->ymax)
  559.     with color color.
  560.  
  561.     Microsoft version.
  562. */
  563. {
  564.     _setcolor(color);
  565.     _rectangle(_GBORDER, opboxp->xmin, opboxp->ymin, opboxp->xmax, opboxp->ymax);
  566. }
  567.  
  568. void dgraf_Ellipse(opbox *opboxp, int color)
  569. /*
  570.     Draw an ellipse bounded by the rectangle with corners
  571.     (opboxp->xmin, opboxp->ymax) (opboxp->xmax, opboxp->ymax)
  572.     with color color.
  573.  
  574.     Microsoft version.
  575. */
  576. {
  577.     _setcolor(color);
  578.     _ellipse(_GBORDER, opboxp->xmin, opboxp->ymin, opboxp->xmax, opboxp->ymax);
  579. }
  580.  
  581. void dgraf_Clear()
  582. /*
  583.     Clear the display.
  584.  
  585.     Microsoft version.
  586. */
  587. {
  588.     _clearscreen(_GVIEWPORT);
  589. }
  590.  
  591. #endif
  592.  
  593.  
  594. /*----------------------------- Borland Turbo C specific -----------------*/
  595.  
  596.  
  597. #ifdef __TURBOC__            /* Turbo C */
  598.  
  599. int dgraf_Init(dgraf_struct *dgrafp)
  600. /*
  601.     Turbo C version.
  602.  
  603.     Initialize the graphics library.
  604.     Initialize demo data.
  605.  
  606.     Returns 
  607.             0 if successful.
  608.  
  609.             turbo initgraph error code if not successful:
  610.                 -2 cannot detect graphics card
  611.                 -3 cannot find driver file
  612.                 -4 invalid driver (unsupported video mode)
  613.                 -5 insufficient memory to load driver
  614.                 
  615.  
  616. */
  617.  
  618. {
  619.     int        mode, driver;
  620.     int     char_height;            /* height of characters in pixels */
  621.     char   *bgipath;    
  622.  
  623.     switch(pc_GetMode()) {
  624.  
  625.        case 0x12:
  626.         driver = VGA;
  627.         mode = VGAHI;
  628.         char_height = 16;
  629.         break;
  630.  
  631.        case 0x11:
  632.         driver = MCGA;
  633.         mode = MCGAHI;
  634.         char_height = 16;
  635.         break;
  636.  
  637.        case 0x10:
  638.         driver = EGA;
  639.         mode = EGAHI;
  640.         char_height = 16;
  641.         break;
  642.  
  643.        case 0x0f:
  644.         driver = EGAMONO;
  645.         mode = EGAMONOHI;
  646.         char_height = 14;
  647.         break;
  648.  
  649.        case 0x0e:
  650.         driver = EGA;
  651.         mode = EGALO;
  652.         char_height = 8;
  653.         break;
  654.  
  655.        case 0x06:
  656.         driver = CGA;
  657.         mode = CGAHI;
  658.         char_height = 8;
  659.         break;
  660.  
  661.        case 0x05:
  662.     case 0x04:
  663.         driver = CGA;
  664.         mode = CGAC1;
  665.         char_height = 8;
  666.         break;
  667.  
  668.     case 0x10A:
  669.     case 0x10B:
  670.         driver = HERCMONO;
  671.         mode = HERCMONOHI;
  672.         char_height = 14;
  673.         break;
  674.  
  675.     case 0x140:    /* Compaq plasma mode 40 */
  676.         driver = ATT400;
  677.         mode = ATT400HI;
  678.         char_height = 16;
  679.         break;
  680.  
  681.        case 0x13:    /* 320x200  (pc_Mode13) 256 color VGA/MCGA, fall through... */
  682.  
  683.        case 0x0d:    /* 320x200  (pc_ModeD)  16 color EGA, fall through...       */
  684.  
  685.     default:
  686.                 /* Not supported by TC -- return code for invalid driver */
  687.         return(-4);
  688.     }
  689.  
  690.     /* test for environment variable */
  691.     if ((bgipath = getenv("BGIPATH")) == NULL) {
  692.         bgipath = BGI_PATH;
  693.     }
  694.  
  695.     initgraph(&driver, &mode, bgipath);
  696.  
  697.     if (driver < 0) {
  698.         /* initgraph failed */
  699.         return(driver);
  700.     }
  701.  
  702.     dgraf_Clear();
  703.  
  704.     /* Set clip region to avoid drawing over menu bar */
  705.     setviewport(0, char_height, getmaxx(), getmaxy(), TRUE);
  706.  
  707.     /* set up dgraf data */
  708.  
  709.     dgrafp->shape = MIXED;
  710.     dgrafp->size  = MIXED;
  711.     dgrafp->color = MIXED;
  712.  
  713.     dgrafp->hgt = getmaxy();
  714.     dgrafp->wid = getmaxx();
  715.     dgrafp->ncolors = getmaxcolor() + 1;
  716.  
  717.     /* Set up the menu colors */
  718.     if (disp_GetColors() > 2L) {
  719.         dgrafp->reg  = 0x34;
  720.         dgrafp->sel = 0x43;
  721.     }
  722.     else {
  723.         dgrafp->reg  = 0x10;
  724.         dgrafp->sel = 0x01;
  725.     }
  726.  
  727.     return(0);
  728. }
  729.  
  730. void dgraf_Line(opbox *opboxp, int color)
  731. /*
  732.     Draw a line from
  733.     (opboxp->xmin, opboxp->ymax) to (opboxp->xmax, opboxp->ymax)
  734.     with color color.
  735.  
  736.     Turbo C version.
  737. */
  738. {
  739.     setcolor(color);
  740.     line(opboxp->xmin, opboxp->ymin, opboxp->xmax, opboxp->ymax);
  741. }
  742.  
  743. void dgraf_Rectangle(opbox *opboxp, int color)
  744. /*
  745.     Draw a rectangle with corners
  746.     (opboxp->xmin, opboxp->ymax) (opboxp->xmax, opboxp->ymax)
  747.     with color color.
  748.  
  749.     Turbo C version.
  750. */
  751. {
  752.     setcolor(color);
  753.     rectangle(opboxp->xmin, opboxp->ymin, opboxp->xmax, opboxp->ymax);
  754. }
  755.  
  756. void dgraf_Ellipse(opbox *opboxp, int color)
  757. /*
  758.     Draw an ellipse bounded by the rectangle with corners
  759.     (opboxp->xmin, opboxp->ymax) (opboxp->xmax, opboxp->ymax)
  760.     with color color.
  761.  
  762.     Turbo C version.
  763.  
  764.     Note:    This really draws circles not ellipses...
  765. */
  766. {
  767.     int rad, x, y;
  768.  
  769.     x = opboxp->xmin + ((opboxp->xmax - opboxp->xmin) / 2);
  770.     y = opboxp->ymin + ((opboxp->ymax - opboxp->ymin) / 2);
  771.     rad = (opboxp->xmax - opboxp->xmin) / 2;
  772.  
  773.     setcolor(color);
  774.     circle(x, y, rad);
  775. }
  776.  
  777. void dgraf_Clear()
  778. /*
  779.     Clear the display.
  780.  
  781.     Turbo C version.
  782. */
  783. {
  784.     clearviewport();
  785. }
  786.  
  787. #endif
  788. /*---------------------------------------------------------------------------*/
  789.  
  790.