pixman: Branch 'master' - 2 commits

Søren Sandmann Pedersen sandmann at kemper.freedesktop.org
Wed Aug 4 06:01:23 PDT 2010


 pixman/pixman-access.c |   68 ++++++++++++++++++++++++++++++++++++++++++++++++-
 pixman/pixman.c        |    1 
 pixman/pixman.h        |    1 
 test/blitters-test.c   |    3 +-
 4 files changed, 71 insertions(+), 2 deletions(-)

New commits:
commit b243a66041456dba278b04f813deac4f99bbe621
Author: Søren Sandmann Pedersen <ssp at redhat.com>
Date:   Wed Aug 4 08:58:51 2010 -0400

    Add x14r6g6b6 format to blitters-test

diff --git a/test/blitters-test.c b/test/blitters-test.c
index 2c6334a..fb2c4b9 100644
--- a/test/blitters-test.c
+++ b/test/blitters-test.c
@@ -197,6 +197,7 @@ static pixman_format_code_t img_fmt_list[] = {
     PIXMAN_x8b8g8r8,
     PIXMAN_b8g8r8a8,
     PIXMAN_b8g8r8x8,
+    PIXMAN_x14r6g6b6,
     PIXMAN_r8g8b8,
     PIXMAN_b8g8r8,
     PIXMAN_r5g6b5,
@@ -478,6 +479,6 @@ main (int argc, const char *argv[])
     }
 
     return fuzzer_test_main("blitters", 2000000,
-			    0xD5833506,
+			    0x217CF14A,
 			    test_composite, argc, argv);
 }
commit d6a7b1542448e7ee41f2c2a129bd0af2668185bb
Author: Marek Vasut <marek.vasut at gmail.com>
Date:   Sun Aug 1 02:18:52 2010 +0200

    Add support for 32bpp X14R6G6B6 format.
    
    This format is used on PXA framebuffer with some boards. It uses only 18 bits
    from the 32 bit framebuffer to interpret color.
    
    Signed-off-by: Marek Vasut <marek.vasut at gmail.com>

diff --git a/pixman/pixman-access.c b/pixman/pixman-access.c
index 80fa9e8..a511e4c 100644
--- a/pixman/pixman-access.c
+++ b/pixman/pixman-access.c
@@ -210,6 +210,31 @@ fetch_scanline_b8g8r8x8 (pixman_image_t *image,
     }
 }
 
+static void
+fetch_scanline_x14r6g6b6 (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 uint32_t *pixel = (const uint32_t *)bits + x;
+    const uint32_t *end = pixel + width;
+
+    while (pixel < end)
+    {
+	uint32_t p = READ (image, pixel++);
+	uint32_t r, g, b;
+
+	r = ((p & 0x3f000) << 6) | ((p & 0x30000));
+	g = ((p & 0x00fc0) << 4) | ((p & 0x00c00) >> 2);
+	b = ((p & 0x0003f) << 2) | ((p & 0x00030) >> 4);
+
+	*buffer++ = 0xff000000 | r | g | b;
+    }
+}
+
 /* Expects a uint64_t buffer */
 static void
 fetch_scanline_a2r10g10b10 (pixman_image_t *image,
@@ -1267,6 +1292,22 @@ fetch_pixel_b8g8r8x8 (bits_image_t *image,
 }
 
 static uint32_t
+fetch_pixel_x14r6g6b6 (bits_image_t *image,
+                       int           offset,
+                       int           line)
+{
+    uint32_t *bits = image->bits + line * image->rowstride;
+    uint32_t pixel = READ (image, (uint32_t *) bits + offset);
+    uint32_t r, g, b;
+
+    r = ((pixel & 0x3f000) << 6) | ((pixel & 0x30000));
+    g = ((pixel & 0x00fc0) << 4) | ((pixel & 0x00c00) >> 2);
+    b = ((pixel & 0x0003f) << 2) | ((pixel & 0x00030) >> 4);
+
+    return 0xff000000 | r | g | b;
+}
+
+static uint32_t
 fetch_pixel_r8g8b8 (bits_image_t *image,
 		    int           offset,
 		    int           line)
@@ -1987,6 +2028,30 @@ store_scanline_b8g8r8x8 (bits_image_t *  image,
 }
 
 static void
+store_scanline_x14r6g6b6 (bits_image_t *  image,
+                          int             x,
+                          int             y,
+                          int             width,
+                          const uint32_t *values)
+{
+    uint32_t *bits = image->bits + image->rowstride * y;
+    uint32_t *pixel = ((uint32_t *) bits) + x;
+    int i;
+
+    for (i = 0; i < width; ++i)
+    {
+	uint32_t s = values[i];
+	uint32_t r, g, b;
+
+	r = (s & 0xfc0000) >> 6;
+	g = (s & 0x00fc00) >> 4;
+	b = (s & 0x0000fc) >> 2;
+
+	WRITE (image, pixel++, r | g | b);
+    }
+}
+
+static void
 store_scanline_r8g8b8 (bits_image_t *  image,
                        int             x,
                        int             y,
@@ -2780,7 +2845,8 @@ static const format_info_t accessors[] =
     FORMAT_INFO (x8b8g8r8),
     FORMAT_INFO (b8g8r8a8),
     FORMAT_INFO (b8g8r8x8),
-    
+    FORMAT_INFO (x14r6g6b6),
+
 /* 24bpp formats */
     FORMAT_INFO (r8g8b8),
     FORMAT_INFO (b8g8r8),
diff --git a/pixman/pixman.c b/pixman/pixman.c
index 80a766a..318226d 100644
--- a/pixman/pixman.c
+++ b/pixman/pixman.c
@@ -1142,6 +1142,7 @@ pixman_format_supported_source (pixman_format_code_t format)
     case PIXMAN_b8g8r8:
     case PIXMAN_r5g6b5:
     case PIXMAN_b5g6r5:
+    case PIXMAN_x14r6g6b6:
     /* 16 bpp formats */
     case PIXMAN_a1r5g5b5:
     case PIXMAN_x1r5g5b5:
diff --git a/pixman/pixman.h b/pixman/pixman.h
index 9981f0d..cfffa79 100644
--- a/pixman/pixman.h
+++ b/pixman/pixman.h
@@ -664,6 +664,7 @@ typedef enum {
     PIXMAN_x8b8g8r8 =	 PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,0,8,8,8),
     PIXMAN_b8g8r8a8 =	 PIXMAN_FORMAT(32,PIXMAN_TYPE_BGRA,8,8,8,8),
     PIXMAN_b8g8r8x8 =	 PIXMAN_FORMAT(32,PIXMAN_TYPE_BGRA,0,8,8,8),
+    PIXMAN_x14r6g6b6 =	 PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,0,6,6,6),
     PIXMAN_x2r10g10b10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,0,10,10,10),
     PIXMAN_a2r10g10b10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,2,10,10,10),
     PIXMAN_x2b10g10r10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,0,10,10,10),


More information about the xorg-commit mailing list