ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/pvalue.c
Revision: 2.27
Committed: Fri Oct 1 07:45:30 2004 UTC (19 years, 6 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.26: +4 -7 lines
Log Message:
Fixed bug where pvalue -o would report watts/sr/m^2 from XYZE input

File Contents

# User Rev Content
1 greg 1.1 #ifndef lint
2 greg 2.27 static const char RCSid[] = "$Id: pvalue.c,v 2.26 2004/03/28 20:33:14 schorsch Exp $";
3 greg 1.1 #endif
4     /*
5     * pvalue.c - program to print pixel values.
6     *
7     * 4/23/86
8     */
9    
10 greg 2.24 #include "platform.h"
11 greg 1.8 #include "standard.h"
12 greg 1.1 #include "color.h"
13 greg 1.8 #include "resolu.h"
14 schorsch 2.26 #include "view.h"
15 greg 2.15
16 greg 2.5 #define min(a,b) ((a)<(b)?(a):(b))
17 greg 1.1
18 greg 2.10 /* what to put out (also RED, GRN, BLU) */
19     #define ALL 3
20     #define BRIGHT 4
21    
22 greg 2.5 RESOLU picres; /* resolution of picture */
23 greg 1.6 int uniq = 0; /* print only unique values? */
24 greg 2.7 int doexposure = 0; /* exposure change? (>100 to print) */
25 greg 1.1 int dataonly = 0; /* data only format? */
26 greg 2.10 int putprim = ALL; /* what to put out */
27 greg 1.1 int reverse = 0; /* reverse conversion? */
28     int format = 'a'; /* input/output format */
29 greg 1.6 char *fmtid = "ascii"; /* format identifier for header */
30 greg 2.3 int header = 1; /* do header? */
31 greg 2.10 long skipbytes = 0; /* skip bytes in input? */
32 greg 2.23 int swapbytes = 0; /* swap bytes? */
33 greg 2.12 int interleave = 1; /* file is interleaved? */
34 greg 2.3 int resolution = 1; /* put/get resolution string? */
35 greg 2.7 int original = 0; /* convert to original values? */
36 greg 1.6 int wrongformat = 0; /* wrong input format? */
37 greg 2.5 double gamcor = 1.0; /* gamma correction */
38 greg 1.7
39 greg 2.4 int ord[3] = {RED, GRN, BLU}; /* RGB ordering */
40     int rord[4]; /* reverse ordering */
41    
42 greg 1.5 COLOR exposure = WHTCOLOR;
43 greg 1.1
44     char *progname;
45    
46     FILE *fin;
47 greg 2.10 FILE *fin2 = NULL, *fin3 = NULL; /* for other color channels */
48 greg 1.1
49 schorsch 2.26
50     typedef int getfunc_t(COLOR col);
51     typedef int putfunc_t(COLOR col);
52     typedef double brightfunc_t(COLOR col);
53    
54     getfunc_t *getval;
55     putfunc_t *putval;
56     brightfunc_t *mybright;
57 greg 1.1
58 schorsch 2.25 static gethfunc checkhead;
59 schorsch 2.26 static brightfunc_t rgb_bright, xyz_bright;
60     static getfunc_t getbascii, getbint, getbdouble, getbfloat, getbbyte, getbword;
61     static getfunc_t getcascii, getcint, getcdouble, getcfloat, getcbyte, getcword;
62     static putfunc_t putbascii, putbint, putbdouble, putbfloat, putbbyte, putbword;
63     static putfunc_t putcascii, putcint, putcdouble, putcfloat, putcbyte, putcword;
64     static putfunc_t putpascii, putpint, putpdouble, putpfloat, putpbyte, putpword;
65    
66     static void set_io(void);
67     static void pixtoval(void);
68     static void valtopix(void);
69     static void swap16(uint16 *wp, int n);
70     static void swap32(uint32 *wp, int n);
71     static void swap64(char *wp, int n);
72    
73    
74     static double
75     rgb_bright(
76     COLOR clr
77     )
78 greg 2.14 {
79     return(bright(clr));
80     }
81    
82 schorsch 2.26 static double
83     xyz_bright(
84     COLOR clr
85     )
86 greg 2.14 {
87     return(clr[CIEY]);
88     }
89    
90 schorsch 2.26 int
91     main(
92     int argc,
93     char **argv
94     )
95 greg 1.1 {
96 greg 2.7 double d, expval = 1.0;
97 greg 1.1 int i;
98    
99     progname = argv[0];
100 schorsch 2.26 mybright = &rgb_bright; /* default */
101 greg 1.1
102     for (i = 1; i < argc; i++)
103 greg 1.8 if (argv[i][0] == '-' || argv[i][0] == '+')
104 greg 1.1 switch (argv[i][1]) {
105 greg 1.8 case 'h': /* header */
106     header = argv[i][0] == '+';
107 greg 1.1 break;
108 greg 2.3 case 'H': /* resolution string */
109     resolution = argv[i][0] == '+';
110     break;
111 greg 2.10 case 's': /* skip bytes in header */
112     skipbytes = atol(argv[++i]);
113     break;
114 greg 1.1 case 'u': /* unique values */
115 greg 1.8 uniq = argv[i][0] == '-';
116 greg 1.1 break;
117     case 'o': /* original values */
118 greg 1.8 original = argv[i][0] == '-';
119 greg 1.1 break;
120 greg 1.7 case 'g': /* gamma correction */
121 greg 2.7 gamcor = atof(argv[i+1]);
122 greg 1.8 if (argv[i][0] == '+')
123     gamcor = 1.0/gamcor;
124 greg 2.7 i++;
125 greg 1.7 break;
126 greg 2.7 case 'e': /* exposure correction */
127     d = atof(argv[i+1]);
128     if (argv[i+1][0] == '-' || argv[i+1][0] == '+')
129     d = pow(2.0, d);
130     if (argv[i][0] == '-')
131 greg 2.9 expval *= d;
132 greg 2.7 scalecolor(exposure, d);
133     doexposure++;
134     i++;
135     break;
136 greg 2.4 case 'R': /* reverse byte sequence */
137     if (argv[i][0] == '-') {
138     ord[0]=BLU; ord[1]=GRN; ord[2]=RED;
139     } else {
140     ord[0]=RED; ord[1]=GRN; ord[2]=BLU;
141     }
142     break;
143 greg 1.1 case 'r': /* reverse conversion */
144 greg 1.8 reverse = argv[i][0] == '-';
145 greg 1.1 break;
146 greg 2.12 case 'n': /* non-interleaved RGB */
147     interleave = argv[i][0] == '+';
148     break;
149 greg 1.1 case 'b': /* brightness values */
150 greg 2.10 putprim = argv[i][0] == '-' ? BRIGHT : ALL;
151 greg 1.1 break;
152 greg 2.10 case 'p': /* put primary */
153     switch (argv[i][2]) {
154     case 'r': case 'R': putprim = RED; break;
155     case 'g': case 'G': putprim = GRN; break;
156     case 'b': case 'B': putprim = BLU; break;
157     default: goto unkopt;
158     }
159     break;
160 greg 1.1 case 'd': /* data only (no indices) */
161 greg 1.8 dataonly = argv[i][0] == '-';
162 greg 1.1 switch (argv[i][2]) {
163     case '\0':
164     case 'a': /* ascii */
165     format = 'a';
166 greg 1.6 fmtid = "ascii";
167 greg 1.1 break;
168     case 'i': /* integer */
169 greg 1.6 format = 'i';
170     fmtid = "ascii";
171     break;
172 greg 1.1 case 'b': /* byte */
173 greg 1.8 dataonly = 1;
174 greg 1.6 format = 'b';
175     fmtid = "byte";
176     break;
177 greg 2.16 case 'W': /* 16-bit swapped */
178     swapbytes = 1;
179 greg 2.15 case 'w': /* 16-bit */
180     dataonly = 1;
181     format = 'w';
182     fmtid = "16-bit";
183     break;
184 greg 2.23 case 'F': /* swapped floats */
185     swapbytes = 1;
186 greg 1.1 case 'f': /* float */
187 greg 1.8 dataonly = 1;
188 greg 1.6 format = 'f';
189     fmtid = "float";
190     break;
191 greg 2.23 case 'D': /* swapped doubles */
192     swapbytes = 1;
193 greg 1.1 case 'd': /* double */
194 greg 1.8 dataonly = 1;
195 greg 1.6 format = 'd';
196     fmtid = "double";
197 greg 1.1 break;
198     default:
199     goto unkopt;
200     }
201     break;
202     case 'x': /* x resolution */
203 greg 2.6 case 'X': /* x resolution */
204 greg 2.3 resolution = 0;
205 greg 1.8 if (argv[i][0] == '-')
206 greg 2.14 picres.rt |= XDECR;
207 greg 1.8 picres.xr = atoi(argv[++i]);
208 greg 1.1 break;
209     case 'y': /* y resolution */
210 greg 2.6 case 'Y': /* y resolution */
211 greg 2.3 resolution = 0;
212 greg 1.8 if (argv[i][0] == '-')
213 greg 2.14 picres.rt |= YDECR;
214 greg 1.8 if (picres.xr == 0)
215 greg 2.14 picres.rt |= YMAJOR;
216 greg 1.8 picres.yr = atoi(argv[++i]);
217 greg 1.1 break;
218     default:
219     unkopt:
220     fprintf(stderr, "%s: unknown option: %s\n",
221     progname, argv[i]);
222     quit(1);
223     break;
224     }
225     else
226     break;
227 greg 1.6 /* recognize special formats */
228 schorsch 2.22 if (dataonly && format == 'b') {
229 greg 2.17 if (putprim == ALL)
230     fmtid = "24-bit_rgb";
231     else
232 greg 1.6 fmtid = "8-bit_grey";
233 schorsch 2.22 }
234     if (dataonly && format == 'w') {
235 greg 2.17 if (putprim == ALL)
236     fmtid = "48-bit_rgb";
237 greg 1.6 else
238 greg 2.15 fmtid = "16-bit_grey";
239 schorsch 2.22 }
240 greg 2.4 /* assign reverse ordering */
241     rord[ord[0]] = 0;
242     rord[ord[1]] = 1;
243     rord[ord[2]] = 2;
244     /* get input */
245 greg 1.1 if (i == argc) {
246     fin = stdin;
247 greg 2.10 } else if (i < argc) {
248 greg 1.1 if ((fin = fopen(argv[i], "r")) == NULL) {
249     fprintf(stderr, "%s: can't open file \"%s\"\n",
250     progname, argv[i]);
251     quit(1);
252     }
253 greg 2.17 if (reverse && putprim != BRIGHT && i == argc-3) {
254 greg 2.10 if ((fin2 = fopen(argv[i+1], "r")) == NULL) {
255     fprintf(stderr, "%s: can't open file \"%s\"\n",
256     progname, argv[i+1]);
257     quit(1);
258     }
259     if ((fin3 = fopen(argv[i+2], "r")) == NULL) {
260     fprintf(stderr, "%s: can't open file \"%s\"\n",
261     progname, argv[i+2]);
262     quit(1);
263     }
264 greg 2.12 interleave = -1;
265 greg 2.10 } else if (i != argc-1)
266     fin = NULL;
267 greg 2.17 if (reverse && putprim != BRIGHT && !interleave) {
268 greg 2.12 fin2 = fopen(argv[i], "r");
269     fin3 = fopen(argv[i], "r");
270     }
271     if (skipbytes && (fseek(fin, skipbytes, 0) || (fin2 != NULL &&
272     (fseek(fin2, skipbytes, 0) ||
273     fseek(fin3, skipbytes, 0))))) {
274     fprintf(stderr, "%s: cannot skip %ld bytes on input\n",
275     progname, skipbytes);
276     quit(1);
277     }
278 greg 2.10 }
279     if (fin == NULL) {
280 greg 1.1 fprintf(stderr, "%s: bad # file arguments\n", progname);
281     quit(1);
282     }
283    
284     if (reverse) {
285 schorsch 2.18 #ifdef _WIN32
286     SET_FILE_BINARY(stdout);
287 greg 2.5 if (format != 'a' && format != 'i')
288 schorsch 2.18 SET_FILE_BINARY(fin);
289 greg 2.5 #endif
290 greg 1.6 /* get header */
291 greg 2.8 if (header) {
292     if (checkheader(fin, fmtid, stdout) < 0) {
293     fprintf(stderr, "%s: wrong input format\n",
294     progname);
295     quit(1);
296     }
297 greg 2.10 if (fin2 != NULL) {
298     getheader(fin2, NULL, NULL);
299     getheader(fin3, NULL, NULL);
300     }
301 greg 2.8 } else
302     newheader("RADIANCE", stdout);
303 greg 2.3 /* get resolution */
304     if ((resolution && !fgetsresolu(&picres, fin)) ||
305     picres.xr <= 0 || picres.yr <= 0) {
306     fprintf(stderr, "%s: missing resolution\n", progname);
307     quit(1);
308     }
309 greg 2.10 if (resolution && fin2 != NULL) {
310     RESOLU pres2;
311     if (!fgetsresolu(&pres2, fin2) ||
312 greg 2.14 pres2.rt != picres.rt ||
313 greg 2.10 pres2.xr != picres.xr ||
314     pres2.yr != picres.yr ||
315     !fgetsresolu(&pres2, fin3) ||
316 greg 2.14 pres2.rt != picres.rt ||
317 greg 2.10 pres2.xr != picres.xr ||
318     pres2.yr != picres.yr) {
319     fprintf(stderr, "%s: resolution mismatch\n",
320     progname);
321     quit(1);
322     }
323     }
324 greg 1.6 /* add to header */
325     printargs(i, argv, stdout);
326 greg 2.9 if (expval < .99 || expval > 1.01)
327 greg 2.7 fputexpos(expval, stdout);
328 greg 1.6 fputformat(COLRFMT, stdout);
329 greg 1.8 putchar('\n');
330 greg 2.3 fputsresolu(&picres, stdout); /* always put resolution */
331 greg 1.1 valtopix();
332     } else {
333 schorsch 2.18 #ifdef _WIN32
334     SET_FILE_BINARY(fin);
335 greg 2.5 if (format != 'a' && format != 'i')
336 schorsch 2.18 SET_FILE_BINARY(stdout);
337 greg 2.5 #endif
338 greg 1.1 /* get header */
339 greg 1.6 getheader(fin, checkhead, NULL);
340     if (wrongformat) {
341 greg 2.14 fprintf(stderr,
342     "%s: input not a Radiance RGBE picture\n",
343 greg 1.6 progname);
344     quit(1);
345     }
346 greg 2.3 if (!fgetsresolu(&picres, fin)) {
347     fprintf(stderr, "%s: missing resolution\n", progname);
348     quit(1);
349     }
350 greg 1.1 if (header) {
351     printargs(i, argv, stdout);
352 greg 2.9 if (expval < .99 || expval > 1.01)
353 greg 2.7 fputexpos(expval, stdout);
354 greg 1.6 fputformat(fmtid, stdout);
355 greg 1.8 putchar('\n');
356 greg 1.1 }
357 greg 2.3 if (resolution) /* put resolution */
358     fputsresolu(&picres, stdout);
359 greg 1.1 pixtoval();
360     }
361    
362     quit(0);
363 schorsch 2.26 return 0; /* pro forma return */
364 greg 1.1 }
365    
366    
367 schorsch 2.25 static int
368     checkhead( /* deal with line from header */
369     char *line,
370     void *p
371     )
372 greg 1.1 {
373 greg 1.6 char fmt[32];
374 greg 1.5 double d;
375     COLOR ctmp;
376    
377 greg 2.14 if (formatval(fmt, line)) {
378 greg 2.27 if (!strcmp(fmt, CIEFMT))
379 greg 2.14 mybright = &xyz_bright;
380 greg 2.27 else if (!strcmp(fmt, COLRFMT))
381 greg 2.14 mybright = &rgb_bright;
382     else
383     wrongformat++;
384     } else if (original && isexpos(line)) {
385 greg 1.5 d = 1.0/exposval(line);
386     scalecolor(exposure, d);
387 greg 2.27 fprintf(stderr, "scaled exposure by %f, now at %f\n", d, bright(exposure));
388 greg 2.7 doexposure++;
389 greg 1.6 } else if (original && iscolcor(line)) {
390 greg 1.5 colcorval(ctmp, line);
391 greg 1.7 setcolor(exposure, colval(exposure,RED)/colval(ctmp,RED),
392     colval(exposure,GRN)/colval(ctmp,GRN),
393     colval(exposure,BLU)/colval(ctmp,BLU));
394 greg 2.7 doexposure++;
395 greg 1.6 } else if (header)
396     fputs(line, stdout);
397 gwlarson 2.13 return(0);
398 greg 1.1 }
399    
400    
401 schorsch 2.26 static void
402     pixtoval(void) /* convert picture to values */
403 greg 1.1 {
404 greg 2.5 register COLOR *scanln;
405 greg 1.7 int dogamma;
406 greg 1.1 COLOR lastc;
407 schorsch 2.21 RREAL hv[2];
408 greg 2.12 int startprim, endprim;
409     long startpos;
410 greg 1.1 int y;
411     register int x;
412    
413 greg 1.8 scanln = (COLOR *)malloc(scanlen(&picres)*sizeof(COLOR));
414 greg 1.1 if (scanln == NULL) {
415     fprintf(stderr, "%s: out of memory\n", progname);
416     quit(1);
417     }
418 greg 1.8 dogamma = gamcor < .95 || gamcor > 1.05;
419 greg 2.12 if (putprim == ALL && !interleave) {
420     startprim = RED; endprim = BLU;
421     startpos = ftell(fin);
422     } else {
423     startprim = putprim; endprim = putprim;
424     }
425     for (putprim = startprim; putprim <= endprim; putprim++) {
426     if (putprim != startprim && fseek(fin, startpos, 0)) {
427     fprintf(stderr, "%s: seek error on input file\n",
428     progname);
429 greg 1.1 quit(1);
430     }
431 greg 2.12 set_io();
432     setcolor(lastc, 0.0, 0.0, 0.0);
433     for (y = 0; y < numscans(&picres); y++) {
434     if (freadscan(scanln, scanlen(&picres), fin) < 0) {
435     fprintf(stderr, "%s: read error\n", progname);
436 greg 1.1 quit(1);
437     }
438 greg 2.12 for (x = 0; x < scanlen(&picres); x++) {
439 schorsch 2.22 if (uniq) {
440 greg 2.12 if ( colval(scanln[x],RED) ==
441     colval(lastc,RED) &&
442     colval(scanln[x],GRN) ==
443     colval(lastc,GRN) &&
444     colval(scanln[x],BLU) ==
445     colval(lastc,BLU) )
446     continue;
447     else
448     copycolor(lastc, scanln[x]);
449 schorsch 2.22 }
450 greg 2.12 if (doexposure)
451     multcolor(scanln[x], exposure);
452     if (dogamma)
453     setcolor(scanln[x],
454     pow(colval(scanln[x],RED), 1.0/gamcor),
455     pow(colval(scanln[x],GRN), 1.0/gamcor),
456     pow(colval(scanln[x],BLU), 1.0/gamcor));
457     if (!dataonly) {
458     pix2loc(hv, &picres, x, y);
459     printf("%7d %7d ",
460     (int)(hv[0]*picres.xr),
461     (int)(hv[1]*picres.yr));
462     }
463     if ((*putval)(scanln[x]) < 0) {
464     fprintf(stderr, "%s: write error\n",
465     progname);
466     quit(1);
467     }
468     }
469 greg 1.1 }
470     }
471 greg 2.14 free((void *)scanln);
472 greg 1.1 }
473    
474    
475 schorsch 2.26 static void
476     valtopix(void) /* convert values to a pixel file */
477 greg 1.1 {
478 greg 1.7 int dogamma;
479 greg 2.5 register COLOR *scanln;
480 greg 1.1 int y;
481     register int x;
482    
483 greg 1.8 scanln = (COLOR *)malloc(scanlen(&picres)*sizeof(COLOR));
484 greg 1.1 if (scanln == NULL) {
485     fprintf(stderr, "%s: out of memory\n", progname);
486     quit(1);
487     }
488 greg 1.8 dogamma = gamcor < .95 || gamcor > 1.05;
489 greg 2.12 set_io();
490 greg 1.8 for (y = 0; y < numscans(&picres); y++) {
491     for (x = 0; x < scanlen(&picres); x++) {
492 greg 2.10 if (!dataonly) {
493 greg 1.1 fscanf(fin, "%*d %*d");
494 greg 2.10 if (fin2 != NULL) {
495     fscanf(fin2, "%*d %*d");
496     fscanf(fin3, "%*d %*d");
497     }
498     }
499 greg 2.11 if ((*getval)(scanln[x]) < 0) {
500 greg 1.1 fprintf(stderr, "%s: read error\n", progname);
501     quit(1);
502     }
503 greg 1.7 if (dogamma)
504     setcolor(scanln[x],
505 greg 1.8 pow(colval(scanln[x],RED), gamcor),
506     pow(colval(scanln[x],GRN), gamcor),
507     pow(colval(scanln[x],BLU), gamcor));
508 greg 2.7 if (doexposure)
509     multcolor(scanln[x], exposure);
510 greg 1.1 }
511 greg 1.8 if (fwritescan(scanln, scanlen(&picres), stdout) < 0) {
512 greg 1.1 fprintf(stderr, "%s: write error\n", progname);
513     quit(1);
514     }
515     }
516 greg 2.14 free((void *)scanln);
517 greg 1.1 }
518    
519    
520 greg 2.14 void
521 greg 1.1 quit(code)
522     int code;
523     {
524     exit(code);
525     }
526    
527    
528 schorsch 2.26 static void
529     swap16( /* swap n 16-bit words */
530     register uint16 *wp,
531     int n
532     )
533 greg 2.16 {
534     while (n-- > 0) {
535     *wp = *wp << 8 | ((*wp >> 8) & 0xff);
536     wp++;
537     }
538     }
539    
540 greg 2.23
541 schorsch 2.26 static void
542     swap32( /* swap n 32-bit words */
543     register uint32 *wp,
544     int n
545     )
546 greg 2.23 {
547     while (n-- > 0) {
548     *wp = *wp << 24 | ((*wp >> 24) & 0xff) |
549     (*wp & 0xff00) << 8 | (*wp & 0xff0000) >> 8;
550     wp++;
551     }
552     }
553    
554    
555 schorsch 2.26 static void
556     swap64( /* swap n 64-bit words */
557     register char *wp,
558     int n
559     )
560 greg 2.23 {
561     register int t;
562    
563     while (n-- > 0) {
564     t = wp[0]; wp[0] = wp[7]; wp[7] = t;
565     t = wp[1]; wp[1] = wp[6]; wp[6] = t;
566     t = wp[2]; wp[2] = wp[5]; wp[5] = t;
567     t = wp[3]; wp[3] = wp[4]; wp[4] = t;
568     wp += 8;
569     }
570     }
571    
572    
573 schorsch 2.26 static int
574     getcascii( /* get an ascii color value from stream(s) */
575     COLOR col
576     )
577 greg 1.1 {
578 greg 2.5 double vd[3];
579 greg 1.1
580 greg 2.11 if (fin2 == NULL) {
581     if (fscanf(fin, "%lf %lf %lf", &vd[0], &vd[1], &vd[2]) != 3)
582 greg 2.10 return(-1);
583     } else {
584 greg 2.11 if (fscanf(fin, "%lf", &vd[0]) != 1 ||
585     fscanf(fin2, "%lf", &vd[1]) != 1 ||
586     fscanf(fin3, "%lf", &vd[2]) != 1)
587 greg 2.10 return(-1);
588     }
589 greg 2.4 setcolor(col, vd[rord[RED]], vd[rord[GRN]], vd[rord[BLU]]);
590 greg 1.1 return(0);
591     }
592    
593    
594 schorsch 2.26 static int
595     getcdouble( /* get a double color value from stream(s) */
596     COLOR col
597     )
598 greg 1.1 {
599 greg 2.5 double vd[3];
600 greg 1.1
601 greg 2.11 if (fin2 == NULL) {
602     if (fread((char *)vd, sizeof(double), 3, fin) != 3)
603 greg 2.10 return(-1);
604     } else {
605 greg 2.11 if (fread((char *)vd, sizeof(double), 1, fin) != 1 ||
606     fread((char *)(vd+1), sizeof(double), 1, fin2) != 1 ||
607     fread((char *)(vd+2), sizeof(double), 1, fin3) != 1)
608 greg 2.10 return(-1);
609     }
610 greg 2.23 if (swapbytes)
611     swap64((char *)vd, 3);
612 greg 2.4 setcolor(col, vd[rord[RED]], vd[rord[GRN]], vd[rord[BLU]]);
613 greg 1.1 return(0);
614     }
615    
616    
617 schorsch 2.26 static int
618     getcfloat( /* get a float color value from stream(s) */
619     COLOR col
620     )
621 greg 1.1 {
622     float vf[3];
623    
624 greg 2.11 if (fin2 == NULL) {
625     if (fread((char *)vf, sizeof(float), 3, fin) != 3)
626 greg 2.10 return(-1);
627     } else {
628 greg 2.11 if (fread((char *)vf, sizeof(float), 1, fin) != 1 ||
629     fread((char *)(vf+1), sizeof(float), 1, fin2) != 1 ||
630     fread((char *)(vf+2), sizeof(float), 1, fin3) != 1)
631 greg 2.10 return(-1);
632     }
633 greg 2.23 if (swapbytes)
634     swap32((uint32 *)vf, 3);
635 greg 2.4 setcolor(col, vf[rord[RED]], vf[rord[GRN]], vf[rord[BLU]]);
636 greg 1.1 return(0);
637     }
638    
639    
640 schorsch 2.26 static int
641     getcint( /* get an int color value from stream(s) */
642     COLOR col
643     )
644 greg 1.1 {
645     int vi[3];
646    
647 greg 2.11 if (fin2 == NULL) {
648     if (fscanf(fin, "%d %d %d", &vi[0], &vi[1], &vi[2]) != 3)
649 greg 2.10 return(-1);
650     } else {
651 greg 2.11 if (fscanf(fin, "%d", &vi[0]) != 1 ||
652     fscanf(fin2, "%d", &vi[1]) != 1 ||
653     fscanf(fin3, "%d", &vi[2]) != 1)
654 greg 2.10 return(-1);
655     }
656 greg 2.4 setcolor(col, (vi[rord[RED]]+.5)/256.,
657     (vi[rord[GRN]]+.5)/256., (vi[rord[BLU]]+.5)/256.);
658 greg 1.1 return(0);
659     }
660    
661    
662 schorsch 2.26 static int
663     getcbyte( /* get a byte color value from stream(s) */
664     COLOR col
665     )
666 greg 1.1 {
667     BYTE vb[3];
668    
669 greg 2.11 if (fin2 == NULL) {
670     if (fread((char *)vb, sizeof(BYTE), 3, fin) != 3)
671 greg 2.10 return(-1);
672     } else {
673 greg 2.11 if (fread((char *)vb, sizeof(BYTE), 1, fin) != 1 ||
674     fread((char *)(vb+1), sizeof(BYTE), 1, fin2) != 1 ||
675     fread((char *)(vb+2), sizeof(BYTE), 1, fin3) != 1)
676 greg 2.10 return(-1);
677     }
678 greg 2.4 setcolor(col, (vb[rord[RED]]+.5)/256.,
679     (vb[rord[GRN]]+.5)/256., (vb[rord[BLU]]+.5)/256.);
680 greg 1.1 return(0);
681     }
682    
683    
684 schorsch 2.26 static int
685     getcword( /* get a 16-bit color value from stream(s) */
686     COLOR col
687     )
688 greg 2.15 {
689     uint16 vw[3];
690    
691     if (fin2 == NULL) {
692     if (fread((char *)vw, sizeof(uint16), 3, fin) != 3)
693     return(-1);
694     } else {
695     if (fread((char *)vw, sizeof(uint16), 1, fin) != 1 ||
696     fread((char *)(vw+1), sizeof(uint16), 1, fin2) != 1 ||
697     fread((char *)(vw+2), sizeof(uint16), 1, fin3) != 1)
698     return(-1);
699     }
700 greg 2.16 if (swapbytes)
701     swap16(vw, 3);
702 greg 2.15 setcolor(col, (vw[rord[RED]]+.5)/65536.,
703     (vw[rord[GRN]]+.5)/65536., (vw[rord[BLU]]+.5)/65536.);
704     return(0);
705     }
706    
707    
708 schorsch 2.26 static int
709     getbascii( /* get an ascii brightness value from fin */
710     COLOR col
711     )
712 greg 1.1 {
713 greg 2.5 double vd;
714 greg 1.1
715 greg 2.11 if (fscanf(fin, "%lf", &vd) != 1)
716 greg 1.1 return(-1);
717     setcolor(col, vd, vd, vd);
718     return(0);
719     }
720    
721    
722 schorsch 2.26 static int
723     getbdouble( /* get a double brightness value from fin */
724     COLOR col
725     )
726 greg 1.1 {
727 greg 2.5 double vd;
728 greg 1.1
729 greg 2.11 if (fread((char *)&vd, sizeof(double), 1, fin) != 1)
730 greg 1.1 return(-1);
731 greg 2.23 if (swapbytes)
732     swap64((char *)&vd, 1);
733 greg 1.1 setcolor(col, vd, vd, vd);
734     return(0);
735     }
736    
737    
738 schorsch 2.26 static int
739     getbfloat( /* get a float brightness value from fin */
740     COLOR col
741     )
742 greg 1.1 {
743     float vf;
744    
745 greg 2.11 if (fread((char *)&vf, sizeof(float), 1, fin) != 1)
746 greg 1.1 return(-1);
747 greg 2.23 if (swapbytes)
748     swap32((uint32 *)&vf, 1);
749 greg 1.1 setcolor(col, vf, vf, vf);
750     return(0);
751     }
752    
753    
754 schorsch 2.26 static int
755     getbint( /* get an int brightness value from fin */
756     COLOR col
757     )
758 greg 1.1 {
759     int vi;
760 greg 2.5 double d;
761 greg 1.1
762 greg 2.11 if (fscanf(fin, "%d", &vi) != 1)
763 greg 1.1 return(-1);
764     d = (vi+.5)/256.;
765     setcolor(col, d, d, d);
766     return(0);
767     }
768    
769    
770 schorsch 2.26 static int
771     getbbyte( /* get a byte brightness value from fin */
772     COLOR col
773     )
774 greg 1.1 {
775     BYTE vb;
776 greg 2.5 double d;
777 greg 1.1
778 greg 2.11 if (fread((char *)&vb, sizeof(BYTE), 1, fin) != 1)
779 greg 1.1 return(-1);
780     d = (vb+.5)/256.;
781     setcolor(col, d, d, d);
782     return(0);
783     }
784    
785    
786 schorsch 2.26 static int
787     getbword( /* get a 16-bit brightness value from fin */
788     COLOR col
789     )
790 greg 2.15 {
791     uint16 vw;
792     double d;
793    
794     if (fread((char *)&vw, sizeof(uint16), 1, fin) != 1)
795     return(-1);
796 greg 2.16 if (swapbytes)
797     swap16(&vw, 1);
798 greg 2.15 d = (vw+.5)/65536.;
799     setcolor(col, d, d, d);
800     return(0);
801     }
802    
803    
804 schorsch 2.26 static int
805     putcascii( /* put an ascii color to stdout */
806     COLOR col
807     )
808 greg 1.1 {
809 greg 2.11 fprintf(stdout, "%15.3e %15.3e %15.3e\n",
810 greg 2.4 colval(col,ord[0]),
811     colval(col,ord[1]),
812     colval(col,ord[2]));
813 greg 1.1
814 greg 2.11 return(ferror(stdout) ? -1 : 0);
815 greg 1.1 }
816    
817    
818 schorsch 2.26 static int
819     putcfloat( /* put a float color to stdout */
820     COLOR col
821     )
822 greg 1.1 {
823     float vf[3];
824    
825 greg 2.4 vf[0] = colval(col,ord[0]);
826     vf[1] = colval(col,ord[1]);
827     vf[2] = colval(col,ord[2]);
828 greg 2.23 if (swapbytes)
829     swap32((uint32 *)vf, 3);
830 greg 2.11 fwrite((char *)vf, sizeof(float), 3, stdout);
831 greg 1.1
832 greg 2.11 return(ferror(stdout) ? -1 : 0);
833 greg 1.1 }
834    
835    
836 schorsch 2.26 static int
837     putcdouble( /* put a double color to stdout */
838     COLOR col
839     )
840 greg 1.1 {
841 greg 2.5 double vd[3];
842 greg 1.1
843 greg 2.4 vd[0] = colval(col,ord[0]);
844     vd[1] = colval(col,ord[1]);
845     vd[2] = colval(col,ord[2]);
846 greg 2.23 if (swapbytes)
847     swap64((char *)vd, 3);
848 greg 2.11 fwrite((char *)vd, sizeof(double), 3, stdout);
849 greg 1.1
850 greg 2.11 return(ferror(stdout) ? -1 : 0);
851 greg 1.1 }
852    
853    
854 schorsch 2.26 static int
855     putcint( /* put an int color to stdout */
856     COLOR col
857     )
858 greg 1.1 {
859 greg 2.11 fprintf(stdout, "%d %d %d\n",
860 greg 2.4 (int)(colval(col,ord[0])*256.),
861     (int)(colval(col,ord[1])*256.),
862     (int)(colval(col,ord[2])*256.));
863 greg 1.1
864 greg 2.11 return(ferror(stdout) ? -1 : 0);
865 greg 1.1 }
866    
867    
868 schorsch 2.26 static int
869     putcbyte( /* put a byte color to stdout */
870     COLOR col
871     )
872 greg 1.1 {
873 greg 2.15 long i;
874 greg 1.1 BYTE vb[3];
875    
876 greg 2.4 i = colval(col,ord[0])*256.;
877 greg 1.1 vb[0] = min(i,255);
878 greg 2.4 i = colval(col,ord[1])*256.;
879 greg 1.1 vb[1] = min(i,255);
880 greg 2.4 i = colval(col,ord[2])*256.;
881 greg 1.1 vb[2] = min(i,255);
882 greg 2.11 fwrite((char *)vb, sizeof(BYTE), 3, stdout);
883 greg 1.1
884 greg 2.11 return(ferror(stdout) ? -1 : 0);
885 greg 1.1 }
886    
887    
888 schorsch 2.26 static int
889     putcword( /* put a 16-bit color to stdout */
890     COLOR col
891     )
892 greg 2.15 {
893     long i;
894     uint16 vw[3];
895    
896     i = colval(col,ord[0])*65536.;
897     vw[0] = min(i,65535);
898     i = colval(col,ord[1])*65536.;
899     vw[1] = min(i,65535);
900     i = colval(col,ord[2])*65536.;
901     vw[2] = min(i,65535);
902 greg 2.16 if (swapbytes)
903     swap16(vw, 3);
904 greg 2.15 fwrite((char *)vw, sizeof(uint16), 3, stdout);
905    
906     return(ferror(stdout) ? -1 : 0);
907     }
908    
909    
910 schorsch 2.26 static int
911     putbascii( /* put an ascii brightness to stdout */
912     COLOR col
913     )
914 greg 1.1 {
915 greg 2.14 fprintf(stdout, "%15.3e\n", (*mybright)(col));
916 greg 1.1
917 greg 2.11 return(ferror(stdout) ? -1 : 0);
918 greg 1.1 }
919    
920    
921 schorsch 2.26 static int
922     putbfloat( /* put a float brightness to stdout */
923     COLOR col
924     )
925 greg 1.1 {
926     float vf;
927    
928 greg 2.14 vf = (*mybright)(col);
929 greg 2.23 if (swapbytes)
930     swap32((uint32 *)&vf, 1);
931 greg 2.11 fwrite((char *)&vf, sizeof(float), 1, stdout);
932 greg 1.1
933 greg 2.11 return(ferror(stdout) ? -1 : 0);
934 greg 1.1 }
935    
936    
937 schorsch 2.26 static int
938     putbdouble( /* put a double brightness to stdout */
939     COLOR col
940     )
941 greg 1.1 {
942 greg 2.5 double vd;
943 greg 1.1
944 greg 2.14 vd = (*mybright)(col);
945 greg 2.23 if (swapbytes)
946     swap64((char *)&vd, 1);
947 greg 2.11 fwrite((char *)&vd, sizeof(double), 1, stdout);
948 greg 1.1
949 greg 2.11 return(ferror(stdout) ? -1 : 0);
950 greg 1.1 }
951    
952    
953 schorsch 2.26 static int
954     putbint( /* put an int brightness to stdout */
955     COLOR col
956     )
957 greg 1.1 {
958 greg 2.14 fprintf(stdout, "%d\n", (int)((*mybright)(col)*256.));
959 greg 1.1
960 greg 2.11 return(ferror(stdout) ? -1 : 0);
961 greg 1.1 }
962    
963    
964 schorsch 2.26 static int
965     putbbyte( /* put a byte brightness to stdout */
966     COLOR col
967     )
968 greg 1.1 {
969     register int i;
970     BYTE vb;
971    
972 greg 2.14 i = (*mybright)(col)*256.;
973 greg 1.1 vb = min(i,255);
974 greg 2.11 fwrite((char *)&vb, sizeof(BYTE), 1, stdout);
975 greg 1.1
976 greg 2.11 return(ferror(stdout) ? -1 : 0);
977 greg 1.1 }
978    
979    
980 schorsch 2.26 static int
981     putbword( /* put a 16-bit brightness to stdout */
982     COLOR col
983     )
984 greg 2.15 {
985     long i;
986     uint16 vw;
987    
988     i = (*mybright)(col)*65536.;
989     vw = min(i,65535);
990 greg 2.16 if (swapbytes)
991     swap16(&vw, 1);
992 greg 2.15 fwrite((char *)&vw, sizeof(uint16), 1, stdout);
993    
994     return(ferror(stdout) ? -1 : 0);
995     }
996    
997    
998 schorsch 2.26 static int
999     putpascii( /* put an ascii primary to stdout */
1000     COLOR col
1001     )
1002 greg 2.10 {
1003 greg 2.11 fprintf(stdout, "%15.3e\n", colval(col,putprim));
1004 greg 2.10
1005 greg 2.11 return(ferror(stdout) ? -1 : 0);
1006 greg 2.10 }
1007    
1008    
1009 schorsch 2.26 static int
1010     putpfloat( /* put a float primary to stdout */
1011     COLOR col
1012     )
1013 greg 2.10 {
1014     float vf;
1015    
1016     vf = colval(col,putprim);
1017 greg 2.23 if (swapbytes)
1018     swap32((uint32 *)&vf, 1);
1019 greg 2.11 fwrite((char *)&vf, sizeof(float), 1, stdout);
1020 greg 2.10
1021 greg 2.11 return(ferror(stdout) ? -1 : 0);
1022 greg 2.10 }
1023    
1024    
1025 schorsch 2.26 static int
1026     putpdouble( /* put a double primary to stdout */
1027     COLOR col
1028     )
1029 greg 2.10 {
1030     double vd;
1031    
1032     vd = colval(col,putprim);
1033 greg 2.23 if (swapbytes)
1034     swap64((char *)&vd, 1);
1035 greg 2.11 fwrite((char *)&vd, sizeof(double), 1, stdout);
1036 greg 2.10
1037 greg 2.11 return(ferror(stdout) ? -1 : 0);
1038 greg 2.10 }
1039    
1040    
1041 schorsch 2.26 static int
1042     putpint( /* put an int primary to stdout */
1043     COLOR col
1044     )
1045 greg 2.10 {
1046 greg 2.11 fprintf(stdout, "%d\n", (int)(colval(col,putprim)*256.));
1047 greg 2.10
1048 greg 2.11 return(ferror(stdout) ? -1 : 0);
1049 greg 2.10 }
1050    
1051    
1052 schorsch 2.26 static int
1053     putpbyte( /* put a byte primary to stdout */
1054     COLOR col
1055     )
1056 greg 2.10 {
1057 greg 2.15 long i;
1058 greg 2.10 BYTE vb;
1059    
1060     i = colval(col,putprim)*256.;
1061     vb = min(i,255);
1062 greg 2.11 fwrite((char *)&vb, sizeof(BYTE), 1, stdout);
1063 greg 2.10
1064 greg 2.11 return(ferror(stdout) ? -1 : 0);
1065 greg 2.10 }
1066    
1067    
1068 schorsch 2.26 static int
1069     putpword( /* put a 16-bit primary to stdout */
1070     COLOR col
1071     )
1072 greg 2.15 {
1073     long i;
1074     uint16 vw;
1075    
1076     i = colval(col,putprim)*65536.;
1077     vw = min(i,65535);
1078 greg 2.16 if (swapbytes)
1079     swap16(&vw, 1);
1080 greg 2.15 fwrite((char *)&vw, sizeof(uint16), 1, stdout);
1081    
1082     return(ferror(stdout) ? -1 : 0);
1083     }
1084    
1085    
1086 schorsch 2.26 static void
1087     set_io(void) /* set put and get functions */
1088 greg 1.1 {
1089     switch (format) {
1090     case 'a': /* ascii */
1091 greg 2.10 if (putprim == BRIGHT) {
1092 greg 1.1 getval = getbascii;
1093     putval = putbascii;
1094 greg 2.10 } else if (putprim != ALL) {
1095     getval = getbascii;
1096     putval = putpascii;
1097 greg 1.1 } else {
1098     getval = getcascii;
1099     putval = putcascii;
1100 greg 2.12 if (reverse && !interleave) {
1101     fprintf(stderr,
1102     "%s: ASCII input files must be interleaved\n",
1103     progname);
1104     quit(1);
1105     }
1106 greg 1.1 }
1107     return;
1108     case 'f': /* binary float */
1109 greg 2.10 if (putprim == BRIGHT) {
1110 greg 1.1 getval = getbfloat;
1111     putval = putbfloat;
1112 greg 2.10 } else if (putprim != ALL) {
1113     getval = getbfloat;
1114     putval = putpfloat;
1115 greg 1.1 } else {
1116     getval = getcfloat;
1117     putval = putcfloat;
1118 greg 2.12 if (reverse && !interleave) {
1119     if (fin2 == NULL)
1120     goto namerr;
1121     if (fseek(fin2,
1122     (long)sizeof(float)*picres.xr*picres.yr, 1))
1123     goto seekerr;
1124     if (fseek(fin3,
1125     (long)sizeof(float)*2*picres.xr*picres.yr, 1))
1126     goto seekerr;
1127     }
1128 greg 1.1 }
1129     return;
1130     case 'd': /* binary double */
1131 greg 2.10 if (putprim == BRIGHT) {
1132 greg 1.1 getval = getbdouble;
1133     putval = putbdouble;
1134 greg 2.10 } else if (putprim != ALL) {
1135     getval = getbdouble;
1136     putval = putpdouble;
1137 greg 1.1 } else {
1138     getval = getcdouble;
1139     putval = putcdouble;
1140 greg 2.12 if (reverse && !interleave) {
1141     if (fin2 == NULL)
1142     goto namerr;
1143     if (fseek(fin2,
1144     (long)sizeof(double)*picres.xr*picres.yr, 1))
1145     goto seekerr;
1146     if (fseek(fin3,
1147     (long)sizeof(double)*2*picres.xr*picres.yr, 1))
1148     goto seekerr;
1149     }
1150 greg 1.1 }
1151     return;
1152     case 'i': /* integer */
1153 greg 2.10 if (putprim == BRIGHT) {
1154 greg 1.1 getval = getbint;
1155     putval = putbint;
1156 greg 2.10 } else if (putprim != ALL) {
1157     getval = getbint;
1158     putval = putpint;
1159 greg 1.1 } else {
1160     getval = getcint;
1161     putval = putcint;
1162 greg 2.12 if (reverse && !interleave) {
1163     fprintf(stderr,
1164     "%s: integer input files must be interleaved\n",
1165     progname);
1166     quit(1);
1167     }
1168 greg 1.1 }
1169     return;
1170     case 'b': /* byte */
1171 greg 2.10 if (putprim == BRIGHT) {
1172 greg 1.1 getval = getbbyte;
1173     putval = putbbyte;
1174 greg 2.10 } else if (putprim != ALL) {
1175     getval = getbbyte;
1176     putval = putpbyte;
1177 greg 1.1 } else {
1178     getval = getcbyte;
1179     putval = putcbyte;
1180 greg 2.12 if (reverse && !interleave) {
1181     if (fin2 == NULL)
1182     goto namerr;
1183     if (fseek(fin2,
1184     (long)sizeof(BYTE)*picres.xr*picres.yr, 1))
1185     goto seekerr;
1186     if (fseek(fin3,
1187     (long)sizeof(BYTE)*2*picres.xr*picres.yr, 1))
1188 greg 2.15 goto seekerr;
1189     }
1190     }
1191     return;
1192     case 'w': /* 16-bit */
1193     if (putprim == BRIGHT) {
1194     getval = getbword;
1195     putval = putbword;
1196     } else if (putprim != ALL) {
1197     getval = getbword;
1198     putval = putpword;
1199     } else {
1200     getval = getcword;
1201     putval = putcword;
1202     if (reverse && !interleave) {
1203     if (fin2 == NULL)
1204     goto namerr;
1205     if (fseek(fin2,
1206     (long)sizeof(uint16)*picres.xr*picres.yr, 1))
1207     goto seekerr;
1208     if (fseek(fin3,
1209     (long)sizeof(uint16)*2*picres.xr*picres.yr, 1))
1210 greg 2.12 goto seekerr;
1211     }
1212 greg 1.1 }
1213     return;
1214     }
1215 schorsch 2.26 /* badopt: */ /* label not used */
1216 greg 2.12 fprintf(stderr, "%s: botched file type\n", progname);
1217     quit(1);
1218     namerr:
1219     fprintf(stderr, "%s: non-interleaved file(s) must be named\n",
1220     progname);
1221     quit(1);
1222     seekerr:
1223     fprintf(stderr, "%s: cannot seek on interleaved input file\n",
1224     progname);
1225     quit(1);
1226 greg 1.1 }