home *** CD-ROM | disk | FTP | other *** search
/ Stars of Shareware: Raytrace & Morphing / SOS-RAYTRACE.ISO / programm / source / radsrc22 / src / rt / rview / vga.c < prev   
Encoding:
C/C++ Source or Header  |  1992-11-02  |  4.1 KB  |  197 lines

  1. /* Copyright (c) 1992 Regents of the University of California */
  2.  
  3. #ifndef lint
  4. static char SCCSid[] = "@(#)vga.c 2.1 9/22/92 LBL";
  5. #endif
  6.  
  7. /*
  8.  *  vga.c - driver for VGA graphics adaptor under MS-DOS
  9.  */
  10.  
  11. #include  <stdio.h>
  12.  
  13. #include  <graph.h>
  14.  
  15. #include  "driver.h"
  16.  
  17. #include  "color.h"
  18.  
  19. #define  GAMMA          2.2             /* exponent for color correction */
  20.  
  21.  
  22. int  vga_close(), vga_clear(), vga_paintr(), vga_comout(), vga_errout(),
  23.         vga_comin();
  24.  
  25. static struct driver  vga_driver = {
  26.     vga_close, vga_clear, vga_paintr, NULL,
  27.     vga_comout, vga_comin, NULL, 1.0
  28. };
  29.  
  30. static char  fatalerr[128];
  31.  
  32. static struct videoconfig  config;
  33.  
  34. extern char  *getenv();
  35.  
  36.  
  37. struct driver *
  38. vga_init(name, id)                      /* open VGA */
  39. char  *name, *id;
  40. {
  41.     static short  mode_pref[] = {_MRES256COLOR, -1};
  42.     static short  smode_pref[] = {_XRES256COLOR, _SVRES256COLOR,
  43.                     _VRES256COLOR, _MRES256COLOR, -1};
  44.     char  *ep;
  45.     register short  *mp;
  46.  
  47.     mp = !strcmp(name, "vga") ? mode_pref : smode_pref;
  48.     for ( ; *mp != -1; mp++)
  49.         if (_setvideomode(*mp))
  50.             break;
  51.     if (*mp == -1) {
  52.         _setvideomode(_DEFAULTMODE);
  53.         stderr_v(name);
  54.         stderr_v(": card not present or insufficient VGA memory\n");
  55.         return(NULL);
  56.     }
  57.     _getvideoconfig(&config);
  58.     _settextwindow(config.numtextrows-2, 1,
  59.             config.numtextrows, config.numtextcols);
  60.     vga_driver.xsiz = config.numxpixels;
  61.     vga_driver.ysiz = (long)config.numypixels*(config.numtextrows-3)
  62.                 /config.numtextrows;
  63.     switch (config.mode) {                  /* correct problems */
  64.     case _XRES256COLOR:
  65.         vga_driver.ysiz -= 16;
  66.         break;
  67.     case _MRES256COLOR:
  68.         vga_driver.pixaspect = 1.2;
  69.         break;
  70.     }
  71.     _setviewport(0, 0, vga_driver.xsiz, vga_driver.ysiz);
  72.     if ((ep = getenv("GAMMA")) != NULL)     /* make gamma map */
  73.         make_gmap(atof(ep));
  74.     else
  75.         make_gmap(GAMMA);
  76.     _remappalette(1, _BRIGHTWHITE);
  77.     _settextcolor(1);
  78.     ms_gcinit(&vga_driver);
  79.     errvec = vga_errout;
  80.     cmdvec = vga_comout;
  81.     if (wrnvec != NULL)
  82.         wrnvec = vga_comout;
  83.     return(&vga_driver);
  84. }
  85.  
  86.  
  87. static
  88. vga_close()                                     /* close VGA */
  89. {
  90.     ms_gcdone(&vga_driver);
  91.     _setvideomode(_DEFAULTMODE);
  92.     errvec = stderr_v;                      /* reset error vectors */
  93.     cmdvec = NULL;
  94.     if (wrnvec != NULL)
  95.         wrnvec = stderr_v;
  96.     if (fatalerr[0])
  97.         stderr_v(fatalerr);             /* repeat error message */
  98. }
  99.  
  100.  
  101. static
  102. vga_clear(x, y)                                 /* clear VGA */
  103. int  x, y;
  104. {
  105.     _clearscreen(_GCLEARSCREEN);
  106.     new_ctab(config.numcolors-2);           /* init color table */
  107. }
  108.  
  109.  
  110. static
  111. vga_paintr(col, xmin, ymin, xmax, ymax)         /* paint a rectangle */
  112. COLOR  col;
  113. int  xmin, ymin, xmax, ymax;
  114. {
  115.     extern int  vgacolr();
  116.  
  117.     _setcolor(get_pixel(col, vgacolr)+2);
  118.     _rectangle(_GFILLINTERIOR, xmin, vga_driver.ysiz-ymax,
  119.             xmax-1, vga_driver.ysiz-1-ymin);
  120.     vga_driver.inpready = kbhit();
  121. }
  122.  
  123.  
  124. static
  125. vga_comout(s)                           /* put s to text output */
  126. register char  *s;
  127. {
  128.     struct rccoord  tpos;
  129.     char  buf[128];
  130.     register char  *cp;
  131.  
  132.     for (cp = buf; ; s++) {
  133.         switch (*s) {
  134.         case '\b':
  135.         case '\r':
  136.         case '\0':
  137.             if (cp > buf) {
  138.                 *cp = '\0';
  139.                 _outtext(cp = buf);
  140.             }
  141.             if (*s == '\0')
  142.                 break;
  143.             tpos = _gettextposition();
  144.             _settextposition(tpos.row, *s=='\r' ? 1 : tpos.col-1);
  145.             continue;
  146.         default:
  147.             *cp++ = *s;
  148.             continue;
  149.         }
  150.         return(0);
  151.     }
  152.     fatalerr[0] = '\0';
  153. }
  154.  
  155.  
  156. static
  157. vga_errout(msg)
  158. register char  *msg;
  159. {      
  160.     static char  *fep = fatalerr;
  161.  
  162.     _outtext(msg);
  163.     while (*msg)
  164.         *fep++ = *msg++;
  165.     *fep = '\0';
  166.     if (fep > fatalerr && fep[-1] == '\n')
  167.         fep = fatalerr;
  168. }
  169.  
  170.  
  171. static
  172. vga_comin(buf, prompt)                  /* get input line from console */
  173. char  *buf;
  174. char  *prompt;
  175. {
  176.     extern int  getch();
  177.  
  178.     if (prompt != NULL)
  179.         _outtext(prompt);
  180.     editline(buf, getch, vga_comout);
  181.     vga_driver.inpready = kbhit();
  182. }
  183.  
  184.  
  185. static
  186. vgacolr(index, r, g, b)                /* enter a color into our table */
  187. int  index;
  188. int  r, g, b;
  189. {
  190.     register long  cl;
  191.  
  192.     cl = (long)b<<14 & 0x3f0000L;
  193.     cl |= g<<6 & 0x3f00;
  194.     cl |= r>>2;
  195.     _remappalette(index+2, cl);
  196. }
  197.