--- ray/src/px/pinterp.c 1989/12/10 17:34:13 1.1 +++ ray/src/px/pinterp.c 1989/12/13 12:41:25 1.4 @@ -17,6 +17,8 @@ static char SCCSid[] = "$SunId$ LBL"; #define pscan(y) (ourpict+(y)*ourview.hresolu) #define zscan(y) (ourzbuf+(y)*ourview.hresolu) +#define ABS(x) ((x)>0?(x):-(x)) + VIEW ourview = STDVIEW(512); /* desired view */ double zeps = 0.001; /* allowed z epsilon */ @@ -250,31 +252,57 @@ float *zline; fillpicture() /* fill in empty spaces */ { + int *yback, xback; int y; - COLR cfill; - register int x, xblank; - + COLR pfill; + register int x, i; + /* get back buffer */ + yback = (int *)malloc(ourview.hresolu*sizeof(int)); + if (yback == NULL) { + perror(progname); + return; + } + for (x = 0; x < ourview.hresolu; x++) + yback[x] = -2; + /* fill image */ for (y = 0; y < ourview.vresolu; y++) { - xblank = -1; + xback = -2; for (x = 0; x < ourview.hresolu; x++) - if (zscan(y)[x] <= 0.0) { - if (xblank < 0) - xblank = x; - } else if (xblank >= 0) { - if (xblank == 0 || zscan(y)[xblank-1] < zscan(y)[x]) - copycolr(cfill, pscan(y)[x]); + if (zscan(y)[x] <= 0.0) { /* empty pixel */ + if (yback[x] == -2) { + for (i = y+1; i < ourview.vresolu; i++) + if (zscan(i)[x] > 0.0) + break; + if (i < ourview.vresolu + && (y <= 0 || zscan(y-1)[x] < zscan(i)[x])) + yback[x] = i; + else + yback[x] = y-1; + } + if (xback == -2) { + for (i = x+1; x < ourview.hresolu; i++) + if (zscan(y)[i] > 0.0) + break; + if (i < ourview.hresolu + && (x <= 0 || zscan(y)[x-1] < zscan(y)[i])) + xback = i; + else + xback = x-1; + } + if (xback < 0 && yback[x] < 0) + continue; + if (yback[x] < 0 || ABS(x-xback) <= 1 + || ( ABS(y-yback[x]) > 1 + && zscan(yback[x])[x] < zscan(y)[xback] )) + copycolr(pscan(y)[x],pscan(y)[xback]); else - copycolr(cfill, pscan(y)[xblank-1]); - for ( ; xblank < x; xblank++) - copycolr(pscan(y)[xblank], cfill); - xblank = -1; + copycolr(pscan(y)[x],pscan(yback[x])[x]); + } else { /* full pixel */ + yback[x] = -2; + xback = -2; } - if (xblank > 0) { - copycolr(cfill, pscan(y)[xblank-1]); - for ( ; xblank < ourview.hresolu; xblank++) - copycolr(pscan(y)[xblank], cfill); - } } + free((char *)yback); }