ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/vga.c
Revision: 2.10
Committed: Tue Mar 30 16:13:01 2004 UTC (20 years, 1 month ago) by schorsch
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R6P1, rad3R6
Changes since 2.9: +51 -36 lines
Log Message:
Continued ANSIfication. There are only bits and pieces left now.

File Contents

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