From 411ec99a573a43f75026dd447a80f442575f1a07 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Mon, 16 Apr 2001 18:38:22 +0000 Subject: [PATCH] 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 --- legacy/evas/src/evas_image.c | 10 ++++++++ legacy/evas/src/evas_render.c | 43 ++++++++++++++++++++++++++++---- legacy/evas/src/evas_text.c | 10 ++++++++ legacy/evas/test/evas_test_old.c | 4 +-- 4 files changed, 60 insertions(+), 7 deletions(-) diff --git a/legacy/evas/src/evas_image.c b/legacy/evas/src/evas_image.c index 95ade0b3ed..5116658701 100644 --- a/legacy/evas/src/evas_image.c +++ b/legacy/evas/src/evas_image.c @@ -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; diff --git a/legacy/evas/src/evas_render.c b/legacy/evas/src/evas_render.c index 9aaa0b03d9..8360753de8 100644 --- a/legacy/evas/src/evas_render.c +++ b/legacy/evas/src/evas_render.c @@ -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; diff --git a/legacy/evas/src/evas_text.c b/legacy/evas/src/evas_text.c index 3c9ab724ad..6a38f7c743 100644 --- a/legacy/evas/src/evas_text.c +++ b/legacy/evas/src/evas_text.c @@ -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; diff --git a/legacy/evas/test/evas_test_old.c b/legacy/evas/test/evas_test_old.c index 3c2d85c03c..0a529289b6 100644 --- a/legacy/evas/test/evas_test_old.c +++ b/legacy/evas/test/evas_test_old.c @@ -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]);