ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/vga.c
Revision: 2.4
Committed: Wed Oct 14 10:30:30 1992 UTC (31 years, 6 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.3: +7 -5 lines
Log Message:
Changes for 32-bit PC port

File Contents

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