ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/ra_t16.c
Revision: 2.10
Committed: Sat Dec 28 18:05:14 2019 UTC (4 years, 4 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R4, rad5R3, HEAD
Changes since 2.9: +1 -4 lines
Log Message:
Removed redundant include files

File Contents

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