enlightenment/src/bin/e_canvas.c

219 lines
5.3 KiB
C

/*
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#include "e.h"
/* local subsystem functions */
static int _e_canvas_cb_flush(void *data);
/* local subsystem globals */
static Evas_List *_e_canvases = NULL;
static Ecore_Timer *_e_canvas_cache_flush_timer = NULL;
/* externally accessible functions */
EAPI void
e_canvas_add(Ecore_Evas *ee)
{
Evas *e;
_e_canvases = evas_list_prepend(_e_canvases, ee);
e = ecore_evas_get(ee);
evas_image_cache_set(e, e_config->image_cache * 1024);
evas_font_cache_set(e, e_config->font_cache * 1024);
e_path_evas_append(path_fonts, e);
if (e_config->font_hinting == 0)
{
if (evas_font_hinting_can_hint(e, EVAS_FONT_HINTING_BYTECODE))
evas_font_hinting_set(e, EVAS_FONT_HINTING_BYTECODE);
else if (evas_font_hinting_can_hint(e, EVAS_FONT_HINTING_AUTO))
evas_font_hinting_set(e, EVAS_FONT_HINTING_AUTO);
else
evas_font_hinting_set(e, EVAS_FONT_HINTING_NONE);
}
else if (e_config->font_hinting == 1)
{
if (evas_font_hinting_can_hint(e, EVAS_FONT_HINTING_AUTO))
evas_font_hinting_set(e, EVAS_FONT_HINTING_AUTO);
else
evas_font_hinting_set(e, EVAS_FONT_HINTING_NONE);
}
else if (e_config->font_hinting == 2)
evas_font_hinting_set(e, EVAS_FONT_HINTING_NONE);
// evas_image_cache_flush(e);
// evas_image_cache_reload(e);
}
EAPI void
e_canvas_del(Ecore_Evas *ee)
{
_e_canvases = evas_list_remove(_e_canvases, ee);
}
EAPI int
e_canvas_engine_decide(int engine)
{
/* if use default - use it */
if (engine == E_EVAS_ENGINE_DEFAULT)
engine = e_config->evas_engine_default;
/* if engine is gl - do we support it? */
if (engine == E_EVAS_ENGINE_GL_X11)
{
/* if we dont - fall back to software x11 */
if (!ecore_evas_engine_type_supported_get(ECORE_EVAS_ENGINE_GL_X11))
engine = E_EVAS_ENGINE_SOFTWARE_X11;
}
if (engine == E_EVAS_ENGINE_XRENDER_X11)
{
/* if we dont - fall back to software x11 */
if (!ecore_evas_engine_type_supported_get(ECORE_EVAS_ENGINE_XRENDER_X11))
engine = E_EVAS_ENGINE_SOFTWARE_X11;
}
return engine;
}
EAPI void
e_canvas_recache(void)
{
Evas_List *l;
for (l = _e_canvases; l; l = l->next)
{
Ecore_Evas *ee;
Evas *e;
ee = l->data;
e = ecore_evas_get(ee);
evas_image_cache_set(e, e_config->image_cache * 1024);
evas_font_cache_set(e, e_config->font_cache * 1024);
}
edje_file_cache_set(e_config->edje_cache);
edje_collection_cache_set(e_config->edje_cache);
if (_e_canvas_cache_flush_timer)
{
ecore_timer_del(_e_canvas_cache_flush_timer);
_e_canvas_cache_flush_timer = NULL;
}
if (e_config->cache_flush_interval > 0.0)
{
_e_canvas_cache_flush_timer =
ecore_timer_add(e_config->cache_flush_interval, _e_canvas_cb_flush,
NULL);
}
}
EAPI void
e_canvas_cache_flush(void)
{
Evas_List *l;
for (l = _e_canvases; l; l = l->next)
{
Ecore_Evas *ee;
Evas *e;
ee = l->data;
e = ecore_evas_get(ee);
evas_image_cache_flush(e);
evas_font_cache_flush(e);
}
edje_file_cache_flush();
edje_collection_cache_flush();
}
EAPI void
e_canvas_cache_reload(void)
{
Evas_List *l;
for (l = _e_canvases; l; l = l->next)
{
Ecore_Evas *ee;
Evas *e;
ee = l->data;
e = ecore_evas_get(ee);
evas_image_cache_reload(e);
}
}
EAPI void
e_canvas_rehint(void)
{
Evas_List *l;
for (l = _e_canvases; l; l = l->next)
{
Ecore_Evas *ee;
Evas *e;
ee = l->data;
e = ecore_evas_get(ee);
if (e_config->font_hinting == 0)
evas_font_hinting_set(e, EVAS_FONT_HINTING_BYTECODE);
else if (e_config->font_hinting == 1)
evas_font_hinting_set(e, EVAS_FONT_HINTING_AUTO);
else if (e_config->font_hinting == 2)
evas_font_hinting_set(e, EVAS_FONT_HINTING_NONE);
}
}
EAPI Ecore_Evas *
e_canvas_new(int engine_hint, Ecore_X_Window win, int x, int y, int w, int h,
int direct_resize, int override, Ecore_X_Window *win_ret,
Ecore_X_Window *subwin_ret)
{
Ecore_Evas *ee;
int engine;
engine = e_canvas_engine_decide(engine_hint);
if (engine == E_EVAS_ENGINE_GL_X11)
{
ee = ecore_evas_gl_x11_new(NULL, win, x, y, w, h);
if (ee)
{
ecore_evas_override_set(ee, override);
if (direct_resize) ecore_evas_gl_x11_direct_resize_set(ee, 1);
if (win_ret) *win_ret = ecore_evas_gl_x11_window_get(ee);
if (subwin_ret) *subwin_ret = ecore_evas_gl_x11_subwindow_get(ee);
}
else
goto try2;
}
else if (engine == E_EVAS_ENGINE_XRENDER_X11)
{
ee = ecore_evas_xrender_x11_new(NULL, win, x, y, w, h);
if (ee)
{
ecore_evas_override_set(ee, override);
if (direct_resize) ecore_evas_xrender_x11_direct_resize_set(ee, 1);
if (win_ret) *win_ret = ecore_evas_xrender_x11_window_get(ee);
if (subwin_ret) *subwin_ret = ecore_evas_xrender_x11_subwindow_get(ee);
}
else
goto try2;
}
else
{
try2:
ee = ecore_evas_software_x11_new(NULL, win, x, y, w, h);
if (ee)
{
ecore_evas_override_set(ee, override);
if (direct_resize) ecore_evas_software_x11_direct_resize_set(ee, 1);
if (win_ret) *win_ret = ecore_evas_software_x11_window_get(ee);
if (subwin_ret) *subwin_ret = ecore_evas_software_x11_subwindow_get(ee);
}
}
return ee;
}
/* local subsystem functions */
static int
_e_canvas_cb_flush(void *data)
{
e_canvas_cache_flush();
return 1;
}