move around - flatter.
[profile/ivi/evas.git] / src / lib / engines / common / evas_op_blend / op_blend_pixel_mask_i386.c
1
2 /* blend pixel x mask --> dst */
3
4 #ifdef BUILD_MMX
5 static void
6 _op_blend_pas_mas_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
7    DATA32 *e = d + l;
8    pxor_r2r(mm0, mm0);
9    MOV_A2R(ALPHA_256, mm6)
10    while (d < e) {
11         l = (*s >> 24);
12         switch(*m & l)
13           {
14             case 0:
15                 break;
16             case 255:
17                 *d = *s;
18                 break;
19             default:
20                 l = 1 + *m;
21                 MOV_A2R(l, mm3)
22                 MOV_P2R(*s, mm2, mm0)
23                 MUL4_256_R2R(mm3, mm2)
24
25                 MOV_RA2R(mm2, mm1)
26                 movq_r2r(mm6, mm3);
27                 psubw_r2r(mm1, mm3);
28
29                 MOV_P2R(*d, mm1, mm0)
30                 MUL4_256_R2R(mm3, mm1)
31
32                 paddw_r2r(mm2, mm1);
33                 MOV_R2P(mm1, *d, mm0)
34                 break;
35           }
36         m++;  s++;  d++;
37      }
38 }
39
40 static void
41 _op_blend_pan_mas_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) {
42    DATA32 *e = d + l;
43    MOV_A2R(ALPHA_255, mm5)
44    pxor_r2r(mm0, mm0);
45    while (d < e) {
46         l = *m;
47         switch(l)
48           {
49             case 0:
50                 break;
51             case 255:
52                 *d = *s;
53                 break;
54             default:
55                 l++;
56                 MOV_A2R(l, mm3)
57                 MOV_P2R(*s, mm2, mm0)
58                 MOV_P2R(*d, mm1, mm0)
59                 INTERP_256_R2R(mm3, mm2, mm1, mm5)
60                 MOV_R2P(mm1, *d, mm0)
61                 break;
62           }
63         m++;  s++;  d++;
64      }
65 }
66
67 #define _op_blend_p_mas_dp_mmx _op_blend_pas_mas_dp_mmx
68
69 #define _op_blend_p_mas_dpan_mmx _op_blend_p_mas_dp_mmx
70 #define _op_blend_pan_mas_dpan_mmx _op_blend_pan_mas_dp_mmx
71 #define _op_blend_pas_mas_dpan_mmx _op_blend_pas_mas_dp_mmx
72
73 static void
74 init_blend_pixel_mask_span_funcs_mmx(void)
75 {
76    op_blend_span_funcs[SP][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_p_mas_dp_mmx;
77    op_blend_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_pas_mas_dp_mmx;
78    op_blend_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_pan_mas_dp_mmx;
79
80    op_blend_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_p_mas_dpan_mmx;
81    op_blend_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_pas_mas_dpan_mmx;
82    op_blend_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_pan_mas_dpan_mmx;
83 }
84 #endif
85
86 #ifdef BUILD_MMX
87 static void
88 _op_blend_pt_p_mas_dp_mmx(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) {
89         c = m + 1;
90         MOV_A2R(c, mm3)
91         pxor_r2r(mm0, mm0);
92         MOV_A2R(ALPHA_256, mm6)
93         MOV_P2R(s, mm2, mm0)
94         MUL4_256_R2R(mm3, mm2)
95
96         MOV_RA2R(mm2, mm1)
97         psubw_r2r(mm1, mm6);
98
99         MOV_P2R(*d, mm1, mm0)
100         MUL4_256_R2R(mm6, mm1)
101
102         paddw_r2r(mm2, mm1);
103         MOV_R2P(mm1, *d, mm0)
104 }
105
106 #define _op_blend_pt_pan_mas_dp_mmx _op_blend_pt_p_mas_dp_mmx
107 #define _op_blend_pt_pas_mas_dp_mmx _op_blend_pt_p_mas_dp_mmx
108
109 #define _op_blend_pt_p_mas_dpan_mmx _op_blend_pt_p_mas_dp_mmx
110 #define _op_blend_pt_pas_mas_dpan_mmx _op_blend_pt_pas_mas_dp_mmx
111 #define _op_blend_pt_pan_mas_dpan_mmx _op_blend_pt_pan_mas_dp_mmx
112
113 static void
114 init_blend_pixel_mask_pt_funcs_mmx(void)
115 {
116    op_blend_pt_funcs[SP][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_pt_p_mas_dp_mmx;
117    op_blend_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_pt_pas_mas_dp_mmx;
118    op_blend_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_MMX] = _op_blend_pt_pan_mas_dp_mmx;
119
120    op_blend_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_pt_p_mas_dpan_mmx;
121    op_blend_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_pt_pas_mas_dpan_mmx;
122    op_blend_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_pt_pan_mas_dpan_mmx;
123 }
124 #endif
125
126 /*-----*/
127
128 /* blend_rel pixel x mask -> dst */
129
130 #ifdef BUILD_MMX
131
132 #define _op_blend_rel_p_mas_dpan_mmx _op_blend_p_mas_dpan_mmx
133 #define _op_blend_rel_pas_mas_dpan_mmx _op_blend_pas_mas_dpan_mmx
134 #define _op_blend_rel_pan_mas_dpan_mmx _op_blend_pan_mas_dpan_mmx
135
136 static void
137 init_blend_rel_pixel_mask_span_funcs_mmx(void)
138 {
139    op_blend_rel_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_p_mas_dpan_mmx;
140    op_blend_rel_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pas_mas_dpan_mmx;
141    op_blend_rel_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pan_mas_dpan_mmx;
142 }
143 #endif
144
145 #ifdef BUILD_MMX
146
147 #define _op_blend_rel_pt_p_mas_dpan_mmx _op_blend_pt_p_mas_dpan_mmx
148 #define _op_blend_rel_pt_pas_mas_dpan_mmx _op_blend_pt_pas_mas_dpan_mmx
149 #define _op_blend_rel_pt_pan_mas_dpan_mmx _op_blend_pt_pan_mas_dpan_mmx
150
151 static void
152 init_blend_rel_pixel_mask_pt_funcs_mmx(void)
153 {
154    op_blend_rel_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pt_p_mas_dpan_mmx;
155    op_blend_rel_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pt_pas_mas_dpan_mmx;
156    op_blend_rel_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_MMX] = _op_blend_rel_pt_pan_mas_dpan_mmx;
157 }
158 #endif