Fix problem with fonts that cant load completely
* fix reference counting for font_int(s) * properly backout if face doesnt load correctly, this way we dont end up using the face again * put some comments about fudged font cache SVN revision: 29863
This commit is contained in:
parent
d783212329
commit
f0c58de312
|
@ -158,6 +158,7 @@ evas_font_load(Evas *evas, const char *name, const char *source, int size)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (l = fonts_zero; l; l = l->next)
|
||||
{
|
||||
fd = l->data;
|
||||
|
@ -330,8 +331,8 @@ evas_font_load(Evas *evas, const char *name, const char *source, int size)
|
|||
FcPatternGet(set->fonts[i], FC_FILE, 0, &filename);
|
||||
|
||||
if (font)
|
||||
evas->engine.func->font_add(evas->engine.data.output, font, (char *)filename.u.s, size);
|
||||
else
|
||||
evas->engine.func->font_add(evas->engine.data.output, font, (char *)filename.u.s, size);
|
||||
else
|
||||
font = evas->engine.func->font_load(evas->engine.data.output, (char *)filename.u.s, size);
|
||||
}
|
||||
|
||||
|
@ -350,6 +351,7 @@ evas_font_load(Evas *evas, const char *name, const char *source, int size)
|
|||
fd->ref = 1;
|
||||
fonts_cache = evas_list_prepend(fonts_cache, fd);
|
||||
}
|
||||
|
||||
if (font)
|
||||
evas->engine.func->font_hinting_set(evas->engine.data.output, font,
|
||||
evas->hinting);
|
||||
|
|
|
@ -69,11 +69,20 @@ evas_common_font_source_load_complete(RGBA_Font_Source *fs)
|
|||
int error;
|
||||
|
||||
error = FT_New_Face(evas_ft_lib, fs->file, 0, &(fs->ft.face));
|
||||
if (error) return error;
|
||||
if (error)
|
||||
{
|
||||
fs->ft.face = NULL;
|
||||
return error;
|
||||
}
|
||||
|
||||
error = FT_Select_Charmap(fs->ft.face, ft_encoding_unicode);
|
||||
if (error) return error;
|
||||
|
||||
if (error)
|
||||
{
|
||||
FT_Done_Face(fs->ft.face);
|
||||
fs->ft.face = NULL;
|
||||
return error;
|
||||
}
|
||||
|
||||
fs->ft.orig_upem = fs->ft.face->units_per_EM;
|
||||
return error;
|
||||
}
|
||||
|
@ -123,6 +132,7 @@ evas_common_font_size_use(RGBA_Font *fn)
|
|||
RGBA_Font_Int *fi;
|
||||
|
||||
fi = l->data;
|
||||
|
||||
if (fi->src->current_size != fi->size)
|
||||
{
|
||||
FT_Activate_Size(fi->ft.size);
|
||||
|
@ -278,6 +288,7 @@ evas_common_font_load(const char *name, int size)
|
|||
|
||||
fi = evas_common_font_int_load(name, size);
|
||||
if (!fi) return NULL;
|
||||
|
||||
/* First font, complete load */
|
||||
if (!fi->ft.size)
|
||||
{
|
||||
|
@ -285,9 +296,12 @@ evas_common_font_load(const char *name, int size)
|
|||
{
|
||||
if (evas_common_font_source_load_complete(fi->src))
|
||||
{
|
||||
fonts = evas_object_list_remove(fonts, fi);
|
||||
evas_common_font_source_free(fi->src);
|
||||
free(fi);
|
||||
fi->references--;
|
||||
if (fi->references == 0)
|
||||
{
|
||||
evas_common_font_int_modify_cache_by(fi, 1);
|
||||
evas_common_font_flush();
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
@ -297,7 +311,12 @@ evas_common_font_load(const char *name, int size)
|
|||
fn = calloc(1, sizeof(RGBA_Font));
|
||||
if (!fn)
|
||||
{
|
||||
free(fi);
|
||||
fi->references--;
|
||||
if (fi->references == 0)
|
||||
{
|
||||
evas_common_font_int_modify_cache_by(fi, 1);
|
||||
evas_common_font_flush();
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
fn->fonts = evas_list_append(fn->fonts, fi);
|
||||
|
@ -472,6 +491,10 @@ font_modify_cache_cb(Evas_Hash *hash, const char *key, void *data, void *fdata)
|
|||
key = 0;
|
||||
}
|
||||
|
||||
/* when the fi->references == 0 we increase this instead of really deleting
|
||||
* we then check if the cache_useage size is larger than allowed
|
||||
* !If the cache is NOT too large we dont delete font_int
|
||||
* !If the cache is too large we really delete font_int */
|
||||
EAPI void
|
||||
evas_common_font_int_modify_cache_by(RGBA_Font_Int *fi, int dir)
|
||||
{
|
||||
|
@ -519,6 +542,9 @@ font_flush_free_glyph_cb(Evas_Hash *hash, const char *key, void *data, void *fda
|
|||
fdata = 0;
|
||||
}
|
||||
|
||||
/* We run this when the cache gets larger than allowed size
|
||||
* We check cache size each time a fi->references goes to 0
|
||||
* PERFORMS: Find font_int(s) with references == 0 and delete them */
|
||||
EAPI void
|
||||
evas_common_font_flush_last(void)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue