pixman: Branch 'master' - 3 commits

Søren Sandmann Pedersen sandmann at kemper.freedesktop.org
Thu Mar 24 12:17:36 PDT 2011


 pixman/pixman-access.c |   97 +++++++++++++++++++++++++++++++++++++++++++++++++
 pixman/pixman.c        |    6 +++
 pixman/pixman.h        |    6 ++-
 test/blitters-test.c   |    9 +++-
 test/composite.c       |   17 ++++++--
 test/fetch-test.c      |   10 +++++
 test/stress-test.c     |    2 +
 7 files changed, 140 insertions(+), 7 deletions(-)

New commits:
commit ad3cbfb073fc325e1b3152898ca71b8255675957
Author: Søren Sandmann Pedersen <ssp at redhat.com>
Date:   Tue Mar 22 13:42:05 2011 -0400

    test: Fix infinite loop in composite
    
    When run in PIXMAN_RANDOMIZE_TESTS mode, this test would go into an
    infinite loop because the loop started at 'seed' but the stop
    condition was still N_TESTS.

diff --git a/test/composite.c b/test/composite.c
index b0e0ba4..9a001e5 100644
--- a/test/composite.c
+++ b/test/composite.c
@@ -909,13 +909,13 @@ main (int argc, char **argv)
 #ifdef USE_OPENMP
 #   pragma omp parallel for default(none) shared(result, argv, seed)
 #endif
-    for (i = seed; i <= N_TESTS; ++i)
+    for (i = 0; i <= N_TESTS; ++i)
     {
-	if (!result && !run_test (i))
+	if (!result && !run_test (i + seed))
 	{
-	    printf ("Test 0x%08X failed.\n", i);
+	    printf ("Test 0x%08X failed.\n", seed + i);
 	    
-	    result = i;
+	    result = seed + i;
 	}
     }
     
commit b514e63cfc58af21f7097db5a1b04292a758782a
Author: Alexandros Frantzis <alexandros.frantzis at linaro.org>
Date:   Fri Mar 18 14:37:27 2011 +0200

    Add support for the r8g8b8a8 and r8g8b8x8 formats to the tests.

diff --git a/test/blitters-test.c b/test/blitters-test.c
index 63e7cb3..3ecfb09 100644
--- a/test/blitters-test.c
+++ b/test/blitters-test.c
@@ -88,8 +88,11 @@ free_random_image (uint32_t initcrc,
 	    uint32_t *data = pixman_image_get_data (img);
 	    uint32_t mask = (1 << PIXMAN_FORMAT_DEPTH (fmt)) - 1;
 
-	    if (PIXMAN_FORMAT_TYPE (fmt) == PIXMAN_TYPE_BGRA)
+	    if (PIXMAN_FORMAT_TYPE (fmt) == PIXMAN_TYPE_BGRA ||
+		PIXMAN_FORMAT_TYPE (fmt) == PIXMAN_TYPE_RGBA)
+	    {
 		mask <<= (PIXMAN_FORMAT_BPP (fmt) - PIXMAN_FORMAT_DEPTH (fmt));
+	    }
 
 	    for (i = 0; i < 32; i++)
 		mask |= mask << (i * PIXMAN_FORMAT_BPP (fmt));
@@ -182,6 +185,8 @@ static pixman_format_code_t img_fmt_list[] = {
     PIXMAN_x8b8g8r8,
     PIXMAN_b8g8r8a8,
     PIXMAN_b8g8r8x8,
+    PIXMAN_r8g8b8a8,
+    PIXMAN_r8g8b8x8,
     PIXMAN_x14r6g6b6,
     PIXMAN_r8g8b8,
     PIXMAN_b8g8r8,
@@ -412,6 +417,6 @@ main (int argc, const char *argv[])
     }
 
     return fuzzer_test_main("blitters", 2000000,
-			    0x1DB8BDF8,
+			    0x265CDFEB,
 			    test_composite, argc, argv);
 }
diff --git a/test/composite.c b/test/composite.c
index e6d52b9..b0e0ba4 100644
--- a/test/composite.c
+++ b/test/composite.c
@@ -102,6 +102,8 @@ static const format_t formats[] =
     P(x8b8g8r8),
     P(b8g8r8a8),
     P(b8g8r8x8),
+    P(r8g8b8a8),
+    P(r8g8b8x8),
     P(x2r10g10b10),
     P(x2b10g10r10),
     P(a2r10g10b10),
@@ -556,6 +558,13 @@ get_pixel (pixman_image_t *image,
         bs = g + gs;
 	break;
 
+    case PIXMAN_TYPE_RGBA:
+	as = 0;
+	bs = PIXMAN_FORMAT_BPP (format) - (b + g + r);
+	gs = b + bs;
+	rs = g + gs;
+	break;
+
     case PIXMAN_TYPE_A:
         as = 0;
         rs = 0;
diff --git a/test/fetch-test.c b/test/fetch-test.c
index 60bc765..feb98d9 100644
--- a/test/fetch-test.c
+++ b/test/fetch-test.c
@@ -34,6 +34,16 @@ static testcase_t testcases[] =
 	NULL,
     },
     {
+	PIXMAN_r8g8b8a8,
+	2, 2,
+	8,
+	{ 0x11223300, 0x55667744,
+	  0x99aabb88, 0xddeeffcc },
+	{ 0x00112233, 0x44556677,
+	  0x8899aabb, 0xccddeeff },
+	NULL,
+    },
+    {
 	PIXMAN_g1,
 	8, 2,
 	4,
diff --git a/test/stress-test.c b/test/stress-test.c
index d496f93..571420a 100644
--- a/test/stress-test.c
+++ b/test/stress-test.c
@@ -19,6 +19,8 @@ static const pixman_format_code_t image_formats[] =
     PIXMAN_x8b8g8r8,
     PIXMAN_b8g8r8a8,
     PIXMAN_b8g8r8x8,
+    PIXMAN_r8g8b8a8,
+    PIXMAN_r8g8b8x8,
     PIXMAN_x14r6g6b6,
     PIXMAN_r8g8b8,
     PIXMAN_b8g8r8,
commit f05a90e5f8d1d0af60e2c684cbe9f1327c33135a
Author: Alexandros Frantzis <alexandros.frantzis at linaro.org>
Date:   Fri Mar 18 14:36:15 2011 +0200

    Add simple support for the r8g8b8a8 and r8g8b8x8 formats.
    
    This format is particularly useful on big-endian architectures, where RGBA in
    memory/file order corresponds to r8g8b8a8 as an uint32_t. This is important
    because RGBA is in some cases the only available choice (for example as a pixel
    format in OpenGL ES 2.0).

diff --git a/pixman/pixman-access.c b/pixman/pixman-access.c
index f1ce0ba..32c4d8b 100644
--- a/pixman/pixman-access.c
+++ b/pixman/pixman-access.c
@@ -211,6 +211,46 @@ fetch_scanline_b8g8r8x8 (pixman_image_t *image,
 }
 
 static void
+fetch_scanline_r8g8b8a8 (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 = (uint32_t *)bits + x;
+    const uint32_t *end = pixel + width;
+
+    while (pixel < end)
+    {
+	uint32_t p = READ (image, pixel++);
+
+	*buffer++ = (((p & 0x000000ff) << 24) | (p >> 8));
+    }
+}
+
+static void
+fetch_scanline_r8g8b8x8 (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 = (uint32_t *)bits + x;
+    const uint32_t *end = pixel + width;
+    
+    while (pixel < end)
+    {
+	uint32_t p = READ (image, pixel++);
+	
+	*buffer++ = (0xff000000 | (p >> 8));
+    }
+}
+
+static void
 fetch_scanline_x14r6g6b6 (pixman_image_t *image,
                           int             x,
                           int             y,
@@ -1292,6 +1332,28 @@ fetch_pixel_b8g8r8x8 (bits_image_t *image,
 }
 
 static uint32_t
+fetch_pixel_r8g8b8a8 (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);
+    
+    return (((pixel & 0x000000ff) << 24) | (pixel >> 8));
+}
+
+static uint32_t
+fetch_pixel_r8g8b8x8 (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);
+    
+    return (0xff000000 | (pixel >> 8));
+}
+
+static uint32_t
 fetch_pixel_x14r6g6b6 (bits_image_t *image,
                        int           offset,
                        int           line)
@@ -2028,6 +2090,39 @@ store_scanline_b8g8r8x8 (bits_image_t *  image,
 }
 
 static void
+store_scanline_r8g8b8a8 (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)
+    {
+	WRITE (image, pixel++,
+	       ((values[i] >> 24) & 0x000000ff) | (values[i] << 8));
+    }
+}
+
+static void
+store_scanline_r8g8b8x8 (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)
+	WRITE (image, pixel++, (values[i] << 8));
+}
+
+static void
 store_scanline_x14r6g6b6 (bits_image_t *  image,
                           int             x,
                           int             y,
@@ -2845,6 +2940,8 @@ static const format_info_t accessors[] =
     FORMAT_INFO (x8b8g8r8),
     FORMAT_INFO (b8g8r8a8),
     FORMAT_INFO (b8g8r8x8),
+    FORMAT_INFO (r8g8b8a8),
+    FORMAT_INFO (r8g8b8x8),
     FORMAT_INFO (x14r6g6b6),
 
 /* 24bpp formats */
diff --git a/pixman/pixman.c b/pixman/pixman.c
index ec565f9..f21af2f 100644
--- a/pixman/pixman.c
+++ b/pixman/pixman.c
@@ -873,6 +873,8 @@ color_to_pixel (pixman_color_t *     color,
           format == PIXMAN_x8b8g8r8     ||
           format == PIXMAN_b8g8r8a8     ||
           format == PIXMAN_b8g8r8x8     ||
+          format == PIXMAN_r8g8b8a8     ||
+          format == PIXMAN_r8g8b8x8     ||
           format == PIXMAN_r5g6b5       ||
           format == PIXMAN_b5g6r5       ||
           format == PIXMAN_a8           ||
@@ -895,6 +897,8 @@ color_to_pixel (pixman_color_t *     color,
 	    ((c & 0x0000ff00) <<  8) |
 	    ((c & 0x000000ff) << 24);
     }
+    if (PIXMAN_FORMAT_TYPE (format) == PIXMAN_TYPE_RGBA)
+	c = ((c & 0xff000000) >> 24) | (c << 8);
 
     if (format == PIXMAN_a1)
 	c = c >> 31;
@@ -1105,6 +1109,8 @@ pixman_format_supported_source (pixman_format_code_t format)
     case PIXMAN_x8b8g8r8:
     case PIXMAN_b8g8r8a8:
     case PIXMAN_b8g8r8x8:
+    case PIXMAN_r8g8b8a8:
+    case PIXMAN_r8g8b8x8:
     case PIXMAN_r8g8b8:
     case PIXMAN_b8g8r8:
     case PIXMAN_r5g6b5:
diff --git a/pixman/pixman.h b/pixman/pixman.h
index 1305bc1..59d0760 100644
--- a/pixman/pixman.h
+++ b/pixman/pixman.h
@@ -650,11 +650,13 @@ struct pixman_indexed
 #define PIXMAN_TYPE_YUY2	6
 #define PIXMAN_TYPE_YV12	7
 #define PIXMAN_TYPE_BGRA	8
+#define PIXMAN_TYPE_RGBA	9
 
 #define PIXMAN_FORMAT_COLOR(f)				\
 	(PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_ARGB ||	\
 	 PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_ABGR ||	\
-	 PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_BGRA)
+	 PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_BGRA ||	\
+	 PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_RGBA)
 
 /* 32bpp formats */
 typedef enum {
@@ -664,6 +666,8 @@ 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_r8g8b8a8 =	 PIXMAN_FORMAT(32,PIXMAN_TYPE_RGBA,8,8,8,8),
+    PIXMAN_r8g8b8x8 =	 PIXMAN_FORMAT(32,PIXMAN_TYPE_RGBA,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),


More information about the xorg-commit mailing list