| #include <stdio.h> |
| #include <stdlib.h> |
| #include "utils.h" |
| #include <sys/types.h> |
| #include "pixman-private.h" |
| |
| static const pixman_op_t op_list[] = |
| { |
| PIXMAN_OP_SRC, |
| PIXMAN_OP_OVER, |
| PIXMAN_OP_ADD, |
| PIXMAN_OP_CLEAR, |
| PIXMAN_OP_SRC, |
| PIXMAN_OP_DST, |
| PIXMAN_OP_OVER, |
| PIXMAN_OP_OVER_REVERSE, |
| PIXMAN_OP_IN, |
| PIXMAN_OP_IN_REVERSE, |
| PIXMAN_OP_OUT, |
| PIXMAN_OP_OUT_REVERSE, |
| PIXMAN_OP_ATOP, |
| PIXMAN_OP_ATOP_REVERSE, |
| PIXMAN_OP_XOR, |
| PIXMAN_OP_ADD, |
| PIXMAN_OP_SATURATE, |
| PIXMAN_OP_DISJOINT_CLEAR, |
| PIXMAN_OP_DISJOINT_SRC, |
| PIXMAN_OP_DISJOINT_DST, |
| PIXMAN_OP_DISJOINT_OVER, |
| PIXMAN_OP_DISJOINT_OVER_REVERSE, |
| PIXMAN_OP_DISJOINT_IN, |
| PIXMAN_OP_DISJOINT_IN_REVERSE, |
| PIXMAN_OP_DISJOINT_OUT, |
| PIXMAN_OP_DISJOINT_OUT_REVERSE, |
| PIXMAN_OP_DISJOINT_ATOP, |
| PIXMAN_OP_DISJOINT_ATOP_REVERSE, |
| PIXMAN_OP_DISJOINT_XOR, |
| PIXMAN_OP_CONJOINT_CLEAR, |
| PIXMAN_OP_CONJOINT_SRC, |
| PIXMAN_OP_CONJOINT_DST, |
| PIXMAN_OP_CONJOINT_OVER, |
| PIXMAN_OP_CONJOINT_OVER_REVERSE, |
| PIXMAN_OP_CONJOINT_IN, |
| PIXMAN_OP_CONJOINT_IN_REVERSE, |
| PIXMAN_OP_CONJOINT_OUT, |
| PIXMAN_OP_CONJOINT_OUT_REVERSE, |
| PIXMAN_OP_CONJOINT_ATOP, |
| PIXMAN_OP_CONJOINT_ATOP_REVERSE, |
| PIXMAN_OP_CONJOINT_XOR, |
| PIXMAN_OP_MULTIPLY, |
| PIXMAN_OP_SCREEN, |
| PIXMAN_OP_OVERLAY, |
| PIXMAN_OP_DARKEN, |
| PIXMAN_OP_LIGHTEN, |
| PIXMAN_OP_COLOR_DODGE, |
| PIXMAN_OP_COLOR_BURN, |
| PIXMAN_OP_HARD_LIGHT, |
| PIXMAN_OP_DIFFERENCE, |
| PIXMAN_OP_EXCLUSION, |
| PIXMAN_OP_SOFT_LIGHT, |
| PIXMAN_OP_HSL_HUE, |
| PIXMAN_OP_HSL_SATURATION, |
| PIXMAN_OP_HSL_COLOR, |
| PIXMAN_OP_HSL_LUMINOSITY, |
| }; |
| |
| static float |
| rand_float (void) |
| { |
| uint32_t u = prng_rand(); |
| |
| return *(float *)&u; |
| } |
| |
| static void |
| random_floats (argb_t *argb, int width) |
| { |
| int i; |
| |
| for (i = 0; i < width; ++i) |
| { |
| argb_t *p = argb + i; |
| |
| p->a = rand_float(); |
| p->r = rand_float(); |
| p->g = rand_float(); |
| p->b = rand_float(); |
| } |
| } |
| |
| #define WIDTH 512 |
| |
| static pixman_combine_float_func_t |
| lookup_combiner (pixman_implementation_t *imp, pixman_op_t op, |
| pixman_bool_t component_alpha) |
| { |
| pixman_combine_float_func_t f; |
| |
| do |
| { |
| if (component_alpha) |
| f = imp->combine_float_ca[op]; |
| else |
| f = imp->combine_float[op]; |
| |
| imp = imp->fallback; |
| } |
| while (!f); |
| |
| return f; |
| } |
| |
| int |
| main () |
| { |
| pixman_implementation_t *impl; |
| argb_t *src_bytes = malloc (WIDTH * sizeof (argb_t)); |
| argb_t *mask_bytes = malloc (WIDTH * sizeof (argb_t)); |
| argb_t *dest_bytes = malloc (WIDTH * sizeof (argb_t)); |
| int i; |
| |
| enable_divbyzero_exceptions(); |
| |
| impl = _pixman_internal_only_get_implementation(); |
| |
| prng_srand (0); |
| |
| for (i = 0; i < ARRAY_LENGTH (op_list); ++i) |
| { |
| pixman_op_t op = op_list[i]; |
| pixman_combine_float_func_t combiner; |
| int ca; |
| |
| for (ca = 0; ca < 2; ++ca) |
| { |
| combiner = lookup_combiner (impl, op, ca); |
| |
| random_floats (src_bytes, WIDTH); |
| random_floats (mask_bytes, WIDTH); |
| random_floats (dest_bytes, WIDTH); |
| |
| combiner (impl, op, |
| (float *)dest_bytes, |
| (float *)mask_bytes, |
| (float *)src_bytes, |
| WIDTH); |
| } |
| } |
| |
| return 0; |
| } |