gfx/cairo/libpixman/src/pixman-combine64.h

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:146dd84d75c5
1 /* WARNING: This file is generated by combine.pl from combine.inc.
2 Please edit one of those files rather than this one. */
3
4 #line 1 "pixman-combine.c.template"
5
6 #define COMPONENT_SIZE 16
7 #define MASK 0xffffULL
8 #define ONE_HALF 0x8000ULL
9
10 #define A_SHIFT 16 * 3
11 #define R_SHIFT 16 * 2
12 #define G_SHIFT 16
13 #define A_MASK 0xffff000000000000ULL
14 #define R_MASK 0xffff00000000ULL
15 #define G_MASK 0xffff0000ULL
16
17 #define RB_MASK 0xffff0000ffffULL
18 #define AG_MASK 0xffff0000ffff0000ULL
19 #define RB_ONE_HALF 0x800000008000ULL
20 #define RB_MASK_PLUS_ONE 0x10000000010000ULL
21
22 #define ALPHA_16(x) ((x) >> A_SHIFT)
23 #define RED_16(x) (((x) >> R_SHIFT) & MASK)
24 #define GREEN_16(x) (((x) >> G_SHIFT) & MASK)
25 #define BLUE_16(x) ((x) & MASK)
26
27 /*
28 * Helper macros.
29 */
30
31 #define MUL_UN16(a, b, t) \
32 ((t) = (a) * (uint32_t)(b) + ONE_HALF, ((((t) >> G_SHIFT ) + (t) ) >> G_SHIFT ))
33
34 #define DIV_UN16(a, b) \
35 (((uint32_t) (a) * MASK + ((b) / 2)) / (b))
36
37 #define ADD_UN16(x, y, t) \
38 ((t) = (x) + (y), \
39 (uint64_t) (uint16_t) ((t) | (0 - ((t) >> G_SHIFT))))
40
41 #define DIV_ONE_UN16(x) \
42 (((x) + ONE_HALF + (((x) + ONE_HALF) >> G_SHIFT)) >> G_SHIFT)
43
44 /*
45 * The methods below use some tricks to be able to do two color
46 * components at the same time.
47 */
48
49 /*
50 * x_rb = (x_rb * a) / 255
51 */
52 #define UN16_rb_MUL_UN16(x, a, t) \
53 do \
54 { \
55 t = ((x) & RB_MASK) * (a); \
56 t += RB_ONE_HALF; \
57 x = (t + ((t >> G_SHIFT) & RB_MASK)) >> G_SHIFT; \
58 x &= RB_MASK; \
59 } while (0)
60
61 /*
62 * x_rb = min (x_rb + y_rb, 255)
63 */
64 #define UN16_rb_ADD_UN16_rb(x, y, t) \
65 do \
66 { \
67 t = ((x) + (y)); \
68 t |= RB_MASK_PLUS_ONE - ((t >> G_SHIFT) & RB_MASK); \
69 x = (t & RB_MASK); \
70 } while (0)
71
72 /*
73 * x_rb = (x_rb * a_rb) / 255
74 */
75 #define UN16_rb_MUL_UN16_rb(x, a, t) \
76 do \
77 { \
78 t = (x & MASK) * (a & MASK); \
79 t |= (x & R_MASK) * ((a >> R_SHIFT) & MASK); \
80 t += RB_ONE_HALF; \
81 t = (t + ((t >> G_SHIFT) & RB_MASK)) >> G_SHIFT; \
82 x = t & RB_MASK; \
83 } while (0)
84
85 /*
86 * x_c = (x_c * a) / 255
87 */
88 #define UN16x4_MUL_UN16(x, a) \
89 do \
90 { \
91 uint64_t r1__, r2__, t__; \
92 \
93 r1__ = (x); \
94 UN16_rb_MUL_UN16 (r1__, (a), t__); \
95 \
96 r2__ = (x) >> G_SHIFT; \
97 UN16_rb_MUL_UN16 (r2__, (a), t__); \
98 \
99 (x) = r1__ | (r2__ << G_SHIFT); \
100 } while (0)
101
102 /*
103 * x_c = (x_c * a) / 255 + y_c
104 */
105 #define UN16x4_MUL_UN16_ADD_UN16x4(x, a, y) \
106 do \
107 { \
108 uint64_t r1__, r2__, r3__, t__; \
109 \
110 r1__ = (x); \
111 r2__ = (y) & RB_MASK; \
112 UN16_rb_MUL_UN16 (r1__, (a), t__); \
113 UN16_rb_ADD_UN16_rb (r1__, r2__, t__); \
114 \
115 r2__ = (x) >> G_SHIFT; \
116 r3__ = ((y) >> G_SHIFT) & RB_MASK; \
117 UN16_rb_MUL_UN16 (r2__, (a), t__); \
118 UN16_rb_ADD_UN16_rb (r2__, r3__, t__); \
119 \
120 (x) = r1__ | (r2__ << G_SHIFT); \
121 } while (0)
122
123 /*
124 * x_c = (x_c * a + y_c * b) / 255
125 */
126 #define UN16x4_MUL_UN16_ADD_UN16x4_MUL_UN16(x, a, y, b) \
127 do \
128 { \
129 uint64_t r1__, r2__, r3__, t__; \
130 \
131 r1__ = (x); \
132 r2__ = (y); \
133 UN16_rb_MUL_UN16 (r1__, (a), t__); \
134 UN16_rb_MUL_UN16 (r2__, (b), t__); \
135 UN16_rb_ADD_UN16_rb (r1__, r2__, t__); \
136 \
137 r2__ = ((x) >> G_SHIFT); \
138 r3__ = ((y) >> G_SHIFT); \
139 UN16_rb_MUL_UN16 (r2__, (a), t__); \
140 UN16_rb_MUL_UN16 (r3__, (b), t__); \
141 UN16_rb_ADD_UN16_rb (r2__, r3__, t__); \
142 \
143 (x) = r1__ | (r2__ << G_SHIFT); \
144 } while (0)
145
146 /*
147 * x_c = (x_c * a_c) / 255
148 */
149 #define UN16x4_MUL_UN16x4(x, a) \
150 do \
151 { \
152 uint64_t r1__, r2__, r3__, t__; \
153 \
154 r1__ = (x); \
155 r2__ = (a); \
156 UN16_rb_MUL_UN16_rb (r1__, r2__, t__); \
157 \
158 r2__ = (x) >> G_SHIFT; \
159 r3__ = (a) >> G_SHIFT; \
160 UN16_rb_MUL_UN16_rb (r2__, r3__, t__); \
161 \
162 (x) = r1__ | (r2__ << G_SHIFT); \
163 } while (0)
164
165 /*
166 * x_c = (x_c * a_c) / 255 + y_c
167 */
168 #define UN16x4_MUL_UN16x4_ADD_UN16x4(x, a, y) \
169 do \
170 { \
171 uint64_t r1__, r2__, r3__, t__; \
172 \
173 r1__ = (x); \
174 r2__ = (a); \
175 UN16_rb_MUL_UN16_rb (r1__, r2__, t__); \
176 r2__ = (y) & RB_MASK; \
177 UN16_rb_ADD_UN16_rb (r1__, r2__, t__); \
178 \
179 r2__ = ((x) >> G_SHIFT); \
180 r3__ = ((a) >> G_SHIFT); \
181 UN16_rb_MUL_UN16_rb (r2__, r3__, t__); \
182 r3__ = ((y) >> G_SHIFT) & RB_MASK; \
183 UN16_rb_ADD_UN16_rb (r2__, r3__, t__); \
184 \
185 (x) = r1__ | (r2__ << G_SHIFT); \
186 } while (0)
187
188 /*
189 * x_c = (x_c * a_c + y_c * b) / 255
190 */
191 #define UN16x4_MUL_UN16x4_ADD_UN16x4_MUL_UN16(x, a, y, b) \
192 do \
193 { \
194 uint64_t r1__, r2__, r3__, t__; \
195 \
196 r1__ = (x); \
197 r2__ = (a); \
198 UN16_rb_MUL_UN16_rb (r1__, r2__, t__); \
199 r2__ = (y); \
200 UN16_rb_MUL_UN16 (r2__, (b), t__); \
201 UN16_rb_ADD_UN16_rb (r1__, r2__, t__); \
202 \
203 r2__ = (x) >> G_SHIFT; \
204 r3__ = (a) >> G_SHIFT; \
205 UN16_rb_MUL_UN16_rb (r2__, r3__, t__); \
206 r3__ = (y) >> G_SHIFT; \
207 UN16_rb_MUL_UN16 (r3__, (b), t__); \
208 UN16_rb_ADD_UN16_rb (r2__, r3__, t__); \
209 \
210 x = r1__ | (r2__ << G_SHIFT); \
211 } while (0)
212
213 /*
214 x_c = min(x_c + y_c, 255)
215 */
216 #define UN16x4_ADD_UN16x4(x, y) \
217 do \
218 { \
219 uint64_t r1__, r2__, r3__, t__; \
220 \
221 r1__ = (x) & RB_MASK; \
222 r2__ = (y) & RB_MASK; \
223 UN16_rb_ADD_UN16_rb (r1__, r2__, t__); \
224 \
225 r2__ = ((x) >> G_SHIFT) & RB_MASK; \
226 r3__ = ((y) >> G_SHIFT) & RB_MASK; \
227 UN16_rb_ADD_UN16_rb (r2__, r3__, t__); \
228 \
229 x = r1__ | (r2__ << G_SHIFT); \
230 } while (0)

mercurial