1 #ifndef EVAS_BLEND_OPS_H
2 #define EVAS_BLEND_OPS_H
4 #if defined BUILD_MMX || defined BUILD_SSE
12 /* pixels (argb default) */
14 /* pixels are rgb (ie. alphas == 255) */
16 /* pixels alpha are sparse */
18 /* src pixels flags count */
27 /* mask alphas are 'trivial - ie. only 0 or 255 */
29 /* mask alphas are sparse */
31 /* src mask flags count */
34 /* src color flags: */
36 /* color is 0xffffffff */
38 /* color (argb default) */
40 /* color is rgb (ie. 0xffrrggbb) */
42 /* color is 'alpha' (ie. 0xaaaaaaaa) */
44 /* src color flags count */
47 /* dst pixels flags: */
49 /* pixels (argb default) */
51 /* pixels are rgb (ie. alphas == 255) */
53 /* dst pixels flags count */
72 /* some useful constants */
74 extern const DATA32 ALPHA_255;
75 extern const DATA32 ALPHA_256;
77 /* some useful C macros */
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) )
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) )
90 #define MUL_256(a, c) \
91 ( (((((c) >> 8) & 0x00ff00ff) * (a)) & 0xff00ff00) + \
92 (((((c) & 0x00ff00ff) * (a)) >> 8) & 0x00ff00ff) )
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) )
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) )
105 #define MUL_SYM(a, x) \
106 ( (((((x) >> 8) & 0x00ff00ff) * (a) + 0xff00ff) & 0xff00ff00) + \
107 (((((x) & 0x00ff00ff) * (a) + 0xff00ff) >> 8) & 0x00ff00ff) )
109 #define MUL_A_256(a, c) \
110 ( ((((c) >> 8) & 0x00ff0000) * (a)) & 0xff000000 )
112 #define MUL_A_SYM(a, c) \
113 ( (((((c) >> 8) & 0x00ff0000) * (a)) + 0x00ff0000) & 0xff000000 )
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) )
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) )
127 #define INTERP_A_256(a, c0, c1) \
128 ( (((((((c0) >> 8) & 0xff0000) - (((c1) >> 8) & 0xff0000)) * (a)) \
129 + ((c1) & 0xff000000)) & 0xff000000) )
132 /* some useful MMX macros */
135 #define MOV_A2R(a, mma) \
137 punpcklwd_r2r(mma, mma); \
138 punpckldq_r2r(mma, mma);
140 #define MOV_P2R(c, mmc, mmz) \
142 punpcklbw_r2r(mmz, mmc);
144 #define MOV_R2P(mmc, c, mmz) \
145 packuswb_r2r(mmz, mmc); \
148 #define MUL4_256_R2R(mmx, mmy) \
149 pmullw_r2r(mmx, mmy); \
152 #define MUL4_SYM_R2R(mmx, mmy, mm255) \
153 pmullw_r2r(mmx, mmy); \
154 paddw_r2r(mm255, mmy); \
157 #define MOV_RA2R(mmx, mma) \
158 movq_r2r(mmx, mma); \
159 punpckhwd_r2r(mma, mma); \
160 punpckhdq_r2r(mma, mma);
162 #define MOV_PA2R(c, mma) \
164 punpcklbw_r2r(mma, mma); \
165 punpckhwd_r2r(mma, mma); \
166 punpckhdq_r2r(mma, mma);
168 #define INTERP_256_R2R(mma, mmx, mmy, mm255) \
169 psubw_r2r(mmy, mmx); \
170 pmullw_r2r(mma, mmx); \
172 paddw_r2r(mmx, mmy); \
173 pand_r2r(mm255, mmy);