ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/t4027.c
Revision: 2.4
Committed: Sun Mar 28 20:33:14 2004 UTC (20 years ago) by schorsch
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R6P1, rad3R6
Changes since 2.3: +48 -20 lines
Log Message:
Continued ANSIfication, and other fixes and clarifications.

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: t4027.c,v 2.3 2004/01/02 12:46:13 schorsch Exp $";
3 #endif
4 /*
5 * t4027.c - program to dump pixel file to Tektronix 4027.
6 *
7 * 8/15/85
8 */
9
10 #include <stdio.h>
11 #ifndef _WIN32
12 #include <unistd.h>
13 #endif
14
15 #include "color.h"
16
17
18 #define NROWS 462
19 #define NCOLS 640
20
21 #define COM 31 /* command character */
22
23 char *progname;
24
25 static void plotscan(COLOR scan[], int len, int y);
26 static int colormap(COLOR col);
27 static void vector(int x0, int y0, int x1, int y1);
28 static void setdcolr(int col);
29 static void printpat(int p);
30 static int rorb(int b);
31
32
33 int
34 main(
35 int argc,
36 char **argv
37 )
38 {
39 int xres, yres;
40 COLOR scanline[NCOLS];
41 char sbuf[128];
42 FILE *fp;
43 register int i;
44
45 progname = argv[0];
46
47 if (argc < 2)
48 fp = stdin;
49 else if ((fp = fopen(argv[1], "r")) == NULL) {
50 fprintf(stderr, "%s: can't open file \"%s\"\n",
51 progname, argv[1]);
52 exit(1);
53 }
54 /* discard header */
55 while (fgets(sbuf, sizeof(sbuf), fp) != NULL && sbuf[0] != '\n')
56 ;
57 /* get picture dimensions */
58 if (fgets(sbuf, sizeof(sbuf), fp) == NULL ||
59 sscanf(sbuf, "-Y %d +X %d\n", &yres, &xres) != 2) {
60 fprintf(stderr, "%s: bad picture size\n", progname);
61 exit(1);
62 }
63 if (xres > NCOLS || yres > NROWS) {
64 fprintf(stderr, "%s: resolution mismatch\n", progname);
65 exit(1);
66 }
67
68 printf("%cMON1H", COM);
69 printf("%cGRA1 33", COM);
70
71 for (i = 0; i < yres; i++) {
72 if (freadscan(scanline, xres, fp) < 0) {
73 fprintf(stderr, "%s: read error\n", progname);
74 exit(1);
75 }
76 plotscan(scanline, xres, NROWS-1-i);
77 }
78 fclose(fp);
79
80 #ifndef _WIN32 /* XXX extract console functions */
81 if (isatty(fileno(stdout))) {
82 printf("Hit return when done: ");
83 fflush(stdout);
84 fp = fopen("/dev/tty", "r");
85 getc(fp);
86 fclose(fp);
87 printf("%cMON34", COM);
88 }
89 putchar('\r');
90 #endif
91
92 exit(0);
93 return 0; /* pro forma return */
94 }
95
96
97 static void
98 plotscan( /* plot a scanline */
99 COLOR scan[],
100 int len,
101 int y
102 )
103 {
104 int color, lastcolor = -1;
105 int lastpos = -1;
106 register int i;
107
108 for (i = 0; i < len; i++) {
109
110 color = colormap(scan[i]);
111 if (color != lastcolor) {
112 if (lastpos >= 0) {
113 setdcolr(lastcolor);
114 vector(lastpos, y, i, y);
115 }
116 lastcolor = color;
117 lastpos = i;
118 }
119 }
120 setdcolr(lastcolor);
121 vector(lastpos, y, len-1, y);
122 }
123
124
125 static int
126 colormap( /* compute 4027 color value for col */
127 COLOR col
128 )
129 {
130 register int red, grn, blu;
131
132 red = col[RED] >= 1.0 ? 3 : col[RED]*4;
133 grn = col[GRN] >= 1.0 ? 3 : col[GRN]*4;
134 blu = col[BLU] >= 1.0 ? 3 : col[BLU]*4;
135
136 return(red<<4 | grn<<2 | blu);
137 }
138
139
140 static void
141 vector( /* output a vector */
142 int x0,
143 int y0,
144 int x1,
145 int y1
146 )
147 {
148 printf("%cVEC%d %d %d %d", COM, x0, y0, x1, y1);
149 }
150
151
152 static void
153 setdcolr( /* set dithered pattern for terminal */
154 int col
155 )
156 {
157 static int cmask[3][4] = {
158 { 0, 0x88, 0xca, 0xff },
159 { 0, 0x44, 0xb2, 0xff },
160 { 0, 0x22, 0x2d, 0xff }
161 };
162 /* isset is a common bitmap related macro in <sys/param.h> */
163 static short cisset[64];
164 int pat;
165 register int r, g, b;
166
167 if (cisset[col]) {
168 printf("%cCOL P%d", COM, col);
169 return;
170 }
171
172 printf("%cPAT P%d C7", COM, col);
173
174 r = cmask[0][col>>4];
175 g = cmask[1][(col>>2) & 03];
176 b = cmask[2][col & 03];
177
178 pat = r & ~(g|b);
179 if (pat) {
180 printf(" C1"); /* red */
181 printpat(pat);
182 }
183 pat = g & ~(r|b);
184 if (pat) {
185 printf(" C2"); /* green */
186 printpat(pat);
187 }
188 pat = b & ~(r|g);
189 if (pat) {
190 printf(" C3"); /* blue */
191 printpat(pat);
192 }
193 pat = r & g & ~b;
194 if (pat) {
195 printf(" C4"); /* yellow */
196 printpat(pat);
197 }
198 pat = r & b & ~g;
199 if (pat) {
200 printf(" C6"); /* magenta */
201 printpat(pat);
202 }
203 pat = g & b & ~r;
204 if (pat) {
205 printf(" C5"); /* cyan */
206 printpat(pat);
207 }
208 pat = r & g & b;
209 if (pat) {
210 printf(" C0"); /* white */
211 printpat(pat);
212 }
213 cisset[col] = 1;
214 printf("%cCOL P%d", COM, col);
215 }
216
217
218 static void
219 printpat( /* print out a pattern */
220 register int p
221 )
222 {
223 register int i;
224
225 for (i = 0; i < 14; i++) { /* 14 rows */
226
227 printf(",%d", p);
228 p = rorb(rorb(rorb(p))); /* rotate 3 bits */
229 }
230 }
231
232
233 static int
234 rorb( /* rotate a byte to the right */
235 register int b
236 )
237 {
238 b |= (b&01) << 8;
239 b >>= 1;
240 return(b);
241 }