From 0a5c65549a646b593eeb4c266c399f6a65480df5 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Tue, 20 Jul 2010 12:09:46 +0000 Subject: [PATCH] * evas: font config access is not thread safe at all. Don't forget to call FTLOCK/FTUNLOCK around each FT_* call. SVN revision: 50379 --- .../evas/src/lib/engines/common/evas_font_main.c | 14 ++++++++++++++ .../src/lib/engines/common/evas_font_private.h | 2 +- .../evas/src/lib/engines/common/evas_font_query.c | 14 ++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) 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 f406b61cad..d53380d911 100644 --- a/legacy/evas/src/lib/engines/common/evas_font_main.c +++ b/legacy/evas/src/lib/engines/common/evas_font_main.c @@ -4,6 +4,8 @@ #include "evas_common.h" #include "evas_private.h" +#include "evas_font_private.h" + FT_Library evas_ft_lib = 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->current_size != fi->size) { + FTLOCK(); FT_Activate_Size(fi->ft.size); + FTUNLOCK(); fi->src->current_size = fi->size; } 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; if (fi->src->current_size != fi->size) { + FTLOCK(); FT_Activate_Size(fi->ft.size); + FTUNLOCK(); fi->src->current_size = fi->size; } if (!FT_IS_SCALABLE(fi->src->ft.face)) @@ -114,7 +120,9 @@ evas_common_font_descent_get(RGBA_Font *fn) fi = fn->fonts->data; if (fi->src->current_size != fi->size) { + FTLOCK(); FT_Activate_Size(fi->ft.size); + FTUNLOCK(); fi->src->current_size = fi->size; } 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; if (fi->src->current_size != fi->size) { + FTLOCK(); FT_Activate_Size(fi->ft.size); + FTUNLOCK(); fi->src->current_size = fi->size; } 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; if (fi->src->current_size != fi->size) { + FTLOCK(); FT_Activate_Size(fi->ft.size); + FTUNLOCK(); fi->src->current_size = fi->size; } 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; if (fi->src->current_size != fi->size) { + FTLOCK(); FT_Activate_Size(fi->ft.size); + FTUNLOCK(); fi->src->current_size = fi->size; } val = (int)fi->src->ft.face->size->metrics.height; diff --git a/legacy/evas/src/lib/engines/common/evas_font_private.h b/legacy/evas/src/lib/engines/common/evas_font_private.h index 31bdaed60d..99ec2a4389 100644 --- a/legacy/evas/src/lib/engines/common/evas_font_private.h +++ b/legacy/evas/src/lib/engines/common/evas_font_private.h @@ -6,7 +6,7 @@ extern LK(lock_font_draw); // for freetype2 API calls extern LK(lock_fribidi); // for fribidi API calls #endif -# ifdef EVAS_FRAME_QUEUING +# if defined(EVAS_FRAME_QUEUING) || defined(BUILD_PIPE_RENDER) # define FTLOCK() LKL(lock_font_draw) # define FTUNLOCK() LKU(lock_font_draw) diff --git a/legacy/evas/src/lib/engines/common/evas_font_query.c b/legacy/evas/src/lib/engines/common/evas_font_query.c index d1b2f99bd7..7ecf1964de 100644 --- a/legacy/evas/src/lib/engines/common/evas_font_query.c +++ b/legacy/evas/src/lib/engines/common/evas_font_query.c @@ -91,7 +91,9 @@ evas_common_font_query_size(RGBA_Font *fn, const char *text, int *w, int *h) LKL(fi->ft_mutex); if (fi->src->current_size != fi->size) { + FTLOCK(); FT_Activate_Size(fi->ft.size); + FTUNLOCK(); fi->src->current_size = fi->size; } /* 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; // evas_common_font_size_use(fn); index = evas_common_font_glyph_search(fn, &fi, gl); + LKL(fi->ft_mutex); if (fi->src->current_size != fi->size) { + FTLOCK(); FT_Activate_Size(fi->ft.size); + FTUNLOCK(); fi->src->current_size = fi->size; } fg = evas_common_font_int_cache_glyph_get(fi, index); + LKU(fi->ft_mutex); if (!fg) return 0; /* 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); if (fi->src->current_size != fi->size) { + FTLOCK(); FT_Activate_Size(fi->ft.size); + FTUNLOCK(); fi->src->current_size = fi->size; } /* 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); if (fi->src->current_size != fi->size) { + FTLOCK(); FT_Activate_Size(fi->ft.size); + FTUNLOCK(); fi->src->current_size = fi->size; } 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); if (fi->src->current_size != fi->size) { + FTLOCK(); FT_Activate_Size(fi->ft.size); + FTUNLOCK(); fi->src->current_size = fi->size; } 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); if (fi->src->current_size != fi->size) { + FTLOCK(); FT_Activate_Size(fi->ft.size); + FTUNLOCK(); fi->src->current_size = fi->size; } kern = 0;