ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/pvalue.c
Revision: 2.13
Committed: Tue Oct 27 09:08:27 1998 UTC (25 years, 5 months ago) by gwlarson
Content type: text/plain
Branch: MAIN
Changes since 2.12: +2 -0 lines
Log Message:
changed getheader() to listen to return value of passed function

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 gwlarson 2.13 int
326 greg 1.1 checkhead(line) /* deal with line from header */
327     char *line;
328     {
329 greg 1.6 char fmt[32];
330 greg 1.5 double d;
331     COLOR ctmp;
332    
333 greg 2.8 if (formatval(fmt, line))
334 greg 1.6 wrongformat = strcmp(fmt, COLRFMT);
335 greg 2.8 else if (original && isexpos(line)) {
336 greg 1.5 d = 1.0/exposval(line);
337     scalecolor(exposure, d);
338 greg 2.7 doexposure++;
339 greg 1.6 } else if (original && iscolcor(line)) {
340 greg 1.5 colcorval(ctmp, line);
341 greg 1.7 setcolor(exposure, colval(exposure,RED)/colval(ctmp,RED),
342     colval(exposure,GRN)/colval(ctmp,GRN),
343     colval(exposure,BLU)/colval(ctmp,BLU));
344 greg 2.7 doexposure++;
345 greg 1.6 } else if (header)
346     fputs(line, stdout);
347 gwlarson 2.13 return(0);
348 greg 1.1 }
349    
350    
351     pixtoval() /* convert picture to values */
352     {
353 greg 2.5 register COLOR *scanln;
354 greg 1.7 int dogamma;
355 greg 1.1 COLOR lastc;
356 greg 1.8 FLOAT hv[2];
357 greg 2.12 int startprim, endprim;
358     long startpos;
359 greg 1.1 int y;
360     register int x;
361    
362 greg 1.8 scanln = (COLOR *)malloc(scanlen(&picres)*sizeof(COLOR));
363 greg 1.1 if (scanln == NULL) {
364     fprintf(stderr, "%s: out of memory\n", progname);
365     quit(1);
366     }
367 greg 1.8 dogamma = gamcor < .95 || gamcor > 1.05;
368 greg 2.12 if (putprim == ALL && !interleave) {
369     startprim = RED; endprim = BLU;
370     startpos = ftell(fin);
371     } else {
372     startprim = putprim; endprim = putprim;
373     }
374     for (putprim = startprim; putprim <= endprim; putprim++) {
375     if (putprim != startprim && fseek(fin, startpos, 0)) {
376     fprintf(stderr, "%s: seek error on input file\n",
377     progname);
378 greg 1.1 quit(1);
379     }
380 greg 2.12 set_io();
381     setcolor(lastc, 0.0, 0.0, 0.0);
382     for (y = 0; y < numscans(&picres); y++) {
383     if (freadscan(scanln, scanlen(&picres), fin) < 0) {
384     fprintf(stderr, "%s: read error\n", progname);
385 greg 1.1 quit(1);
386     }
387 greg 2.12 for (x = 0; x < scanlen(&picres); x++) {
388     if (uniq)
389     if ( colval(scanln[x],RED) ==
390     colval(lastc,RED) &&
391     colval(scanln[x],GRN) ==
392     colval(lastc,GRN) &&
393     colval(scanln[x],BLU) ==
394     colval(lastc,BLU) )
395     continue;
396     else
397     copycolor(lastc, scanln[x]);
398     if (doexposure)
399     multcolor(scanln[x], exposure);
400     if (dogamma)
401     setcolor(scanln[x],
402     pow(colval(scanln[x],RED), 1.0/gamcor),
403     pow(colval(scanln[x],GRN), 1.0/gamcor),
404     pow(colval(scanln[x],BLU), 1.0/gamcor));
405     if (!dataonly) {
406     pix2loc(hv, &picres, x, y);
407     printf("%7d %7d ",
408     (int)(hv[0]*picres.xr),
409     (int)(hv[1]*picres.yr));
410     }
411     if ((*putval)(scanln[x]) < 0) {
412     fprintf(stderr, "%s: write error\n",
413     progname);
414     quit(1);
415     }
416     }
417 greg 1.1 }
418     }
419     free((char *)scanln);
420     }
421    
422    
423     valtopix() /* convert values to a pixel file */
424     {
425 greg 1.7 int dogamma;
426 greg 2.5 register COLOR *scanln;
427 greg 1.1 int y;
428     register int x;
429    
430 greg 1.8 scanln = (COLOR *)malloc(scanlen(&picres)*sizeof(COLOR));
431 greg 1.1 if (scanln == NULL) {
432     fprintf(stderr, "%s: out of memory\n", progname);
433     quit(1);
434     }
435 greg 1.8 dogamma = gamcor < .95 || gamcor > 1.05;
436 greg 2.12 set_io();
437 greg 1.8 for (y = 0; y < numscans(&picres); y++) {
438     for (x = 0; x < scanlen(&picres); x++) {
439 greg 2.10 if (!dataonly) {
440 greg 1.1 fscanf(fin, "%*d %*d");
441 greg 2.10 if (fin2 != NULL) {
442     fscanf(fin2, "%*d %*d");
443     fscanf(fin3, "%*d %*d");
444     }
445     }
446 greg 2.11 if ((*getval)(scanln[x]) < 0) {
447 greg 1.1 fprintf(stderr, "%s: read error\n", progname);
448     quit(1);
449     }
450 greg 1.7 if (dogamma)
451     setcolor(scanln[x],
452 greg 1.8 pow(colval(scanln[x],RED), gamcor),
453     pow(colval(scanln[x],GRN), gamcor),
454     pow(colval(scanln[x],BLU), gamcor));
455 greg 2.7 if (doexposure)
456     multcolor(scanln[x], exposure);
457 greg 1.1 }
458 greg 1.8 if (fwritescan(scanln, scanlen(&picres), stdout) < 0) {
459 greg 1.1 fprintf(stderr, "%s: write error\n", progname);
460     quit(1);
461     }
462     }
463     free((char *)scanln);
464     }
465    
466    
467     quit(code)
468     int code;
469     {
470     exit(code);
471     }
472    
473    
474 greg 2.11 getcascii(col) /* get an ascii color value from stream(s) */
475 greg 1.1 COLOR col;
476     {
477 greg 2.5 double vd[3];
478 greg 1.1
479 greg 2.11 if (fin2 == NULL) {
480     if (fscanf(fin, "%lf %lf %lf", &vd[0], &vd[1], &vd[2]) != 3)
481 greg 2.10 return(-1);
482     } else {
483 greg 2.11 if (fscanf(fin, "%lf", &vd[0]) != 1 ||
484     fscanf(fin2, "%lf", &vd[1]) != 1 ||
485     fscanf(fin3, "%lf", &vd[2]) != 1)
486 greg 2.10 return(-1);
487     }
488 greg 2.4 setcolor(col, vd[rord[RED]], vd[rord[GRN]], vd[rord[BLU]]);
489 greg 1.1 return(0);
490     }
491    
492    
493 greg 2.11 getcdouble(col) /* get a double color value from stream(s) */
494 greg 1.1 COLOR col;
495     {
496 greg 2.5 double vd[3];
497 greg 1.1
498 greg 2.11 if (fin2 == NULL) {
499     if (fread((char *)vd, sizeof(double), 3, fin) != 3)
500 greg 2.10 return(-1);
501     } else {
502 greg 2.11 if (fread((char *)vd, sizeof(double), 1, fin) != 1 ||
503     fread((char *)(vd+1), sizeof(double), 1, fin2) != 1 ||
504     fread((char *)(vd+2), sizeof(double), 1, fin3) != 1)
505 greg 2.10 return(-1);
506     }
507 greg 2.4 setcolor(col, vd[rord[RED]], vd[rord[GRN]], vd[rord[BLU]]);
508 greg 1.1 return(0);
509     }
510    
511    
512 greg 2.11 getcfloat(col) /* get a float color value from stream(s) */
513 greg 1.1 COLOR col;
514     {
515     float vf[3];
516    
517 greg 2.11 if (fin2 == NULL) {
518     if (fread((char *)vf, sizeof(float), 3, fin) != 3)
519 greg 2.10 return(-1);
520     } else {
521 greg 2.11 if (fread((char *)vf, sizeof(float), 1, fin) != 1 ||
522     fread((char *)(vf+1), sizeof(float), 1, fin2) != 1 ||
523     fread((char *)(vf+2), sizeof(float), 1, fin3) != 1)
524 greg 2.10 return(-1);
525     }
526 greg 2.4 setcolor(col, vf[rord[RED]], vf[rord[GRN]], vf[rord[BLU]]);
527 greg 1.1 return(0);
528     }
529    
530    
531 greg 2.11 getcint(col) /* get an int color value from stream(s) */
532 greg 1.1 COLOR col;
533     {
534     int vi[3];
535    
536 greg 2.11 if (fin2 == NULL) {
537     if (fscanf(fin, "%d %d %d", &vi[0], &vi[1], &vi[2]) != 3)
538 greg 2.10 return(-1);
539     } else {
540 greg 2.11 if (fscanf(fin, "%d", &vi[0]) != 1 ||
541     fscanf(fin2, "%d", &vi[1]) != 1 ||
542     fscanf(fin3, "%d", &vi[2]) != 1)
543 greg 2.10 return(-1);
544     }
545 greg 2.4 setcolor(col, (vi[rord[RED]]+.5)/256.,
546     (vi[rord[GRN]]+.5)/256., (vi[rord[BLU]]+.5)/256.);
547 greg 1.1 return(0);
548     }
549    
550    
551 greg 2.11 getcbyte(col) /* get a byte color value from stream(s) */
552 greg 1.1 COLOR col;
553     {
554     BYTE vb[3];
555    
556 greg 2.11 if (fin2 == NULL) {
557     if (fread((char *)vb, sizeof(BYTE), 3, fin) != 3)
558 greg 2.10 return(-1);
559     } else {
560 greg 2.11 if (fread((char *)vb, sizeof(BYTE), 1, fin) != 1 ||
561     fread((char *)(vb+1), sizeof(BYTE), 1, fin2) != 1 ||
562     fread((char *)(vb+2), sizeof(BYTE), 1, fin3) != 1)
563 greg 2.10 return(-1);
564     }
565 greg 2.4 setcolor(col, (vb[rord[RED]]+.5)/256.,
566     (vb[rord[GRN]]+.5)/256., (vb[rord[BLU]]+.5)/256.);
567 greg 1.1 return(0);
568     }
569    
570    
571 greg 2.11 getbascii(col) /* get an ascii brightness value from fin */
572 greg 1.1 COLOR col;
573     {
574 greg 2.5 double vd;
575 greg 1.1
576 greg 2.11 if (fscanf(fin, "%lf", &vd) != 1)
577 greg 1.1 return(-1);
578     setcolor(col, vd, vd, vd);
579     return(0);
580     }
581    
582    
583 greg 2.11 getbdouble(col) /* get a double brightness value from fin */
584 greg 1.1 COLOR col;
585     {
586 greg 2.5 double vd;
587 greg 1.1
588 greg 2.11 if (fread((char *)&vd, sizeof(double), 1, fin) != 1)
589 greg 1.1 return(-1);
590     setcolor(col, vd, vd, vd);
591     return(0);
592     }
593    
594    
595 greg 2.11 getbfloat(col) /* get a float brightness value from fin */
596 greg 1.1 COLOR col;
597     {
598     float vf;
599    
600 greg 2.11 if (fread((char *)&vf, sizeof(float), 1, fin) != 1)
601 greg 1.1 return(-1);
602     setcolor(col, vf, vf, vf);
603     return(0);
604     }
605    
606    
607 greg 2.11 getbint(col) /* get an int brightness value from fin */
608 greg 1.1 COLOR col;
609     {
610     int vi;
611 greg 2.5 double d;
612 greg 1.1
613 greg 2.11 if (fscanf(fin, "%d", &vi) != 1)
614 greg 1.1 return(-1);
615     d = (vi+.5)/256.;
616     setcolor(col, d, d, d);
617     return(0);
618     }
619    
620    
621 greg 2.11 getbbyte(col) /* get a byte brightness value from fin */
622 greg 1.1 COLOR col;
623     {
624     BYTE vb;
625 greg 2.5 double d;
626 greg 1.1
627 greg 2.11 if (fread((char *)&vb, sizeof(BYTE), 1, fin) != 1)
628 greg 1.1 return(-1);
629     d = (vb+.5)/256.;
630     setcolor(col, d, d, d);
631     return(0);
632     }
633    
634    
635 greg 2.11 putcascii(col) /* put an ascii color to stdout */
636 greg 1.1 COLOR col;
637     {
638 greg 2.11 fprintf(stdout, "%15.3e %15.3e %15.3e\n",
639 greg 2.4 colval(col,ord[0]),
640     colval(col,ord[1]),
641     colval(col,ord[2]));
642 greg 1.1
643 greg 2.11 return(ferror(stdout) ? -1 : 0);
644 greg 1.1 }
645    
646    
647 greg 2.11 putcfloat(col) /* put a float color to stdout */
648 greg 1.1 COLOR col;
649     {
650     float vf[3];
651    
652 greg 2.4 vf[0] = colval(col,ord[0]);
653     vf[1] = colval(col,ord[1]);
654     vf[2] = colval(col,ord[2]);
655 greg 2.11 fwrite((char *)vf, sizeof(float), 3, stdout);
656 greg 1.1
657 greg 2.11 return(ferror(stdout) ? -1 : 0);
658 greg 1.1 }
659    
660    
661 greg 2.11 putcdouble(col) /* put a double color to stdout */
662 greg 1.1 COLOR col;
663     {
664 greg 2.5 double vd[3];
665 greg 1.1
666 greg 2.4 vd[0] = colval(col,ord[0]);
667     vd[1] = colval(col,ord[1]);
668     vd[2] = colval(col,ord[2]);
669 greg 2.11 fwrite((char *)vd, sizeof(double), 3, stdout);
670 greg 1.1
671 greg 2.11 return(ferror(stdout) ? -1 : 0);
672 greg 1.1 }
673    
674    
675 greg 2.11 putcint(col) /* put an int color to stdout */
676 greg 1.1 COLOR col;
677     {
678 greg 2.11 fprintf(stdout, "%d %d %d\n",
679 greg 2.4 (int)(colval(col,ord[0])*256.),
680     (int)(colval(col,ord[1])*256.),
681     (int)(colval(col,ord[2])*256.));
682 greg 1.1
683 greg 2.11 return(ferror(stdout) ? -1 : 0);
684 greg 1.1 }
685    
686    
687 greg 2.11 putcbyte(col) /* put a byte color to stdout */
688 greg 1.1 COLOR col;
689     {
690     register int i;
691     BYTE vb[3];
692    
693 greg 2.4 i = colval(col,ord[0])*256.;
694 greg 1.1 vb[0] = min(i,255);
695 greg 2.4 i = colval(col,ord[1])*256.;
696 greg 1.1 vb[1] = min(i,255);
697 greg 2.4 i = colval(col,ord[2])*256.;
698 greg 1.1 vb[2] = min(i,255);
699 greg 2.11 fwrite((char *)vb, sizeof(BYTE), 3, stdout);
700 greg 1.1
701 greg 2.11 return(ferror(stdout) ? -1 : 0);
702 greg 1.1 }
703    
704    
705 greg 2.11 putbascii(col) /* put an ascii brightness to stdout */
706 greg 1.1 COLOR col;
707     {
708 greg 2.11 fprintf(stdout, "%15.3e\n", bright(col));
709 greg 1.1
710 greg 2.11 return(ferror(stdout) ? -1 : 0);
711 greg 1.1 }
712    
713    
714 greg 2.11 putbfloat(col) /* put a float brightness to stdout */
715 greg 1.1 COLOR col;
716     {
717     float vf;
718    
719     vf = bright(col);
720 greg 2.11 fwrite((char *)&vf, sizeof(float), 1, stdout);
721 greg 1.1
722 greg 2.11 return(ferror(stdout) ? -1 : 0);
723 greg 1.1 }
724    
725    
726 greg 2.11 putbdouble(col) /* put a double brightness to stdout */
727 greg 1.1 COLOR col;
728     {
729 greg 2.5 double vd;
730 greg 1.1
731     vd = bright(col);
732 greg 2.11 fwrite((char *)&vd, sizeof(double), 1, stdout);
733 greg 1.1
734 greg 2.11 return(ferror(stdout) ? -1 : 0);
735 greg 1.1 }
736    
737    
738 greg 2.11 putbint(col) /* put an int brightness to stdout */
739 greg 1.1 COLOR col;
740     {
741 greg 2.11 fprintf(stdout, "%d\n", (int)(bright(col)*256.));
742 greg 1.1
743 greg 2.11 return(ferror(stdout) ? -1 : 0);
744 greg 1.1 }
745    
746    
747 greg 2.11 putbbyte(col) /* put a byte brightness to stdout */
748 greg 1.1 COLOR col;
749     {
750     register int i;
751     BYTE vb;
752    
753     i = bright(col)*256.;
754     vb = min(i,255);
755 greg 2.11 fwrite((char *)&vb, sizeof(BYTE), 1, stdout);
756 greg 1.1
757 greg 2.11 return(ferror(stdout) ? -1 : 0);
758 greg 1.1 }
759    
760    
761 greg 2.11 putpascii(col) /* put an ascii primary to stdout */
762 greg 2.10 COLOR col;
763     {
764 greg 2.11 fprintf(stdout, "%15.3e\n", colval(col,putprim));
765 greg 2.10
766 greg 2.11 return(ferror(stdout) ? -1 : 0);
767 greg 2.10 }
768    
769    
770 greg 2.11 putpfloat(col) /* put a float primary to stdout */
771 greg 2.10 COLOR col;
772     {
773     float vf;
774    
775     vf = colval(col,putprim);
776 greg 2.11 fwrite((char *)&vf, sizeof(float), 1, stdout);
777 greg 2.10
778 greg 2.11 return(ferror(stdout) ? -1 : 0);
779 greg 2.10 }
780    
781    
782 greg 2.11 putpdouble(col) /* put a double primary to stdout */
783 greg 2.10 COLOR col;
784     {
785     double vd;
786    
787     vd = colval(col,putprim);
788 greg 2.11 fwrite((char *)&vd, sizeof(double), 1, stdout);
789 greg 2.10
790 greg 2.11 return(ferror(stdout) ? -1 : 0);
791 greg 2.10 }
792    
793    
794 greg 2.11 putpint(col) /* put an int primary to stdout */
795 greg 2.10 COLOR col;
796     {
797 greg 2.11 fprintf(stdout, "%d\n", (int)(colval(col,putprim)*256.));
798 greg 2.10
799 greg 2.11 return(ferror(stdout) ? -1 : 0);
800 greg 2.10 }
801    
802    
803 greg 2.11 putpbyte(col) /* put a byte primary to stdout */
804 greg 2.10 COLOR col;
805     {
806     register int i;
807     BYTE vb;
808    
809     i = colval(col,putprim)*256.;
810     vb = min(i,255);
811 greg 2.11 fwrite((char *)&vb, sizeof(BYTE), 1, stdout);
812 greg 2.10
813 greg 2.11 return(ferror(stdout) ? -1 : 0);
814 greg 2.10 }
815    
816    
817 greg 1.1 set_io() /* set put and get functions */
818     {
819     switch (format) {
820     case 'a': /* ascii */
821 greg 2.10 if (putprim == BRIGHT) {
822 greg 1.1 getval = getbascii;
823     putval = putbascii;
824 greg 2.10 } else if (putprim != ALL) {
825     getval = getbascii;
826     putval = putpascii;
827 greg 1.1 } else {
828     getval = getcascii;
829     putval = putcascii;
830 greg 2.12 if (reverse && !interleave) {
831     fprintf(stderr,
832     "%s: ASCII input files must be interleaved\n",
833     progname);
834     quit(1);
835     }
836 greg 1.1 }
837     return;
838     case 'f': /* binary float */
839 greg 2.10 if (putprim == BRIGHT) {
840 greg 1.1 getval = getbfloat;
841     putval = putbfloat;
842 greg 2.10 } else if (putprim != ALL) {
843     getval = getbfloat;
844     putval = putpfloat;
845 greg 1.1 } else {
846     getval = getcfloat;
847     putval = putcfloat;
848 greg 2.12 if (reverse && !interleave) {
849     if (fin2 == NULL)
850     goto namerr;
851     if (fseek(fin2,
852     (long)sizeof(float)*picres.xr*picres.yr, 1))
853     goto seekerr;
854     if (fseek(fin3,
855     (long)sizeof(float)*2*picres.xr*picres.yr, 1))
856     goto seekerr;
857     }
858 greg 1.1 }
859     return;
860     case 'd': /* binary double */
861 greg 2.10 if (putprim == BRIGHT) {
862 greg 1.1 getval = getbdouble;
863     putval = putbdouble;
864 greg 2.10 } else if (putprim != ALL) {
865     getval = getbdouble;
866     putval = putpdouble;
867 greg 1.1 } else {
868     getval = getcdouble;
869     putval = putcdouble;
870 greg 2.12 if (reverse && !interleave) {
871     if (fin2 == NULL)
872     goto namerr;
873     if (fseek(fin2,
874     (long)sizeof(double)*picres.xr*picres.yr, 1))
875     goto seekerr;
876     if (fseek(fin3,
877     (long)sizeof(double)*2*picres.xr*picres.yr, 1))
878     goto seekerr;
879     }
880 greg 1.1 }
881     return;
882     case 'i': /* integer */
883 greg 2.10 if (putprim == BRIGHT) {
884 greg 1.1 getval = getbint;
885     putval = putbint;
886 greg 2.10 } else if (putprim != ALL) {
887     getval = getbint;
888     putval = putpint;
889 greg 1.1 } else {
890     getval = getcint;
891     putval = putcint;
892 greg 2.12 if (reverse && !interleave) {
893     fprintf(stderr,
894     "%s: integer input files must be interleaved\n",
895     progname);
896     quit(1);
897     }
898 greg 1.1 }
899     return;
900     case 'b': /* byte */
901 greg 2.10 if (putprim == BRIGHT) {
902 greg 1.1 getval = getbbyte;
903     putval = putbbyte;
904 greg 2.10 } else if (putprim != ALL) {
905     getval = getbbyte;
906     putval = putpbyte;
907 greg 1.1 } else {
908     getval = getcbyte;
909     putval = putcbyte;
910 greg 2.12 if (reverse && !interleave) {
911     if (fin2 == NULL)
912     goto namerr;
913     if (fseek(fin2,
914     (long)sizeof(BYTE)*picres.xr*picres.yr, 1))
915     goto seekerr;
916     if (fseek(fin3,
917     (long)sizeof(BYTE)*2*picres.xr*picres.yr, 1))
918     goto seekerr;
919     }
920 greg 1.1 }
921     return;
922     }
923 greg 2.12 badopt:
924     fprintf(stderr, "%s: botched file type\n", progname);
925     quit(1);
926     namerr:
927     fprintf(stderr, "%s: non-interleaved file(s) must be named\n",
928     progname);
929     quit(1);
930     seekerr:
931     fprintf(stderr, "%s: cannot seek on interleaved input file\n",
932     progname);
933     quit(1);
934 greg 1.1 }