};
-
+LK(lock_words); // for word cache call
static Eina_Inlist *words = NULL;
static struct prword *evas_font_word_prerender(RGBA_Draw_Context *dc, const char *text, int len, RGBA_Font *fn, RGBA_Font_Int *fi,int use_kerning);
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! */
const char *in_ss = eina_stringshare_add(in_text);
+ LKL(lock_words);
EINA_INLIST_FOREACH(words,w){
if (w->len == len && w->font == fn && fi->size == w->size &&
(w->str == in_ss)){
words = eina_inlist_promote(words, EINA_INLIST_GET(w));
eina_stringshare_del(in_ss);
+ LKU(lock_words);
return w;
}
}
+ LKU(lock_words);
#ifdef INTERNATIONAL_SUPPORT
/*FIXME: should get the direction by parmater */
ci->gl = evas_common_font_utf8_get_next((unsigned char *)text, &chr);
if (ci->gl == 0) break;
ci->index = evas_common_font_glyph_search(fn, &fi, ci->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;
}
if (use_kerning && char_index && (pface == fi->src->ft.face))
}
pface = fi->src->ft.face;
ci->fg = evas_common_font_int_cache_glyph_get(fi, ci->index);
+ LKU(fi->ft_mutex);
if (!ci->fg) continue;
if (gl){
ci->fg->ext_dat =dc->font_ext.func.gl_new(dc->font_ext.data,ci->fg);
save->roww = width;
save->height = height;
save->baseline = baseline;
+ LKL(lock_words);
words = eina_inlist_prepend(words, EINA_INLIST_GET(save));
/* Clean up if too long */
words = eina_inlist_remove(words,EINA_INLIST_GET(last));
free(last);
}
+ LKU(lock_words);
#ifdef INTERNATIONAL_SUPPORT
if (level_list) free(level_list);