ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/pinterp.c
(Generate patch)

Comparing ray/src/px/pinterp.c (file contents):
Revision 1.1 by greg, Sun Dec 10 17:34:13 1989 UTC vs.
Revision 1.3 by greg, Tue Dec 12 15:53:10 1989 UTC

# Line 17 | Line 17 | static char SCCSid[] = "$SunId$ LBL";
17   #define pscan(y)        (ourpict+(y)*ourview.hresolu)
18   #define zscan(y)        (ourzbuf+(y)*ourview.hresolu)
19  
20 + #define ABS(x)          ((x)>0?(x):-(x))
21 +
22   VIEW    ourview = STDVIEW(512);         /* desired view */
23  
24   double  zeps = 0.001;                   /* allowed z epsilon */
# Line 250 | Line 252 | float  *zline;
252  
253   fillpicture()                           /* fill in empty spaces */
254   {
255 +        int     *yback, xback;
256          int     y;
257 <        COLR    cfill;
258 <        register int    x, xblank;
259 <        
260 <        for (y = 0; y < ourview.vresolu; y++) {
261 <                xblank = -1;
262 <                for (x = 0; x < ourview.hresolu; x++)
263 <                        if (zscan(y)[x] <= 0.0) {
261 <                                if (xblank < 0)
262 <                                        xblank = x;
263 <                        } else if (xblank >= 0) {
264 <                                if (xblank == 0 || zscan(y)[xblank-1] < zscan(y)[x])
265 <                                        copycolr(cfill, pscan(y)[x]);
266 <                                else
267 <                                        copycolr(cfill, pscan(y)[xblank-1]);
268 <                                for ( ; xblank < x; xblank++)
269 <                                        copycolr(pscan(y)[xblank], cfill);
270 <                                xblank = -1;
271 <                        }
272 <                if (xblank > 0) {
273 <                        copycolr(cfill, pscan(y)[xblank-1]);
274 <                        for ( ; xblank < ourview.hresolu; xblank++)
275 <                                copycolr(pscan(y)[xblank], cfill);
276 <                }
257 >        COLR    pfill;
258 >        register int    x, i;
259 >                                                        /* get back buffer */
260 >        yback = (int *)malloc(ourview.hresolu*sizeof(int));
261 >        if (yback == NULL) {
262 >                perror(progname);
263 >                return;
264          }
265 +        for (x = 0; x < ourview.hresolu; x++)
266 +                yback[x] = -1;
267 +                                                        /* fill image */
268 +        for (y = 0; y < ourview.vresolu; y++)
269 +                for (x = 0; x < ourview.hresolu; x++)
270 +                        if (zscan(y)[x] <= 0.0) {       /* found hole */
271 +                                xback = x-1;
272 +                                do {                    /* find boundary */
273 +                                        if (yback[x] < 0) {
274 +                                                for (i = y+1;
275 +                                                        i < ourview.vresolu;
276 +                                                                i++)
277 +                                                        if (zscan(i)[x] > 0.0)
278 +                                                                break;
279 +                                                if (i < ourview.vresolu
280 +                                && (y <= 0 || zscan(y-1)[x] < zscan(i)[x]))
281 +                                                        yback[x] = i;
282 +                                                else
283 +                                                        yback[x] = y-1;
284 +                                        }
285 +                                } while (++x < ourview.hresolu
286 +                                                && zscan(y)[x] <= 0.0);
287 +                                i = xback;              /* pick background */
288 +                                if (x < ourview.hresolu
289 +                        && (i < 0 || zscan(y)[i] < zscan(y)[x]))
290 +                                        xback = x;
291 +                                                        /* fill hole */
292 +                                if (xback < 0) {
293 +                                        while (++i < x)
294 +                                                if (yback[i] >= 0)
295 +                                copycolr(pscan(y)[i],pscan(yback[i])[i]);
296 +                                } else {
297 +                                        while (++i < x)
298 +                                                if (yback[i] < 0
299 +                                || ABS(i-xback) <= 1 || (ABS(y-yback[i]) > 1
300 +                                && zscan(yback[i])[i] < zscan(y)[xback]))
301 +                                        copycolr(pscan(y)[i],pscan(y)[xback]);
302 +                                                else
303 +                                        copycolr(pscan(y)[i],pscan(yback[i])[i]);
304 +                                }
305 +                } else
306 +                        yback[x] = -1;                  /* clear boundary */
307 +        free((char *)yback);
308   }
309  
310  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines