fixed pointer arithmetic error in glCopyPixels
[mesa.git] / src / mesa / main / macros.h
index 02121e3e12040a20ce1e2bee697ea94e9934410c..bb83b30d5d42482496766e35c6816276593d260f 100644 (file)
@@ -1,21 +1,21 @@
-/* $Id: macros.h,v 1.15 2000/11/24 10:25:05 keithw Exp $ */
+/* $Id: macros.h,v 1.25 2002/02/13 00:53:19 keithw 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
 #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 +122,21 @@ do {                                              \
    (DST)[3] = (SRC)[3];                                \
 } while (0)
 
+#if defined(__i386__)
 #define COPY_4UBV(DST, SRC)                    \
 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];                     \
-   }                                           \
+   *((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 +172,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 +270,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 +453,31 @@ do {                                               \
 } while (0)
 
 
+
+/* Generic color packing macros
+ */
+
+#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))
+
+
 #endif