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