1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "utils.h"
4 #include <sys/types.h>
5 #include "pixman-private.h"
6 
7 static const pixman_op_t op_list[] =
8 {
9     PIXMAN_OP_SRC,
10     PIXMAN_OP_OVER,
11     PIXMAN_OP_ADD,
12     PIXMAN_OP_CLEAR,
13     PIXMAN_OP_SRC,
14     PIXMAN_OP_DST,
15     PIXMAN_OP_OVER,
16     PIXMAN_OP_OVER_REVERSE,
17     PIXMAN_OP_IN,
18     PIXMAN_OP_IN_REVERSE,
19     PIXMAN_OP_OUT,
20     PIXMAN_OP_OUT_REVERSE,
21     PIXMAN_OP_ATOP,
22     PIXMAN_OP_ATOP_REVERSE,
23     PIXMAN_OP_XOR,
24     PIXMAN_OP_ADD,
25     PIXMAN_OP_SATURATE,
26     PIXMAN_OP_DISJOINT_CLEAR,
27     PIXMAN_OP_DISJOINT_SRC,
28     PIXMAN_OP_DISJOINT_DST,
29     PIXMAN_OP_DISJOINT_OVER,
30     PIXMAN_OP_DISJOINT_OVER_REVERSE,
31     PIXMAN_OP_DISJOINT_IN,
32     PIXMAN_OP_DISJOINT_IN_REVERSE,
33     PIXMAN_OP_DISJOINT_OUT,
34     PIXMAN_OP_DISJOINT_OUT_REVERSE,
35     PIXMAN_OP_DISJOINT_ATOP,
36     PIXMAN_OP_DISJOINT_ATOP_REVERSE,
37     PIXMAN_OP_DISJOINT_XOR,
38     PIXMAN_OP_CONJOINT_CLEAR,
39     PIXMAN_OP_CONJOINT_SRC,
40     PIXMAN_OP_CONJOINT_DST,
41     PIXMAN_OP_CONJOINT_OVER,
42     PIXMAN_OP_CONJOINT_OVER_REVERSE,
43     PIXMAN_OP_CONJOINT_IN,
44     PIXMAN_OP_CONJOINT_IN_REVERSE,
45     PIXMAN_OP_CONJOINT_OUT,
46     PIXMAN_OP_CONJOINT_OUT_REVERSE,
47     PIXMAN_OP_CONJOINT_ATOP,
48     PIXMAN_OP_CONJOINT_ATOP_REVERSE,
49     PIXMAN_OP_CONJOINT_XOR,
50     PIXMAN_OP_MULTIPLY,
51     PIXMAN_OP_SCREEN,
52     PIXMAN_OP_OVERLAY,
53     PIXMAN_OP_DARKEN,
54     PIXMAN_OP_LIGHTEN,
55     PIXMAN_OP_COLOR_DODGE,
56     PIXMAN_OP_COLOR_BURN,
57     PIXMAN_OP_HARD_LIGHT,
58     PIXMAN_OP_DIFFERENCE,
59     PIXMAN_OP_EXCLUSION,
60     PIXMAN_OP_SOFT_LIGHT,
61     PIXMAN_OP_HSL_HUE,
62     PIXMAN_OP_HSL_SATURATION,
63     PIXMAN_OP_HSL_COLOR,
64     PIXMAN_OP_HSL_LUMINOSITY,
65 };
66 
67 static float
rand_float(void)68 rand_float (void)
69 {
70     uint32_t u = prng_rand();
71 
72     return *(float *)&u;
73 }
74 
75 static void
random_floats(argb_t * argb,int width)76 random_floats (argb_t *argb, int width)
77 {
78     int i;
79 
80     for (i = 0; i < width; ++i)
81     {
82 	argb_t *p = argb + i;
83 
84 	p->a = rand_float();
85 	p->r = rand_float();
86 	p->g = rand_float();
87 	p->b = rand_float();
88     }
89 }
90 
91 #define WIDTH	512
92 
93 static pixman_combine_float_func_t
lookup_combiner(pixman_implementation_t * imp,pixman_op_t op,pixman_bool_t component_alpha)94 lookup_combiner (pixman_implementation_t *imp, pixman_op_t op,
95 		 pixman_bool_t component_alpha)
96 {
97     pixman_combine_float_func_t f;
98 
99     do
100     {
101 	if (component_alpha)
102 	    f = imp->combine_float_ca[op];
103 	else
104 	    f = imp->combine_float[op];
105 
106 	imp = imp->fallback;
107     }
108     while (!f);
109 
110     return f;
111 }
112 
113 int
main()114 main ()
115 {
116     pixman_implementation_t *impl;
117     argb_t *src_bytes = malloc (WIDTH * sizeof (argb_t));
118     argb_t *mask_bytes = malloc (WIDTH * sizeof (argb_t));
119     argb_t *dest_bytes = malloc (WIDTH * sizeof (argb_t));
120     int i;
121 
122     enable_divbyzero_exceptions();
123 
124     impl = _pixman_internal_only_get_implementation();
125 
126     prng_srand (0);
127 
128     for (i = 0; i < ARRAY_LENGTH (op_list); ++i)
129     {
130 	pixman_op_t op = op_list[i];
131 	pixman_combine_float_func_t combiner;
132 	int ca;
133 
134 	for (ca = 0; ca < 2; ++ca)
135 	{
136 	    combiner = lookup_combiner (impl, op, ca);
137 
138 	    random_floats (src_bytes, WIDTH);
139 	    random_floats (mask_bytes, WIDTH);
140 	    random_floats (dest_bytes, WIDTH);
141 
142 	    combiner (impl, op,
143 		      (float *)dest_bytes,
144 		      (float *)mask_bytes,
145 		      (float *)src_bytes,
146 		      WIDTH);
147 	}
148     }
149 
150     return 0;
151 }
152