ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/meta/aed5.c
Revision: 1.4
Committed: Sat Nov 15 02:13:36 2003 UTC (20 years, 5 months ago) by schorsch
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R6P1, rad3R6
Changes since 1.3: +69 -38 lines
Log Message:
Continued ANSIfication, and reduced other compile warnings.

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: aed5.c,v 1.3 2003/10/27 10:28:59 schorsch Exp $";
3 #endif
4 /*
5 * aed.c - driver for AED 512 terminal.
6 *
7 * 7/8/86
8 */
9
10 #include <fcntl.h>
11
12 #include "platform.h"
13 #include "rtprocess.h"
14 #include "meta.h"
15
16
17 /* AED command characters */
18
19 #define AEDFMT "1888N" /* Format string to send to AED */
20 #define SCT 75 /* Set color lookup table */
21 #define SEC 67 /* Set color for vector drawing */
22 #define SBC 91 /* Set background color */
23 #define MOV 81 /* Set CAP (current access pointer) to x, y */
24 #define MVR 105 /* Set CAP relative */
25 #define DVA 65 /* Draw vector to new CAP x, y */
26 #define DVR 108 /* Draw vector relative */
27 #define WHR 92 /* Write horizontal runs */
28 #define OPT 40 /* Miscellaneous terminal control */
29 #define SEN 71 /* Set encoding types */
30 #define RST 48 /* Reset terminal */
31 #define FFD 12 /* Clear screen */
32 #define SCS 96 /* Set status */
33 #define DAI 114 /* Define area of interest */
34 #define EJC 85 /* Enable Joystick cursor positioning */
35 #define DJC 100 /* Disable Joystick cursor positioning */
36 #define SCC 99 /* Set Cursor Colors */
37 #define SCP 93 /* Set Cursor Parameters */
38 #define RCP 106 /* Read Cursor Position */
39 #define SAP 94 /* Set alphanumeric parameters */
40 #define SLS 49 /* Set Line Style */
41 #define DFR 111 /* Draw Filled Rectangle */
42 #define MAXRLEN 255 /* Maximum runlength for a span */
43 #define NUL 0 /* Null terminates run sequences */
44 #define ESC 27 /* Escape starts a command sequence */
45 #define END 1 /* Ctrl-A used to terminate command mode */
46
47 #define command(c) (putc(ESC, stdout), putc(c, stdout))
48 #define byte(b) putc(b, stdout)
49 #define ascii(c) putc(c, stdout)
50
51 #define BKGCOL 7 /* Background color (white) */
52
53 #define NROWS 512 /* # rows for output */
54 #define NCOLS 512 /* # columns for output */
55
56 #define xconv(x) CONV(x, NCOLS)
57 #define yconv(y) CONV(y, NROWS)
58
59 #define XCOM "pexpand +vOCIs -tpSUR %s"
60
61 char *progname;
62
63 static short newpage = TRUE;
64
65 static int curx = -1, /* current position */
66 cury = -1;
67
68 static int curcol = -1; /* current color */
69
70 static short curmod = -1; /* current line drawing mode */
71
72 static short cmode[4] = {0, 1, 2, 4}; /* color map */
73
74 static short lmode[4] = {255, 15, 85, 39}; /* line map */
75
76 static PRIMITIVE nextp;
77
78 static void init(void);
79 static void plot(FILE *infp);
80 static void doprim(register PRIMITIVE *p);
81 static void doglobal(PRIMITIVE *g);
82 static void longwait(int t);
83 static void shortwait(int t);
84 static void plotlseg(register PRIMITIVE *p);
85 static void printstr(register PRIMITIVE *p);
86 static void fillrect(register PRIMITIVE *p);
87 static void setcolor(int cn);
88 static void move(int x, int y);
89 static void draw(int x, int y);
90 static void aedcoord(register int x, register int y);
91
92
93 int
94 main(argc, argv)
95 int argc;
96 char **argv;
97 {
98 FILE *fp;
99 char comargs[200], shcom[300];
100 short condonly = FALSE, conditioned = FALSE;
101
102 progname = *argv++;
103 argc--;
104
105 while (argc && **argv == '-') {
106 switch (*(*argv+1)) {
107 case 'c':
108 condonly = TRUE;
109 break;
110 case 'r':
111 conditioned = TRUE;
112 break;
113 default:
114 error(WARNING, "unknown option");
115 break;
116 }
117 argv++;
118 argc--;
119 }
120
121 if (conditioned) {
122 init();
123 if (argc)
124 while (argc) {
125 fp = efopen(*argv, "r");
126 plot(fp);
127 fclose(fp);
128 argv++;
129 argc--;
130 }
131 else
132 plot(stdin);
133 } else {
134 comargs[0] = '\0';
135 while (argc) {
136 strcat(comargs, " ");
137 strcat(comargs, *argv);
138 argv++;
139 argc--;
140 }
141 sprintf(shcom, XCOM, comargs);
142 if (condonly)
143 return(system(shcom));
144 else {
145 init();
146 if ((fp = popen(shcom, "r")) == NULL)
147 error(SYSTEM, "cannot execute input filter");
148 plot(fp);
149 return(pclose(fp));
150 }
151 }
152 return(0);
153 }
154
155
156
157
158 static void
159 plot( /* plot meta-file */
160 FILE *infp
161 )
162
163 {
164
165 do {
166 readp(&nextp, infp);
167 while (isprim(nextp.com)) {
168 doprim(&nextp);
169 fargs(&nextp);
170 readp(&nextp, infp);
171 }
172 doglobal(&nextp);
173 fargs(&nextp);
174 }
175 while (nextp.com != PEOF);
176
177 }
178
179
180
181
182 static void
183 doglobal( /* execute a global command */
184 PRIMITIVE *g
185 )
186
187 {
188 int tty;
189 char c;
190
191 switch (g->com) {
192
193 case PEOF:
194 break;
195
196 case PDRAW:
197 fflush(stdout);
198 break;
199
200 case PEOP:
201 newpage = TRUE;
202 if (!isatty(fileno(stdout)))
203 break;
204 /* fall through */
205
206 case PPAUS:
207 fflush(stdout);
208 tty = open(TTY, O_RDWR);
209 if (g->args != NULL) {
210 write(tty, g->args, strlen(g->args));
211 write(tty, " - (hit return to continue)", 27);
212 }
213 else
214 write(tty, "\007", 1);
215 do {
216 c = '\n';
217 read(tty, &c, 1);
218 }
219 while (c != '\n' && c != '\r');
220 close(tty);
221 break;
222
223 default:
224 sprintf(errmsg, "unknown command '%c' in doglobal", g->com);
225 error(WARNING, errmsg);
226 break;
227 }
228
229 }
230
231
232
233 static void
234 doprim( /* plot primitive */
235 register PRIMITIVE *p
236 )
237
238 {
239
240 if (newpage) { /* clear screen */
241 command(FFD);
242 shortwait(50);
243 newpage = FALSE;
244 }
245
246 switch (p->com) {
247
248 case PLSEG:
249 plotlseg(p);
250 break;
251
252 case PMSTR:
253 printstr(p);
254 break;
255
256 case PRFILL:
257 fillrect(p);
258 break;
259
260 default:
261 sprintf(errmsg, "unknown command '%c' in doprim", p->com);
262 error(WARNING, errmsg);
263 return;
264 }
265
266 }
267
268
269
270
271
272 static void
273 printstr( /* output a string */
274 register PRIMITIVE *p
275 )
276
277 {
278 static int hsp[4] = {6, 5, 4, 3};
279 char font, size;
280 int hspace, vspace = 18;
281
282 hspace = hsp[(p->arg0 >> 4) & 03];
283
284 if (p->arg0 & 04)
285 hspace *= 2;
286
287 if (hspace > 16) {
288 font = '7'; size = '2';
289 } else if (hspace > 12) {
290 font = '5'; size = '2';
291 } else if (hspace > 8) {
292 font = '7'; size = '1';
293 } else {
294 font = '5'; size = '1';
295 }
296
297 command(SAP);
298 ascii(size); ascii(font);
299 byte(hspace); byte(vspace);
300 ascii('L');
301
302 setcolor(p->arg0 & 03);
303
304 move(p->xy[XMN], p->xy[YMX]);
305
306 putc(END, stdout);
307 fputs(p->args, stdout);
308
309 curx = -1;
310 cury = -1;
311 }
312
313
314
315
316 static void
317 plotlseg( /* plot a line segment */
318 register PRIMITIVE *p
319 )
320
321 {
322 static short right = FALSE;
323 int y1, y2;
324 short lm = (p->arg0 >> 4) & 03;
325
326 if (p->arg0 & 0100) {
327 y1 = p->xy[YMX];
328 y2 = p->xy[YMN];
329 }
330 else {
331 y1 = p->xy[YMN];
332 y2 = p->xy[YMX];
333 }
334
335 setcolor(p->arg0 & 03);
336
337 if (lm != curmod) {
338 command(SLS);
339 byte(lmode[lm]); byte(85);
340 curmod = lm;
341 }
342
343 if (p->xy[XMN] == curx && y1 == cury)
344 draw(p->xy[XMX], y2);
345 else if (p->xy[XMX] == curx && y2 == cury)
346 draw(p->xy[XMN], y1);
347 else if ((right = !right)) {
348 move(p->xy[XMN], y1);
349 draw(p->xy[XMX], y2);
350 } else {
351 move(p->xy[XMX], y2);
352 draw(p->xy[XMN], y1);
353 }
354 }
355
356
357 static void
358 fillrect(
359 register PRIMITIVE *p
360 )
361
362 {
363
364 setcolor(p->arg0 & 03);
365 move(p->xy[XMN], p->xy[YMN]);
366 curx = xconv(p->xy[XMX]);
367 cury = yconv(p->xy[YMX]);
368 command(DFR);
369 aedcoord(curx, cury);
370
371 }
372
373 static void
374 init(void) /* initialize terminal */
375 {
376 /* Reset AED and tell it the data format */
377 command(RST);
378 longwait(2);
379 command(OPT);
380 byte(6); byte(1); /* AED command set */
381 command(SEN); fputs(AEDFMT, stdout);
382 command(SBC); byte(BKGCOL);
383 }
384
385
386 static void
387 setcolor( /* set color */
388 int cn
389 )
390 {
391 if (cn != curcol) {
392 command(SEC);
393 byte(cmode[cn]);
394 curcol = cn;
395 }
396 }
397
398
399 static void
400 move( /* move to coordinate (x,y) */
401 int x,
402 int y
403 )
404 {
405 command(MOV);
406 aedcoord(xconv(x), yconv(y));
407 curx = x;
408 cury = y;
409 }
410
411
412 static void
413 draw( /* draw vector from CAP to (x,y) */
414 int x,
415 int y
416 )
417 {
418 command(DVA);
419 aedcoord(xconv(x), yconv(y));
420 curx = x;
421 cury = y;
422 }
423
424
425 /*
426 * aedcoord - puts out an (x, y) coordinate in AED 8 bit format.
427 */
428
429 static void
430 aedcoord(
431 register int x,
432 register int y
433 )
434 {
435 putc(((x >> 4) & 0x30) | ((y >> 8) & 0x3), stdout);
436 putc(x & 0xff, stdout);
437 putc(y & 0xff, stdout);
438 }
439
440
441 static void
442 longwait( /* longer wait */
443 int t
444 )
445 {
446 fflush(stdout);
447 sleep(t);
448 }
449
450
451 static void
452 shortwait( /* shorter wait */
453 int t
454 )
455 {
456 register long l = t*1000;
457
458 fflush(stdout);
459 while (l--)
460 ;
461 }