Use MAKE_ACCESSORS() to generate accessors for 24bpp formats
authorSøren Sandmann Pedersen <ssp@redhat.com>
Tue, 16 Aug 2011 18:38:44 +0000 (14:38 -0400)
committerSøren Sandmann Pedersen <ssp@redhat.com>
Tue, 20 Sep 2011 10:44:05 +0000 (06:44 -0400)
Add FETCH_24 and STORE_24 macros and use them to add support for 24bpp
pixels in fetch_and_convert_pixel() and
convert_and_store_pixel(). Then use MAKE_ACCESSORS() to generate
accessors for the 24 bpp formats:

    r8g8b8
    b8g8r8

pixman/pixman-access.c

index b107d3b..30544e4 100644 (file)
     (((4 * (o)) & 4) ? (FETCH_8 (img, l, 4 * (o)) >> 4) : (FETCH_8 (img, l, (4 * (o))) & 0xf))
 #endif
 
+#ifdef WORDS_BIGENDIAN
+#define FETCH_24(img,l,o)                                              \
+    ((READ (img, (((uint8_t *)(l)) + ((o) * 3) + 0)) << 16)    |       \
+     (READ (img, (((uint8_t *)(l)) + ((o) * 3) + 1)) << 8)     |       \
+     (READ (img, (((uint8_t *)(l)) + ((o) * 3) + 2)) << 0))
+#else
+#define FETCH_24(img,l,o)                                              \
+    ((READ (img, (((uint8_t *)(l)) + ((o) * 3) + 0)) << 0)     |       \
+     (READ (img, (((uint8_t *)(l)) + ((o) * 3) + 1)) << 8)     |       \
+     (READ (img, (((uint8_t *)(l)) + ((o) * 3) + 2)) << 16))
+#endif
+
 /* Store macros */
 
 #define STORE_8(img,l,o,v)  (WRITE (img, (uint8_t *)(l) + ((o) >> 3), (v)))
     } while (0)
 #endif
 
+#ifdef WORDS_BIGENDIAN
+#define STORE_24(img,l,o,v)                                            \
+    do                                                                 \
+    {                                                                  \
+       uint8_t *__tmp = (l) + 3 * (o);                                \
+                                                                      \
+       WRITE ((img), __tmp++, ((v) & 0x00ff0000) >> 16);              \
+       WRITE ((img), __tmp++, ((v) & 0x0000ff00) >>  8);              \
+       WRITE ((img), __tmp++, ((v) & 0x000000ff) >>  0);              \
+    }                                                                  \
+    while (0)
+#else
+#define STORE_24(img,l,o,v)                                            \
+    do                                                                 \
+    {                                                                  \
+       uint8_t *__tmp = (l) + 3 * (o);                                \
+                                                                      \
+       WRITE ((img), __tmp++, ((v) & 0x000000ff) >>  0);              \
+       WRITE ((img), __tmp++, ((v) & 0x0000ff00) >>  8);              \
+       WRITE ((img), __tmp++, ((v) & 0x00ff0000) >> 16);              \
+    }                                                                  \
+    while (0)
+#endif
+
 /*
  * YV12 setup and access macros
  */
@@ -262,6 +298,10 @@ fetch_and_convert_pixel (pixman_image_t    *       image,
        pixel = READ (image, ((uint16_t *)bits + offset));
        break;
 
+    case 24:
+       pixel = FETCH_24 (image, bits, offset);
+       break;
+
     case 32:
        pixel = READ (image, ((uint32_t *)bits + offset));
        break;
@@ -297,6 +337,10 @@ convert_and_store_pixel (bits_image_t *            image,
        WRITE (image, ((uint16_t *)dest + offset), converted & 0xffff);
        break;
 
+    case 24:
+       STORE_24 (image, dest, offset, converted);
+       break;
+
     case 32:
        WRITE (image, ((uint32_t *)dest + offset), converted);
        break;
@@ -368,6 +412,8 @@ MAKE_ACCESSORS(b8g8r8a8);
 MAKE_ACCESSORS(b8g8r8x8);
 MAKE_ACCESSORS(r8g8b8x8);
 MAKE_ACCESSORS(r8g8b8a8);
+MAKE_ACCESSORS(r8g8b8);
+MAKE_ACCESSORS(b8g8r8);
 MAKE_ACCESSORS(r5g6b5);
 MAKE_ACCESSORS(b5g6r5);
 MAKE_ACCESSORS(a1r5g5b5);
@@ -521,64 +567,6 @@ fetch_scanline_x2b10g10r10 (pixman_image_t *image,
 }
 
 static void
-fetch_scanline_r8g8b8 (pixman_image_t *image,
-                       int             x,
-                       int             y,
-                       int             width,
-                       uint32_t *      buffer,
-                       const uint32_t *mask)
-{
-    const uint32_t *bits = image->bits.bits + y * image->bits.rowstride;
-    const uint8_t *pixel = (const uint8_t *)bits + 3 * x;
-    const uint8_t *end = pixel + 3 * width;
-    
-    while (pixel < end)
-    {
-       uint32_t b = 0xff000000;
-       
-#ifdef WORDS_BIGENDIAN
-       b |= (READ (image, pixel++) << 16);
-       b |= (READ (image, pixel++) << 8);
-       b |= (READ (image, pixel++));
-#else
-       b |= (READ (image, pixel++));
-       b |= (READ (image, pixel++) << 8);
-       b |= (READ (image, pixel++) << 16);
-#endif
-       
-       *buffer++ = b;
-    }
-}
-
-static void
-fetch_scanline_b8g8r8 (pixman_image_t *image,
-                       int             x,
-                       int             y,
-                       int             width,
-                       uint32_t *      buffer,
-                       const uint32_t *mask)
-{
-    const uint32_t *bits = image->bits.bits + y * image->bits.rowstride;
-    const uint8_t *pixel = (const uint8_t *)bits + 3 * x;
-    const uint8_t *end = pixel + 3 * width;
-    
-    while (pixel < end)
-    {
-       uint32_t b = 0xff000000;
-#ifdef WORDS_BIGENDIAN
-       b |= (READ (image, pixel++));
-       b |= (READ (image, pixel++) << 8);
-       b |= (READ (image, pixel++) << 16);
-#else
-       b |= (READ (image, pixel++) << 16);
-       b |= (READ (image, pixel++) << 8);
-       b |= (READ (image, pixel++));
-#endif
-       *buffer++ = b;
-    }
-}
-
-static void
 fetch_scanline_c8 (pixman_image_t *image,
                    int             x,
                    int             y,
@@ -839,47 +827,6 @@ fetch_pixel_x2b10g10r10 (bits_image_t *image,
 }
 
 static uint32_t
-fetch_pixel_r8g8b8 (bits_image_t *image,
-                   int           offset,
-                   int           line)
-{
-    uint32_t *bits = image->bits + line * image->rowstride;
-    uint8_t   *pixel = ((uint8_t *) bits) + (offset * 3);
-    
-#ifdef WORDS_BIGENDIAN
-    return (0xff000000 |
-           (READ (image, pixel + 0) << 16) |
-           (READ (image, pixel + 1) << 8) |
-           (READ (image, pixel + 2)));
-#else
-    return (0xff000000 |
-           (READ (image, pixel + 2) << 16) |
-           (READ (image, pixel + 1) << 8) |
-           (READ (image, pixel + 0)));
-#endif
-}
-
-static uint32_t
-fetch_pixel_b8g8r8 (bits_image_t *image,
-                   int           offset,
-                   int           line)
-{
-    uint32_t *bits = image->bits + line * image->rowstride;
-    uint8_t   *pixel = ((uint8_t *) bits) + (offset * 3);
-#ifdef WORDS_BIGENDIAN
-    return (0xff000000 |
-           (READ (image, pixel + 2) << 16) |
-           (READ (image, pixel + 1) << 8) |
-           (READ (image, pixel + 0)));
-#else
-    return (0xff000000 |
-           (READ (image, pixel + 0) << 16) |
-           (READ (image, pixel + 1) << 8) |
-           (READ (image, pixel + 2)));
-#endif
-}
-
-static uint32_t
 fetch_pixel_c8 (bits_image_t *image,
                int           offset,
                int           line)
@@ -1089,60 +1036,6 @@ store_scanline_x2b10g10r10 (bits_image_t *  image,
 }
 
 static void
-store_scanline_r8g8b8 (bits_image_t *  image,
-                       int             x,
-                       int             y,
-                       int             width,
-                       const uint32_t *values)
-{
-    uint32_t *bits = image->bits + image->rowstride * y;
-    uint8_t *pixel = ((uint8_t *) bits) + 3 * x;
-    int i;
-    
-    for (i = 0; i < width; ++i)
-    {
-       uint32_t val = values[i];
-       
-#ifdef WORDS_BIGENDIAN
-       WRITE (image, pixel++, (val & 0x00ff0000) >> 16);
-       WRITE (image, pixel++, (val & 0x0000ff00) >>  8);
-       WRITE (image, pixel++, (val & 0x000000ff) >>  0);
-#else
-       WRITE (image, pixel++, (val & 0x000000ff) >>  0);
-       WRITE (image, pixel++, (val & 0x0000ff00) >>  8);
-       WRITE (image, pixel++, (val & 0x00ff0000) >> 16);
-#endif
-    }
-}
-
-static void
-store_scanline_b8g8r8 (bits_image_t *  image,
-                       int             x,
-                       int             y,
-                       int             width,
-                       const uint32_t *values)
-{
-    uint32_t *bits = image->bits + image->rowstride * y;
-    uint8_t *pixel = ((uint8_t *) bits) + 3 * x;
-    int i;
-    
-    for (i = 0; i < width; ++i)
-    {
-       uint32_t val = values[i];
-       
-#ifdef WORDS_BIGENDIAN
-       WRITE (image, pixel++, (val & 0x000000ff) >>  0);
-       WRITE (image, pixel++, (val & 0x0000ff00) >>  8);
-       WRITE (image, pixel++, (val & 0x00ff0000) >> 16);
-#else
-       WRITE (image, pixel++, (val & 0x00ff0000) >> 16);
-       WRITE (image, pixel++, (val & 0x0000ff00) >>  8);
-       WRITE (image, pixel++, (val & 0x000000ff) >>  0);
-#endif
-    }
-}
-
-static void
 store_scanline_c8 (bits_image_t *  image,
                    int             x,
                    int             y,