Home | History | Annotate | Download | only in swrast
      1 /*
      2  * Mesa 3-D graphics library
      3  * Version:  6.5.2
      4  *
      5  * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
      6  *
      7  * Permission is hereby granted, free of charge, to any person obtaining a
      8  * copy of this software and associated documentation files (the "Software"),
      9  * to deal in the Software without restriction, including without limitation
     10  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     11  * and/or sell copies of the Software, and to permit persons to whom the
     12  * Software is furnished to do so, subject to the following conditions:
     13  *
     14  * The above copyright notice and this permission notice shall be included
     15  * in all copies or substantial portions of the Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     20  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
     21  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
     22  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     23  */
     24 
     25 
     26 /*
     27  * Implement the effect of glColorMask and glIndexMask in software.
     28  */
     29 
     30 
     31 #include "main/glheader.h"
     32 #include "main/macros.h"
     33 
     34 #include "s_context.h"
     35 #include "s_masking.h"
     36 #include "s_span.h"
     37 
     38 
     39 /**
     40  * Apply the color mask to a span of rgba values.
     41  */
     42 void
     43 _swrast_mask_rgba_span(struct gl_context *ctx, struct gl_renderbuffer *rb,
     44                        SWspan *span, GLuint buf)
     45 {
     46    const GLuint n = span->end;
     47    void *rbPixels;
     48 
     49    ASSERT(n < SWRAST_MAX_WIDTH);
     50    ASSERT(span->arrayMask & SPAN_RGBA);
     51 
     52    rbPixels = _swrast_get_dest_rgba(ctx, rb, span);
     53 
     54    /*
     55     * Do component masking.
     56     * Note that we're not using span->array->mask[] here.  We could...
     57     */
     58    if (span->array->ChanType == GL_UNSIGNED_BYTE) {
     59       /* treat 4xGLubyte as 1xGLuint */
     60       const GLuint srcMask = *((GLuint *) ctx->Color.ColorMask[buf]);
     61       const GLuint dstMask = ~srcMask;
     62       const GLuint *dst = (const GLuint *) rbPixels;
     63       GLuint *src = (GLuint *) span->array->rgba8;
     64       GLuint i;
     65       for (i = 0; i < n; i++) {
     66          src[i] = (src[i] & srcMask) | (dst[i] & dstMask);
     67       }
     68    }
     69    else if (span->array->ChanType == GL_UNSIGNED_SHORT) {
     70       /* 2-byte components */
     71       /* XXX try to use 64-bit arithmetic someday */
     72       const GLushort rMask = ctx->Color.ColorMask[buf][RCOMP] ? 0xffff : 0x0;
     73       const GLushort gMask = ctx->Color.ColorMask[buf][GCOMP] ? 0xffff : 0x0;
     74       const GLushort bMask = ctx->Color.ColorMask[buf][BCOMP] ? 0xffff : 0x0;
     75       const GLushort aMask = ctx->Color.ColorMask[buf][ACOMP] ? 0xffff : 0x0;
     76       const GLushort (*dst)[4] = (const GLushort (*)[4]) rbPixels;
     77       GLushort (*src)[4] = span->array->rgba16;
     78       GLuint i;
     79       for (i = 0; i < n; i++) {
     80          src[i][RCOMP] = (src[i][RCOMP] & rMask) | (dst[i][RCOMP] & ~rMask);
     81          src[i][GCOMP] = (src[i][GCOMP] & gMask) | (dst[i][GCOMP] & ~gMask);
     82          src[i][BCOMP] = (src[i][BCOMP] & bMask) | (dst[i][BCOMP] & ~bMask);
     83          src[i][ACOMP] = (src[i][ACOMP] & aMask) | (dst[i][ACOMP] & ~aMask);
     84       }
     85    }
     86    else {
     87       /* 4-byte components */
     88       const GLuint rMask = ctx->Color.ColorMask[buf][RCOMP] ? ~0x0 : 0x0;
     89       const GLuint gMask = ctx->Color.ColorMask[buf][GCOMP] ? ~0x0 : 0x0;
     90       const GLuint bMask = ctx->Color.ColorMask[buf][BCOMP] ? ~0x0 : 0x0;
     91       const GLuint aMask = ctx->Color.ColorMask[buf][ACOMP] ? ~0x0 : 0x0;
     92       const GLuint (*dst)[4] = (const GLuint (*)[4]) rbPixels;
     93       GLuint (*src)[4] = (GLuint (*)[4]) span->array->attribs[FRAG_ATTRIB_COL0];
     94       GLuint i;
     95       for (i = 0; i < n; i++) {
     96          src[i][RCOMP] = (src[i][RCOMP] & rMask) | (dst[i][RCOMP] & ~rMask);
     97          src[i][GCOMP] = (src[i][GCOMP] & gMask) | (dst[i][GCOMP] & ~gMask);
     98          src[i][BCOMP] = (src[i][BCOMP] & bMask) | (dst[i][BCOMP] & ~bMask);
     99          src[i][ACOMP] = (src[i][ACOMP] & aMask) | (dst[i][ACOMP] & ~aMask);
    100       }
    101    }
    102 }
    103