--- ray/src/px/ra_t16.c 1990/01/18 23:58:21 1.6 +++ ray/src/px/ra_t16.c 2004/03/28 20:33:14 2.8 @@ -1,9 +1,6 @@ -/* Copyright (c) 1986 Regents of the University of California */ - #ifndef lint -static char SCCSid[] = "$SunId$ LBL"; +static const char RCSid[] = "$Id: ra_t16.c,v 2.8 2004/03/28 20:33:14 schorsch Exp $"; #endif - /* * ra_t16.c - program to convert between RADIANCE and * Targa 16, 24 and 32-bit images. @@ -12,11 +9,15 @@ static char SCCSid[] = "$SunId$ LBL"; */ #include +#include +#include +#include +#include "platform.h" +#include "rtmisc.h" #include "color.h" - +#include "resolu.h" #include "random.h" - #include "targa.h" #define goodpic(h) (((h)->dataType==IM_RGB || (h)->dataType==IM_CRGB) \ @@ -24,31 +25,39 @@ static char SCCSid[] = "$SunId$ LBL"; #define taralloc(h) (unsigned char *)emalloc((h)->x*(h)->y*(h)->dataBits/8) -#define readtarga(h,d,f) ((h)->dataBits==16 ? readt16(h,d,f) : \ - readt24(h,d,f)) +#define readtarga(h,d,f) ((h)->dataBits==16 ? \ + readt16(h,(unsigned short*)d,f) : readt24(h,d,f)) -#define writetarga(h,d,f) ((h)->dataBits==16 ? writet16(h,d,f) : \ - writet24(h,d,f)) +#define writetarga(h,d,f) ((h)->dataBits==16 ? \ + writet16(h,(unsigned short*)d,f) : writet24(h,d,f)) -extern char *ecalloc(), *emalloc(); - -extern double atof(), pow(); - -double gamma = 2.0; /* gamma correction */ - +double gamcor = 2.2; /* gamma correction */ +int bradj = 0; /* brightness adjustment */ char *progname; - char msg[128]; +static int getint2(FILE *fp); +static void putint2(int i, FILE *fp); +static void quiterr(char *err); +static int getthead(struct hdStruct *hp, char *ip, FILE *fp); +static int putthead(struct hdStruct *hp, char *ip, FILE *fp); +static void tg2ra(struct hdStruct *hp); +static void ra2tg(struct hdStruct *hp); +static void writet24(struct hdStruct *h, unsigned char *d, FILE *fp); +static void writet16(struct hdStruct *h, unsigned short *d, FILE *fp); +static void readt24(struct hdStruct *h, unsigned char *data, FILE *fp); +static void readt16(struct hdStruct *h, unsigned short *data, FILE *fp); -main(argc, argv) -int argc; -char *argv[]; + +int +main(int argc, char *argv[]) { struct hdStruct head; int reverse = 0; int i; - + SET_DEFAULT_BINARY(); + SET_FILE_BINARY(stdin); + SET_FILE_BINARY(stdout); progname = argv[0]; head.dataBits = 16; @@ -56,7 +65,7 @@ char *argv[]; if (argv[i][0] == '-') switch (argv[i][1]) { case 'g': - gamma = atof(argv[++i]); + gamcor = atof(argv[++i]); break; case 'r': reverse = !reverse; @@ -67,6 +76,11 @@ char *argv[]; case '3': head.dataBits = 24; break; + case 'e': + if (argv[i+1][0] != '+' && argv[i+1][0] != '-') + goto userr; + bradj = atoi(argv[++i]); + break; default: goto userr; } @@ -85,6 +99,8 @@ char *argv[]; sprintf(msg, "can't open output \"%s\"", argv[i+1]); quiterr(msg); } + /* set gamma */ + setcolrgam(gamcor); /* convert */ if (reverse) { /* get header */ @@ -93,14 +109,16 @@ char *argv[]; if (!goodpic(&head)) quiterr("incompatible format"); /* put header */ - printargs(argc, argv, stdout); + newheader("RADIANCE", stdout); + printargs(i, argv, stdout); + fputformat(COLRFMT, stdout); putchar('\n'); - fputresolu(YMAJOR|YDECR, head.x, head.y, stdout); + fprtresolu(head.x, head.y, stdout); /* convert file */ tg2ra(&head); } else { - getheader(stdin, NULL); - if (fgetresolu(&head.x, &head.y, stdin) != (YMAJOR|YDECR)) + if (checkheader(stdin, COLRFMT, NULL) < 0 || + fgetresolu(&head.x, &head.y, stdin) < 0) quiterr("bad picture file"); /* assign header */ head.textSize = 0; @@ -116,15 +134,16 @@ char *argv[]; } exit(0); userr: - fprintf(stderr, "Usage: %s [-2|-3|-r][-g gamma] [input [output]]\n", + fprintf(stderr, "Usage: %s [-2|-3|-r][-g gamma][-e +/-stops] [input [output]]\n", progname); exit(1); } -int -getint2(fp) /* get a 2-byte positive integer */ -register FILE *fp; +static int +getint2( /* get a 2-byte positive integer */ + register FILE *fp +) { register int b1, b2; @@ -135,41 +154,51 @@ register FILE *fp; } -putint2(i, fp) /* put a 2-byte positive integer */ -register int i; -register FILE *fp; +static void +putint2( /* put a 2-byte positive integer */ + register int i, + register FILE *fp +) { putc(i&0xff, fp); putc(i>>8&0xff, fp); } -quiterr(err) /* print message and exit */ -char *err; +static void +quiterr( /* print message and exit */ + char *err +) { fprintf(stderr, "%s: %s\n", progname, err); exit(1); } -eputs(s) -char *s; +void +eputs( + char *s +) { fputs(s, stderr); } -quit(code) -int code; +void +quit( + int code +) { exit(code); } -getthead(hp, ip, fp) /* read header from input */ -struct hdStruct *hp; -char *ip; -register FILE *fp; +static int +getthead( /* read header from input */ + struct hdStruct *hp, + char *ip, + register FILE *fp +) { int nidbytes; @@ -199,10 +228,12 @@ register FILE *fp; } -putthead(hp, ip, fp) /* write header to output */ -struct hdStruct *hp; -char *ip; -register FILE *fp; +static int +putthead( /* write header to output */ + struct hdStruct *hp, + char *ip, + register FILE *fp +) { if (ip != NULL) putc(strlen(ip), fp); @@ -227,16 +258,14 @@ register FILE *fp; } -tg2ra(hp) /* targa file to RADIANCE file */ -struct hdStruct *hp; +static void +tg2ra( /* targa file to RADIANCE file */ + struct hdStruct *hp +) { - float gmap[256]; - COLOR *scanline; + COLR *scanline; unsigned char *tarData; register int i, j; - /* set up gamma correction */ - for (i = 0; i < 256; i++) - gmap[i] = pow((i+.5)/256., gamma); /* skip color table */ if (hp->mapType == CM_HASMAP) fseek(stdin, (long)hp->mapLength*hp->CMapBits/8, 1); @@ -245,90 +274,96 @@ struct hdStruct *hp; /* get data */ readtarga(hp, tarData, stdin); /* allocate input scanline */ - scanline = (COLOR *)emalloc(hp->x*sizeof(COLOR)); + scanline = (COLR *)emalloc(hp->x*sizeof(COLR)); /* convert file */ for (i = hp->y-1; i >= 0; i--) { if (hp->dataBits == 16) { register unsigned short *dp; dp = (unsigned short *)tarData + i*hp->x; for (j = 0; j < hp->x; j++) { - setcolor(scanline[j], gmap[*dp>>7 & 0xf8], - gmap[*dp>>2 & 0xf8], - gmap[*dp<<3 & 0xf8]); + scanline[j][RED] = *dp>>7 & 0xf8; + scanline[j][GRN] = *dp>>2 & 0xf8; + scanline[j][BLU] = *dp<<3 & 0xf8; dp++; } } else { /* hp->dataBits == 24 */ register unsigned char *dp; dp = (unsigned char *)tarData + i*3*hp->x; for (j = 0; j < hp->x; j++) { - setcolor(scanline[j], gmap[dp[2]], - gmap[dp[1]], - gmap[dp[0]]); + scanline[j][RED] = dp[2]; + scanline[j][GRN] = dp[1]; + scanline[j][BLU] = dp[0]; dp += 3; } } - if (fwritescan(scanline, hp->x, stdout) < 0) + gambs_colrs(scanline, hp->x); + if (bradj) + shiftcolrs(scanline, hp->x, bradj); + if (fwritecolrs(scanline, hp->x, stdout) < 0) quiterr("error writing RADIANCE file"); } - free((char *)scanline); - free((char *)tarData); + free((void *)scanline); + free((void *)tarData); } -ra2tg(hp) /* convert radiance to targa file */ -struct hdStruct *hp; +static void +ra2tg( /* convert radiance to targa file */ + struct hdStruct *hp +) { -#define map(v) (v >= 1.0 ? 1023 : (int)(v*1023.+.5)) - unsigned char gmap[1024]; register int i, j; unsigned char *tarData; - COLOR *inline; - /* set up gamma correction */ - for (i = 0; i < 1024; i++) { - j = 256.*pow((i+.5)/1024., 1./gamma); - gmap[i] = hp->dataBits == 16 && j > 248 ? 248 : j; - } + COLR *inl; /* allocate space for data */ - inline = (COLOR *)emalloc(hp->x*sizeof(COLOR)); + inl = (COLR *)emalloc(hp->x*sizeof(COLR)); tarData = taralloc(hp); /* convert file */ for (j = hp->y-1; j >= 0; j--) { - if (freadscan(inline, hp->x, stdin) < 0) + if (freadcolrs(inl, hp->x, stdin) < 0) quiterr("error reading RADIANCE file"); + if (bradj) + shiftcolrs(inl, hp->x, bradj); + colrs_gambs(inl, hp->x); if (hp->dataBits == 16) { register unsigned short *dp; + register int v; dp = (unsigned short *)tarData + j*hp->x; for (i = 0; i < hp->x; i++) { - *dp = ((gmap[map(colval(inline[i],RED))] - +(random()&7)) & 0xf8)<<7; - *dp |= ((gmap[map(colval(inline[i],GRN))] - +(random()&7)) & 0xf8)<<2; - *dp++ |= (gmap[map(colval(inline[i],BLU))] - +(random()&7))>>3; + v = inl[i][RED] + (random()&7); + if (v > 255) v = 255; + *dp = (v&0xf8)<<7; + v = inl[i][GRN] + (random()&7); + if (v > 255) v = 255; + *dp |= (v&0xf8)<<2; + v = inl[i][BLU] + (random()&7); + if (v > 255) v = 255; + *dp++ |= v>>3; } } else { /* hp->dataBits == 24 */ register unsigned char *dp; dp = (unsigned char *)tarData + j*3*hp->x; for (i = 0; i < hp->x; i++) { - *dp++ = gmap[map(colval(inline[i],BLU))]; - *dp++ = gmap[map(colval(inline[i],GRN))]; - *dp++ = gmap[map(colval(inline[i],RED))]; + *dp++ = inl[i][BLU]; + *dp++ = inl[i][GRN]; + *dp++ = inl[i][RED]; } } } /* write out targa data */ writetarga(hp, tarData, stdout); - free((char *)inline); - free((char *)tarData); -#undef map + free((void *)inl); + free((void *)tarData); } -writet24(h, d, fp) /* write out 24-bit targa data */ -struct hdStruct *h; -unsigned char *d; -FILE *fp; +static void +writet24( /* write out 24-bit targa data */ + struct hdStruct *h, + unsigned char *d, + FILE *fp +) { if (h->dataType == IM_RGB) { /* uncompressed */ if (fwrite((char *)d, 3*h->x, h->y, fp) != h->y) @@ -339,10 +374,12 @@ FILE *fp; } -writet16(h, d, fp) /* write out 16-bit targa data */ -struct hdStruct *h; -register unsigned short *d; -FILE *fp; +static void +writet16( /* write out 16-bit targa data */ + struct hdStruct *h, + register unsigned short *d, + FILE *fp +) { register int cnt; @@ -357,10 +394,12 @@ FILE *fp; } -readt24(h, data, fp) /* read in 24-bit targa data */ -register struct hdStruct *h; -unsigned char *data; -FILE *fp; +static void +readt24( /* read in 24-bit targa data */ + register struct hdStruct *h, + unsigned char *data, + FILE *fp +) { register int cnt, c; register unsigned char *dp; @@ -398,10 +437,12 @@ readerr: } -readt16(h, data, fp) /* read in 16-bit targa data */ -register struct hdStruct *h; -unsigned short *data; -FILE *fp; +static void +readt16( /* read in 16-bit targa data */ + register struct hdStruct *h, + unsigned short *data, + FILE *fp +) { register int cnt, c; register unsigned short *dp;