ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/pvalue.c
Revision: 2.29
Committed: Sat Dec 23 17:27:46 2006 UTC (17 years, 4 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad4R0, rad3R9
Changes since 2.28: +11 -59 lines
Log Message:
Added byte-swapping i/o options to rcalc

File Contents

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