22f13bda8d47be43151f5fd85e85890e3cf11b30
[profile/ivi/ecore.git] / src / lib / ecore_evas / ecore_evas_buffer.c
1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif
4
5 #include <Ecore.h>
6 #include "ecore_private.h"
7 #include <Ecore_Input.h>
8
9 #include "ecore_evas_private.h"
10 #include "Ecore_Evas.h"
11
12 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
13 static int _ecore_evas_init_count = 0;
14
15 static int
16 _ecore_evas_buffer_init(void)
17 {
18    _ecore_evas_init_count++;
19    return _ecore_evas_init_count;
20 }
21
22 static void
23 _ecore_evas_buffer_free(Ecore_Evas *ee)
24 {
25    if (ee->engine.buffer.image)
26      {
27         Ecore_Evas *ee2;
28
29         ee2 = evas_object_data_get(ee->engine.buffer.image, "Ecore_Evas_Parent");
30         evas_object_del(ee->engine.buffer.image);
31         ee2->sub_ecore_evas = eina_list_remove(ee2->sub_ecore_evas, ee);
32      }
33    else
34      {
35         ee->engine.buffer.free_func(ee->engine.buffer.data, 
36                                     ee->engine.buffer.pixels);
37      }
38    _ecore_evas_buffer_shutdown();
39 }
40
41 static void
42 _ecore_evas_resize(Ecore_Evas *ee, int w, int h)
43 {
44    Evas_Engine_Info_Buffer *einfo;
45    int stride = 0;
46
47    if (w < 1) w = 1;
48    if (h < 1) h = 1;
49    if ((w == ee->w) && (h == ee->h)) return;
50    ee->w = w;
51    ee->h = h;
52    evas_output_size_set(ee->evas, ee->w, ee->h);
53    evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
54    evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
55
56    if (ee->engine.buffer.image)
57      {
58         ee->engine.buffer.pixels = evas_object_image_data_get(ee->engine.buffer.image, 1);
59         stride = evas_object_image_stride_get(ee->engine.buffer.image);
60      }
61    else
62      {
63         if (ee->engine.buffer.pixels)
64           ee->engine.buffer.free_func(ee->engine.buffer.data,
65                                       ee->engine.buffer.pixels);
66         ee->engine.buffer.pixels = 
67           ee->engine.buffer.alloc_func(ee->engine.buffer.data,
68                                        ee->w * ee->h * sizeof(int));
69         stride = ee->w * sizeof(int);
70      }
71
72    einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
73    if (einfo)
74      {
75         einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
76         einfo->info.dest_buffer = ee->engine.buffer.pixels;
77         einfo->info.dest_buffer_row_bytes = stride;
78         einfo->info.use_color_key = 0;
79         einfo->info.alpha_threshold = 0;
80         einfo->info.func.new_update_region = NULL;
81         einfo->info.func.free_update_region = NULL;
82         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
83           {
84              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
85           }
86      }
87    if (ee->func.fn_resize) ee->func.fn_resize(ee);
88 }
89
90 int
91 _ecore_evas_buffer_shutdown(void)
92 {
93    _ecore_evas_init_count--;
94    if (_ecore_evas_init_count == 0)
95      {
96      }
97    if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
98    return _ecore_evas_init_count;
99 }
100
101 int
102 _ecore_evas_buffer_render(Ecore_Evas *ee)
103 {
104    Eina_List *updates, *l, *ll;
105    Ecore_Evas *ee2;
106    int rend = 0;
107
108    EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
109      {
110         if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
111         rend |= _ecore_evas_buffer_render(ee2);
112         if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
113      }
114    if (ee->engine.buffer.image)
115      {
116         int w, h;
117
118         evas_object_image_size_get(ee->engine.buffer.image, &w, &h);
119         if ((w != ee->w) || (h != ee->h))
120           _ecore_evas_resize(ee, w, h);
121      }
122    updates = evas_render_updates(ee->evas);
123    if (ee->engine.buffer.image)
124      {
125         Eina_Rectangle *r;
126
127         EINA_LIST_FOREACH(updates, l, r)
128           evas_object_image_data_update_add(ee->engine.buffer.image,
129                                             r->x, r->y, r->w, r->h);
130      }
131    if (updates)
132      {
133         evas_render_updates_free(updates);
134         _ecore_evas_idle_timeout_update(ee);
135      }
136
137    return updates ? 1 : rend;
138 }
139
140 static void
141 _ecore_evas_buffer_coord_translate(Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y)
142 {
143    Evas_Coord xx, yy, fx, fy, fw, fh;
144
145    evas_object_geometry_get(ee->engine.buffer.image, &xx, &yy, NULL, NULL);
146    evas_object_image_fill_get(ee->engine.buffer.image, &fx, &fy, &fw, &fh);
147
148    if (fw < 1) fw = 1;
149    xx = (*x - xx) - fx;
150    while (xx < 0) xx += fw;
151    while (xx > fw) xx -= fw;
152    *x = (ee->w * xx) / fw;
153
154    if (fh < 1) fh = 1;
155    yy = (*y - yy) - fy;
156    while (yy < 0) yy += fh;
157    while (yy > fh) yy -= fh;
158    *y = (ee->h * yy) / fh;
159 }
160
161 static void
162 _ecore_evas_buffer_cb_mouse_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
163 {
164    Ecore_Evas *ee;
165    Evas_Event_Mouse_In *ev;
166
167    ee = data;
168    ev = event_info;
169    evas_event_feed_mouse_in(ee->evas, ev->timestamp, NULL);
170 }
171
172 static void
173 _ecore_evas_buffer_cb_mouse_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
174 {
175    Ecore_Evas *ee;
176    Evas_Event_Mouse_Out *ev;
177
178    ee = data;
179    ev = event_info;
180    evas_event_feed_mouse_out(ee->evas, ev->timestamp, NULL);
181 }
182
183 static void
184 _ecore_evas_buffer_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
185 {
186    Ecore_Evas *ee;
187    Evas_Event_Mouse_Down *ev;
188
189    ee = data;
190    ev = event_info;
191    evas_event_feed_mouse_down(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
192 }
193
194 static void
195 _ecore_evas_buffer_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
196 {
197    Ecore_Evas *ee;
198    Evas_Event_Mouse_Up *ev;
199
200    ee = data;
201    ev = event_info;
202    evas_event_feed_mouse_up(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
203 }
204
205 static void
206 _ecore_evas_buffer_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
207 {
208    Ecore_Evas *ee;
209    Evas_Event_Mouse_Move *ev;
210    Evas_Coord x, y;
211
212    ee = data;
213    ev = event_info;
214    x = ev->cur.canvas.x;
215    y = ev->cur.canvas.y;
216    _ecore_evas_buffer_coord_translate(ee, &x, &y);
217    _ecore_evas_mouse_move_process(ee, x, y, ev->timestamp);
218 }
219
220 static void
221 _ecore_evas_buffer_cb_mouse_wheel(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
222 {
223    Ecore_Evas *ee;
224    Evas_Event_Mouse_Wheel *ev;
225
226    ee = data;
227    ev = event_info;
228    evas_event_feed_mouse_wheel(ee->evas, ev->direction, ev->z, ev->timestamp, NULL);
229 }
230
231 static void
232 _ecore_evas_buffer_cb_multi_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
233 {
234    Ecore_Evas *ee;
235    Evas_Event_Multi_Down *ev;
236    Evas_Coord x, y, xx, yy;
237    double xf, yf;
238
239    ee = data;
240    ev = event_info;
241    x = ev->canvas.x;
242    y = ev->canvas.y;
243    xx = x;
244    yy = y;
245    _ecore_evas_buffer_coord_translate(ee, &x, &y);
246    xf = (ev->canvas.xsub - (double)xx) + (double)x;
247    yf = (ev->canvas.ysub - (double)yy) + (double)y;
248    evas_event_feed_multi_down(ee->evas, ev->device, x, y, ev->radius, ev->radius_x, ev->radius_y, ev->pressure, ev->angle, xf, yf, ev->flags, ev->timestamp, NULL);
249 }
250
251 static void
252 _ecore_evas_buffer_cb_multi_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
253 {
254    Ecore_Evas *ee;
255    Evas_Event_Multi_Up *ev;
256    Evas_Coord x, y, xx, yy;
257    double xf, yf;
258
259    ee = data;
260    ev = event_info;
261    x = ev->canvas.x;
262    y = ev->canvas.y;
263    xx = x;
264    yy = y;
265    _ecore_evas_buffer_coord_translate(ee, &x, &y);
266    xf = (ev->canvas.xsub - (double)xx) + (double)x;
267    yf = (ev->canvas.ysub - (double)yy) + (double)y;
268    evas_event_feed_multi_up(ee->evas, ev->device, x, y, ev->radius, ev->radius_x, ev->radius_y, ev->pressure, ev->angle, xf, yf, ev->flags, ev->timestamp, NULL);
269 }
270
271 static void
272 _ecore_evas_buffer_cb_multi_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
273 {
274    Ecore_Evas *ee;
275    Evas_Event_Multi_Move *ev;
276    Evas_Coord x, y, xx, yy;
277    double xf, yf;
278
279    ee = data;
280    ev = event_info;
281    x = ev->cur.canvas.x;
282    y = ev->cur.canvas.y;
283    xx = x;
284    yy = y;
285    _ecore_evas_buffer_coord_translate(ee, &x, &y);
286    xf = (ev->cur.canvas.xsub - (double)xx) + (double)x;
287    yf = (ev->cur.canvas.ysub - (double)yy) + (double)y;
288    evas_event_feed_multi_move(ee->evas, ev->device, x, y, ev->radius, ev->radius_x, ev->radius_y, ev->pressure, ev->angle, xf, yf, ev->timestamp, NULL);
289 }
290
291 static void
292 _ecore_evas_buffer_cb_free(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
293 {
294    Ecore_Evas *ee;
295
296    ee = data;
297    if (ee->driver) _ecore_evas_free(ee);
298 }
299
300 static void
301 _ecore_evas_buffer_cb_key_down(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
302 {
303    Ecore_Evas *ee;
304    Evas_Event_Key_Down *ev;
305
306    ee = data;
307    ev = event_info;
308    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
309      evas_key_modifier_on(e, "Shift");
310    else
311      evas_key_modifier_off(e, "Shift");
312    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
313      evas_key_modifier_on(e, "Control");
314    else
315      evas_key_modifier_off(e, "Control");
316    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
317      evas_key_modifier_on(e, "Alt");
318    else
319      evas_key_modifier_off(e, "Alt");
320    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
321      evas_key_modifier_on(e, "Meta");
322    else
323      evas_key_modifier_off(e, "Meta");
324    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
325      evas_key_modifier_on(e, "Hyper");
326    else
327      evas_key_modifier_off(e, "Hyper");
328    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
329      evas_key_modifier_on(e, "Super");
330    else
331      evas_key_modifier_off(e, "Super");
332    if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
333      evas_key_lock_on(e, "Scroll_Lock");
334    else
335      evas_key_lock_off(e, "Scroll_Lock");
336    if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
337      evas_key_lock_on(e, "Num_Lock");
338    else
339      evas_key_lock_off(e, "Num_Lock");
340    if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
341      evas_key_lock_on(e, "Caps_Lock");
342    else
343      evas_key_lock_off(e, "Caps_Lock");
344    evas_event_feed_key_down(ee->evas, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, NULL);
345 }
346
347 static void
348 _ecore_evas_buffer_cb_key_up(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
349 {
350    Ecore_Evas *ee;
351    Evas_Event_Key_Up *ev;
352
353    ee = data;
354    ev = event_info;
355    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
356      evas_key_modifier_on(e, "Shift");
357    else
358      evas_key_modifier_off(e, "Shift");
359    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
360      evas_key_modifier_on(e, "Control");
361    else
362      evas_key_modifier_off(e, "Control");
363    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
364      evas_key_modifier_on(e, "Alt");
365    else
366      evas_key_modifier_off(e, "Alt");
367    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
368      evas_key_modifier_on(e, "Meta");
369    else
370      evas_key_modifier_off(e, "Meta");
371    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
372      evas_key_modifier_on(e, "Hyper");
373    else
374      evas_key_modifier_off(e, "Hyper");
375    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
376      evas_key_modifier_on(e, "Super");
377    else
378      evas_key_modifier_off(e, "Super");
379    if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
380      evas_key_lock_on(e, "Scroll_Lock");
381    else
382      evas_key_lock_off(e, "Scroll_Lock");
383    if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
384      evas_key_lock_on(e, "Num_Lock");
385    else
386      evas_key_lock_off(e, "Num_Lock");
387    if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
388      evas_key_lock_on(e, "Caps_Lock");
389    else
390      evas_key_lock_off(e, "Caps_Lock");
391    evas_event_feed_key_up(ee->evas, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, NULL);
392 }
393
394 static void
395 _ecore_evas_buffer_cb_focus_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
396 {
397    Ecore_Evas *ee;
398
399    ee = data;
400    ee->prop.focused = 1;
401    evas_focus_in(ee->evas);
402    if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
403 }
404
405 static void
406 _ecore_evas_buffer_cb_focus_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
407 {
408    Ecore_Evas *ee;
409
410    ee = data;
411    ee->prop.focused = 0;
412    evas_focus_out(ee->evas);
413    if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
414 }
415
416 static void
417 _ecore_evas_buffer_cb_show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
418 {
419    Ecore_Evas *ee;
420
421    ee = data;
422    ee->visible = 1;
423    if (ee->func.fn_show) ee->func.fn_show(ee);
424 }
425
426 static void
427 _ecore_evas_buffer_cb_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
428 {
429    Ecore_Evas *ee;
430
431    ee = data;
432    ee->visible = 0;
433    if (ee->func.fn_hide) ee->func.fn_hide(ee);
434 }
435
436 static Ecore_Evas_Engine_Func _ecore_buffer_engine_func =
437 {
438    _ecore_evas_buffer_free,
439      NULL,
440      NULL,
441      NULL,
442      NULL,
443      NULL,
444      NULL,
445      NULL,
446      NULL,
447      NULL,
448      NULL,
449      NULL,
450      NULL,
451      NULL,
452      NULL,
453      NULL,
454      NULL,
455      _ecore_evas_resize,
456      NULL,
457      NULL,
458      NULL,
459      NULL,
460      NULL,
461      NULL,
462      NULL,
463      NULL,
464      NULL,
465      NULL,
466      NULL,
467      NULL,
468      NULL,
469      NULL,
470      NULL,
471      NULL,
472      NULL,
473      NULL,
474      NULL,
475      NULL,
476      NULL,
477      NULL,
478      NULL,
479      NULL,
480      NULL,
481      NULL,
482      NULL,
483      NULL, //transparent
484      
485      NULL // render
486 };
487 #endif
488
489 static void *
490 _ecore_evas_buffer_pix_alloc(void *data __UNUSED__, int size)
491 {
492    return malloc(size);
493 }
494
495 static void
496 _ecore_evas_buffer_pix_free(void *data __UNUSED__, void *pix)
497 {
498    free(pix);
499 }
500
501 /**
502  * To be documented.
503  *
504  * FIXME: To be fixed.
505  */
506 EAPI Ecore_Evas *
507 ecore_evas_buffer_new(int w, int h)
508 {
509     return ecore_evas_buffer_allocfunc_new
510      (w, h, _ecore_evas_buffer_pix_alloc, _ecore_evas_buffer_pix_free, NULL);
511 }
512
513 EAPI Ecore_Evas *
514 ecore_evas_buffer_allocfunc_new(int w, int h, void *(*alloc_func) (void *data, int size), void (*free_func) (void *data, void *pix), const void *data)
515 {
516 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
517    Evas_Engine_Info_Buffer *einfo;
518    Ecore_Evas *ee;
519    int rmethod;
520
521    if ((!alloc_func) || (!free_func)) return NULL;
522    rmethod = evas_render_method_lookup("buffer");
523    if (!rmethod) return NULL;
524    ee = calloc(1, sizeof(Ecore_Evas));
525    if (!ee) return NULL;
526
527    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
528
529    _ecore_evas_buffer_init();
530
531    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_buffer_engine_func;
532    ee->engine.buffer.alloc_func = alloc_func;
533    ee->engine.buffer.free_func = free_func;
534    ee->engine.buffer.data = (void *)data;
535
536    ee->driver = "buffer";
537
538    if (w < 1) w = 1;
539    if (h < 1) h = 1;
540    ee->rotation = 0;
541    ee->visible = 1;
542    ee->w = w;
543    ee->h = h;
544
545    ee->prop.max.w = 0;
546    ee->prop.max.h = 0;
547    ee->prop.layer = 0;
548    ee->prop.focused = 1;
549    ee->prop.borderless = 1;
550    ee->prop.override = 1;
551    ee->prop.maximized = 1;
552    ee->prop.fullscreen = 0;
553    ee->prop.withdrawn = 0;
554    ee->prop.sticky = 0;
555
556    /* init evas here */
557    ee->evas = evas_new();
558    evas_data_attach_set(ee->evas, ee);
559    evas_output_method_set(ee->evas, rmethod);
560    evas_output_size_set(ee->evas, w, h);
561    evas_output_viewport_set(ee->evas, 0, 0, w, h);
562
563    ee->engine.buffer.pixels = 
564      ee->engine.buffer.alloc_func
565      (ee->engine.buffer.data, w * h * sizeof(int));
566
567    einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
568    if (einfo)
569      {
570         einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
571         einfo->info.dest_buffer = ee->engine.buffer.pixels;
572         einfo->info.dest_buffer_row_bytes = ee->w * sizeof(int);
573         einfo->info.use_color_key = 0;
574         einfo->info.alpha_threshold = 0;
575         einfo->info.func.new_update_region = NULL;
576         einfo->info.func.free_update_region = NULL;
577         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
578           {
579              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
580           }
581      }
582    evas_key_modifier_add(ee->evas, "Shift");
583    evas_key_modifier_add(ee->evas, "Control");
584    evas_key_modifier_add(ee->evas, "Alt");
585    evas_key_modifier_add(ee->evas, "Meta");
586    evas_key_modifier_add(ee->evas, "Hyper");
587    evas_key_modifier_add(ee->evas, "Super");
588    evas_key_lock_add(ee->evas, "Caps_Lock");
589    evas_key_lock_add(ee->evas, "Num_Lock");
590    evas_key_lock_add(ee->evas, "Scroll_Lock");
591
592    evas_event_feed_mouse_in(ee->evas, 0, NULL);
593
594    ee->engine.func->fn_render = _ecore_evas_buffer_render;
595    _ecore_evas_register(ee);
596    
597    return ee;
598 #else
599    return NULL;
600 #endif
601 }
602
603 EAPI const void *
604 ecore_evas_buffer_pixels_get(Ecore_Evas *ee)
605 {
606 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
607    _ecore_evas_buffer_render(ee);
608    return ee->engine.buffer.pixels;
609 #else
610    return NULL;
611 #endif
612 }
613
614 EAPI Evas *
615 ecore_evas_object_evas_get(Evas_Object *obj)
616 {
617    Ecore_Evas *ee;
618
619    ee = evas_object_data_get(obj, "Ecore_Evas");
620    if (!ee) return NULL;
621
622    return ecore_evas_get(ee);
623 }
624
625 EAPI Ecore_Evas *
626 ecore_evas_object_ecore_evas_get(Evas_Object *obj)
627 {
628    return evas_object_data_get(obj, "Ecore_Evas");
629 }
630
631 EAPI Evas_Object *
632 ecore_evas_object_image_new(Ecore_Evas *ee_target)
633 {
634 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
635    Evas_Object *o;
636    Evas_Engine_Info_Buffer *einfo;
637    Ecore_Evas *ee;
638    int rmethod;
639    int w, h;
640
641    rmethod = evas_render_method_lookup("buffer");
642    if (!rmethod) return NULL;
643    ee = calloc(1, sizeof(Ecore_Evas));
644    if (!ee) return NULL;
645
646    o = evas_object_image_add(ee_target->evas);
647    evas_object_image_content_hint_set(o, EVAS_IMAGE_CONTENT_HINT_DYNAMIC);
648    evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
649   
650    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
651
652    _ecore_evas_buffer_init();
653
654    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_buffer_engine_func;
655
656    ee->driver = "buffer";
657
658    w = 1;
659    h = 1;
660    ee->rotation = 0;
661    ee->visible = 0;
662    ee->w = w;
663    ee->h = h;
664
665    ee->prop.max.w = 0;
666    ee->prop.max.h = 0;
667    ee->prop.layer = 0;
668    ee->prop.focused = 0;
669    ee->prop.borderless = 1;
670    ee->prop.override = 1;
671    ee->prop.maximized = 0;
672    ee->prop.fullscreen = 0;
673    ee->prop.withdrawn = 0;
674    ee->prop.sticky = 0;
675
676    /* init evas here */
677    ee->evas = evas_new();
678    evas_data_attach_set(ee->evas, ee);
679    evas_output_method_set(ee->evas, rmethod);
680    evas_output_size_set(ee->evas, w, h);
681    evas_output_viewport_set(ee->evas, 0, 0, w, h);
682
683    ee->engine.buffer.image = o;
684    evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas", ee);
685    evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas_Parent", ee_target);
686    evas_object_image_size_set(o, ee->w, ee->h);
687    evas_object_image_alpha_set(o, 1);
688    ee->engine.buffer.pixels = evas_object_image_data_get(o, 1);
689    evas_object_image_data_set(o, ee->engine.buffer.pixels);
690    evas_object_event_callback_add(ee->engine.buffer.image,
691                                   EVAS_CALLBACK_MOUSE_IN,
692                                   _ecore_evas_buffer_cb_mouse_in, ee);
693    evas_object_event_callback_add(ee->engine.buffer.image,
694                                   EVAS_CALLBACK_MOUSE_OUT,
695                                   _ecore_evas_buffer_cb_mouse_out, ee);
696    evas_object_event_callback_add(ee->engine.buffer.image,
697                                   EVAS_CALLBACK_MOUSE_DOWN,
698                                   _ecore_evas_buffer_cb_mouse_down, ee);
699    evas_object_event_callback_add(ee->engine.buffer.image,
700                                   EVAS_CALLBACK_MOUSE_UP,
701                                   _ecore_evas_buffer_cb_mouse_up, ee);
702    evas_object_event_callback_add(ee->engine.buffer.image,
703                                   EVAS_CALLBACK_MOUSE_MOVE,
704                                   _ecore_evas_buffer_cb_mouse_move, ee);
705    evas_object_event_callback_add(ee->engine.buffer.image,
706                                   EVAS_CALLBACK_MOUSE_WHEEL,
707                                   _ecore_evas_buffer_cb_mouse_wheel, ee);
708    evas_object_event_callback_add(ee->engine.buffer.image,
709                                   EVAS_CALLBACK_MULTI_DOWN,
710                                   _ecore_evas_buffer_cb_multi_down, ee);
711    evas_object_event_callback_add(ee->engine.buffer.image,
712                                   EVAS_CALLBACK_MULTI_UP,
713                                   _ecore_evas_buffer_cb_multi_up, ee);
714    evas_object_event_callback_add(ee->engine.buffer.image,
715                                   EVAS_CALLBACK_MULTI_MOVE,
716                                   _ecore_evas_buffer_cb_multi_move, ee);
717    evas_object_event_callback_add(ee->engine.buffer.image,
718                                   EVAS_CALLBACK_FREE,
719                                   _ecore_evas_buffer_cb_free, ee);
720    evas_object_event_callback_add(ee->engine.buffer.image,
721                                   EVAS_CALLBACK_KEY_DOWN,
722                                   _ecore_evas_buffer_cb_key_down, ee);
723    evas_object_event_callback_add(ee->engine.buffer.image,
724                                   EVAS_CALLBACK_KEY_UP,
725                                   _ecore_evas_buffer_cb_key_up, ee);
726    evas_object_event_callback_add(ee->engine.buffer.image,
727                                   EVAS_CALLBACK_FOCUS_IN,
728                                   _ecore_evas_buffer_cb_focus_in, ee);
729    evas_object_event_callback_add(ee->engine.buffer.image,
730                                   EVAS_CALLBACK_FOCUS_OUT,
731                                   _ecore_evas_buffer_cb_focus_out, ee);
732    evas_object_event_callback_add(ee->engine.buffer.image,
733                                   EVAS_CALLBACK_SHOW,
734                                   _ecore_evas_buffer_cb_show, ee);
735    evas_object_event_callback_add(ee->engine.buffer.image,
736                                   EVAS_CALLBACK_HIDE,
737                                   _ecore_evas_buffer_cb_hide, ee);
738    einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
739    if (einfo)
740      {
741         einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
742         einfo->info.dest_buffer = ee->engine.buffer.pixels;
743         einfo->info.dest_buffer_row_bytes = evas_object_image_stride_get(o);
744         einfo->info.use_color_key = 0;
745         einfo->info.alpha_threshold = 0;
746         einfo->info.func.new_update_region = NULL;
747         einfo->info.func.free_update_region = NULL;
748         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
749           {
750              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
751           }
752      }
753    evas_key_modifier_add(ee->evas, "Shift");
754    evas_key_modifier_add(ee->evas, "Control");
755    evas_key_modifier_add(ee->evas, "Alt");
756    evas_key_modifier_add(ee->evas, "Meta");
757    evas_key_modifier_add(ee->evas, "Hyper");
758    evas_key_modifier_add(ee->evas, "Super");
759    evas_key_lock_add(ee->evas, "Caps_Lock");
760    evas_key_lock_add(ee->evas, "Num_Lock");
761    evas_key_lock_add(ee->evas, "Scroll_Lock");
762
763    ee_target->sub_ecore_evas = eina_list_append(ee_target->sub_ecore_evas, ee);
764    
765    ee->engine.func->fn_render = _ecore_evas_buffer_render;
766    
767    return o;
768 #else
769    return NULL;
770 #endif
771 }