ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/aed.c
Revision: 1.1
Committed: Thu Feb 2 10:41:16 1989 UTC (35 years, 3 months ago) by greg
Content type: text/plain
Branch: MAIN
Log Message:
Initial revision

File Contents

# User Rev Content
1 greg 1.1 /* Copyright (c) 1987 Regents of the University of California */
2    
3     #ifndef lint
4     static char SCCSid[] = "$SunId$ LBL";
5     #endif
6    
7     /*
8     * aed.c - driver for AED 512 terminal.
9     *
10     * 2/2/87
11     */
12    
13     #include <stdio.h>
14    
15     #include "driver.h"
16    
17     #include "color.h"
18    
19    
20     /* AED command characters */
21    
22     #define AEDFMT "1888N" /* Format string to send to AED */
23     #define CSTAT 0100 /* Console status: lower case */
24     #define SCT 75 /* Set color lookup table */
25     #define SEC 67 /* Set color for vector drawing */
26     #define MOV 81 /* Set CAP (current access pointer) to x, y */
27     #define OPT 40 /* Miscellaneous terminal control */
28     #define SEN 71 /* Set encoding types */
29     #define RST 48 /* Reset terminal */
30     #define FFD 12 /* Clear screen */
31     #define EJC 85 /* Enable Joystick cursor positioning */
32     #define DJC 100 /* Disable Joystick cursor positioning */
33     #define SCC 99 /* Set Cursor Colors */
34     #define SCP 93 /* Set Cursor Parameters */
35     #define DFR 111 /* Draw Filled Rectangle */
36     #define RCP 106 /* Read Cursor Position */
37     #define ESC 27 /* Escape starts a command sequence */
38     #define SCS 96 /* Set Console Status */
39     #define END 1 /* Ctrl-A used to terminate command mode */
40    
41     #define BLK 0 /* color table entry for black */
42     #define WHT 7 /* color table entry for white */
43    
44     #define command(c) (putc(ESC, stdout), putc(c, stdout))
45     #define byte(b) putc(b, stdout)
46     #define string(s) fputs(s, stdout)
47     #define flush() fflush(stdout)
48    
49     #define GAMMA 2.0 /* exponent for color correction */
50    
51     #define MINCOLOR 8 /* start of device color table */
52    
53     #define NCOLORS 241 /* our color table size (prime) */
54    
55     #define hashcolr(c) ((67*(c)[RED]+59*(c)[GRN]+71*(c)[BLU])%NCOLORS)
56    
57     #define NCOLS 512 /* maximum # columns for output */
58     #define NROWS 512-COMHT /* maximum # rows for output */
59     #define COMHT 16 /* height of command line */
60     #define COMCW 63 /* maximum chars on command line */
61    
62     static COLR colrmap[256]; /* our color map */
63    
64     static COLR colrtbl[NCOLORS]; /* our color table */
65    
66     static int colres = 64; /* color resolution */
67    
68     int aed_close(), aed_clear(), aed_paintr(),
69     aed_getcur(), aed_comout(), aed_errout();
70    
71     static struct driver aed_driver = {
72     aed_close, aed_clear, aed_paintr, aed_getcur,
73     aed_comout, NULL,
74     NCOLS, NROWS
75     };
76    
77    
78     struct driver *
79     aed_init(name) /* open AED */
80     char *name;
81     {
82     if (ttyset(&aed_driver, fileno(stdin)) < 0) { /* set tty driver */
83     stderr_v("cannot access terminal\n");
84     return(NULL);
85     }
86     command(RST); /* reset AED */
87     longwait(2);
88     command(OPT);
89     byte(6); byte(1); /* AED command set */
90     command(SEN);
91     string(AEDFMT);
92     command(SCS); /* set console status */
93     byte(CSTAT);
94     command(SCC); /* set cursor type */
95     byte(BLK); byte(WHT); byte(15);
96     command(SCP);
97     byte('+'); byte(0); byte(1);
98     errvec = aed_errout; /* set error vector */
99     cmdvec = aed_errout;
100     if (wrnvec != NULL)
101     wrnvec = aed_errout;
102     return(&aed_driver);
103     }
104    
105    
106     static
107     aed_close() /* close AED */
108     {
109     errvec = stderr_v; /* reset error vector */
110     cmdvec = NULL;
111     if (wrnvec != NULL)
112     wrnvec = stderr_v;
113     aedsetcap(0, 0); /* go to bottom */
114     command(SEC);
115     byte(WHT); /* white text */
116     byte(END);
117     byte('\n'); /* scroll */
118     flush();
119     ttydone();
120     }
121    
122    
123     static
124     aed_clear(x, y) /* clear AED */
125     int x, y;
126     {
127     command(FFD);
128     flush();
129     makemap(); /* init color map */
130     }
131    
132    
133     static
134     aed_paintr(col, xmin, ymin, xmax, ymax) /* paint a rectangle */
135     COLOR col;
136     int xmin, ymin, xmax, ymax;
137     {
138     int ndx;
139    
140     if ((ndx = colindex(col)) < 0) { /* full table? */
141     colres >>= 1;
142     redraw();
143     return;
144     }
145     command(SEC); /* draw rectangle */
146     byte(ndx+MINCOLOR);
147     aedsetcap(xmin, ymin+COMHT);
148     command(DFR);
149     aedcoord(xmax-1, ymax+(-1+COMHT));
150     flush();
151     }
152    
153    
154     static int
155     aed_getcur(xp, yp) /* get cursor position */
156     int *xp, *yp;
157     {
158     int com;
159    
160     command(EJC); /* enable cursor */
161     com = getch(); /* get key */
162     command(DJC); /* disable cursor */
163     aedgetcap(xp, yp); /* get cursor position */
164     *yp -= COMHT; /* convert coordinates */
165     return(com); /* return key hit */
166     }
167    
168    
169     static
170     aed_comout(out) /* output to command line */
171     register char *out;
172     {
173     static int newl = 1;
174     static int inmsg = 0;
175    
176     while (*out) {
177     if (newl) { /* new line */
178     command(SEC);
179     byte(BLK);
180     aedsetcap(0, 0);
181     command(DFR);
182     aedcoord(NCOLS-1, COMHT-1);
183     aedsetcap(1, 4);
184     command(SEC); /* white text */
185     byte(WHT);
186     byte(END);
187     newl = 0;
188     }
189     switch (*out) {
190     case '\n': /* end of line */
191     newl = 1;
192     /* fall through */
193     case '\r':
194     inmsg = 0;
195     byte('\r');
196     break;
197     case '\b': /* back space */
198     if (inmsg > 0 && --inmsg < COMCW)
199     byte('\b');
200     break;
201     default: /* character */
202     if (inmsg++ < COMCW)
203     byte(*out);
204     break;
205     }
206     out++;
207     }
208     flush();
209     }
210    
211    
212     static
213     aed_errout(msg) /* print an error message */
214     char *msg;
215     {
216     aed_comout(msg);
217     if (*msg && msg[strlen(msg)-1] == '\n')
218     longwait(2);
219     }
220    
221    
222     /*
223     * aedsetcap - sets AED's current access pointer to (x, y).
224     */
225    
226     static
227     aedsetcap(x, y)
228     register int x, y;
229     {
230     command(MOV);
231     aedcoord(x, y);
232     }
233    
234     /*
235     * aedcoord - puts out an (x, y) coordinate in AED 8 bit format.
236     */
237    
238     static
239     aedcoord(x, y)
240     register int x, y;
241     {
242     byte(((x >> 4) & 0x30) | ((y >> 8) & 0x3));
243     byte(x & 0xff);
244     byte(y & 0xff);
245     }
246    
247    
248     static
249     aedgetcap(xp, yp) /* get cursor postion */
250     int *xp, *yp;
251     {
252     register int c;
253     /* get cursor postition */
254     command(RCP);
255     flush();
256     c = getch();
257     *xp = (c & 0x30) << 4;
258     *yp = (c & 0x3) << 8;
259     *xp |= getch();
260     *yp |= getch();
261     }
262    
263    
264     static int
265     colindex(col) /* return table index for color */
266     COLOR col;
267     {
268     static COLR clr;
269     int hval;
270     register int ndx, i;
271    
272     mapcolor(clr, col);
273    
274     hval = ndx = hashcolr(clr);
275    
276     for (i = 1; i < NCOLORS; i++) {
277     if (colrtbl[ndx][EXP] == 0) {
278     colrtbl[ndx][RED] = clr[RED];
279     colrtbl[ndx][GRN] = clr[GRN];
280     colrtbl[ndx][BLU] = clr[BLU];
281     colrtbl[ndx][EXP] = COLXS;
282     newcolr(ndx, clr);
283     return(ndx);
284     }
285     if ( colrtbl[ndx][RED] == clr[RED] &&
286     colrtbl[ndx][GRN] == clr[GRN] &&
287     colrtbl[ndx][BLU] == clr[BLU] )
288     return(ndx);
289     ndx = (hval + i*i) % NCOLORS;
290     }
291     return(-1);
292     }
293    
294    
295     static
296     newcolr(index, clr) /* enter a color into our table */
297     int index;
298     COLR clr;
299     {
300     command(SCT);
301     byte(index+MINCOLOR);
302     byte(1);
303     byte(clr[RED]);
304     byte(clr[GRN]);
305     byte(clr[BLU]);
306     flush();
307     }
308    
309    
310     static
311     mapcolor(clr, col) /* map to our color space */
312     COLR clr;
313     COLOR col;
314     {
315     register int i, p;
316     /* compute color table value */
317     for (i = 0; i < 3; i++) {
318     p = colval(col,i) * 256.0;
319     if (p < 0) p = 0;
320     else if (p >= 256) p = 255;
321     clr[i] = colrmap[p][i];
322     }
323     clr[EXP] = COLXS;
324     }
325    
326    
327     static
328     makemap() /* initialize the color map */
329     {
330     double pow();
331     int val;
332     register int i;
333    
334     for (i = 0; i < 256; i++) {
335     val = pow(i/256.0, 1.0/GAMMA) * colres;
336     val = (val*256 + 128) / colres;
337     colrmap[i][RED] = colrmap[i][GRN] = colrmap[i][BLU] = val;
338     colrmap[i][EXP] = COLXS;
339     }
340     for (i = 0; i < NCOLORS; i++)
341     colrtbl[i][EXP] = 0;
342     }
343    
344    
345     static
346     longwait(t) /* longer wait */
347     int t;
348     {
349     flush();
350     sleep(t);
351     }