ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/ra_bn.c
Revision: 1.3
Committed: Fri Feb 9 13:59:17 1990 UTC (34 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.2: +1 -1 lines
Log Message:
changed arguments printed in header

File Contents

# User Rev Content
1 greg 1.1 /* Copyright (c) 1986 Regents of the University of California */
2    
3     #ifndef lint
4     static char SCCSid[] = "$SunId$ LBL";
5     #endif
6    
7     /*
8     * ra_bn.c - program to convert between RADIANCE and barneyscan picture format.
9     *
10     * 10/12/88
11     */
12    
13     #include <stdio.h>
14    
15     #include "color.h"
16    
17     extern double atof(), pow();
18    
19     double gamma = 2.0; /* gamma correction */
20    
21     char *progname;
22    
23     char errmsg[128];
24    
25     FILE *rafp, *bnfp[3];
26    
27     int xmax, ymax;
28    
29    
30     main(argc, argv)
31     int argc;
32     char *argv[];
33     {
34     int reverse = 0;
35     int i;
36    
37     progname = argv[0];
38    
39     for (i = 1; i < argc; i++)
40     if (argv[i][0] == '-')
41     switch (argv[i][1]) {
42     case 'g':
43     gamma = atof(argv[++i]);
44     break;
45     case 'r':
46     reverse = !reverse;
47     break;
48     default:
49     goto userr;
50     }
51     else
52     break;
53    
54     if (reverse) {
55     if (i > argc-1 || i < argc-2)
56     goto userr;
57     if (openbarney(argv[i], "r") < 0) {
58     sprintf(errmsg, "cannot open input \"%s\"", argv[i]);
59     quiterr(errmsg);
60     }
61     if (i == argc-1 || !strcmp(argv[i+1], "-"))
62     rafp = stdout;
63     else if ((rafp = fopen(argv[i+1], "w")) == NULL) {
64     sprintf(errmsg, "cannot open output \"%s\"",
65     argv[i+1]);
66     quiterr(errmsg);
67     }
68     /* put header */
69 greg 1.3 printargs(i, argv, rafp);
70 greg 1.1 putc('\n', rafp);
71 greg 1.2 fputresolu(YMAJOR|YDECR, xmax, ymax, rafp);
72 greg 1.1 /* convert file */
73     bn2ra();
74     } else {
75     if (i != argc-2)
76     goto userr;
77     if (!strcmp(argv[i], "-"))
78     rafp = stdin;
79     else if ((rafp = fopen(argv[i], "r")) == NULL) {
80     sprintf(errmsg, "cannot open input \"%s\"",
81     argv[i]);
82     quiterr(errmsg);
83     }
84     /* get header */
85     getheader(rafp, NULL);
86 greg 1.2 if (fgetresolu(&xmax, &ymax, rafp) != (YMAJOR|YDECR))
87 greg 1.1 quiterr("bad RADIANCE format");
88     if (openbarney(argv[i+1], "w") < 0) {
89     sprintf(errmsg, "cannot open output \"%s\"", argv[i+1]);
90     quiterr(errmsg);
91     }
92     /* convert file */
93     ra2bn();
94     }
95     quiterr(NULL);
96     userr:
97     fprintf(stderr, "Usage: %s {input|-} output\n", progname);
98     fprintf(stderr, " or: %s -r [-g gamma] input [output|-]\n",
99     progname);
100     exit(1);
101     }
102    
103    
104     quiterr(err) /* print message and exit */
105     char *err;
106     {
107     if (err != NULL) {
108     fprintf(stderr, "%s: %s\n", progname, err);
109     exit(1);
110     }
111     exit(0);
112     }
113    
114    
115     openbarney(fname, mode) /* open barneyscan files */
116     char *fname;
117     char *mode;
118     {
119     static char suffix[3][4] = {"red", "grn", "blu"};
120     int i;
121     char file[128];
122    
123     for (i = 0; i < 3; i++) {
124     sprintf(file, "%s.%s", fname, suffix[i]);
125     if ((bnfp[i] = fopen(file, mode)) == NULL)
126     return(-1);
127     }
128     if (mode[0] == 'r') { /* get header */
129     xmax = getint(bnfp[0]);
130     ymax = getint(bnfp[0]);
131     for (i = 1; i < 3; i++)
132     if (getint(bnfp[i]) != xmax || getint(bnfp[i]) != ymax)
133     return(-1);
134     } else { /* put header */
135     for (i = 0; i < 3; i++) {
136     putint(xmax, bnfp[i]);
137     putint(ymax, bnfp[i]);
138     }
139     }
140     return(0);
141     }
142    
143    
144     int
145     getint(fp) /* get short int from barneyscan file */
146     register FILE *fp;
147     {
148     register short val;
149    
150     val = getc(fp);
151     val |= getc(fp) << 8;
152    
153     return(val);
154     }
155    
156    
157     putint(val, fp) /* put short int to barneyscan file */
158     register int val;
159     register FILE *fp;
160     {
161     putc(val&0xff, fp);
162     putc((val >> 8)&0xff, fp);
163     }
164    
165    
166     ra2bn() /* convert radiance to barneyscan */
167     {
168     unsigned char gmap[1024];
169     register int i,k,c;
170     register COLOR *inline;
171     int j;
172    
173     if ((inline = (COLOR *)malloc(xmax*sizeof(COLOR))) == NULL)
174     quiterr("out of memory");
175     for (i = 0; i < 1024; i++)
176     gmap[i] = 256.*pow((i+.5)/1024., 1./gamma);
177     for (j = 0; j < ymax; j++) {
178     if (freadscan(inline, xmax, rafp) < 0)
179     quiterr("error reading RADIANCE file");
180     for (i = 0; i < xmax; i++)
181     for (k = 0; k < 3; k++) {
182     c = 1024.*colval(inline[i],k);
183     if (c >= 1024)
184     c = 1023;
185     putc(gmap[c], bnfp[k]);
186     }
187     }
188     free((char *)inline);
189     }
190    
191    
192     bn2ra() /* convert barneyscan to radiance */
193     {
194     float gmap[256];
195     register int i,k,c;
196     register COLOR *outline;
197     int j;
198    
199     if ((outline = (COLOR *)malloc(xmax*sizeof(COLOR))) == NULL)
200     quiterr("out of memory");
201     for (i = 0; i < 256; i++)
202     gmap[i] = pow((i+.5)/256., gamma);
203     for (j = 0; j < ymax; j++) {
204     for (i = 0; i < xmax; i++)
205     for (k = 0; k < 3; k++)
206     if ((c = getc(bnfp[k])) == EOF)
207     quiterr("error reading barney file");
208     else
209     colval(outline[i],k) = gmap[c];
210     if (fwritescan(outline, xmax, rafp) < 0)
211     quiterr("error writing RADIANCE file");
212     }
213     free((char *)outline);
214     }