ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/vga.c
Revision: 2.5
Committed: Mon Nov 2 16:01:05 1992 UTC (31 years, 6 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.4: +1 -0 lines
Log Message:
Changes for 32-bit PC port

File Contents

# Content
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 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 }