From: Benjamin Otte <o...@gnome.org>

Code taken from Cairo.
---
 configure.ac            |    1 +
 pixman/pixman-access.c  |   35 +++++++++--------------------------
 pixman/pixman-private.h |   18 ++++++++++++++++++
 3 files changed, 28 insertions(+), 26 deletions(-)

diff --git a/configure.ac b/configure.ac
index aabe721..7aed963 100644
--- a/configure.ac
+++ b/configure.ac
@@ -74,6 +74,7 @@ AC_PROG_CC
 AM_PROG_AS
 AC_PROG_LIBTOOL
 AC_CHECK_FUNCS([getisax])
+AC_CHECK_HEADERS(byteswap.h)
 AC_C_BIGENDIAN
 AC_C_INLINE
 
diff --git a/pixman/pixman-access.c b/pixman/pixman-access.c
index fa0a267..5e203f6 100644
--- a/pixman/pixman-access.c
+++ b/pixman/pixman-access.c
@@ -184,11 +184,8 @@ fetch_scanline_b8g8r8a8 (pixman_image_t *image,
     while (pixel < end)
     {
        uint32_t p = READ (image, pixel++);
-
-       *buffer++ = (((p & 0xff000000) >> 24)   |
-                    ((p & 0x00ff0000) >> 8)    |
-                    ((p & 0x0000ff00) << 8)    |
-                    ((p & 0x000000ff) << 24));
+       
+       *buffer++ = bswap_32 (p);
     }
 }
 
@@ -209,10 +206,7 @@ fetch_scanline_b8g8r8x8 (pixman_image_t *image,
     {
        uint32_t p = READ (image, pixel++);
        
-       *buffer++ = (0xff000000 |
-                    ((p & 0xff000000) >> 24)   |
-                    ((p & 0x00ff0000) >> 8)    |
-                    ((p & 0x0000ff00) << 8));
+       *buffer++ = 0xff000000 | bswap_32 (p);
     }
 }
 
@@ -1285,10 +1279,7 @@ fetch_pixel_b8g8r8a8 (bits_image_t *image,
     uint32_t *bits = image->bits + line * image->rowstride;
     uint32_t pixel = READ (image, (uint32_t *)bits + offset);
     
-    return ((pixel & 0xff000000) >> 24 |
-           (pixel & 0x00ff0000) >> 8 |
-           (pixel & 0x0000ff00) << 8 |
-           (pixel & 0x000000ff) << 24);
+    return bswap_32 (pixel);
 }
 
 static uint32_t
@@ -1299,10 +1290,7 @@ fetch_pixel_b8g8r8x8 (bits_image_t *image,
     uint32_t *bits = image->bits + line * image->rowstride;
     uint32_t pixel = READ (image, (uint32_t *)bits + offset);
     
-    return ((0xff000000) |
-           (pixel & 0xff000000) >> 24 |
-           (pixel & 0x00ff0000) >> 8 |
-           (pixel & 0x0000ff00) << 8);
+    return 0xff000000 | bswap_32 (pixel);
 }
 
 static uint32_t
@@ -1997,11 +1985,8 @@ store_scanline_b8g8r8a8 (bits_image_t *  image,
     
     for (i = 0; i < width; ++i)
     {
-       WRITE (image, pixel++,
-              ((values[i] >> 24) & 0x000000ff) |
-              ((values[i] >>  8) & 0x0000ff00) |
-              ((values[i] <<  8) & 0x00ff0000) |
-              ((values[i] << 24) & 0xff000000));
+        uint32_t p = bswap_32 (values[i]);
+       WRITE (image, pixel++, p);
     }
 }
 
@@ -2018,10 +2003,8 @@ store_scanline_b8g8r8x8 (bits_image_t *  image,
     
     for (i = 0; i < width; ++i)
     {
-       WRITE (image, pixel++,
-              ((values[i] >>  8) & 0x0000ff00) |
-              ((values[i] <<  8) & 0x00ff0000) |
-              ((values[i] << 24) & 0xff000000));
+        uint32_t p = bswap_32 (values[i]);
+       WRITE (image, pixel++, p);
     }
 }
 
diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h
index d5767af..c4f5064 100644
--- a/pixman/pixman-private.h
+++ b/pixman/pixman-private.h
@@ -686,6 +686,24 @@ pixman_region16_copy_from_region32 (pixman_region16_t *dst,
 #  define MAX(a, b) ((a > b) ? a : b)
 #endif
 
+/* Byte swapping */
+#if HAVE_BYTESWAP_H
+# include <byteswap.h>
+#endif
+#ifndef bswap_16
+# define bswap_16(p) \
+       (((((uint16_t)(p)) & 0x00ff) << 8) | \
+         (((uint16_t)(p))           >> 8));
+#endif
+#ifndef bswap_32
+# define bswap_32(p) \
+         (((((uint32_t)(p)) & 0x000000ff) << 24) | \
+         ((((uint32_t)(p)) & 0x0000ff00) << 8)  | \
+         ((((uint32_t)(p)) & 0x00ff0000) >> 8)  | \
+         ((((uint32_t)(p)))              >> 24));
+#endif
+
+
 /* Integer division that rounds towards -infinity */
 #define DIV(a, b)                                         \
     ((((a) < 0) == ((b) < 0)) ? (a) / (b) :                \
-- 
1.7.0.1

_______________________________________________
Pixman mailing list
Pixman@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/pixman

Reply via email to