fix bug in popping texture color table state
[mesa.git] / src / mesa / main / macros.h
index d5d9e42e7f785bb94b337738a177503e16cac00c..4fc93936ac86a17ca5825f63015197f22c5bf9a8 100644 (file)
@@ -1,21 +1,21 @@
-/* $Id: macros.h,v 1.14 2000/11/16 21:05:35 keithw Exp $ */
+/* $Id: macros.h,v 1.30 2002/10/18 17:02:00 kschultz Exp $ */
 
 /*
  * Mesa 3-D graphics library
- * Version:  3.5
- * 
- * Copyright (C) 1999-2000  Brian Paul   All Rights Reserved.
- * 
+ * Version:  4.0.3
+ *
+ * Copyright (C) 1999-2002  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
@@ -35,7 +35,7 @@
 
 
 #include "glheader.h"
-/* Do not reference types.h from this file.
+/* Do not reference mtypes.h from this file.
  */
 
 
 #endif
 
 
-
-/*
- * Bitmask helpers
- */
-#define SET_BITS(WORD, BITS)    (WORD) |= (BITS)
-#define CLEAR_BITS(WORD, BITS)  (WORD) &= ~(BITS)
-#define TEST_BITS(WORD, BITS)   ((WORD) & (BITS))
-
-
-/* Stepping a GLfloat pointer by a byte stride 
+/* Stepping a GLfloat pointer by a byte stride
  */
 #define STRIDE_F(p, i)  (p = (GLfloat *)((GLubyte *)p + i))
 #define STRIDE_UI(p, i)  (p = (GLuint *)((GLubyte *)p + i))
-#define STRIDE_T(p, t, i)  (p = (t *)((GLubyte *)p + i))
+#define STRIDE_4UB(p, i)  (p = (GLubyte (*)[4])((GLubyte *)p + i))
+#define STRIDE_4CHAN(p, i)  (p = (GLchan (*)[4])((GLubyte *)p + i))
+#define STRIDE_CHAN(p, i)  (p = (GLchan *)((GLubyte *)p + i))
+#define STRIDE_T(p, t, i)  (p = (t)((GLubyte *)p + i))
 
 
 #define ZERO_2V( DST ) (DST)[0] = (DST)[1] = 0
 #define ZERO_4V( DST ) (DST)[0] = (DST)[1] = (DST)[2] = (DST)[3] = 0
 
 
+#define TEST_EQ_4V(a,b)  ((a)[0] == (b)[0] &&  \
+                         (a)[1] == (b)[1] &&   \
+                         (a)[2] == (b)[2] &&   \
+                         (a)[3] == (b)[3])
+
+#define TEST_EQ_3V(a,b)  ((a)[0] == (b)[0] &&  \
+                         (a)[1] == (b)[1] &&   \
+                         (a)[2] == (b)[2])
+
+#if defined(__i386__)
+#define TEST_EQ_4UBV(DST, SRC) *((GLuint*)(DST)) == *((GLuint*)(SRC))
+#else
+#define TEST_EQ_4UBV(DST, SRC) TEST_EQ_4V(DST, SRC)
+#endif
+
+
+
 /* Copy short vectors: */
 #define COPY_2V( DST, SRC )                    \
 do {                                           \
@@ -102,19 +113,42 @@ do {                                              \
    (DST)[3] = (SRC)[3];                                \
 } while (0)
 
-#define COPY_4UBV(DST, SRC)                    \
+#define COPY_2V_CAST( DST, SRC, CAST )         \
+do {                                           \
+   (DST)[0] = (CAST)(SRC)[0];                  \
+   (DST)[1] = (CAST)(SRC)[1];                  \
+} while (0)
+
+#define COPY_3V_CAST( DST, SRC, CAST )         \
 do {                                           \
-   if (sizeof(GLuint)==4*sizeof(GLubyte)) {    \
-      *((GLuint*)(DST)) = *((GLuint*)(SRC));   \
-   }                                           \
-   else {                                      \
-      (DST)[0] = (SRC)[0];                     \
-      (DST)[1] = (SRC)[1];                     \
-      (DST)[2] = (SRC)[2];                     \
-      (DST)[3] = (SRC)[3];                     \
-   }                                           \
+   (DST)[0] = (CAST)(SRC)[0];                  \
+   (DST)[1] = (CAST)(SRC)[1];                  \
+   (DST)[2] = (CAST)(SRC)[2];                  \
 } while (0)
 
+#define COPY_4V_CAST( DST, SRC, CAST )         \
+do {                                           \
+   (DST)[0] = (CAST)(SRC)[0];                  \
+   (DST)[1] = (CAST)(SRC)[1];                  \
+   (DST)[2] = (CAST)(SRC)[2];                  \
+   (DST)[3] = (CAST)(SRC)[3];                  \
+} while (0)
+
+#if defined(__i386__)
+#define COPY_4UBV(DST, SRC)                    \
+do {                                           \
+   *((GLuint*)(DST)) = *((GLuint*)(SRC));      \
+} while (0)
+#else
+/* The GLuint cast might fail if DST or SRC are not dword-aligned (RISC) */
+#define COPY_4UBV(DST, SRC)                    \
+do {                                           \
+   (DST)[0] = (SRC)[0];                                \
+   (DST)[1] = (SRC)[1];                                \
+   (DST)[2] = (SRC)[2];                                \
+   (DST)[3] = (SRC)[3];                                \
+} while (0)
+#endif
 
 #define COPY_2FV( DST, SRC )                   \
 do {                                           \
@@ -150,7 +184,7 @@ do {                                                \
    case 2: (DST)[1] = (SRC)[1];                        \
    case 1: (DST)[0] = (SRC)[0];                        \
    }                                           \
-} while(0)                        
+} while(0)
 
 #define COPY_CLEAN_4V(DST, SZ, SRC)            \
 do {                                           \
@@ -248,6 +282,13 @@ do {                                               \
       (DST)[2] = (SRCA)[2] * (SRCB)[2];                \
 } while (0)
 
+#define SELF_SCALE_3V( DST, SRC )              \
+do {                                           \
+      (DST)[0] *= (SRC)[0];                    \
+      (DST)[1] *= (SRC)[1];                    \
+      (DST)[2] *= (SRC)[2];                    \
+} while (0)
+
 #define ACC_3V( DST, SRC )                     \
 do {                                           \
       (DST)[0] += (SRC)[0];                    \
@@ -424,4 +465,63 @@ do {                                               \
 } while (0)
 
 
+
+/* Generic color packing macros
+ * XXX We may move these into texutil.h at some point.
+ */
+
+#define PACK_COLOR_8888( a, b, c, d )                                  \
+   (((a) << 24) | ((b) << 16) | ((c) << 8) | (d))
+
+#define PACK_COLOR_888( a, b, c )                                      \
+   (((a) << 16) | ((b) << 8) | (c))
+
+#define PACK_COLOR_565( a, b, c )                                      \
+   ((((a) & 0xf8) << 8) | (((b) & 0xfc) << 3) | (((c) & 0xf8) >> 3))
+
+#define PACK_COLOR_1555( a, b, c, d )                                  \
+   ((((b) & 0xf8) << 7) | (((c) & 0xf8) << 2) | (((d) & 0xf8) >> 3) |  \
+    ((a) ? 0x8000 : 0))
+
+#define PACK_COLOR_4444( a, b, c, d )                                  \
+   ((((a) & 0xf0) << 8) | (((b) & 0xf0) << 4) | ((c) & 0xf0) | ((d) >> 4))
+
+#define PACK_COLOR_88( a, b )                                          \
+   (((a) << 8) | (b))
+
+#define PACK_COLOR_332( a, b, c )                                      \
+   (((a) & 0xe0) | (((b) & 0xe0) >> 3) | (((c) & 0xc0) >> 6))
+
+
+#ifdef MESA_BIG_ENDIAN
+
+#define PACK_COLOR_8888_LE( a, b, c, d )       PACK_COLOR_8888( d, c, b, a )
+
+#define PACK_COLOR_565_LE( a, b, c )                                   \
+   (((a) & 0xf8) | (((b) & 0xe0) >> 5) | (((b) & 0x1c) << 11) |                \
+   (((c) & 0xf8) << 5))
+
+#define PACK_COLOR_1555_LE( a, b, c, d )                               \
+   ((((b) & 0xf8) >> 1) | (((c) & 0xc0) >> 6) | (((c) & 0x38) << 10) | \
+    (((d) & 0xf8) << 5) | ((a) ? 0x80 : 0))
+
+#define PACK_COLOR_4444_LE( a, b, c, d )       PACK_COLOR_4444( c, d, a, b )
+
+#define PACK_COLOR_88_LE( a, b )               PACK_COLOR_88( b, a )
+
+#else  /* little endian */
+
+#define PACK_COLOR_8888_LE( a, b, c, d )       PACK_COLOR_8888( a, b, c, d )
+
+#define PACK_COLOR_565_LE( a, b, c )           PACK_COLOR_565( a, b, c )
+
+#define PACK_COLOR_1555_LE( a, b, c, d )       PACK_COLOR_1555( a, b, c, d )
+
+#define PACK_COLOR_4444_LE( a, b, c, d )       PACK_COLOR_4444( a, b, c, d )
+
+#define PACK_COLOR_88_LE( a, b )               PACK_COLOR_88( a, b )
+
+#endif /* endianness */
+
+
 #endif