ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/ra_xyze.c
Revision: 2.9
Committed: Sun Mar 28 20:33:14 2004 UTC (20 years ago) by schorsch
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R7P2, rad3R7P1, rad3R6, rad3R6P1
Changes since 2.8: +12 -13 lines
Log Message:
Continued ANSIfication, and other fixes and clarifications.

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: ra_xyze.c,v 2.8 2004/01/02 12:47:01 schorsch Exp $";
3 #endif
4 /*
5 * Program to convert between RADIANCE RGBE and XYZE formats
6 * Added white-balance adjustment 10/01 (GW).
7 */
8
9 #include <stdio.h>
10 #include <string.h>
11 #include <math.h>
12 #include <time.h>
13
14 #include "platform.h"
15 #include "color.h"
16 #include "resolu.h"
17
18 int rgbinp = -1; /* input is RGBE? */
19 int rgbout = 0; /* output should be RGBE? */
20 RGBPRIMS inprims = STDPRIMS; /* input primaries */
21 RGBPRIMS outprims = STDPRIMS; /* output primaries */
22 double expcomp = 1.0; /* exposure compensation */
23 int doflat = -1; /* produce flat file? */
24 char *progname;
25
26 static gethfunc headline;
27 static void quiterr(char *err);
28 static void convert(void);
29
30
31
32 static int
33 headline( /* process header line */
34 char *s,
35 void *p
36 )
37 {
38 char fmt[32];
39
40 if (formatval(fmt, s)) { /* check if format string */
41 if (!strcmp(fmt,COLRFMT))
42 rgbinp = 1;
43 else if (!strcmp(fmt,CIEFMT))
44 rgbinp = 0;
45 else
46 rgbinp = -2;
47 return(0); /* don't echo */
48 }
49 if (isprims(s)) { /* get input primaries */
50 primsval(inprims, s);
51 return(0); /* don't echo */
52 }
53 /* should I grok colcorr also? */
54 return(fputs(s, stdout));
55 }
56
57
58 int
59 main(int argc, char *argv[])
60 {
61 int i;
62 SET_DEFAULT_BINARY();
63 SET_FILE_BINARY(stdin);
64 SET_FILE_BINARY(stdout);
65 progname = argv[0];
66
67 for (i = 1; i < argc; i++)
68 if (argv[i][0] == '-')
69 switch (argv[i][1]) {
70 case 'c': /* rle-compressed output */
71 doflat = 0;
72 break;
73 case 'u': /* flat output */
74 doflat = 1;
75 break;
76 case 'r': /* RGBE output */
77 rgbout = 1;
78 break;
79 case 'p': /* RGB primaries */
80 if (i+8 >= argc)
81 goto userr;
82 outprims[RED][CIEX] = atof(argv[++i]);
83 outprims[RED][CIEY] = atof(argv[++i]);
84 outprims[GRN][CIEX] = atof(argv[++i]);
85 outprims[GRN][CIEY] = atof(argv[++i]);
86 outprims[BLU][CIEX] = atof(argv[++i]);
87 outprims[BLU][CIEY] = atof(argv[++i]);
88 outprims[WHT][CIEX] = atof(argv[++i]);
89 outprims[WHT][CIEY] = atof(argv[++i]);
90 break;
91 case 'e': /* exposure compensation */
92 expcomp = atof(argv[++i]);
93 if (argv[i][0] == '+' || argv[i][0] == '-')
94 expcomp = pow(2., expcomp);
95 break;
96 default:
97 goto userr;
98 }
99 else
100 break;
101
102 if (doflat < 0)
103 doflat = !rgbout;
104 if (i < argc-2)
105 goto userr;
106 if (i <= argc-1 && freopen(argv[i], "r", stdin) == NULL) {
107 fprintf(stderr, "%s: can't open input \"%s\"\n",
108 progname, argv[i]);
109 exit(1);
110 }
111 if (i == argc-2 && freopen(argv[i+1], "w", stdout) == NULL) {
112 fprintf(stderr, "%s: can't open output \"%s\"\n",
113 progname, argv[i+1]);
114 exit(1);
115 }
116 getheader(stdin, headline, NULL);
117 if (rgbinp == -2)
118 quiterr("unrecognized input file format");
119 if (rgbinp == -1)
120 rgbinp = !rgbout;
121 printargs(argc, argv, stdout); /* add to header */
122 convert(); /* convert picture */
123 exit(0);
124 userr:
125 fprintf(stderr, "Usage: %s [-r][-e exp][-c|-u]", progname);
126 fprintf(stderr, "[-p rx ry gx gy bx by wx wy] [input [output]]\n");
127 exit(1);
128 }
129
130
131 static void
132 quiterr( /* print message and exit */
133 char *err
134 )
135 {
136 if (err != NULL) {
137 fprintf(stderr, "%s: %s\n", progname, err);
138 exit(1);
139 }
140 exit(0);
141 }
142
143
144 static void
145 convert(void) /* convert to XYZE or RGBE picture */
146 {
147 int order;
148 int xmax, ymax;
149 COLORMAT xfm;
150 register COLOR *scanin;
151 register COLR *scanout;
152 double ourexp = expcomp;
153 int y;
154 register int x;
155 /* compute transform */
156 if (rgbout) {
157 if (rgbinp) { /* RGBE -> RGBE */
158 comprgb2rgbWBmat(xfm, inprims, outprims);
159 } else { /* XYZE -> RGBE */
160 compxyz2rgbWBmat(xfm, outprims);
161 ourexp *= WHTEFFICACY;
162 }
163 } else {
164 if (rgbinp) { /* RGBE -> XYZE */
165 comprgb2xyzWBmat(xfm, inprims);
166 ourexp /= WHTEFFICACY;
167 } else { /* XYZE -> XYZE */
168 for (y = 0; y < 3; y++)
169 for (x = 0; x < 3; x++)
170 xfm[y][x] = x==y ? 1. : 0.;
171 }
172 }
173 for (y = 0; y < 3; y++)
174 for (x = 0; x < 3; x++)
175 xfm[y][x] *= expcomp;
176 /* get input resolution */
177 if ((order = fgetresolu(&xmax, &ymax, stdin)) < 0)
178 quiterr("bad picture format");
179 /* complete output header */
180 if (ourexp < 0.99 || ourexp > 1.01)
181 fputexpos(ourexp, stdout);
182 if (rgbout) {
183 fputprims(outprims, stdout);
184 fputformat(COLRFMT, stdout);
185 } else
186 fputformat(CIEFMT, stdout);
187 putc('\n', stdout);
188 fputresolu(order, xmax, ymax, stdout);
189 /* allocate scanline */
190 scanin = (COLOR *)malloc(xmax*sizeof(COLOR));
191 if (scanin == NULL)
192 quiterr("out of memory in convert");
193 scanout = doflat ? (COLR *)malloc(xmax*sizeof(COLR)) : NULL;
194 /* convert image */
195 for (y = 0; y < ymax; y++) {
196 if (freadscan(scanin, xmax, stdin) < 0)
197 quiterr("error reading input picture");
198 for (x = 0; x < xmax; x++) {
199 colortrans(scanin[x], xfm, scanin[x]);
200 if (rgbout)
201 clipgamut(scanin[x], bright(scanin[x]),
202 CGAMUT_LOWER, cblack, cwhite);
203 }
204 if (scanout != NULL) {
205 for (x = 0; x < xmax; x++)
206 setcolr(scanout[x], colval(scanin[x],RED),
207 colval(scanin[x],GRN),
208 colval(scanin[x],BLU));
209 fwrite((char *)scanout, sizeof(COLR), xmax, stdout);
210 } else
211 fwritescan(scanin, xmax, stdout);
212 if (ferror(stdout))
213 quiterr("error writing output picture");
214 }
215 /* free scanline */
216 free((void *)scanin);
217 if (scanout != NULL)
218 free((void *)scanout);
219 }