#include <stdlib.h> #include "utils.h" #define WIDTH 32 #define HEIGHT 32 static const pixman_format_code_t formats[] = { PIXMAN_a8r8g8b8, PIXMAN_a8b8g8r8, PIXMAN_x8r8g8b8, PIXMAN_x8b8g8r8, PIXMAN_r5g6b5, PIXMAN_b5g6r5, PIXMAN_a8, PIXMAN_a1, }; static const pixman_op_t ops[] = { PIXMAN_OP_OVER, PIXMAN_OP_SRC, PIXMAN_OP_ADD, }; #define TRANSFORM(v00, v01, v10, v11) \ { { { v00, v01, WIDTH * pixman_fixed_1 / 2 }, \ { v10, v11, HEIGHT * pixman_fixed_1 / 2 }, \ { 0, 0, pixman_fixed_1 } } } #define F1 pixman_fixed_1 static const pixman_transform_t transforms[] = { TRANSFORM (0, -1, 1, 0), /* wrong 90 degree rotation */ TRANSFORM (0, 1, -1, 0), /* wrong 270 degree rotation */ TRANSFORM (1, 0, 0, 1), /* wrong identity */ TRANSFORM (-1, 0, 0, -1), /* wrong 180 degree rotation */ TRANSFORM (0, -F1, F1, 0), /* correct 90 degree rotation */ TRANSFORM (0, F1, -F1, 0), /* correct 270 degree rotation */ TRANSFORM (F1, 0, 0, F1), /* correct identity */ TRANSFORM (-F1, 0, 0, -F1), /* correct 180 degree rotation */ }; #define RANDOM_FORMAT() \ (formats[prng_rand_n (ARRAY_LENGTH (formats))]) #define RANDOM_OP() \ (ops[prng_rand_n (ARRAY_LENGTH (ops))]) #define RANDOM_TRANSFORM() \ (&(transforms[prng_rand_n (ARRAY_LENGTH (transforms))])) static void on_destroy (pixman_image_t *image, void *data) { free (data); } static pixman_image_t * make_image (void) { pixman_format_code_t format = RANDOM_FORMAT(); uint32_t *bytes = malloc (WIDTH * HEIGHT * 4); pixman_image_t *image; prng_randmemset (bytes, WIDTH * HEIGHT * 4, 0); image = pixman_image_create_bits ( format, WIDTH, HEIGHT, bytes, WIDTH * 4); pixman_image_set_transform (image, RANDOM_TRANSFORM()); pixman_image_set_destroy_function (image, on_destroy, bytes); pixman_image_set_repeat (image, PIXMAN_REPEAT_NORMAL); image_endian_swap (image); return image; } static uint32_t test_transform (int testnum, int verbose) { pixman_image_t *src, *dest; uint32_t crc; prng_srand (testnum); src = make_image (); dest = make_image (); pixman_image_composite (RANDOM_OP(), src, NULL, dest, 0, 0, 0, 0, WIDTH / 2, HEIGHT / 2, WIDTH, HEIGHT); crc = compute_crc32_for_image (0, dest); pixman_image_unref (src); pixman_image_unref (dest); return crc; } int main (int argc, const char *argv[]) { return fuzzer_test_main ("rotate", 15000, 0xECF5E426, test_transform, argc, argv); }