58 |
|
int nbytes, i, j, k, nextsamp, count, blockdiv; |
59 |
|
int res[2]; |
60 |
|
|
61 |
< |
if (odNViews) { /* deallocate view structures */ |
62 |
< |
for (i = 0; i < odNViews; i++) { |
61 |
> |
if (odNViews > 0) { /* deallocate view structures */ |
62 |
> |
for (i = odNViews; i--; ) { |
63 |
|
free((char *)odView[i].bmap); |
64 |
+ |
free((char *)odView[i].pmap); |
65 |
|
if (odView[i].emap != NULL) |
66 |
|
free((char *)odView[i].emap); |
67 |
|
} |
110 |
|
if (blockdiv < 8) blockdiv = 8; |
111 |
|
nextsamp = 0; count /= blockdiv*blockdiv; /* # blocks */ |
112 |
|
while (i--) { /* initialize each view */ |
112 |
– |
odView[i].emap = NULL; |
113 |
– |
odView[i].dmap = NULL; |
113 |
|
dev_auxview(i, res); |
114 |
|
odView[i].hhi = res[0]; |
115 |
|
odView[i].hlow = (res[0] + blockdiv/2) / blockdiv; |
117 |
|
odView[i].vhi = res[1]; |
118 |
|
odView[i].vlow = (res[1] + blockdiv/2) / blockdiv; |
119 |
|
if (odView[i].vlow < 1) odView[i].vlow = 1; |
120 |
+ |
odView[i].emap = NULL; |
121 |
+ |
odView[i].dmap = NULL; |
122 |
+ |
odView[i].pmap = (int4 *)calloc(FL4NELS(res[0]*res[1]), |
123 |
+ |
sizeof(int4)); |
124 |
+ |
if (odView[i].pmap == NULL) |
125 |
+ |
return(0); |
126 |
|
j = odView[i].hlow*odView[i].vlow; |
127 |
|
odView[i].bmap = (struct ODblock *)malloc( |
128 |
|
j * sizeof(struct ODblock)); |
184 |
|
if (prox > bp->pthresh) |
185 |
|
return(-1); /* worse than free list occupants */ |
186 |
|
/* check for duplicate pixel */ |
187 |
< |
for (i = bp->first+bp->nsamp; i-- > bp->first; ) |
187 |
> |
if (CHK4(odView[vn].pmap, vh*odView[vn].hhi + hh)) |
188 |
> |
i = bp->first + bp->nsamp; |
189 |
> |
else |
190 |
> |
i = -1; |
191 |
> |
while (i-- > bp->first) |
192 |
|
if (hh == odS.ip[i][0] && vh == odS.ip[i][1]) { /* found it! */ |
193 |
|
/* search free list for it */ |
194 |
|
if (i == bp->free) |
206 |
|
return(-1); /* previous sample is fine */ |
207 |
|
goto gotit; |
208 |
|
} |
209 |
+ |
DCHECK(i>=-1, WARNING, "pixel in presence map not found in block"); |
210 |
|
if (bp->free != ENDFREE) { /* allocate from free list */ |
211 |
|
i = bp->free; |
212 |
+ |
if (odS.ip[i][0] >= 0 & odS.ip[i][1] >= 0) |
213 |
+ |
CLR4(odView[vn].pmap, odS.ip[i][1]*odView[vn].hhi + |
214 |
+ |
odS.ip[i][0]); |
215 |
|
bp->free = odS.nextfree(i); |
216 |
|
bp->nused++; |
217 |
|
goto gotit; |
235 |
|
bp->nused--; |
236 |
|
} |
237 |
|
i = si[0]; /* use worst sample */ |
238 |
+ |
CLR4(odView[vn].pmap, odS.ip[i][1]*odView[vn].hhi + odS.ip[i][0]); |
239 |
|
gotit: |
240 |
|
odS.ip[i][0] = hh; |
241 |
|
odS.ip[i][1] = vh; |
242 |
|
odS.closeness(i) = prox; |
243 |
+ |
SET4(odView[vn].pmap, vh*odView[vn].hhi + hh); |
244 |
|
return(i); |
245 |
|
} |
246 |
|
|