11176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* 21176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Test program, which stresses the use of different color formats and 31176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * compositing operations. 41176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * 51176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Script 'fuzzer-find-diff.pl' can be used to narrow down the problem in 61176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * the case of test failure. 71176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */ 81176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include <stdlib.h> 91176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include <stdio.h> 101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include "utils.h" 111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 121176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic pixman_indexed_t rgb_palette[9]; 131176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic pixman_indexed_t y_palette[9]; 141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* The first eight format in the list are by far the most widely 161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * used formats, so we test those more than the others 171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */ 181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#define N_MOST_LIKELY_FORMATS 8 191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* Create random image for testing purposes */ 211176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic pixman_image_t * 221176bdada62cabc6ec4b0308a930e83b679d5d36John Reckcreate_random_image (pixman_format_code_t *allowed_formats, 231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int max_width, 241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int max_height, 251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int max_extra_stride, 261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_format_code_t *used_fmt) 271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int n = 0, width, height, stride; 291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_format_code_t fmt; 301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck uint32_t *buf; 311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_t *img; 321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck while (allowed_formats[n] != PIXMAN_null) 341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck n++; 351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (n > N_MOST_LIKELY_FORMATS && prng_rand_n (4) != 0) 371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck n = N_MOST_LIKELY_FORMATS; 381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck fmt = allowed_formats[prng_rand_n (n)]; 391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck width = prng_rand_n (max_width) + 1; 411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck height = prng_rand_n (max_height) + 1; 421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck stride = (width * PIXMAN_FORMAT_BPP (fmt) + 7) / 8 + 431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck prng_rand_n (max_extra_stride + 1); 441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck stride = (stride + 3) & ~3; 451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* do the allocation */ 471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck buf = aligned_malloc (64, stride * height); 481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (prng_rand_n (4) == 0) 501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* uniform distribution */ 521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck prng_randmemset (buf, stride * height, 0); 531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else 551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* significantly increased probability for 0x00 and 0xFF */ 571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck prng_randmemset (buf, stride * height, RANDMEMSET_MORE_00_AND_FF); 581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck img = pixman_image_create_bits (fmt, width, height, buf, stride); 611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (PIXMAN_FORMAT_TYPE (fmt) == PIXMAN_TYPE_COLOR) 631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_set_indexed (img, &(rgb_palette[PIXMAN_FORMAT_BPP (fmt)])); 651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else if (PIXMAN_FORMAT_TYPE (fmt) == PIXMAN_TYPE_GRAY) 671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_set_indexed (img, &(y_palette[PIXMAN_FORMAT_BPP (fmt)])); 691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (prng_rand_n (16) == 0) 721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_set_filter (img, PIXMAN_FILTER_BILINEAR, NULL, 0); 731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck image_endian_swap (img); 751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (used_fmt) *used_fmt = fmt; 771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return img; 781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* Free random image, and optionally update crc32 based on its data */ 811176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic uint32_t 821176bdada62cabc6ec4b0308a930e83b679d5d36John Reckfree_random_image (uint32_t initcrc, 831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_t *img, 841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_format_code_t fmt) 851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck uint32_t crc32 = 0; 871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck uint32_t *data = pixman_image_get_data (img); 881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (fmt != PIXMAN_null) 901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck crc32 = compute_crc32_for_image (initcrc, img); 911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_unref (img); 931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck free (data); 941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return crc32; 961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 981176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic pixman_op_t op_list[] = { 991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_SRC, 1001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_OVER, 1011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_ADD, 1021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_CLEAR, 1031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_SRC, 1041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DST, 1051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_OVER, 1061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_OVER_REVERSE, 1071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_IN, 1081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_IN_REVERSE, 1091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_OUT, 1101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_OUT_REVERSE, 1111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_ATOP, 1121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_ATOP_REVERSE, 1131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_XOR, 1141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_ADD, 1151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_SATURATE, 1161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DISJOINT_CLEAR, 1171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DISJOINT_SRC, 1181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DISJOINT_DST, 1191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DISJOINT_OVER, 1201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DISJOINT_OVER_REVERSE, 1211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DISJOINT_IN, 1221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DISJOINT_IN_REVERSE, 1231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DISJOINT_OUT, 1241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DISJOINT_OUT_REVERSE, 1251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DISJOINT_ATOP, 1261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DISJOINT_ATOP_REVERSE, 1271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DISJOINT_XOR, 1281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_CONJOINT_CLEAR, 1291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_CONJOINT_SRC, 1301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_CONJOINT_DST, 1311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_CONJOINT_OVER, 1321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_CONJOINT_OVER_REVERSE, 1331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_CONJOINT_IN, 1341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_CONJOINT_IN_REVERSE, 1351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_CONJOINT_OUT, 1361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_CONJOINT_OUT_REVERSE, 1371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_CONJOINT_ATOP, 1381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_CONJOINT_ATOP_REVERSE, 1391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_CONJOINT_XOR, 1401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_MULTIPLY, 1411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_SCREEN, 1421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_OVERLAY, 1431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DARKEN, 1441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_LIGHTEN, 1451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_COLOR_DODGE, 1461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_COLOR_BURN, 1471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_HARD_LIGHT, 1481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_DIFFERENCE, 1491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_EXCLUSION, 1501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#if 0 /* these use floating point math and are not always bitexact on different platforms */ 1511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_SOFT_LIGHT, 1521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_HSL_HUE, 1531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_HSL_SATURATION, 1541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_HSL_COLOR, 1551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_OP_HSL_LUMINOSITY, 1561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#endif 1571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}; 1581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 1591176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic pixman_format_code_t img_fmt_list[] = { 1601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a8r8g8b8, 1611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a8b8g8r8, 1621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_x8r8g8b8, 1631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_x8b8g8r8, 1641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_r5g6b5, 1651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_b5g6r5, 1661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a8, 1671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a1, 1681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_r3g3b2, 1691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_b8g8r8a8, 1701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_b8g8r8x8, 1711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_r8g8b8a8, 1721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_r8g8b8x8, 1731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_x14r6g6b6, 1741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_r8g8b8, 1751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_b8g8r8, 1761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#if 0 /* These are going to use floating point in the near future */ 1771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_x2r10g10b10, 1781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a2r10g10b10, 1791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_x2b10g10r10, 1801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a2b10g10r10, 1811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#endif 1821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a1r5g5b5, 1831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_x1r5g5b5, 1841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a1b5g5r5, 1851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_x1b5g5r5, 1861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a4r4g4b4, 1871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_x4r4g4b4, 1881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a4b4g4r4, 1891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_x4b4g4r4, 1901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_r3g3b2, 1911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_b2g3r3, 1921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a2r2g2b2, 1931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a2b2g2r2, 1941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_c8, 1951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_g8, 1961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_x4c4, 1971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_x4g4, 1981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_c4, 1991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_g4, 2001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_g1, 2011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_x4a4, 2021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a4, 2031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_r1g2b1, 2041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_b1g2r1, 2051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a1r1g1b1, 2061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a1b1g1r1, 2071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_null 2081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}; 2091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2101176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic pixman_format_code_t mask_fmt_list[] = { 2111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a8r8g8b8, 2121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a8, 2131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a4, 2141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_a1, 2151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck PIXMAN_null 2161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}; 2171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck/* 2201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck * Composite operation with pseudorandom images 2211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck */ 2221176bdada62cabc6ec4b0308a930e83b679d5d36John Reckuint32_t 2231176bdada62cabc6ec4b0308a930e83b679d5d36John Recktest_composite (int testnum, int verbose) 2241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 2251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int i; 2261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_t *src_img = NULL; 2271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_t *dst_img = NULL; 2281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_t *mask_img = NULL; 2291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int src_width, src_height; 2301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int dst_width, dst_height; 2311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int src_stride, dst_stride; 2321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int src_x, src_y; 2331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int dst_x, dst_y; 2341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int mask_x, mask_y; 2351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int w, h; 2361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_op_t op; 2371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_format_code_t src_fmt, dst_fmt, mask_fmt; 2381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck uint32_t *dstbuf, *srcbuf, *maskbuf; 2391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck uint32_t crc32; 2401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int max_width, max_height, max_extra_stride; 2411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck FLOAT_REGS_CORRUPTION_DETECTOR_START (); 2421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck max_width = max_height = 24 + testnum / 10000; 2441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck max_extra_stride = 4 + testnum / 1000000; 2451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (max_width > 256) 2471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck max_width = 256; 2481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (max_height > 16) 2501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck max_height = 16; 2511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (max_extra_stride > 8) 2531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck max_extra_stride = 8; 2541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck prng_srand (testnum); 2561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck op = op_list[prng_rand_n (ARRAY_LENGTH (op_list))]; 2581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (prng_rand_n (8)) 2601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 2611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* normal image */ 2621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck src_img = create_random_image (img_fmt_list, max_width, max_height, 2631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck max_extra_stride, &src_fmt); 2641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 2651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else 2661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 2671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* solid case */ 2681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck src_img = create_random_image (img_fmt_list, 1, 1, 2691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck max_extra_stride, &src_fmt); 2701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_set_repeat (src_img, PIXMAN_REPEAT_NORMAL); 2721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 2731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck dst_img = create_random_image (img_fmt_list, max_width, max_height, 2751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck max_extra_stride, &dst_fmt); 2761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck src_width = pixman_image_get_width (src_img); 2781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck src_height = pixman_image_get_height (src_img); 2791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck src_stride = pixman_image_get_stride (src_img); 2801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck dst_width = pixman_image_get_width (dst_img); 2821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck dst_height = pixman_image_get_height (dst_img); 2831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck dst_stride = pixman_image_get_stride (dst_img); 2841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck dstbuf = pixman_image_get_data (dst_img); 2861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck srcbuf = pixman_image_get_data (src_img); 2871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck src_x = prng_rand_n (src_width); 2891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck src_y = prng_rand_n (src_height); 2901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck dst_x = prng_rand_n (dst_width); 2911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck dst_y = prng_rand_n (dst_height); 2921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck mask_img = NULL; 2941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck mask_fmt = PIXMAN_null; 2951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck mask_x = 0; 2961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck mask_y = 0; 2971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck maskbuf = NULL; 2981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 2991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if ((src_fmt == PIXMAN_x8r8g8b8 || src_fmt == PIXMAN_x8b8g8r8) && 3001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck (prng_rand_n (4) == 0)) 3011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 3021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* PIXBUF */ 3031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck mask_fmt = prng_rand_n (2) ? PIXMAN_a8r8g8b8 : PIXMAN_a8b8g8r8; 3041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck mask_img = pixman_image_create_bits (mask_fmt, 3051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck src_width, 3061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck src_height, 3071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck srcbuf, 3081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck src_stride); 3091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck mask_x = src_x; 3101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck mask_y = src_y; 3111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck maskbuf = srcbuf; 3121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 3131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else if (prng_rand_n (2)) 3141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 3151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (prng_rand_n (2)) 3161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 3171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck mask_img = create_random_image (mask_fmt_list, max_width, max_height, 3181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck max_extra_stride, &mask_fmt); 3191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 3201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else 3211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 3221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck /* solid case */ 3231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck mask_img = create_random_image (mask_fmt_list, 1, 1, 3241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck max_extra_stride, &mask_fmt); 3251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_set_repeat (mask_img, PIXMAN_REPEAT_NORMAL); 3261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 3271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (prng_rand_n (2)) 3291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_set_component_alpha (mask_img, 1); 3301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck mask_x = prng_rand_n (pixman_image_get_width (mask_img)); 3321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck mask_y = prng_rand_n (pixman_image_get_height (mask_img)); 3331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 3341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck w = prng_rand_n (dst_width - dst_x + 1); 3371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck h = prng_rand_n (dst_height - dst_y + 1); 3381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (verbose) 3401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 3411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck printf ("op=%s\n", operator_name (op)); 3421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck printf ("src_fmt=%s, dst_fmt=%s, mask_fmt=%s\n", 3431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck format_name (src_fmt), format_name (dst_fmt), 3441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck format_name (mask_fmt)); 3451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck printf ("src_width=%d, src_height=%d, dst_width=%d, dst_height=%d\n", 3461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck src_width, src_height, dst_width, dst_height); 3471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck printf ("src_x=%d, src_y=%d, dst_x=%d, dst_y=%d\n", 3481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck src_x, src_y, dst_x, dst_y); 3491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck printf ("src_stride=%d, dst_stride=%d\n", 3501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck src_stride, dst_stride); 3511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck printf ("w=%d, h=%d\n", w, h); 3521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 3531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_composite (op, src_img, mask_img, dst_img, 3551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck src_x, src_y, mask_x, mask_y, dst_x, dst_y, w, h); 3561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (verbose) 3581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 3591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int j; 3601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck printf ("---\n"); 3621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck for (i = 0; i < dst_height; i++) 3631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 3641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck for (j = 0; j < dst_stride; j++) 3651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 3661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (j == (dst_width * PIXMAN_FORMAT_BPP (dst_fmt) + 7) / 8) 3671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck printf ("| "); 3681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck printf ("%02X ", *((uint8_t *)dstbuf + i * dst_stride + j)); 3701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 3711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck printf ("\n"); 3721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 3731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck printf ("---\n"); 3741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 3751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck free_random_image (0, src_img, PIXMAN_null); 3771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck crc32 = free_random_image (0, dst_img, dst_fmt); 3781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (mask_img) 3801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 3811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck if (srcbuf == maskbuf) 3821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck pixman_image_unref(mask_img); 3831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck else 3841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck free_random_image (0, mask_img, PIXMAN_null); 3851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 3861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck FLOAT_REGS_CORRUPTION_DETECTOR_FINISH (); 3881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return crc32; 3891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 3901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3911176bdada62cabc6ec4b0308a930e83b679d5d36John Reckint 3921176bdada62cabc6ec4b0308a930e83b679d5d36John Reckmain (int argc, const char *argv[]) 3931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{ 3941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck int i; 3951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck prng_srand (0); 3971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 3981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck for (i = 1; i <= 8; i++) 3991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck { 4001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck initialize_palette (&(rgb_palette[i]), i, TRUE); 4011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck initialize_palette (&(y_palette[i]), i, FALSE); 4021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck } 4031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 4041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck return fuzzer_test_main("blitters", 2000000, 4051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck 0x0CF3283B, 4061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck test_composite, argc, argv); 4071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck} 408