ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/ra_bn.c
Revision: 1.2
Committed: Mon Sep 25 13:22:06 1989 UTC (34 years, 7 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.1: +2 -2 lines
Log Message:
added calls to get/put picture resolution (bug fix)

File Contents

# Content
1 /* Copyright (c) 1986 Regents of the University of California */
2
3 #ifndef lint
4 static char SCCSid[] = "$SunId$ LBL";
5 #endif
6
7 /*
8 * ra_bn.c - program to convert between RADIANCE and barneyscan picture format.
9 *
10 * 10/12/88
11 */
12
13 #include <stdio.h>
14
15 #include "color.h"
16
17 extern double atof(), pow();
18
19 double gamma = 2.0; /* gamma correction */
20
21 char *progname;
22
23 char errmsg[128];
24
25 FILE *rafp, *bnfp[3];
26
27 int xmax, ymax;
28
29
30 main(argc, argv)
31 int argc;
32 char *argv[];
33 {
34 int reverse = 0;
35 int i;
36
37 progname = argv[0];
38
39 for (i = 1; i < argc; i++)
40 if (argv[i][0] == '-')
41 switch (argv[i][1]) {
42 case 'g':
43 gamma = atof(argv[++i]);
44 break;
45 case 'r':
46 reverse = !reverse;
47 break;
48 default:
49 goto userr;
50 }
51 else
52 break;
53
54 if (reverse) {
55 if (i > argc-1 || i < argc-2)
56 goto userr;
57 if (openbarney(argv[i], "r") < 0) {
58 sprintf(errmsg, "cannot open input \"%s\"", argv[i]);
59 quiterr(errmsg);
60 }
61 if (i == argc-1 || !strcmp(argv[i+1], "-"))
62 rafp = stdout;
63 else if ((rafp = fopen(argv[i+1], "w")) == NULL) {
64 sprintf(errmsg, "cannot open output \"%s\"",
65 argv[i+1]);
66 quiterr(errmsg);
67 }
68 /* put header */
69 printargs(argc, argv, rafp);
70 putc('\n', rafp);
71 fputresolu(YMAJOR|YDECR, xmax, ymax, rafp);
72 /* convert file */
73 bn2ra();
74 } else {
75 if (i != argc-2)
76 goto userr;
77 if (!strcmp(argv[i], "-"))
78 rafp = stdin;
79 else if ((rafp = fopen(argv[i], "r")) == NULL) {
80 sprintf(errmsg, "cannot open input \"%s\"",
81 argv[i]);
82 quiterr(errmsg);
83 }
84 /* get header */
85 getheader(rafp, NULL);
86 if (fgetresolu(&xmax, &ymax, rafp) != (YMAJOR|YDECR))
87 quiterr("bad RADIANCE format");
88 if (openbarney(argv[i+1], "w") < 0) {
89 sprintf(errmsg, "cannot open output \"%s\"", argv[i+1]);
90 quiterr(errmsg);
91 }
92 /* convert file */
93 ra2bn();
94 }
95 quiterr(NULL);
96 userr:
97 fprintf(stderr, "Usage: %s {input|-} output\n", progname);
98 fprintf(stderr, " or: %s -r [-g gamma] input [output|-]\n",
99 progname);
100 exit(1);
101 }
102
103
104 quiterr(err) /* print message and exit */
105 char *err;
106 {
107 if (err != NULL) {
108 fprintf(stderr, "%s: %s\n", progname, err);
109 exit(1);
110 }
111 exit(0);
112 }
113
114
115 openbarney(fname, mode) /* open barneyscan files */
116 char *fname;
117 char *mode;
118 {
119 static char suffix[3][4] = {"red", "grn", "blu"};
120 int i;
121 char file[128];
122
123 for (i = 0; i < 3; i++) {
124 sprintf(file, "%s.%s", fname, suffix[i]);
125 if ((bnfp[i] = fopen(file, mode)) == NULL)
126 return(-1);
127 }
128 if (mode[0] == 'r') { /* get header */
129 xmax = getint(bnfp[0]);
130 ymax = getint(bnfp[0]);
131 for (i = 1; i < 3; i++)
132 if (getint(bnfp[i]) != xmax || getint(bnfp[i]) != ymax)
133 return(-1);
134 } else { /* put header */
135 for (i = 0; i < 3; i++) {
136 putint(xmax, bnfp[i]);
137 putint(ymax, bnfp[i]);
138 }
139 }
140 return(0);
141 }
142
143
144 int
145 getint(fp) /* get short int from barneyscan file */
146 register FILE *fp;
147 {
148 register short val;
149
150 val = getc(fp);
151 val |= getc(fp) << 8;
152
153 return(val);
154 }
155
156
157 putint(val, fp) /* put short int to barneyscan file */
158 register int val;
159 register FILE *fp;
160 {
161 putc(val&0xff, fp);
162 putc((val >> 8)&0xff, fp);
163 }
164
165
166 ra2bn() /* convert radiance to barneyscan */
167 {
168 unsigned char gmap[1024];
169 register int i,k,c;
170 register COLOR *inline;
171 int j;
172
173 if ((inline = (COLOR *)malloc(xmax*sizeof(COLOR))) == NULL)
174 quiterr("out of memory");
175 for (i = 0; i < 1024; i++)
176 gmap[i] = 256.*pow((i+.5)/1024., 1./gamma);
177 for (j = 0; j < ymax; j++) {
178 if (freadscan(inline, xmax, rafp) < 0)
179 quiterr("error reading RADIANCE file");
180 for (i = 0; i < xmax; i++)
181 for (k = 0; k < 3; k++) {
182 c = 1024.*colval(inline[i],k);
183 if (c >= 1024)
184 c = 1023;
185 putc(gmap[c], bnfp[k]);
186 }
187 }
188 free((char *)inline);
189 }
190
191
192 bn2ra() /* convert barneyscan to radiance */
193 {
194 float gmap[256];
195 register int i,k,c;
196 register COLOR *outline;
197 int j;
198
199 if ((outline = (COLOR *)malloc(xmax*sizeof(COLOR))) == NULL)
200 quiterr("out of memory");
201 for (i = 0; i < 256; i++)
202 gmap[i] = pow((i+.5)/256., gamma);
203 for (j = 0; j < ymax; j++) {
204 for (i = 0; i < xmax; i++)
205 for (k = 0; k < 3; k++)
206 if ((c = getc(bnfp[k])) == EOF)
207 quiterr("error reading barney file");
208 else
209 colval(outline[i],k) = gmap[c];
210 if (fwritescan(outline, xmax, rafp) < 0)
211 quiterr("error writing RADIANCE file");
212 }
213 free((char *)outline);
214 }