s_blend.c revision ae7666385d6bb2885fce2590d4f07c6caa8b3260
1e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 2e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Mesa 3-D graphics library 3ae7666385d6bb2885fce2590d4f07c6caa8b3260Brian Paul * Version: 6.0 422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * 5ae7666385d6bb2885fce2590d4f07c6caa8b3260Brian Paul * Copyright (C) 1999-2004 Brian Paul All Rights Reserved. 622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * 7e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 8e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * copy of this software and associated documentation files (the "Software"), 9e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * to deal in the Software without restriction, including without limitation 10e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * and/or sell copies of the Software, and to permit persons to whom the 12e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Software is furnished to do so, subject to the following conditions: 1322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * 14e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * The above copyright notice and this permission notice shall be included 15e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * in all copies or substantial portions of the Software. 1622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * 17e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 24e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 25ae7666385d6bb2885fce2590d4f07c6caa8b3260Brian Paul/* 26ae7666385d6bb2885fce2590d4f07c6caa8b3260Brian Paul * Regarding GL_NV_blend_square: 27ae7666385d6bb2885fce2590d4f07c6caa8b3260Brian Paul * 28ae7666385d6bb2885fce2590d4f07c6caa8b3260Brian Paul * Portions of this software may use or implement intellectual 29ae7666385d6bb2885fce2590d4f07c6caa8b3260Brian Paul * property owned and licensed by NVIDIA Corporation. NVIDIA disclaims 30ae7666385d6bb2885fce2590d4f07c6caa8b3260Brian Paul * any and all warranties with respect to such intellectual property, 31ae7666385d6bb2885fce2590d4f07c6caa8b3260Brian Paul * including any use thereof or modifications thereto. 32ae7666385d6bb2885fce2590d4f07c6caa8b3260Brian Paul */ 33e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 34e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 35e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "glheader.h" 36e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "context.h" 376b50a004ffb885dd86dd611979348bdf69b1151cBrian Paul#include "colormac.h" 38e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "macros.h" 39e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 40e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_alphabuf.h" 41e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_blend.h" 42cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#include "s_context.h" 43e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_span.h" 44e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 45e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 46cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#if defined(USE_MMX_ASM) 475f3439916b74ed792ad12d1e614a2a5bc0a94b3aBrian Paul#include "x86/mmx.h" 485f3439916b74ed792ad12d1e614a2a5bc0a94b3aBrian Paul#include "x86/common_x86_asm.h" 49e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define _BLENDAPI _ASMAPI 50e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#else 51e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define _BLENDAPI 52e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 53e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 54cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell 55e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 5659235bd5da794557613463bc942de0c634d2d961Brian Paul * Special case for glBlendFunc(GL_ZERO, GL_ONE) 5759235bd5da794557613463bc942de0c634d2d961Brian Paul */ 5859235bd5da794557613463bc942de0c634d2d961Brian Paulstatic void _BLENDAPI 5959235bd5da794557613463bc942de0c634d2d961Brian Paulblend_noop( GLcontext *ctx, GLuint n, const GLubyte mask[], 6059235bd5da794557613463bc942de0c634d2d961Brian Paul GLchan rgba[][4], CONST GLchan dest[][4] ) 6159235bd5da794557613463bc942de0c634d2d961Brian Paul{ 6212a1024d9d003afe1212cc48af04dac81c034299Karl Schultz GLuint i; 6359235bd5da794557613463bc942de0c634d2d961Brian Paul ASSERT(ctx->Color.BlendEquation==GL_FUNC_ADD_EXT); 6459235bd5da794557613463bc942de0c634d2d961Brian Paul ASSERT(ctx->Color.BlendSrcRGB==GL_ZERO); 6559235bd5da794557613463bc942de0c634d2d961Brian Paul ASSERT(ctx->Color.BlendDstRGB==GL_ONE); 6659235bd5da794557613463bc942de0c634d2d961Brian Paul (void) ctx; 6759235bd5da794557613463bc942de0c634d2d961Brian Paul 6859235bd5da794557613463bc942de0c634d2d961Brian Paul for (i = 0; i < n; i++) { 6959235bd5da794557613463bc942de0c634d2d961Brian Paul if (mask[i]) { 706b50a004ffb885dd86dd611979348bdf69b1151cBrian Paul COPY_CHAN4( rgba[i], dest[i] ); 7159235bd5da794557613463bc942de0c634d2d961Brian Paul } 7259235bd5da794557613463bc942de0c634d2d961Brian Paul } 7359235bd5da794557613463bc942de0c634d2d961Brian Paul} 7459235bd5da794557613463bc942de0c634d2d961Brian Paul 7559235bd5da794557613463bc942de0c634d2d961Brian Paul 7659235bd5da794557613463bc942de0c634d2d961Brian Paul/* 7759235bd5da794557613463bc942de0c634d2d961Brian Paul * Special case for glBlendFunc(GL_ONE, GL_ZERO) 7859235bd5da794557613463bc942de0c634d2d961Brian Paul */ 7959235bd5da794557613463bc942de0c634d2d961Brian Paulstatic void _BLENDAPI 8059235bd5da794557613463bc942de0c634d2d961Brian Paulblend_replace( GLcontext *ctx, GLuint n, const GLubyte mask[], 8159235bd5da794557613463bc942de0c634d2d961Brian Paul GLchan rgba[][4], CONST GLchan dest[][4] ) 8259235bd5da794557613463bc942de0c634d2d961Brian Paul{ 8359235bd5da794557613463bc942de0c634d2d961Brian Paul ASSERT(ctx->Color.BlendEquation==GL_FUNC_ADD_EXT); 8459235bd5da794557613463bc942de0c634d2d961Brian Paul ASSERT(ctx->Color.BlendSrcRGB==GL_ONE); 8559235bd5da794557613463bc942de0c634d2d961Brian Paul ASSERT(ctx->Color.BlendDstRGB==GL_ZERO); 8659235bd5da794557613463bc942de0c634d2d961Brian Paul (void) ctx; 8759235bd5da794557613463bc942de0c634d2d961Brian Paul (void) n; 8859235bd5da794557613463bc942de0c634d2d961Brian Paul (void) mask; 8959235bd5da794557613463bc942de0c634d2d961Brian Paul (void) rgba; 9059235bd5da794557613463bc942de0c634d2d961Brian Paul (void) dest; 9159235bd5da794557613463bc942de0c634d2d961Brian Paul} 9259235bd5da794557613463bc942de0c634d2d961Brian Paul 9359235bd5da794557613463bc942de0c634d2d961Brian Paul 9459235bd5da794557613463bc942de0c634d2d961Brian Paul/* 95e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Common transparency blending mode. 96e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 97e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void _BLENDAPI 98e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellblend_transparency( GLcontext *ctx, GLuint n, const GLubyte mask[], 99e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan rgba[][4], CONST GLchan dest[][4] ) 100e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 101e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 102e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT(ctx->Color.BlendEquation==GL_FUNC_ADD_EXT); 103e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT(ctx->Color.BlendSrcRGB==GL_SRC_ALPHA); 104e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT(ctx->Color.BlendDstRGB==GL_ONE_MINUS_SRC_ALPHA); 105e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (void) ctx; 106e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 107e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 108e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 10910d343f407bddf011be3d2b79a6541815759785aBrian Paul const GLchan t = rgba[i][ACOMP]; /* t in [0, CHAN_MAX] */ 110e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (t == 0) { 111e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* 0% alpha */ 112e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][RCOMP] = dest[i][RCOMP]; 113e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][GCOMP] = dest[i][GCOMP]; 114e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][BCOMP] = dest[i][BCOMP]; 115e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][ACOMP] = dest[i][ACOMP]; 116e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 117e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else if (t == CHAN_MAX) { 118e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* 100% alpha, no-op */ 119e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 120e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 121e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#if 0 122e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* This is pretty close, but Glean complains */ 123e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint s = CHAN_MAX - t; 124e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint r = (rgba[i][RCOMP] * t + dest[i][RCOMP] * s + 1) >> 8; 125e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint g = (rgba[i][GCOMP] * t + dest[i][GCOMP] * s + 1) >> 8; 126e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint b = (rgba[i][BCOMP] * t + dest[i][BCOMP] * s + 1) >> 8; 127e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint a = (rgba[i][ACOMP] * t + dest[i][ACOMP] * s + 1) >> 8; 128e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#elif 0 129e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* This is slower but satisfies Glean */ 130e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint s = CHAN_MAX - t; 131e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint r = (rgba[i][RCOMP] * t + dest[i][RCOMP] * s) / 255; 132e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint g = (rgba[i][GCOMP] * t + dest[i][GCOMP] * s) / 255; 133e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint b = (rgba[i][BCOMP] * t + dest[i][BCOMP] * s) / 255; 134e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLint a = (rgba[i][ACOMP] * t + dest[i][ACOMP] * s) / 255; 135e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#else 136e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#if CHAN_BITS == 8 137e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* This satisfies Glean and should be reasonably fast */ 138e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Contributed by Nathan Hand */ 13917b7cc4caeeb8f3daaf417d417e7e3a9a5d639d1Brian Paul#if 0 140e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DIV255(X) (((X) << 8) + (X) + 256) >> 16 14117b7cc4caeeb8f3daaf417d417e7e3a9a5d639d1Brian Paul#else 14217b7cc4caeeb8f3daaf417d417e7e3a9a5d639d1Brian Paul GLint temp; 14317b7cc4caeeb8f3daaf417d417e7e3a9a5d639d1Brian Paul#define DIV255(X) (temp = (X), ((temp << 8) + temp + 256) >> 16) 14417b7cc4caeeb8f3daaf417d417e7e3a9a5d639d1Brian Paul#endif 14517b7cc4caeeb8f3daaf417d417e7e3a9a5d639d1Brian Paul const GLint r = DIV255((rgba[i][RCOMP] - dest[i][RCOMP]) * t) + dest[i][RCOMP]; 14617b7cc4caeeb8f3daaf417d417e7e3a9a5d639d1Brian Paul const GLint g = DIV255((rgba[i][GCOMP] - dest[i][GCOMP]) * t) + dest[i][GCOMP]; 14717b7cc4caeeb8f3daaf417d417e7e3a9a5d639d1Brian Paul const GLint b = DIV255((rgba[i][BCOMP] - dest[i][BCOMP]) * t) + dest[i][BCOMP]; 14817b7cc4caeeb8f3daaf417d417e7e3a9a5d639d1Brian Paul const GLint a = DIV255((rgba[i][ACOMP] - dest[i][ACOMP]) * t) + dest[i][ACOMP]; 1496b50a004ffb885dd86dd611979348bdf69b1151cBrian Paul 150e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef DIV255 15101915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul#elif CHAN_BITS == 16 15201915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul const GLfloat tt = (GLfloat) t / CHAN_MAXF; 153b63e8556fa9655bdfcc69fa04663e854f7fb2fbdBrian Paul const GLint r = (GLint) ((rgba[i][RCOMP] - dest[i][RCOMP]) * tt + dest[i][RCOMP]); 154b63e8556fa9655bdfcc69fa04663e854f7fb2fbdBrian Paul const GLint g = (GLint) ((rgba[i][GCOMP] - dest[i][GCOMP]) * tt + dest[i][GCOMP]); 155b63e8556fa9655bdfcc69fa04663e854f7fb2fbdBrian Paul const GLint b = (GLint) ((rgba[i][BCOMP] - dest[i][BCOMP]) * tt + dest[i][BCOMP]); 156b63e8556fa9655bdfcc69fa04663e854f7fb2fbdBrian Paul const GLint a = (GLint) ((rgba[i][ACOMP] - dest[i][ACOMP]) * tt + dest[i][ACOMP]); 15701915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul#else /* CHAN_BITS == 32 */ 15801915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul const GLfloat tt = (GLfloat) t / CHAN_MAXF; 159b63e8556fa9655bdfcc69fa04663e854f7fb2fbdBrian Paul const GLfloat r = (rgba[i][RCOMP] - dest[i][RCOMP]) * tt + dest[i][RCOMP]; 160b63e8556fa9655bdfcc69fa04663e854f7fb2fbdBrian Paul const GLfloat g = (rgba[i][GCOMP] - dest[i][GCOMP]) * tt + dest[i][GCOMP]; 161b63e8556fa9655bdfcc69fa04663e854f7fb2fbdBrian Paul const GLfloat b = (rgba[i][BCOMP] - dest[i][BCOMP]) * tt + dest[i][BCOMP]; 16210d343f407bddf011be3d2b79a6541815759785aBrian Paul const GLfloat a = CLAMP( rgba[i][ACOMP], 0.0F, CHAN_MAXF ) * t + 16310d343f407bddf011be3d2b79a6541815759785aBrian Paul CLAMP( dest[i][ACOMP], 0.0F, CHAN_MAXF ) * (1.0F - t); 164e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 165e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif 166e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT(r <= CHAN_MAX); 167e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT(g <= CHAN_MAX); 168e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT(b <= CHAN_MAX); 169e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT(a <= CHAN_MAX); 170e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][RCOMP] = (GLchan) r; 171e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][GCOMP] = (GLchan) g; 172e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][BCOMP] = (GLchan) b; 173e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][ACOMP] = (GLchan) a; 174e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 175e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 176e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 177e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 178e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 179e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 180e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 181e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 182e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Add src and dest. 183e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 184e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void _BLENDAPI 185e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellblend_add( GLcontext *ctx, GLuint n, const GLubyte mask[], 186e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan rgba[][4], CONST GLchan dest[][4] ) 187e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 188e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 189e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT(ctx->Color.BlendEquation==GL_FUNC_ADD_EXT); 190e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT(ctx->Color.BlendSrcRGB==GL_ONE); 191e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT(ctx->Color.BlendDstRGB==GL_ONE); 192e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (void) ctx; 193e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 194e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 195e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 1966b50a004ffb885dd86dd611979348bdf69b1151cBrian Paul#if CHAN_TYPE == GL_FLOAT 19710d343f407bddf011be3d2b79a6541815759785aBrian Paul /* don't RGB clamp to max */ 19810d343f407bddf011be3d2b79a6541815759785aBrian Paul GLfloat a = CLAMP(rgba[i][ACOMP], 0.0F, CHAN_MAXF) + dest[i][ACOMP]; 19910d343f407bddf011be3d2b79a6541815759785aBrian Paul rgba[i][RCOMP] += dest[i][RCOMP]; 20010d343f407bddf011be3d2b79a6541815759785aBrian Paul rgba[i][GCOMP] += dest[i][GCOMP]; 20110d343f407bddf011be3d2b79a6541815759785aBrian Paul rgba[i][BCOMP] += dest[i][BCOMP]; 2026b50a004ffb885dd86dd611979348bdf69b1151cBrian Paul rgba[i][ACOMP] = (GLchan) MIN2( a, CHAN_MAXF ); 2036b50a004ffb885dd86dd611979348bdf69b1151cBrian Paul#else 204e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint r = rgba[i][RCOMP] + dest[i][RCOMP]; 205e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint g = rgba[i][GCOMP] + dest[i][GCOMP]; 206e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint b = rgba[i][BCOMP] + dest[i][BCOMP]; 207e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint a = rgba[i][ACOMP] + dest[i][ACOMP]; 208e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][RCOMP] = (GLchan) MIN2( r, CHAN_MAX ); 209e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][GCOMP] = (GLchan) MIN2( g, CHAN_MAX ); 210e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][BCOMP] = (GLchan) MIN2( b, CHAN_MAX ); 211e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][ACOMP] = (GLchan) MIN2( a, CHAN_MAX ); 2126b50a004ffb885dd86dd611979348bdf69b1151cBrian Paul#endif 213e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 214e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 215e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 216e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 217e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 218e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 219e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 220e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Blend min function (for GL_EXT_blend_minmax) 221e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 222e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void _BLENDAPI 223e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellblend_min( GLcontext *ctx, GLuint n, const GLubyte mask[], 224e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan rgba[][4], CONST GLchan dest[][4] ) 225e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 226e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 227e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT(ctx->Color.BlendEquation==GL_MIN_EXT); 228e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (void) ctx; 229e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 230e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 231e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 232e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][RCOMP] = (GLchan) MIN2( rgba[i][RCOMP], dest[i][RCOMP] ); 233e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][GCOMP] = (GLchan) MIN2( rgba[i][GCOMP], dest[i][GCOMP] ); 234e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][BCOMP] = (GLchan) MIN2( rgba[i][BCOMP], dest[i][BCOMP] ); 23510d343f407bddf011be3d2b79a6541815759785aBrian Paul#if CHAN_TYPE == GL_FLOAT 23610d343f407bddf011be3d2b79a6541815759785aBrian Paul rgba[i][ACOMP] = (GLchan) MIN2(CLAMP(rgba[i][ACOMP], 0.0F, CHAN_MAXF), 23710d343f407bddf011be3d2b79a6541815759785aBrian Paul dest[i][ACOMP]); 23810d343f407bddf011be3d2b79a6541815759785aBrian Paul#else 239e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][ACOMP] = (GLchan) MIN2( rgba[i][ACOMP], dest[i][ACOMP] ); 24010d343f407bddf011be3d2b79a6541815759785aBrian Paul#endif 241e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 242e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 243e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 244e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 245e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 246e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 247e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 248e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Blend max function (for GL_EXT_blend_minmax) 249e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 250e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void _BLENDAPI 251e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellblend_max( GLcontext *ctx, GLuint n, const GLubyte mask[], 252e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan rgba[][4], CONST GLchan dest[][4] ) 253e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 254e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 255e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT(ctx->Color.BlendEquation==GL_MAX_EXT); 256e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (void) ctx; 257e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 258e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 259e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 260e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][RCOMP] = (GLchan) MAX2( rgba[i][RCOMP], dest[i][RCOMP] ); 261e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][GCOMP] = (GLchan) MAX2( rgba[i][GCOMP], dest[i][GCOMP] ); 262e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][BCOMP] = (GLchan) MAX2( rgba[i][BCOMP], dest[i][BCOMP] ); 26310d343f407bddf011be3d2b79a6541815759785aBrian Paul#if CHAN_TYPE == GL_FLOAT 26410d343f407bddf011be3d2b79a6541815759785aBrian Paul rgba[i][ACOMP] = (GLchan) MAX2(CLAMP(rgba[i][ACOMP], 0.0F, CHAN_MAXF), 26510d343f407bddf011be3d2b79a6541815759785aBrian Paul dest[i][ACOMP]); 26610d343f407bddf011be3d2b79a6541815759785aBrian Paul#else 267e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][ACOMP] = (GLchan) MAX2( rgba[i][ACOMP], dest[i][ACOMP] ); 26810d343f407bddf011be3d2b79a6541815759785aBrian Paul#endif 269e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 270e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 271e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 272e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 273e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 274e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 275e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 276e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Modulate: result = src * dest 277e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 278e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void _BLENDAPI 279e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellblend_modulate( GLcontext *ctx, GLuint n, const GLubyte mask[], 280e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan rgba[][4], CONST GLchan dest[][4] ) 281e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 282e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 283e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell (void) ctx; 284e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 285e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 286e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 287f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul#if CHAN_TYPE == GL_FLOAT 288f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul rgba[i][RCOMP] = rgba[i][RCOMP] * dest[i][RCOMP]; 289f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul rgba[i][GCOMP] = rgba[i][GCOMP] * dest[i][GCOMP]; 290f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul rgba[i][BCOMP] = rgba[i][BCOMP] * dest[i][BCOMP]; 291f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul rgba[i][ACOMP] = rgba[i][ACOMP] * dest[i][ACOMP]; 292d5c94ef40d9dfef9ad4ecaa56218150f903014e3Brian Paul#elif CHAN_TYPE == GL_UNSIGNED_SHORT 293d5c94ef40d9dfef9ad4ecaa56218150f903014e3Brian Paul GLint r = (rgba[i][RCOMP] * dest[i][RCOMP] + 65535) >> 16; 294d5c94ef40d9dfef9ad4ecaa56218150f903014e3Brian Paul GLint g = (rgba[i][GCOMP] * dest[i][GCOMP] + 65535) >> 16; 295d5c94ef40d9dfef9ad4ecaa56218150f903014e3Brian Paul GLint b = (rgba[i][BCOMP] * dest[i][BCOMP] + 65535) >> 16; 296d5c94ef40d9dfef9ad4ecaa56218150f903014e3Brian Paul GLint a = (rgba[i][ACOMP] * dest[i][ACOMP] + 65535) >> 16; 297d5c94ef40d9dfef9ad4ecaa56218150f903014e3Brian Paul rgba[i][RCOMP] = (GLchan) r; 298d5c94ef40d9dfef9ad4ecaa56218150f903014e3Brian Paul rgba[i][GCOMP] = (GLchan) g; 299d5c94ef40d9dfef9ad4ecaa56218150f903014e3Brian Paul rgba[i][BCOMP] = (GLchan) b; 300d5c94ef40d9dfef9ad4ecaa56218150f903014e3Brian Paul rgba[i][ACOMP] = (GLchan) a; 301f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul#else 302d5c94ef40d9dfef9ad4ecaa56218150f903014e3Brian Paul GLint r = (rgba[i][RCOMP] * dest[i][RCOMP] + 255) >> 8; 303d5c94ef40d9dfef9ad4ecaa56218150f903014e3Brian Paul GLint g = (rgba[i][GCOMP] * dest[i][GCOMP] + 255) >> 8; 304d5c94ef40d9dfef9ad4ecaa56218150f903014e3Brian Paul GLint b = (rgba[i][BCOMP] * dest[i][BCOMP] + 255) >> 8; 305d5c94ef40d9dfef9ad4ecaa56218150f903014e3Brian Paul GLint a = (rgba[i][ACOMP] * dest[i][ACOMP] + 255) >> 8; 306e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][RCOMP] = (GLchan) r; 307e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][GCOMP] = (GLchan) g; 308e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][BCOMP] = (GLchan) b; 309e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][ACOMP] = (GLchan) a; 310f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul#endif 311e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 312e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 313e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 314e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 315e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 316e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 317e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 318e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * General case blend pixels. 319e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Input: n - number of pixels 320e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * mask - the usual write mask 321e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * In/Out: rgba - the incoming and modified pixels 322e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Input: dest - the pixels from the dest color buffer 323e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 324e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void _BLENDAPI 325e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellblend_general( GLcontext *ctx, GLuint n, const GLubyte mask[], 326e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLchan rgba[][4], CONST GLchan dest[][4] ) 327e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 32810d343f407bddf011be3d2b79a6541815759785aBrian Paul const GLfloat rscale = 1.0F / CHAN_MAXF; 32910d343f407bddf011be3d2b79a6541815759785aBrian Paul const GLfloat gscale = 1.0F / CHAN_MAXF; 33010d343f407bddf011be3d2b79a6541815759785aBrian Paul const GLfloat bscale = 1.0F / CHAN_MAXF; 33110d343f407bddf011be3d2b79a6541815759785aBrian Paul const GLfloat ascale = 1.0F / CHAN_MAXF; 332e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 333e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 334e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 335e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 336e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul#if CHAN_TYPE == GL_FLOAT 337e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul GLfloat Rs, Gs, Bs, As; /* Source colors */ 338e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul GLfloat Rd, Gd, Bd, Ad; /* Dest colors */ 339e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul#else 340e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint Rs, Gs, Bs, As; /* Source colors */ 341e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint Rd, Gd, Bd, Ad; /* Dest colors */ 342e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul#endif 343e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat sR, sG, sB, sA; /* Source scaling */ 344e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLfloat dR, dG, dB, dA; /* Dest scaling */ 34510d343f407bddf011be3d2b79a6541815759785aBrian Paul GLfloat r, g, b, a; /* result color */ 346e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 34710d343f407bddf011be3d2b79a6541815759785aBrian Paul /* Incoming/source Color */ 348e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell Rs = rgba[i][RCOMP]; 349e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell Gs = rgba[i][GCOMP]; 350e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell Bs = rgba[i][BCOMP]; 351e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell As = rgba[i][ACOMP]; 35210d343f407bddf011be3d2b79a6541815759785aBrian Paul#if CHAN_TYPE == GL_FLOAT 35310d343f407bddf011be3d2b79a6541815759785aBrian Paul /* clamp */ 35410d343f407bddf011be3d2b79a6541815759785aBrian Paul Rs = MIN2(Rs, CHAN_MAXF); 35510d343f407bddf011be3d2b79a6541815759785aBrian Paul Gs = MIN2(Gs, CHAN_MAXF); 35610d343f407bddf011be3d2b79a6541815759785aBrian Paul Bs = MIN2(Bs, CHAN_MAXF); 35710d343f407bddf011be3d2b79a6541815759785aBrian Paul As = MIN2(As, CHAN_MAXF); 35810d343f407bddf011be3d2b79a6541815759785aBrian Paul#endif 359e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 36010d343f407bddf011be3d2b79a6541815759785aBrian Paul /* Frame buffer/dest color */ 361e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell Rd = dest[i][RCOMP]; 362e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell Gd = dest[i][GCOMP]; 363e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell Bd = dest[i][BCOMP]; 364e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell Ad = dest[i][ACOMP]; 36510d343f407bddf011be3d2b79a6541815759785aBrian Paul#if CHAN_TYPE == GL_FLOAT 36610d343f407bddf011be3d2b79a6541815759785aBrian Paul /* clamp */ 36710d343f407bddf011be3d2b79a6541815759785aBrian Paul Rd = MIN2(Rd, CHAN_MAXF); 36810d343f407bddf011be3d2b79a6541815759785aBrian Paul Gd = MIN2(Gd, CHAN_MAXF); 36910d343f407bddf011be3d2b79a6541815759785aBrian Paul Bd = MIN2(Bd, CHAN_MAXF); 37010d343f407bddf011be3d2b79a6541815759785aBrian Paul Ad = MIN2(Ad, CHAN_MAXF); 37110d343f407bddf011be3d2b79a6541815759785aBrian Paul#endif 372e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 373e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Source RGB factor */ 374e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (ctx->Color.BlendSrcRGB) { 375e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ZERO: 376e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sR = sG = sB = 0.0F; 377e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 378e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE: 379e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sR = sG = sB = 1.0F; 380e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 381e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DST_COLOR: 382e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sR = (GLfloat) Rd * rscale; 383e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sG = (GLfloat) Gd * gscale; 384e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sB = (GLfloat) Bd * bscale; 385e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 386e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE_MINUS_DST_COLOR: 387e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sR = 1.0F - (GLfloat) Rd * rscale; 388e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sG = 1.0F - (GLfloat) Gd * gscale; 389e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sB = 1.0F - (GLfloat) Bd * bscale; 390e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 391e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_SRC_ALPHA: 392e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sR = sG = sB = (GLfloat) As * ascale; 393e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 394e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE_MINUS_SRC_ALPHA: 39510d343f407bddf011be3d2b79a6541815759785aBrian Paul sR = sG = sB = 1.0F - (GLfloat) As * ascale; 396e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 397e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DST_ALPHA: 398e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sR = sG = sB = (GLfloat) Ad * ascale; 399e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 400e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE_MINUS_DST_ALPHA: 401e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sR = sG = sB = 1.0F - (GLfloat) Ad * ascale; 402e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 403e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_SRC_ALPHA_SATURATE: 404e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (As < CHAN_MAX - Ad) { 405e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sR = sG = sB = (GLfloat) As * ascale; 406e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 407e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 408e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sR = sG = sB = 1.0F - (GLfloat) Ad * ascale; 409e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 410e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 411e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_CONSTANT_COLOR: 412e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sR = ctx->Color.BlendColor[0]; 413e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sG = ctx->Color.BlendColor[1]; 414e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sB = ctx->Color.BlendColor[2]; 415e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 416e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE_MINUS_CONSTANT_COLOR: 417e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sR = 1.0F - ctx->Color.BlendColor[0]; 418e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sG = 1.0F - ctx->Color.BlendColor[1]; 419e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sB = 1.0F - ctx->Color.BlendColor[2]; 420e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 421e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_CONSTANT_ALPHA: 422e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sR = sG = sB = ctx->Color.BlendColor[3]; 423e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 424e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE_MINUS_CONSTANT_ALPHA: 425e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sR = sG = sB = 1.0F - ctx->Color.BlendColor[3]; 426e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 427e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_SRC_COLOR: /* GL_NV_blend_square */ 428e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sR = (GLfloat) Rs * rscale; 429e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sG = (GLfloat) Gs * gscale; 430e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sB = (GLfloat) Bs * bscale; 431e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 432e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE_MINUS_SRC_COLOR: /* GL_NV_blend_square */ 433e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sR = 1.0F - (GLfloat) Rs * rscale; 434e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sG = 1.0F - (GLfloat) Gs * gscale; 435e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sB = 1.0F - (GLfloat) Bs * bscale; 436e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 437e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: 438e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* this should never happen */ 43908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "Bad blend source RGB factor in do_blend"); 44059235bd5da794557613463bc942de0c634d2d961Brian Paul return; 441e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 442e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 443e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Source Alpha factor */ 444e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (ctx->Color.BlendSrcA) { 445e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ZERO: 446e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sA = 0.0F; 447e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 448e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE: 449e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sA = 1.0F; 450e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 451e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DST_COLOR: 452e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sA = (GLfloat) Ad * ascale; 453e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 454e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE_MINUS_DST_COLOR: 455e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sA = 1.0F - (GLfloat) Ad * ascale; 456e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 457e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_SRC_ALPHA: 458e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sA = (GLfloat) As * ascale; 459e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 460e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE_MINUS_SRC_ALPHA: 46110d343f407bddf011be3d2b79a6541815759785aBrian Paul sA = 1.0F - (GLfloat) As * ascale; 462e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 463e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DST_ALPHA: 464e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sA =(GLfloat) Ad * ascale; 465e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 466e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE_MINUS_DST_ALPHA: 467e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sA = 1.0F - (GLfloat) Ad * ascale; 468e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 469e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_SRC_ALPHA_SATURATE: 470e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sA = 1.0; 471e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 472e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_CONSTANT_COLOR: 473e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sA = ctx->Color.BlendColor[3]; 474e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 475e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE_MINUS_CONSTANT_COLOR: 476e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sA = 1.0F - ctx->Color.BlendColor[3]; 477e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 478e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_CONSTANT_ALPHA: 479e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sA = ctx->Color.BlendColor[3]; 480e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 481e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE_MINUS_CONSTANT_ALPHA: 482e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sA = 1.0F - ctx->Color.BlendColor[3]; 483e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 484e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_SRC_COLOR: /* GL_NV_blend_square */ 485e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sA = (GLfloat) As * ascale; 486e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 487e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE_MINUS_SRC_COLOR: /* GL_NV_blend_square */ 488e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sA = 1.0F - (GLfloat) As * ascale; 489e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 490e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: 491e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* this should never happen */ 492e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell sA = 0.0F; 49308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "Bad blend source A factor in do_blend"); 494e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 495e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 496e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Dest RGB factor */ 497e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (ctx->Color.BlendDstRGB) { 498e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ZERO: 499e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dR = dG = dB = 0.0F; 500e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 501e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE: 502e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dR = dG = dB = 1.0F; 503e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 504e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_SRC_COLOR: 505e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dR = (GLfloat) Rs * rscale; 506e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dG = (GLfloat) Gs * gscale; 507e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dB = (GLfloat) Bs * bscale; 508e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 509e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE_MINUS_SRC_COLOR: 510e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dR = 1.0F - (GLfloat) Rs * rscale; 511e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dG = 1.0F - (GLfloat) Gs * gscale; 512e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dB = 1.0F - (GLfloat) Bs * bscale; 513e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 514e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_SRC_ALPHA: 515e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dR = dG = dB = (GLfloat) As * ascale; 516e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 517e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE_MINUS_SRC_ALPHA: 51810d343f407bddf011be3d2b79a6541815759785aBrian Paul dR = dG = dB = 1.0F - (GLfloat) As * ascale; 519e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 520e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DST_ALPHA: 521e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dR = dG = dB = (GLfloat) Ad * ascale; 522e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 523e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE_MINUS_DST_ALPHA: 524e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dR = dG = dB = 1.0F - (GLfloat) Ad * ascale; 525e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 526e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_CONSTANT_COLOR: 527e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dR = ctx->Color.BlendColor[0]; 528e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dG = ctx->Color.BlendColor[1]; 529e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dB = ctx->Color.BlendColor[2]; 530e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 531e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE_MINUS_CONSTANT_COLOR: 532e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dR = 1.0F - ctx->Color.BlendColor[0]; 533e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dG = 1.0F - ctx->Color.BlendColor[1]; 534e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dB = 1.0F - ctx->Color.BlendColor[2]; 535e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 536e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_CONSTANT_ALPHA: 537e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dR = dG = dB = ctx->Color.BlendColor[3]; 538e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 539e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE_MINUS_CONSTANT_ALPHA: 540e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dR = dG = dB = 1.0F - ctx->Color.BlendColor[3]; 541e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 542e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DST_COLOR: /* GL_NV_blend_square */ 543e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dR = (GLfloat) Rd * rscale; 544e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dG = (GLfloat) Gd * gscale; 545e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dB = (GLfloat) Bd * bscale; 546e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 547e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE_MINUS_DST_COLOR: /* GL_NV_blend_square */ 548e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dR = 1.0F - (GLfloat) Rd * rscale; 549e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dG = 1.0F - (GLfloat) Gd * gscale; 550e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dB = 1.0F - (GLfloat) Bd * bscale; 551e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 552e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: 553e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* this should never happen */ 554e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dR = dG = dB = 0.0F; 55508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "Bad blend dest RGB factor in do_blend"); 556e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 557e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 558e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Dest Alpha factor */ 559e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (ctx->Color.BlendDstA) { 560e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ZERO: 561e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dA = 0.0F; 562e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 563e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE: 564e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dA = 1.0F; 565e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 566e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_SRC_COLOR: 567e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dA = (GLfloat) As * ascale; 568e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 569e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE_MINUS_SRC_COLOR: 570e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dA = 1.0F - (GLfloat) As * ascale; 571e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 572e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_SRC_ALPHA: 573e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dA = (GLfloat) As * ascale; 574e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 575e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE_MINUS_SRC_ALPHA: 57610d343f407bddf011be3d2b79a6541815759785aBrian Paul dA = 1.0F - (GLfloat) As * ascale; 577e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 578e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DST_ALPHA: 579e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dA = (GLfloat) Ad * ascale; 580e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 581e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE_MINUS_DST_ALPHA: 582e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dA = 1.0F - (GLfloat) Ad * ascale; 583e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 584e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_CONSTANT_COLOR: 585e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dA = ctx->Color.BlendColor[3]; 586e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 587e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE_MINUS_CONSTANT_COLOR: 588e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dA = 1.0F - ctx->Color.BlendColor[3]; 589e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 590e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_CONSTANT_ALPHA: 591e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dA = ctx->Color.BlendColor[3]; 592e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 593e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE_MINUS_CONSTANT_ALPHA: 594e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dA = 1.0F - ctx->Color.BlendColor[3]; 595e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 596e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_DST_COLOR: /* GL_NV_blend_square */ 597e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dA = (GLfloat) Ad * ascale; 598e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 599e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ONE_MINUS_DST_COLOR: /* GL_NV_blend_square */ 600e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dA = 1.0F - (GLfloat) Ad * ascale; 601e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 602e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: 603e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* this should never happen */ 604e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell dA = 0.0F; 60508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "Bad blend dest A factor in do_blend"); 60659235bd5da794557613463bc942de0c634d2d961Brian Paul return; 607e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 608e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 609e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Due to round-off problems we have to clamp against zero. */ 610e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Optimization: we don't have to do this for all src & dst factors */ 611e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (dA < 0.0F) dA = 0.0F; 612e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (dR < 0.0F) dR = 0.0F; 613e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (dG < 0.0F) dG = 0.0F; 614e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (dB < 0.0F) dB = 0.0F; 615e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (sA < 0.0F) sA = 0.0F; 616e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (sR < 0.0F) sR = 0.0F; 617e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (sG < 0.0F) sG = 0.0F; 618e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (sB < 0.0F) sB = 0.0F; 619e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 620e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT( sR <= 1.0 ); 621e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT( sG <= 1.0 ); 622e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT( sB <= 1.0 ); 623e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT( sA <= 1.0 ); 624e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT( dR <= 1.0 ); 625e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT( dG <= 1.0 ); 626e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT( dB <= 1.0 ); 627e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell ASSERT( dA <= 1.0 ); 628e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 629e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* compute blended color */ 630e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul#if CHAN_TYPE == GL_FLOAT 631e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul if (ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) { 632e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul r = Rs * sR + Rd * dR; 633e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul g = Gs * sG + Gd * dG; 634e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul b = Bs * sB + Bd * dB; 635e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul a = As * sA + Ad * dA; 636e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul } 637e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul else if (ctx->Color.BlendEquation==GL_FUNC_SUBTRACT_EXT) { 638e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul r = Rs * sR - Rd * dR; 639e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul g = Gs * sG - Gd * dG; 640e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul b = Bs * sB - Bd * dB; 641e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul a = As * sA - Ad * dA; 642e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul } 643e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul else if (ctx->Color.BlendEquation==GL_FUNC_REVERSE_SUBTRACT_EXT) { 644e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul r = Rd * dR - Rs * sR; 645e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul g = Gd * dG - Gs * sG; 646e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul b = Bd * dB - Bs * sB; 647e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul a = Ad * dA - As * sA; 648e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul } 649e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul else { 650e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul /* should never get here */ 651e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul r = g = b = a = 0.0F; /* silence uninitialized var warning */ 652e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul _mesa_problem(ctx, "unexpected BlendEquation in blend_general()"); 653e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul } 654e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul 655e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul /* final clamping */ 65610d343f407bddf011be3d2b79a6541815759785aBrian Paul rgba[i][RCOMP] = MAX2( r, 0.0F ); 65710d343f407bddf011be3d2b79a6541815759785aBrian Paul rgba[i][GCOMP] = MAX2( g, 0.0F ); 65810d343f407bddf011be3d2b79a6541815759785aBrian Paul rgba[i][BCOMP] = MAX2( b, 0.0F ); 659e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul rgba[i][ACOMP] = CLAMP( a, 0.0F, CHAN_MAXF ); 660e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul#else 661e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Color.BlendEquation==GL_FUNC_ADD_EXT) { 662e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell r = Rs * sR + Rd * dR + 0.5F; 663e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell g = Gs * sG + Gd * dG + 0.5F; 664e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell b = Bs * sB + Bd * dB + 0.5F; 665e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell a = As * sA + Ad * dA + 0.5F; 666e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 667e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else if (ctx->Color.BlendEquation==GL_FUNC_SUBTRACT_EXT) { 668e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell r = Rs * sR - Rd * dR + 0.5F; 669e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell g = Gs * sG - Gd * dG + 0.5F; 670e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell b = Bs * sB - Bd * dB + 0.5F; 671e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell a = As * sA - Ad * dA + 0.5F; 672e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 673e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else if (ctx->Color.BlendEquation==GL_FUNC_REVERSE_SUBTRACT_EXT) { 674e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell r = Rd * dR - Rs * sR + 0.5F; 675e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell g = Gd * dG - Gs * sG + 0.5F; 676e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell b = Bd * dB - Bs * sB + 0.5F; 677e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell a = Ad * dA - As * sA + 0.5F; 678e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 679e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 680e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* should never get here */ 681e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell r = g = b = a = 0.0F; /* silence uninitialized var warning */ 68208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "unexpected BlendEquation in blend_general()"); 683e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 684e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 685e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* final clamping */ 686e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][RCOMP] = (GLchan) (GLint) CLAMP( r, 0.0F, CHAN_MAXF ); 687e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][GCOMP] = (GLchan) (GLint) CLAMP( g, 0.0F, CHAN_MAXF ); 688e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][BCOMP] = (GLchan) (GLint) CLAMP( b, 0.0F, CHAN_MAXF ); 689e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell rgba[i][ACOMP] = (GLchan) (GLint) CLAMP( a, 0.0F, CHAN_MAXF ); 690e201bef913bbb869e9c4012fcfff2406e9d55393Brian Paul#endif 691e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 692e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 693e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 694e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 695e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 696e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 697e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Analyze current blending parameters to pick fastest blending function. 698e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Result: the ctx->Color.BlendFunc pointer is updated. 699e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 700cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwellvoid _swrast_choose_blend_func( GLcontext *ctx ) 701e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 702e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLenum eq = ctx->Color.BlendEquation; 703e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLenum srcRGB = ctx->Color.BlendSrcRGB; 704e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLenum dstRGB = ctx->Color.BlendDstRGB; 705e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLenum srcA = ctx->Color.BlendSrcA; 706e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell const GLenum dstA = ctx->Color.BlendDstA; 707e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 70863f4e198b41ad5a25200db3d126a6320d6cf8dccBrian Paul if (eq==GL_MIN_EXT) { 70963f4e198b41ad5a25200db3d126a6320d6cf8dccBrian Paul /* Note: GL_MIN ignores the blending weight factors */ 71063f4e198b41ad5a25200db3d126a6320d6cf8dccBrian Paul#if defined(USE_MMX_ASM) 71163f4e198b41ad5a25200db3d126a6320d6cf8dccBrian Paul if ( cpu_has_mmx ) { 71263f4e198b41ad5a25200db3d126a6320d6cf8dccBrian Paul SWRAST_CONTEXT(ctx)->BlendFunc = _mesa_mmx_blend_min; 71363f4e198b41ad5a25200db3d126a6320d6cf8dccBrian Paul } 71463f4e198b41ad5a25200db3d126a6320d6cf8dccBrian Paul else 71563f4e198b41ad5a25200db3d126a6320d6cf8dccBrian Paul#endif 71663f4e198b41ad5a25200db3d126a6320d6cf8dccBrian Paul SWRAST_CONTEXT(ctx)->BlendFunc = blend_min; 71763f4e198b41ad5a25200db3d126a6320d6cf8dccBrian Paul } 71863f4e198b41ad5a25200db3d126a6320d6cf8dccBrian Paul else if (eq==GL_MAX_EXT) { 71963f4e198b41ad5a25200db3d126a6320d6cf8dccBrian Paul /* Note: GL_MAX ignores the blending weight factors */ 72063f4e198b41ad5a25200db3d126a6320d6cf8dccBrian Paul#if defined(USE_MMX_ASM) 72163f4e198b41ad5a25200db3d126a6320d6cf8dccBrian Paul if ( cpu_has_mmx ) { 72263f4e198b41ad5a25200db3d126a6320d6cf8dccBrian Paul SWRAST_CONTEXT(ctx)->BlendFunc = _mesa_mmx_blend_max; 72363f4e198b41ad5a25200db3d126a6320d6cf8dccBrian Paul } 72463f4e198b41ad5a25200db3d126a6320d6cf8dccBrian Paul else 72563f4e198b41ad5a25200db3d126a6320d6cf8dccBrian Paul#endif 72663f4e198b41ad5a25200db3d126a6320d6cf8dccBrian Paul SWRAST_CONTEXT(ctx)->BlendFunc = blend_max; 72763f4e198b41ad5a25200db3d126a6320d6cf8dccBrian Paul } 72863f4e198b41ad5a25200db3d126a6320d6cf8dccBrian Paul else if (srcRGB != srcA || dstRGB != dstA) { 729cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell SWRAST_CONTEXT(ctx)->BlendFunc = blend_general; 730e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 731e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else if (eq==GL_FUNC_ADD_EXT && srcRGB==GL_SRC_ALPHA 7329add9a21d8c51ee4238169265541fa9a40f0a8b0Brian Paul && dstRGB==GL_ONE_MINUS_SRC_ALPHA) { 7339add9a21d8c51ee4238169265541fa9a40f0a8b0Brian Paul#if defined(USE_MMX_ASM) 734cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell if ( cpu_has_mmx ) { 73559235bd5da794557613463bc942de0c634d2d961Brian Paul SWRAST_CONTEXT(ctx)->BlendFunc = _mesa_mmx_blend_transparency; 736cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell } 737cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell else 738cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#endif 739cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell SWRAST_CONTEXT(ctx)->BlendFunc = blend_transparency; 740e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 741e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else if (eq==GL_FUNC_ADD_EXT && srcRGB==GL_ONE && dstRGB==GL_ONE) { 7420c527ab0546eb1de9ee10cc31bc386a40e6b3f98José Fonseca#if defined(USE_MMX_ASM) 7430c527ab0546eb1de9ee10cc31bc386a40e6b3f98José Fonseca if ( cpu_has_mmx ) { 7440c527ab0546eb1de9ee10cc31bc386a40e6b3f98José Fonseca SWRAST_CONTEXT(ctx)->BlendFunc = _mesa_mmx_blend_add; 7450c527ab0546eb1de9ee10cc31bc386a40e6b3f98José Fonseca } 7460c527ab0546eb1de9ee10cc31bc386a40e6b3f98José Fonseca else 7470c527ab0546eb1de9ee10cc31bc386a40e6b3f98José Fonseca#endif 7480c527ab0546eb1de9ee10cc31bc386a40e6b3f98José Fonseca SWRAST_CONTEXT(ctx)->BlendFunc = blend_add; 749e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 750e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else if (((eq==GL_FUNC_ADD_EXT || eq==GL_FUNC_REVERSE_SUBTRACT_EXT) 751cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell && (srcRGB==GL_ZERO && dstRGB==GL_SRC_COLOR)) 752cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell || 753cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell ((eq==GL_FUNC_ADD_EXT || eq==GL_FUNC_SUBTRACT_EXT) 754cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell && (srcRGB==GL_DST_COLOR && dstRGB==GL_ZERO))) { 755533e88824af9f60a926e7b70ddd40ad1386be686José Fonseca#if defined(USE_MMX_ASM) 756533e88824af9f60a926e7b70ddd40ad1386be686José Fonseca if ( cpu_has_mmx ) { 757533e88824af9f60a926e7b70ddd40ad1386be686José Fonseca SWRAST_CONTEXT(ctx)->BlendFunc = _mesa_mmx_blend_modulate; 758533e88824af9f60a926e7b70ddd40ad1386be686José Fonseca } 759533e88824af9f60a926e7b70ddd40ad1386be686José Fonseca else 760533e88824af9f60a926e7b70ddd40ad1386be686José Fonseca#endif 761533e88824af9f60a926e7b70ddd40ad1386be686José Fonseca SWRAST_CONTEXT(ctx)->BlendFunc = blend_modulate; 762e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 76359235bd5da794557613463bc942de0c634d2d961Brian Paul else if (eq==GL_FUNC_ADD_EXT && srcRGB == GL_ZERO && dstRGB == GL_ONE) { 76459235bd5da794557613463bc942de0c634d2d961Brian Paul SWRAST_CONTEXT(ctx)->BlendFunc = blend_noop; 76559235bd5da794557613463bc942de0c634d2d961Brian Paul } 76659235bd5da794557613463bc942de0c634d2d961Brian Paul else if (eq==GL_FUNC_ADD_EXT && srcRGB == GL_ONE && dstRGB == GL_ZERO) { 76759235bd5da794557613463bc942de0c634d2d961Brian Paul SWRAST_CONTEXT(ctx)->BlendFunc = blend_replace; 76859235bd5da794557613463bc942de0c634d2d961Brian Paul } 769e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 770cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell SWRAST_CONTEXT(ctx)->BlendFunc = blend_general; 771e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 772e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 773e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 774e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 775e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 776e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 777e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Apply the blending operator to a span of pixels. 778733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul * We can handle horizontal runs of pixels (spans) or arrays of x/y 779733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul * pixel coordinates. 780e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 781e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellvoid 78245bc887da226403f2c41077e40ca38b6f60f1359Brian Paul_swrast_blend_span( GLcontext *ctx, const struct sw_span *span, 783733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul GLchan rgba[][4] ) 784e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 785733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul SWcontext *swrast = SWRAST_CONTEXT(ctx); 786733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul GLchan framebuffer[MAX_WIDTH][4]; 787e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 788c02861778493ca65508e4dbbc2b907751811c845Brian Paul ASSERT(span->end <= MAX_WIDTH); 789733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul ASSERT(span->arrayMask & SPAN_RGBA); 79057857ca0925116d6d254fef7e705cfe0b650d77fBrian Paul ASSERT(!ctx->Color._LogicOpEnabled); 791e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 792e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Read span of current frame buffer pixels */ 793733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (span->arrayMask & SPAN_XY) { 794733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* array of x/y pixel coords */ 795733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul (*swrast->Driver.ReadRGBAPixels)( ctx, span->end, 79677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul span->array->x, span->array->y, 79777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul framebuffer, span->array->mask ); 798733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul if (swrast->_RasterMask & ALPHABUF_BIT) { 79945bc887da226403f2c41077e40ca38b6f60f1359Brian Paul _swrast_read_alpha_pixels( ctx, span->end, 80077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul span->array->x, span->array->y, 80177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul framebuffer, span->array->mask ); 802733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 803733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 804733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul else { 805733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul /* horizontal run of pixels */ 80645bc887da226403f2c41077e40ca38b6f60f1359Brian Paul _swrast_read_rgba_span( ctx, ctx->DrawBuffer, span->end, 807733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul span->x, span->y, framebuffer ); 808733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul } 809e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 81077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul SWRAST_CONTEXT(ctx)->BlendFunc( ctx, span->end, span->array->mask, rgba, 811733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul (const GLchan (*)[4]) framebuffer ); 812e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 813