ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/ra_pict.c
(Generate patch)

Comparing ray/src/px/ra_pict.c (file contents):
Revision 1.1 by greg, Wed Oct 23 09:26:35 1991 UTC vs.
Revision 2.11 by greg, Tue Mar 20 18:45:04 2018 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines