-/* $Id: s_alphabuf.c,v 1.3 2001/01/23 23:39:37 brianp Exp $ */
-
/*
* Mesa 3-D graphics library
- * Version: 3.5
- *
- * Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
- *
+ * Version: 6.1
+ *
+ * Copyright (C) 1999-2004 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"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
- *
+ *
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
- *
+ *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
#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 = (GLchan *) MESA_PBUFFER_ALLOC( bytes );
+ if (!buffer->FrontLeftAlpha) {
/* out of memory */
- gl_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 = (GLchan *) MESA_PBUFFER_ALLOC( bytes );
+ if (!buffer->BackLeftAlpha) {
/* out of memory */
- gl_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 = (GLchan *) MESA_PBUFFER_ALLOC( bytes );
+ if (!buffer->FrontRightAlpha) {
/* out of memory */
- gl_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 = (GLchan *) MESA_PBUFFER_ALLOC( bytes );
+ if (!buffer->BackRightAlpha) {
/* out of memory */
- gl_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 );
- }
}
* Clear all the alpha buffers
*/
void
-_mesa_clear_alpha_buffers( GLcontext *ctx )
+_swrast_clear_alpha_buffers( GLcontext *ctx )
{
- const GLchan aclear = (GLint) (ctx->Color.ClearColor[3] * CHAN_MAXF);
+ 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;
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
+ ctx->DrawBuffer->_Xmin;
#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 += rowLen;
+ aptr += width;
}
}
else {
/* clear whole buffer */
- GLuint bytes = ctx->DrawBuffer->Width * ctx->DrawBuffer->Height;
- MEMSET( buffer, aclear, bytes );
+ GLuint pixels = ctx->DrawBuffer->Width * ctx->DrawBuffer->Height;
+#if CHAN_BITS == 8
+ MEMSET(buffer, aclear, pixels);
+#elif CHAN_BITS == 16
+ MEMSET16(buffer, aclear, pixels);
+#else
+ GLuint i;
+ for (i = 0; i < pixels; i++) {
+ buffer[i] = aclear;
+ }
+#endif
}
}
}
+static INLINE
+GLchan *get_alpha_buffer( GLcontext *ctx )
+{
+ SWcontext *swrast = SWRAST_CONTEXT(ctx);
+
+ switch (swrast->CurrentBuffer) {
+ case FRONT_LEFT_BIT:
+ return ctx->DrawBuffer->FrontLeftAlpha;
+ break;
+ case BACK_LEFT_BIT:
+ return ctx->DrawBuffer->BackLeftAlpha;
+ break;
+ case FRONT_RIGHT_BIT:
+ return ctx->DrawBuffer->FrontRightAlpha;
+ break;
+ case BACK_RIGHT_BIT:
+ return 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]) {
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]) {
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];
}
}
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;
}
}
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;
}
}
}
-
-
-