--- 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 );
