Removed all RCS / CVS tags (Id, Header, Date, etc.) from everything.
[mesa.git] / src / mesa / swrast / s_alphabuf.c
index 8c324a4588a2fc6538abfb899d008f6cb19c2c9b..c74ab45a44c5f896d5632e421799a546911b2957 100644 (file)
@@ -1,10 +1,9 @@
-/* $Id: s_alphabuf.c,v 1.7 2001/05/11 18:58:32 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
- * Version:  3.5
+ * Version:  5.0.1
  *
- * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
 
 
 #include "glheader.h"
+#include "colormac.h"
 #include "context.h"
-#include "mem.h"
+#include "imports.h"
 
+#include "s_context.h"
 #include "s_alphabuf.h"
 
 
-
-
-#define ALPHA_DRAW_ADDR(X,Y) \
-   (ctx->DrawBuffer->Alpha + (Y) * ctx->DrawBuffer->Width + (X))
-
-#define ALPHA_READ_ADDR(X,Y) \
-   (ctx->ReadBuffer->Alpha + (Y) * ctx->ReadBuffer->Width + (X))
-
-
-
 /*
- * Allocate new front/back/left/right alpha buffers.
- * Input: ctx - the context
- *
+ * Allocate a new front and back alpha buffer.
  */
-static void
-alloc_alpha_buffers( GLcontext *ctx, GLframebuffer *buf )
+void
+_swrast_alloc_alpha_buffers( GLframebuffer *buffer )
 {
-   GLint bytes = buf->Width * buf->Height * sizeof(GLchan);
+   const GLint bytes = buffer->Width * buffer->Height * sizeof(GLchan);
 
-   ASSERT(ctx->DrawBuffer->UseSoftwareAlphaBuffers);
+   ASSERT(buffer->UseSoftwareAlphaBuffers);
 
-   if (buf->FrontLeftAlpha) {
-      FREE( buf->FrontLeftAlpha );
+   if (buffer->FrontLeftAlpha) {
+      MESA_PBUFFER_FREE( buffer->FrontLeftAlpha );
    }
-   buf->FrontLeftAlpha = (GLchan *) MALLOC( bytes );
-   if (!buf->FrontLeftAlpha) {
+   buffer->FrontLeftAlpha = MESA_PBUFFER_ALLOC( bytes );
+   if (!buffer->FrontLeftAlpha) {
       /* out of memory */
-      _mesa_error( ctx, GL_OUT_OF_MEMORY,
-                "Couldn't allocate front-left alpha buffer" );
+      _mesa_error( NULL, GL_OUT_OF_MEMORY,
+                   "Couldn't allocate front-left alpha buffer" );
    }
 
-   if (ctx->Visual.doubleBufferMode) {
-      if (buf->BackLeftAlpha) {
-         FREE( buf->BackLeftAlpha );
+   if (buffer->Visual.doubleBufferMode) {
+      if (buffer->BackLeftAlpha) {
+         MESA_PBUFFER_FREE( buffer->BackLeftAlpha );
       }
-      buf->BackLeftAlpha = (GLchan *) MALLOC( bytes );
-      if (!buf->BackLeftAlpha) {
+      buffer->BackLeftAlpha = MESA_PBUFFER_ALLOC( bytes );
+      if (!buffer->BackLeftAlpha) {
          /* out of memory */
-         _mesa_error( ctx, GL_OUT_OF_MEMORY,
+         _mesa_error( NULL, GL_OUT_OF_MEMORY,
                       "Couldn't allocate back-left alpha buffer" );
       }
    }
 
-   if (ctx->Visual.stereoMode) {
-      if (buf->FrontRightAlpha) {
-         FREE( buf->FrontRightAlpha );
+   if (buffer->Visual.stereoMode) {
+      if (buffer->FrontRightAlpha) {
+         MESA_PBUFFER_FREE( buffer->FrontRightAlpha );
       }
-      buf->FrontRightAlpha = (GLchan *) MALLOC( bytes );
-      if (!buf->FrontRightAlpha) {
+      buffer->FrontRightAlpha = MESA_PBUFFER_ALLOC( bytes );
+      if (!buffer->FrontRightAlpha) {
          /* out of memory */
-         _mesa_error( ctx, GL_OUT_OF_MEMORY,
-                   "Couldn't allocate front-right alpha buffer" );
+         _mesa_error( NULL, GL_OUT_OF_MEMORY,
+                      "Couldn't allocate front-right alpha buffer" );
       }
 
-      if (ctx->Visual.doubleBufferMode) {
-         if (buf->BackRightAlpha) {
-            FREE( buf->BackRightAlpha );
+      if (buffer->Visual.doubleBufferMode) {
+         if (buffer->BackRightAlpha) {
+            MESA_PBUFFER_FREE( buffer->BackRightAlpha );
          }
-         buf->BackRightAlpha = (GLchan *) MALLOC( bytes );
-         if (!buf->BackRightAlpha) {
+         buffer->BackRightAlpha = MESA_PBUFFER_ALLOC( bytes );
+         if (!buffer->BackRightAlpha) {
             /* out of memory */
-            _mesa_error( ctx, GL_OUT_OF_MEMORY,
-                      "Couldn't allocate back-right alpha buffer" );
+            _mesa_error( NULL, GL_OUT_OF_MEMORY,
+                         "Couldn't allocate back-right alpha buffer" );
          }
       }
    }
-
-   if (ctx->Color.DriverDrawBuffer == GL_FRONT_LEFT)
-      buf->Alpha = buf->FrontLeftAlpha;
-   else if (ctx->Color.DriverDrawBuffer == GL_BACK_LEFT)
-      buf->Alpha = buf->BackLeftAlpha;
-   else if (ctx->Color.DriverDrawBuffer == GL_FRONT_RIGHT)
-      buf->Alpha = buf->FrontRightAlpha;
-   else if (ctx->Color.DriverDrawBuffer == GL_BACK_RIGHT)
-      buf->Alpha = buf->BackRightAlpha;
-}
-
-
-/*
- * Allocate a new front and back alpha buffer.
- */
-void
-_mesa_alloc_alpha_buffers( GLcontext *ctx )
-{
-   alloc_alpha_buffers( ctx, ctx->DrawBuffer );
-   if (ctx->ReadBuffer != ctx->DrawBuffer) {
-      alloc_alpha_buffers( ctx, ctx->ReadBuffer );
-   }
 }
 
 
@@ -134,36 +101,38 @@ _mesa_alloc_alpha_buffers( GLcontext *ctx )
  * Clear all the alpha buffers
  */
 void
-_mesa_clear_alpha_buffers( GLcontext *ctx )
+_swrast_clear_alpha_buffers( GLcontext *ctx )
 {
-   const GLchan aclear = ctx->Color.ClearColor[3];
+   GLchan aclear;
    GLuint bufferBit;
 
+   CLAMPED_FLOAT_TO_CHAN(aclear, ctx->Color.ClearColor[3]);
+
    ASSERT(ctx->DrawBuffer->UseSoftwareAlphaBuffers);
    ASSERT(ctx->Color.ColorMask[ACOMP]);
 
    /* loop over four possible alpha buffers */
    for (bufferBit = 1; bufferBit <= 8; bufferBit = bufferBit << 1) {
-      if (bufferBit & ctx->Color.DrawDestMask) {
+      if (bufferBit & ctx->Color._DrawDestMask) {
          GLchan *buffer;
          if (bufferBit == FRONT_LEFT_BIT) {
-            buffer = ctx->DrawBuffer->FrontLeftAlpha;
+            buffer = (GLchan *) ctx->DrawBuffer->FrontLeftAlpha;
          }
          else if (bufferBit == FRONT_RIGHT_BIT) {
-            buffer = ctx->DrawBuffer->FrontRightAlpha;
+            buffer = (GLchan *) ctx->DrawBuffer->FrontRightAlpha;
          }
          else if (bufferBit == BACK_LEFT_BIT) {
-            buffer = ctx->DrawBuffer->BackLeftAlpha;
+            buffer = (GLchan *) ctx->DrawBuffer->BackLeftAlpha;
          }
          else {
-            buffer = ctx->DrawBuffer->BackRightAlpha;
+            buffer = (GLchan *) ctx->DrawBuffer->BackRightAlpha;
          }
 
          if (ctx->Scissor.Enabled) {
             /* clear scissor region */
             GLint j;
-            GLint rowLen = ctx->DrawBuffer->_Xmax - ctx->DrawBuffer->_Xmin + 1;
-            GLint rows = ctx->DrawBuffer->_Ymax - ctx->DrawBuffer->_Ymin + 1;
+            GLint rowLen = ctx->DrawBuffer->_Xmax - ctx->DrawBuffer->_Xmin;
+            GLint rows = ctx->DrawBuffer->_Ymax - ctx->DrawBuffer->_Ymin;
             GLint width = ctx->DrawBuffer->Width;
             GLchan *aptr = buffer
                           + ctx->DrawBuffer->_Ymin * ctx->DrawBuffer->Width
@@ -174,7 +143,10 @@ _mesa_clear_alpha_buffers( GLcontext *ctx )
 #elif CHAN_BITS == 16
                MEMSET16( aptr, aclear, rowLen );
 #else
-#error unexpected CHAN_BITS value
+               GLint i;
+               for (i = 0; i < rowLen; i++) {
+                  aptr[i] = aclear;
+               }
 #endif
                aptr += width;
             }
@@ -187,7 +159,10 @@ _mesa_clear_alpha_buffers( GLcontext *ctx )
 #elif CHAN_BITS == 16
             MEMSET16(buffer, aclear, pixels);
 #else
-#error unexpected CHAN_BITS value
+            GLuint i;
+            for (i = 0; i < pixels; i++) {
+               buffer[i] = aclear;
+            }
 #endif
          }
       }
@@ -196,13 +171,41 @@ _mesa_clear_alpha_buffers( GLcontext *ctx )
 
 
 
+static INLINE
+GLchan *get_alpha_buffer( GLcontext *ctx )
+{
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
+
+   switch (swrast->CurrentBuffer) {
+   case FRONT_LEFT_BIT:
+      return (GLchan *) ctx->DrawBuffer->FrontLeftAlpha;
+      break;
+   case BACK_LEFT_BIT:
+      return (GLchan *) ctx->DrawBuffer->BackLeftAlpha;
+      break;
+   case FRONT_RIGHT_BIT:
+      return (GLchan *) ctx->DrawBuffer->FrontRightAlpha;
+      break;
+   case BACK_RIGHT_BIT:
+      return (GLchan *) ctx->DrawBuffer->BackRightAlpha;
+      break;
+   default:
+      _mesa_problem(ctx, "Bad CurrentBuffer in get_alpha_buffer()");
+      return (GLchan *) ctx->DrawBuffer->FrontLeftAlpha;
+   }
+}
+
+
 void
-_mesa_write_alpha_span( GLcontext *ctx, GLuint n, GLint x, GLint y,
+_swrast_write_alpha_span( GLcontext *ctx, GLuint n, GLint x, GLint y,
                         CONST GLchan rgba[][4], const GLubyte mask[] )
 {
-   GLchan *aptr = ALPHA_DRAW_ADDR( x, y );
+   GLchan *buffer, *aptr;
    GLuint i;
 
+   buffer = get_alpha_buffer(ctx);
+   aptr = buffer + y * ctx->DrawBuffer->Width + x;
+
    if (mask) {
       for (i=0;i<n;i++) {
          if (mask[i]) {
@@ -220,12 +223,15 @@ _mesa_write_alpha_span( GLcontext *ctx, GLuint n, GLint x, GLint y,
 
 
 void
-_mesa_write_mono_alpha_span( GLcontext *ctx, GLuint n, GLint x, GLint y,
+_swrast_write_mono_alpha_span( GLcontext *ctx, GLuint n, GLint x, GLint y,
                              GLchan alpha, const GLubyte mask[] )
 {
-   GLchan *aptr = ALPHA_DRAW_ADDR( x, y );
+   GLchan *buffer, *aptr;
    GLuint i;
 
+   buffer = get_alpha_buffer(ctx);
+   aptr = buffer + y * ctx->DrawBuffer->Width + x;
+
    if (mask) {
       for (i=0;i<n;i++) {
          if (mask[i]) {
@@ -243,23 +249,26 @@ _mesa_write_mono_alpha_span( GLcontext *ctx, GLuint n, GLint x, GLint y,
 
 
 void
-_mesa_write_alpha_pixels( GLcontext *ctx,
+_swrast_write_alpha_pixels( GLcontext *ctx,
                           GLuint n, const GLint x[], const GLint y[],
                           CONST GLchan rgba[][4], const GLubyte mask[] )
 {
+   GLchan *buffer;
    GLuint i;
 
+   buffer = get_alpha_buffer(ctx);
+
    if (mask) {
       for (i=0;i<n;i++) {
          if (mask[i]) {
-            GLchan *aptr = ALPHA_DRAW_ADDR( x[i], y[i] );
+            GLchan *aptr = buffer + y[i] * ctx->DrawBuffer->Width + x[i];
             *aptr = rgba[i][ACOMP];
          }
       }
    }
    else {
       for (i=0;i<n;i++) {
-         GLchan *aptr = ALPHA_DRAW_ADDR( x[i], y[i] );
+         GLchan *aptr = buffer + y[i] * ctx->DrawBuffer->Width + x[i];
          *aptr = rgba[i][ACOMP];
       }
    }
@@ -267,23 +276,26 @@ _mesa_write_alpha_pixels( GLcontext *ctx,
 
 
 void
-_mesa_write_mono_alpha_pixels( GLcontext *ctx,
+_swrast_write_mono_alpha_pixels( GLcontext *ctx,
                                GLuint n, const GLint x[], const GLint y[],
                                GLchan alpha, const GLubyte mask[] )
 {
+   GLchan *buffer;
    GLuint i;
 
+   buffer = get_alpha_buffer(ctx);
+
    if (mask) {
       for (i=0;i<n;i++) {
          if (mask[i]) {
-            GLchan *aptr = ALPHA_DRAW_ADDR( x[i], y[i] );
+            GLchan *aptr = buffer + y[i] * ctx->DrawBuffer->Width + x[i];
             *aptr = alpha;
          }
       }
    }
    else {
       for (i=0;i<n;i++) {
-         GLchan *aptr = ALPHA_DRAW_ADDR( x[i], y[i] );
+         GLchan *aptr = buffer + y[i] * ctx->DrawBuffer->Width + x[i];
          *aptr = alpha;
       }
    }
@@ -292,26 +304,33 @@ _mesa_write_mono_alpha_pixels( GLcontext *ctx,
 
 
 void
-_mesa_read_alpha_span( GLcontext *ctx,
+_swrast_read_alpha_span( GLcontext *ctx,
                        GLuint n, GLint x, GLint y, GLchan rgba[][4] )
 {
-   GLchan *aptr = ALPHA_READ_ADDR( x, y );
+   const GLchan *buffer, *aptr;
    GLuint i;
-   for (i=0;i<n;i++) {
+
+   buffer = get_alpha_buffer(ctx);
+   aptr = buffer + y * ctx->DrawBuffer->Width + x;
+
+   for (i = 0; i < n; i++)
       rgba[i][ACOMP] = *aptr++;
-   }
 }
 
 
 void
-_mesa_read_alpha_pixels( GLcontext *ctx,
+_swrast_read_alpha_pixels( GLcontext *ctx,
                          GLuint n, const GLint x[], const GLint y[],
                          GLchan rgba[][4], const GLubyte mask[] )
 {
+   const GLchan *buffer;
    GLuint i;
-   for (i=0;i<n;i++) {
+
+   buffer = get_alpha_buffer(ctx);
+
+   for (i = 0; i < n; i++) {
       if (mask[i]) {
-         GLchan *aptr = ALPHA_READ_ADDR( x[i], y[i] );
+         const GLchan *aptr = buffer + y[i] * ctx->DrawBuffer->Width + x[i];
          rgba[i][ACOMP] = *aptr;
       }
    }