ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/pvalue.c
Revision: 2.14
Committed: Sat Feb 22 02:07:27 2003 UTC (21 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.13: +46 -20 lines
Log Message:
Changes and check-in for 3.5 release
Includes new source files and modifications not recorded for many years
See ray/doc/notes/ReleaseNotes for notes between 3.1 and 3.5 release

File Contents

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