87 lines
2.9 KiB
Plaintext

--- src/copypix.c.orig Mon Mar 8 22:33:30 1999
+++ src/copypix.c Mon Mar 8 22:35:18 1999
@@ -71,9 +74,10 @@
-static void copy_rgb_pixels( GLcontext* ctx,
- GLint srcx, GLint srcy, GLint width, GLint height,
- GLint destx, GLint desty )
+static void copy_rgba_pixels( GLcontext* ctx,
+ GLint srcx, GLint srcy,
+ GLint width, GLint height,
+ GLint destx, GLint desty )
{
GLdepth zspan[MAX_WIDTH];
GLubyte rgba[MAX_WIDTH][4];
@@ -81,6 +85,7 @@
GLint sy, dy, stepy;
GLint i, j;
GLboolean setbuffer;
+ GLubyte *saveAlpha;
const GLboolean zoom = ctx->Pixel.ZoomX!=1.0F || ctx->Pixel.ZoomY!=1.0F;
/* Determine if copy should be done bottom-to-top or top-to-bottom */
@@ -114,36 +119,46 @@
}
/* If read and draw buffer are different we must do buffer switching */
- setbuffer = ctx->Pixel.ReadBuffer!=ctx->Color.DrawBuffer;
-
+ saveAlpha = ctx->Buffer->Alpha;
+ setbuffer = ctx->Pixel.ReadBuffer != ctx->Color.DrawBuffer;
for (j=0; j<height; j++, sy+=stepy, dy+=stepy) {
if (setbuffer) {
(*ctx->Driver.SetBuffer)( ctx, ctx->Pixel.ReadBuffer );
+ if (ctx->Pixel.ReadBuffer == GL_FRONT)
+ ctx->Buffer->Alpha = ctx->Buffer->FrontAlpha;
+ else
+ ctx->Buffer->Alpha = ctx->Buffer->BackAlpha;
}
gl_read_rgba_span( ctx, width, srcx, sy, rgba );
-
if (ctx->Pixel.ScaleOrBiasRGBA) {
gl_scale_and_bias_rgba( ctx, width, rgba );
}
if (ctx->Pixel.MapColorFlag) {
gl_map_rgba( ctx, width, rgba );
}
-
if (setbuffer) {
(*ctx->Driver.SetBuffer)( ctx, ctx->Color.DrawBuffer );
+ if (ctx->Color.DrawBuffer == GL_FRONT)
+ ctx->Buffer->Alpha = ctx->Buffer->FrontAlpha;
+ else
+ ctx->Buffer->Alpha = ctx->Buffer->BackAlpha;
}
if (quick_draw && dy>=0 && dy<ctx->Buffer->Height) {
(*ctx->Driver.WriteRGBASpan)( ctx, width, destx, dy, rgba, NULL );
+
}
else if (zoom) {
gl_write_zoomed_rgba_span( ctx, width, destx, dy, zspan, rgba, desty);
}
else {
- gl_write_rgba_span( ctx, width, destx, dy, zspan, rgba, GL_BITMAP );
+ gl_write_rgba_span( ctx, width, destx, dy, zspan, rgba, GL_BITMAP
+);
}
}
-}
+ /* Restore current alpha buffer pointer */
+ ctx->Buffer->Alpha = saveAlpha;
+}
static void copy_ci_pixels( GLcontext* ctx,
@@ -368,7 +383,7 @@
desty = (GLint) (ctx->Current.RasterPos[1] + 0.5F);
if (type==GL_COLOR && ctx->Visual->RGBAflag) {
- copy_rgb_pixels( ctx, srcx, srcy, width, height, destx, desty );
+ copy_rgba_pixels( ctx, srcx, srcy, width, height, destx, desty );
}
else if (type==GL_COLOR && !ctx->Visual->RGBAflag) {
copy_ci_pixels( ctx, srcx, srcy, width, height, destx, desty );