ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/ra_bn.c
Revision: 2.7
Committed: Sat Feb 22 02:07:27 2003 UTC (21 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R5
Changes since 2.6: +5 -8 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.7 static const char RCSid[] = "$Id$";
3 greg 1.1 #endif
4     /*
5     * ra_bn.c - program to convert between RADIANCE and barneyscan picture format.
6     *
7     * 10/12/88
8     */
9    
10     #include <stdio.h>
11    
12 greg 2.3 #ifdef MSDOS
13     #include <fcntl.h>
14     #endif
15    
16 greg 2.7 #include <time.h>
17    
18 greg 2.4 #include <math.h>
19    
20 greg 1.1 #include "color.h"
21    
22 greg 1.9 #include "resolu.h"
23 greg 1.1
24 greg 2.5 double gamcor = 2.0; /* gamma correction */
25 greg 1.1
26 greg 1.8 int bradj = 0; /* brightness adjustment */
27    
28 greg 1.1 char *progname;
29    
30     char errmsg[128];
31    
32     FILE *rafp, *bnfp[3];
33    
34     int xmax, ymax;
35    
36    
37     main(argc, argv)
38     int argc;
39     char *argv[];
40     {
41     int reverse = 0;
42     int i;
43 greg 2.3 #ifdef MSDOS
44     extern int _fmode;
45     _fmode = O_BINARY;
46     setmode(fileno(stdin), O_BINARY);
47     setmode(fileno(stdout), O_BINARY);
48     #endif
49 greg 1.1 progname = argv[0];
50    
51     for (i = 1; i < argc; i++)
52     if (argv[i][0] == '-')
53     switch (argv[i][1]) {
54     case 'g':
55 greg 2.5 gamcor = atof(argv[++i]);
56 greg 1.1 break;
57     case 'r':
58     reverse = !reverse;
59     break;
60 greg 1.8 case 'e':
61     if (argv[i+1][0] != '+' && argv[i+1][0] != '-')
62     goto userr;
63     bradj = atoi(argv[++i]);
64     break;
65 greg 1.1 default:
66     goto userr;
67     }
68     else
69     break;
70 greg 1.6 /* set gamma correction */
71 greg 2.5 setcolrgam(gamcor);
72 greg 1.1
73     if (reverse) {
74     if (i > argc-1 || i < argc-2)
75     goto userr;
76     if (openbarney(argv[i], "r") < 0) {
77     sprintf(errmsg, "cannot open input \"%s\"", argv[i]);
78     quiterr(errmsg);
79     }
80     if (i == argc-1 || !strcmp(argv[i+1], "-"))
81     rafp = stdout;
82     else if ((rafp = fopen(argv[i+1], "w")) == NULL) {
83     sprintf(errmsg, "cannot open output \"%s\"",
84     argv[i+1]);
85     quiterr(errmsg);
86     }
87     /* put header */
88 greg 2.6 newheader("RADIANCE", stdout);
89 greg 1.3 printargs(i, argv, rafp);
90 greg 1.7 fputformat(COLRFMT, rafp);
91 greg 1.1 putc('\n', rafp);
92 greg 1.9 fprtresolu(xmax, ymax, rafp);
93 greg 1.1 /* convert file */
94     bn2ra();
95     } else {
96     if (i != argc-2)
97     goto userr;
98     if (!strcmp(argv[i], "-"))
99     rafp = stdin;
100     else if ((rafp = fopen(argv[i], "r")) == NULL) {
101     sprintf(errmsg, "cannot open input \"%s\"",
102     argv[i]);
103     quiterr(errmsg);
104     }
105     /* get header */
106 greg 1.7 if (checkheader(rafp, COLRFMT, NULL) < 0 ||
107 greg 1.9 fgetresolu(&xmax, &ymax, rafp) < 0)
108 greg 1.1 quiterr("bad RADIANCE format");
109     if (openbarney(argv[i+1], "w") < 0) {
110     sprintf(errmsg, "cannot open output \"%s\"", argv[i+1]);
111     quiterr(errmsg);
112     }
113     /* convert file */
114     ra2bn();
115     }
116     quiterr(NULL);
117     userr:
118 greg 1.8 fprintf(stderr, "Usage: %s [-g gamma][-e +/-stops] {input|-} output\n",
119 greg 1.1 progname);
120 greg 1.8 fprintf(stderr, " or: %s -r [-g gamma][-e +/-stops] input [output|-]\n",
121     progname);
122 greg 1.1 exit(1);
123     }
124    
125    
126     quiterr(err) /* print message and exit */
127     char *err;
128     {
129     if (err != NULL) {
130     fprintf(stderr, "%s: %s\n", progname, err);
131     exit(1);
132     }
133     exit(0);
134     }
135    
136    
137     openbarney(fname, mode) /* open barneyscan files */
138     char *fname;
139     char *mode;
140     {
141     static char suffix[3][4] = {"red", "grn", "blu"};
142     int i;
143     char file[128];
144    
145     for (i = 0; i < 3; i++) {
146     sprintf(file, "%s.%s", fname, suffix[i]);
147     if ((bnfp[i] = fopen(file, mode)) == NULL)
148     return(-1);
149     }
150     if (mode[0] == 'r') { /* get header */
151     xmax = getint(bnfp[0]);
152     ymax = getint(bnfp[0]);
153     for (i = 1; i < 3; i++)
154     if (getint(bnfp[i]) != xmax || getint(bnfp[i]) != ymax)
155     return(-1);
156     } else { /* put header */
157     for (i = 0; i < 3; i++) {
158     putint(xmax, bnfp[i]);
159     putint(ymax, bnfp[i]);
160     }
161     }
162     return(0);
163     }
164    
165    
166     int
167     getint(fp) /* get short int from barneyscan file */
168     register FILE *fp;
169     {
170     register short val;
171    
172     val = getc(fp);
173     val |= getc(fp) << 8;
174    
175     return(val);
176     }
177    
178    
179     putint(val, fp) /* put short int to barneyscan file */
180     register int val;
181     register FILE *fp;
182     {
183     putc(val&0xff, fp);
184     putc((val >> 8)&0xff, fp);
185     }
186    
187    
188     ra2bn() /* convert radiance to barneyscan */
189     {
190 greg 1.6 register int i;
191     register COLR *inl;
192 greg 1.1 int j;
193    
194 greg 1.6 if ((inl = (COLR *)malloc(xmax*sizeof(COLR))) == NULL)
195 greg 1.1 quiterr("out of memory");
196     for (j = 0; j < ymax; j++) {
197 greg 1.6 if (freadcolrs(inl, xmax, rafp) < 0)
198 greg 1.1 quiterr("error reading RADIANCE file");
199 greg 1.8 if (bradj)
200     shiftcolrs(inl, xmax, bradj);
201 greg 1.6 colrs_gambs(inl, xmax);
202     for (i = 0; i < xmax; i++) {
203     putc(inl[i][RED], bnfp[0]);
204     putc(inl[i][GRN], bnfp[1]);
205     putc(inl[i][BLU], bnfp[2]);
206     }
207     if (ferror(bnfp[0]) || ferror(bnfp[1]) || ferror(bnfp[2]))
208     quiterr("error writing Barney files");
209 greg 1.1 }
210 greg 2.7 free((void *)inl);
211 greg 1.1 }
212    
213    
214     bn2ra() /* convert barneyscan to radiance */
215     {
216 greg 1.6 register int i;
217     register COLR *outline;
218 greg 1.1 int j;
219    
220 greg 1.6 if ((outline = (COLR *)malloc(xmax*sizeof(COLR))) == NULL)
221 greg 1.1 quiterr("out of memory");
222     for (j = 0; j < ymax; j++) {
223 greg 1.6 for (i = 0; i < xmax; i++) {
224     outline[i][RED] = getc(bnfp[0]);
225     outline[i][GRN] = getc(bnfp[1]);
226     outline[i][BLU] = getc(bnfp[2]);
227     }
228     if (feof(bnfp[0]) || feof(bnfp[1]) || feof(bnfp[2]))
229     quiterr("error reading barney file");
230     gambs_colrs(outline, xmax);
231 greg 1.8 if (bradj)
232     shiftcolrs(outline, xmax, bradj);
233 greg 1.6 if (fwritecolrs(outline, xmax, rafp) < 0)
234 greg 1.1 quiterr("error writing RADIANCE file");
235     }
236 greg 2.7 free((void *)outline);
237 greg 1.1 }