ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/pvalue.c
Revision: 2.46
Committed: Tue Jun 3 21:31:51 2025 UTC (2 days, 8 hours ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 2.45: +2 -4 lines
Log Message:
refactor: More consistent use of global char * progname and fixargv0()

File Contents

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