--- ray/src/util/glareval.c 1991/03/19 17:06:27 1.3 +++ ray/src/util/glareval.c 1991/03/21 12:28:23 1.5 @@ -39,12 +39,13 @@ struct { static long ncall = 0L; /* number of calls to getpictscan */ static long nread = 0L; /* number of scanlines read */ +extern long ftell(); + COLR * getpictscan(y) /* get picture scanline */ int y; { - extern long ftell(); int minused; register int i; /* first check our buffers */ @@ -59,27 +60,38 @@ int y; minused = i; } /* not there, read it in */ - if (scanpos[y] == -1) { /* need to search */ - while (curpos > y) { + if (scanpos[y] < 0) { /* need to search */ + for (i = y+1; i < curpos; i++) + if (scanpos[i] >= 0) { + if (fseek(pictfp, scanpos[i], 0) < 0) + goto seekerr; + curpos = i; + break; + } + while (curpos >= y) { scanpos[curpos] = ftell(pictfp); if (freadcolrs(scan[minused].sl, pxsiz, pictfp) < 0) goto readerr; + nread++; curpos--; } - } else if (fseek(pictfp, scanpos[y], 0) < 0) { - fprintf(stderr, "%s: picture seek error\n", progname); - exit(1); + } else { + if (curpos != y && fseek(pictfp, scanpos[y], 0) < 0) + goto seekerr; + if (freadcolrs(scan[minused].sl, pxsiz, pictfp) < 0) + goto readerr; + nread++; + curpos = y-1; } - if (freadcolrs(scan[minused].sl, pxsiz, pictfp) < 0) - goto readerr; - nread++; - curpos = y-1; scan[minused].lused = ncall; scan[minused].y = y; return(scan[minused].sl); readerr: fprintf(stderr, "%s: picture read error\n", progname); exit(1); +seekerr: + fprintf(stderr, "%s: picture seek error\n", progname); + exit(1); } @@ -154,9 +166,11 @@ float *vb; FVECT dir; register int vh; +#ifdef DEBUG if (verbose) fprintf(stderr, "%s: computing view span at %d...\n", progname, vv); +#endif n = 0; for (vh = -hsize; vh <= hsize; vh++) { if (compdir(dir, vh, vv) < 0) { /* off viewable region */ @@ -181,8 +195,10 @@ float *vb; rt_buf[6*n+5] = dir[2]; buf_vh[n++] = vh; } +#ifdef DEBUG if (verbose) pict_stats(); +#endif if (n > 0) { /* process pending buffer */ rt_compute(rt_buf, n); while (n-- > 0) @@ -197,9 +213,11 @@ int np; { static float nbuf[6] = {0.,0.,0.,0.,0.,0.}; +#ifdef DEBUG if (verbose && np > 1) fprintf(stderr, "%s: sending %d samples to rtrace...\n", progname, np); +#endif if (writebuf(fd_tort,(char *)pb,6*sizeof(float)*np) < 6*sizeof(float)*np || writebuf(fd_tort,(char *)nbuf,sizeof(nbuf)) < sizeof(nbuf)) { fprintf(stderr, "%s: error writing to rtrace process\n", @@ -241,8 +259,9 @@ char *fn; scanpos = (long *)malloc(pysiz*sizeof(long)); if (scanpos == NULL) memerr("scanline positions"); - for (i = 0; i < pysiz; i++) + for (i = pysiz-1; i >= 0; i--) scanpos[i] = -1L; + curpos = pysiz-1; for (i = 0; i < NSCANS; i++) { scan[i].lused = -1; scan[i].y = -1; @@ -250,7 +269,6 @@ char *fn; if (scan[i].sl == NULL) memerr("scanline buffers"); } - curpos = pysiz-1; }