ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/pvalue.c
Revision: 2.40
Committed: Tue Jun 30 22:30:29 2020 UTC (3 years, 10 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R3
Changes since 2.39: +3 -2 lines
Log Message:
fix(pvalue): removed output of BigEndian flag when not needed for -db mode

File Contents

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