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

# 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.5 ms_gcdone(&vga_driver);
91 greg 2.2 _setvideomode(_DEFAULTMODE);
92     errvec = stderr_v; /* reset error vectors */
93 greg 2.1 cmdvec = NULL;
94     if (wrnvec != NULL)
95     wrnvec = stderr_v;
96 greg 2.2 if (fatalerr[0])
97     stderr_v(fatalerr); /* repeat error message */
98 greg 2.1 }
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 greg 2.2 _settextposition(tpos.row, *s=='\r' ? 1 : tpos.col-1);
145 greg 2.1 continue;
146     default:
147     *cp++ = *s;
148     continue;
149     }
150     return(0);
151     }
152 greg 2.2 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 greg 2.1 }
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     }