From 251416cd5c9ae9cda2ccb50f8d0818c14e2ad03b Mon Sep 17 00:00:00 2001 From: David Rose Date: Fri, 8 Aug 2008 20:21:12 +0000 Subject: [PATCH] fix roundoff errors in zbuffer size --- panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx | 12 +++++++----- panda/src/tinydisplay/zbuffer.cxx | 9 +++++++-- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx b/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx index 6ce0c2f98c..8c7ce98c87 100644 --- a/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx +++ b/panda/src/tinydisplay/tinyGraphicsStateGuardian.cxx @@ -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); } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/tinydisplay/zbuffer.cxx b/panda/src/tinydisplay/zbuffer.cxx index b91b0c61a3..bfc48d2e6c 100644 --- a/panda/src/tinydisplay/zbuffer.cxx +++ b/panda/src/tinydisplay/zbuffer.cxx @@ -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) {