image cache for eva sis preciselyu that.. cache. image and font data are

kept resident as long as the obejct has been rendered at leats once AND it
is still within the viewport of the output of the evas and it is still
visible. if it does not meet these conditiosn it gets put into "Cache" and
only then does cache become an issue. the chancges were nice and small to do
this :)


SVN revision: 4634
This commit is contained in:
Carsten Haitzler 2001-04-16 18:38:22 +00:00
parent a34b33695c
commit 411ec99a57
4 changed files with 60 additions and 7 deletions

View File

@ -22,14 +22,24 @@ _evas_free_image_renderer_data(Evas e, Evas_Object o)
switch (e->current.render_method)
{
case RENDER_METHOD_ALPHA_SOFTWARE:
if (o->renderer_data.method[e->current.render_method])
__evas_imlib_image_free((void *)o->renderer_data.method[e->current.render_method]);
break;
case RENDER_METHOD_BASIC_HARDWARE:
if (o->renderer_data.method[e->current.render_method])
__evas_x11_image_free((void *)o->renderer_data.method[e->current.render_method]);
break;
case RENDER_METHOD_3D_HARDWARE:
if (o->renderer_data.method[e->current.render_method])
__evas_gl_image_free((void *)o->renderer_data.method[e->current.render_method]);
break;
case RENDER_METHOD_ALPHA_HARDWARE:
if (o->renderer_data.method[e->current.render_method])
__evas_render_image_free((void *)o->renderer_data.method[e->current.render_method]);
break;
case RENDER_METHOD_IMAGE:
if (o->renderer_data.method[e->current.render_method])
__evas_image_image_free((void *)o->renderer_data.method[e->current.render_method]);
break;
default:
break;

View File

@ -376,6 +376,33 @@ evas_render_updates(Evas e)
if (o->delete_me)
delete_objects = evas_list_append(delete_objects, o);
if ((o->type == OBJECT_IMAGE) ||
(o->type == OBJECT_TEXT))
{
if ((!(RECTS_INTERSECT(o->current.x, o->current.y,
o->current.w, o->current.h,
e->current.viewport.x, e->current.viewport.y,
e->current.viewport.w, e->current.viewport.h)))
|| (!o->current.visible))
{
if (o->type == OBJECT_IMAGE)
{
if (o->renderer_data.method[e->current.render_method])
{
func_image_free((void *)o->renderer_data.method[e->current.render_method]);
o->renderer_data.method[e->current.render_method] = NULL;
}
}
else if (o->type == OBJECT_TEXT)
{
if (o->renderer_data.method[e->current.render_method])
{
func_text_font_free((void *)o->renderer_data.method[e->current.render_method]);
o->renderer_data.method[e->current.render_method] = NULL;
}
}
}
}
if (o->changed)
{
o->changed = 0;
@ -848,7 +875,10 @@ evas_render_updates(Evas e)
void *im;
oo = o;
im = func_image_new_from_file(e->current.display, oo->current.file);
if (o->renderer_data.method[e->current.render_method])
im = (void *)o->renderer_data.method[e->current.render_method];
else
o->renderer_data.method[e->current.render_method] = im = func_image_new_from_file(e->current.display, oo->current.file);
if (im)
{
int visx, visy, visw, vish;
@ -994,7 +1024,7 @@ evas_render_updates(Evas e)
}
free(pointsx);
free(pointsy);
func_image_free(im);
/* func_image_free(im);*/
}
}
break;
@ -1004,8 +1034,11 @@ evas_render_updates(Evas e)
void *fn;
oo = o;
fn = func_text_font_new(e->current.display, oo->current.font,
(oo->current.size * (double)e->current.drawable_width) / e->current.viewport.w);
if (o->renderer_data.method[e->current.render_method])
fn = (void *)o->renderer_data.method[e->current.render_method];
else
o->renderer_data.method[e->current.render_method] = fn = func_text_font_new(e->current.display, oo->current.font,
(oo->current.size * (double)e->current.drawable_width) / e->current.viewport.w);
if (fn)
{
func_text_draw(fn,
@ -1025,7 +1058,7 @@ evas_render_updates(Evas e)
oo->current.g,
oo->current.b,
oo->current.a);
func_text_font_free(fn);
/* func_text_font_free(fn);*/
}
}
break;

View File

@ -27,14 +27,24 @@ _evas_free_text_renderer_data(Evas e, Evas_Object o)
switch (e->current.render_method)
{
case RENDER_METHOD_ALPHA_SOFTWARE:
if (o->renderer_data.method[e->current.render_method])
__evas_imlib_text_font_free((void *)o->renderer_data.method[e->current.render_method]);
break;
case RENDER_METHOD_BASIC_HARDWARE:
if (o->renderer_data.method[e->current.render_method])
__evas_x11_text_font_free((void *)o->renderer_data.method[e->current.render_method]);
break;
case RENDER_METHOD_3D_HARDWARE:
if (o->renderer_data.method[e->current.render_method])
__evas_gl_text_font_free((void *)o->renderer_data.method[e->current.render_method]);
break;
case RENDER_METHOD_ALPHA_HARDWARE:
if (o->renderer_data.method[e->current.render_method])
__evas_render_text_font_free((void *)o->renderer_data.method[e->current.render_method]);
break;
case RENDER_METHOD_IMAGE:
if (o->renderer_data.method[e->current.render_method])
__evas_image_text_font_free((void *)o->renderer_data.method[e->current.render_method]);
break;
default:
break;

View File

@ -196,8 +196,8 @@ main(int argc, char **argv)
evas_set_output_size(e, win_w, win_h);
evas_set_output_viewport(e, 0, 0, win_w, win_h);
evas_set_font_cache(e, 1 * 1024 * 1024);
evas_set_image_cache(e, 8 * 1024 * 1024);
evas_set_font_cache(e, 512 * 1024);
evas_set_image_cache(e, 1 * 1024 * 1024);
o[0] = evas_add_image_from_file(e, IMGDIR"sky001.png");
evas_show(e, o[0]);