ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/ra_pict.c
Revision: 2.7
Committed: Mon Jul 19 12:04:35 1993 UTC (30 years, 9 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.6: +5 -5 lines
Log Message:
changed gamma to gamcor

File Contents

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