home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 8
/
CDASC08.ISO
/
NEWS
/
RADIANCE
/
SRC
/
PX
/
RA_PIXAR.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-10-07
|
6KB
|
290 lines
/* Copyright (c) 1991 Regents of the University of California */
#ifndef lint
static char SCCSid[] = "@(#)ra_pixar.c 2.1 11/12/91 LBL";
#endif
/* ra_pixar.c */
/*
* convert from RADIANCE image file to PIXAR image file. (or vice versa)
*
* David G. Jones July 1989
*/
/* External functions called:
*
* header.c:
* getheader(fp,func);
* printargs(argc,argv,fp);
* color.c:
* freadscan(scanline,len,fp);
* fwritescan(scanline,len,fp);
*/
#include <stdio.h>
#include <math.h>
/* PIXAR */
#include <picio.h>
#include <pixeldef.h>
#include <chad.h>
/* RADIANCE (color.h conflicts with PIXAR includes) ugh!! */
#ifdef undef
#include "color.h"
#else
#define RED 0
#define GRN 1
#define BLU 2
#define EXP 3
#define colval(col,pri) ((col)[pri])
#define setcolor(col,r,g,b) \
((col)[RED]=(r),(col)[GRN]=(g),(col)[BLU]=(b))
typedef float COLOR[3]; /* red, green, blue */
#endif
#include "resolu.h"
char *ProgramName;
int global_argc;
char **global_argv;
/* RADIANCE global variables */
FILE *radiance_fp = NULL;
double radiance_pixel();
usage()
{
fprintf(stderr,"usage: %s radiance.pic pixar.pix\n",ProgramName);
fprintf(stderr," or %s -r pixar.pix radiance.pic\n",ProgramName);
exit(1);
}
main(argc,argv)
int argc;
char *argv[];
{
char *infile;
char *outfile;
int i;
int reverse = 0;
ProgramName=argv[0];
if (argc < 3)
usage();
infile=argv[argc-2];
outfile=argv[argc-1];
for (i=1; i < argc-2 ; ++i)
if (!strcmp(argv[i],"-r"))
reverse=1;
else
usage();
if (reverse)
{
global_argc=argc;
global_argv=argv;
pix_ra(infile,outfile);
}
else
ra_pix(infile,outfile);
}
ra_pix(infile,outfile)
char *infile;
char *outfile;
{
/* PIXAR variables */
RGBAPixelType *pixar_scanline;
PFILE *out;
/* RADIANCE variables */
COLOR *radiance_scanline;
/* regular variables */
int width;
int height;
register int x;
register int y;
/* get width, height from radiance file */
radiance_getsize(infile,&width,&height);
radiance_scanline=(COLOR *)malloc(width*sizeof(COLOR));
pixar_scanline=(RGBAPixelType *)malloc(width*sizeof(RGBAPixelType));
if (!radiance_scanline || !pixar_scanline)
{
fprintf(stderr,"not enough memory?\n");
perror("malloc");
exit(1);
}
bzero(pixar_scanline,width*sizeof(RGBAPixelType));
PicSetForce(1);
PicSetPsize(width,height);
PicSetTsize(width,height);
PicSetPformat(PF_RGB);
PicSetPstorage(PS_12DUMP);
PicSetPmatting(PM_NONE);
PicSetOffset(0,0);
PicSetLabel("converted from RADIANCE format by ra_pixar");
if (!(out=PicCreat(outfile,0666)))
{
fprintf(stderr,"can't open PIXAR image file `%s'\n",outfile);
perror("open");
exit(1);
}
picPreEncodeScanline(out,0);
for (y=0; y < height ; ++y)
{
radiance_readscanline(radiance_scanline,width);
for (x=0; x < width ; ++x)
{
SetRGBColor(&pixar_scanline[x],
DBL2PXL(radiance_pixel(radiance_scanline[x],RED)),
DBL2PXL(radiance_pixel(radiance_scanline[x],GRN)),
DBL2PXL(radiance_pixel(radiance_scanline[x],BLU)));
}
picEncodeScanline(out,pixar_scanline);
}
picPostEncodeScanline(out);
fclose(radiance_fp);
PicClose(out);
}
radiance_getsize(filename,w,h)
char *filename;
int *w;
int *h;
{
if (!(radiance_fp=fopen(filename,"r")))
{
fprintf(stderr,"can't open RADIANCE image file `%s'\n",filename);
perror("open");
exit(1);
}
getheader(radiance_fp,NULL);
if (fgetresolu(w, h, radiance_fp) < 0)
{
fprintf(stderr,"bad RADIANCE format\n");
exit(1);
}
}
radiance_readscanline(buf,x)
COLOR *buf;
int x;
{
if (freadscan(buf,x,radiance_fp) < 0)
{
fprintf(stderr,"read error?\n");
perror("fread");
exit(1);
}
}
double radiance_pixel(pixel,i)
COLOR pixel;
int i;
{
double value;
value=colval(pixel,i);
if (value < 0.0)
return 0.0;
else if (value> 1.0)
return 1.0;
return value;
}
pix_ra(infile,outfile)
char *infile;
char *outfile;
{
/* PIXAR variables */
RGBAPixelType *pixar_scanline;
PFILE *in;
/* RADIANCE variables */
COLOR *radiance_scanline;
FILE *out;
/* regular variables */
int width;
int height;
register int x;
register int y;
if (!(in=PicOpen(infile,"r")))
{
fprintf(stderr,"can't open PIXAR image file `%s'\n",infile);
perror("open");
exit(1);
}
if (!(out=fopen(outfile,"w")))
{
fprintf(stderr,"can't open RADIANCE image file `%s'\n",outfile);
perror("open");
exit(1);
}
/* get width, height from PIXAR file */
width=in->Pwidth;
height=in->Pheight;
/* allocate scan line space */
radiance_scanline=(COLOR *)malloc(width*sizeof(COLOR));
pixar_scanline=(RGBAPixelType *)malloc(width*sizeof(RGBAPixelType));
if (!radiance_scanline || !pixar_scanline)
{
fprintf(stderr,"not enough memory?\n");
perror("malloc");
exit(1);
}
/* write out the RADIANCE header */
radiance_writeheader(out,width,height);
picPreDecodeScanline(in,0);
for (y=0; y < height ; ++y)
{
picDecodeScanline(in,pixar_scanline);
for (x=0; x < width ; ++x)
{
setcolor(radiance_scanline[x],
PXL2DBL(pixar_scanline[x].Red),
PXL2DBL(pixar_scanline[x].Green),
PXL2DBL(pixar_scanline[x].Blue));
}
radiance_writescanline(out,radiance_scanline,width);
}
picPostDecodeScanline(in);
PicClose(in);
fclose(out);
}
radiance_writeheader(fp,x,y)
FILE *fp;
int x;
int y;
{
printargs(global_argc,global_argv,fp);
fputc('\n',fp);
fprtresolu(x, y, fp);
fflush(fp);
}
radiance_writescanline(fp,buf,x)
FILE *fp;
COLOR *buf;
int x;
{
if (fwritescan(buf,x,fp) < 0)
{
fprintf(stderr,"write error?\n");
perror("fwrite");
exit(1);
}
}