Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Mesa 3-D graphics library
  3.  *
  4.  * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
  5.  *
  6.  * Permission is hereby granted, free of charge, to any person obtaining a
  7.  * copy of this software and associated documentation files (the "Software"),
  8.  * to deal in the Software without restriction, including without limitation
  9.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  10.  * and/or sell copies of the Software, and to permit persons to whom the
  11.  * Software is furnished to do so, subject to the following conditions:
  12.  *
  13.  * The above copyright notice and this permission notice shall be included
  14.  * in all copies or substantial portions of the Software.
  15.  *
  16.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  17.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  19.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  20.  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  21.  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  22.  * 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[VARYING_SLOT_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.