-/* $Id: s_copypix.c,v 1.11 2001/02/20 16:42:26 brianp Exp $ */
+/* $Id: s_copypix.c,v 1.13 2001/03/03 20:33:30 brianp Exp $ */
/*
* Mesa 3-D graphics library
/*
- * Determine if there's overlap in an image copy
+ * Determine if there's overlap in an image copy.
+ * This test also compensates for the fact that copies are done from
+ * bottom to top and overlaps can sometimes be handled correctly
+ * without making a temporary image copy.
*/
static GLboolean
-regions_overlap(int srcx, int srcy, int dstx, int dsty, int width, int height,
- float zoomX, float zoomY)
+regions_overlap(GLint srcx, GLint srcy,
+ GLint dstx, GLint dsty,
+ GLint width, GLint height,
+ GLfloat zoomX, GLfloat zoomY)
{
- if ((srcx > dstx + (width * zoomX) + 1) || (srcx + width + 1 < dstx)) {
- return GL_FALSE;
- }
- else if ((srcy < dsty) && (srcy + height < dsty + (height * zoomY))) {
- return GL_FALSE;
- }
- else if ((srcy > dsty) && (srcy + height > dsty + (height * zoomY))) {
- return GL_FALSE;
+ if (zoomX == 1.0 && zoomY == 1.0) {
+ /* no zoom */
+ if (srcx >= dstx + width || (srcx + width <= dstx)) {
+ return GL_FALSE;
+ }
+ else if (srcy < dsty) { /* this is OK */
+ return GL_FALSE;
+ }
+ else {
+ return GL_TRUE;
+ }
}
else {
- return GL_TRUE;
+ /* add one pixel of slop when zooming, just to be safe */
+ if ((srcx > dstx + (width * zoomX) + 1) || (srcx + width + 1 < dstx)) {
+ return GL_FALSE;
+ }
+ else if ((srcy < dsty) && (srcy + height < dsty + (height * zoomY))) {
+ return GL_FALSE;
+ }
+ else if ((srcy > dsty) && (srcy + height > dsty + (height * zoomY))) {
+ return GL_FALSE;
+ }
+ else {
+ return GL_TRUE;
+ }
}
}
/* allocate space for GLfloat image */
tmpImage = (GLfloat *) MALLOC(width * height * 4 * sizeof(GLfloat));
if (!tmpImage) {
- gl_error(ctx, GL_OUT_OF_MEMORY, "glCopyPixels");
+ _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyPixels");
return;
}
convImage = (GLfloat *) MALLOC(width * height * 4 * sizeof(GLfloat));
if (!convImage) {
FREE(tmpImage);
- gl_error(ctx, GL_OUT_OF_MEMORY, "glCopyPixels");
+ _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyPixels");
return;
}
for (row = 0; row < height; row++) {
GLchan rgba[MAX_WIDTH][4];
GLint i;
- gl_read_rgba_span(ctx, ctx->ReadBuffer, width, srcx, srcy + row, rgba);
+ _mesa_read_rgba_span(ctx, ctx->ReadBuffer, width, srcx, srcy + row, rgba);
/* convert GLchan to GLfloat */
for (i = 0; i < width; i++) {
*dest++ = (GLfloat) rgba[i][RCOMP] * (1.0F / CHAN_MAXF);
(const GLchan (*)[4])rgba, NULL );
}
else if (zoom) {
- gl_write_zoomed_rgba_span( ctx, width, destx, dy, zspan, 0,
+ _mesa_write_zoomed_rgba_span( ctx, width, destx, dy, zspan, 0,
(const GLchan (*)[4])rgba, desty);
}
else {
- gl_write_rgba_span( ctx, width, destx, dy, zspan, 0, rgba, GL_BITMAP );
+ _mesa_write_rgba_span( ctx, width, destx, dy, zspan, 0, rgba, GL_BITMAP );
}
}
GLint ssy = sy;
tmpImage = (GLchan *) MALLOC(width * height * sizeof(GLchan) * 4);
if (!tmpImage) {
- gl_error( ctx, GL_OUT_OF_MEMORY, "glCopyPixels" );
+ _mesa_error( ctx, GL_OUT_OF_MEMORY, "glCopyPixels" );
return;
}
p = tmpImage;
ctx->ReadBuffer->Alpha = ctx->ReadBuffer->BackRightAlpha;
}
for (j = 0; j < height; j++, ssy += stepy) {
- gl_read_rgba_span( ctx, ctx->ReadBuffer, width, srcx, ssy,
+ _mesa_read_rgba_span( ctx, ctx->ReadBuffer, width, srcx, ssy,
(GLchan (*)[4]) p );
p += (width * sizeof(GLchan) * 4);
}
ctx->ReadBuffer->Alpha = ctx->ReadBuffer->BackRightAlpha;
}
}
- gl_read_rgba_span( ctx, ctx->ReadBuffer, width, srcx, sy, rgba );
+ _mesa_read_rgba_span( ctx, ctx->ReadBuffer, width, srcx, sy, rgba );
}
if (changeBuffer) {
(const GLchan (*)[4])rgba, NULL );
}
else if (zoom) {
- gl_write_zoomed_rgba_span( ctx, width, destx, dy, zspan, 0,
+ _mesa_write_zoomed_rgba_span( ctx, width, destx, dy, zspan, 0,
(const GLchan (*)[4])rgba, desty);
}
else {
- gl_write_rgba_span( ctx, width, destx, dy, zspan, 0, rgba, GL_BITMAP );
+ _mesa_write_rgba_span( ctx, width, destx, dy, zspan, 0, rgba, GL_BITMAP );
}
}
GLint ssy = sy;
tmpImage = (GLuint *) MALLOC(width * height * sizeof(GLuint));
if (!tmpImage) {
- gl_error( ctx, GL_OUT_OF_MEMORY, "glCopyPixels" );
+ _mesa_error( ctx, GL_OUT_OF_MEMORY, "glCopyPixels" );
return;
}
p = tmpImage;
ctx->Pixel.DriverReadBuffer );
}
for (j = 0; j < height; j++, ssy += stepy) {
- gl_read_index_span( ctx, ctx->ReadBuffer, width, srcx, ssy, p );
+ _mesa_read_index_span( ctx, ctx->ReadBuffer, width, srcx, ssy, p );
p += width;
}
p = tmpImage;
(*ctx->Driver.SetReadBuffer)( ctx, ctx->ReadBuffer,
ctx->Pixel.DriverReadBuffer );
}
- gl_read_index_span( ctx, ctx->ReadBuffer, width, srcx, sy, indexes );
+ _mesa_read_index_span( ctx, ctx->ReadBuffer, width, srcx, sy, indexes );
}
if (changeBuffer) {
}
if (zoom) {
- gl_write_zoomed_index_span( ctx, width, destx, dy, zspan, 0, indexes, desty );
+ _mesa_write_zoomed_index_span( ctx, width, destx, dy, zspan, 0, indexes, desty );
}
else {
- gl_write_index_span(ctx, width, destx, dy, zspan, 0, indexes, GL_BITMAP);
+ _mesa_write_index_span(ctx, width, destx, dy, zspan, 0, indexes, GL_BITMAP);
}
}
GLint overlapping;
if (!ctx->Visual.depthBits) {
- gl_error( ctx, GL_INVALID_OPERATION, "glCopyPixels" );
+ _mesa_error( ctx, GL_INVALID_OPERATION, "glCopyPixels" );
return;
}
GLint ssy = sy;
tmpImage = (GLfloat *) MALLOC(width * height * sizeof(GLfloat));
if (!tmpImage) {
- gl_error( ctx, GL_OUT_OF_MEMORY, "glCopyPixels" );
+ _mesa_error( ctx, GL_OUT_OF_MEMORY, "glCopyPixels" );
return;
}
p = tmpImage;
if (ctx->Visual.rgbMode) {
if (zoom) {
- gl_write_zoomed_rgba_span( ctx, width, destx, dy, zspan, 0,
+ _mesa_write_zoomed_rgba_span( ctx, width, destx, dy, zspan, 0,
(const GLchan (*)[4])rgba, desty );
}
else {
- gl_write_rgba_span( ctx, width, destx, dy, zspan, 0,
+ _mesa_write_rgba_span( ctx, width, destx, dy, zspan, 0,
rgba, GL_BITMAP);
}
}
else {
if (zoom) {
- gl_write_zoomed_index_span( ctx, width, destx, dy,
+ _mesa_write_zoomed_index_span( ctx, width, destx, dy,
zspan, 0, indexes, desty );
}
else {
- gl_write_index_span( ctx, width, destx, dy,
+ _mesa_write_index_span( ctx, width, destx, dy,
zspan, 0, indexes, GL_BITMAP );
}
}
GLint overlapping;
if (!ctx->Visual.stencilBits) {
- gl_error( ctx, GL_INVALID_OPERATION, "glCopyPixels" );
+ _mesa_error( ctx, GL_INVALID_OPERATION, "glCopyPixels" );
return;
}
GLint ssy = sy;
tmpImage = (GLstencil *) MALLOC(width * height * sizeof(GLstencil));
if (!tmpImage) {
- gl_error( ctx, GL_OUT_OF_MEMORY, "glCopyPixels" );
+ _mesa_error( ctx, GL_OUT_OF_MEMORY, "glCopyPixels" );
return;
}
p = tmpImage;
}
if (zoom) {
- gl_write_zoomed_stencil_span( ctx, width, destx, dy, stencil, desty );
+ _mesa_write_zoomed_stencil_span( ctx, width, destx, dy, stencil, desty );
}
else {
_mesa_write_stencil_span( ctx, width, destx, dy, stencil );
copy_stencil_pixels( ctx, srcx, srcy, width, height, destx, desty );
}
else {
- gl_error( ctx, GL_INVALID_ENUM, "glCopyPixels" );
+ _mesa_error( ctx, GL_INVALID_ENUM, "glCopyPixels" );
}
}