Module: Mesa
Branch: master
Commit: b8f6cb380951463f86e6f9e7bb3a18a87fe2f53e
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=b8f6cb380951463f86e6f9e7bb3a18a87fe2f53e

Author: Chia-I Wu <[email protected]>
Date:   Sun Nov 21 18:58:47 2010 +0800

st/vega: Fix vgReadPixels with a subrectangle.

Fix a crash when the subrectangle is not inside the fb.  Fix wrong
pipe transfer when sx > 0 or sy + height != fb->height.

This fixes "readpixels" demo.

---

 src/gallium/state_trackers/vega/api_images.c |   16 ++++++++++++----
 1 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/src/gallium/state_trackers/vega/api_images.c 
b/src/gallium/state_trackers/vega/api_images.c
index 7054d9b..e9f038c 100644
--- a/src/gallium/state_trackers/vega/api_images.c
+++ b/src/gallium/state_trackers/vega/api_images.c
@@ -37,6 +37,7 @@
 #include "pipe/p_screen.h"
 #include "util/u_inlines.h"
 #include "util/u_tile.h"
+#include "util/u_math.h"
 
 static INLINE VGboolean supported_image_format(VGImageFormat format)
 {
@@ -402,7 +403,6 @@ void vegaReadPixels(void * data, VGint dataStride,
 
    VGfloat temp[VEGA_MAX_IMAGE_WIDTH][4];
    VGfloat *df = (VGfloat*)temp;
-   VGint y = (fb->height - sy) - 1, yStep = -1;
    VGint i;
    VGubyte *dst = (VGubyte *)data;
    VGint xoffset = 0, yoffset = 0;
@@ -430,18 +430,26 @@ void vegaReadPixels(void * data, VGint dataStride,
    }
    if (sy < 0) {
       yoffset = -sy;
+      yoffset *= dataStride;
       height += sy;
       sy = 0;
-      y = (fb->height - sy) - 1;
-      yoffset *= dataStride;
+   }
+
+   if (sx + width > fb->width || sy + height > fb->height) {
+      width = fb->width - sx;
+      height = fb->height - sy;
+      /* nothing to read */
+      if (width <= 0 || height <= 0)
+         return;
    }
 
    {
+      VGint y = (fb->height - sy) - 1, yStep = -1;
       struct pipe_transfer *transfer;
 
       transfer = pipe_get_transfer(pipe, strb->texture,  0, 0, 0,
                                   PIPE_TRANSFER_READ,
-                                  0, 0, width, height);
+                                  0, 0, sx + width, fb->height - sy);
 
       /* Do a row at a time to flip image data vertically */
       for (i = 0; i < height; i++) {

_______________________________________________
mesa-commit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to