diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/mesa/state_tracker/st_cb_drawpixels.c | 43 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_cb_texture.c | 28 | 
2 files changed, 68 insertions, 3 deletions
| diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c index 08dc7c930e..89725cfe8d 100644 --- a/src/mesa/state_tracker/st_cb_drawpixels.c +++ b/src/mesa/state_tracker/st_cb_drawpixels.c @@ -910,6 +910,34 @@ st_CopyPixels(GLcontext *ctx, GLint srcx, GLint srcy,     st_validate_state(st); +   if (srcx < 0) { +      width -= -srcx; +      dstx += -srcx; +      srcx = 0; +   } + +   if (srcy < 0) { +      height -= -srcy; +      dsty += -srcy; +      srcy = 0; +   } + +   if (dstx < 0) { +      width -= -dstx; +      srcx += -dstx; +      dstx = 0; +   } + +   if (dsty < 0) { +      height -= -dsty; +      srcy += -dsty; +      dsty = 0; +   } + +   if (width < 0 || height < 0) +      return; + +     if (type == GL_STENCIL) {        /* can't use texturing to do stencil */        copy_stencil_pixels(ctx, srcx, srcy, width, height, dstx, dsty); @@ -951,15 +979,24 @@ st_CopyPixels(GLcontext *ctx, GLint srcx, GLint srcy,        }     } +   if (st_fb_orientation(ctx->DrawBuffer) == Y_0_TOP) { +      srcy = ctx->DrawBuffer->Height - srcy - height; + +      if (srcy < 0) { +         height -= -srcy; +         srcy = 0; +      } +       +      if (height < 0) +         return; +   } +     pt = st_texture_create(ctx->st, PIPE_TEXTURE_2D, texFormat, 0,                            width, height, 1,                            PIPE_TEXTURE_USAGE_SAMPLER);     if (!pt)        return; -   if (st_fb_orientation(ctx->DrawBuffer) == Y_0_TOP) { -      srcy = ctx->DrawBuffer->Height - srcy - height; -   }     if (srcFormat == texFormat) {        /* copy source framebuffer surface into mipmap/texture */ diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c index 98f109fc65..b182106fd5 100644 --- a/src/mesa/state_tracker/st_cb_texture.c +++ b/src/mesa/state_tracker/st_cb_texture.c @@ -1337,6 +1337,34 @@ st_copy_texsubimage(GLcontext *ctx,        return;     } +   if (srcX < 0) { +      width -= -srcX; +      destX += -srcX; +      srcX = 0; +   } + +   if (srcY < 0) { +      height -= -srcY; +      destY += -srcY; +      srcY = 0; +   } + +   if (destX < 0) { +      width -= -destX; +      srcX += -destX; +      destX = 0; +   } + +   if (destY < 0) { +      height -= -destY; +      srcY += -destY; +      destY = 0; +   } + +   if (width < 0 || height < 0) +      return; + +     assert(strb);     assert(strb->surface);     assert(stImage->pt); | 
