From cedba3f7d92e0ad359dc6817a68d76c8c7bd790b Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Tue, 18 May 2010 04:22:33 +0000 Subject: [PATCH] handle gl init fialure correctly and dont mess up font init. SVN revision: 48959 --- .../src/lib/engines/common/evas_font_load.c | 9 ++- .../src/lib/engines/common/evas_font_main.c | 7 +- .../src/modules/engines/gl_x11/evas_engine.c | 75 ++++++++++++++----- 3 files changed, 66 insertions(+), 25 deletions(-) diff --git a/legacy/evas/src/lib/engines/common/evas_font_load.c b/legacy/evas/src/lib/engines/common/evas_font_load.c index 4e7e5c47c8..d754cf08db 100644 --- a/legacy/evas/src/lib/engines/common/evas_font_load.c +++ b/legacy/evas/src/lib/engines/common/evas_font_load.c @@ -774,7 +774,14 @@ EAPI void evas_common_font_flush(void) { if (font_cache_usage < font_cache) return; - while (font_cache_usage > font_cache) evas_common_font_flush_last(); + while (font_cache_usage > font_cache) + { + int pfont_cache_usage; + + pfont_cache_usage = font_cache_usage; + evas_common_font_flush_last(); + if (pfont_cache_usage == font_cache_usage) break; + } } /* We run this when the cache gets larger than allowed size diff --git a/legacy/evas/src/lib/engines/common/evas_font_main.c b/legacy/evas/src/lib/engines/common/evas_font_main.c index 45be497c15..afe1b11a66 100644 --- a/legacy/evas/src/lib/engines/common/evas_font_main.c +++ b/legacy/evas/src/lib/engines/common/evas_font_main.c @@ -15,11 +15,7 @@ evas_common_font_init(void) initialised++; if (initialised != 1) return; error = FT_Init_FreeType(&evas_ft_lib); - if (error) - { - initialised--; - return; - } + if (error) return; evas_common_font_load_init(); } @@ -28,6 +24,7 @@ evas_common_font_shutdown(void) { int error; + if (initialised < 1) return; initialised--; if (initialised != 0) return; diff --git a/legacy/evas/src/modules/engines/gl_x11/evas_engine.c b/legacy/evas/src/modules/engines/gl_x11/evas_engine.c index 2cfd9a9dd1..72b39c336d 100644 --- a/legacy/evas/src/modules/engines/gl_x11/evas_engine.c +++ b/legacy/evas/src/modules/engines/gl_x11/evas_engine.c @@ -198,6 +198,9 @@ eng_info_free(Evas *e __UNUSED__, void *info) free(in); } +static int initted = 0; +static int gl_wins = 0; + static int eng_setup(Evas *e, void *in) { @@ -235,6 +238,7 @@ eng_setup(Evas *e, void *in) e->engine.data.output = NULL; return 0; } + gl_wins++; { int status; @@ -289,20 +293,24 @@ eng_setup(Evas *e, void *in) } } } - - evas_common_cpu_init(); - - evas_common_blend_init(); - evas_common_image_init(); - evas_common_convert_init(); - evas_common_scale_init(); - evas_common_rectangle_init(); - evas_common_gradient_init(); - evas_common_polygon_init(); - evas_common_line_init(); - evas_common_font_init(); - evas_common_draw_init(); - evas_common_tilebuf_init(); + + if (!initted) + { + evas_common_cpu_init(); + + evas_common_blend_init(); + evas_common_image_init(); + evas_common_convert_init(); + evas_common_scale_init(); + evas_common_rectangle_init(); + evas_common_gradient_init(); + evas_common_polygon_init(); + evas_common_line_init(); + evas_common_font_init(); + evas_common_draw_init(); + evas_common_tilebuf_init(); + initted = 1; + } } else { @@ -316,7 +324,11 @@ eng_setup(Evas *e, void *in) (info->info.destination_alpha != re->win->alpha) || (info->info.rotation != re->win->rot)) { - eng_window_free(re->win); + if (re->win) + { + eng_window_free(re->win); + gl_wins--; + } re->win = eng_window_new(info->info.display, info->info.drawable, info->info.screen, @@ -328,6 +340,7 @@ eng_setup(Evas *e, void *in) info->indirect, info->info.destination_alpha, info->info.rotation); + if (re->win) gl_wins++; } else if ((re->win->w != e->output.w) || (re->win->h != e->output.h)) @@ -344,9 +357,14 @@ eng_setup(Evas *e, void *in) free(re); return 0; } + if (!e->engine.data.output) { - if (re->win) eng_window_free(re->win); + if (re->win) + { + eng_window_free(re->win); + gl_wins--; + } free(re); return 0; } @@ -378,11 +396,30 @@ eng_output_free(void *data) // NOTE: XrmGetDatabase() result is shared per connection, do not free it. // if (re->xrdb) XrmDestroyDatabase(re->xrdb); - if (re->win) eng_window_free(re->win); + if (re->win) + { + eng_window_free(re->win); + gl_wins--; + } free(re); } - evas_common_font_shutdown(); - evas_common_image_shutdown(); + if ((initted == 1) && (gl_wins == 0)) + { + evas_common_cpu_shutdown(); + + evas_common_blend_shutdown(); + evas_common_image_shutdown(); + evas_common_convert_shutdown(); + evas_common_scale_shutdown(); + evas_common_rectangle_shutdown(); + evas_common_gradient_shutdown(); + evas_common_polygon_shutdown(); + evas_common_line_shutdown(); + evas_common_font_shutdown(); + evas_common_draw_shutdown(); + evas_common_tilebuf_shutdown(); + initted = 0; + } } static void