ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/ra_t16.c
Revision: 2.9
Committed: Tue Mar 20 18:45:04 2018 UTC (6 years, 1 month ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R2
Changes since 2.8: +2 -1 lines
Log Message:
Added missing rtio.h include to redefine getc, putc, etc.

File Contents

# User Rev Content
1 greg 1.1 #ifndef lint
2 greg 2.9 static const char RCSid[] = "$Id: ra_t16.c,v 2.8 2004/03/28 20:33:14 schorsch Exp $";
3 greg 1.1 #endif
4     /*
5     * ra_t16.c - program to convert between RADIANCE and
6     * Targa 16, 24 and 32-bit images.
7     *
8     * 11/2/88 Adapted from ra_t8.c
9     */
10    
11     #include <stdio.h>
12 schorsch 2.8 #include <string.h>
13 greg 2.6 #include <time.h>
14 greg 2.3 #include <math.h>
15    
16 schorsch 2.7 #include "platform.h"
17 greg 2.9 #include "rtio.h"
18 schorsch 2.8 #include "rtmisc.h"
19 greg 1.1 #include "color.h"
20 greg 1.15 #include "resolu.h"
21 greg 1.5 #include "random.h"
22 greg 1.1 #include "targa.h"
23    
24     #define goodpic(h) (((h)->dataType==IM_RGB || (h)->dataType==IM_CRGB) \
25     && ((h)->dataBits==16 || (h)->dataBits==24))
26    
27     #define taralloc(h) (unsigned char *)emalloc((h)->x*(h)->y*(h)->dataBits/8)
28    
29 schorsch 2.8 #define readtarga(h,d,f) ((h)->dataBits==16 ? \
30     readt16(h,(unsigned short*)d,f) : readt24(h,d,f))
31 greg 1.1
32 schorsch 2.8 #define writetarga(h,d,f) ((h)->dataBits==16 ? \
33     writet16(h,(unsigned short*)d,f) : writet24(h,d,f))
34 greg 1.1
35 greg 2.4 double gamcor = 2.2; /* gamma correction */
36 greg 1.13 int bradj = 0; /* brightness adjustment */
37 greg 1.1 char *progname;
38 schorsch 2.8 char msg[128];
39 greg 1.1
40 schorsch 2.8 static int getint2(FILE *fp);
41     static void putint2(int i, FILE *fp);
42     static void quiterr(char *err);
43     static int getthead(struct hdStruct *hp, char *ip, FILE *fp);
44     static int putthead(struct hdStruct *hp, char *ip, FILE *fp);
45     static void tg2ra(struct hdStruct *hp);
46     static void ra2tg(struct hdStruct *hp);
47     static void writet24(struct hdStruct *h, unsigned char *d, FILE *fp);
48     static void writet16(struct hdStruct *h, unsigned short *d, FILE *fp);
49     static void readt24(struct hdStruct *h, unsigned char *data, FILE *fp);
50     static void readt16(struct hdStruct *h, unsigned short *data, FILE *fp);
51 greg 1.1
52    
53 schorsch 2.8 int
54     main(int argc, char *argv[])
55 greg 1.1 {
56     struct hdStruct head;
57     int reverse = 0;
58     int i;
59 schorsch 2.7 SET_DEFAULT_BINARY();
60     SET_FILE_BINARY(stdin);
61     SET_FILE_BINARY(stdout);
62 greg 1.1 progname = argv[0];
63    
64     head.dataBits = 16;
65     for (i = 1; i < argc; i++)
66     if (argv[i][0] == '-')
67     switch (argv[i][1]) {
68     case 'g':
69 greg 2.4 gamcor = atof(argv[++i]);
70 greg 1.1 break;
71     case 'r':
72     reverse = !reverse;
73     break;
74     case '2':
75     head.dataBits = 16;
76     break;
77     case '3':
78     head.dataBits = 24;
79     break;
80 greg 1.13 case 'e':
81     if (argv[i+1][0] != '+' && argv[i+1][0] != '-')
82     goto userr;
83     bradj = atoi(argv[++i]);
84     break;
85 greg 1.1 default:
86     goto userr;
87     }
88     else
89     break;
90    
91     if (i < argc-2)
92     goto userr;
93     /* open input file */
94     if (i <= argc-1 && freopen(argv[i], "r", stdin) == NULL) {
95     sprintf(msg, "can't open input \"%s\"", argv[i]);
96     quiterr(msg);
97     }
98     /* open output file */
99     if (i == argc-2 && freopen(argv[i+1], "w", stdout) == NULL) {
100     sprintf(msg, "can't open output \"%s\"", argv[i+1]);
101     quiterr(msg);
102     }
103 greg 1.9 /* set gamma */
104 greg 2.4 setcolrgam(gamcor);
105 greg 1.1 /* convert */
106     if (reverse) {
107     /* get header */
108     if (getthead(&head, NULL, stdin) < 0)
109     quiterr("bad targa file");
110     if (!goodpic(&head))
111     quiterr("incompatible format");
112     /* put header */
113 greg 2.5 newheader("RADIANCE", stdout);
114 greg 1.7 printargs(i, argv, stdout);
115 greg 1.11 fputformat(COLRFMT, stdout);
116 greg 1.1 putchar('\n');
117 greg 1.15 fprtresolu(head.x, head.y, stdout);
118 greg 1.1 /* convert file */
119     tg2ra(&head);
120     } else {
121 greg 1.11 if (checkheader(stdin, COLRFMT, NULL) < 0 ||
122 greg 1.15 fgetresolu(&head.x, &head.y, stdin) < 0)
123 greg 1.1 quiterr("bad picture file");
124     /* assign header */
125     head.textSize = 0;
126     head.mapType = CM_NOMAP;
127     head.dataType = IM_RGB;
128     head.XOffset = 0;
129     head.YOffset = 0;
130     head.imType = 0;
131     /* write header */
132     putthead(&head, NULL, stdout);
133     /* convert file */
134     ra2tg(&head);
135     }
136     exit(0);
137     userr:
138 greg 1.13 fprintf(stderr, "Usage: %s [-2|-3|-r][-g gamma][-e +/-stops] [input [output]]\n",
139 greg 1.1 progname);
140     exit(1);
141     }
142    
143    
144 schorsch 2.8 static int
145     getint2( /* get a 2-byte positive integer */
146     register FILE *fp
147     )
148 greg 1.1 {
149     register int b1, b2;
150    
151     if ((b1 = getc(fp)) == EOF || (b2 = getc(fp)) == EOF)
152     quiterr("read error");
153    
154     return(b1 | b2<<8);
155     }
156    
157    
158 schorsch 2.8 static void
159     putint2( /* put a 2-byte positive integer */
160     register int i,
161     register FILE *fp
162     )
163 greg 1.1 {
164     putc(i&0xff, fp);
165     putc(i>>8&0xff, fp);
166     }
167    
168    
169 schorsch 2.8 static void
170     quiterr( /* print message and exit */
171     char *err
172     )
173 greg 1.1 {
174     fprintf(stderr, "%s: %s\n", progname, err);
175     exit(1);
176     }
177    
178    
179 greg 2.6 void
180 schorsch 2.8 eputs(
181     char *s
182     )
183 greg 1.1 {
184     fputs(s, stderr);
185     }
186    
187    
188 greg 2.6 void
189 schorsch 2.8 quit(
190     int code
191     )
192 greg 1.1 {
193     exit(code);
194     }
195    
196    
197 schorsch 2.8 static int
198     getthead( /* read header from input */
199     struct hdStruct *hp,
200     char *ip,
201     register FILE *fp
202     )
203 greg 1.1 {
204     int nidbytes;
205    
206     if ((nidbytes = getc(fp)) == EOF)
207     return(-1);
208     hp->mapType = getc(fp);
209     hp->dataType = getc(fp);
210     hp->mapOrig = getint2(fp);
211     hp->mapLength = getint2(fp);
212     hp->CMapBits = getc(fp);
213     hp->XOffset = getint2(fp);
214     hp->YOffset = getint2(fp);
215     hp->x = getint2(fp);
216     hp->y = getint2(fp);
217     hp->dataBits = getc(fp);
218     hp->imType = getc(fp);
219    
220     if (ip != NULL)
221     if (nidbytes)
222 greg 1.6 fread((char *)ip, nidbytes, 1, fp);
223 greg 1.1 else
224     *ip = '\0';
225     else if (nidbytes)
226     fseek(fp, (long)nidbytes, 1);
227    
228     return(feof(fp) || ferror(fp) ? -1 : 0);
229     }
230    
231    
232 schorsch 2.8 static int
233     putthead( /* write header to output */
234     struct hdStruct *hp,
235     char *ip,
236     register FILE *fp
237     )
238 greg 1.1 {
239     if (ip != NULL)
240     putc(strlen(ip), fp);
241     else
242     putc(0, fp);
243     putc(hp->mapType, fp);
244     putc(hp->dataType, fp);
245     putint2(hp->mapOrig, fp);
246     putint2(hp->mapLength, fp);
247     putc(hp->CMapBits, fp);
248     putint2(hp->XOffset, fp);
249     putint2(hp->YOffset, fp);
250     putint2(hp->x, fp);
251     putint2(hp->y, fp);
252     putc(hp->dataBits, fp);
253     putc(hp->imType, fp);
254    
255     if (ip != NULL)
256     fputs(ip, fp);
257    
258     return(ferror(fp) ? -1 : 0);
259     }
260    
261    
262 schorsch 2.8 static void
263     tg2ra( /* targa file to RADIANCE file */
264     struct hdStruct *hp
265     )
266 greg 1.1 {
267 greg 1.9 COLR *scanline;
268 greg 1.1 unsigned char *tarData;
269     register int i, j;
270     /* skip color table */
271     if (hp->mapType == CM_HASMAP)
272     fseek(stdin, (long)hp->mapLength*hp->CMapBits/8, 1);
273     /* allocate targa data */
274     tarData = taralloc(hp);
275     /* get data */
276     readtarga(hp, tarData, stdin);
277     /* allocate input scanline */
278 greg 1.9 scanline = (COLR *)emalloc(hp->x*sizeof(COLR));
279 greg 1.1 /* convert file */
280     for (i = hp->y-1; i >= 0; i--) {
281     if (hp->dataBits == 16) {
282     register unsigned short *dp;
283     dp = (unsigned short *)tarData + i*hp->x;
284     for (j = 0; j < hp->x; j++) {
285 greg 1.9 scanline[j][RED] = *dp>>7 & 0xf8;
286     scanline[j][GRN] = *dp>>2 & 0xf8;
287     scanline[j][BLU] = *dp<<3 & 0xf8;
288 greg 1.1 dp++;
289     }
290     } else { /* hp->dataBits == 24 */
291     register unsigned char *dp;
292     dp = (unsigned char *)tarData + i*3*hp->x;
293     for (j = 0; j < hp->x; j++) {
294 greg 1.9 scanline[j][RED] = dp[2];
295     scanline[j][GRN] = dp[1];
296     scanline[j][BLU] = dp[0];
297 greg 1.1 dp += 3;
298     }
299     }
300 greg 1.9 gambs_colrs(scanline, hp->x);
301 greg 1.13 if (bradj)
302     shiftcolrs(scanline, hp->x, bradj);
303 greg 1.9 if (fwritecolrs(scanline, hp->x, stdout) < 0)
304 greg 1.1 quiterr("error writing RADIANCE file");
305     }
306 greg 2.6 free((void *)scanline);
307     free((void *)tarData);
308 greg 1.1 }
309    
310    
311 schorsch 2.8 static void
312     ra2tg( /* convert radiance to targa file */
313     struct hdStruct *hp
314     )
315 greg 1.1 {
316 greg 1.3 register int i, j;
317 greg 1.1 unsigned char *tarData;
318 greg 1.9 COLR *inl;
319 greg 1.1 /* allocate space for data */
320 greg 1.9 inl = (COLR *)emalloc(hp->x*sizeof(COLR));
321 greg 1.1 tarData = taralloc(hp);
322     /* convert file */
323     for (j = hp->y-1; j >= 0; j--) {
324 greg 1.9 if (freadcolrs(inl, hp->x, stdin) < 0)
325 greg 1.1 quiterr("error reading RADIANCE file");
326 greg 1.13 if (bradj)
327     shiftcolrs(inl, hp->x, bradj);
328 greg 1.9 colrs_gambs(inl, hp->x);
329 greg 1.1 if (hp->dataBits == 16) {
330     register unsigned short *dp;
331 greg 1.12 register int v;
332 greg 1.1 dp = (unsigned short *)tarData + j*hp->x;
333     for (i = 0; i < hp->x; i++) {
334 greg 1.12 v = inl[i][RED] + (random()&7);
335     if (v > 255) v = 255;
336     *dp = (v&0xf8)<<7;
337     v = inl[i][GRN] + (random()&7);
338     if (v > 255) v = 255;
339     *dp |= (v&0xf8)<<2;
340     v = inl[i][BLU] + (random()&7);
341     if (v > 255) v = 255;
342     *dp++ |= v>>3;
343 greg 1.1 }
344     } else { /* hp->dataBits == 24 */
345     register unsigned char *dp;
346     dp = (unsigned char *)tarData + j*3*hp->x;
347     for (i = 0; i < hp->x; i++) {
348 greg 1.10 *dp++ = inl[i][BLU];
349     *dp++ = inl[i][GRN];
350 greg 1.9 *dp++ = inl[i][RED];
351 greg 1.1 }
352     }
353     }
354     /* write out targa data */
355     writetarga(hp, tarData, stdout);
356    
357 greg 2.6 free((void *)inl);
358     free((void *)tarData);
359 greg 1.1 }
360    
361    
362 schorsch 2.8 static void
363     writet24( /* write out 24-bit targa data */
364     struct hdStruct *h,
365     unsigned char *d,
366     FILE *fp
367     )
368 greg 1.1 {
369     if (h->dataType == IM_RGB) { /* uncompressed */
370 greg 1.6 if (fwrite((char *)d, 3*h->x, h->y, fp) != h->y)
371 greg 1.1 quiterr("error writing targa file");
372     return;
373     }
374     quiterr("unsupported output type");
375     }
376    
377    
378 schorsch 2.8 static void
379     writet16( /* write out 16-bit targa data */
380     struct hdStruct *h,
381     register unsigned short *d,
382     FILE *fp
383     )
384 greg 1.1 {
385     register int cnt;
386    
387     if (h->dataType == IM_RGB) { /* uncompressed */
388     for (cnt = h->x*h->y; cnt-- > 0; )
389     putint2(*d++, fp);
390     if (ferror(fp))
391     quiterr("error writing targa file");
392     return;
393     }
394     quiterr("unsupported output type");
395     }
396    
397    
398 schorsch 2.8 static void
399     readt24( /* read in 24-bit targa data */
400     register struct hdStruct *h,
401     unsigned char *data,
402     FILE *fp
403     )
404 greg 1.1 {
405     register int cnt, c;
406     register unsigned char *dp;
407     int r, g, b;
408    
409     if (h->dataType == IM_RGB) { /* uncompressed */
410 greg 1.6 if (fread((char *)data, 3*h->x, h->y, fp) != h->y)
411 greg 1.1 goto readerr;
412     return;
413     }
414     for (dp = data; dp < data+3*h->x*h->y; ) {
415     if ((c = getc(fp)) == EOF)
416     goto readerr;
417     cnt = (c & 0x7f) + 1;
418     if (c & 0x80) { /* repeated pixel */
419 greg 1.2 b = getc(fp); g = getc(fp);
420     if ((r = getc(fp)) == EOF)
421 greg 1.1 goto readerr;
422     while (cnt--) {
423 greg 1.2 *dp++ = b;
424     *dp++ = g;
425 greg 1.1 *dp++ = r;
426     }
427     } else /* non-repeating pixels */
428     while (cnt--) {
429     *dp++ = getc(fp); *dp++ = getc(fp);
430 greg 1.2 if ((r = getc(fp)) == EOF)
431 greg 1.1 goto readerr;
432 greg 1.2 *dp++ = r;
433 greg 1.1 }
434     }
435     return;
436     readerr:
437     quiterr("error reading targa file");
438     }
439    
440    
441 schorsch 2.8 static void
442     readt16( /* read in 16-bit targa data */
443     register struct hdStruct *h,
444     unsigned short *data,
445     FILE *fp
446     )
447 greg 1.1 {
448     register int cnt, c;
449     register unsigned short *dp;
450    
451     if (h->dataType == IM_RGB) { /* uncompressed */
452     dp = data;
453     for (cnt = h->x*h->y; cnt-- > 0; )
454     *dp++ = getint2(fp);
455     return;
456     }
457     for (dp = data; dp < data+h->x*h->y; ) {
458     if ((c = getc(fp)) == EOF)
459     goto readerr;
460     cnt = (c & 0x7f) + 1;
461     if (c & 0x80) { /* repeated pixel */
462     c = getint2(fp);
463     while (cnt--)
464     *dp++ = c;
465     } else /* non-repeating pixels */
466     while (cnt--)
467     *dp++ = getint2(fp);
468     }
469     return;
470     readerr:
471     quiterr("error reading targa file");
472     }