~ubuntu-branches/ubuntu/saucy/pixman/saucy-security

« back to all changes in this revision

Viewing changes to pixman/pixman-combine64.h

  • Committer: Bazaar Package Importer
  • Author(s): Julien Cristau
  • Date: 2009-09-28 18:12:47 UTC
  • mfrom: (1.1.8 upstream) (2.1.3 squeeze)
  • Revision ID: james.westby@ubuntu.com-20090928181247-3iehog63i50htejf
Tags: 0.16.2-1
* New upstream release (closes: #546849).
* Upload to unstable.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/* WARNING: This file is generated by combine.pl from combine.inc.
2
2
   Please edit one of those files rather than this one. */
3
3
 
4
 
#line 1 "combine.inc"
 
4
#line 1 "pixman-combine.c.template"
5
5
 
6
6
#define COMPONENT_SIZE 16
7
7
#define MASK 0xffffULL
19
19
#define RB_ONE_HALF 0x800000008000ULL
20
20
#define RB_MASK_PLUS_ONE 0x10000000010000ULL
21
21
 
22
 
#define Alpha(x) ((x) >> A_SHIFT)
 
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)
23
26
 
24
27
/*
25
28
 * Helper macros.
26
29
 */
27
30
 
28
 
#define IntMult(a,b,t) ( (t) = (a) * (b) + ONE_HALF, ( ( ( (t)>>G_SHIFT ) + (t) )>>G_SHIFT ) )
29
 
#define IntDiv(a,b)    (((uint32_t) (a) * MASK) / (b))
30
 
 
31
 
#define GetComp(v,i)   ((uint32_t) (uint16_t) ((v) >> i))
32
 
 
33
 
#define Add(x,y,i,t)   ((t) = GetComp(x,i) + GetComp(y,i),              \
34
 
                        (uint64_t) ((uint16_t) ((t) | (0 - ((t) >> G_SHIFT)))) << (i))
35
 
 
36
 
#define FbGen(x,y,i,ax,ay,t,u,v) ((t) = (IntMult(GetComp(y,i),ay,(u)) + \
37
 
                                         IntMult(GetComp(x,i),ax,(v))), \
38
 
                                  (uint64_t) ((uint16_t) ((t) |         \
39
 
                                                         (0 - ((t) >> G_SHIFT)))) << (i))
40
 
 
41
 
/*
42
 
  The methods below use some tricks to be able to do two color
43
 
  components at the same time.
44
 
*/
45
 
 
46
 
/*
47
 
  x_c = (x_c * a) / 255
48
 
*/
49
 
#define FbByteMul(x, a) do {                                            \
50
 
        uint64_t t = ((x & RB_MASK) * a) + RB_ONE_HALF;                  \
51
 
        t = (t + ((t >> COMPONENT_SIZE) & RB_MASK)) >> COMPONENT_SIZE;  \
52
 
        t &= RB_MASK;                                                   \
53
 
                                                                        \
54
 
        x = (((x >> COMPONENT_SIZE) & RB_MASK) * a) + RB_ONE_HALF;      \
55
 
        x = (x + ((x >> COMPONENT_SIZE) & RB_MASK));                    \
56
 
        x &= RB_MASK << COMPONENT_SIZE;                                 \
57
 
        x += t;                                                         \
58
 
    } while (0)
59
 
 
60
 
/*
61
 
  x_c = (x_c * a) / 255 + y
62
 
*/
63
 
#define FbByteMulAdd(x, a, y) do {                                      \
64
 
        /* multiply and divide: trunc((i + 128)*257/65536) */           \
65
 
        uint64_t t = ((x & RB_MASK) * a) + RB_ONE_HALF;                  \
66
 
        t = (t + ((t >> COMPONENT_SIZE) & RB_MASK)) >> COMPONENT_SIZE;  \
67
 
        t &= RB_MASK;                                                   \
68
 
                                                                        \
69
 
        /* add */                                                       \
70
 
        t += y & RB_MASK;                                               \
71
 
                                                                        \
72
 
        /* saturate */                                                  \
73
 
        t |= RB_MASK_PLUS_ONE - ((t >> COMPONENT_SIZE) & RB_MASK);      \
74
 
        t &= RB_MASK;                                                   \
75
 
                                                                        \
76
 
        /* multiply and divide */                                       \
77
 
        x = (((x >> COMPONENT_SIZE) & RB_MASK) * a) + RB_ONE_HALF;      \
78
 
        x = (x + ((x >> COMPONENT_SIZE) & RB_MASK)) >> COMPONENT_SIZE;  \
79
 
        x &= RB_MASK;                                                   \
80
 
                                                                        \
81
 
        /* add */                                                       \
82
 
        x += (y >> COMPONENT_SIZE) & RB_MASK;                           \
83
 
                                                                        \
84
 
        /* saturate */                                                  \
85
 
        x |= RB_MASK_PLUS_ONE - ((x >> COMPONENT_SIZE) & RB_MASK);      \
86
 
        x &= RB_MASK;                                                   \
87
 
                                                                        \
88
 
        /* recombine */                                                 \
89
 
        x <<= COMPONENT_SIZE;                                           \
90
 
        x += t;                                                         \
91
 
    } while (0)
92
 
 
93
 
/*
94
 
  x_c = (x_c * a + y_c * b) / 255
95
 
*/
96
 
#define FbByteAddMul(x, a, y, b) do {                                   \
97
 
        uint64_t t;                                                      \
98
 
        uint64_t r = (x >> A_SHIFT) * a + (y >> A_SHIFT) * b + ONE_HALF; \
99
 
        r += (r >> G_SHIFT);                                            \
100
 
        r >>= G_SHIFT;                                                  \
101
 
                                                                        \
102
 
        t = (x & G_MASK) * a + (y & G_MASK) * b;                        \
103
 
        t += (t >> G_SHIFT) + (ONE_HALF << G_SHIFT);                    \
104
 
        t >>= R_SHIFT;                                                  \
105
 
                                                                        \
106
 
        t |= r << R_SHIFT;                                              \
107
 
        t |= RB_MASK_PLUS_ONE - ((t >> G_SHIFT) & RB_MASK);             \
108
 
        t &= RB_MASK;                                                   \
109
 
        t <<= G_SHIFT;                                                  \
110
 
                                                                        \
111
 
        r = ((x >> R_SHIFT) & MASK) * a +                               \
112
 
            ((y >> R_SHIFT) & MASK) * b + ONE_HALF;                     \
113
 
        r += (r >> G_SHIFT);                                            \
114
 
        r >>= G_SHIFT;                                                  \
115
 
                                                                        \
116
 
        x = (x & MASK) * a + (y & MASK) * b + ONE_HALF;                 \
117
 
        x += (x >> G_SHIFT);                                            \
118
 
        x >>= G_SHIFT;                                                  \
119
 
        x |= r << R_SHIFT;                                              \
120
 
        x |= RB_MASK_PLUS_ONE - ((x >> G_SHIFT) & RB_MASK);             \
121
 
        x &= RB_MASK;                                                   \
122
 
        x |= t;                                                         \
123
 
    } while (0)
124
 
 
125
 
/*
126
 
  x_c = (x_c * a_c) / 255
127
 
*/
128
 
#define FbByteMulC(x, a) do {                                           \
129
 
        uint64_t t;                                                      \
130
 
        uint64_t r = (x & MASK) * (a & MASK);                            \
131
 
        r |= (x & R_MASK) * ((a >> R_SHIFT) & MASK);                    \
132
 
        r += RB_ONE_HALF;                                               \
133
 
        r = (r + ((r >> G_SHIFT) & RB_MASK)) >> G_SHIFT;                \
134
 
        r &= RB_MASK;                                                   \
135
 
                                                                        \
136
 
        x >>= G_SHIFT;                                                  \
137
 
        t = (x & MASK) * ((a >> G_SHIFT) & MASK);                       \
138
 
        t |= (x & R_MASK) * (a >> A_SHIFT);                             \
139
 
        t += RB_ONE_HALF;                                               \
140
 
        t = t + ((t >> G_SHIFT) & RB_MASK);                             \
141
 
        x = r | (t & AG_MASK);                                          \
142
 
    } while (0)
143
 
 
144
 
/*
145
 
  x_c = (x_c * a) / 255 + y
146
 
*/
147
 
#define FbByteMulAddC(x, a, y) do {                                     \
148
 
        uint64_t t;                                                      \
149
 
        uint64_t r = (x & MASK) * (a & MASK);                            \
150
 
        r |= (x & R_MASK) * ((a >> R_SHIFT) & MASK);                    \
151
 
        r += RB_ONE_HALF;                                               \
152
 
        r = (r + ((r >> G_SHIFT) & RB_MASK)) >> G_SHIFT;                \
153
 
        r &= RB_MASK;                                                   \
154
 
        r += y & RB_MASK;                                               \
155
 
        r |= RB_MASK_PLUS_ONE - ((r >> G_SHIFT) & RB_MASK);             \
156
 
        r &= RB_MASK;                                                   \
157
 
                                                                        \
158
 
        x >>= G_SHIFT;                                                  \
159
 
        t = (x & MASK) * ((a >> G_SHIFT) & MASK);                       \
160
 
        t |= (x & R_MASK) * (a >> A_SHIFT);                             \
161
 
        t += RB_ONE_HALF;                                               \
162
 
        t = (t + ((t >> G_SHIFT) & RB_MASK)) >> G_SHIFT;                \
163
 
        t &= RB_MASK;                                                   \
164
 
        t += (y >> G_SHIFT) & RB_MASK;                                  \
165
 
        t |= RB_MASK_PLUS_ONE - ((t >> G_SHIFT) & RB_MASK);             \
166
 
        t &= RB_MASK;                                                   \
167
 
        x = r | (t << G_SHIFT);                                         \
168
 
    } while (0)
169
 
 
170
 
/*
171
 
  x_c = (x_c * a_c + y_c * b) / 255
172
 
*/
173
 
#define FbByteAddMulC(x, a, y, b) do {                                  \
174
 
        uint64_t t;                                                      \
175
 
        uint64_t r = (x >> A_SHIFT) * (a >> A_SHIFT) +                   \
176
 
                     (y >> A_SHIFT) * b;                                \
177
 
        r += (r >> G_SHIFT) + ONE_HALF;                                 \
178
 
        r >>= G_SHIFT;                                                  \
179
 
                                                                        \
180
 
        t = (x & G_MASK) * ((a >> G_SHIFT) & MASK) + (y & G_MASK) * b;  \
181
 
        t += (t >> G_SHIFT) + (ONE_HALF << G_SHIFT);                    \
182
 
        t >>= R_SHIFT;                                                  \
183
 
                                                                        \
184
 
        t |= r << R_SHIFT;                                              \
185
 
        t |= RB_MASK_PLUS_ONE - ((t >> G_SHIFT) & RB_MASK);             \
186
 
        t &= RB_MASK;                                                   \
187
 
        t <<= G_SHIFT;                                                  \
188
 
                                                                        \
189
 
        r = ((x >> R_SHIFT) & MASK) * ((a >> R_SHIFT) & MASK) +         \
190
 
            ((y >> R_SHIFT) & MASK) * b + ONE_HALF;                     \
191
 
        r += (r >> G_SHIFT);                                            \
192
 
        r >>= G_SHIFT;                                                  \
193
 
                                                                        \
194
 
        x = (x & MASK) * (a & MASK) + (y & MASK) * b + ONE_HALF;        \
195
 
        x += (x >> G_SHIFT);                                            \
196
 
        x >>= G_SHIFT;                                                  \
197
 
        x |= r << R_SHIFT;                                              \
198
 
        x |= RB_MASK_PLUS_ONE - ((x >> G_SHIFT) & RB_MASK);             \
199
 
        x &= RB_MASK;                                                   \
200
 
        x |= t;                                                         \
201
 
    } while (0)
202
 
 
203
 
/*
204
 
  x_c = min(x_c + y_c, 255)
205
 
*/
206
 
#define FbByteAdd(x, y) do {                                            \
207
 
        uint64_t t;                                                      \
208
 
        uint64_t r = (x & RB_MASK) + (y & RB_MASK);                      \
209
 
        r |= RB_MASK_PLUS_ONE - ((r >> G_SHIFT) & RB_MASK);             \
210
 
        r &= RB_MASK;                                                   \
211
 
                                                                        \
212
 
        t = ((x >> G_SHIFT) & RB_MASK) + ((y >> G_SHIFT) & RB_MASK);    \
213
 
        t |= RB_MASK_PLUS_ONE - ((t >> G_SHIFT) & RB_MASK);             \
214
 
        r |= (t & RB_MASK) << G_SHIFT;                                  \
215
 
        x = r;                                                          \
216
 
    } while (0)
217
 
 
 
31
#define MUL_UN16(a, b, t)                                               \
 
32
    ((t) = (a) * (b) + ONE_HALF, ((((t) >> G_SHIFT ) + (t) ) >> G_SHIFT ))
 
33
 
 
34
#define DIV_UN16(a, b)                                                  \
 
35
    (((uint32_t) (a) * MASK) / (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)