Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1891 serge 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 8
7
#define MASK 0xff
8
#define ONE_HALF 0x80
9
 
10
#define A_SHIFT 8 * 3
11
#define R_SHIFT 8 * 2
12
#define G_SHIFT 8
13
#define A_MASK 0xff000000
14
#define R_MASK 0xff0000
15
#define G_MASK 0xff00
16
 
17
#define RB_MASK 0xff00ff
18
#define AG_MASK 0xff00ff00
19
#define RB_ONE_HALF 0x800080
20
#define RB_MASK_PLUS_ONE 0x10000100
21
 
22
#define ALPHA_8(x) ((x) >> A_SHIFT)
23
#define RED_8(x) (((x) >> R_SHIFT) & MASK)
24
#define GREEN_8(x) (((x) >> G_SHIFT) & MASK)
25
#define BLUE_8(x) ((x) & MASK)
26
 
27
/*
28
 * Helper macros.
29
 */
30
 
31
#define MUL_UN8(a, b, t)						\
32
    ((t) = (a) * (b) + ONE_HALF, ((((t) >> G_SHIFT ) + (t) ) >> G_SHIFT ))
33
 
34
#define DIV_UN8(a, b)							\
35
    (((uint16_t) (a) * MASK) / (b))
36
 
37
#define ADD_UN8(x, y, t)				     \
38
    ((t) = (x) + (y),					     \
39
     (uint32_t) (uint8_t) ((t) | (0 - ((t) >> G_SHIFT))))
40
 
41
#define DIV_ONE_UN8(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 UN8_rb_MUL_UN8(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 UN8_rb_ADD_UN8_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 UN8_rb_MUL_UN8_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 UN8x4_MUL_UN8(x, a)						\
89
    do									\
90
    {									\
91
	uint32_t r1__, r2__, t__;					\
92
									\
93
	r1__ = (x);							\
94
	UN8_rb_MUL_UN8 (r1__, (a), t__);				\
95
									\
96
	r2__ = (x) >> G_SHIFT;						\
97
	UN8_rb_MUL_UN8 (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 UN8x4_MUL_UN8_ADD_UN8x4(x, a, y)				\
106
    do									\
107
    {									\
108
	uint32_t r1__, r2__, r3__, t__;					\
109
									\
110
	r1__ = (x);							\
111
	r2__ = (y) & RB_MASK;						\
112
	UN8_rb_MUL_UN8 (r1__, (a), t__);				\
113
	UN8_rb_ADD_UN8_rb (r1__, r2__, t__);				\
114
									\
115
	r2__ = (x) >> G_SHIFT;						\
116
	r3__ = ((y) >> G_SHIFT) & RB_MASK;				\
117
	UN8_rb_MUL_UN8 (r2__, (a), t__);				\
118
	UN8_rb_ADD_UN8_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 UN8x4_MUL_UN8_ADD_UN8x4_MUL_UN8(x, a, y, b)			\
127
    do									\
128
    {									\
129
	uint32_t r1__, r2__, r3__, t__;					\
130
									\
131
	r1__ = (x);							\
132
	r2__ = (y);							\
133
	UN8_rb_MUL_UN8 (r1__, (a), t__);				\
134
	UN8_rb_MUL_UN8 (r2__, (b), t__);				\
135
	UN8_rb_ADD_UN8_rb (r1__, r2__, t__);				\
136
									\
137
	r2__ = ((x) >> G_SHIFT);					\
138
	r3__ = ((y) >> G_SHIFT);					\
139
	UN8_rb_MUL_UN8 (r2__, (a), t__);				\
140
	UN8_rb_MUL_UN8 (r3__, (b), t__);				\
141
	UN8_rb_ADD_UN8_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 UN8x4_MUL_UN8x4(x, a)						\
150
    do									\
151
    {									\
152
	uint32_t r1__, r2__, r3__, t__;					\
153
									\
154
	r1__ = (x);							\
155
	r2__ = (a);							\
156
	UN8_rb_MUL_UN8_rb (r1__, r2__, t__);				\
157
									\
158
	r2__ = (x) >> G_SHIFT;						\
159
	r3__ = (a) >> G_SHIFT;						\
160
	UN8_rb_MUL_UN8_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 UN8x4_MUL_UN8x4_ADD_UN8x4(x, a, y)				\
169
    do									\
170
    {									\
171
	uint32_t r1__, r2__, r3__, t__;					\
172
									\
173
	r1__ = (x);							\
174
	r2__ = (a);							\
175
	UN8_rb_MUL_UN8_rb (r1__, r2__, t__);				\
176
	r2__ = (y) & RB_MASK;						\
177
	UN8_rb_ADD_UN8_rb (r1__, r2__, t__);				\
178
									\
179
	r2__ = ((x) >> G_SHIFT);					\
180
	r3__ = ((a) >> G_SHIFT);					\
181
	UN8_rb_MUL_UN8_rb (r2__, r3__, t__);				\
182
	r3__ = ((y) >> G_SHIFT) & RB_MASK;				\
183
	UN8_rb_ADD_UN8_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 UN8x4_MUL_UN8x4_ADD_UN8x4_MUL_UN8(x, a, y, b)			\
192
    do									\
193
    {									\
194
	uint32_t r1__, r2__, r3__, t__;					\
195
									\
196
	r1__ = (x);							\
197
	r2__ = (a);							\
198
	UN8_rb_MUL_UN8_rb (r1__, r2__, t__);				\
199
	r2__ = (y);							\
200
	UN8_rb_MUL_UN8 (r2__, (b), t__);				\
201
	UN8_rb_ADD_UN8_rb (r1__, r2__, t__);				\
202
									\
203
	r2__ = (x) >> G_SHIFT;						\
204
	r3__ = (a) >> G_SHIFT;						\
205
	UN8_rb_MUL_UN8_rb (r2__, r3__, t__);				\
206
	r3__ = (y) >> G_SHIFT;						\
207
	UN8_rb_MUL_UN8 (r3__, (b), t__);				\
208
	UN8_rb_ADD_UN8_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 UN8x4_ADD_UN8x4(x, y)						\
217
    do									\
218
    {									\
219
	uint32_t r1__, r2__, r3__, t__;					\
220
									\
221
	r1__ = (x) & RB_MASK;						\
222
	r2__ = (y) & RB_MASK;						\
223
	UN8_rb_ADD_UN8_rb (r1__, r2__, t__);				\
224
									\
225
	r2__ = ((x) >> G_SHIFT) & RB_MASK;				\
226
	r3__ = ((y) >> G_SHIFT) & RB_MASK;				\
227
	UN8_rb_ADD_UN8_rb (r2__, r3__, t__);				\
228
									\
229
	x = r1__ | (r2__ << G_SHIFT);					\
230
    } while (0)