From 54650e7e5615f171f0c9e63c2f145e03be3289dd Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Tue, 14 Aug 2012 08:31:59 +0000 Subject: [PATCH] fix font glyph issue when gl enignes shut down leaving font glyph data for textures in the font core. SVN revision: 75243 --- .../src/modules/engines/gl_common/evas_gl_common.h | 3 +++ .../src/modules/engines/gl_common/evas_gl_context.c | 9 +++++++-- .../evas/src/modules/engines/gl_common/evas_gl_font.c | 2 ++ .../src/modules/engines/gl_common/evas_gl_texture.c | 10 +++++++--- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/legacy/evas/src/modules/engines/gl_common/evas_gl_common.h b/legacy/evas/src/modules/engines/gl_common/evas_gl_common.h index 419774612e..0097d790ba 100644 --- a/legacy/evas/src/modules/engines/gl_common/evas_gl_common.h +++ b/legacy/evas/src/modules/engines/gl_common/evas_gl_common.h @@ -336,6 +336,8 @@ struct _Evas_Engine_GL_Context struct { Eina_Bool size : 1; } change; + + Eina_List *font_glyph_textures; Eina_Bool havestuff : 1; @@ -377,6 +379,7 @@ struct _Evas_GL_Texture Evas_Engine_GL_Context *gc; Evas_GL_Image *im; Evas_GL_Texture_Pool *pt, *ptu, *ptv, *ptuv; + RGBA_Font_Glyph *fglyph; int x, y, w, h; double sx1, sy1, sx2, sy2; int references; diff --git a/legacy/evas/src/modules/engines/gl_common/evas_gl_context.c b/legacy/evas/src/modules/engines/gl_common/evas_gl_context.c index 2cd55a68f6..fe965b5d54 100644 --- a/legacy/evas/src/modules/engines/gl_common/evas_gl_context.c +++ b/legacy/evas/src/modules/engines/gl_common/evas_gl_context.c @@ -770,6 +770,9 @@ evas_gl_common_context_free(Evas_Engine_GL_Context *gc) if (gc->pipe[i].array.texuv3) free(gc->pipe[i].array.texuv3); } } + + while (gc->font_glyph_textures) + evas_gl_common_texture_free(gc->font_glyph_textures->data); if ((gc->shared) && (gc->shared->references == 0)) { @@ -783,16 +786,18 @@ evas_gl_common_context_free(Evas_Engine_GL_Context *gc) evas_gl_common_image_free(gc->shared->images->data); } - EINA_LIST_FOREACH(gc->shared->tex.whole, l, pt) - evas_gl_texture_pool_empty(pt); for (i = 0; i < 33; i++) { for (j = 0; j < 3; j++) { EINA_LIST_FOREACH(gc->shared->tex.atlas[i][j], l, pt) evas_gl_texture_pool_empty(pt); + eina_list_free(gc->shared->tex.atlas[i][j]); } } + EINA_LIST_FOREACH(gc->shared->tex.whole, l, pt) + evas_gl_texture_pool_empty(pt); + eina_list_free(gc->shared->tex.whole); eina_hash_free(gc->shared->native_pm_hash); eina_hash_free(gc->shared->native_tex_hash); free(gc->shared); diff --git a/legacy/evas/src/modules/engines/gl_common/evas_gl_font.c b/legacy/evas/src/modules/engines/gl_common/evas_gl_font.c index 78eddc6f24..d3b4ba443f 100644 --- a/legacy/evas/src/modules/engines/gl_common/evas_gl_font.c +++ b/legacy/evas/src/modules/engines/gl_common/evas_gl_font.c @@ -87,6 +87,8 @@ evas_gl_font_texture_new(void *context, RGBA_Font_Glyph *fg) tex->sy1 = ((double)(tex->y)) / (double)tex->pt->h; tex->sx2 = ((double)(tex->x + tex->w)) / (double)tex->pt->w; tex->sy2 = ((double)(tex->y + tex->h)) / (double)tex->pt->h; + tex->fglyph = fg; + gc->font_glyph_textures = eina_list_append(gc->font_glyph_textures, tex); return tex; } diff --git a/legacy/evas/src/modules/engines/gl_common/evas_gl_texture.c b/legacy/evas/src/modules/engines/gl_common/evas_gl_texture.c index 327c395f0c..4311f33097 100644 --- a/legacy/evas/src/modules/engines/gl_common/evas_gl_texture.c +++ b/legacy/evas/src/modules/engines/gl_common/evas_gl_texture.c @@ -675,9 +675,7 @@ evas_gl_texture_pool_empty(Evas_GL_Texture_Pool *pt) GLERR(__FUNCTION__, __FILE__, __LINE__, ""); pt->fb = 0; } - while (pt->allocations) - pt->allocations = - eina_list_remove_list(pt->allocations, pt->allocations); + pt->allocations = eina_list_free(pt->allocations); pt->texture = 0; pt->gc = NULL; pt->w = 0; @@ -965,6 +963,12 @@ evas_gl_common_texture_free(Evas_GL_Texture *tex) if (!tex) return; tex->references--; if (tex->references != 0) return; + if (tex->fglyph) + { + tex->gc->font_glyph_textures = eina_list_remove(tex->gc->font_glyph_textures, tex); + tex->fglyph->ext_dat = NULL; + tex->fglyph->ext_dat_free = NULL; + } if (tex->double_buffer.pt[0]) { tex->double_buffer.pt[0]->allocations = eina_list_remove(tex->double_buffer.pt[0]->allocations, tex);