fix roundoff errors in zbuffer size

This commit is contained in:
David Rose 2008-08-08 20:21:12 +00:00
parent 098fdd44e1
commit 251416cd5c
2 changed files with 14 additions and 7 deletions

View File

@ -251,13 +251,10 @@ prepare_display_region(DisplayRegionPipelineReader *dr,
xsize = int(xsize * pixel_factor);
ysize = int(ysize * pixel_factor);
if (_aux_frame_buffer == (ZBuffer *)NULL) {
// We add 3 to xsize, since ZB_open may resize the frame buffer
// down by up to 3 pixels to make it fit within the
// word-alignment rule.
_aux_frame_buffer = ZB_open(xsize + 3, ysize, ZB_MODE_RGBA, 0, 0, 0, 0);
_aux_frame_buffer = ZB_open(xsize, ysize, ZB_MODE_RGBA, 0, 0, 0, 0);
} else if (_aux_frame_buffer->xsize < xsize || _aux_frame_buffer->ysize < ysize) {
ZB_resize(_aux_frame_buffer, NULL,
max(_aux_frame_buffer->xsize, xsize) + 3,
max(_aux_frame_buffer->xsize, xsize),
max(_aux_frame_buffer->ysize, ysize));
}
_c->zb = _aux_frame_buffer;
@ -272,6 +269,11 @@ prepare_display_region(DisplayRegionPipelineReader *dr,
_c->viewport.xsize = xsize;
_c->viewport.ysize = ysize;
set_scissor(0.0f, 1.0f, 0.0f, 1.0f);
nassertv(xmin >= 0 && xmin < _c->zb->xsize &&
ymin >= 0 && ymin < _c->zb->ysize &&
xmin + xsize >= 0 && xmin + xsize <= _c->zb->xsize &&
ymin + ysize >= 0 && ymin + ysize <= _c->zb->ysize);
}
////////////////////////////////////////////////////////////////////

View File

@ -36,7 +36,7 @@ ZBuffer *ZB_open(int xsize, int ysize, int mode,
return NULL;
/* xsize must be a multiple of 4 */
xsize = xsize & ~3;
xsize = (xsize + 3) & ~3;
zb->xsize = xsize;
zb->ysize = ysize;
@ -107,7 +107,7 @@ void ZB_resize(ZBuffer * zb, void *frame_buffer, int xsize, int ysize)
int size;
/* xsize must be a multiple of 4 */
xsize = xsize & ~3;
xsize = (xsize + 3) & ~3;
zb->xsize = xsize;
zb->ysize = ysize;
@ -336,6 +336,11 @@ void ZB_clear_viewport(ZBuffer * zb, int clear_z, ZPOINT z,
PIXEL *pp;
ZPOINT *zz;
nassertv(xmin >= 0 && xmin < zb->xsize &&
ymin >= 0 && ymin < zb->ysize &&
xmin + xsize >= 0 && xmin + xsize <= zb->xsize &&
ymin + ysize >= 0 && ymin + ysize <= zb->ysize);
if (clear_z) {
zz = zb->zbuf + xmin + ymin * zb->xsize;
for (y = 0; y < ysize; ++y) {