ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/devmain.c
Revision: 2.3
Committed: Sat Feb 22 02:07:28 2003 UTC (21 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.2: +59 -5 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

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id$";
3 #endif
4 /*
5 * devmain.c - main for independent drivers.
6 *
7 * Redefine your initialization routine to dinit.
8 */
9
10 /* ====================================================================
11 * The Radiance Software License, Version 1.0
12 *
13 * Copyright (c) 1990 - 2002 The Regents of the University of California,
14 * through Lawrence Berkeley National Laboratory. All rights reserved.
15 *
16 * Redistribution and use in source and binary forms, with or without
17 * modification, are permitted provided that the following conditions
18 * are met:
19 *
20 * 1. Redistributions of source code must retain the above copyright
21 * notice, this list of conditions and the following disclaimer.
22 *
23 * 2. Redistributions in binary form must reproduce the above copyright
24 * notice, this list of conditions and the following disclaimer in
25 * the documentation and/or other materials provided with the
26 * distribution.
27 *
28 * 3. The end-user documentation included with the redistribution,
29 * if any, must include the following acknowledgment:
30 * "This product includes Radiance software
31 * (http://radsite.lbl.gov/)
32 * developed by the Lawrence Berkeley National Laboratory
33 * (http://www.lbl.gov/)."
34 * Alternately, this acknowledgment may appear in the software itself,
35 * if and wherever such third-party acknowledgments normally appear.
36 *
37 * 4. The names "Radiance," "Lawrence Berkeley National Laboratory"
38 * and "The Regents of the University of California" must
39 * not be used to endorse or promote products derived from this
40 * software without prior written permission. For written
41 * permission, please contact [email protected].
42 *
43 * 5. Products derived from this software may not be called "Radiance",
44 * nor may "Radiance" appear in their name, without prior written
45 * permission of Lawrence Berkeley National Laboratory.
46 *
47 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
48 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
49 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
50 * DISCLAIMED. IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR
51 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
52 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
53 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
54 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
55 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
56 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
57 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
58 * SUCH DAMAGE.
59 * ====================================================================
60 *
61 * This software consists of voluntary contributions made by many
62 * individuals on behalf of Lawrence Berkeley National Laboratory. For more
63 * information on Lawrence Berkeley National Laboratory, please see
64 * <http://www.lbl.gov/>.
65 */
66
67 #include "standard.h"
68
69 #include "color.h"
70
71 #include "driver.h"
72
73 struct driver *dev = NULL; /* output device */
74
75 FILE *devin, *devout; /* communications channels */
76
77 char *progname; /* driver name */
78
79 int r_clear(), r_paintr(), r_getcur(), r_comout(), r_comin(), r_flush();
80
81 int (*dev_func[NREQUESTS])() = { /* request handlers */
82 r_clear, r_paintr,
83 r_getcur, r_comout,
84 r_comin, r_flush
85 };
86
87
88 main(argc, argv) /* set up communications and main loop */
89 int argc;
90 char *argv[];
91 {
92 extern struct driver *dinit();
93 int com;
94 /* set up I/O */
95 progname = argv[0];
96 if (argc < 3) {
97 eputs("arg count\n");
98 quit(1);
99 }
100 devin = fdopen(atoi(argv[1]), "r");
101 devout = fdopen(atoi(argv[2]), "w");
102 if (devin == NULL || devout == NULL || getw(devin) != COM_SENDM) {
103 eputs("connection failure\n");
104 quit(1);
105 }
106 /* open device */
107 if ((dev = dinit(argv[0], argv[3])) == NULL)
108 quit(1);
109 putw(COM_RECVM, devout); /* verify initialization */
110 sendstate();
111 fflush(devout);
112 /* loop on requests */
113 while ((com = getc(devin)) != EOF) {
114 if (com >= NREQUESTS || dev_func[com] == NULL) {
115 eputs("invalid request\n");
116 quit(1);
117 }
118 (*dev_func[com])(); /* process request */
119 }
120 quit(0); /* all done, clean up and exit */
121 }
122
123
124 void
125 quit(code) /* close device and exit */
126 int code;
127 {
128 if (dev != NULL)
129 (*dev->close)();
130 exit(code);
131 }
132
133
134 r_clear() /* clear screen */
135 {
136 int xres, yres;
137
138 xres = getw(devin);
139 yres = getw(devin);
140 (*dev->clear)(xres, yres);
141 }
142
143
144 r_paintr() /* paint a rectangle */
145 {
146 COLOR col;
147 int xmin, ymin, xmax, ymax;
148
149 fread((char *)col, sizeof(COLOR), 1, devin);
150 xmin = getw(devin); ymin = getw(devin);
151 xmax = getw(devin); ymax = getw(devin);
152 (*dev->paintr)(col, xmin, ymin, xmax, ymax);
153 }
154
155
156 r_flush() /* flush output */
157 {
158 if (dev->flush != NULL)
159 (*dev->flush)();
160 putc(COM_FLUSH, devout);
161 sendstate();
162 fflush(devout);
163 }
164
165
166 r_getcur() /* get and return cursor position */
167 {
168 int c;
169 int x, y;
170 /* get it if we can */
171 if (dev->getcur == NULL) {
172 c = ABORT;
173 x = y = 0;
174 } else
175 c = (*dev->getcur)(&x, &y);
176 /* reply */
177 putc(COM_GETCUR, devout);
178 putc(c, devout);
179 putw(x, devout);
180 putw(y, devout);
181 fflush(devout);
182 }
183
184
185 r_comout() /* print string to command line */
186 {
187 char str[256];
188
189 mygets(str, devin);
190 (*dev->comout)(str);
191 }
192
193
194 r_comin() /* read string from command line */
195 {
196 char buf[256], *prompt;
197 /* get prompt */
198 if (getc(devin)) {
199 mygets(buf, devin);
200 prompt = buf;
201 } else
202 prompt = NULL;
203 /* get string */
204 (*dev->comin)(buf, prompt);
205 /* reply */
206 putc(COM_COMIN, devout);
207 myputs(buf, devout);
208 sendstate();
209 fflush(devout);
210 }
211
212
213 mygets(s, fp) /* get string from file (with nul) */
214 register char *s;
215 register FILE *fp;
216 {
217 register int c;
218
219 while ((c = getc(fp)) != EOF)
220 if ((*s++ = c) == '\0')
221 return;
222 *s = '\0';
223 }
224
225
226 myputs(s, fp) /* put string to file (with nul) */
227 register char *s;
228 register FILE *fp;
229 {
230 do
231 putc(*s, fp);
232 while (*s++);
233 }
234
235
236 void
237 eputs(s) /* put string to stderr */
238 register char *s;
239 {
240 static int midline = 0;
241
242 if (!*s)
243 return;
244 if (!midline++) {
245 fputs(progname, stderr);
246 fputs(": ", stderr);
247 }
248 fputs(s, stderr);
249 if (s[strlen(s)-1] == '\n') {
250 fflush(stderr);
251 midline = 0;
252 }
253 }
254
255
256 sendstate() /* send driver state variables */
257 {
258 fwrite((char *)&dev->pixaspect, sizeof(dev->pixaspect), 1, devout);
259 putw(dev->xsiz, devout);
260 putw(dev->ysiz, devout);
261 putw(dev->inpready, devout);
262 }