forked from enlightenment/efl
* 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:
parent
8006ed3753
commit
0a5c65549a
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue