87 lines
2.9 KiB
Plaintext
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 );
|