[Pixman] [PATCH/RFC] HACK: Test which exposes bugs in PDF blend modes

Siarhei Siamashka siarhei.siamashka at gmail.com
Mon Jan 10 14:33:26 PST 2011


From: Siarhei Siamashka <siarhei.siamashka at nokia.com>

Looks like PDF blend modes have some problems with fixed point arithmetics.

But probably 'composite' test program is a more appropriate place for
verifying this.

---
 test/blitters-test.c |   53 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 53 insertions(+), 0 deletions(-)

diff --git a/test/blitters-test.c b/test/blitters-test.c
index 21685b1..c58de09 100644
--- a/test/blitters-test.c
+++ b/test/blitters-test.c
@@ -248,6 +248,7 @@ test_composite (int testnum, int verbose)
     int mask_x, mask_y;
     int w, h;
     int op;
+    int src_repeat_flag = 0;
     pixman_format_code_t src_fmt, dst_fmt, mask_fmt;
     uint32_t *dstbuf, *srcbuf, *maskbuf;
     uint32_t crc32;
@@ -283,6 +284,7 @@ test_composite (int testnum, int verbose)
 				       max_extra_stride, &src_fmt);
 
 	pixman_image_set_repeat (src_img, PIXMAN_REPEAT_NORMAL);
+	src_repeat_flag = 1;
     }
 
     dst_img = create_random_image (img_fmt_list, max_width, max_height,
@@ -363,6 +365,57 @@ test_composite (int testnum, int verbose)
 	printf ("w=%d, h=%d\n", w, h);
     }
 
+    /*
+     * Extra test for correctness.
+     */
+    if (src_fmt != PIXMAN_a8r8g8b8)
+    {
+	int j;
+	pixman_image_t *test_src_img = pixman_image_create_bits (
+	    PIXMAN_a8r8g8b8, src_width, src_height, NULL, src_width * 4);
+	pixman_image_t *test_dst1_img = pixman_image_create_bits (
+	    PIXMAN_a8r8g8b8, dst_width, dst_height, NULL, dst_width * 4);
+	pixman_image_t *test_dst2_img = pixman_image_create_bits (
+	    PIXMAN_a8r8g8b8, dst_width, dst_height, NULL, dst_width * 4);
+
+	uint8_t *bits_dst1 = (uint8_t *) test_dst1_img->bits.bits;
+	uint8_t *bits_dst2 = (uint8_t *) test_dst2_img->bits.bits;
+
+	pixman_image_composite (PIXMAN_OP_SRC, src_img, NULL, test_src_img,
+			        0, 0, 0, 0, 0, 0, src_width, src_height);
+	if (src_repeat_flag)
+	    pixman_image_set_repeat (test_src_img, PIXMAN_REPEAT_NORMAL);
+	pixman_image_composite (PIXMAN_OP_SRC, dst_img, NULL, test_dst1_img,
+				0, 0, 0, 0, 0, 0, dst_width, dst_height);
+	pixman_image_composite (PIXMAN_OP_SRC, dst_img, NULL, test_dst2_img,
+				0, 0, 0, 0, 0, 0, dst_width, dst_height);
+
+	pixman_image_composite (op, test_src_img, mask_img, test_dst1_img, src_x, src_y,
+				mask_x, mask_y, dst_x, dst_y, w, h);
+	pixman_image_composite (op, src_img, mask_img, test_dst2_img, src_x, src_y,
+				mask_x, mask_y, dst_x, dst_y, w, h);
+
+	for (i = 0; i < dst_height; i++)
+	{
+	    for (j = 0; j < dst_width * 4; j++)
+	    {
+		int pix1 = *(bits_dst1 + i * dst_width * 4 + j);
+		int pix2 = *(bits_dst2 + i * dst_width * 4 + j);
+		if (abs (pix1 - pix2) > 8)
+		{
+		    printf ("test=%d, op=0x%X, %d != %d, i=%d, j=%d\n",
+			    testnum, op, pix1, pix2, i, j);
+		    if (!verbose)
+			abort ();
+		}
+	    }
+	}
+
+	pixman_image_unref (test_src_img);
+	pixman_image_unref (test_dst1_img);
+	pixman_image_unref (test_dst2_img);
+    }
+
     pixman_image_composite (op, src_img, mask_img, dst_img,
 			    src_x, src_y, mask_x, mask_y, dst_x, dst_y, w, h);
 
-- 
1.7.2.2



More information about the Pixman mailing list