1 #include "evas_common.h"
2 #include "evas_private.h"
6 EAPI Eina_Bool lockdebug = EINA_FALSE;
10 static int _evas_init_count = 0;
11 int _evas_log_dom_global = -1;
15 if (++_evas_init_count != 1)
16 return _evas_init_count;
19 if (getenv("EVAS_LOCK_DEBUG"))
21 lockdebug = EINA_TRUE;
22 lockmax = atoi(getenv("EVAS_LOCK_DEBUG"));
28 return --_evas_init_count;
34 _evas_log_dom_global = eina_log_domain_register
35 ("evas_main", EVAS_DEFAULT_LOG_COLOR);
36 if (_evas_log_dom_global < 0)
38 EINA_LOG_ERR("Can not create a module log domain.");
43 #ifdef BUILD_ASYNC_EVENTS
44 if (!evas_async_events_init())
48 if (getenv("EVAS_CSERVE")) evas_cserve_init();
50 #ifdef BUILD_ASYNC_PRELOAD
51 _evas_preload_thread_init();
53 #ifdef EVAS_FRAME_QUEUING
54 evas_common_frameq_init();
57 return _evas_init_count;
59 #ifdef BUILD_ASYNC_EVENTS
61 evas_module_shutdown();
62 eina_log_domain_unregister(_evas_log_dom_global);
71 return --_evas_init_count;
77 if (--_evas_init_count != 0)
78 return _evas_init_count;
80 #ifdef EVAS_FRAME_QUEUING
81 if (evas_common_frameq_enabled())
83 evas_common_frameq_finish();
84 evas_common_frameq_destroy();
87 #ifdef BUILD_ASYNC_EVENTS
88 _evas_preload_thread_shutdown();
91 if (getenv("EVAS_CSERVE")) evas_cserve_shutdown();
93 #ifdef BUILD_ASYNC_EVENTS
94 evas_async_events_shutdown();
96 evas_font_dir_cache_free();
97 evas_common_shutdown();
98 evas_module_shutdown();
99 eina_log_domain_unregister(_evas_log_dom_global);
105 return _evas_init_count;
114 e = calloc(1, sizeof(Evas));
117 e->magic = MAGIC_EVAS;
118 e->output.render_method = RENDER_METHOD_INVALID;
121 e->hinting = EVAS_FONT_HINTING_BYTECODE;
122 e->name_hash = eina_hash_string_superfast_new(NULL);
124 #define EVAS_ARRAY_SET(E, Array) \
125 eina_array_step_set(&E->Array, sizeof (E->Array), 256);
127 EVAS_ARRAY_SET(e, delete_objects);
128 EVAS_ARRAY_SET(e, active_objects);
129 EVAS_ARRAY_SET(e, restack_objects);
130 EVAS_ARRAY_SET(e, render_objects);
131 EVAS_ARRAY_SET(e, pending_objects);
132 EVAS_ARRAY_SET(e, obscuring_objects);
133 EVAS_ARRAY_SET(e, temporary_objects);
134 EVAS_ARRAY_SET(e, calculate_objects);
135 EVAS_ARRAY_SET(e, clip_changes);
137 #undef EVAS_ARRAY_SET
150 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
154 #ifdef EVAS_FRAME_QUEUING
155 evas_common_frameq_flush();
158 if (e->walking_list == 0) evas_render_idle_flush(e);
160 if (e->walking_list > 0) return;
164 if (e->callbacks->deletions_waiting) return;
166 e->callbacks->deletions_waiting = 0;
167 evas_event_callback_list_post_free(&e->callbacks->callbacks);
168 if (!e->callbacks->callbacks)
174 _evas_post_event_callback_free(e);
183 EINA_INLIST_FOREACH(e->layers, lay)
187 evas_layer_pre_free(lay);
189 EINA_INLIST_FOREACH(lay->objects, o)
191 if ((o->callbacks) && (o->callbacks->walking_list))
203 EINA_INLIST_FOREACH(e->layers, lay)
204 evas_layer_free_objects(lay);
209 evas_font_path_clear(e);
210 e->pointer.object.in = eina_list_free(e->pointer.object.in);
212 if (e->name_hash) eina_hash_free(e->name_hash);
215 EINA_LIST_FREE(e->damages, r)
216 eina_rectangle_free(r);
217 EINA_LIST_FREE(e->obscures, r)
218 eina_rectangle_free(r);
220 evas_fonts_zero_free(e);
222 evas_event_callback_all_del(e);
223 evas_event_callback_cleanup(e);
227 e->engine.func->context_free(e->engine.data.output, e->engine.data.context);
228 e->engine.func->output_free(e->engine.data.output);
229 e->engine.func->info_free(e, e->engine.info);
232 for (i = 0; i < e->modifiers.mod.count; i++)
233 free(e->modifiers.mod.list[i]);
234 if (e->modifiers.mod.list) free(e->modifiers.mod.list);
236 for (i = 0; i < e->locks.lock.count; i++)
237 free(e->locks.lock.list[i]);
238 if (e->locks.lock.list) free(e->locks.lock.list);
240 if (e->engine.module) evas_module_unref(e->engine.module);
242 eina_array_flush(&e->delete_objects);
243 eina_array_flush(&e->active_objects);
244 eina_array_flush(&e->restack_objects);
245 eina_array_flush(&e->render_objects);
246 eina_array_flush(&e->pending_objects);
247 eina_array_flush(&e->obscuring_objects);
248 eina_array_flush(&e->temporary_objects);
249 eina_array_flush(&e->calculate_objects);
250 eina_array_flush(&e->clip_changes);
257 evas_output_method_set(Evas *e, int render_method)
261 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
265 /* if our engine to set it to is invalid - abort */
266 if (render_method == RENDER_METHOD_INVALID) return;
267 /* if the engine is already set up - abort */
268 if (e->output.render_method != RENDER_METHOD_INVALID) return;
269 /* Request the right engine. */
270 em = evas_module_engine_get(render_method);
272 if (em->id_engine != render_method) return;
273 if (!evas_module_load(em)) return;
275 /* set the correct render */
276 e->output.render_method = render_method;
277 e->engine.func = (em->functions);
279 if (e->engine.module) evas_module_unref(e->engine.module);
280 e->engine.module = em;
282 /* get the engine info struct */
283 if (e->engine.func->info) e->engine.info = e->engine.func->info(e);
288 evas_output_method_get(const Evas *e)
290 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
291 return RENDER_METHOD_INVALID;
294 return e->output.render_method;
297 EAPI Evas_Engine_Info *
298 evas_engine_info_get(const Evas *e)
300 Evas_Engine_Info *info;
302 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
306 if (!e->engine.info) return NULL;
308 info = e->engine.info;
309 ((Evas *)e)->engine.info_magic = info->magic;
315 evas_engine_info_set(Evas *e, Evas_Engine_Info *info)
317 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
320 if (!info) return EINA_FALSE;
321 if (info != e->engine.info) return EINA_FALSE;
322 if (info->magic != e->engine.info_magic) return EINA_FALSE;
323 return (Eina_Bool)e->engine.func->setup(e, info);
327 evas_output_size_set(Evas *e, int w, int h)
329 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
333 if ((w == e->output.w) && (h == e->output.h)) return;
337 #ifdef EVAS_FRAME_QUEUING
338 evas_common_frameq_flush();
343 e->output.changed = 1;
344 e->output_validity++;
346 evas_render_invalidate(e);
350 evas_output_size_get(const Evas *e, int *w, int *h)
352 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
358 if (w) *w = e->output.w;
359 if (h) *h = e->output.h;
363 evas_output_viewport_set(Evas *e, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
365 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
369 if ((x == e->viewport.x) && (y == e->viewport.y) &&
370 (w == e->viewport.w) && (h == e->viewport.h)) return;
373 if ((x != 0) || (y != 0))
375 ERR("Compat error. viewport x,y != 0,0 not supported");
383 e->viewport.changed = 1;
384 e->output_validity++;
389 evas_output_viewport_get(const Evas *e, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
391 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
399 if (x) *x = e->viewport.x;
400 if (y) *y = e->viewport.y;
401 if (w) *w = e->viewport.w;
402 if (h) *h = e->viewport.h;
406 evas_coord_screen_x_to_world(const Evas *e, int x)
408 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
411 if (e->output.w == e->viewport.w) return e->viewport.x + x;
412 return (long long)e->viewport.x + (((long long)x * (long long)e->viewport.w) / (long long)e->output.w);
416 evas_coord_screen_y_to_world(const Evas *e, int y)
418 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
421 if (e->output.h == e->viewport.h) return e->viewport.y + y;
422 return (long long)e->viewport.y + (((long long)y * (long long)e->viewport.h) / (long long)e->output.h);
426 evas_coord_world_x_to_screen(const Evas *e, Evas_Coord x)
428 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
431 if (e->output.w == e->viewport.w) return x - e->viewport.x;
432 return (int)((((long long)x - (long long)e->viewport.x) * (long long)e->output.w) / (long long)e->viewport.w);
436 evas_coord_world_y_to_screen(const Evas *e, Evas_Coord y)
438 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
441 if (e->output.h == e->viewport.h) return y - e->viewport.y;
442 return (int)((((long long)y - (long long)e->viewport.y) * (long long)e->output.h) / (long long)e->viewport.h);
446 evas_render_method_lookup(const char *name)
450 if (!name) return RENDER_METHOD_INVALID;
451 /* search on the engines list for the name */
452 em = evas_module_find_type(EVAS_MODULE_TYPE_ENGINE, name);
453 if (!em) return RENDER_METHOD_INVALID;
455 return em->id_engine;
459 evas_render_method_list(void)
461 Eina_List *methods = NULL;
463 /* FIXME: get from modules - this is currently coded-in */
464 #ifdef BUILD_ENGINE_SOFTWARE_GDI
465 methods = eina_list_append(methods, "software_gdi");
467 #ifdef BUILD_ENGINE_SOFTWARE_DDRAW
468 methods = eina_list_append(methods, "software_ddraw");
470 #ifdef BUILD_ENGINE_SOFTWARE_16_DDRAW
471 methods = eina_list_append(methods, "software_16_ddraw");
473 #ifdef BUILD_ENGINE_DIRECT3D
474 methods = eina_list_append(methods, "direct3d");
476 #ifdef BUILD_ENGINE_SOFTWARE_16_WINCE
477 methods = eina_list_append(methods, "software_16_wince");
479 #ifdef BUILD_ENGINE_SOFTWARE_X11
480 methods = eina_list_append(methods, "software_x11");
482 #ifdef BUILD_ENGINE_SOFTWARE_16_X11
483 methods = eina_list_append(methods, "software_16_x11");
485 #ifdef BUILD_ENGINE_GL_X11
486 methods = eina_list_append(methods, "gl_x11");
488 #ifdef BUILD_ENGINE_DIRECTFB
489 methods = eina_list_append(methods, "directfb");
491 #ifdef BUILD_ENGINE_FB
492 methods = eina_list_append(methods, "fb");
494 #ifdef BUILD_ENGINE_BUFFER
495 methods = eina_list_append(methods, "buffer");
497 #ifdef BUILD_ENGINE_SOFTWARE_WIN32_GDI
498 methods = eina_list_append(methods, "software_win32_gdi");
500 #ifdef BUILD_ENGINE_SOFTWARE_SDL
501 methods = eina_list_append(methods, "software_sdl");
508 evas_render_method_list_free(Eina_List *list)
510 eina_list_free(list);
514 evas_object_image_extension_can_load_get(const char *file)
519 tmp = eina_stringshare_add(file);
520 result = evas_common_extension_can_load_get(tmp);
521 eina_stringshare_del(tmp);
527 evas_object_image_extension_can_load_fast_get(const char *file)
529 return evas_common_extension_can_load_get(file);
533 evas_pointer_output_xy_get(const Evas *e, int *x, int *y)
535 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
540 if (x) *x = e->pointer.x;
541 if (y) *y = e->pointer.y;
545 evas_pointer_canvas_xy_get(const Evas *e, Evas_Coord *x, Evas_Coord *y)
547 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
552 if (x) *x = e->pointer.x;
553 if (y) *y = e->pointer.y;
557 evas_pointer_button_down_mask_get(const Evas *e)
559 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
562 return (int)e->pointer.button;
566 evas_pointer_inside_get(const Evas *e)
568 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
571 return (int)e->pointer.inside;
575 evas_data_attach_set(Evas *e, void *data)
577 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
580 e->attach_data = data;
584 evas_data_attach_get(const Evas *e)
586 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
589 return e->attach_data;
593 evas_focus_in(Evas *e)
595 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
598 if (e->focus) return;
600 evas_event_callback_call(e, EVAS_CALLBACK_CANVAS_FOCUS_IN, NULL);
604 evas_focus_out(Evas *e)
606 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
609 if (!e->focus) return;
611 evas_event_callback_call(e, EVAS_CALLBACK_CANVAS_FOCUS_OUT, NULL);
615 evas_focus_state_get(const Evas *e)
617 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
624 evas_nochange_push(Evas *e)
630 evas_nochange_pop(Evas *e)
642 _evas_unwalk(Evas *e)
645 if ((e->walking_list == 0) && (e->delete_me)) evas_free(e);
649 evas_load_error_str(Evas_Load_Error error)
653 case EVAS_LOAD_ERROR_NONE:
654 return "No error on load";
655 case EVAS_LOAD_ERROR_GENERIC:
656 return "A non-specific error occurred";
657 case EVAS_LOAD_ERROR_DOES_NOT_EXIST:
658 return "File (or file path) does not exist";
659 case EVAS_LOAD_ERROR_PERMISSION_DENIED:
660 return "Permission deinied to an existing file (or path)";
661 case EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED:
662 return "Allocation of resources failure prevented load";
663 case EVAS_LOAD_ERROR_CORRUPT_FILE:
664 return "File corrupt (but was detected as a known format)";
665 case EVAS_LOAD_ERROR_UNKNOWN_FORMAT:
666 return "File is not a known format";
668 return "Unknown error";
673 evas_color_hsv_to_rgb(float h, float s, float v, int *r, int *g, int *b)
675 evas_common_convert_color_hsv_to_rgb(h, s, v, r, g, b);
679 evas_color_rgb_to_hsv(int r, int g, int b, float *h, float *s, float *v)
681 evas_common_convert_color_rgb_to_hsv(r, g, b, h, s, v);
685 evas_color_argb_premul(int a, int *r, int *g, int *b)
687 evas_common_convert_color_argb_premul(a, r, g, b);
691 evas_color_argb_unpremul(int a, int *r, int *g, int *b)
693 evas_common_convert_color_argb_unpremul(a, r, g, b);
697 evas_data_argb_premul(unsigned int *data, unsigned int len)
699 if (!data || (len < 1)) return;
700 evas_common_convert_argb_premul(data, len);
704 evas_data_argb_unpremul(unsigned int *data, unsigned int len)
706 if (!data || (len < 1)) return;
707 evas_common_convert_argb_unpremul(data, len);