* evas: font config access is not thread safe at all. Don't forget

to call FTLOCK/FTUNLOCK around each FT_* call.


SVN revision: 50379
This commit is contained in:
Cedric BAIL 2010-07-20 12:09:46 +00:00
parent 8006ed3753
commit 0a5c65549a
3 changed files with 29 additions and 1 deletions

View File

@ -4,6 +4,8 @@
#include "evas_common.h" #include "evas_common.h"
#include "evas_private.h" #include "evas_private.h"
#include "evas_font_private.h"
FT_Library evas_ft_lib = 0; FT_Library evas_ft_lib = 0;
static int initialised = 0; static int initialised = 0;
@ -71,7 +73,9 @@ evas_common_font_ascent_get(RGBA_Font *fn)
if (!fi->src->ft.face) continue; if (!fi->src->ft.face) continue;
if (fi->src->current_size != fi->size) if (fi->src->current_size != fi->size)
{ {
FTLOCK();
FT_Activate_Size(fi->ft.size); FT_Activate_Size(fi->ft.size);
FTUNLOCK();
fi->src->current_size = fi->size; fi->src->current_size = fi->size;
} }
val = (int)fi->src->ft.face->size->metrics.ascender; val = (int)fi->src->ft.face->size->metrics.ascender;
@ -86,7 +90,9 @@ evas_common_font_ascent_get(RGBA_Font *fn)
fi = fn->fonts->data; fi = fn->fonts->data;
if (fi->src->current_size != fi->size) if (fi->src->current_size != fi->size)
{ {
FTLOCK();
FT_Activate_Size(fi->ft.size); FT_Activate_Size(fi->ft.size);
FTUNLOCK();
fi->src->current_size = fi->size; fi->src->current_size = fi->size;
} }
if (!FT_IS_SCALABLE(fi->src->ft.face)) if (!FT_IS_SCALABLE(fi->src->ft.face))
@ -114,7 +120,9 @@ evas_common_font_descent_get(RGBA_Font *fn)
fi = fn->fonts->data; fi = fn->fonts->data;
if (fi->src->current_size != fi->size) if (fi->src->current_size != fi->size)
{ {
FTLOCK();
FT_Activate_Size(fi->ft.size); FT_Activate_Size(fi->ft.size);
FTUNLOCK();
fi->src->current_size = fi->size; fi->src->current_size = fi->size;
} }
val = -(int)fi->src->ft.face->size->metrics.descender; val = -(int)fi->src->ft.face->size->metrics.descender;
@ -137,7 +145,9 @@ evas_common_font_max_ascent_get(RGBA_Font *fn)
fi = fn->fonts->data; fi = fn->fonts->data;
if (fi->src->current_size != fi->size) if (fi->src->current_size != fi->size)
{ {
FTLOCK();
FT_Activate_Size(fi->ft.size); FT_Activate_Size(fi->ft.size);
FTUNLOCK();
fi->src->current_size = fi->size; fi->src->current_size = fi->size;
} }
val = (int)fi->src->ft.face->bbox.yMax; val = (int)fi->src->ft.face->bbox.yMax;
@ -159,7 +169,9 @@ evas_common_font_max_descent_get(RGBA_Font *fn)
fi = fn->fonts->data; fi = fn->fonts->data;
if (fi->src->current_size != fi->size) if (fi->src->current_size != fi->size)
{ {
FTLOCK();
FT_Activate_Size(fi->ft.size); FT_Activate_Size(fi->ft.size);
FTUNLOCK();
fi->src->current_size = fi->size; fi->src->current_size = fi->size;
} }
val = -(int)fi->src->ft.face->bbox.yMin; val = -(int)fi->src->ft.face->bbox.yMin;
@ -181,7 +193,9 @@ evas_common_font_get_line_advance(RGBA_Font *fn)
fi = fn->fonts->data; fi = fn->fonts->data;
if (fi->src->current_size != fi->size) if (fi->src->current_size != fi->size)
{ {
FTLOCK();
FT_Activate_Size(fi->ft.size); FT_Activate_Size(fi->ft.size);
FTUNLOCK();
fi->src->current_size = fi->size; fi->src->current_size = fi->size;
} }
val = (int)fi->src->ft.face->size->metrics.height; val = (int)fi->src->ft.face->size->metrics.height;

View File

@ -6,7 +6,7 @@ extern LK(lock_font_draw); // for freetype2 API calls
extern LK(lock_fribidi); // for fribidi API calls extern LK(lock_fribidi); // for fribidi API calls
#endif #endif
# ifdef EVAS_FRAME_QUEUING # if defined(EVAS_FRAME_QUEUING) || defined(BUILD_PIPE_RENDER)
# define FTLOCK() LKL(lock_font_draw) # define FTLOCK() LKL(lock_font_draw)
# define FTUNLOCK() LKU(lock_font_draw) # define FTUNLOCK() LKU(lock_font_draw)

View File

@ -91,7 +91,9 @@ evas_common_font_query_size(RGBA_Font *fn, const char *text, int *w, int *h)
LKL(fi->ft_mutex); LKL(fi->ft_mutex);
if (fi->src->current_size != fi->size) if (fi->src->current_size != fi->size)
{ {
FTLOCK();
FT_Activate_Size(fi->ft.size); FT_Activate_Size(fi->ft.size);
FTUNLOCK();
fi->src->current_size = fi->size; fi->src->current_size = fi->size;
} }
/* hmmm kerning means i can't sanely do my own cached metric tables! */ /* hmmm kerning means i can't sanely do my own cached metric tables! */
@ -150,12 +152,16 @@ evas_common_font_query_inset(RGBA_Font *fn, const char *text)
if (gl == 0) return 0; if (gl == 0) return 0;
// evas_common_font_size_use(fn); // evas_common_font_size_use(fn);
index = evas_common_font_glyph_search(fn, &fi, gl); index = evas_common_font_glyph_search(fn, &fi, gl);
LKL(fi->ft_mutex);
if (fi->src->current_size != fi->size) if (fi->src->current_size != fi->size)
{ {
FTLOCK();
FT_Activate_Size(fi->ft.size); FT_Activate_Size(fi->ft.size);
FTUNLOCK();
fi->src->current_size = fi->size; fi->src->current_size = fi->size;
} }
fg = evas_common_font_int_cache_glyph_get(fi, index); fg = evas_common_font_int_cache_glyph_get(fi, index);
LKU(fi->ft_mutex);
if (!fg) return 0; if (!fg) return 0;
/* /*
INF("fg->glyph_out->left = %i\n" INF("fg->glyph_out->left = %i\n"
@ -209,7 +215,9 @@ evas_common_font_query_advance(RGBA_Font *fn, const char *text, int *h_adv, int
LKL(fi->ft_mutex); LKL(fi->ft_mutex);
if (fi->src->current_size != fi->size) if (fi->src->current_size != fi->size)
{ {
FTLOCK();
FT_Activate_Size(fi->ft.size); FT_Activate_Size(fi->ft.size);
FTUNLOCK();
fi->src->current_size = fi->size; fi->src->current_size = fi->size;
} }
/* hmmm kerning means i can't sanely do my own cached metric tables! */ /* hmmm kerning means i can't sanely do my own cached metric tables! */
@ -269,7 +277,9 @@ evas_common_font_query_char_coords(RGBA_Font *fn, const char *in_text, int pos,
// evas_common_font_size_use(fn); // evas_common_font_size_use(fn);
if (fi->src->current_size != fi->size) if (fi->src->current_size != fi->size)
{ {
FTLOCK();
FT_Activate_Size(fi->ft.size); FT_Activate_Size(fi->ft.size);
FTUNLOCK();
fi->src->current_size = fi->size; fi->src->current_size = fi->size;
} }
use_kerning = FT_HAS_KERNING(fi->src->ft.face); use_kerning = FT_HAS_KERNING(fi->src->ft.face);
@ -412,7 +422,9 @@ evas_common_font_query_text_at_pos(RGBA_Font *fn, const char *in_text, int x, in
// evas_common_font_size_use(fn); // evas_common_font_size_use(fn);
if (fi->src->current_size != fi->size) if (fi->src->current_size != fi->size)
{ {
FTLOCK();
FT_Activate_Size(fi->ft.size); FT_Activate_Size(fi->ft.size);
FTUNLOCK();
fi->src->current_size = fi->size; fi->src->current_size = fi->size;
} }
use_kerning = FT_HAS_KERNING(fi->src->ft.face); use_kerning = FT_HAS_KERNING(fi->src->ft.face);
@ -559,7 +571,9 @@ evas_common_font_query_last_up_to_pos(RGBA_Font *fn, const char *text, int x, in
LKL(fi->ft_mutex); LKL(fi->ft_mutex);
if (fi->src->current_size != fi->size) if (fi->src->current_size != fi->size)
{ {
FTLOCK();
FT_Activate_Size(fi->ft.size); FT_Activate_Size(fi->ft.size);
FTUNLOCK();
fi->src->current_size = fi->size; fi->src->current_size = fi->size;
} }
kern = 0; kern = 0;