fix font glyph issue when gl enignes shut down leaving font glyph data

for textures in the font core.



SVN revision: 75243
This commit is contained in:
Carsten Haitzler 2012-08-14 08:31:59 +00:00
parent b11b7c3ac4
commit 54650e7e56
4 changed files with 19 additions and 5 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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;
}

View File

@ -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);