move around - flatter.
[profile/ivi/evas.git] / src / lib / engines / common / evas_blend_main.c
1 /*
2  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
3  */
4
5 #include "evas_common.h"
6 #include "evas_blend_private.h"
7
8 #if defined BUILD_MMX || defined BUILD_SSE
9 #include "evas_mmx.h"
10 #endif
11
12 const DATA32 ALPHA_255 = 255;
13 const DATA32 ALPHA_256 = 256;
14
15 static void
16 _composite_span_nothing(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l)
17 {
18 }
19
20 static void
21 _composite_pt_nothing(DATA32 s, DATA8 m, DATA32 c, DATA32 *d)
22 {
23 }
24
25 static RGBA_Gfx_Compositor  *
26 evas_gfx_compositor_get(unsigned char op)
27 {
28    RGBA_Gfx_Compositor  *comp;
29
30    switch (op)
31       {
32         case _EVAS_RENDER_BLEND:
33            comp = evas_common_gfx_compositor_blend_get();
34            break;
35         case _EVAS_RENDER_BLEND_REL:
36            comp = evas_common_gfx_compositor_blend_rel_get();
37            break;
38         case _EVAS_RENDER_COPY:
39            comp = evas_common_gfx_compositor_copy_get();
40            break;
41         case _EVAS_RENDER_COPY_REL:
42            comp = evas_common_gfx_compositor_copy_rel_get();
43            break;
44 /*
45         case _EVAS_RENDER_ADD:
46            comp = evas_common_gfx_compositor_add_get();
47            break;
48         case _EVAS_RENDER_ADD_REL:
49            comp = evas_common_gfx_compositor_add_rel_get();
50            break;
51         case _EVAS_RENDER_SUB:
52            comp = evas_common_gfx_compositor_sub_get();
53            break;
54         case _EVAS_RENDER_SUB_REL:
55            comp = evas_common_gfx_compositor_sub_rel_get();
56            break;
57 */
58         case _EVAS_RENDER_MASK:
59            comp = evas_common_gfx_compositor_mask_get();
60            break;
61         case _EVAS_RENDER_MUL:
62            comp = evas_common_gfx_compositor_mul_get();
63            break;
64         default:
65            comp = evas_common_gfx_compositor_blend_get();
66            break;
67       }
68    return comp;
69 }
70
71 EAPI void
72 evas_common_blend_init(void)
73 {
74    static int gfx_initialised = 0;
75    static int mmx = 0;
76    static int sse = 0;
77    static int sse2 = 0;
78    RGBA_Gfx_Compositor  *comp;
79
80    if (gfx_initialised) return;
81    gfx_initialised = 1;
82
83    evas_common_cpu_can_do(&mmx, &sse, &sse2);
84
85    comp = evas_common_gfx_compositor_copy_get();
86    if (comp) comp->init();
87    comp = evas_common_gfx_compositor_copy_rel_get();
88    if (comp) comp->init();
89
90    comp = evas_common_gfx_compositor_blend_get();
91    if (comp) comp->init();
92    comp = evas_common_gfx_compositor_blend_rel_get();
93    if (comp) comp->init();
94
95 /*
96    comp = evas_common_gfx_compositor_add_get();
97    if (comp) comp->init();
98    comp = evas_common_gfx_compositor_add_rel_get();
99    if (comp) comp->init();
100    comp = evas_common_gfx_compositor_sub_get();
101    if (comp) comp->init();
102    comp = evas_common_gfx_compositor_sub_rel_get();
103    if (comp) comp->init();
104 */
105    comp = evas_common_gfx_compositor_mask_get();
106    if (comp) comp->init();
107
108    comp = evas_common_gfx_compositor_mul_get();
109    if (comp) comp->init();
110 }
111
112 void
113 evas_common_blend_shutdown(void)
114 {
115    RGBA_Gfx_Compositor  *comp;
116
117    comp = evas_common_gfx_compositor_copy_get();
118    if (comp) comp->shutdown();
119    comp = evas_common_gfx_compositor_copy_rel_get();
120    if (comp) comp->shutdown();
121
122    comp = evas_common_gfx_compositor_blend_get();
123    if (comp) comp->shutdown();
124    comp = evas_common_gfx_compositor_blend_rel_get();
125    if (comp) comp->shutdown();
126
127 /*
128    comp = evas_common_gfx_compositor_add_get();
129    if (comp) comp->shutdown();
130    comp = evas_common_gfx_compositor_add_rel_get();
131    if (comp) comp->shutdown();
132    comp = evas_common_gfx_compositor_sub_get();
133    if (comp) comp->shutdown();
134    comp = evas_common_gfx_compositor_sub_rel_get();
135    if (comp) comp->shutdown();
136 */
137    comp = evas_common_gfx_compositor_mask_get();
138    if (comp) comp->shutdown();
139
140    comp = evas_common_gfx_compositor_mul_get();
141    if (comp) comp->shutdown();
142 }
143
144
145 RGBA_Gfx_Func
146 evas_common_gfx_func_composite_pixel_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels, int op)
147 {
148    RGBA_Gfx_Compositor  *comp;
149    RGBA_Gfx_Func        func = NULL;
150
151    if (src && (!src->cache_entry.flags.alpha))
152      {
153         if (op == _EVAS_RENDER_BLEND)
154            op = _EVAS_RENDER_COPY;
155         if (op == _EVAS_RENDER_BLEND_REL)
156            op = _EVAS_RENDER_COPY_REL;
157      }
158    comp = evas_gfx_compositor_get(op);
159    if (comp)
160         func = comp->composite_pixel_span_get(src, dst, pixels);
161    if (func)
162         return func;
163    return _composite_span_nothing;
164 }
165
166 RGBA_Gfx_Func
167 evas_common_gfx_func_composite_color_span_get(DATA32 col, RGBA_Image *dst, int pixels, int op)
168 {
169    RGBA_Gfx_Compositor  *comp;
170    RGBA_Gfx_Func        func = NULL;
171
172    if ((col & 0xff000000) == 0xff000000)
173      {
174         if (op == _EVAS_RENDER_BLEND)
175            op = _EVAS_RENDER_COPY;
176         if (op == EVAS_RENDER_BLEND_REL)
177            op = _EVAS_RENDER_COPY_REL;
178      }
179
180    comp = evas_gfx_compositor_get(op);
181    if (comp)
182         func = comp->composite_color_span_get(col, dst, pixels);
183    if (func)
184         return func;
185    return _composite_span_nothing;
186 }
187
188 RGBA_Gfx_Func
189 evas_common_gfx_func_composite_pixel_color_span_get(RGBA_Image *src, DATA32 col, RGBA_Image *dst, int pixels, int op)
190 {
191    RGBA_Gfx_Compositor  *comp;
192    RGBA_Gfx_Func        func = NULL;
193
194    if ((src && (!src->cache_entry.flags.alpha)) && ((col & 0xff000000) == 0xff000000))
195      {
196         if (op == _EVAS_RENDER_BLEND)
197            op = _EVAS_RENDER_COPY;
198         if (op == _EVAS_RENDER_BLEND_REL)
199            op = _EVAS_RENDER_COPY_REL;
200      }
201
202    comp = evas_gfx_compositor_get(op);
203    if (comp)
204         func = comp->composite_pixel_color_span_get(src, col, dst, pixels);
205    if (func)
206         return func;
207    return _composite_span_nothing;
208 }
209
210 RGBA_Gfx_Func
211 evas_common_gfx_func_composite_mask_color_span_get(DATA32 col, RGBA_Image *dst, int pixels, int op)
212 {
213    RGBA_Gfx_Compositor  *comp;
214    RGBA_Gfx_Func        func = NULL;
215
216    comp = evas_gfx_compositor_get(op);
217    if (comp)
218         func = comp->composite_mask_color_span_get(col, dst, pixels);
219    if (func)
220         return func;
221    return _composite_span_nothing;
222 }
223
224 RGBA_Gfx_Func
225 evas_common_gfx_func_composite_pixel_mask_span_get(RGBA_Image *src, RGBA_Image *dst, int pixels, int op)
226 {
227    RGBA_Gfx_Compositor  *comp;
228    RGBA_Gfx_Func        func = NULL;
229
230    comp = evas_gfx_compositor_get(op);
231    if (comp)
232         func = comp->composite_pixel_mask_span_get(src, dst, pixels);
233    if (func)
234         return func;
235    return _composite_span_nothing;
236 }
237
238 RGBA_Gfx_Pt_Func
239 evas_common_gfx_func_composite_pixel_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst, int op)
240 {
241    RGBA_Gfx_Compositor  *comp;
242    RGBA_Gfx_Pt_Func     func = NULL;
243
244    if (!src_flags.alpha)
245      {
246         if (op == _EVAS_RENDER_BLEND)
247            op = _EVAS_RENDER_COPY;
248         if (op == _EVAS_RENDER_BLEND_REL)
249            op = _EVAS_RENDER_COPY_REL;
250      }
251    comp = evas_gfx_compositor_get(op);
252    if (comp)
253         func = comp->composite_pixel_pt_get(src_flags, dst);
254    if (func)
255         return func;
256    return _composite_pt_nothing;
257 }
258
259 RGBA_Gfx_Pt_Func
260 evas_common_gfx_func_composite_color_pt_get(DATA32 col, RGBA_Image *dst, int op)
261 {
262    RGBA_Gfx_Compositor  *comp;
263    RGBA_Gfx_Pt_Func     func = NULL;
264
265    if ((col & 0xff000000) == 0xff000000)
266      {
267         if (op == _EVAS_RENDER_BLEND)
268            op = _EVAS_RENDER_COPY;
269         if (op == EVAS_RENDER_BLEND_REL)
270            op = _EVAS_RENDER_COPY_REL;
271      }
272
273    comp = evas_gfx_compositor_get(op);
274    if (comp)
275         func = comp->composite_color_pt_get(col, dst);
276    if (func)
277         return func;
278    return _composite_pt_nothing;
279 }
280
281 RGBA_Gfx_Pt_Func
282 evas_common_gfx_func_composite_pixel_color_pt_get(Image_Entry_Flags src_flags, DATA32 col, RGBA_Image *dst, int op)
283 {
284    RGBA_Gfx_Compositor  *comp;
285    RGBA_Gfx_Pt_Func     func = NULL;
286
287    if ((!src_flags.alpha) && ((col & 0xff000000) == 0xff000000))
288      {
289         if (op == _EVAS_RENDER_BLEND)
290            op = _EVAS_RENDER_COPY;
291         if (op == _EVAS_RENDER_BLEND_REL)
292            op = _EVAS_RENDER_COPY_REL;
293      }
294
295    comp = evas_gfx_compositor_get(op);
296    if (comp)
297         func = comp->composite_pixel_color_pt_get(src_flags, col, dst);
298    if (func)
299         return func;
300    return _composite_pt_nothing;
301 }
302
303 RGBA_Gfx_Pt_Func
304 evas_common_gfx_func_composite_mask_color_pt_get(DATA32 col, RGBA_Image *dst, int op)
305 {
306    RGBA_Gfx_Compositor  *comp;
307    RGBA_Gfx_Pt_Func     func = NULL;
308
309    comp = evas_gfx_compositor_get(op);
310    if (comp)
311         func = comp->composite_mask_color_pt_get(col, dst);
312    if (func)
313         return func;
314    return _composite_pt_nothing;
315 }
316
317 RGBA_Gfx_Pt_Func
318 evas_common_gfx_func_composite_pixel_mask_pt_get(Image_Entry_Flags src_flags, RGBA_Image *dst, int op)
319 {
320    RGBA_Gfx_Compositor  *comp;
321    RGBA_Gfx_Pt_Func     func = NULL;
322
323    comp = evas_gfx_compositor_get(op);
324    if (comp)
325         func = comp->composite_pixel_mask_pt_get(src_flags, dst);
326    if (func)
327         return func;
328    return _composite_pt_nothing;
329 }