From: Søren Sandmann Pedersen Date: Tue, 21 Jul 2009 02:45:47 +0000 (-0400) Subject: Add test case for bug 22844. X-Git-Tag: 1.0_branch~837 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=dfdb8509e2160a0db7d72e775dd348090e6fb968;p=profile%2Fivi%2Fpixman.git Add test case for bug 22844. --- diff --git a/test/Makefile.am b/test/Makefile.am index d44e526..324cb72 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -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 index 0000000..b2b00b6 --- /dev/null +++ b/test/window-test.c @@ -0,0 +1,156 @@ +#include +#include +#include +#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 (®ion, dx, dy, dx + width, dy + height); + + pixman_image_set_clip_region32 (image, ®ion); + + 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; +}