ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/ra_bmp.c
Revision: 2.1
Committed: Fri Mar 26 03:11:50 2004 UTC (20 years, 1 month ago) by greg
Content type: text/plain
Branch: MAIN
Log Message:
Created ra_bmp program to convert between Radiance pictures and Windows BMP

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id$";
3 #endif
4 /*
5 * program to convert between RADIANCE and Windows BMP file
6 */
7
8 #include <stdio.h>
9 #include "platform.h"
10 #include "color.h"
11 #include "resolu.h"
12 #include "bmpfile.h"
13
14 int bradj = 0; /* brightness adjustment */
15
16 double gamcor = 2.2; /* gamma correction value */
17
18 char *progname;
19
20 void quiterr(const char *);
21 void rad2bmp(FILE *rfp, BMPWriter *bwr, int inv, int gry);
22 void bmp2rad(BMPReader *brd, FILE *rfp, int inv);
23
24
25 int
26 main(int argc, char *argv[])
27 {
28 char *inpfile=NULL, *outfile=NULL;
29 int gryflag = 0;
30 int reverse = 0;
31 RESOLU rs;
32 int i;
33
34 progname = argv[0];
35
36 for (i = 1; i < argc; i++)
37 if (argv[i][0] == '-')
38 switch (argv[i][1]) {
39 case 'b':
40 gryflag = 1;
41 break;
42 case 'g':
43 gamcor = atof(argv[++i]);
44 break;
45 case 'e':
46 if (argv[i+1][0] != '+' && argv[i+1][0] != '-')
47 goto userr;
48 bradj = atoi(argv[++i]);
49 break;
50 case 'r':
51 reverse = !reverse;
52 break;
53 case '\0':
54 break;
55 default:
56 goto userr;
57 }
58 else
59 break;
60
61 if (i < argc-2)
62 goto userr;
63
64 SET_FILE_BINARY(stdin);
65 SET_FILE_BINARY(stdout);
66 SET_DEFAULT_BINARY();
67
68 if (i <= argc-1 && strcmp(argv[i], "-"))
69 inpfile = argv[i];
70
71 if (i == argc-2 && strcmp(argv[i+1], "-"))
72 outfile = argv[i+1];
73
74 setcolrgam(gamcor); /* set up conversion */
75
76 if (reverse) {
77 BMPReader *rdr;
78 /* open BMP file or stream */
79 if (inpfile != NULL)
80 rdr = BMPopenInputFile(inpfile);
81 else
82 rdr = BMPopenInputStream(stdin);
83
84 if (rdr == NULL) {
85 fprintf(stderr, "%s: cannot open or recognize BMP\n",
86 inpfile != NULL ? inpfile : "<stdin>");
87 exit(1);
88 }
89 /* open Radiance output */
90 if (outfile != NULL && freopen(outfile, "w", stdout) == NULL) {
91 fprintf(stderr, "%s: cannot open for output\n",
92 outfile);
93 exit(1);
94 }
95 /* put Radiance header */
96 newheader("RADIANCE", stdout);
97 printargs(i, argv, stdout);
98 fputformat(COLRFMT, stdout);
99 putchar('\n');
100 rs.xr = rdr->hdr->width;
101 rs.yr = rdr->hdr->height;
102 rs.rt = YMAJOR;
103 if (rdr->hdr->yIsDown || inpfile != NULL)
104 rs.rt |= YDECR;
105 fputsresolu(&rs, stdout);
106 /* convert file */
107 bmp2rad(rdr, stdout, !rdr->hdr->yIsDown && inpfile!=NULL);
108 /* flush output */
109 BMPcloseInput(rdr); /* COMMENT OUT LATER */
110 if (fflush(stdout) < 0)
111 quiterr("error writing Radiance output");
112 } else {
113 BMPHeader *hdr;
114 BMPWriter *wtr;
115 /* open Radiance input */
116 if (inpfile != NULL && freopen(inpfile, "r", stdin) == NULL) {
117 fprintf(stderr, "%s: cannot open input file\n",
118 inpfile);
119 exit(1);
120 }
121 /* get header info. */
122 if (checkheader(stdin, COLRFMT, NULL) < 0 ||
123 !fgetsresolu(&rs, stdin))
124 quiterr("bad Radiance picture format");
125 /* initialize BMP header */
126 if (gryflag)
127 hdr = BMPmappedHeader(numscans(&rs),
128 scanlen(&rs), 0, 256);
129 else
130 hdr = BMPtruecolorHeader(numscans(&rs),
131 scanlen(&rs), 0);
132 if (hdr == NULL)
133 quiterr("cannot initialize BMP header");
134 hdr->yIsDown = (rs.rt & YDECR) && outfile == NULL;
135 /* open BMP output */
136 if (outfile != NULL)
137 wtr = BMPopenOutputFile(outfile, hdr);
138 else
139 wtr = BMPopenOutputStream(stdout, hdr);
140 /* convert file */
141 rad2bmp(stdin, wtr, !hdr->yIsDown && (rs.rt&YDECR), gryflag);
142 /* flush output */
143 if (fflush((FILE *)wtr->c_data) < 0)
144 quiterr("error writing BMP output");
145 BMPcloseOutput(wtr); /* COMMENT OUT LATER */
146 }
147 exit(0); /* success */
148 userr:
149 fprintf(stderr,
150 "Usage: %s [-r][-g gamma][-e +/-stops] [input [output]]\n",
151 progname);
152 exit(1);
153 return(1); /* to keep compiler happy */
154 }
155
156 /* print message and exit */
157 void
158 quiterr(const char *err)
159 {
160 if (err != NULL) {
161 fprintf(stderr, "%s: %s\n", progname, err);
162 exit(1);
163 }
164 exit(0);
165 }
166
167 /* convert Radiance picture to BMP */
168 void
169 rad2bmp(FILE *rfp, BMPWriter *bwr, int inv, int gry)
170 {
171 COLR *scanin;
172 int y, yend, ystp;
173 int x;
174 /* allocate scanline */
175 scanin = (COLR *)malloc(bwr->hdr->width*sizeof(COLR));
176 if (scanin == NULL)
177 quiterr("out of memory in rad2bmp");
178 /* convert image */
179 if (inv) {
180 y = bwr->hdr->height - 1;
181 ystp = -1; yend = -1;
182 } else {
183 y = 0;
184 ystp = 1; yend = bwr->hdr->height;
185 }
186 /* convert each scanline */
187 for ( ; y != yend; y += ystp) {
188 if (freadcolrs(scanin, bwr->hdr->width, rfp) < 0)
189 quiterr("error reading Radiance picture");
190 if (bradj)
191 shiftcolrs(scanin, bwr->hdr->width, bradj);
192 for (x = gry ? bwr->hdr->width : 0; x--; )
193 scanin[x][GRN] = normbright(scanin[x]);
194 colrs_gambs(scanin, bwr->hdr->width);
195 if (gry)
196 for (x = bwr->hdr->width; x--; )
197 bwr->scanline[x] = scanin[x][GRN];
198 else
199 for (x = bwr->hdr->width; x--; ) {
200 bwr->scanline[3*x] = scanin[x][BLU];
201 bwr->scanline[3*x+1] = scanin[x][GRN];
202 bwr->scanline[3*x+2] = scanin[x][RED];
203 }
204 bwr->yscan = y;
205 x = BMPwriteScanline(bwr);
206 if (x != BIR_OK)
207 quiterr(BMPerrorMessage(x));
208 }
209 /* free scanline */
210 free((void *)scanin);
211 }
212
213 /* convert BMP file to Radiance */
214 void
215 bmp2rad(BMPReader *brd, FILE *rfp, int inv)
216 {
217 COLR *scanout;
218 int y, yend, ystp;
219 int x;
220 /* allocate scanline */
221 scanout = (COLR *)malloc(brd->hdr->width*sizeof(COLR));
222 if (scanout == NULL)
223 quiterr("out of memory in bmp2rad");
224 /* convert image */
225 if (inv) {
226 y = brd->hdr->height - 1;
227 ystp = -1; yend = -1;
228 } else {
229 y = 0;
230 ystp = 1; yend = brd->hdr->height;
231 }
232 /* convert each scanline */
233 for ( ; y != yend; y += ystp) {
234 x = BMPseekScanline(y, brd);
235 if (x != BIR_OK)
236 quiterr(BMPerrorMessage(x));
237 for (x = brd->hdr->width; x--; ) {
238 RGBquad rgbq = BMPdecodePixel(x, brd);
239 scanout[x][RED] = rgbq.r;
240 scanout[x][GRN] = rgbq.g;
241 scanout[x][BLU] = rgbq.b;
242 }
243 gambs_colrs(scanout, brd->hdr->width);
244 if (bradj)
245 shiftcolrs(scanout, brd->hdr->width, bradj);
246 if (fwritecolrs(scanout, brd->hdr->width, rfp) < 0)
247 quiterr("error writing Radiance picture");
248 }
249 /* clean up */
250 free((void *)scanout);
251 }