ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/ra_pict.c
Revision: 2.2
Committed: Thu Nov 21 11:34:10 1991 UTC (32 years, 5 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.1: +158 -63 lines
Log Message:
bug fixes from second version

File Contents

# User Rev Content
1 greg 1.1 #ifndef lint
2 greg 2.2 static char SCCSid[] = "$SunId$ Auckuni";
3 greg 1.1 #endif
4 greg 1.4
5 greg 1.1 /*
6 greg 2.2 * rad2pict -
7     * Convert an Radiance image to APPLE pict format.
8     *
9     * Orginally Iris to PICT by Paul Haeberli - 1990
10     * Hacked into Rad to PICT by Russell Street 1990
11     *
12     * History:
13     * V 1 -- Does basic conversion
14     * V 1.1 (2/11/91) -- Added options for Gamma
15     * -- verbose option
16     * -- man page
17     * -- better about allocating buffers
18     * V 1.2 (19/11/91) -- Revised to handle opening "The Radiance Way"
19     * -- Added exposure level adjustment
20     */
21    
22 greg 1.1 #include <stdio.h>
23 greg 2.2 #include <stdlib.h>
24    
25 greg 1.1 #include "pict.h"
26     #include "color.h"
27 greg 1.4 #include "resolu.h"
28 greg 1.3
29 greg 2.2 int outbytes; /* This had better be 32 bits! */
30     char *progname;
31     int verbose = 0;
32     float gamma = 2.0;
33     int bradj = 0;
34 greg 1.1
35 greg 2.2 /* First some utility routines */
36 greg 1.1
37     putrect(xorg,yorg,xsize,ysize)
38     int xorg, yorg, xsize, ysize;
39     {
40     putashort(yorg);
41     putashort(xorg);
42     putashort(ysize);
43     putashort(xsize);
44     }
45    
46     putfprect(xorg,yorg,xsize,ysize)
47     int xorg, yorg, xsize, ysize;
48     {
49     putalong(yorg<<16);
50     putalong(xorg<<16);
51     putalong(ysize<<16);
52     putalong(xsize<<16);
53     }
54    
55     putalong(l)
56     long l;
57     {
58     putbyte((l>>24)&0xff);
59     putbyte((l>>16)&0xff);
60     putbyte((l>>8)&0xff);
61     putbyte((l>>0)&0xff);
62     }
63    
64     putashort(s)
65     short s;
66     {
67     putbyte((s>>8)&0xff);
68     putbyte((s>>0)&0xff);
69     }
70    
71     putbyte(b)
72 greg 2.2 int b;
73 greg 1.1 {
74 greg 2.2 if (putc(b,stdout) == EOF && ferror(stdout)) {
75     fprintf(stderr,"%s: error on write\n", progname);
76 greg 1.1 exit(1);
77     }
78     outbytes++;
79     }
80    
81     putbytes(buf,n)
82     unsigned char *buf;
83     int n;
84     {
85 greg 2.2 if(!fwrite(buf,n,1,stdout)) {
86     fprintf(stderr,"%s: error on write\n", progname);
87 greg 1.1 exit(1);
88     }
89     outbytes+=n;
90     }
91    
92     main(argc,argv)
93     int argc;
94     char **argv;
95     {
96     int xsize, ysize;
97     int i, picsize;
98     int ssizepos, lsizepos;
99    
100 greg 2.2 progname = argv[0];
101 greg 1.1
102 greg 2.2 for (i = 1; i < argc ; i++)
103     if (argv[i][0] == '-')
104     switch (argv[i][1]) {
105     case 'g': gamma = atof(argv[++i]);
106     break;
107 greg 1.1
108 greg 2.2 case 'e': if (argv[i+1][0] != '+' && argv[i+1][0] != '-')
109     usage();
110     else
111     bradj = atoi(argv[++i]);
112     break;
113    
114     case 'v': ;
115     verbose = 1;
116     break;
117    
118     case 'r': fprintf(stderr, "Sorry. Get a Macintosh :-)\n");
119     exit(1);
120    
121     case '-': i++;
122     goto outofparse;
123     break; /* NOTREACHED */
124    
125     otherwise: usage();
126     break;
127     }
128     else
129     break;
130    
131     outofparse:
132    
133     if (i < argc - 2)
134     usage();
135    
136     if (i <= argc - 1 && freopen(argv[i], "r", stdin) == NULL) {
137     fprintf(stderr, "%s: can not open input \"%s\"\n",
138     progname, argv[i]);
139 greg 1.1 exit(1);
140     }
141    
142 greg 2.2 if (i <= argc - 2 && freopen(argv[i+1], "w", stdout) == NULL) {
143     fprintf(stderr, "%s: can not open input \"%s\"\n",
144     progname, argv[i+1]);
145 greg 1.1 exit(1);
146     }
147 greg 2.2
148     #ifdef DEBUG
149     fprintf(stderr, "Input file: %s\n", i <= argc - 1 ? argv[i] : "stdin");
150     fprintf(stderr, "Outut file: %s\n", i <= argc - 2 ? argv[i+1] : "stdout" );
151     fprintf(stderr, "Gamma: %f\n", gamma);
152     fprintf(stderr, "Brightness adjust: %d\n", bradj);
153     fprintf(stderr, "Verbose: %s\n", verbose ? "on" : "off");
154     #endif
155 greg 1.1
156 greg 2.2
157     /* OK. Now we read the size of the Radiance picture */
158     if (checkheader(stdin, COLRFMT, NULL) < 0 ||
159     fgetresolu(&xsize, &ysize, stdin) < 0 /* != (YMAJOR|YDECR) */ ) {
160     fprintf(stderr, "%s: not a radiance picture\n", progname);
161 greg 1.1 exit(1);
162 greg 2.2 }
163 greg 1.1
164 greg 2.2 /* Set the gamma correction */
165 greg 1.1
166 greg 2.2 setcolrgam(gamma);
167    
168 greg 1.1 for(i=0; i<HEADER_SIZE; i++)
169     putbyte(0);
170 greg 2.2
171 greg 1.1 ssizepos = outbytes;
172     putashort(0); /* low 16 bits of file size less HEADER_SIZE */
173     putrect(0,0,xsize,ysize); /* bounding box of picture */
174     putashort(PICT_picVersion);
175     putashort(0x02ff); /* version 2 pict */
176     putashort(PICT_reservedHeader); /* reserved header opcode */
177    
178     lsizepos = outbytes;
179     putalong(0); /* full size of the file */
180     putfprect(0,0,xsize,ysize); /* fixed point bounding box of picture */
181     putalong(0); /* reserved */
182    
183     putashort(PICT_clipRgn); /* the clip region */
184     putashort(10);
185     putrect(0,0,xsize,ysize);
186    
187 greg 2.2 if (verbose)
188     fprintf(stderr, "%s: The picture is %d by %d, with a gamma of %f\n",
189     progname, xsize, ysize, gamma);
190 greg 1.1
191 greg 2.2
192     putpict(xsize, ysize); /* Here is where all the work is done */
193    
194 greg 1.1 putashort(PICT_EndOfPicture); /* end of pict */
195    
196     picsize = outbytes-HEADER_SIZE;
197 greg 2.2 fseek(stdout,ssizepos,0);
198 greg 1.1 putashort(picsize&0xffff);
199 greg 2.2 fseek(stdout,lsizepos,0);
200 greg 1.1 putalong(picsize);
201    
202 greg 2.2 fclose(stdout);
203     fclose(stdin);
204    
205 greg 1.1 exit(0);
206 greg 2.2 return 0; /* lint fodder */
207 greg 1.1 }
208    
209     putpict(xsize, ysize)
210     int xsize;
211     int ysize;
212     {
213 greg 2.2 int y;
214     int nbytes, rowbytes;
215     char *cbuf, *pbuf;
216 greg 1.1
217 greg 2.2 cbuf = malloc(4 * xsize);
218    
219     if (cbuf == NULL) {
220     fprintf(stderr, "%s: not enough memory\n", progname);
221     exit(1);
222     }
223    
224     pbuf = malloc(4 * xsize);
225    
226     if (pbuf == NULL) {
227     fprintf(stderr, "%s: not enough memory\n", progname);
228     exit(1);
229     }
230    
231 greg 1.1 putashort(PICT_Pack32BitsRect); /* 32 bit rgb */
232     rowbytes = 4*xsize;
233     putalong(0x000000ff); /* base address */
234    
235 greg 2.2
236 greg 1.1 if(rowbytes&1)
237     rowbytes++;
238     putashort(rowbytes|0x8000); /* rowbytes */
239     putrect(0,0,xsize,ysize); /* bounds */
240     putashort(0); /* version */
241    
242     putashort(4); /* packtype */
243     putalong(0); /* packsize */
244     putalong(72<<16); /* hres */
245     putalong(72<<16); /* vres */
246    
247     putashort(16); /* pixeltype */
248     putashort(32); /* pixelsize */
249     putashort(3); /* cmpcount */
250    
251 greg 2.2
252 greg 1.1 putashort(8); /* cmpsize */
253     putalong(0); /* planebytes */
254     putalong(0); /* pmtable */
255     putalong(0); /* pmreserved */
256    
257 greg 2.2
258 greg 1.1 putrect(0,0,xsize,ysize); /* scr rect */
259     putrect(0,0,xsize,ysize); /* dest rect */
260    
261 greg 2.2
262 greg 1.1 putashort(0x40); /* transfer mode */
263 greg 2.2
264 greg 1.1 for(y=0; y<ysize; y++) {
265 greg 2.2 getrow(stdin, cbuf, xsize);
266 greg 1.1
267     nbytes = packbits(cbuf,pbuf,24*xsize);
268     if(rowbytes>250)
269     putashort(nbytes);
270     else
271     putbyte(nbytes);
272     putbytes(pbuf,nbytes);
273 greg 2.2 }
274 greg 1.1
275     if(outbytes&1)
276     putbyte(0);
277 greg 2.2
278     free(cbuf);
279     free(pbuf);
280 greg 1.1 }
281    
282 greg 2.2 int getrow(in, cbuf, xsize)
283     FILE *in;
284     char *cbuf;
285     int xsize;
286 greg 1.1 {
287 greg 2.2 extern char *tempbuffer(); /* defined in color.c */
288     COLR *scanin = NULL;
289 greg 1.1 int x;
290    
291 greg 2.2 if ((scanin = (COLR *)tempbuffer(xsize*sizeof(COLR))) == NULL) {
292     fprintf(stderr, "%s: not enough memory\n", progname);
293     exit(1);
294 greg 1.1 }
295    
296     if (freadcolrs(scanin, xsize, in) < 0) {
297 greg 2.2 fprintf(stderr, "%s: read error\n", progname);
298 greg 1.1 exit(1);
299 greg 2.2 }
300 greg 1.1
301 greg 2.2 if (bradj) /* Adjust exposure level */
302     shiftcolrs(scanin, xsize, bradj);
303    
304    
305     colrs_gambs(scanin, xsize); /* Gamma correct it */
306 greg 1.1
307     for (x = 0; x < xsize; x++) {
308 greg 2.2 cbuf[x] = scanin[x][RED];
309     cbuf[xsize + x] = scanin[x][GRN];
310     cbuf[2*xsize + x] = scanin[x][BLU];
311     }
312    
313 greg 1.1 }
314    
315 greg 2.2
316 greg 1.1 packbits(ibits,pbits,nbits)
317     unsigned char *ibits, *pbits;
318     int nbits;
319     {
320 greg 2.2 int bytes; /* UNUSED */
321 greg 1.1 unsigned char *sptr;
322     unsigned char *ibitsend;
323     unsigned char *optr = pbits;
324     int nbytes, todo, cc, count;
325    
326     nbytes = ((nbits-1)/8)+1;
327     ibitsend = ibits+nbytes;
328 greg 2.2 while(ibits<ibitsend) {
329 greg 1.1 sptr = ibits;
330     ibits += 2;
331     while((ibits<ibitsend)&&((ibits[-2]!=ibits[-1])||(ibits[-1]!=ibits[0])))
332     ibits++;
333     if(ibits != ibitsend) {
334     ibits -= 2;
335     }
336     count = ibits-sptr;
337     while(count) {
338     todo = count>127 ? 127:count;
339     count -= todo;
340     *optr++ = todo-1;
341     while(todo--)
342     *optr++ = *sptr++;
343     }
344     if(ibits == ibitsend)
345     break;
346     sptr = ibits;
347     cc = *ibits++;
348     while( (ibits<ibitsend) && (*ibits == cc) )
349     ibits++;
350     count = ibits-sptr;
351     while(count) {
352     todo = count>128 ? 128:count;
353     count -= todo;
354     *optr++ = 257-todo;
355     *optr++ = cc;
356     }
357     }
358     return optr-pbits;
359 greg 2.2 }
360    
361     usage()
362     {
363     fprintf(stderr, "Usage: %s [-v] [-g gamma] [infile [outfile]]\n",
364     progname);
365     exit(2);
366 greg 1.1 }