--- ray/src/util/glareval.c 1991/07/30 12:56:36 1.20 +++ ray/src/util/glareval.c 2006/05/29 16:47:54 2.12 @@ -1,14 +1,18 @@ -/* Copyright (c) 1991 Regents of the University of California */ - #ifndef lint -static char SCCSid[] = "$SunId$ LBL"; +static const char RCSid[] = "$Id: glareval.c,v 2.12 2006/05/29 16:47:54 greg Exp $"; #endif - /* * Compute pixels for glare calculation */ +#include "copyright.h" + +#include +#include + +#include "rtprocess.h" /* Windows: must come first because of conflicts */ #include "glare.h" + /* maximum rtrace buffer size */ #define MAXPIX (4096/(6*sizeof(float))) @@ -16,7 +20,7 @@ static char SCCSid[] = "$SunId$ LBL"; #define HSIZE 317 /* size of scanline hash table */ #define NRETIRE 16 /* number of scanlines to retire at once */ -int rt_pd[3] = {-1,-1,-1}; /* process id & descriptors for rtrace */ +static SUBPROC rt_pd = SP_INACTIVE; /* process id & descriptors for rtrace */ FILE *pictfp = NULL; /* picture file pointer */ double exposure; /* picture exposure */ @@ -40,20 +44,28 @@ static int maxpix; /* maximum number of pixels to buf static SCAN *freelist; /* scanline free list */ static SCAN *hashtab[HSIZE]; /* scanline hash table */ +static long scanbufsiz; /* size of allocated scanline buffer */ + static long ncall = 0L; /* number of calls to getpictscan */ static long nread = 0L; /* number of scanlines read */ static long nrecl = 0L; /* number of scanlines reclaimed */ static int wrongformat = 0; -SCAN *scanretire(); +static SCAN * claimscan(int y); +static COLR * getpictscan(int y); +static double pict_val(FVECT vd); +static void rt_compute(float *pb, int np); +static gethfunc getexpos; +static SCAN * scanretire(void); +static void initscans(void); +static void donescans(void); -extern long ftell(); - -SCAN * -claimscan(y) /* claim scanline from buffers */ -int y; +static SCAN * +claimscan( /* claim scanline from buffers */ + int y +) { int hi = shash(y); SCAN *slast; @@ -79,9 +91,10 @@ int y; } -COLR * -getpictscan(y) /* get picture scanline */ -int y; +static COLR * +getpictscan( /* get picture scanline */ + int y +) { register SCAN *sl; register int i; @@ -131,7 +144,8 @@ seekerr: #ifdef DEBUG -pict_stats() /* print out picture read statistics */ +void +pict_stats(void) /* print out picture read statistics */ { static long lastcall = 0L; /* ncall at last report */ static long lastread = 0L; /* nread at last report */ @@ -148,12 +162,13 @@ pict_stats() /* print out picture read statistics */ #endif -double -pict_val(vd) /* find picture value for view direction */ -FVECT vd; +static double +pict_val( /* find picture value for view direction */ + FVECT vd +) { FVECT pp; - double vpx, vpy, vpz; + FVECT ip; COLOR res; if (pictfp == NULL) @@ -161,17 +176,20 @@ FVECT vd; pp[0] = pictview.vp[0] + vd[0]; pp[1] = pictview.vp[1] + vd[1]; pp[2] = pictview.vp[2] + vd[2]; - viewpixel(&vpx, &vpy, &vpz, &pictview, pp); - if (vpz <= FTINY || vpx < 0. || vpx >= 1. || vpy < 0. || vpy >= 1.) + viewloc(ip, &pictview, pp); + if (ip[2] <= FTINY || ip[0] < 0. || ip[0] >= 1. || + ip[1] < 0. || ip[1] >= 1.) return(-1.0); - colr_color(res, getpictscan((int)(vpy*pysiz))[(int)(vpx*pxsiz)]); + colr_color(res, getpictscan((int)(ip[1]*pysiz))[(int)(ip[0]*pxsiz)]); return(luminance(res)/exposure); } -double -getviewpix(vh, vv) /* compute single view pixel */ -int vh, vv; +extern double +getviewpix( /* compute single view pixel */ + int vh, + int vv +) { FVECT dir; float rt_buf[12]; @@ -182,7 +200,7 @@ int vh, vv; npixinvw++; if ((res = pict_val(dir)) >= 0.0) return(res); - if (rt_pd[0] == -1) { + if (rt_pd.r == -1) { npixmiss++; return(-1.0); } @@ -197,9 +215,11 @@ int vh, vv; } -getviewspan(vv, vb) /* compute a span of view pixels */ -int vv; -float *vb; +extern void +getviewspan( /* compute a span of view pixels */ + int vv, + float *vb +) { float rt_buf[6*MAXPIX]; /* rtrace send/receive buffer */ register int n; /* number of pixels in buffer */ @@ -221,7 +241,7 @@ float *vb; npixinvw++; if ((vb[vh+hsize] = pict_val(dir)) >= 0.0) continue; - if (rt_pd[0] == -1) { /* missing information */ + if (rt_pd.r == -1) { /* missing information */ npixmiss++; continue; } @@ -251,18 +271,20 @@ float *vb; } -rt_compute(pb, np) /* process buffer through rtrace */ -float *pb; -int np; +static void +rt_compute( /* process buffer through rtrace */ + float *pb, + int np +) { #ifdef DEBUG if (verbose && np > 1) fprintf(stderr, "%s: sending %d samples to rtrace...\n", progname, np); #endif - bzero(pb+6*np, 6*sizeof(float)); - if (process(rt_pd, pb, pb, 3*sizeof(float)*np, - 6*sizeof(float)*(np+1)) < 3*sizeof(float)*np) { + memset(pb+6*np, '\0', 6*sizeof(float)); + if (process(&rt_pd, (char *)pb, (char *)pb, 3*sizeof(float)*(np+1), + 6*sizeof(float)*(np+1)) < 3*sizeof(float)*(np+1)) { fprintf(stderr, "%s: rtrace communication error\n", progname); exit(1); @@ -270,8 +292,11 @@ int np; } -getexpos(s) /* get exposure from header line */ -char *s; +static int +getexpos( /* get exposure from header line */ + char *s, + void *p +) { char fmt[32]; @@ -281,28 +306,31 @@ char *s; formatval(fmt, s); wrongformat = strcmp(fmt, COLRFMT); } + return(0); } -open_pict(fn) /* open picture file */ -char *fn; +extern void +open_pict( /* open picture file */ + char *fn +) { if ((pictfp = fopen(fn, "r")) == NULL) { - fprintf("%s: cannot open\n", fn); + fprintf(stderr, "%s: cannot open\n", fn); exit(1); } exposure = 1.0; getheader(pictfp, getexpos, NULL); - if (wrongformat || - fgetresolu(&pxsiz, &pysiz, pictfp) != (YMAJOR|YDECR)) { - fprintf("%s: bad picture format\n", fn); + if (wrongformat || !fscnresolu(&pxsiz, &pysiz, pictfp)) { + fprintf(stderr, "%s: incompatible picture format\n", fn); exit(1); } initscans(); } -close_pict() /* done with picture */ +extern void +close_pict(void) /* done with picture */ { if (pictfp == NULL) return; @@ -312,12 +340,14 @@ close_pict() /* done with picture */ } -fork_rtrace(av) /* open pipe and start rtrace */ -char *av[]; +extern void +fork_rtrace( /* open pipe and start rtrace */ + char *av[] +) { int rval; - rval = open_process(rt_pd, av); + rval = open_process(&rt_pd, av); if (rval < 0) { perror(progname); exit(1); @@ -333,22 +363,23 @@ char *av[]; } -done_rtrace() /* wait for rtrace to finish */ +extern void +done_rtrace(void) /* wait for rtrace to finish */ { int status; - status = close_process(rt_pd); + status = close_process(&rt_pd); if (status > 0) { fprintf(stderr, "%s: bad status (%d) from rtrace\n", progname, status); exit(1); } - rt_pd[0] = -1; + rt_pd.r = -1; } -SCAN * -scanretire() /* retire old scanlines to free list */ +static SCAN * +scanretire(void) /* retire old scanlines to free list */ { SCAN *sold[NRETIRE]; int n; @@ -391,13 +422,14 @@ scanretire() /* retire old scanlines to free list */ static char *scan_buf; -initscans() /* initialize scanline buffers */ +static void +initscans(void) /* initialize scanline buffers */ { int scansize; register SCAN *ptr; register int i; /* initialize positions */ - scanpos = (long *)malloc(pysiz*sizeof(long)); + scanpos = (long *)bmalloc(pysiz*sizeof(long)); if (scanpos == NULL) memerr("scanline positions"); for (i = pysiz-1; i >= 0; i--) @@ -408,13 +440,14 @@ initscans() /* initialize scanline buffers */ hashtab[i] = NULL; /* allocate scanline buffers */ scansize = sizeof(SCAN) + pxsiz*sizeof(COLR); -#ifdef ALIGN - scansize = scansize+(sizeof(ALIGN)-1) & ~(sizeof(ALIGN)-1); +#ifdef ALIGNT + scansize = scansize+(sizeof(ALIGNT)-1) & ~(sizeof(ALIGNT)-1); #endif i = MAXSBUF / scansize; /* compute number to allocate */ if (i > HSIZE) i = HSIZE; - scan_buf = malloc(i*scansize); /* get in one big chunk */ + scanbufsiz = i*scansize; + scan_buf = bmalloc(scanbufsiz); /* get in one big chunk */ if (scan_buf == NULL) memerr("scanline buffers"); ptr = (SCAN *)scan_buf; @@ -429,8 +462,9 @@ initscans() /* initialize scanline buffers */ } -donescans() /* free up scanlines */ +static void +donescans(void) /* free up scanlines */ { - free(scan_buf); - free((char *)scanpos); + bfree(scan_buf, scanbufsiz); + bfree((char *)scanpos, pysiz*sizeof(long)); }