[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

pixman: Changes to 'upstream-experimental'



 CODING_STYLE                     |  216 ++++
 configure.ac                     |    6 
 pixman/pixman-access.c           | 1745 ++++++++++++---------------------------
 pixman/pixman-bits-image.c       |  610 ++++---------
 pixman/pixman-combine.c.template |   22 
 pixman/pixman-combine.h.template |  257 ++---
 pixman/pixman-conical-gradient.c |    2 
 pixman/pixman-fast-path.c        |   85 +
 pixman/pixman-general.c          |    2 
 pixman/pixman-image.c            |   19 
 pixman/pixman-linear-gradient.c  |    4 
 pixman/pixman-mmx.c              |   66 -
 pixman/pixman-private.h          |   42 
 pixman/pixman-radial-gradient.c  |   75 +
 pixman/pixman-region.c           |   31 
 pixman/pixman-solid-fill.c       |    4 
 pixman/pixman-sse2.c             |  172 +++
 pixman/pixman-trap.c             |    4 
 pixman/pixman-utils.c            |   16 
 pixman/pixman-vmx.c              |  707 ++++++---------
 pixman/pixman.c                  |    7 
 test/Makefile.am                 |    2 
 test/blitters-test-bisect.rb     |   43 
 test/blitters-test.c             |  638 ++++++++++++++
 24 files changed, 2513 insertions(+), 2262 deletions(-)

New commits:
commit bfdae053eaff528aa869bc05a0520ab22d540a08
Author: Søren Sandmann Pedersen <sandmann@redhat.com>
Date:   Tue Aug 11 13:56:16 2009 -0400

    Pre-release version-bump

diff --git a/configure.ac b/configure.ac
index a466b86..c653a20 100644
--- a/configure.ac
+++ b/configure.ac
@@ -54,7 +54,7 @@ AC_PREREQ([2.57])
 
 m4_define([pixman_major], 0)
 m4_define([pixman_minor], 15)
-m4_define([pixman_micro], 19)
+m4_define([pixman_micro], 20)
 
 m4_define([pixman_version],[pixman_major.pixman_minor.pixman_micro])
 

commit 93923c626f2df18e29e215410e6d4bb2f5c1616f
Author: Søren Sandmann Pedersen <sandmann@redhat.com>
Date:   Mon Aug 10 20:47:36 2009 -0400

    Fix x/y mixup in bits_image_fetch_pixel_convolution()
    
    Bug 23224, reported by Michel Dänzer.

diff --git a/pixman/pixman-bits-image.c b/pixman/pixman-bits-image.c
index 9e1ee13..6b80189 100644
--- a/pixman/pixman-bits-image.c
+++ b/pixman/pixman-bits-image.c
@@ -131,7 +131,7 @@ get_pixel (bits_image_t *image, int x, int y, pixman_bool_t check_bounds)
     {
 	return 0;
     }
-	
+
     return image->fetch_pixel_32 (image, x, y);
 }
 
@@ -274,20 +274,20 @@ bits_image_fetch_pixel_convolution (bits_image_t   *image,
     {
 	for (j = x1; j < x2; ++j)
 	{
-	    int rx = i;
-	    int ry = j;
+	    int rx = j;
+	    int ry = i;
 
 	    pixman_fixed_t f = *params;
-	    
+
 	    if (f)
 	    {
 		uint32_t pixel;
-		
+
 		if (repeat_mode != PIXMAN_REPEAT_NONE)
 		{
 		    repeat (repeat_mode, width, &rx);
 		    repeat (repeat_mode, height, &ry);
-		    
+
 		    pixel = get_pixel (image, rx, ry, FALSE);
 		}
 		else
@@ -746,6 +746,7 @@ pixman_image_create_bits (pixman_format_code_t format,
     {
 	if (free_me)
 	    free (free_me);
+
 	return NULL;
     }
 

commit e084351b13faad6a3ba67808b5721957b51d16f0
Author: Søren Sandmann Pedersen <sandmann@redhat.com>
Date:   Fri Aug 7 00:45:53 2009 -0400

    Update CRC value in blitters-test.
    
    At this point, the SIMD, SSE2, MMX and general implementations all
    agree.

diff --git a/test/blitters-test.c b/test/blitters-test.c
index cc829b5..4838e81 100644
--- a/test/blitters-test.c
+++ b/test/blitters-test.c
@@ -623,7 +623,7 @@ main (int argc, char *argv[])
 	    /* Predefined value for running with all the fastpath functions
 	       disabled. It needs to be updated every time when changes are
 	       introduced to this program or behavior of pixman changes! */
-	    if (crc == 0x4895C7B0)
+	    if (crc == 0xFE1244BF)
 	    {
 		printf ("blitters test passed\n");
 	    }

commit ba5c5325e77b36374d3be22bd92816c332a321bb
Author: Søren Sandmann Pedersen <sandmann@redhat.com>
Date:   Fri Aug 7 00:25:56 2009 -0400

    Various formatting fixes

diff --git a/test/blitters-test.c b/test/blitters-test.c
index 350210a..cc829b5 100644
--- a/test/blitters-test.c
+++ b/test/blitters-test.c
@@ -91,8 +91,8 @@ lcg_rand_n (int max)
 
 static uint32_t
 compute_crc32 (uint32_t    in_crc32,
-		  const void *buf,
-		  size_t      buf_len)
+	       const void *buf,
+	       size_t      buf_len)
 {
     static const uint32_t crc_table[256] = {
 	0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F,
@@ -144,7 +144,7 @@ compute_crc32 (uint32_t    in_crc32,
     unsigned char *       byte_buf;
     size_t                i;
 
-    /** accumulate crc32 for buffer **/
+    /* accumulate crc32 for buffer */
     crc32 = in_crc32 ^ 0xFFFFFFFF;
     byte_buf = (unsigned char*) buf;
 
@@ -165,7 +165,8 @@ image_endian_swap (pixman_image_t *img, int bpp)
 
     /* swap bytes only on big endian systems */
     volatile uint16_t endian_check_var = 0x1234;
-    if (*(volatile uint8_t *)&endian_check_var != 0x12) return;
+    if (*(volatile uint8_t *)&endian_check_var != 0x12)
+	return;
 
     for (i = 0; i < height; i++)
     {
@@ -198,6 +199,7 @@ image_endian_swap (pixman_image_t *img, int bpp)
 	    {
 		char t1 = line_data[j + 0];
 		char t2 = line_data[j + 1];
+
 		line_data[j + 1] = t1;
 		line_data[j + 0] = t2;
 	    }
@@ -208,6 +210,7 @@ image_endian_swap (pixman_image_t *img, int bpp)
 		char t1 = line_data[j + 0];
 		char t2 = line_data[j + 1];
 		char t3 = line_data[j + 2];
+
 		line_data[j + 2] = t1;
 		line_data[j + 1] = t2;
 		line_data[j + 0] = t3;
@@ -220,6 +223,7 @@ image_endian_swap (pixman_image_t *img, int bpp)
 		char t2 = line_data[j + 1];
 		char t3 = line_data[j + 2];
 		char t4 = line_data[j + 3];
+
 		line_data[j + 3] = t1;
 		line_data[j + 2] = t2;
 		line_data[j + 1] = t3;
@@ -234,22 +238,24 @@ image_endian_swap (pixman_image_t *img, int bpp)
 
 /* Create random image for testing purposes */
 static pixman_image_t *
-create_random_image (
-	pixman_format_code_t *allowed_formats,
-	int max_width,
-	int max_height,
-	int max_extra_stride,
-	pixman_format_code_t *used_fmt)
+create_random_image (pixman_format_code_t *allowed_formats,
+		     int                   max_width,
+		     int                   max_height,
+		     int                   max_extra_stride,
+		     pixman_format_code_t *used_fmt)
 {
     int n = 0, i, width, height, stride;
     pixman_format_code_t fmt;
     uint32_t *buf;
     pixman_image_t *img;
-    while (allowed_formats[n] != -1) n++;
+
+    while (allowed_formats[n] != -1)
+	n++;
     fmt = allowed_formats[lcg_rand_n (n)];
     width = lcg_rand_n (max_width) + 1;
     height = lcg_rand_n (max_height) + 1;
-    stride = (width * PIXMAN_FORMAT_BPP (fmt) + 7) / 8 + lcg_rand_n (max_extra_stride + 1);
+    stride = (width * PIXMAN_FORMAT_BPP (fmt) + 7) / 8 +
+	lcg_rand_n (max_extra_stride + 1);
     stride = (stride + 3) & ~3;
 
     /* do the allocation */
@@ -259,13 +265,13 @@ create_random_image (
     for (i = 0; i < stride * height; i++)
     {
 	/* generation is biased to having more 0 or 255 bytes as
-	   they are more likely to be special-cased in code */
+	 * they are more likely to be special-cased in code
+	 */
 	*((uint8_t *)buf + i) = lcg_rand_n (4) ? lcg_rand_n (256) :
 	    (lcg_rand_n (2) ? 0 : 255);
     }
 
-    img = pixman_image_create_bits (
-	fmt, width, height, buf, stride);
+    img = pixman_image_create_bits (fmt, width, height, buf, stride);
 
     image_endian_swap (img, PIXMAN_FORMAT_BPP (fmt));
 
@@ -275,10 +281,9 @@ create_random_image (
 
 /* Free random image, and optionally update crc32 based on its data */
 static uint32_t
-free_random_image (
-    uint32_t initcrc,
-    pixman_image_t *img,
-    pixman_format_code_t fmt)
+free_random_image (uint32_t initcrc,
+		   pixman_image_t *img,
+		   pixman_format_code_t fmt)
 {
     uint32_t crc32 = 0;
     int stride = pixman_image_get_stride (img);
@@ -294,19 +299,24 @@ free_random_image (
 	    int i;
 	    uint32_t *data = pixman_image_get_data (img);
 	    uint32_t mask = (1 << PIXMAN_FORMAT_DEPTH (fmt)) - 1;
+
 	    for (i = 0; i < 32; i++)
 		mask |= mask << (i * PIXMAN_FORMAT_BPP (fmt));
 
 	    for (i = 0; i < stride * height / 4; i++)
 		data[i] &= mask;
 	}
+
 	/* swap endiannes in order to provide identical results on both big
-	   and litte endian systems */
+	 * and litte endian systems
+	 */
 	image_endian_swap (img, PIXMAN_FORMAT_BPP (fmt));
 	crc32 = compute_crc32 (initcrc, data, stride * height);
     }
+
     pixman_image_unref (img);
     free (data);
+
     return crc32;
 }
 
@@ -370,6 +380,7 @@ static pixman_op_t op_list[] = {
     PIXMAN_OP_HSL_LUMINOSITY,
 #endif
 };
+
 static pixman_format_code_t img_fmt_list[] = {
     PIXMAN_a8r8g8b8,
     PIXMAN_x8r8g8b8,
@@ -419,6 +430,7 @@ static pixman_format_code_t img_fmt_list[] = {
     PIXMAN_a1,
     -1
 };
+
 static pixman_format_code_t mask_fmt_list[] = {
     PIXMAN_a8r8g8b8,
     PIXMAN_a8,
@@ -452,9 +464,15 @@ test_composite (uint32_t initcrc, int testnum, int verbose)
 
     max_width = max_height = 24 + testnum / 10000;
     max_extra_stride = 4 + testnum / 1000000;
-    if (max_width > 256) max_width = 256;
-    if (max_height > 16) max_height = 16;
-    if (max_extra_stride > 8) max_extra_stride = 8;
+
+    if (max_width > 256)
+	max_width = 256;
+
+    if (max_height > 16)
+	max_height = 16;
+
+    if (max_extra_stride > 8)
+	max_extra_stride = 8;
 
     lcg_srand (testnum);
 
@@ -464,21 +482,23 @@ test_composite (uint32_t initcrc, int testnum, int verbose)
     {
 	/* normal image */
 	src_img = create_random_image (img_fmt_list, max_width, max_height,
-				      max_extra_stride, &src_fmt);
+				       max_extra_stride, &src_fmt);
     }
     else
     {
 	/* solid case */
 	src_img = create_random_image (img_fmt_list, 1, 1,
-				      max_extra_stride, &src_fmt);
+				       max_extra_stride, &src_fmt);
+
 	pixman_image_set_repeat (src_img, PIXMAN_REPEAT_NORMAL);
     }
 
     dst_img = create_random_image (img_fmt_list, max_width, max_height,
-				  max_extra_stride, &dst_fmt);
+				   max_extra_stride, &dst_fmt);
 
     mask_img = NULL;
     mask_fmt = -1;
+
     if (lcg_rand_n (2))
     {
 	if (lcg_rand_n (2))
@@ -493,6 +513,7 @@ test_composite (uint32_t initcrc, int testnum, int verbose)
 					   max_extra_stride, &mask_fmt);
 	    pixman_image_set_repeat (mask_img, PIXMAN_REPEAT_NORMAL);
 	}
+
 	if (lcg_rand_n (2))
 	    pixman_image_set_component_alpha (mask_img, 1);
     }
@@ -500,15 +521,18 @@ test_composite (uint32_t initcrc, int testnum, int verbose)
     src_width = pixman_image_get_width (src_img);
     src_height = pixman_image_get_height (src_img);
     src_stride = pixman_image_get_stride (src_img);
+
     dst_width = pixman_image_get_width (dst_img);
     dst_height = pixman_image_get_height (dst_img);
     dst_stride = pixman_image_get_stride (dst_img);
+
     dstbuf = pixman_image_get_data (dst_img);
 
     src_x = lcg_rand_n (src_width);
     src_y = lcg_rand_n (src_height);
     dst_x = lcg_rand_n (dst_width);
     dst_y = lcg_rand_n (dst_height);
+
     w = lcg_rand_n (dst_width - dst_x + 1);
     h = lcg_rand_n (dst_height - dst_y + 1);
 
@@ -531,6 +555,7 @@ test_composite (uint32_t initcrc, int testnum, int verbose)
     if (verbose)
     {
 	int j;
+
 	printf ("---\n");
 	for (i = 0; i < dst_height; i++)
 	{
@@ -538,6 +563,7 @@ test_composite (uint32_t initcrc, int testnum, int verbose)
 	    {
 		if (j == (dst_width * PIXMAN_FORMAT_BPP (dst_fmt) + 7) / 8)
 		    printf ("| ");
+
 		printf ("%02X ", *((uint8_t *)dstbuf + i * dst_stride + j));
 	    }
 	    printf ("\n");
@@ -547,7 +573,10 @@ test_composite (uint32_t initcrc, int testnum, int verbose)
 
     free_random_image (initcrc, src_img, -1);
     crc32 = free_random_image (initcrc, dst_img, dst_fmt);
-    if (mask_img) free_random_image (initcrc, mask_img, -1);
+
+    if (mask_img)
+	free_random_image (initcrc, mask_img, -1);
+
     return crc32;
 }
 

commit cc5c59b3f25dc595ce17a876e89ca549bb477e46
Author: Søren Sandmann Pedersen <sandmann@redhat.com>
Date:   Wed Aug 5 16:28:10 2009 -0400

    Add the ability to print intermediate CRC values

diff --git a/test/blitters-test.c b/test/blitters-test.c
index 27fa956..350210a 100644
--- a/test/blitters-test.c
+++ b/test/blitters-test.c
@@ -556,6 +556,7 @@ main (int argc, char *argv[])
 {
     int i, n1 = 1, n2 = 0;
     uint32_t crc = 0;
+    int verbose = getenv ("VERBOSE") != NULL;
 
     if (argc >= 3)
     {
@@ -582,6 +583,9 @@ main (int argc, char *argv[])
 	for (i = n1; i <= n2; i++)
 	{
 	    crc = test_composite (crc, i, 0);
+
+	    if (verbose)
+		printf ("%d: %08X\n", i, crc);
 	}
 	printf ("crc32=%08X\n", crc);
 

commit 0bc4adae3eb758a2cd9026397c284bd6cc7bcd65
Author: Søren Sandmann Pedersen <sandmann@redhat.com>
Date:   Wed Aug 5 15:53:33 2009 -0400

    Reenable commented-out tests in blitter-test.
    
    The crashes and valgrind issues are all fixed at this point.

diff --git a/test/blitters-test.c b/test/blitters-test.c
index 6ce877c..27fa956 100644
--- a/test/blitters-test.c
+++ b/test/blitters-test.c
@@ -314,7 +314,6 @@ static pixman_op_t op_list[] = {
     PIXMAN_OP_SRC,
     PIXMAN_OP_OVER,
     PIXMAN_OP_ADD,
-#if 0
     PIXMAN_OP_CLEAR,
     PIXMAN_OP_SRC,
     PIXMAN_OP_DST,
@@ -331,9 +330,7 @@ static pixman_op_t op_list[] = {
     PIXMAN_OP_SATURATE,
     PIXMAN_OP_DISJOINT_CLEAR,
     PIXMAN_OP_DISJOINT_SRC,
-#if 0 /* using this crashes the test */
     PIXMAN_OP_DISJOINT_DST,
-#endif
     PIXMAN_OP_DISJOINT_OVER,
     PIXMAN_OP_DISJOINT_OVER_REVERSE,
     PIXMAN_OP_DISJOINT_IN,
@@ -345,9 +342,7 @@ static pixman_op_t op_list[] = {
     PIXMAN_OP_DISJOINT_XOR,
     PIXMAN_OP_CONJOINT_CLEAR,
     PIXMAN_OP_CONJOINT_SRC,
-#if 0 /* using this crashes the test */
     PIXMAN_OP_CONJOINT_DST,
-#endif
     PIXMAN_OP_CONJOINT_OVER,
     PIXMAN_OP_CONJOINT_OVER_REVERSE,
     PIXMAN_OP_CONJOINT_IN,
@@ -374,7 +369,6 @@ static pixman_op_t op_list[] = {
     PIXMAN_OP_HSL_COLOR,
     PIXMAN_OP_HSL_LUMINOSITY,
 #endif
-#endif
 };
 static pixman_format_code_t img_fmt_list[] = {
     PIXMAN_a8r8g8b8,
@@ -382,7 +376,6 @@ static pixman_format_code_t img_fmt_list[] = {
     PIXMAN_r5g6b5,
     PIXMAN_r3g3b2,
     PIXMAN_a8,
-#if 0
     PIXMAN_a8b8g8r8,
     PIXMAN_x8b8g8r8,
     PIXMAN_b8g8r8a8,
@@ -391,12 +384,10 @@ static pixman_format_code_t img_fmt_list[] = {
     PIXMAN_b8g8r8,
     PIXMAN_r5g6b5,
     PIXMAN_b5g6r5,
-#if 0 /* using these makes valgrind complain */
     PIXMAN_x2r10g10b10,
     PIXMAN_a2r10g10b10,
     PIXMAN_x2b10g10r10,
     PIXMAN_a2b10g10r10,
-#endif
     PIXMAN_a1r5g5b5,
     PIXMAN_x1r5g5b5,
     PIXMAN_a1b5g5r5,
@@ -426,16 +417,13 @@ static pixman_format_code_t img_fmt_list[] = {
     PIXMAN_a1r1g1b1,
     PIXMAN_a1b1g1r1,
     PIXMAN_a1,
-#endif
     -1
 };
 static pixman_format_code_t mask_fmt_list[] = {
     PIXMAN_a8r8g8b8,
     PIXMAN_a8,
-#if 0
     PIXMAN_a4,
     PIXMAN_a1,
-#endif
     -1
 };
 
@@ -505,10 +493,8 @@ test_composite (uint32_t initcrc, int testnum, int verbose)
 					   max_extra_stride, &mask_fmt);
 	    pixman_image_set_repeat (mask_img, PIXMAN_REPEAT_NORMAL);
 	}
-#if 0 /* using this crashes the test */
 	if (lcg_rand_n (2))
 	    pixman_image_set_component_alpha (mask_img, 1);
-#endif
     }
 
     src_width = pixman_image_get_width (src_img);

commit 9ee18806a944ddde36dc1b045f89f02d025cbe48
Author: Siarhei Siamashka <siarhei.siamashka@nokia.com>
Date:   Mon Aug 3 00:01:01 2009 +0300

    One more update to blitters-test - use aligned memory
    allocations in order in order to make reproducibility
    of alignment sensitive bugs more deterministic
    Also testing of masks is reenabled

diff --git a/test/blitters-test.c b/test/blitters-test.c
index f57d500..6ce877c 100644
--- a/test/blitters-test.c
+++ b/test/blitters-test.c
@@ -24,6 +24,7 @@
 #include <assert.h>
 #include <stdlib.h>
 #include <stdio.h>
+#include <malloc.h>
 #include "pixman.h"
 
 /* A primitive pseudorandom number generator, taken from POSIX.1-2001 example */
@@ -252,7 +253,7 @@ create_random_image (
     stride = (stride + 3) & ~3;
 
     /* do the allocation */
-    buf = (uint32_t *)malloc (stride * height);
+    buf = (uint32_t *)memalign (64, stride * height);
 
     /* initialize image with random data */
     for (i = 0; i < stride * height; i++)
@@ -431,8 +432,10 @@ static pixman_format_code_t img_fmt_list[] = {
 static pixman_format_code_t mask_fmt_list[] = {
     PIXMAN_a8r8g8b8,
     PIXMAN_a8,
+#if 0
     PIXMAN_a4,
     PIXMAN_a1,
+#endif
     -1
 };
 
@@ -459,9 +462,9 @@ test_composite (uint32_t initcrc, int testnum, int verbose)
     uint32_t crc32;
     int max_width, max_height, max_extra_stride;
 
-    max_width = max_height = 24 + testnum / 100000;
+    max_width = max_height = 24 + testnum / 10000;
     max_extra_stride = 4 + testnum / 1000000;
-    if (max_width > 64) max_width = 64;
+    if (max_width > 256) max_width = 256;
     if (max_height > 16) max_height = 16;
     if (max_extra_stride > 8) max_extra_stride = 8;
 
@@ -488,7 +491,6 @@ test_composite (uint32_t initcrc, int testnum, int verbose)
 
     mask_img = NULL;
     mask_fmt = -1;
-#if 0
     if (lcg_rand_n (2))
     {
 	if (lcg_rand_n (2))
@@ -508,7 +510,6 @@ test_composite (uint32_t initcrc, int testnum, int verbose)
 	    pixman_image_set_component_alpha (mask_img, 1);
 #endif
     }
-#endif
 
     src_width = pixman_image_get_width (src_img);
     src_height = pixman_image_get_height (src_img);

commit 4fc0f9dd456bb4ad1f47e1733b02a3b491f425ed
Author: Siarhei Siamashka <siarhei.siamashka@nokia.com>
Date:   Sat Aug 1 02:20:12 2009 +0300

    HACK: updated test to better cover new neon optimizations

diff --git a/test/blitters-test.c b/test/blitters-test.c
index 1306040..f57d500 100644
--- a/test/blitters-test.c
+++ b/test/blitters-test.c
@@ -310,6 +310,10 @@ free_random_image (
 }
 
 static pixman_op_t op_list[] = {
+    PIXMAN_OP_SRC,
+    PIXMAN_OP_OVER,
+    PIXMAN_OP_ADD,
+#if 0
     PIXMAN_OP_CLEAR,
     PIXMAN_OP_SRC,
     PIXMAN_OP_DST,
@@ -369,10 +373,15 @@ static pixman_op_t op_list[] = {
     PIXMAN_OP_HSL_COLOR,
     PIXMAN_OP_HSL_LUMINOSITY,
 #endif
+#endif
 };
 static pixman_format_code_t img_fmt_list[] = {
     PIXMAN_a8r8g8b8,
     PIXMAN_x8r8g8b8,
+    PIXMAN_r5g6b5,
+    PIXMAN_r3g3b2,
+    PIXMAN_a8,
+#if 0
     PIXMAN_a8b8g8r8,
     PIXMAN_x8b8g8r8,
     PIXMAN_b8g8r8a8,
@@ -416,6 +425,7 @@ static pixman_format_code_t img_fmt_list[] = {
     PIXMAN_a1r1g1b1,
     PIXMAN_a1b1g1r1,
     PIXMAN_a1,
+#endif
     -1
 };
 static pixman_format_code_t mask_fmt_list[] = {
@@ -449,7 +459,7 @@ test_composite (uint32_t initcrc, int testnum, int verbose)
     uint32_t crc32;
     int max_width, max_height, max_extra_stride;
 
-    max_width = max_height = 12 + testnum / 100000;
+    max_width = max_height = 24 + testnum / 100000;
     max_extra_stride = 4 + testnum / 1000000;
     if (max_width > 64) max_width = 64;
     if (max_height > 16) max_height = 16;
@@ -478,6 +488,7 @@ test_composite (uint32_t initcrc, int testnum, int verbose)
 
     mask_img = NULL;
     mask_fmt = -1;
+#if 0
     if (lcg_rand_n (2))
     {
 	if (lcg_rand_n (2))
@@ -497,6 +508,7 @@ test_composite (uint32_t initcrc, int testnum, int verbose)
 	    pixman_image_set_component_alpha (mask_img, 1);
 #endif
     }
+#endif
 
     src_width = pixman_image_get_width (src_img);
     src_height = pixman_image_get_height (src_img);
@@ -570,7 +582,7 @@ main (int argc, char *argv[])
     else
     {
 	n1 = 1;
-	n2 = 3000000;
+	n2 = 2000000;
     }
 
     if (n2 < 0)
@@ -586,12 +598,12 @@ main (int argc, char *argv[])
 	}
 	printf ("crc32=%08X\n", crc);
 
-	if (n2 == 3000000)
+	if (n2 == 2000000)
 	{
 	    /* Predefined value for running with all the fastpath functions
 	       disabled. It needs to be updated every time when changes are
 	       introduced to this program or behavior of pixman changes! */
-	    if (crc == 0x1A025829)
+	    if (crc == 0x4895C7B0)
 	    {
 		printf ("blitters test passed\n");
 	    }

commit 67769ad5bf15450d0fd0d83643e3533a9f563916
Author: Siarhei Siamashka <siarhei.siamashka@nokia.com>
Date:   Wed Jul 22 01:29:51 2009 +0300

    Test program for stressing the use of different formats and operators
    
    The code and overall method is mostly based on scaling-test. This one
    focuses on trying to stress as many different color formats and types
    of composition operations as possible.
    
    This is an initial implementation which may need more tuning. Also
    not all color format and operator combinations are actually used.
    
    When cpu specific optimizations are disabled, this test provides
    identical deterministic results on x86, PPC and ARM.
    
    Script blitters-test-bisect.rb now works in non-stop mode, until
    it finds any problem. This allows to run it for example overnight
    in order to test a lot more variants of pixman calls and increase
    chances of detecting problems in pixman. Just like with scaling-test,
    running blitters-test binary alone with no command line arguments
    runs a small predefined number of tests and compares checksum
    with a reference value for quick verification.

diff --git a/test/Makefile.am b/test/Makefile.am
index 324cb72..c56f62d 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -4,6 +4,7 @@ INCLUDES = -I$(top_srcdir)/pixman -I$(top_builddir)/pixman
 TESTPROGRAMS =			\
 	region-test		\
 	scaling-test		\
+	blitters-test		\
 	fetch-test		\
 	oob-test		\
 	window-test		\
@@ -12,6 +13,7 @@ TESTPROGRAMS =			\
 fetch_test_LDADD = $(TEST_LDADD)
 region_test_LDADD = $(TEST_LDADD)
 scaling_test_LDADD = $(TEST_LDADD)
+blitters_test_LDADD = $(TEST_LDADD)
 trap_crasher_LDADD = $(TEST_LDADD)
 oob_test_LDADD = $(TEST_LDADD)
 window_test_LDADD = $(TEST_LDADD)
diff --git a/test/blitters-test-bisect.rb b/test/blitters-test-bisect.rb
new file mode 100644
index 0000000..62ff782
--- /dev/null
+++ b/test/blitters-test-bisect.rb
@@ -0,0 +1,43 @@
+#!/usr/bin/env ruby
+
+if not ARGV[0] or not ARGV[1] then
+    printf("Please provide two 'blitters-test' static binaries in the command line.\n\n")
+    printf("The first should be linked with a correct reference pixman library.\n")
+    printf("The second binary should be linked with a pixman library which needs to be tested.\n")
+    exit(0)
+end
+
+def test_range(min, max)
+    if `#{ARGV[0]} #{min} #{max} 2>/dev/null` == `#{ARGV[1]} #{min} #{max} 2>/dev/null` then
+        return
+    end
+    while max != min + 1 do
+        avg = ((min + max) / 2).to_i
+        res1 = `#{ARGV[0]} #{min} #{avg} 2>/dev/null`
+        res2 = `#{ARGV[1]} #{min} #{avg} 2>/dev/null`
+        if res1 != res2 then
+            max = avg
+        else
+            min = avg
+        end
+    end
+    return max
+end
+
+base = 1
+while true do
+    # run infinitely, processing 100000 test cases per iteration
+    printf("running tests %d-%d\n", base, base + 100000 - 1);
+    res = test_range(base, base + 100000 - 1)
+    if res then
+        printf("-- ref --\n")
+        printf("%s\n", `#{ARGV[0]} -#{res}`)
+        printf("-- new --\n")
+        printf("%s\n", `#{ARGV[1]} -#{res}`)
+
+        printf("\nFailed test %d, you can reproduce the problematic conditions by running\n", res)
+        printf("#{ARGV[1]} -%d\n", res)
+        exit(1)
+    end
+    base += 100000
+end
diff --git a/test/blitters-test.c b/test/blitters-test.c
new file mode 100644
index 0000000..1306040
--- /dev/null
+++ b/test/blitters-test.c
@@ -0,0 +1,606 @@
+/*
+ * Test program, which stresses the use of different color formats and
+ * compositing operations.
+ *
+ * Just run it without any command line arguments, and it will report either
+ *   "blitters test passed" - everything is ok
+ *   "blitters test failed!" - there is some problem
+ *
+ * In the case of failure, finding the problem involves the following steps:
+ * 1. Get the reference 'blitters-test' binary. It makes sense to disable all
+ *    the cpu specific optimizations in pixman and also configure it with
+ *    '--disable-shared' option. Those who are paranoid can also tweak the
+ *    sources to disable all fastpath functions. The resulting binary
+ *    can be renamed to something like 'blitters-test.ref'.
+ * 2. Compile the buggy binary (also with the '--disable-shared' option).
+ * 3. Run 'ruby blitters-test-bisect.rb ./blitters-test.ref ./blitters-test'
+ * 4. Look at the information about failed case (destination buffer content
+ *    will be shown) and try to figure out what is wrong. Loading
+ *    test program in gdb, specifying failed test number in the command
+ *    line with '-' character prepended and setting breakpoint on
+ *    'pixman_image_composite' function can provide detailed information
+ *    about function arguments
+ */
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "pixman.h"
+
+/* A primitive pseudorandom number generator, taken from POSIX.1-2001 example */
+
+static uint32_t lcg_seed;
+
+static inline uint32_t
+lcg_rand (void)
+{
+    lcg_seed = lcg_seed * 1103515245 + 12345;
+    return ((uint32_t)(lcg_seed / 65536) % 32768);
+}
+
+static inline void
+lcg_srand (uint32_t seed)
+{
+    lcg_seed = seed;
+}
+
+static inline uint32_t
+lcg_rand_n (int max)
+{
+    return lcg_rand () % max;
+}
+
+/*----------------------------------------------------------------------------*\
+ *  CRC-32 version 2.0.0 by Craig Bruce, 2006-04-29.
+ *
+ *  This program generates the CRC-32 values for the files named in the
+ *  command-line arguments.  These are the same CRC-32 values used by GZIP,
+ *  PKZIP, and ZMODEM.  The Crc32_ComputeBuf () can also be detached and
+ *  used independently.
+ *
+ *  THIS PROGRAM IS PUBLIC-DOMAIN SOFTWARE.
+ *
+ *  Based on the byte-oriented implementation "File Verification Using CRC"
+ *  by Mark R. Nelson in Dr. Dobb's Journal, May 1992, pp. 64-67.
+ *
+ *  v1.0.0: original release.
+ *  v1.0.1: fixed printf formats.
+ *  v1.0.2: fixed something else.
+ *  v1.0.3: replaced CRC constant table by generator function.
+ *  v1.0.4: reformatted code, made ANSI C.  1994-12-05.
+ *  v2.0.0: rewrote to use memory buffer & static table, 2006-04-29.
+\*----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------*\
+ *  NAME:
+ *     Crc32_ComputeBuf () - computes the CRC-32 value of a memory buffer
+ *  DESCRIPTION:
+ *     Computes or accumulates the CRC-32 value for a memory buffer.
+ *     The 'inCrc32' gives a previously accumulated CRC-32 value to allow
+ *     a CRC to be generated for multiple sequential buffer-fuls of data.
+ *     The 'inCrc32' for the first buffer must be zero.
+ *  ARGUMENTS:
+ *     inCrc32 - accumulated CRC-32 value, must be 0 on first call
+ *     buf     - buffer to compute CRC-32 value for
+ *     bufLen  - number of bytes in buffer
+ *  RETURNS:
+ *     crc32 - computed CRC-32 value
+ *  ERRORS:
+ *     (no errors are possible)
+\*----------------------------------------------------------------------------*/
+
+static uint32_t
+compute_crc32 (uint32_t    in_crc32,
+		  const void *buf,
+		  size_t      buf_len)
+{
+    static const uint32_t crc_table[256] = {
+	0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F,
+	0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
+	0x09B64C2B, 0x7EB17CBD,	0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2,
+	0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
+	0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,	0x14015C4F, 0x63066CD9,
+	0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
+	0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C,
+	0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
+	0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423,
+	0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
+	0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106,
+	0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
+	0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D,
+	0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
+	0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950,
+	0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
+	0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7,
+	0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
+	0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA,
+	0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
+	0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81,
+	0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
+	0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84,
+	0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
+	0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB,
+	0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
+	0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E,
+	0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
+	0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55,
+	0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
+	0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28,
+	0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
+	0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F,
+	0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
+	0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242,
+	0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
+	0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69,
+	0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
+	0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC,
+	0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
+	0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693,
+	0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
+	0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
+    };
+
+    uint32_t              crc32;
+    unsigned char *       byte_buf;
+    size_t                i;
+
+    /** accumulate crc32 for buffer **/
+    crc32 = in_crc32 ^ 0xFFFFFFFF;
+    byte_buf = (unsigned char*) buf;
+
+    for (i = 0; i < buf_len; i++)
+	crc32 = (crc32 >> 8) ^ crc_table[(crc32 ^ byte_buf[i]) & 0xFF];
+
+    return (crc32 ^ 0xFFFFFFFF);
+}
+
+/* perform endian conversion of pixel data */
+static void
+image_endian_swap (pixman_image_t *img, int bpp)
+{
+    int stride = pixman_image_get_stride (img);
+    uint32_t *data = pixman_image_get_data (img);
+    int height = pixman_image_get_height (img);;
+    int i, j;
+
+    /* swap bytes only on big endian systems */
+    volatile uint16_t endian_check_var = 0x1234;
+    if (*(volatile uint8_t *)&endian_check_var != 0x12) return;
+
+    for (i = 0; i < height; i++)
+    {
+	uint8_t *line_data = (uint8_t *)data + stride * i;
+	/* swap bytes only for 16, 24 and 32 bpp for now */
+	switch (bpp)
+	{
+	case 1:
+	    for (j = 0; j < stride; j++)
+	    {
+		line_data[j] =
+		    ((line_data[j] & 0x80) >> 7) |
+		    ((line_data[j] & 0x40) >> 5) |
+		    ((line_data[j] & 0x20) >> 3) |
+		    ((line_data[j] & 0x10) >> 1) |
+		    ((line_data[j] & 0x08) << 1) |
+		    ((line_data[j] & 0x04) << 3) |
+		    ((line_data[j] & 0x02) << 5) |
+		    ((line_data[j] & 0x01) << 7);
+	    }
+	    break;
+	case 4:
+	    for (j = 0; j < stride; j++)
+	    {
+		line_data[j] = (line_data[j] >> 4) | (line_data[j] << 4);
+	    }
+	    break;
+	case 16:
+	    for (j = 0; j + 2 <= stride; j += 2)
+	    {
+		char t1 = line_data[j + 0];
+		char t2 = line_data[j + 1];
+		line_data[j + 1] = t1;
+		line_data[j + 0] = t2;
+	    }
+	    break;
+	case 24:
+	    for (j = 0; j + 3 <= stride; j += 3)
+	    {
+		char t1 = line_data[j + 0];
+		char t2 = line_data[j + 1];
+		char t3 = line_data[j + 2];
+		line_data[j + 2] = t1;
+		line_data[j + 1] = t2;


Reply to: