16
#define RB_MASK_PLUS_ONE
18
#define ALPHA_c(x) ((x) >> A_SHIFT)
19
#define RED_c(x) (((x) >> R_SHIFT) & MASK)
20
#define GREEN_c(x) (((x) >> G_SHIFT) & MASK)
21
#define BLUE_c(x) ((x) & MASK)
27
#define MUL_UNc(a, b, t) \
28
((t) = (a) * (b) + ONE_HALF, ((((t) >> G_SHIFT ) + (t) ) >> G_SHIFT ))
30
#define DIV_UNc(a, b) \
31
(((comp2_t) (a) * MASK) / (b))
33
#define ADD_UNc(x, y, t) \
35
(comp4_t) (comp1_t) ((t) | (0 - ((t) >> G_SHIFT))))
37
#define DIV_ONE_UNc(x) \
38
(((x) + ONE_HALF + (((x) + ONE_HALF) >> G_SHIFT)) >> G_SHIFT)
41
* The methods below use some tricks to be able to do two color
42
* components at the same time.
46
* x_rb = (x_rb * a) / 255
48
#define UNc_rb_MUL_UNc(x, a, t) \
51
t = ((x) & RB_MASK) * (a); \
53
x = (t + ((t >> G_SHIFT) & RB_MASK)) >> G_SHIFT; \
58
* x_rb = min (x_rb + y_rb, 255)
60
#define UNc_rb_ADD_UNc_rb(x, y, t) \
64
t |= RB_MASK_PLUS_ONE - ((t >> G_SHIFT) & RB_MASK); \
69
* x_rb = (x_rb * a_rb) / 255
71
#define UNc_rb_MUL_UNc_rb(x, a, t) \
74
t = (x & MASK) * (a & MASK); \
75
t |= (x & R_MASK) * ((a >> R_SHIFT) & MASK); \
77
t = (t + ((t >> G_SHIFT) & RB_MASK)) >> G_SHIFT; \
82
* x_c = (x_c * a) / 255
84
#define UNcx4_MUL_UNc(x, a) \
90
UNc_rb_MUL_UNc (r1, a, t); \
92
r2 = (x) >> G_SHIFT; \
93
UNc_rb_MUL_UNc (r2, a, t); \
95
x = r1 | (r2 << G_SHIFT); \
99
* x_c = (x_c * a) / 255 + y_c
101
#define UNcx4_MUL_UNc_ADD_UNcx4(x, a, y) \
104
comp4_t r1, r2, r3, t; \
107
r2 = (y) & RB_MASK; \
108
UNc_rb_MUL_UNc (r1, a, t); \
109
UNc_rb_ADD_UNc_rb (r1, r2, t); \
111
r2 = (x) >> G_SHIFT; \
112
r3 = ((y) >> G_SHIFT) & RB_MASK; \
113
UNc_rb_MUL_UNc (r2, a, t); \
114
UNc_rb_ADD_UNc_rb (r2, r3, t); \
116
x = r1 | (r2 << G_SHIFT); \
120
* x_c = (x_c * a + y_c * b) / 255
122
#define UNcx4_MUL_UNc_ADD_UNcx4_MUL_UNc(x, a, y, b) \
125
comp4_t r1, r2, r3, t; \
129
UNc_rb_MUL_UNc (r1, a, t); \
130
UNc_rb_MUL_UNc (r2, b, t); \
131
UNc_rb_ADD_UNc_rb (r1, r2, t); \
133
r2 = (x >> G_SHIFT); \
134
r3 = (y >> G_SHIFT); \
135
UNc_rb_MUL_UNc (r2, a, t); \
136
UNc_rb_MUL_UNc (r3, b, t); \
137
UNc_rb_ADD_UNc_rb (r2, r3, t); \
139
x = r1 | (r2 << G_SHIFT); \
143
* x_c = (x_c * a_c) / 255
145
#define UNcx4_MUL_UNcx4(x, a) \
148
comp4_t r1, r2, r3, t; \
152
UNc_rb_MUL_UNc_rb (r1, r2, t); \
156
UNc_rb_MUL_UNc_rb (r2, r3, t); \
158
x = r1 | (r2 << G_SHIFT); \
162
* x_c = (x_c * a_c) / 255 + y_c
164
#define UNcx4_MUL_UNcx4_ADD_UNcx4(x, a, y) \
167
comp4_t r1, r2, r3, t; \
171
UNc_rb_MUL_UNc_rb (r1, r2, t); \
173
UNc_rb_ADD_UNc_rb (r1, r2, t); \
175
r2 = (x >> G_SHIFT); \
176
r3 = (a >> G_SHIFT); \
177
UNc_rb_MUL_UNc_rb (r2, r3, t); \
178
r3 = (y >> G_SHIFT) & RB_MASK; \
179
UNc_rb_ADD_UNc_rb (r2, r3, t); \
181
x = r1 | (r2 << G_SHIFT); \
185
* x_c = (x_c * a_c + y_c * b) / 255
187
#define UNcx4_MUL_UNcx4_ADD_UNcx4_MUL_UNc(x, a, y, b) \
190
comp4_t r1, r2, r3, t; \
194
UNc_rb_MUL_UNc_rb (r1, r2, t); \
196
UNc_rb_MUL_UNc (r2, b, t); \
197
UNc_rb_ADD_UNc_rb (r1, r2, t); \
201
UNc_rb_MUL_UNc_rb (r2, r3, t); \
203
UNc_rb_MUL_UNc (r3, b, t); \
204
UNc_rb_ADD_UNc_rb (r2, r3, t); \
206
x = r1 | (r2 << G_SHIFT); \
210
x_c = min(x_c + y_c, 255)
212
#define UNcx4_ADD_UNcx4(x, y) \
215
comp4_t r1, r2, r3, t; \
219
UNc_rb_ADD_UNc_rb (r1, r2, t); \
221
r2 = (x >> G_SHIFT) & RB_MASK; \
222
r3 = (y >> G_SHIFT) & RB_MASK; \
223
UNc_rb_ADD_UNc_rb (r2, r3, t); \
225
x = r1 | (r2 << G_SHIFT); \