ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/ra_pixar.c
Revision: 1.4
Committed: Mon Nov 11 14:01:21 1991 UTC (32 years, 5 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.3: +5 -12 lines
Log Message:
Improved handling of scanline ordering

File Contents

# User Rev Content
1 greg 1.4 /* Copyright (c) 1991 Regents of the University of California */
2    
3 greg 1.3 #ifndef lint
4     static char SCCSid[] = "$SunId$ LBL";
5     #endif
6    
7 greg 1.1 /* ra_pixar.c */
8     /*
9     * convert from RADIANCE image file to PIXAR image file. (or vice versa)
10     *
11     * David G. Jones July 1989
12     */
13     /* External functions called:
14     *
15     * header.c:
16     * getheader(fp,func);
17     * printargs(argc,argv,fp);
18     * color.c:
19     * freadscan(scanline,len,fp);
20     * fwritescan(scanline,len,fp);
21     */
22    
23     #include <stdio.h>
24     #include <math.h>
25    
26     /* PIXAR */
27     #include <picio.h>
28     #include <pixeldef.h>
29     #include <chad.h>
30    
31     /* RADIANCE (color.h conflicts with PIXAR includes) ugh!! */
32     #ifdef undef
33     #include "color.h"
34     #else
35     #define RED 0
36     #define GRN 1
37     #define BLU 2
38     #define EXP 3
39     #define colval(col,pri) ((col)[pri])
40     #define setcolor(col,r,g,b) \
41     ((col)[RED]=(r),(col)[GRN]=(g),(col)[BLU]=(b))
42     typedef float COLOR[3]; /* red, green, blue */
43     #endif
44 greg 1.4 #include "resolu.h"
45 greg 1.1
46    
47     char *ProgramName;
48     int global_argc;
49     char **global_argv;
50    
51     /* RADIANCE global variables */
52     FILE *radiance_fp = NULL;
53     double radiance_pixel();
54    
55     usage()
56     {
57     fprintf(stderr,"usage: %s radiance.pic pixar.pix\n",ProgramName);
58     fprintf(stderr," or %s -r pixar.pix radiance.pic\n",ProgramName);
59     exit(1);
60     }
61    
62    
63     main(argc,argv)
64     int argc;
65     char *argv[];
66     {
67     char *infile;
68     char *outfile;
69     int i;
70     int reverse = 0;
71    
72     ProgramName=argv[0];
73     if (argc < 3)
74     usage();
75     infile=argv[argc-2];
76     outfile=argv[argc-1];
77     for (i=1; i < argc-2 ; ++i)
78     if (!strcmp(argv[i],"-r"))
79     reverse=1;
80     else
81     usage();
82    
83     if (reverse)
84     {
85     global_argc=argc;
86     global_argv=argv;
87     pix_ra(infile,outfile);
88     }
89     else
90     ra_pix(infile,outfile);
91     }
92    
93     ra_pix(infile,outfile)
94     char *infile;
95     char *outfile;
96     {
97     /* PIXAR variables */
98     RGBAPixelType *pixar_scanline;
99     PFILE *out;
100     /* RADIANCE variables */
101     COLOR *radiance_scanline;
102     /* regular variables */
103     int width;
104     int height;
105     register int x;
106     register int y;
107    
108     /* get width, height from radiance file */
109     radiance_getsize(infile,&width,&height);
110     radiance_scanline=(COLOR *)malloc(width*sizeof(COLOR));
111     pixar_scanline=(RGBAPixelType *)malloc(width*sizeof(RGBAPixelType));
112     if (!radiance_scanline || !pixar_scanline)
113     {
114     fprintf(stderr,"not enough memory?\n");
115     perror("malloc");
116     exit(1);
117     }
118     bzero(pixar_scanline,width*sizeof(RGBAPixelType));
119    
120     PicSetForce(1);
121     PicSetPsize(width,height);
122     PicSetTsize(width,height);
123     PicSetPformat(PF_RGB);
124     PicSetPstorage(PS_12DUMP);
125     PicSetPmatting(PM_NONE);
126     PicSetOffset(0,0);
127     PicSetLabel("converted from RADIANCE format by ra_pixar");
128     if (!(out=PicCreat(outfile,0666)))
129     {
130     fprintf(stderr,"can't open PIXAR image file `%s'\n",outfile);
131     perror("open");
132     exit(1);
133     }
134    
135     picPreEncodeScanline(out,0);
136     for (y=0; y < height ; ++y)
137     {
138     radiance_readscanline(radiance_scanline,width);
139     for (x=0; x < width ; ++x)
140     {
141     SetRGBColor(&pixar_scanline[x],
142     DBL2PXL(radiance_pixel(radiance_scanline[x],RED)),
143     DBL2PXL(radiance_pixel(radiance_scanline[x],GRN)),
144     DBL2PXL(radiance_pixel(radiance_scanline[x],BLU)));
145     }
146     picEncodeScanline(out,pixar_scanline);
147     }
148     picPostEncodeScanline(out);
149     fclose(radiance_fp);
150     PicClose(out);
151     }
152    
153    
154     radiance_getsize(filename,w,h)
155     char *filename;
156     int *w;
157     int *h;
158     {
159     if (!(radiance_fp=fopen(filename,"r")))
160     {
161     fprintf(stderr,"can't open RADIANCE image file `%s'\n",filename);
162     perror("open");
163     exit(1);
164     }
165     getheader(radiance_fp,NULL);
166 greg 1.4 if (fgetresolu(w, h, radiance_fp) < 0)
167 greg 1.1 {
168     fprintf(stderr,"bad RADIANCE format\n");
169     exit(1);
170     }
171     }
172    
173    
174     radiance_readscanline(buf,x)
175     COLOR *buf;
176     int x;
177     {
178     if (freadscan(buf,x,radiance_fp) < 0)
179     {
180     fprintf(stderr,"read error?\n");
181     perror("fread");
182     exit(1);
183     }
184     }
185    
186    
187     double radiance_pixel(pixel,i)
188     COLOR pixel;
189     int i;
190     {
191     double value;
192    
193     value=colval(pixel,i);
194     if (value < 0.0)
195     return 0.0;
196     else if (value> 1.0)
197     return 1.0;
198     return value;
199     }
200    
201     pix_ra(infile,outfile)
202     char *infile;
203     char *outfile;
204     {
205     /* PIXAR variables */
206     RGBAPixelType *pixar_scanline;
207     PFILE *in;
208     /* RADIANCE variables */
209     COLOR *radiance_scanline;
210     FILE *out;
211     /* regular variables */
212     int width;
213     int height;
214     register int x;
215     register int y;
216    
217     if (!(in=PicOpen(infile,"r")))
218     {
219     fprintf(stderr,"can't open PIXAR image file `%s'\n",infile);
220     perror("open");
221     exit(1);
222     }
223     if (!(out=fopen(outfile,"w")))
224     {
225     fprintf(stderr,"can't open RADIANCE image file `%s'\n",outfile);
226     perror("open");
227     exit(1);
228     }
229    
230     /* get width, height from PIXAR file */
231     width=in->Pwidth;
232     height=in->Pheight;
233    
234     /* allocate scan line space */
235     radiance_scanline=(COLOR *)malloc(width*sizeof(COLOR));
236     pixar_scanline=(RGBAPixelType *)malloc(width*sizeof(RGBAPixelType));
237     if (!radiance_scanline || !pixar_scanline)
238     {
239     fprintf(stderr,"not enough memory?\n");
240     perror("malloc");
241     exit(1);
242     }
243    
244     /* write out the RADIANCE header */
245     radiance_writeheader(out,width,height);
246    
247     picPreDecodeScanline(in,0);
248     for (y=0; y < height ; ++y)
249     {
250     picDecodeScanline(in,pixar_scanline);
251     for (x=0; x < width ; ++x)
252     {
253     setcolor(radiance_scanline[x],
254     PXL2DBL(pixar_scanline[x].Red),
255     PXL2DBL(pixar_scanline[x].Green),
256     PXL2DBL(pixar_scanline[x].Blue));
257     }
258     radiance_writescanline(out,radiance_scanline,width);
259     }
260     picPostDecodeScanline(in);
261     PicClose(in);
262     fclose(out);
263     }
264    
265    
266     radiance_writeheader(fp,x,y)
267     FILE *fp;
268     int x;
269     int y;
270     {
271     printargs(global_argc,global_argv,fp);
272     fputc('\n',fp);
273 greg 1.4 fprtresolu(x, y, fp);
274 greg 1.1 fflush(fp);
275     }
276    
277    
278     radiance_writescanline(fp,buf,x)
279     FILE *fp;
280     COLOR *buf;
281     int x;
282     {
283     if (fwritescan(buf,x,fp) < 0)
284     {
285     fprintf(stderr,"write error?\n");
286     perror("fwrite");
287     exit(1);
288     }
289     }