paul@sgi.SGI.COM (Paul Haeberli) (01/30/88)
/*
* fromtarga -
* Convert from a type 2 ( RGB ) targa image into an IRIS
* image. Most targa images are displayed directly on monitors
* with no gamma correction. The typical gamma is about 2.2, so
* you gotta gammawarp the output image by 2.2 to get it into a
* linear intensity space.
*
* Paul Haeberli - 1988
*/
#include "image.h"
#include "stdio.h"
main(argc,argv)
int argc;
char **argv;
{
if(argc<3) {
fprintf(stderr,"usage fromtarga targa.img image.rgb\n");
exit(1);
}
fromtarga(argv[1],argv[2]);
}
typedef struct TARGA {
unsigned char numid;
unsigned char maptyp;
unsigned char imgtyp;
short maporig;
short mapsize;
unsigned char mapbits;
short xorig;
short yorig;
short xsize;
short ysize;
unsigned char pixsize;
unsigned char imgdes;
} TARGA;
#define MAXIWIDTH 8192
short rbuf[MAXIWIDTH];
short gbuf[MAXIWIDTH];
short bbuf[MAXIWIDTH];
fromtarga(tname,iname)
char *tname, *iname;
{
int xsize, ysize, zsize;
int y;
FILE *inf;
IMAGE *image;
TARGA t;
inf = fopen(tname,"r");
if(!inf) {
fprintf(stderr,"totarga: can't open input file %s\n",tname);
exit(1);
}
t.numid = inchar(inf);
t.maptyp = inchar(inf);
t.imgtyp = inchar(inf);
if(t.imgtyp != 2) {
fprintf(stderr,"totarga: this only works on type 2 images %s\n",tname);
exit(1);
}
t.maporig = inshort(inf);
t.mapsize = inshort(inf);
t.mapbits = inchar(inf);
t.xorig = inshort(inf);
t.yorig = inshort(inf);
t.xsize = inshort(inf);
t.ysize = inshort(inf);
t.pixsize = inchar(inf);
t.imgdes = inshort(inf);
xsize = t.xsize;
ysize = t.ysize;
for(y=0; y<t.numid; y++)
inchar(inf);
for(y=0; y<t.mapsize; y++) {
if(t.mapbits == 24) {
inchar(inf);
inchar(inf);
inchar(inf);
} else if(t.mapbits == 32) {
inchar(inf);
inchar(inf);
inchar(inf);
inchar(inf);
}
}
image = iopen(iname,"w",RLE(1),3,xsize,ysize,3);
if(!image) {
fprintf(stderr,"totarga: can't open input file %s\n",iname);
exit(1);
}
for(y=0; y<ysize; y++) {
gettargarow(inf,rbuf,gbuf,bbuf,xsize);
putrow(image,rbuf,y,0);
putrow(image,gbuf,y,1);
putrow(image,bbuf,y,2);
}
fclose(inf);
iclose(image);
}
inchar(inf)
FILE *inf;
{
return fgetc(inf);
}
inshort(inf)
FILE *inf;
{
short s;
int onechar;
onechar = fgetc(inf)&0xff;
s = onechar;
onechar = fgetc(inf)&0xff;
s |= (onechar&0xff)<<8;
return s;
}
gettargarow(inf,r,g,b,n,pixsize)
register FILE *inf;
register short *r, *g, *b;
register int n, pixsize;
{
while(n--) {
*g = fgetc(inf);
*r = fgetc(inf);
fgetc(inf);
*b = fgetc(inf);
*r &= 0xff;
*g &= 0xff;
*b &= 0xff;
b++;
g++;
r++;
}
}
printheader(t)
TARGA *t;
{
fprintf(stderr,"numid %d\n",t->numid);
fprintf(stderr,"maptype %d\n",t->maptyp);
fprintf(stderr,"imgtyp %d\n",t->imgtyp);
fprintf(stderr,"maporig %d mapsize %d \n",t->maporig,t->mapsize);
fprintf(stderr,"mapbits %d\n",t->mapbits);
fprintf(stderr,"xorig yorig %d %d\n",t->xorig,t->xorig);
fprintf(stderr,"xsize ysize %d %d \n",t->xsize,t->ysize);
fprintf(stderr,"pixsize %d\n",t->pixsize);
fprintf(stderr,"imgdes %d\n",t->imgdes);
}