move around - flatter.
[profile/ivi/evas.git] / src / lib / include / evas_blend_ops.h
1 #ifndef EVAS_BLEND_OPS_H
2 #define EVAS_BLEND_OPS_H
3
4 #if defined BUILD_MMX || defined BUILD_SSE
5 #include "evas_mmx.h"
6 #endif
7
8 /* src pixel flags: */
9
10 /* pixels none */
11 #define SP_N 0
12 /* pixels (argb default) */
13 #define SP 1
14 /* pixels are rgb (ie. alphas == 255) */
15 #define SP_AN 2
16 /* pixels alpha are sparse */
17 #define SP_AS 3
18 /* src pixels flags count */
19 #define SP_LAST 4
20
21 /* src mask flags: */
22
23 /* mask none */
24 #define SM_N 0
25 /* mask (alpha) */
26 #define SM 1
27 /* mask alphas are 'trivial - ie. only 0 or 255 */
28 #define SM_AT 2
29 /* mask alphas are sparse */
30 #define SM_AS 3
31 /* src mask flags count */
32 #define SM_LAST 4
33
34 /* src color flags: */
35
36 /* color is 0xffffffff */
37 #define SC_N 0
38 /* color (argb default) */
39 #define SC 1
40 /* color is rgb (ie. 0xffrrggbb) */
41 #define SC_AN 2
42 /* color is 'alpha' (ie. 0xaaaaaaaa) */
43 #define SC_AA 3
44 /* src color flags count */
45 #define SC_LAST 4
46
47 /* dst pixels flags: */
48
49 /* pixels (argb default) */
50 #define DP  0
51 /* pixels are rgb (ie. alphas == 255) */
52 #define DP_AN  1
53 /* dst pixels flags count */
54 #define DP_LAST 2
55
56 /* cpu types flags */
57
58 /* none, bad news */
59 #define CPU_N  0
60 /* cpu C */
61 #define CPU_C  1
62 /* cpu MMX */
63 #define CPU_MMX 2
64 /* cpu SSE */
65 #define CPU_SSE 3
66 /* cpu SSE2 */
67 #define CPU_SSE2 4
68 /* cpu flags count */
69 #define CPU_LAST 5
70
71
72 /* some useful constants */
73
74 extern const DATA32 ALPHA_255;
75 extern const DATA32 ALPHA_256;
76
77 /* some useful C macros */
78
79 #define MUL4_256(a, r, g, b, c) \
80  ( (((((c) >> 8) & 0xff0000) * (a)) & 0xff000000) + \
81    (((((c) & 0xff0000) * (r)) >> 8) & 0xff0000) + \
82    (((((c) & 0xff00) * (g)) >> 8) & 0xff00) + \
83    ((((c) & 0xff) * (b)) >> 8) )
84
85 #define MUL3_256(r, g, b, c) \
86  ( (((((c) & 0xff0000) * (r)) >> 8) & 0xff0000) + \
87    (((((c) & 0xff00) * (g)) >> 8) & 0xff00) + \
88    ((((c) & 0xff) * (b)) >> 8) )
89
90 #define MUL_256(a, c) \
91  ( (((((c) >> 8) & 0x00ff00ff) * (a)) & 0xff00ff00) + \
92    (((((c) & 0x00ff00ff) * (a)) >> 8) & 0x00ff00ff) )
93
94 #define MUL4_SYM(x, y) \
95  ( ((((((x) >> 16) & 0xff00) * (((y) >> 16) & 0xff00)) + 0xff0000) & 0xff000000) + \
96    ((((((x) >> 8) & 0xff00) * (((y) >> 16) & 0xff)) + 0xff00) & 0xff0000) + \
97    ((((((x) & 0xff00) * ((y) & 0xff00)) + 0xff00) >> 16) & 0xff00) + \
98    (((((x) & 0xff) * ((y) & 0xff)) + 0xff) >> 8) )
99
100 #define MUL3_SYM(x, y) \
101  ( ((((((x) >> 8) & 0xff00) * (((y) >> 16) & 0xff)) + 0xff00) & 0xff0000) + \
102    ((((((x) & 0xff00) * ((y) & 0xff00)) + 0xff00) >> 16) & 0xff00) + \
103    (((((x) & 0xff) * ((y) & 0xff)) + 0xff) >> 8) )
104
105 #define MUL_SYM(a, x) \
106  ( (((((x) >> 8) & 0x00ff00ff) * (a) + 0xff00ff) & 0xff00ff00) + \
107    (((((x) & 0x00ff00ff) * (a) + 0xff00ff) >> 8) & 0x00ff00ff) )
108
109 #define MUL_A_256(a, c) \
110  ( ((((c) >> 8) & 0x00ff0000) * (a)) & 0xff000000 )
111
112 #define MUL_A_SYM(a, c) \
113  ( (((((c) >> 8) & 0x00ff0000) * (a)) + 0x00ff0000) & 0xff000000 )
114
115 #define INTERP_256(a, c0, c1) \
116  ( (((((((c0) >> 8) & 0xff00ff) - (((c1) >> 8) & 0xff00ff)) * (a)) \
117    + ((c1) & 0xff00ff00)) & 0xff00ff00) + \
118    (((((((c0) & 0xff00ff) - ((c1) & 0xff00ff)) * (a)) >> 8) \
119    + ((c1) & 0xff00ff)) & 0xff00ff) )
120
121 #define INTERP_RGB_256(a, c0, c1) \
122  ( (((((((c0) >> 8) & 0xff) - (((c1) >> 8) & 0xff)) * (a)) \
123    + ((c1) & 0xff00)) & 0xff00) + \
124    (((((((c0) & 0xff00ff) - ((c1) & 0xff00ff)) * (a)) >> 8) \
125    + ((c1) & 0xff00ff)) & 0xff00ff) )
126
127 #define INTERP_A_256(a, c0, c1) \
128  ( (((((((c0) >> 8) & 0xff0000) - (((c1) >> 8) & 0xff0000)) * (a)) \
129    + ((c1) & 0xff000000)) & 0xff000000) )
130
131
132 /* some useful MMX macros */
133
134 #ifdef BUILD_MMX
135 #define MOV_A2R(a, mma) \
136         movd_m2r(a, mma); \
137         punpcklwd_r2r(mma, mma); \
138         punpckldq_r2r(mma, mma);
139
140 #define MOV_P2R(c, mmc, mmz) \
141         movd_m2r(c, mmc); \
142         punpcklbw_r2r(mmz, mmc);
143
144 #define MOV_R2P(mmc, c, mmz) \
145         packuswb_r2r(mmz, mmc); \
146         movd_r2m(mmc, c);
147
148 #define MUL4_256_R2R(mmx, mmy) \
149         pmullw_r2r(mmx, mmy); \
150         psrlw_i2r(8, mmy);
151
152 #define MUL4_SYM_R2R(mmx, mmy, mm255) \
153         pmullw_r2r(mmx, mmy); \
154         paddw_r2r(mm255, mmy); \
155         psrlw_i2r(8, mmy);
156
157 #define MOV_RA2R(mmx, mma) \
158         movq_r2r(mmx, mma); \
159         punpckhwd_r2r(mma, mma); \
160         punpckhdq_r2r(mma, mma);
161
162 #define MOV_PA2R(c, mma) \
163         movd_m2r(c, mma); \
164         punpcklbw_r2r(mma, mma); \
165         punpckhwd_r2r(mma, mma); \
166         punpckhdq_r2r(mma, mma);
167
168 #define INTERP_256_R2R(mma, mmx, mmy, mm255) \
169         psubw_r2r(mmy, mmx); \
170         pmullw_r2r(mma, mmx); \
171         psrlw_i2r(8, mmx); \
172         paddw_r2r(mmx, mmy); \
173         pand_r2r(mm255, mmy);
174
175 #endif
176
177 #endif