ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/pvalue.c
Revision: 2.12
Committed: Wed Jan 8 08:51:43 1997 UTC (27 years, 3 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.11: +118 -40 lines
Log Message:
added -n option for non-interleaved RGB input and output

File Contents

# User Rev Content
1 greg 2.5 /* Copyright (c) 1992 Regents of the University of California */
2 greg 1.1
3     #ifndef lint
4     static char SCCSid[] = "$SunId$ LBL";
5     #endif
6    
7     /*
8     * pvalue.c - program to print pixel values.
9     *
10     * 4/23/86
11     */
12    
13 greg 1.8 #include "standard.h"
14 greg 1.1
15     #include "color.h"
16    
17 greg 1.8 #include "resolu.h"
18    
19 greg 2.5 #define min(a,b) ((a)<(b)?(a):(b))
20 greg 1.1
21 greg 2.10 /* what to put out (also RED, GRN, BLU) */
22     #define ALL 3
23     #define BRIGHT 4
24    
25     #define brightonly (putprim==BRIGHT)
26    
27 greg 2.5 RESOLU picres; /* resolution of picture */
28 greg 1.1
29 greg 1.6 int uniq = 0; /* print only unique values? */
30 greg 1.1
31 greg 2.7 int doexposure = 0; /* exposure change? (>100 to print) */
32 greg 1.1
33     int dataonly = 0; /* data only format? */
34    
35 greg 2.10 int putprim = ALL; /* what to put out */
36 greg 1.1
37     int reverse = 0; /* reverse conversion? */
38    
39     int format = 'a'; /* input/output format */
40 greg 1.6 char *fmtid = "ascii"; /* format identifier for header */
41 greg 1.1
42 greg 2.3 int header = 1; /* do header? */
43 greg 1.1
44 greg 2.10 long skipbytes = 0; /* skip bytes in input? */
45    
46 greg 2.12 int interleave = 1; /* file is interleaved? */
47    
48 greg 2.3 int resolution = 1; /* put/get resolution string? */
49    
50 greg 2.7 int original = 0; /* convert to original values? */
51    
52 greg 1.6 int wrongformat = 0; /* wrong input format? */
53    
54 greg 2.5 double gamcor = 1.0; /* gamma correction */
55 greg 1.7
56 greg 2.4 int ord[3] = {RED, GRN, BLU}; /* RGB ordering */
57     int rord[4]; /* reverse ordering */
58    
59 greg 1.5 COLOR exposure = WHTCOLOR;
60 greg 1.1
61     char *progname;
62    
63     FILE *fin;
64 greg 2.10 FILE *fin2 = NULL, *fin3 = NULL; /* for other color channels */
65 greg 1.1
66     int (*getval)(), (*putval)();
67    
68    
69     main(argc, argv)
70     int argc;
71     char **argv;
72     {
73     extern int checkhead();
74 greg 2.10 extern long atol();
75 greg 2.7 double d, expval = 1.0;
76 greg 1.1 int i;
77    
78     progname = argv[0];
79    
80     for (i = 1; i < argc; i++)
81 greg 1.8 if (argv[i][0] == '-' || argv[i][0] == '+')
82 greg 1.1 switch (argv[i][1]) {
83 greg 1.8 case 'h': /* header */
84     header = argv[i][0] == '+';
85 greg 1.1 break;
86 greg 2.3 case 'H': /* resolution string */
87     resolution = argv[i][0] == '+';
88     break;
89 greg 2.10 case 's': /* skip bytes in header */
90     skipbytes = atol(argv[++i]);
91     break;
92 greg 1.1 case 'u': /* unique values */
93 greg 1.8 uniq = argv[i][0] == '-';
94 greg 1.1 break;
95     case 'o': /* original values */
96 greg 1.8 original = argv[i][0] == '-';
97 greg 1.1 break;
98 greg 1.7 case 'g': /* gamma correction */
99 greg 2.7 gamcor = atof(argv[i+1]);
100 greg 1.8 if (argv[i][0] == '+')
101     gamcor = 1.0/gamcor;
102 greg 2.7 i++;
103 greg 1.7 break;
104 greg 2.7 case 'e': /* exposure correction */
105     d = atof(argv[i+1]);
106     if (argv[i+1][0] == '-' || argv[i+1][0] == '+')
107     d = pow(2.0, d);
108     if (argv[i][0] == '-')
109 greg 2.9 expval *= d;
110 greg 2.7 scalecolor(exposure, d);
111     doexposure++;
112     i++;
113     break;
114 greg 2.4 case 'R': /* reverse byte sequence */
115     if (argv[i][0] == '-') {
116     ord[0]=BLU; ord[1]=GRN; ord[2]=RED;
117     } else {
118     ord[0]=RED; ord[1]=GRN; ord[2]=BLU;
119     }
120     break;
121 greg 1.1 case 'r': /* reverse conversion */
122 greg 1.8 reverse = argv[i][0] == '-';
123 greg 1.1 break;
124 greg 2.12 case 'n': /* non-interleaved RGB */
125     interleave = argv[i][0] == '+';
126     break;
127 greg 1.1 case 'b': /* brightness values */
128 greg 2.10 putprim = argv[i][0] == '-' ? BRIGHT : ALL;
129 greg 1.1 break;
130 greg 2.10 case 'p': /* put primary */
131     switch (argv[i][2]) {
132     case 'r': case 'R': putprim = RED; break;
133     case 'g': case 'G': putprim = GRN; break;
134     case 'b': case 'B': putprim = BLU; break;
135     default: goto unkopt;
136     }
137     break;
138 greg 1.1 case 'd': /* data only (no indices) */
139 greg 1.8 dataonly = argv[i][0] == '-';
140 greg 1.1 switch (argv[i][2]) {
141     case '\0':
142     case 'a': /* ascii */
143     format = 'a';
144 greg 1.6 fmtid = "ascii";
145 greg 1.1 break;
146     case 'i': /* integer */
147 greg 1.6 format = 'i';
148     fmtid = "ascii";
149     break;
150 greg 1.1 case 'b': /* byte */
151 greg 1.8 dataonly = 1;
152 greg 1.6 format = 'b';
153     fmtid = "byte";
154     break;
155 greg 1.1 case 'f': /* float */
156 greg 1.8 dataonly = 1;
157 greg 1.6 format = 'f';
158     fmtid = "float";
159     break;
160 greg 1.1 case 'd': /* double */
161 greg 1.8 dataonly = 1;
162 greg 1.6 format = 'd';
163     fmtid = "double";
164 greg 1.1 break;
165     default:
166     goto unkopt;
167     }
168     break;
169     case 'x': /* x resolution */
170 greg 2.6 case 'X': /* x resolution */
171 greg 2.3 resolution = 0;
172 greg 1.8 if (argv[i][0] == '-')
173     picres.or |= XDECR;
174     picres.xr = atoi(argv[++i]);
175 greg 1.1 break;
176     case 'y': /* y resolution */
177 greg 2.6 case 'Y': /* y resolution */
178 greg 2.3 resolution = 0;
179 greg 1.8 if (argv[i][0] == '-')
180     picres.or |= YDECR;
181     if (picres.xr == 0)
182     picres.or |= YMAJOR;
183     picres.yr = atoi(argv[++i]);
184 greg 1.1 break;
185     default:
186     unkopt:
187     fprintf(stderr, "%s: unknown option: %s\n",
188     progname, argv[i]);
189     quit(1);
190     break;
191     }
192     else
193     break;
194 greg 1.6 /* recognize special formats */
195     if (dataonly && format == 'b')
196     if (brightonly)
197     fmtid = "8-bit_grey";
198     else
199     fmtid = "24-bit_rgb";
200 greg 2.4 /* assign reverse ordering */
201     rord[ord[0]] = 0;
202     rord[ord[1]] = 1;
203     rord[ord[2]] = 2;
204     /* get input */
205 greg 1.1 if (i == argc) {
206     fin = stdin;
207 greg 2.10 } else if (i < argc) {
208 greg 1.1 if ((fin = fopen(argv[i], "r")) == NULL) {
209     fprintf(stderr, "%s: can't open file \"%s\"\n",
210     progname, argv[i]);
211     quit(1);
212     }
213 greg 2.10 if (reverse && !brightonly && i == argc-3) {
214     if ((fin2 = fopen(argv[i+1], "r")) == NULL) {
215     fprintf(stderr, "%s: can't open file \"%s\"\n",
216     progname, argv[i+1]);
217     quit(1);
218     }
219     if ((fin3 = fopen(argv[i+2], "r")) == NULL) {
220     fprintf(stderr, "%s: can't open file \"%s\"\n",
221     progname, argv[i+2]);
222     quit(1);
223     }
224 greg 2.12 interleave = -1;
225 greg 2.10 } else if (i != argc-1)
226     fin = NULL;
227 greg 2.12 if (reverse && !brightonly && !interleave) {
228     fin2 = fopen(argv[i], "r");
229     fin3 = fopen(argv[i], "r");
230     }
231     if (skipbytes && (fseek(fin, skipbytes, 0) || (fin2 != NULL &&
232     (fseek(fin2, skipbytes, 0) ||
233     fseek(fin3, skipbytes, 0))))) {
234     fprintf(stderr, "%s: cannot skip %ld bytes on input\n",
235     progname, skipbytes);
236     quit(1);
237     }
238 greg 2.10 }
239     if (fin == NULL) {
240 greg 1.1 fprintf(stderr, "%s: bad # file arguments\n", progname);
241     quit(1);
242     }
243    
244     if (reverse) {
245 greg 2.5 #ifdef MSDOS
246     setmode(fileno(stdout), O_BINARY);
247     if (format != 'a' && format != 'i')
248     setmode(fileno(fin), O_BINARY);
249     #endif
250 greg 1.6 /* get header */
251 greg 2.8 if (header) {
252     if (checkheader(fin, fmtid, stdout) < 0) {
253     fprintf(stderr, "%s: wrong input format\n",
254     progname);
255     quit(1);
256     }
257 greg 2.10 if (fin2 != NULL) {
258     getheader(fin2, NULL, NULL);
259     getheader(fin3, NULL, NULL);
260     }
261 greg 2.8 } else
262     newheader("RADIANCE", stdout);
263 greg 2.3 /* get resolution */
264     if ((resolution && !fgetsresolu(&picres, fin)) ||
265     picres.xr <= 0 || picres.yr <= 0) {
266     fprintf(stderr, "%s: missing resolution\n", progname);
267     quit(1);
268     }
269 greg 2.10 if (resolution && fin2 != NULL) {
270     RESOLU pres2;
271     if (!fgetsresolu(&pres2, fin2) ||
272     pres2.or != picres.or ||
273     pres2.xr != picres.xr ||
274     pres2.yr != picres.yr ||
275     !fgetsresolu(&pres2, fin3) ||
276     pres2.or != picres.or ||
277     pres2.xr != picres.xr ||
278     pres2.yr != picres.yr) {
279     fprintf(stderr, "%s: resolution mismatch\n",
280     progname);
281     quit(1);
282     }
283     }
284 greg 1.6 /* add to header */
285     printargs(i, argv, stdout);
286 greg 2.9 if (expval < .99 || expval > 1.01)
287 greg 2.7 fputexpos(expval, stdout);
288 greg 1.6 fputformat(COLRFMT, stdout);
289 greg 1.8 putchar('\n');
290 greg 2.3 fputsresolu(&picres, stdout); /* always put resolution */
291 greg 1.1 valtopix();
292     } else {
293 greg 2.5 #ifdef MSDOS
294     setmode(fileno(fin), O_BINARY);
295     if (format != 'a' && format != 'i')
296     setmode(fileno(stdout), O_BINARY);
297     #endif
298 greg 1.1 /* get header */
299 greg 1.6 getheader(fin, checkhead, NULL);
300     if (wrongformat) {
301     fprintf(stderr, "%s: input not a Radiance picture\n",
302     progname);
303     quit(1);
304     }
305 greg 2.3 if (!fgetsresolu(&picres, fin)) {
306     fprintf(stderr, "%s: missing resolution\n", progname);
307     quit(1);
308     }
309 greg 1.1 if (header) {
310     printargs(i, argv, stdout);
311 greg 2.9 if (expval < .99 || expval > 1.01)
312 greg 2.7 fputexpos(expval, stdout);
313 greg 1.6 fputformat(fmtid, stdout);
314 greg 1.8 putchar('\n');
315 greg 1.1 }
316 greg 2.3 if (resolution) /* put resolution */
317     fputsresolu(&picres, stdout);
318 greg 1.1 pixtoval();
319     }
320    
321     quit(0);
322     }
323    
324    
325     checkhead(line) /* deal with line from header */
326     char *line;
327     {
328 greg 1.6 char fmt[32];
329 greg 1.5 double d;
330     COLOR ctmp;
331    
332 greg 2.8 if (formatval(fmt, line))
333 greg 1.6 wrongformat = strcmp(fmt, COLRFMT);
334 greg 2.8 else if (original && isexpos(line)) {
335 greg 1.5 d = 1.0/exposval(line);
336     scalecolor(exposure, d);
337 greg 2.7 doexposure++;
338 greg 1.6 } else if (original && iscolcor(line)) {
339 greg 1.5 colcorval(ctmp, line);
340 greg 1.7 setcolor(exposure, colval(exposure,RED)/colval(ctmp,RED),
341     colval(exposure,GRN)/colval(ctmp,GRN),
342     colval(exposure,BLU)/colval(ctmp,BLU));
343 greg 2.7 doexposure++;
344 greg 1.6 } else if (header)
345     fputs(line, stdout);
346 greg 1.1 }
347    
348    
349     pixtoval() /* convert picture to values */
350     {
351 greg 2.5 register COLOR *scanln;
352 greg 1.7 int dogamma;
353 greg 1.1 COLOR lastc;
354 greg 1.8 FLOAT hv[2];
355 greg 2.12 int startprim, endprim;
356     long startpos;
357 greg 1.1 int y;
358     register int x;
359    
360 greg 1.8 scanln = (COLOR *)malloc(scanlen(&picres)*sizeof(COLOR));
361 greg 1.1 if (scanln == NULL) {
362     fprintf(stderr, "%s: out of memory\n", progname);
363     quit(1);
364     }
365 greg 1.8 dogamma = gamcor < .95 || gamcor > 1.05;
366 greg 2.12 if (putprim == ALL && !interleave) {
367     startprim = RED; endprim = BLU;
368     startpos = ftell(fin);
369     } else {
370     startprim = putprim; endprim = putprim;
371     }
372     for (putprim = startprim; putprim <= endprim; putprim++) {
373     if (putprim != startprim && fseek(fin, startpos, 0)) {
374     fprintf(stderr, "%s: seek error on input file\n",
375     progname);
376 greg 1.1 quit(1);
377     }
378 greg 2.12 set_io();
379     setcolor(lastc, 0.0, 0.0, 0.0);
380     for (y = 0; y < numscans(&picres); y++) {
381     if (freadscan(scanln, scanlen(&picres), fin) < 0) {
382     fprintf(stderr, "%s: read error\n", progname);
383 greg 1.1 quit(1);
384     }
385 greg 2.12 for (x = 0; x < scanlen(&picres); x++) {
386     if (uniq)
387     if ( colval(scanln[x],RED) ==
388     colval(lastc,RED) &&
389     colval(scanln[x],GRN) ==
390     colval(lastc,GRN) &&
391     colval(scanln[x],BLU) ==
392     colval(lastc,BLU) )
393     continue;
394     else
395     copycolor(lastc, scanln[x]);
396     if (doexposure)
397     multcolor(scanln[x], exposure);
398     if (dogamma)
399     setcolor(scanln[x],
400     pow(colval(scanln[x],RED), 1.0/gamcor),
401     pow(colval(scanln[x],GRN), 1.0/gamcor),
402     pow(colval(scanln[x],BLU), 1.0/gamcor));
403     if (!dataonly) {
404     pix2loc(hv, &picres, x, y);
405     printf("%7d %7d ",
406     (int)(hv[0]*picres.xr),
407     (int)(hv[1]*picres.yr));
408     }
409     if ((*putval)(scanln[x]) < 0) {
410     fprintf(stderr, "%s: write error\n",
411     progname);
412     quit(1);
413     }
414     }
415 greg 1.1 }
416     }
417     free((char *)scanln);
418     }
419    
420    
421     valtopix() /* convert values to a pixel file */
422     {
423 greg 1.7 int dogamma;
424 greg 2.5 register COLOR *scanln;
425 greg 1.1 int y;
426     register int x;
427    
428 greg 1.8 scanln = (COLOR *)malloc(scanlen(&picres)*sizeof(COLOR));
429 greg 1.1 if (scanln == NULL) {
430     fprintf(stderr, "%s: out of memory\n", progname);
431     quit(1);
432     }
433 greg 1.8 dogamma = gamcor < .95 || gamcor > 1.05;
434 greg 2.12 set_io();
435 greg 1.8 for (y = 0; y < numscans(&picres); y++) {
436     for (x = 0; x < scanlen(&picres); x++) {
437 greg 2.10 if (!dataonly) {
438 greg 1.1 fscanf(fin, "%*d %*d");
439 greg 2.10 if (fin2 != NULL) {
440     fscanf(fin2, "%*d %*d");
441     fscanf(fin3, "%*d %*d");
442     }
443     }
444 greg 2.11 if ((*getval)(scanln[x]) < 0) {
445 greg 1.1 fprintf(stderr, "%s: read error\n", progname);
446     quit(1);
447     }
448 greg 1.7 if (dogamma)
449     setcolor(scanln[x],
450 greg 1.8 pow(colval(scanln[x],RED), gamcor),
451     pow(colval(scanln[x],GRN), gamcor),
452     pow(colval(scanln[x],BLU), gamcor));
453 greg 2.7 if (doexposure)
454     multcolor(scanln[x], exposure);
455 greg 1.1 }
456 greg 1.8 if (fwritescan(scanln, scanlen(&picres), stdout) < 0) {
457 greg 1.1 fprintf(stderr, "%s: write error\n", progname);
458     quit(1);
459     }
460     }
461     free((char *)scanln);
462     }
463    
464    
465     quit(code)
466     int code;
467     {
468     exit(code);
469     }
470    
471    
472 greg 2.11 getcascii(col) /* get an ascii color value from stream(s) */
473 greg 1.1 COLOR col;
474     {
475 greg 2.5 double vd[3];
476 greg 1.1
477 greg 2.11 if (fin2 == NULL) {
478     if (fscanf(fin, "%lf %lf %lf", &vd[0], &vd[1], &vd[2]) != 3)
479 greg 2.10 return(-1);
480     } else {
481 greg 2.11 if (fscanf(fin, "%lf", &vd[0]) != 1 ||
482     fscanf(fin2, "%lf", &vd[1]) != 1 ||
483     fscanf(fin3, "%lf", &vd[2]) != 1)
484 greg 2.10 return(-1);
485     }
486 greg 2.4 setcolor(col, vd[rord[RED]], vd[rord[GRN]], vd[rord[BLU]]);
487 greg 1.1 return(0);
488     }
489    
490    
491 greg 2.11 getcdouble(col) /* get a double color value from stream(s) */
492 greg 1.1 COLOR col;
493     {
494 greg 2.5 double vd[3];
495 greg 1.1
496 greg 2.11 if (fin2 == NULL) {
497     if (fread((char *)vd, sizeof(double), 3, fin) != 3)
498 greg 2.10 return(-1);
499     } else {
500 greg 2.11 if (fread((char *)vd, sizeof(double), 1, fin) != 1 ||
501     fread((char *)(vd+1), sizeof(double), 1, fin2) != 1 ||
502     fread((char *)(vd+2), sizeof(double), 1, fin3) != 1)
503 greg 2.10 return(-1);
504     }
505 greg 2.4 setcolor(col, vd[rord[RED]], vd[rord[GRN]], vd[rord[BLU]]);
506 greg 1.1 return(0);
507     }
508    
509    
510 greg 2.11 getcfloat(col) /* get a float color value from stream(s) */
511 greg 1.1 COLOR col;
512     {
513     float vf[3];
514    
515 greg 2.11 if (fin2 == NULL) {
516     if (fread((char *)vf, sizeof(float), 3, fin) != 3)
517 greg 2.10 return(-1);
518     } else {
519 greg 2.11 if (fread((char *)vf, sizeof(float), 1, fin) != 1 ||
520     fread((char *)(vf+1), sizeof(float), 1, fin2) != 1 ||
521     fread((char *)(vf+2), sizeof(float), 1, fin3) != 1)
522 greg 2.10 return(-1);
523     }
524 greg 2.4 setcolor(col, vf[rord[RED]], vf[rord[GRN]], vf[rord[BLU]]);
525 greg 1.1 return(0);
526     }
527    
528    
529 greg 2.11 getcint(col) /* get an int color value from stream(s) */
530 greg 1.1 COLOR col;
531     {
532     int vi[3];
533    
534 greg 2.11 if (fin2 == NULL) {
535     if (fscanf(fin, "%d %d %d", &vi[0], &vi[1], &vi[2]) != 3)
536 greg 2.10 return(-1);
537     } else {
538 greg 2.11 if (fscanf(fin, "%d", &vi[0]) != 1 ||
539     fscanf(fin2, "%d", &vi[1]) != 1 ||
540     fscanf(fin3, "%d", &vi[2]) != 1)
541 greg 2.10 return(-1);
542     }
543 greg 2.4 setcolor(col, (vi[rord[RED]]+.5)/256.,
544     (vi[rord[GRN]]+.5)/256., (vi[rord[BLU]]+.5)/256.);
545 greg 1.1 return(0);
546     }
547    
548    
549 greg 2.11 getcbyte(col) /* get a byte color value from stream(s) */
550 greg 1.1 COLOR col;
551     {
552     BYTE vb[3];
553    
554 greg 2.11 if (fin2 == NULL) {
555     if (fread((char *)vb, sizeof(BYTE), 3, fin) != 3)
556 greg 2.10 return(-1);
557     } else {
558 greg 2.11 if (fread((char *)vb, sizeof(BYTE), 1, fin) != 1 ||
559     fread((char *)(vb+1), sizeof(BYTE), 1, fin2) != 1 ||
560     fread((char *)(vb+2), sizeof(BYTE), 1, fin3) != 1)
561 greg 2.10 return(-1);
562     }
563 greg 2.4 setcolor(col, (vb[rord[RED]]+.5)/256.,
564     (vb[rord[GRN]]+.5)/256., (vb[rord[BLU]]+.5)/256.);
565 greg 1.1 return(0);
566     }
567    
568    
569 greg 2.11 getbascii(col) /* get an ascii brightness value from fin */
570 greg 1.1 COLOR col;
571     {
572 greg 2.5 double vd;
573 greg 1.1
574 greg 2.11 if (fscanf(fin, "%lf", &vd) != 1)
575 greg 1.1 return(-1);
576     setcolor(col, vd, vd, vd);
577     return(0);
578     }
579    
580    
581 greg 2.11 getbdouble(col) /* get a double brightness value from fin */
582 greg 1.1 COLOR col;
583     {
584 greg 2.5 double vd;
585 greg 1.1
586 greg 2.11 if (fread((char *)&vd, sizeof(double), 1, fin) != 1)
587 greg 1.1 return(-1);
588     setcolor(col, vd, vd, vd);
589     return(0);
590     }
591    
592    
593 greg 2.11 getbfloat(col) /* get a float brightness value from fin */
594 greg 1.1 COLOR col;
595     {
596     float vf;
597    
598 greg 2.11 if (fread((char *)&vf, sizeof(float), 1, fin) != 1)
599 greg 1.1 return(-1);
600     setcolor(col, vf, vf, vf);
601     return(0);
602     }
603    
604    
605 greg 2.11 getbint(col) /* get an int brightness value from fin */
606 greg 1.1 COLOR col;
607     {
608     int vi;
609 greg 2.5 double d;
610 greg 1.1
611 greg 2.11 if (fscanf(fin, "%d", &vi) != 1)
612 greg 1.1 return(-1);
613     d = (vi+.5)/256.;
614     setcolor(col, d, d, d);
615     return(0);
616     }
617    
618    
619 greg 2.11 getbbyte(col) /* get a byte brightness value from fin */
620 greg 1.1 COLOR col;
621     {
622     BYTE vb;
623 greg 2.5 double d;
624 greg 1.1
625 greg 2.11 if (fread((char *)&vb, sizeof(BYTE), 1, fin) != 1)
626 greg 1.1 return(-1);
627     d = (vb+.5)/256.;
628     setcolor(col, d, d, d);
629     return(0);
630     }
631    
632    
633 greg 2.11 putcascii(col) /* put an ascii color to stdout */
634 greg 1.1 COLOR col;
635     {
636 greg 2.11 fprintf(stdout, "%15.3e %15.3e %15.3e\n",
637 greg 2.4 colval(col,ord[0]),
638     colval(col,ord[1]),
639     colval(col,ord[2]));
640 greg 1.1
641 greg 2.11 return(ferror(stdout) ? -1 : 0);
642 greg 1.1 }
643    
644    
645 greg 2.11 putcfloat(col) /* put a float color to stdout */
646 greg 1.1 COLOR col;
647     {
648     float vf[3];
649    
650 greg 2.4 vf[0] = colval(col,ord[0]);
651     vf[1] = colval(col,ord[1]);
652     vf[2] = colval(col,ord[2]);
653 greg 2.11 fwrite((char *)vf, sizeof(float), 3, stdout);
654 greg 1.1
655 greg 2.11 return(ferror(stdout) ? -1 : 0);
656 greg 1.1 }
657    
658    
659 greg 2.11 putcdouble(col) /* put a double color to stdout */
660 greg 1.1 COLOR col;
661     {
662 greg 2.5 double vd[3];
663 greg 1.1
664 greg 2.4 vd[0] = colval(col,ord[0]);
665     vd[1] = colval(col,ord[1]);
666     vd[2] = colval(col,ord[2]);
667 greg 2.11 fwrite((char *)vd, sizeof(double), 3, stdout);
668 greg 1.1
669 greg 2.11 return(ferror(stdout) ? -1 : 0);
670 greg 1.1 }
671    
672    
673 greg 2.11 putcint(col) /* put an int color to stdout */
674 greg 1.1 COLOR col;
675     {
676 greg 2.11 fprintf(stdout, "%d %d %d\n",
677 greg 2.4 (int)(colval(col,ord[0])*256.),
678     (int)(colval(col,ord[1])*256.),
679     (int)(colval(col,ord[2])*256.));
680 greg 1.1
681 greg 2.11 return(ferror(stdout) ? -1 : 0);
682 greg 1.1 }
683    
684    
685 greg 2.11 putcbyte(col) /* put a byte color to stdout */
686 greg 1.1 COLOR col;
687     {
688     register int i;
689     BYTE vb[3];
690    
691 greg 2.4 i = colval(col,ord[0])*256.;
692 greg 1.1 vb[0] = min(i,255);
693 greg 2.4 i = colval(col,ord[1])*256.;
694 greg 1.1 vb[1] = min(i,255);
695 greg 2.4 i = colval(col,ord[2])*256.;
696 greg 1.1 vb[2] = min(i,255);
697 greg 2.11 fwrite((char *)vb, sizeof(BYTE), 3, stdout);
698 greg 1.1
699 greg 2.11 return(ferror(stdout) ? -1 : 0);
700 greg 1.1 }
701    
702    
703 greg 2.11 putbascii(col) /* put an ascii brightness to stdout */
704 greg 1.1 COLOR col;
705     {
706 greg 2.11 fprintf(stdout, "%15.3e\n", bright(col));
707 greg 1.1
708 greg 2.11 return(ferror(stdout) ? -1 : 0);
709 greg 1.1 }
710    
711    
712 greg 2.11 putbfloat(col) /* put a float brightness to stdout */
713 greg 1.1 COLOR col;
714     {
715     float vf;
716    
717     vf = bright(col);
718 greg 2.11 fwrite((char *)&vf, sizeof(float), 1, stdout);
719 greg 1.1
720 greg 2.11 return(ferror(stdout) ? -1 : 0);
721 greg 1.1 }
722    
723    
724 greg 2.11 putbdouble(col) /* put a double brightness to stdout */
725 greg 1.1 COLOR col;
726     {
727 greg 2.5 double vd;
728 greg 1.1
729     vd = bright(col);
730 greg 2.11 fwrite((char *)&vd, sizeof(double), 1, stdout);
731 greg 1.1
732 greg 2.11 return(ferror(stdout) ? -1 : 0);
733 greg 1.1 }
734    
735    
736 greg 2.11 putbint(col) /* put an int brightness to stdout */
737 greg 1.1 COLOR col;
738     {
739 greg 2.11 fprintf(stdout, "%d\n", (int)(bright(col)*256.));
740 greg 1.1
741 greg 2.11 return(ferror(stdout) ? -1 : 0);
742 greg 1.1 }
743    
744    
745 greg 2.11 putbbyte(col) /* put a byte brightness to stdout */
746 greg 1.1 COLOR col;
747     {
748     register int i;
749     BYTE vb;
750    
751     i = bright(col)*256.;
752     vb = min(i,255);
753 greg 2.11 fwrite((char *)&vb, sizeof(BYTE), 1, stdout);
754 greg 1.1
755 greg 2.11 return(ferror(stdout) ? -1 : 0);
756 greg 1.1 }
757    
758    
759 greg 2.11 putpascii(col) /* put an ascii primary to stdout */
760 greg 2.10 COLOR col;
761     {
762 greg 2.11 fprintf(stdout, "%15.3e\n", colval(col,putprim));
763 greg 2.10
764 greg 2.11 return(ferror(stdout) ? -1 : 0);
765 greg 2.10 }
766    
767    
768 greg 2.11 putpfloat(col) /* put a float primary to stdout */
769 greg 2.10 COLOR col;
770     {
771     float vf;
772    
773     vf = colval(col,putprim);
774 greg 2.11 fwrite((char *)&vf, sizeof(float), 1, stdout);
775 greg 2.10
776 greg 2.11 return(ferror(stdout) ? -1 : 0);
777 greg 2.10 }
778    
779    
780 greg 2.11 putpdouble(col) /* put a double primary to stdout */
781 greg 2.10 COLOR col;
782     {
783     double vd;
784    
785     vd = colval(col,putprim);
786 greg 2.11 fwrite((char *)&vd, sizeof(double), 1, stdout);
787 greg 2.10
788 greg 2.11 return(ferror(stdout) ? -1 : 0);
789 greg 2.10 }
790    
791    
792 greg 2.11 putpint(col) /* put an int primary to stdout */
793 greg 2.10 COLOR col;
794     {
795 greg 2.11 fprintf(stdout, "%d\n", (int)(colval(col,putprim)*256.));
796 greg 2.10
797 greg 2.11 return(ferror(stdout) ? -1 : 0);
798 greg 2.10 }
799    
800    
801 greg 2.11 putpbyte(col) /* put a byte primary to stdout */
802 greg 2.10 COLOR col;
803     {
804     register int i;
805     BYTE vb;
806    
807     i = colval(col,putprim)*256.;
808     vb = min(i,255);
809 greg 2.11 fwrite((char *)&vb, sizeof(BYTE), 1, stdout);
810 greg 2.10
811 greg 2.11 return(ferror(stdout) ? -1 : 0);
812 greg 2.10 }
813    
814    
815 greg 1.1 set_io() /* set put and get functions */
816     {
817     switch (format) {
818     case 'a': /* ascii */
819 greg 2.10 if (putprim == BRIGHT) {
820 greg 1.1 getval = getbascii;
821     putval = putbascii;
822 greg 2.10 } else if (putprim != ALL) {
823     getval = getbascii;
824     putval = putpascii;
825 greg 1.1 } else {
826     getval = getcascii;
827     putval = putcascii;
828 greg 2.12 if (reverse && !interleave) {
829     fprintf(stderr,
830     "%s: ASCII input files must be interleaved\n",
831     progname);
832     quit(1);
833     }
834 greg 1.1 }
835     return;
836     case 'f': /* binary float */
837 greg 2.10 if (putprim == BRIGHT) {
838 greg 1.1 getval = getbfloat;
839     putval = putbfloat;
840 greg 2.10 } else if (putprim != ALL) {
841     getval = getbfloat;
842     putval = putpfloat;
843 greg 1.1 } else {
844     getval = getcfloat;
845     putval = putcfloat;
846 greg 2.12 if (reverse && !interleave) {
847     if (fin2 == NULL)
848     goto namerr;
849     if (fseek(fin2,
850     (long)sizeof(float)*picres.xr*picres.yr, 1))
851     goto seekerr;
852     if (fseek(fin3,
853     (long)sizeof(float)*2*picres.xr*picres.yr, 1))
854     goto seekerr;
855     }
856 greg 1.1 }
857     return;
858     case 'd': /* binary double */
859 greg 2.10 if (putprim == BRIGHT) {
860 greg 1.1 getval = getbdouble;
861     putval = putbdouble;
862 greg 2.10 } else if (putprim != ALL) {
863     getval = getbdouble;
864     putval = putpdouble;
865 greg 1.1 } else {
866     getval = getcdouble;
867     putval = putcdouble;
868 greg 2.12 if (reverse && !interleave) {
869     if (fin2 == NULL)
870     goto namerr;
871     if (fseek(fin2,
872     (long)sizeof(double)*picres.xr*picres.yr, 1))
873     goto seekerr;
874     if (fseek(fin3,
875     (long)sizeof(double)*2*picres.xr*picres.yr, 1))
876     goto seekerr;
877     }
878 greg 1.1 }
879     return;
880     case 'i': /* integer */
881 greg 2.10 if (putprim == BRIGHT) {
882 greg 1.1 getval = getbint;
883     putval = putbint;
884 greg 2.10 } else if (putprim != ALL) {
885     getval = getbint;
886     putval = putpint;
887 greg 1.1 } else {
888     getval = getcint;
889     putval = putcint;
890 greg 2.12 if (reverse && !interleave) {
891     fprintf(stderr,
892     "%s: integer input files must be interleaved\n",
893     progname);
894     quit(1);
895     }
896 greg 1.1 }
897     return;
898     case 'b': /* byte */
899 greg 2.10 if (putprim == BRIGHT) {
900 greg 1.1 getval = getbbyte;
901     putval = putbbyte;
902 greg 2.10 } else if (putprim != ALL) {
903     getval = getbbyte;
904     putval = putpbyte;
905 greg 1.1 } else {
906     getval = getcbyte;
907     putval = putcbyte;
908 greg 2.12 if (reverse && !interleave) {
909     if (fin2 == NULL)
910     goto namerr;
911     if (fseek(fin2,
912     (long)sizeof(BYTE)*picres.xr*picres.yr, 1))
913     goto seekerr;
914     if (fseek(fin3,
915     (long)sizeof(BYTE)*2*picres.xr*picres.yr, 1))
916     goto seekerr;
917     }
918 greg 1.1 }
919     return;
920     }
921 greg 2.12 badopt:
922     fprintf(stderr, "%s: botched file type\n", progname);
923     quit(1);
924     namerr:
925     fprintf(stderr, "%s: non-interleaved file(s) must be named\n",
926     progname);
927     quit(1);
928     seekerr:
929     fprintf(stderr, "%s: cannot seek on interleaved input file\n",
930     progname);
931     quit(1);
932 greg 1.1 }