ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/pvalue.c
Revision: 2.28
Committed: Fri Oct 1 07:46:26 2004 UTC (19 years, 6 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R7P2, rad3R7P1, rad3R6, rad3R6P1, rad3R8
Changes since 2.27: +1 -2 lines
Log Message:
Forgot to remove debug statement on last check-in

File Contents

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