1 /* $Id: alpha.c,v 1.5 1997/07/24 01:24:28 brianp Exp $ */ 2 3 /* 4 * Mesa 3-D graphics library 5 * Version: 2.4 6 * Copyright (C) 1995-1997 Brian Paul 7 * 8 * This library is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU Library General Public 10 * License as published by the Free Software Foundation; either 11 * version 2 of the License, or (at your option) any later version. 12 * 13 * This library is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * Library General Public License for more details. 17 * 18 * You should have received a copy of the GNU Library General Public 19 * License along with this library; if not, write to the Free 20 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 21 */ 22 23 24 /* 25 * $Log: alpha.c,v $ 26 * Revision 1.5 1997/07/24 01:24:28 brianp 27 * changed precompiled header symbol from PCH to PC_HEADER 28 * 29 * Revision 1.4 1997/05/28 03:23:09 brianp 30 * added precompiled header (PCH) support 31 * 32 * Revision 1.3 1997/03/13 03:07:53 brianp 33 * optimized gl_alpha_test() by removing conditional from inside loops 34 * 35 * Revision 1.2 1996/09/15 14:15:54 brianp 36 * now use GLframebuffer and GLvisual 37 * 38 * Revision 1.1 1996/09/13 01:38:16 brianp 39 * Initial revision 40 * 41 */ 42 43 44 #ifdef PC_HEADER 45 #include "all.h" 46 #else 47 #include "alpha.h" 48 #include "context.h" 49 #include "types.h" 50 #include "dlist.h" 51 #include "macros.h" 52 #endif 53 54 55 56 void gl_AlphaFunc( GLcontext* ctx, GLenum func, GLclampf ref ) 57 { 58 if (INSIDE_BEGIN_END(ctx)) { 59 gl_error( ctx, GL_INVALID_OPERATION, "glAlphaFunc" ); 60 return; 61 } 62 switch (func) { 63 case GL_NEVER: 64 case GL_LESS: 65 case GL_EQUAL: 66 case GL_LEQUAL: 67 case GL_GREATER: 68 case GL_NOTEQUAL: 69 case GL_GEQUAL: 70 case GL_ALWAYS: 71 ctx->Color.AlphaFunc = func; 72 ctx->Color.AlphaRef = CLAMP( ref, 0.0F, 1.0F ); 73 ctx->Color.AlphaRefUbyte = (GLubyte) (ctx->Color.AlphaRef 74 * ctx->Visual->AlphaScale); 75 break; 76 default: 77 gl_error( ctx, GL_INVALID_ENUM, "glAlphaFunc(func)" ); 78 break; 79 } 80 } 81 82 83 84 85 /* 86 * Apply the alpha test to a span of pixels. 87 * In/Out: mask - current pixel mask. Pixels which fail the alpha test 88 * will set the corresponding mask flag to 0. 89 * Return: 0 = all pixels in the span failed the alpha test. 90 * 1 = one or more pixels passed the alpha test. 91 */ 92 GLint gl_alpha_test( GLcontext* ctx, 93 GLuint n, const GLubyte alpha[], GLubyte mask[] ) 94 { 95 GLuint i; 96 GLubyte ref = ctx->Color.AlphaRefUbyte; 97 98 /* switch cases ordered from most frequent to less frequent */ 99 switch (ctx->Color.AlphaFunc) { 100 case GL_LESS: 101 for (i=0;i<n;i++) { 102 mask[i] &= (alpha[i] < ref); 103 } 104 return 1; 105 case GL_LEQUAL: 106 for (i=0;i<n;i++) { 107 mask[i] &= (alpha[i] <= ref); 108 } 109 return 1; 110 case GL_GEQUAL: 111 for (i=0;i<n;i++) { 112 mask[i] &= (alpha[i] >= ref); 113 } 114 return 1; 115 case GL_GREATER: 116 for (i=0;i<n;i++) { 117 mask[i] &= (alpha[i] > ref); 118 } 119 return 1; 120 case GL_NOTEQUAL: 121 for (i=0;i<n;i++) { 122 mask[i] &= (alpha[i] != ref); 123 } 124 return 1; 125 case GL_EQUAL: 126 for (i=0;i<n;i++) { 127 mask[i] &= (alpha[i] == ref); 128 } 129 return 1; 130 case GL_ALWAYS: 131 /* do nothing */ 132 return 1; 133 case GL_NEVER: 134 /* caller should check for zero! */ 135 return 0; 136 default: 137 gl_problem( ctx, "Invalid alpha test in gl_alpha_test" ); 138 return 0; 139 } 140 /* Never get here */ 141 return 1; 142 } 143