| #include <assert.h> |
| #include <stdlib.h> |
| #include <stdio.h> |
| #include "utils.h" |
| |
| #define SIZE 1024 |
| |
| static pixman_indexed_t mono_palette = |
| { |
| 0, { 0x00000000, 0x00ffffff }, |
| }; |
| |
| |
| typedef struct { |
| pixman_format_code_t format; |
| int width, height; |
| int stride; |
| uint32_t src[SIZE]; |
| uint32_t dst[SIZE]; |
| pixman_indexed_t *indexed; |
| } testcase_t; |
| |
| static testcase_t testcases[] = |
| { |
| { |
| PIXMAN_a8r8g8b8, |
| 2, 2, |
| 8, |
| { 0x00112233, 0x44556677, |
| 0x8899aabb, 0xccddeeff }, |
| { 0x00112233, 0x44556677, |
| 0x8899aabb, 0xccddeeff }, |
| NULL, |
| }, |
| { |
| PIXMAN_r8g8b8a8, |
| 2, 2, |
| 8, |
| { 0x11223300, 0x55667744, |
| 0x99aabb88, 0xddeeffcc }, |
| { 0x00112233, 0x44556677, |
| 0x8899aabb, 0xccddeeff }, |
| NULL, |
| }, |
| { |
| PIXMAN_g1, |
| 8, 2, |
| 4, |
| #ifdef WORDS_BIGENDIAN |
| { |
| 0xaa000000, |
| 0x55000000 |
| }, |
| #else |
| { |
| 0x00000055, |
| 0x000000aa |
| }, |
| #endif |
| { |
| 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000, |
| 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff |
| }, |
| &mono_palette, |
| }, |
| #if 0 |
| { |
| PIXMAN_g8, |
| 4, 2, |
| 4, |
| { 0x01234567, |
| 0x89abcdef }, |
| { 0x00010101, 0x00232323, 0x00454545, 0x00676767, |
| 0x00898989, 0x00ababab, 0x00cdcdcd, 0x00efefef, }, |
| }, |
| #endif |
| /* FIXME: make this work on big endian */ |
| { |
| PIXMAN_yv12, |
| 8, 2, |
| 8, |
| #ifdef WORDS_BIGENDIAN |
| { |
| 0x00ff00ff, 0x00ff00ff, |
| 0xff00ff00, 0xff00ff00, |
| 0x80ff8000, |
| 0x800080ff |
| }, |
| #else |
| { |
| 0xff00ff00, 0xff00ff00, |
| 0x00ff00ff, 0x00ff00ff, |
| 0x0080ff80, |
| 0xff800080 |
| }, |
| #endif |
| { |
| 0xff000000, 0xffffffff, 0xffb80000, 0xffffe113, |
| 0xff000000, 0xffffffff, 0xff0023ee, 0xff4affff, |
| 0xffffffff, 0xff000000, 0xffffe113, 0xffb80000, |
| 0xffffffff, 0xff000000, 0xff4affff, 0xff0023ee, |
| }, |
| }, |
| }; |
| |
| int n_test_cases = ARRAY_LENGTH (testcases); |
| |
| |
| static uint32_t |
| reader (const void *src, int size) |
| { |
| switch (size) |
| { |
| case 1: |
| return *(uint8_t *)src; |
| case 2: |
| return *(uint16_t *)src; |
| case 4: |
| return *(uint32_t *)src; |
| default: |
| assert(0); |
| return 0; /* silence MSVC */ |
| } |
| } |
| |
| |
| static void |
| writer (void *src, uint32_t value, int size) |
| { |
| switch (size) |
| { |
| case 1: |
| *(uint8_t *)src = value; |
| break; |
| case 2: |
| *(uint16_t *)src = value; |
| break; |
| case 4: |
| *(uint32_t *)src = value; |
| break; |
| default: |
| assert(0); |
| } |
| } |
| |
| |
| int |
| main (int argc, char **argv) |
| { |
| uint32_t dst[SIZE]; |
| pixman_image_t *src_img; |
| pixman_image_t *dst_img; |
| int i, j, x, y; |
| int ret = 0; |
| |
| for (i = 0; i < n_test_cases; ++i) |
| { |
| for (j = 0; j < 2; ++j) |
| { |
| src_img = pixman_image_create_bits (testcases[i].format, |
| testcases[i].width, |
| testcases[i].height, |
| testcases[i].src, |
| testcases[i].stride); |
| pixman_image_set_indexed(src_img, testcases[i].indexed); |
| |
| dst_img = pixman_image_create_bits (PIXMAN_a8r8g8b8, |
| testcases[i].width, |
| testcases[i].height, |
| dst, |
| testcases[i].width*4); |
| |
| if (j) |
| { |
| pixman_image_set_accessors (src_img, reader, writer); |
| pixman_image_set_accessors (dst_img, reader, writer); |
| } |
| |
| pixman_image_composite (PIXMAN_OP_SRC, src_img, NULL, dst_img, |
| 0, 0, 0, 0, 0, 0, testcases[i].width, testcases[i].height); |
| |
| pixman_image_unref (src_img); |
| pixman_image_unref (dst_img); |
| |
| for (y = 0; y < testcases[i].height; ++y) |
| { |
| for (x = 0; x < testcases[i].width; ++x) |
| { |
| int offset = y * testcases[i].width + x; |
| |
| if (dst[offset] != testcases[i].dst[offset]) |
| { |
| printf ("test %i%c: pixel mismatch at (x=%d,y=%d): %08x expected, %08x obtained\n", |
| i + 1, 'a' + j, |
| x, y, |
| testcases[i].dst[offset], dst[offset]); |
| ret = 1; |
| } |
| } |
| } |
| } |
| } |
| |
| return ret; |
| } |