ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/vga.c
Revision: 2.8
Committed: Sat Feb 22 02:07:29 2003 UTC (21 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.7: +58 -4 lines
Log Message:
Changes and check-in for 3.5 release
Includes new source files and modifications not recorded for many years
See ray/doc/notes/ReleaseNotes for notes between 3.1 and 3.5 release

File Contents

# User Rev Content
1 greg 2.1 #ifndef lint
2 greg 2.8 static const char RCSid[] = "$Id$";
3 greg 2.1 #endif
4     /*
5     * vga.c - driver for VGA graphics adaptor under MS-DOS
6 greg 2.8 */
7    
8     /* ====================================================================
9     * The Radiance Software License, Version 1.0
10     *
11     * Copyright (c) 1990 - 2002 The Regents of the University of California,
12     * through Lawrence Berkeley National Laboratory. All rights reserved.
13     *
14     * Redistribution and use in source and binary forms, with or without
15     * modification, are permitted provided that the following conditions
16     * are met:
17     *
18     * 1. Redistributions of source code must retain the above copyright
19     * notice, this list of conditions and the following disclaimer.
20     *
21     * 2. Redistributions in binary form must reproduce the above copyright
22     * notice, this list of conditions and the following disclaimer in
23     * the documentation and/or other materials provided with the
24     * distribution.
25     *
26     * 3. The end-user documentation included with the redistribution,
27     * if any, must include the following acknowledgment:
28     * "This product includes Radiance software
29     * (http://radsite.lbl.gov/)
30     * developed by the Lawrence Berkeley National Laboratory
31     * (http://www.lbl.gov/)."
32     * Alternately, this acknowledgment may appear in the software itself,
33     * if and wherever such third-party acknowledgments normally appear.
34     *
35     * 4. The names "Radiance," "Lawrence Berkeley National Laboratory"
36     * and "The Regents of the University of California" must
37     * not be used to endorse or promote products derived from this
38     * software without prior written permission. For written
39     * permission, please contact [email protected].
40     *
41     * 5. Products derived from this software may not be called "Radiance",
42     * nor may "Radiance" appear in their name, without prior written
43     * permission of Lawrence Berkeley National Laboratory.
44     *
45     * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
46     * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
47     * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
48     * DISCLAIMED. IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR
49     * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
50     * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
51     * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
52     * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
53     * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
54     * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
55     * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
56     * SUCH DAMAGE.
57     * ====================================================================
58     *
59     * This software consists of voluntary contributions made by many
60     * individuals on behalf of Lawrence Berkeley National Laboratory. For more
61     * information on Lawrence Berkeley National Laboratory, please see
62     * <http://www.lbl.gov/>.
63 greg 2.1 */
64    
65 gregl 2.7 #include "standard.h"
66 greg 2.1
67     #include <graph.h>
68    
69     #include "driver.h"
70    
71     #include "color.h"
72    
73     #define GAMMA 2.2 /* exponent for color correction */
74    
75    
76 greg 2.2 int vga_close(), vga_clear(), vga_paintr(), vga_comout(), vga_errout(),
77     vga_comin();
78 greg 2.1
79     static struct driver vga_driver = {
80     vga_close, vga_clear, vga_paintr, NULL,
81 greg 2.2 vga_comout, vga_comin, NULL, 1.0
82 greg 2.1 };
83    
84 greg 2.2 static char fatalerr[128];
85    
86 greg 2.1 static struct videoconfig config;
87    
88 greg 2.2 extern char *getenv();
89 greg 2.1
90 greg 2.2
91 greg 2.1 struct driver *
92     vga_init(name, id) /* open VGA */
93     char *name, *id;
94     {
95 greg 2.4 static short mode_pref[] = {_MRES256COLOR, -1};
96     static short smode_pref[] = {_XRES256COLOR, _SVRES256COLOR,
97 greg 2.3 _VRES256COLOR, _MRES256COLOR, -1};
98 greg 2.2 char *ep;
99 greg 2.4 register short *mp;
100 greg 2.2
101 greg 2.4 mp = !strcmp(name, "vga") ? mode_pref : smode_pref;
102     for ( ; *mp != -1; mp++)
103     if (_setvideomode(*mp))
104 greg 2.2 break;
105 greg 2.4 if (*mp == -1) {
106 greg 2.2 _setvideomode(_DEFAULTMODE);
107 gregl 2.7 eputs(name);
108     eputs(": card not present or insufficient VGA memory\n");
109 greg 2.1 return(NULL);
110 greg 2.2 }
111 greg 2.1 _getvideoconfig(&config);
112     _settextwindow(config.numtextrows-2, 1,
113     config.numtextrows, config.numtextcols);
114     vga_driver.xsiz = config.numxpixels;
115 greg 2.2 vga_driver.ysiz = (long)config.numypixels*(config.numtextrows-3)
116 greg 2.1 /config.numtextrows;
117 greg 2.2 switch (config.mode) { /* correct problems */
118     case _XRES256COLOR:
119     vga_driver.ysiz -= 16;
120     break;
121     case _MRES256COLOR:
122     vga_driver.pixaspect = 1.2;
123     break;
124     }
125 greg 2.1 _setviewport(0, 0, vga_driver.xsiz, vga_driver.ysiz);
126 greg 2.2 if ((ep = getenv("GAMMA")) != NULL) /* make gamma map */
127     make_gmap(atof(ep));
128     else
129     make_gmap(GAMMA);
130     _remappalette(1, _BRIGHTWHITE);
131 greg 2.1 _settextcolor(1);
132 greg 2.2 ms_gcinit(&vga_driver);
133 gregl 2.7 erract[USER].pf =
134     erract[SYSTEM].pf =
135     erract[INTERNAL].pf =
136     erract[CONSISTENCY].pf = vga_errout;
137     erract[COMMAND].pf = vga_comout;
138     if (erract[WARNING].pf != NULL)
139     erract[WARNING].pf = vga_comout;
140 greg 2.1 return(&vga_driver);
141     }
142    
143    
144     static
145     vga_close() /* close VGA */
146     {
147 greg 2.5 ms_gcdone(&vga_driver);
148 greg 2.2 _setvideomode(_DEFAULTMODE);
149 gregl 2.7 erract[USER].pf = /* reset error vector */
150     erract[SYSTEM].pf =
151     erract[INTERNAL].pf =
152     erract[CONSISTENCY].pf = eputs;
153     erract[COMMAND].pf = NULL;
154     if (erract[WARNING].pf != NULL)
155     erract[WARNING].pf = wputs;
156 greg 2.2 if (fatalerr[0])
157 gregl 2.7 eputs(fatalerr); /* repeat error message */
158 greg 2.1 }
159    
160    
161     static
162     vga_clear(x, y) /* clear VGA */
163     int x, y;
164     {
165     _clearscreen(_GCLEARSCREEN);
166     new_ctab(config.numcolors-2); /* init color table */
167     }
168    
169    
170     static
171     vga_paintr(col, xmin, ymin, xmax, ymax) /* paint a rectangle */
172     COLOR col;
173     int xmin, ymin, xmax, ymax;
174     {
175     extern int vgacolr();
176    
177     _setcolor(get_pixel(col, vgacolr)+2);
178     _rectangle(_GFILLINTERIOR, xmin, vga_driver.ysiz-ymax,
179     xmax-1, vga_driver.ysiz-1-ymin);
180     vga_driver.inpready = kbhit();
181     }
182    
183    
184     static
185     vga_comout(s) /* put s to text output */
186     register char *s;
187     {
188     struct rccoord tpos;
189     char buf[128];
190     register char *cp;
191    
192     for (cp = buf; ; s++) {
193     switch (*s) {
194     case '\b':
195     case '\r':
196     case '\0':
197     if (cp > buf) {
198     *cp = '\0';
199     _outtext(cp = buf);
200     }
201     if (*s == '\0')
202     break;
203     tpos = _gettextposition();
204 greg 2.2 _settextposition(tpos.row, *s=='\r' ? 1 : tpos.col-1);
205 greg 2.1 continue;
206     default:
207     *cp++ = *s;
208     continue;
209     }
210     return(0);
211     }
212 greg 2.2 fatalerr[0] = '\0';
213     }
214    
215    
216     static
217     vga_errout(msg)
218     register char *msg;
219     {
220     static char *fep = fatalerr;
221    
222     _outtext(msg);
223     while (*msg)
224     *fep++ = *msg++;
225     *fep = '\0';
226     if (fep > fatalerr && fep[-1] == '\n')
227     fep = fatalerr;
228 greg 2.1 }
229    
230    
231     static
232     vga_comin(buf, prompt) /* get input line from console */
233     char *buf;
234     char *prompt;
235     {
236     extern int getch();
237    
238     if (prompt != NULL)
239     _outtext(prompt);
240     editline(buf, getch, vga_comout);
241     vga_driver.inpready = kbhit();
242     }
243    
244    
245     static
246     vgacolr(index, r, g, b) /* enter a color into our table */
247     int index;
248     int r, g, b;
249     {
250     register long cl;
251    
252     cl = (long)b<<14 & 0x3f0000L;
253     cl |= g<<6 & 0x3f00;
254     cl |= r>>2;
255     _remappalette(index+2, cl);
256     }