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_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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue