1c6d9cee74ef337517b541fbd58e5438920699a77mstarzinger@chromium.org/* 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org * Mesa 3-D graphics library 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org * Version: 6.5.2 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * 5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. 643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * 7196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * copy of this software and associated documentation files (the "Software"), 9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * to deal in the Software without restriction, including without limitation 10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 124b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org * Software is furnished to do so, subject to the following conditions: 1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * 1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * The above copyright notice and this permission notice shall be included 1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * in all copies or substantial portions of the Software. 16ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * 17ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 2246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org */ 2446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org 25e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org 2646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org/* 2746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org * Implement the effect of glColorMask and glIndexMask in software. 2846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org */ 29ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 30ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "main/glheader.h" 321c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org#include "main/macros.h" 331c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org 3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "s_context.h" 35ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "s_masking.h" 36c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org#include "s_span.h" 37c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 38c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 391c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org/** 401c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org * Apply the color mask to a span of rgba values. 41c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org */ 421c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.orgvoid 43c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org_swrast_mask_rgba_span(struct gl_context *ctx, struct gl_renderbuffer *rb, 441c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org SWspan *span, GLuint buf) 4543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen{ 4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const GLuint n = span->end; 471c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org void *rbPixels; 4843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 49c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org ASSERT(n < SWRAST_MAX_WIDTH); 501c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org ASSERT(span->arrayMask & SPAN_RGBA); 511c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org 521c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org rbPixels = _swrast_get_dest_rgba(ctx, rb, span); 531c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org 5443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen /* 55e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org * Do component masking. 5643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Note that we're not using span->array->mask[] here. We could... 5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */ 5843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (span->array->ChanType == GL_UNSIGNED_BYTE) { 591c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org /* treat 4xGLubyte as 1xGLuint */ 60e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org const GLuint srcMask = *((GLuint *) ctx->Color.ColorMask[buf]); 611c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org const GLuint dstMask = ~srcMask; 621c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org const GLuint *dst = (const GLuint *) rbPixels; 6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen GLuint *src = (GLuint *) span->array->rgba8; 6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen GLuint i; 6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (i = 0; i < n; i++) { 667c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org src[i] = (src[i] & srcMask) | (dst[i] & dstMask); 677c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org } 687c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org } 697c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org else if (span->array->ChanType == GL_UNSIGNED_SHORT) { 707c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org /* 2-byte components */ 7143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen /* XXX try to use 64-bit arithmetic someday */ 72e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org const GLushort rMask = ctx->Color.ColorMask[buf][RCOMP] ? 0xffff : 0x0; 7343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const GLushort gMask = ctx->Color.ColorMask[buf][GCOMP] ? 0xffff : 0x0; 74c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org const GLushort bMask = ctx->Color.ColorMask[buf][BCOMP] ? 0xffff : 0x0; 751c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org const GLushort aMask = ctx->Color.ColorMask[buf][ACOMP] ? 0xffff : 0x0; 76c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org const GLushort (*dst)[4] = (const GLushort (*)[4]) rbPixels; 771c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org GLushort (*src)[4] = span->array->rgba16; 7843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen GLuint i; 791c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org for (i = 0; i < n; i++) { 8043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen src[i][RCOMP] = (src[i][RCOMP] & rMask) | (dst[i][RCOMP] & ~rMask); 8143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen src[i][GCOMP] = (src[i][GCOMP] & gMask) | (dst[i][GCOMP] & ~gMask); 8243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen src[i][BCOMP] = (src[i][BCOMP] & bMask) | (dst[i][BCOMP] & ~bMask); 8343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen src[i][ACOMP] = (src[i][ACOMP] & aMask) | (dst[i][ACOMP] & ~aMask); 8446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org } 85e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org } 8646a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org else { 87e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org /* 4-byte components */ 881c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org const GLuint rMask = ctx->Color.ColorMask[buf][RCOMP] ? ~0x0 : 0x0; 891c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org const GLuint gMask = ctx->Color.ColorMask[buf][GCOMP] ? ~0x0 : 0x0; 9043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const GLuint bMask = ctx->Color.ColorMask[buf][BCOMP] ? ~0x0 : 0x0; 9143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const GLuint aMask = ctx->Color.ColorMask[buf][ACOMP] ? ~0x0 : 0x0; 9243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const GLuint (*dst)[4] = (const GLuint (*)[4]) rbPixels; 9343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen GLuint (*src)[4] = (GLuint (*)[4]) span->array->attribs[FRAG_ATTRIB_COL0]; 94e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org GLuint i; 951c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org for (i = 0; i < n; i++) { 961c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org src[i][RCOMP] = (src[i][RCOMP] & rMask) | (dst[i][RCOMP] & ~rMask); 9743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen src[i][GCOMP] = (src[i][GCOMP] & gMask) | (dst[i][GCOMP] & ~gMask); 9843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen src[i][BCOMP] = (src[i][BCOMP] & bMask) | (dst[i][BCOMP] & ~bMask); 9943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen src[i][ACOMP] = (src[i][ACOMP] & aMask) | (dst[i][ACOMP] & ~aMask); 10043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 10143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 10243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 10343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen