Browse Source

fix roundoff errors in zbuffer size

David Rose 17 years ago
parent
commit
251416cd5c

+ 7 - 5
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);
 }
 
 ////////////////////////////////////////////////////////////////////

+ 7 - 2
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) {