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