ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/ra_pict.c
Revision: 1.3
Committed: Mon Oct 28 16:41:31 1991 UTC (32 years, 5 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.2: +2 -1 lines
Log Message:
compatibility fixes

File Contents

# User Rev Content
1 greg 1.1 #ifndef lint
2     static char SCCSid[] = "$SunId$ AU";
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     */
10     #include <stdio.h>
11     #include "pict.h"
12     #include "color.h"
13 greg 1.3
14     extern char *malloc();
15 greg 1.1
16     char cbuf[8192*5];
17     char pbuf[8192];
18     int outbytes;
19     FILE *outf, *inf;
20     char **gargv;
21    
22     putrect(xorg,yorg,xsize,ysize)
23     int xorg, yorg, xsize, ysize;
24     {
25     putashort(yorg);
26     putashort(xorg);
27     putashort(ysize);
28     putashort(xsize);
29     }
30    
31     putfprect(xorg,yorg,xsize,ysize)
32     int xorg, yorg, xsize, ysize;
33     {
34     putalong(yorg<<16);
35     putalong(xorg<<16);
36     putalong(ysize<<16);
37     putalong(xsize<<16);
38     }
39    
40     putalong(l)
41     long l;
42     {
43     putbyte((l>>24)&0xff);
44     putbyte((l>>16)&0xff);
45     putbyte((l>>8)&0xff);
46     putbyte((l>>0)&0xff);
47     }
48    
49     putashort(s)
50     short s;
51     {
52     putbyte((s>>8)&0xff);
53     putbyte((s>>0)&0xff);
54     }
55    
56     putbyte(b)
57     unsigned char b;
58     {
59     char c[1];
60    
61     c[0] = b;
62     if(!fwrite(c,1,1,outf)) {
63     fprintf(stderr,"%s: error on write\n", gargv[0]);
64     exit(1);
65     }
66     outbytes++;
67     }
68    
69     putbytes(buf,n)
70     unsigned char *buf;
71     int n;
72     {
73     if(!fwrite(buf,n,1,outf)) {
74     fprintf(stderr,"topict: error on write\n");
75     exit(1);
76     }
77     outbytes+=n;
78     }
79    
80     main(argc,argv)
81     int argc;
82     char **argv;
83     {
84     int xsize, ysize;
85     int i, picsize;
86     int ssizepos, lsizepos;
87    
88     gargv = argv;
89    
90     if( argc<3 ) {
91     fprintf(stderr, "Usage: %s inimage out.pict\n", gargv[0]);
92     exit(1);
93     }
94    
95     if( (inf=fopen(gargv[1],"rb")) == NULL ) {
96     fprintf(stderr,"%s: can't open input file %s\n",gargv[0], gargv[1]);
97     exit(1);
98     }
99    
100     if( (outf=fopen(gargv[2],"wb")) == NULL ) {
101     fprintf(stderr,"%s: can't open output file %s\n", gargv[0], gargv[1]);
102     exit(1);
103     }
104    
105     if (checkheader(inf, COLRFMT, NULL) < 0 ||
106     fgetresolu(&xsize, &ysize, inf) != (YMAJOR|YDECR)) {
107     fprintf(stderr, "%s: not a radiance picture\n", argv[1]);
108     exit(1);
109     }
110    
111     setcolrgam(2.0);
112    
113     for(i=0; i<HEADER_SIZE; i++)
114     putbyte(0);
115     ssizepos = outbytes;
116     putashort(0); /* low 16 bits of file size less HEADER_SIZE */
117     putrect(0,0,xsize,ysize); /* bounding box of picture */
118     putashort(PICT_picVersion);
119     putashort(0x02ff); /* version 2 pict */
120     putashort(PICT_reservedHeader); /* reserved header opcode */
121    
122     lsizepos = outbytes;
123     putalong(0); /* full size of the file */
124     putfprect(0,0,xsize,ysize); /* fixed point bounding box of picture */
125     putalong(0); /* reserved */
126    
127     putashort(PICT_clipRgn); /* the clip region */
128     putashort(10);
129     putrect(0,0,xsize,ysize);
130    
131     putpict(xsize, ysize);
132    
133     putashort(PICT_EndOfPicture); /* end of pict */
134    
135     picsize = outbytes-HEADER_SIZE;
136     fseek(outf,ssizepos,0);
137     putashort(picsize&0xffff);
138     fseek(outf,lsizepos,0);
139     putalong(picsize);
140    
141     fclose(outf);
142     exit(0);
143     }
144    
145     putpict(xsize, ysize)
146     int xsize;
147     int ysize;
148     {
149     int y;
150     int nbytes, rowbytes;
151    
152     putashort(PICT_Pack32BitsRect); /* 32 bit rgb */
153     rowbytes = 4*xsize;
154     putalong(0x000000ff); /* base address */
155    
156     if(rowbytes&1)
157     rowbytes++;
158     putashort(rowbytes|0x8000); /* rowbytes */
159     putrect(0,0,xsize,ysize); /* bounds */
160     putashort(0); /* version */
161    
162     putashort(4); /* packtype */
163     putalong(0); /* packsize */
164     putalong(72<<16); /* hres */
165     putalong(72<<16); /* vres */
166    
167     putashort(16); /* pixeltype */
168     putashort(32); /* pixelsize */
169     putashort(3); /* cmpcount */
170    
171     putashort(8); /* cmpsize */
172     putalong(0); /* planebytes */
173     putalong(0); /* pmtable */
174     putalong(0); /* pmreserved */
175    
176     putrect(0,0,xsize,ysize); /* scr rect */
177     putrect(0,0,xsize,ysize); /* dest rect */
178    
179     putashort(0x40); /* transfer mode */
180     for(y=0; y<ysize; y++) {
181     getrow(inf, cbuf, xsize);
182    
183     nbytes = packbits(cbuf,pbuf,24*xsize);
184     if(rowbytes>250)
185     putashort(nbytes);
186     else
187     putbyte(nbytes);
188     putbytes(pbuf,nbytes);
189     }
190    
191     if(outbytes&1)
192     putbyte(0);
193     }
194    
195 greg 1.2 int
196     getrow(in, mybuff, xsize)
197     FILE *in;
198     char *mybuff;
199     int xsize;
200 greg 1.1 {
201     COLOR color;
202     COLR *scanin = (COLR*) malloc(xsize * sizeof(COLR));
203     int x;
204    
205     if (scanin == NULL) {
206     printf("scanin null");
207     }
208    
209    
210     if (freadcolrs(scanin, xsize, in) < 0) {
211     fprintf(stderr, " read error\n");
212     exit(1);
213     }
214    
215     colrs_gambs(scanin, xsize);
216    
217     for (x = 0; x < xsize; x++) {
218     colr_color(color, scanin[x]);
219     cbuf[xsize * 0 + x] = color[RED] * 255;
220     cbuf[xsize * 1 + x] = color[GRN] * 255;
221     cbuf[xsize * 2 + x] = color[BLU] * 255;
222     }
223     free(scanin);
224     }
225    
226     packbits(ibits,pbits,nbits)
227     unsigned char *ibits, *pbits;
228     int nbits;
229     {
230     int bytes;
231     unsigned char *sptr;
232     unsigned char *ibitsend;
233     unsigned char *optr = pbits;
234     int nbytes, todo, cc, count;
235    
236     nbytes = ((nbits-1)/8)+1;
237     ibitsend = ibits+nbytes;
238     while (ibits<ibitsend) {
239     sptr = ibits;
240     ibits += 2;
241     while((ibits<ibitsend)&&((ibits[-2]!=ibits[-1])||(ibits[-1]!=ibits[0])))
242     ibits++;
243     if(ibits != ibitsend) {
244     ibits -= 2;
245     }
246     count = ibits-sptr;
247     while(count) {
248     todo = count>127 ? 127:count;
249     count -= todo;
250     *optr++ = todo-1;
251     while(todo--)
252     *optr++ = *sptr++;
253     }
254     if(ibits == ibitsend)
255     break;
256     sptr = ibits;
257     cc = *ibits++;
258     while( (ibits<ibitsend) && (*ibits == cc) )
259     ibits++;
260     count = ibits-sptr;
261     while(count) {
262     todo = count>128 ? 128:count;
263     count -= todo;
264     *optr++ = 257-todo;
265     *optr++ = cc;
266     }
267     }
268     return optr-pbits;
269     }