added missing \'s
[mesa.git] / src / mesa / swrast / s_logic.c
index 10a4654b8ac3eeae9ff9adf0b6c1564575e15cf9..adc885ebdf08777258259845ec92f5a298ebdb6f 100644 (file)
@@ -1,21 +1,21 @@
-/* $Id: s_logic.c,v 1.3 2001/02/13 23:50:25 brianp Exp $ */
+/* $Id: s_logic.c,v 1.7 2001/05/10 16:54:12 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
  * Version:  3.5
- * 
- * Copyright (C) 1999-2000  Brian Paul   All Rights Reserved.
- * 
+ *
+ * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  * and/or sell copies of the Software, and to permit persons to whom the
  * Software is furnished to do so, subject to the following conditions:
- * 
+ *
  * The above copyright notice and this permission notice shall be included
  * in all copies or substantial portions of the Software.
- * 
+ *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
@@ -155,7 +155,7 @@ static void index_logicop( GLcontext *ctx, GLuint n,
         }
         break;
       default:
-        gl_problem(ctx, "bad mode in index_logic()");
+        _mesa_problem(ctx, "bad mode in index_logic()");
    }
 }
 
@@ -169,9 +169,10 @@ void
 _mesa_logicop_ci_span( GLcontext *ctx, GLuint n, GLint x, GLint y,
                        GLuint index[], const GLubyte mask[] )
 {
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
    GLuint dest[MAX_WIDTH];
    /* Read dest values from frame buffer */
-   (*ctx->Driver.ReadCI32Span)( ctx, n, x, y, dest );
+   (*swrast->Driver.ReadCI32Span)( ctx, n, x, y, dest );
    index_logicop( ctx, n, index, dest, mask );
 }
 
@@ -186,9 +187,10 @@ _mesa_logicop_ci_pixels( GLcontext *ctx,
                          GLuint n, const GLint x[], const GLint y[],
                          GLuint index[], const GLubyte mask[] )
 {
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
    GLuint dest[PB_SIZE];
    /* Read dest values from frame buffer */
-   (*ctx->Driver.ReadCI32Pixels)( ctx, n, x, y, dest, mask );
+   (*swrast->Driver.ReadCI32Pixels)( ctx, n, x, y, dest, mask );
    index_logicop( ctx, n, index, dest, mask );
 }
 
@@ -205,9 +207,134 @@ _mesa_logicop_ci_pixels( GLcontext *ctx,
  * Note:  Since the R, G, B, and A channels are all treated the same we
  * process them as 4-byte GLuints instead of four GLubytes.
  */
-static void rgba_logicop( const GLcontext *ctx, GLuint n,
-                          const GLubyte mask[],
-                          GLuint src[], const GLuint dest[] )
+static void rgba_logicop_ui( const GLcontext *ctx, GLuint n,
+                             const GLubyte mask[],
+                             GLuint src[], const GLuint dest[] )
+{
+   GLuint i;
+   switch (ctx->Color.LogicOp) {
+      case GL_CLEAR:
+         for (i=0;i<n;i++) {
+            if (mask[i]) {
+               src[i] = 0;
+            }
+         }
+         break;
+      case GL_SET:
+         for (i=0;i<n;i++) {
+            if (mask[i]) {
+               src[i] = ~0;
+            }
+         }
+         break;
+      case GL_COPY:
+         /* do nothing */
+         break;
+      case GL_COPY_INVERTED:
+         for (i=0;i<n;i++) {
+            if (mask[i]) {
+               src[i] = ~src[i];
+            }
+         }
+         break;
+      case GL_NOOP:
+         for (i=0;i<n;i++) {
+            if (mask[i]) {
+               src[i] = dest[i];
+            }
+         }
+         break;
+      case GL_INVERT:
+         for (i=0;i<n;i++) {
+            if (mask[i]) {
+               src[i] = ~dest[i];
+            }
+         }
+         break;
+      case GL_AND:
+         for (i=0;i<n;i++) {
+            if (mask[i]) {
+               src[i] &= dest[i];
+            }
+         }
+         break;
+      case GL_NAND:
+         for (i=0;i<n;i++) {
+            if (mask[i]) {
+               src[i] = ~(src[i] & dest[i]);
+            }
+         }
+         break;
+      case GL_OR:
+         for (i=0;i<n;i++) {
+            if (mask[i]) {
+               src[i]|= dest[i];
+            }
+         }
+         break;
+      case GL_NOR:
+         for (i=0;i<n;i++) {
+            if (mask[i]) {
+               src[i] = ~(src[i] | dest[i]);
+            }
+         }
+         break;
+      case GL_XOR:
+         for (i=0;i<n;i++) {
+            if (mask[i]) {
+               src[i] ^= dest[i];
+            }
+         }
+         break;
+      case GL_EQUIV:
+         for (i=0;i<n;i++) {
+            if (mask[i]) {
+               src[i] = ~(src[i] ^ dest[i]);
+            }
+         }
+         break;
+      case GL_AND_REVERSE:
+         for (i=0;i<n;i++) {
+            if (mask[i]) {
+               src[i] = src[i] & ~dest[i];
+            }
+         }
+         break;
+      case GL_AND_INVERTED:
+         for (i=0;i<n;i++) {
+            if (mask[i]) {
+               src[i] = ~src[i] & dest[i];
+            }
+         }
+         break;
+      case GL_OR_REVERSE:
+         for (i=0;i<n;i++) {
+            if (mask[i]) {
+               src[i] = src[i] | ~dest[i];
+            }
+         }
+         break;
+      case GL_OR_INVERTED:
+         for (i=0;i<n;i++) {
+            if (mask[i]) {
+               src[i] = ~src[i] | dest[i];
+            }
+         }
+         break;
+      default:
+         /* should never happen */
+         _mesa_problem(ctx, "Bad function in rgba_logicop");
+   }
+}
+
+
+/*
+ * As above, but operate on GLchan values
+ * Note: need to pass n = numPixels * 4.
+ */
+static void rgba_logicop_chan( const GLcontext *ctx, GLuint n,
+                               const GLubyte mask[],
+                               GLchan src[], const GLchan dest[] )
 {
    GLuint i;
    switch (ctx->Color.LogicOp) {
@@ -259,7 +386,7 @@ static void rgba_logicop( const GLcontext *ctx, GLuint n,
       case GL_NAND:
          for (i=0;i<n;i++) {
             if (mask[i]) {
-               src[i] = ~(src[i] & src[i]);
+               src[i] = ~(src[i] & dest[i]);
             }
          }
          break;
@@ -321,7 +448,7 @@ static void rgba_logicop( const GLcontext *ctx, GLuint n,
          break;
       default:
          /* should never happen */
-         gl_problem(ctx, "Bad function in rgba_logicop");
+         _mesa_problem(ctx, "Bad function in rgba_logicop");
    }
 }
 
@@ -337,8 +464,14 @@ _mesa_logicop_rgba_span( GLcontext *ctx,
                          GLchan rgba[][4], const GLubyte mask[] )
 {
    GLchan dest[MAX_WIDTH][4];
-   gl_read_rgba_span( ctx, ctx->DrawBuffer, n, x, y, dest );
-   rgba_logicop( ctx, n, mask, (GLuint *) rgba, (const GLuint *) dest );
+   _mesa_read_rgba_span( ctx, ctx->DrawBuffer, n, x, y, dest );
+   if (sizeof(GLchan) * 4 == sizeof(GLuint)) {
+      rgba_logicop_ui(ctx, n, mask, (GLuint *) rgba, (const GLuint *) dest);
+   }
+   else {
+      rgba_logicop_chan(ctx, 4 * n, mask,
+                        (GLchan *) rgba, (const GLchan *) dest);
+   }
 }
 
 
@@ -352,10 +485,17 @@ _mesa_logicop_rgba_pixels( GLcontext *ctx,
                            GLuint n, const GLint x[], const GLint y[],
                            GLchan rgba[][4], const GLubyte mask[] )
 {
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
    GLchan dest[PB_SIZE][4];
-   (*ctx->Driver.ReadRGBAPixels)( ctx, n, x, y, dest, mask );
+   (*swrast->Driver.ReadRGBAPixels)( ctx, n, x, y, dest, mask );
    if (SWRAST_CONTEXT(ctx)->_RasterMask & ALPHABUF_BIT) {
       _mesa_read_alpha_pixels( ctx, n, x, y, dest, mask );
    }
-   rgba_logicop( ctx, n, mask, (GLuint *) rgba, (const GLuint *) dest );
+   if (sizeof(GLchan) * 4 == sizeof(GLuint)) {
+      rgba_logicop_ui(ctx, n, mask, (GLuint *) rgba, (const GLuint *) dest);
+   }
+   else {
+      rgba_logicop_chan(ctx, 4 * n, mask,
+                        (GLchan *) rgba, (const GLchan *) dest);
+   }
 }