Add test case for bug 22844.
authorSøren Sandmann Pedersen <sandmann@redhat.com>
Tue, 21 Jul 2009 02:45:47 +0000 (22:45 -0400)
committerSøren Sandmann Pedersen <sandmann@redhat.com>
Tue, 21 Jul 2009 05:27:46 +0000 (01:27 -0400)
test/Makefile.am
test/window-test.c [new file with mode: 0644]

index d44e526..324cb72 100644 (file)
@@ -6,6 +6,7 @@ TESTPROGRAMS =                  \
        scaling-test            \
        fetch-test              \
        oob-test                \
+       window-test             \
        trap-crasher
 
 fetch_test_LDADD = $(TEST_LDADD)
@@ -13,6 +14,7 @@ region_test_LDADD = $(TEST_LDADD)
 scaling_test_LDADD = $(TEST_LDADD)
 trap_crasher_LDADD = $(TEST_LDADD)
 oob_test_LDADD = $(TEST_LDADD)
+window_test_LDADD = $(TEST_LDADD)
 
 # GTK using test programs
 
diff --git a/test/window-test.c b/test/window-test.c
new file mode 100644 (file)
index 0000000..b2b00b6
--- /dev/null
@@ -0,0 +1,156 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <config.h>
+#include "pixman.h"
+#include "pixman-private.h"
+
+#define FALSE 0
+#define TRUE 1
+
+/* Randomly decide between 32 and 16 bit
+ *
+ * Allocate bits with random width, stride and height
+ *
+ * Then make up some random offset (dx, dy)
+ *
+ * Then make an image with those values.
+ *
+ * Do this for both source and destination
+ *
+ * Composite them together using OVER.
+ *
+ * The bits in the source and the destination should have
+ * recognizable colors so that the result can be verified.
+ *
+ * Ie., walk the bits and verify that they have been composited.
+ */
+
+static int
+get_rand (int bound)
+{
+    return rand () % bound;
+}
+
+static pixman_image_t *
+make_image (int width, int height, pixman_bool_t src, int *rx, int *ry)
+{
+    pixman_format_code_t format;
+    pixman_image_t *image;
+    pixman_region32_t region;
+    uint8_t *bits;
+    int stride;
+    int bpp;
+    int dx, dy;
+    int i, j;
+
+    if (src)
+       format = PIXMAN_a8r8g8b8;
+    else
+       format = PIXMAN_r5g6b5;
+
+    bpp = PIXMAN_FORMAT_BPP (format) / 8;
+
+    stride = width + get_rand (width);
+    stride += (stride & 1);            /* Make it an even number */
+
+    bits = malloc (height * stride * bpp);
+
+    for (j = 0; j < height; ++j)
+    {
+       for (i = 0; i < width; ++i)
+       {
+           uint8_t *pixel = bits + (stride * j + i) * bpp;
+
+           if (src)
+               *(uint32_t *)pixel = 0x7f00007f;
+           else
+               *(uint16_t *)pixel = 0xf100;
+       }
+    }
+
+    dx = dy = 0;
+
+    dx = get_rand (500);
+    dy = get_rand (500);
+
+    /* Now simulate the bogus X server translations */
+    bits -= (dy * stride + dx) * bpp;
+
+    image = pixman_image_create_bits (
+       format, width, height, (uint32_t *)bits, stride * bpp);
+
+    /* And add the bogus clip region */
+    pixman_region32_init_rect (&region, dx, dy, dx + width, dy + height);
+
+    pixman_image_set_clip_region32 (image, &region);
+
+    pixman_image_set_source_clipping (image, TRUE);
+
+    if (src)
+    {
+       pixman_transform_t trans;
+
+       pixman_transform_init_identity (&trans);
+
+       pixman_transform_translate (&trans,
+                                   NULL,
+                                   - pixman_int_to_fixed (width / 2),
+                                   - pixman_int_to_fixed (height / 2));
+
+       pixman_transform_scale (&trans,
+                               NULL,
+                               pixman_double_to_fixed (0.5),
+                               pixman_double_to_fixed (0.5));
+
+       pixman_transform_translate (&trans,
+                                   NULL,
+                                   pixman_int_to_fixed (width / 2),
+                                   pixman_int_to_fixed (height / 2));
+
+       pixman_image_set_transform (image, &trans);
+       pixman_image_set_filter (image, PIXMAN_FILTER_BILINEAR, NULL, 0);
+       pixman_image_set_repeat (image, PIXMAN_REPEAT_PAD);
+    }
+
+    *rx = dx;
+    *ry = dy;
+
+    return image;
+}
+
+int
+main ()
+{
+    pixman_image_t *src, *dest;
+    int src_x, src_y, dest_x, dest_y;
+    int i, j;
+    int width = get_rand (500);
+    int height = get_rand (500);
+
+    src = make_image (width, height, TRUE, &src_x, &src_y);
+    dest = make_image (width, height, FALSE, &dest_x, &dest_y);
+
+    pixman_image_composite (
+       PIXMAN_OP_OVER, src, NULL, dest,
+       src_x, src_y,
+       -1, -1,
+       dest_x, dest_y,
+       width, height);
+
+    for (i = 0; i < height; ++i)
+    {
+       for (j = 0; j < width; ++j)
+       {
+           uint8_t *bits = (uint8_t *)dest->bits.bits;
+           int bpp = PIXMAN_FORMAT_BPP (dest->bits.format) / 8;
+           int stride = dest->bits.rowstride * 4;
+
+           uint8_t *pixel =
+               bits + (i + dest_y) * stride + (j + dest_x) * bpp;
+
+           assert (*(uint16_t *)pixel == 0x788f);
+       }
+    }
+
+    return 0;
+}