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

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: ra_bn.c,v 2.7 2003/02/22 02:07:27 greg Exp $";
3 #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 #include <time.h>
12 #include <math.h>
13
14 #include "platform.h"
15 #include "color.h"
16 #include "resolu.h"
17
18 double gamcor = 2.0; /* gamma correction */
19
20 int bradj = 0; /* brightness adjustment */
21
22 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 SET_DEFAULT_BINARY();
38 SET_FILE_BINARY(stdin);
39 SET_FILE_BINARY(stdout);
40 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 gamcor = atof(argv[++i]);
47 break;
48 case 'r':
49 reverse = !reverse;
50 break;
51 case 'e':
52 if (argv[i+1][0] != '+' && argv[i+1][0] != '-')
53 goto userr;
54 bradj = atoi(argv[++i]);
55 break;
56 default:
57 goto userr;
58 }
59 else
60 break;
61 /* set gamma correction */
62 setcolrgam(gamcor);
63
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 newheader("RADIANCE", stdout);
80 printargs(i, argv, rafp);
81 fputformat(COLRFMT, rafp);
82 putc('\n', rafp);
83 fprtresolu(xmax, ymax, rafp);
84 /* 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 if (checkheader(rafp, COLRFMT, NULL) < 0 ||
98 fgetresolu(&xmax, &ymax, rafp) < 0)
99 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 fprintf(stderr, "Usage: %s [-g gamma][-e +/-stops] {input|-} output\n",
110 progname);
111 fprintf(stderr, " or: %s -r [-g gamma][-e +/-stops] input [output|-]\n",
112 progname);
113 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 register int i;
182 register COLR *inl;
183 int j;
184
185 if ((inl = (COLR *)malloc(xmax*sizeof(COLR))) == NULL)
186 quiterr("out of memory");
187 for (j = 0; j < ymax; j++) {
188 if (freadcolrs(inl, xmax, rafp) < 0)
189 quiterr("error reading RADIANCE file");
190 if (bradj)
191 shiftcolrs(inl, xmax, bradj);
192 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 }
201 free((void *)inl);
202 }
203
204
205 bn2ra() /* convert barneyscan to radiance */
206 {
207 register int i;
208 register COLR *outline;
209 int j;
210
211 if ((outline = (COLR *)malloc(xmax*sizeof(COLR))) == NULL)
212 quiterr("out of memory");
213 for (j = 0; j < ymax; j++) {
214 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 if (bradj)
223 shiftcolrs(outline, xmax, bradj);
224 if (fwritecolrs(outline, xmax, rafp) < 0)
225 quiterr("error writing RADIANCE file");
226 }
227 free((void *)outline);
228 }