ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/aed.c
(Generate patch)

Comparing ray/src/rt/aed.c (file contents):
Revision 1.1 by greg, Thu Feb 2 10:41:16 1989 UTC vs.
Revision 2.6 by schorsch, Tue Mar 30 16:13:00 2004 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1987 Regents of the University of California */
2
1   #ifndef lint
2 < static char SCCSid[] = "$SunId$ LBL";
2 > static const char       RCSid[] = "$Id$";
3   #endif
6
4   /*
5   *  aed.c - driver for AED 512 terminal.
9 *
10 *     2/2/87
6   */
7  
8 + #include "copyright.h"
9 +
10   #include  <stdio.h>
11  
12 + #include  "rterror.h"
13 + #include  "color.h"
14   #include  "driver.h"
15  
17 #include  "color.h"
16  
19
17          /* AED command characters */
18  
19   #define AEDFMT  "1888N" /* Format string to send to AED */
# Line 46 | Line 43 | static char SCCSid[] = "$SunId$ LBL";
43   #define string(s)       fputs(s, stdout)
44   #define flush()         fflush(stdout)
45  
46 < #define  GAMMA          2.0             /* exponent for color correction */
46 > #define  GAMMA          2.5             /* exponent for color correction */
47  
48 < #define  MINCOLOR       8               /* start of device color table */
48 > #define  NCOLORS        248             /* our color table size */
49 > #define  MINPIX         8               /* minimum hardware color */
50  
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
51   #define  NCOLS          512             /* maximum # columns for output */
52 < #define  NROWS          512-COMHT       /* maximum # rows for output */
52 > #define  NROWS          483-COMHT       /* maximum # rows for output */
53   #define  COMHT          16              /* height of command line */
54   #define  COMCW          63              /* maximum chars on command line */
55  
56 < static COLR  colrmap[256];              /* our color map */
56 > static void aed_errout(char*);
57 > static void longwait(int t);
58 > static void aedgetcap(int  *xp, int *yp);
59 > static void aedsetcap(int  x, int y);
60 > static dr_newcolrf_t anewcolr;
61 > static void aedcoord(int  x, int y);
62  
63 < static COLR  colrtbl[NCOLORS];          /* our color table */
63 > static dr_closef_t aed_close;
64 > static dr_clearf_t aed_clear;
65 > static dr_paintrf_t aed_paintr;
66 > static dr_getcurf_t aed_getcur;
67 > static dr_comoutf_t comout;
68  
66 static int  colres = 64;                /* color resolution */
67
68 int  aed_close(), aed_clear(), aed_paintr(),
69                aed_getcur(), aed_comout(), aed_errout();
70
69   static struct driver  aed_driver = {
70          aed_close, aed_clear, aed_paintr, aed_getcur,
71 <        aed_comout, NULL,
72 <        NCOLS, NROWS
71 >        aed_comout, NULL, NULL,
72 >        1.0, NCOLS, NROWS
73   };
74  
75  
76   struct driver *
77 < aed_init(name)                          /* open AED */
78 < char  *name;
77 > aed_init(name, id)                      /* open AED */
78 > char  *name, *id;
79   {
80          if (ttyset(&aed_driver, fileno(stdin)) < 0) {   /* set tty driver */
81 <                stderr_v("cannot access terminal\n");
81 >                eputs("cannot access terminal\n");
82                  return(NULL);
83          }
84          command(RST);                                   /* reset AED */
# Line 95 | Line 93 | char  *name;
93          byte(BLK); byte(WHT); byte(15);
94          command(SCP);
95          byte('+'); byte(0); byte(1);
96 <        errvec = aed_errout;                            /* set error vector */
97 <        cmdvec = aed_errout;
98 <        if (wrnvec != NULL)
99 <                wrnvec = aed_errout;
96 >        make_gmap(GAMMA);                               /* make color map */
97 >        erract[USER].pf =                               /* set error vector */
98 >        erract[SYSTEM].pf =
99 >        erract[INTERNAL].pf =
100 >        erract[CONSISTENCY].pf = aed_errout;
101 >        erract[COMMAND].pf = aed_errout;
102 >        if (erract[WARNING].pf != NULL)
103 >                erract[WARNING].pf = aed_errout;
104          return(&aed_driver);
105   }
106  
107  
108 < static
109 < aed_close()                                     /* close AED */
108 > static void
109 > aed_close(void)                                 /* close AED */
110   {
111 <        errvec = stderr_v;                      /* reset error vector */
112 <        cmdvec = NULL;
113 <        if (wrnvec != NULL)
114 <                wrnvec = stderr_v;
111 >        erract[USER].pf =                       /* reset error vector */
112 >        erract[SYSTEM].pf =
113 >        erract[INTERNAL].pf =
114 >        erract[CONSISTENCY].pf = eputs;
115 >        erract[COMMAND].pf = NULL;
116 >        if (erract[WARNING].pf != NULL)
117 >                erract[WARNING].pf = wputs;
118          aedsetcap(0, 0);                        /* go to bottom */
119          command(SEC);
120          byte(WHT);                              /* white text */
# Line 125 | Line 130 | aed_clear(x, y)                                        /* clear AED */
130   int  x, y;
131   {
132          command(FFD);
133 +        new_ctab(NCOLORS);                      /* init color table */
134          flush();
129        makemap();                              /* init color map */
135   }
136  
137  
138 < static
138 > static void
139   aed_paintr(col, xmin, ymin, xmax, ymax)         /* paint a rectangle */
140   COLOR  col;
141   int  xmin, ymin, xmax, ymax;
142   {
143          int  ndx;
144  
145 <        if ((ndx = colindex(col)) < 0) {                /* full table? */
146 <                colres >>= 1;
147 <                redraw();
143 <                return;
144 <        }
145 <        command(SEC);                                   /* draw rectangle */
146 <        byte(ndx+MINCOLOR);
145 >        ndx = get_pixel(col, anewcolr);         /* calls anewcolr() */
146 >        command(SEC);                           /* draw rectangle */
147 >        byte(ndx+MINPIX);
148          aedsetcap(xmin, ymin+COMHT);
149          command(DFR);
150          aedcoord(xmax-1, ymax+(-1+COMHT));
# Line 166 | Line 167 | int  *xp, *yp;
167   }
168  
169  
170 < static
170 > static void
171   aed_comout(out)                         /* output to command line */
172   register char  *out;
173   {
# Line 209 | Line 210 | register char  *out;
210   }
211  
212  
213 < static
213 > static void
214   aed_errout(msg)                         /* print an error message */
215   char  *msg;
216   {
# Line 223 | Line 224 | char  *msg;
224   * aedsetcap - sets AED's current access pointer to (x, y).
225   */
226  
227 < static
227 > static void
228   aedsetcap(x, y)
229   register int  x, y;
230   {
# Line 235 | Line 236 | register int  x, y;
236   * aedcoord - puts out an (x, y) coordinate in AED 8 bit format.
237   */
238  
239 < static
239 > static void
240   aedcoord(x, y)
241   register int  x, y;
242   {
# Line 245 | Line 246 | register int  x, y;
246   }
247  
248  
249 < static
249 > static void
250   aedgetcap(xp, yp)               /* get cursor postion */
251   int  *xp, *yp;
252   {
# Line 261 | Line 262 | int  *xp, *yp;
262   }
263  
264  
265 < static int
266 < 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 */
265 > static void
266 > anewcolr(index, r, g, b)                /* enter a color into our table */
267   int  index;
268 < COLR  clr;
268 > int  r, g, b;
269   {
270          command(SCT);
271 <        byte(index+MINCOLOR);
271 >        byte((index+MINPIX)&255);
272          byte(1);
273 <        byte(clr[RED]);
274 <        byte(clr[GRN]);
275 <        byte(clr[BLU]);
273 >        byte(r);
274 >        byte(g);
275 >        byte(b);
276          flush();
277   }
278  
279  
280 < 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
280 > static void
281   longwait(t)             /* longer wait */
282   int  t;
283   {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines