ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/ra_bn.c
Revision: 2.8
Committed: Thu Jun 5 19:29:34 2003 UTC (20 years, 10 months ago) by schorsch
Content type: text/plain
Branch: MAIN
Changes since 2.7: +5 -14 lines
Log Message:
Macros for setting binary file mode. Replacing MSDOS by _WIN32.

File Contents

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