fixed pointer arithmetic error in glCopyPixels
[mesa.git] / src / mesa / main / macros.h
index 443e2731c67666427fdf0c1dd5edde7e4061b987..bb83b30d5d42482496766e35c6816276593d260f 100644 (file)
@@ -1,21 +1,21 @@
-/* $Id: macros.h,v 1.10 2000/10/28 18:34:48 brianp Exp $ */
+/* $Id: macros.h,v 1.25 2002/02/13 00:53:19 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
- * Version:  3.3
- * 
- * Copyright (C) 1999  Brian Paul   All Rights Reserved.
- * 
+ * Version:  3.5
+ *
+ * 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
 
 
 #include "glheader.h"
-
-
-#ifdef DEBUG
-#  define ASSERT(X)   assert(X)
-#else
-#  define ASSERT(X)
-#endif
-
-
-#if defined(__GNUC__)
-#define INLINE __inline__
-#elif defined(__MSC__)
-#define INLINE __inline
-#else
-#define INLINE
-#endif
+/* Do not reference mtypes.h from this file.
+ */
 
 
 /* Limits: */
 #define MAX_GLUINT     0xffffffff
 
 
-/* Some compilers don't like some of Mesa's const usage */
-#ifdef NO_CONST
-#  define CONST
-#else
-#  define CONST const
-#endif
-
-
 /* Pi */
 #ifndef M_PI
 #define M_PI (3.1415926)
 #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 {                                           \
@@ -124,6 +122,21 @@ do {                                               \
    (DST)[3] = (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 {                                           \
@@ -159,7 +172,13 @@ 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 {                                           \
+      ASSIGN_4V( DST, 0, 0, 0, 1 );            \
+      COPY_SZ_4V( DST, SZ, SRC );              \
+} while (0)
 
 #define SUB_4V( DST, SRCA, SRCB )              \
 do {                                           \
@@ -251,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];                    \
@@ -351,26 +377,6 @@ do {                                               \
 
 
 
-/*
- * Copy a vector of 4 GLubytes from SRC to DST.
- */
-#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];                     \
-   }                                           \
-} while (0)
-
-
-#define COPY_CHAN4(DST, SRC)  COPY_4UBV(DST, SRC)
-
-
 /* Assign scalers to short vectors: */
 #define ASSIGN_2V( V, V0, V1 ) \
 do {                           \
@@ -436,7 +442,7 @@ do {                                                \
 #define DOT4( a, b )  ( (a)[0]*(b)[0] + (a)[1]*(b)[1] + \
                        (a)[2]*(b)[2] + (a)[3]*(b)[3] )
 
-#define DOT4V(v,a,b,c,d) (v[0]*a + v[1]*b + v[2]*c + v[3]*d)
+#define DOT4V(v,a,b,c,d) (v[0]*(a) + v[1]*(b) + v[2]*(c) + v[3]*(d))
 
 
 #define CROSS3(n, u, v)                        \
@@ -447,63 +453,31 @@ do {                                              \
 } while (0)
 
 
-/*
- * Integer / float conversion for colors, normals, etc.
- */
-
-#define BYTE_TO_UBYTE(b)   (b < 0 ? 0 : (GLubyte) b)
-#define SHORT_TO_UBYTE(s)  (s < 0 ? 0 : (GLubyte) (s >> 7))
-#define USHORT_TO_UBYTE(s)              (GLubyte) (s >> 8)
-#define INT_TO_UBYTE(i)    (i < 0 ? 0 : (GLubyte) (i >> 23))
-#define UINT_TO_UBYTE(i)                (GLubyte) (i >> 24)
-
-/* Convert GLubyte in [0,255] to GLfloat in [0.0,1.0] */
-#define UBYTE_TO_FLOAT(B)      ((GLfloat) (B) * (1.0F / 255.0F))
-
-/* Convert GLfloat in [0.0,1.0] to GLubyte in [0,255] */
-#define FLOAT_TO_UBYTE(X)      ((GLubyte) (GLint) (((X)) * 255.0F))
-
-
-/* Convert GLbyte in [-128,127] to GLfloat in [-1.0,1.0] */
-#define BYTE_TO_FLOAT(B)       ((2.0F * (B) + 1.0F) * (1.0F/255.0F))
 
-/* Convert GLfloat in [-1.0,1.0] to GLbyte in [-128,127] */
-#define FLOAT_TO_BYTE(X)       ( (((GLint) (255.0F * (X))) - 1) / 2 )
-
-
-/* Convert GLushort in [0,65536] to GLfloat in [0.0,1.0] */
-#define USHORT_TO_FLOAT(S)     ((GLfloat) (S) * (1.0F / 65535.0F))
-
-/* Convert GLfloat in [0.0,1.0] to GLushort in [0,65536] */
-#define FLOAT_TO_USHORT(X)     ((GLushort) (GLint) ((X) * 65535.0F))
-
-
-/* Convert GLshort in [-32768,32767] to GLfloat in [-1.0,1.0] */
-#define SHORT_TO_FLOAT(S)      ((2.0F * (S) + 1.0F) * (1.0F/65535.0F))
-
-/* Convert GLfloat in [0.0,1.0] to GLshort in [-32768,32767] */
-#define FLOAT_TO_SHORT(X)      ( (((GLint) (65535.0F * (X))) - 1) / 2 )
+/* Generic color packing macros
+ */
 
+#define PACK_COLOR_8888( a, b, c, d )                                  \
+   (((a) << 24) | ((b) << 16) | ((c) << 8) | (d))
 
-/* Convert GLuint in [0,4294967295] to GLfloat in [0.0,1.0] */
-#define UINT_TO_FLOAT(U)       ((GLfloat) (U) * (1.0F / 4294967295.0F))
+#define PACK_COLOR_888( a, b, c )                                      \
+   (((a) << 16) | ((b) << 8) | (c))
 
-/* Convert GLfloat in [0.0,1.0] to GLuint in [0,4294967295] */
-#define FLOAT_TO_UINT(X)       ((GLuint) ((X) * 4294967295.0))
+#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))
 
-/* Convert GLint in [-2147483648,2147483647] to GLfloat in [-1.0,1.0] */
-#define INT_TO_FLOAT(I)                ((2.0F * (I) + 1.0F) * (1.0F/4294967294.0F))
+#define PACK_COLOR_4444( a, b, c, d )                                  \
+   ((((a) & 0xf0) << 8) | (((b) & 0xf0) << 4) | ((c) & 0xf0) | ((d) >> 4))
 
-/* Convert GLfloat in [-1.0,1.0] to GLint in [-2147483648,2147483647] */
-/* causes overflow:
-#define FLOAT_TO_INT(X)                ( (((GLint) (4294967294.0F * (X))) - 1) / 2 )
-*/
-/* a close approximation: */
-#define FLOAT_TO_INT(X)                ( (GLint) (2147483647.0 * (X)) )
+#define PACK_COLOR_88( a, b )                                          \
+   (((a) << 8) | (b))
 
+#define PACK_COLOR_332( a, b, c )                                      \
+   (((a) & 0xe0) | (((b) & 0xe0) >> 3) | (((c) & 0xc0) >> 6))
 
-/* XXX chan fix me */
-#define CHAN_TO_FLOAT(C)        ( (GLfloat) ((C) * (1.0 / CHAN_MAXF)) )
 
 #endif