ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/ra_bn.c
Revision: 2.6
Committed: Sun Feb 27 10:17:10 1994 UTC (30 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.5: +1 -0 lines
Log Message:
Added new ID to first line of header and changed use of formatval

File Contents

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