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