ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/pvalue.c
(Generate patch)

Comparing ray/src/px/pvalue.c (file contents):
Revision 2.9 by greg, Thu Oct 6 13:27:16 1994 UTC vs.
Revision 2.10 by greg, Wed Jan 8 07:43:49 1997 UTC

# Line 18 | Line 18 | static char SCCSid[] = "$SunId$ LBL";
18  
19   #define  min(a,b)               ((a)<(b)?(a):(b))
20  
21 +                                /* what to put out (also RED, GRN, BLU) */
22 + #define  ALL            3
23 + #define  BRIGHT         4
24 +
25 + #define  brightonly     (putprim==BRIGHT)
26 +
27   RESOLU  picres;                 /* resolution of picture */
28  
29   int  uniq = 0;                  /* print only unique values? */
# Line 26 | Line 32 | int  doexposure = 0;           /* exposure change? (>100 to pri
32  
33   int  dataonly = 0;              /* data only format? */
34  
35 < int  brightonly = 0;            /* only brightness values? */
35 > int  putprim = ALL;             /* what to put out */
36  
37   int  reverse = 0;               /* reverse conversion? */
38  
# Line 35 | Line 41 | char  *fmtid = "ascii";                /* format identifier for head
41  
42   int  header = 1;                /* do header? */
43  
44 + long  skipbytes = 0;            /* skip bytes in input? */
45 +
46   int  resolution = 1;            /* put/get resolution string? */
47  
48   int  original = 0;              /* convert to original values? */
# Line 51 | Line 59 | COLOR  exposure = WHTCOLOR;
59   char  *progname;
60  
61   FILE  *fin;
62 + FILE  *fin2 = NULL, *fin3 = NULL;       /* for other color channels */
63  
64   int  (*getval)(), (*putval)();
65  
# Line 60 | Line 69 | int  argc;
69   char  **argv;
70   {
71          extern int  checkhead();
72 +        extern long  atol();
73          double  d, expval = 1.0;
74          int  i;
75  
# Line 74 | Line 84 | char  **argv;
84                          case 'H':               /* resolution string */
85                                  resolution = argv[i][0] == '+';
86                                  break;
87 +                        case 's':               /* skip bytes in header */
88 +                                skipbytes = atol(argv[++i]);
89 +                                break;
90                          case 'u':               /* unique values */
91                                  uniq = argv[i][0] == '-';
92                                  break;
# Line 107 | Line 120 | char  **argv;
120                                  reverse = argv[i][0] == '-';
121                                  break;
122                          case 'b':               /* brightness values */
123 <                                brightonly = argv[i][0] == '-';
123 >                                putprim = argv[i][0] == '-' ? BRIGHT : ALL;
124                                  break;
125 +                        case 'p':               /* put primary */
126 +                                switch (argv[i][2]) {
127 +                                case 'r': case 'R': putprim = RED; break;
128 +                                case 'g': case 'G': putprim = GRN; break;
129 +                                case 'b': case 'B': putprim = BLU; break;
130 +                                default: goto unkopt;
131 +                                }
132 +                                break;
133                          case 'd':               /* data only (no indices) */
134                                  dataonly = argv[i][0] == '-';
135                                  switch (argv[i][2]) {
# Line 178 | Line 199 | unkopt:
199                                          /* get input */
200          if (i == argc) {
201                  fin = stdin;
202 <        } else if (i == argc-1) {
202 >        } else if (i < argc) {
203                  if ((fin = fopen(argv[i], "r")) == NULL) {
204                          fprintf(stderr, "%s: can't open file \"%s\"\n",
205                                                  progname, argv[i]);
206                          quit(1);
207                  }
208 <        } else {
208 >                if (skipbytes && fseek(fin, skipbytes, 0))
209 >                        goto seekerr;
210 >                if (reverse && !brightonly && i == argc-3) {
211 >                        if ((fin2 = fopen(argv[i+1], "r")) == NULL) {
212 >                                fprintf(stderr, "%s: can't open file \"%s\"\n",
213 >                                                progname, argv[i+1]);
214 >                                quit(1);
215 >                        }
216 >                        if ((fin3 = fopen(argv[i+2], "r")) == NULL) {
217 >                                fprintf(stderr, "%s: can't open file \"%s\"\n",
218 >                                                progname, argv[i+2]);
219 >                                quit(1);
220 >                        }
221 >                        if (skipbytes && (fseek(fin2, skipbytes, 0) ||
222 >                                        fseek(fin3, skipbytes, 0)))
223 >                                goto seekerr;
224 >                } else if (i != argc-1)
225 >                        fin = NULL;
226 >        }
227 >        if (fin == NULL) {
228                  fprintf(stderr, "%s: bad # file arguments\n", progname);
229                  quit(1);
230          }
# Line 204 | Line 244 | unkopt:
244                                                  progname);
245                                  quit(1);
246                          }
247 +                        if (fin2 != NULL) {
248 +                                getheader(fin2, NULL, NULL);
249 +                                getheader(fin3, NULL, NULL);
250 +                        }
251                  } else
252                          newheader("RADIANCE", stdout);
253                                          /* get resolution */
# Line 212 | Line 256 | unkopt:
256                          fprintf(stderr, "%s: missing resolution\n", progname);
257                          quit(1);
258                  }
259 +                if (resolution && fin2 != NULL) {
260 +                        RESOLU  pres2;
261 +                        if (!fgetsresolu(&pres2, fin2) ||
262 +                                        pres2.or != picres.or ||
263 +                                        pres2.xr != picres.xr ||
264 +                                        pres2.yr != picres.yr ||
265 +                                        !fgetsresolu(&pres2, fin3) ||
266 +                                        pres2.or != picres.or ||
267 +                                        pres2.xr != picres.xr ||
268 +                                        pres2.yr != picres.yr) {
269 +                                fprintf(stderr, "%s: resolution mismatch\n",
270 +                                                progname);
271 +                                quit(1);
272 +                        }
273 +                }
274                                                  /* add to header */
275                  printargs(i, argv, stdout);
276                  if (expval < .99 || expval > 1.01)
# Line 250 | Line 309 | unkopt:
309          }
310  
311          quit(0);
312 + seekerr:
313 +        fprintf(stderr, "%s: cannot skip %ld bytes on input\n",
314 +                        progname, skipbytes);
315 +        quit(1);
316   }
317  
318  
# Line 346 | Line 409 | valtopix()                     /* convert values to a pixel file */
409          dogamma = gamcor < .95 || gamcor > 1.05;
410          for (y = 0; y < numscans(&picres); y++) {
411                  for (x = 0; x < scanlen(&picres); x++) {
412 <                        if (!dataonly)
412 >                        if (!dataonly) {
413                                  fscanf(fin, "%*d %*d");
414 <                        if ((*getval)(scanln[x], fin) < 0) {
414 >                                if (fin2 != NULL) {
415 >                                        fscanf(fin2, "%*d %*d");
416 >                                        fscanf(fin3, "%*d %*d");
417 >                                }
418 >                        }
419 >                        if ((*getval)(scanln[x], fin, fin2, fin3) < 0) {
420                                  fprintf(stderr, "%s: read error\n", progname);
421                                  quit(1);
422                          }
# Line 376 | Line 444 | int  code;
444   }
445  
446  
447 < getcascii(col, fp)              /* get an ascii color value from fp */
447 > getcascii(col, f1, f2, f3)      /* get an ascii color value from stream(s) */
448   COLOR  col;
449 < FILE  *fp;
449 > FILE  *f1, *f2, *f3;
450   {
451          double  vd[3];
452  
453 <        if (fscanf(fp, "%lf %lf %lf", &vd[0], &vd[1], &vd[2]) != 3)
454 <                return(-1);
453 >        if (f2 == NULL) {
454 >                if (fscanf(f1, "%lf %lf %lf", &vd[0], &vd[1], &vd[2]) != 3)
455 >                        return(-1);
456 >        } else {
457 >                if (fscanf(f1, "%lf", &vd[0]) != 1 ||
458 >                                fscanf(f2, "%lf", &vd[1]) != 1 ||
459 >                                fscanf(f3, "%lf", &vd[2]) != 1)
460 >                        return(-1);
461 >        }
462          setcolor(col, vd[rord[RED]], vd[rord[GRN]], vd[rord[BLU]]);
463          return(0);
464   }
465  
466  
467 < getcdouble(col, fp)             /* get a double color value from fp */
467 > getcdouble(col, f1, f2, f3)     /* get a double color value from stream(s) */
468   COLOR  col;
469 < FILE  *fp;
469 > FILE  *f1, *f2, *f3;
470   {
471          double  vd[3];
472  
473 <        if (fread((char *)vd, sizeof(double), 3, fp) != 3)
474 <                return(-1);
473 >        if (f2 == NULL) {
474 >                if (fread((char *)vd, sizeof(double), 3, f1) != 3)
475 >                        return(-1);
476 >        } else {
477 >                if (fread((char *)vd, sizeof(double), 1, f1) != 1 ||
478 >                        fread((char *)(vd+1), sizeof(double), 1, f2) != 1 ||
479 >                        fread((char *)(vd+2), sizeof(double), 1, f3) != 1)
480 >                        return(-1);
481 >        }
482          setcolor(col, vd[rord[RED]], vd[rord[GRN]], vd[rord[BLU]]);
483          return(0);
484   }
485  
486  
487 < getcfloat(col, fp)              /* get a float color value from fp */
487 > getcfloat(col, f1, f2, f3)      /* get a float color value from stream(s) */
488   COLOR  col;
489 < FILE  *fp;
489 > FILE  *f1, *f2, *f3;
490   {
491          float  vf[3];
492  
493 <        if (fread((char *)vf, sizeof(float), 3, fp) != 3)
494 <                return(-1);
493 >        if (f2 == NULL) {
494 >                if (fread((char *)vf, sizeof(float), 3, f1) != 3)
495 >                        return(-1);
496 >        } else {
497 >                if (fread((char *)vf, sizeof(float), 1, f1) != 1 ||
498 >                        fread((char *)(vf+1), sizeof(float), 1, f2) != 1 ||
499 >                        fread((char *)(vf+2), sizeof(float), 1, f3) != 1)
500 >                        return(-1);
501 >        }
502          setcolor(col, vf[rord[RED]], vf[rord[GRN]], vf[rord[BLU]]);
503          return(0);
504   }
505  
506  
507 < getcint(col, fp)                /* get an int color value from fp */
507 > getcint(col, f1, f2, f3)        /* get an int color value from stream(s) */
508   COLOR  col;
509 < FILE  *fp;
509 > FILE  *f1, *f2, *f3;
510   {
511          int  vi[3];
512  
513 <        if (fscanf(fp, "%d %d %d", &vi[0], &vi[1], &vi[2]) != 3)
514 <                return(-1);
513 >        if (f2 == NULL) {
514 >                if (fscanf(f1, "%d %d %d", &vi[0], &vi[1], &vi[2]) != 3)
515 >                        return(-1);
516 >        } else {
517 >                if (fscanf(f1, "%d", &vi[0]) != 1 ||
518 >                                fscanf(f2, "%d", &vi[1]) != 1 ||
519 >                                fscanf(f3, "%d", &vi[2]) != 1)
520 >                        return(-1);
521 >        }
522          setcolor(col, (vi[rord[RED]]+.5)/256.,
523                          (vi[rord[GRN]]+.5)/256., (vi[rord[BLU]]+.5)/256.);
524          return(0);
525   }
526  
527  
528 < getcbyte(col, fp)               /* get a byte color value from fp */
528 > getcbyte(col, f1, f2, f3)       /* get a byte color value from stream(s) */
529   COLOR  col;
530 < FILE  *fp;
530 > FILE  *f1, *f2, *f3;
531   {
532          BYTE  vb[3];
533  
534 <        if (fread((char *)vb, sizeof(BYTE), 3, fp) != 3)
535 <                return(-1);
534 >        if (f2 == NULL) {
535 >                if (fread((char *)vb, sizeof(BYTE), 3, f1) != 3)
536 >                        return(-1);
537 >        } else {
538 >                if (fread((char *)vb, sizeof(BYTE), 1, f1) != 1 ||
539 >                        fread((char *)(vb+1), sizeof(BYTE), 1, f2) != 1 ||
540 >                        fread((char *)(vb+2), sizeof(BYTE), 1, f3) != 1)
541 >                        return(-1);
542 >        }
543          setcolor(col, (vb[rord[RED]]+.5)/256.,
544                          (vb[rord[GRN]]+.5)/256., (vb[rord[BLU]]+.5)/256.);
545          return(0);
# Line 648 | Line 751 | FILE  *fp;
751   }
752  
753  
754 + putpascii(col, fp)                      /* put an ascii primary to fp */
755 + COLOR  col;
756 + FILE  *fp;
757 + {
758 +        fprintf(fp, "%15.3e\n", colval(col,putprim));
759 +
760 +        return(ferror(fp) ? -1 : 0);
761 + }
762 +
763 +
764 + putpfloat(col, fp)                      /* put a float primary to fp */
765 + COLOR  col;
766 + FILE  *fp;
767 + {
768 +        float  vf;
769 +
770 +        vf = colval(col,putprim);
771 +        fwrite((char *)&vf, sizeof(float), 1, fp);
772 +
773 +        return(ferror(fp) ? -1 : 0);
774 + }
775 +
776 +
777 + putpdouble(col, fp)                     /* put a double primary to fp */
778 + COLOR  col;
779 + FILE  *fp;
780 + {
781 +        double  vd;
782 +
783 +        vd = colval(col,putprim);
784 +        fwrite((char *)&vd, sizeof(double), 1, fp);
785 +
786 +        return(ferror(fp) ? -1 : 0);
787 + }
788 +
789 +
790 + putpint(col, fp)                        /* put an int primary to fp */
791 + COLOR  col;
792 + FILE  *fp;
793 + {
794 +        fprintf(fp, "%d\n", (int)(colval(col,putprim)*256.));
795 +
796 +        return(ferror(fp) ? -1 : 0);
797 + }
798 +
799 +
800 + putpbyte(col, fp)                       /* put a byte primary to fp */
801 + COLOR  col;
802 + FILE  *fp;
803 + {
804 +        register int  i;
805 +        BYTE  vb;
806 +
807 +        i = colval(col,putprim)*256.;
808 +        vb = min(i,255);
809 +        fwrite((char *)&vb, sizeof(BYTE), 1, fp);
810 +
811 +        return(ferror(fp) ? -1 : 0);
812 + }
813 +
814 +
815   set_io()                        /* set put and get functions */
816   {
817          switch (format) {
818          case 'a':                                       /* ascii */
819 <                if (brightonly) {
819 >                if (putprim == BRIGHT) {
820                          getval = getbascii;
821                          putval = putbascii;
822 +                } else if (putprim != ALL) {
823 +                        getval = getbascii;
824 +                        putval = putpascii;
825                  } else {
826                          getval = getcascii;
827                          putval = putcascii;
828                  }
829                  return;
830          case 'f':                                       /* binary float */
831 <                if (brightonly) {
831 >                if (putprim == BRIGHT) {
832                          getval = getbfloat;
833                          putval = putbfloat;
834 +                } else if (putprim != ALL) {
835 +                        getval = getbfloat;
836 +                        putval = putpfloat;
837                  } else {
838                          getval = getcfloat;
839                          putval = putcfloat;
840                  }
841                  return;
842          case 'd':                                       /* binary double */
843 <                if (brightonly) {
843 >                if (putprim == BRIGHT) {
844                          getval = getbdouble;
845                          putval = putbdouble;
846 +                } else if (putprim != ALL) {
847 +                        getval = getbdouble;
848 +                        putval = putpdouble;
849                  } else {
850                          getval = getcdouble;
851                          putval = putcdouble;
852                  }
853                  return;
854          case 'i':                                       /* integer */
855 <                if (brightonly) {
855 >                if (putprim == BRIGHT) {
856                          getval = getbint;
857                          putval = putbint;
858 +                } else if (putprim != ALL) {
859 +                        getval = getbint;
860 +                        putval = putpint;
861                  } else {
862                          getval = getcint;
863                          putval = putcint;
864                  }
865                  return;
866          case 'b':                                       /* byte */
867 <                if (brightonly) {
867 >                if (putprim == BRIGHT) {
868                          getval = getbbyte;
869                          putval = putbbyte;
870 +                } else if (putprim != ALL) {
871 +                        getval = getbbyte;
872 +                        putval = putpbyte;
873                  } else {
874                          getval = getcbyte;
875                          putval = putcbyte;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines