diff options
-rw-r--r-- | source/blender/blenfont/intern/blf.c | 1 | ||||
-rw-r--r-- | source/blender/blenfont/intern/blf_dir.c | 1 | ||||
-rw-r--r-- | source/blender/blenfont/intern/blf_font.c | 5 | ||||
-rw-r--r-- | source/blender/blenfont/intern/blf_glyph.c | 26 | ||||
-rw-r--r-- | source/blender/blenfont/intern/blf_internal_types.h | 3 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/image_gen.c | 2 |
6 files changed, 35 insertions, 3 deletions
diff --git a/source/blender/blenfont/intern/blf.c b/source/blender/blenfont/intern/blf.c index 6523aa87473..130eaaecba5 100644 --- a/source/blender/blenfont/intern/blf.c +++ b/source/blender/blenfont/intern/blf.c @@ -44,6 +44,7 @@ #include "DNA_vec_types.h" #include "BLI_math.h" +#include "BLI_threads.h" #include "BIF_gl.h" #include "BLF_api.h" diff --git a/source/blender/blenfont/intern/blf_dir.c b/source/blender/blenfont/intern/blf_dir.c index 116a55c0579..721e86fbf21 100644 --- a/source/blender/blenfont/intern/blf_dir.c +++ b/source/blender/blenfont/intern/blf_dir.c @@ -46,6 +46,7 @@ #include "BLI_listbase.h" #include "BLI_path_util.h" #include "BLI_string.h" +#include "BLI_threads.h" #include "BIF_gl.h" diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c index f346478889b..56a77d643d6 100644 --- a/source/blender/blenfont/intern/blf_font.c +++ b/source/blender/blenfont/intern/blf_font.c @@ -48,6 +48,7 @@ #include "BLI_rect.h" #include "BLI_string.h" #include "BLI_string_utf8.h" +#include "BLI_threads.h" #include "BLI_linklist.h" /* linknode */ #include "BIF_gl.h" @@ -64,15 +65,18 @@ /* freetype2 handle ONLY for this file!. */ static FT_Library ft_lib; +static SpinLock ft_lib_mutex; int blf_font_init(void) { + BLI_spin_init(&ft_lib_mutex); return FT_Init_FreeType(&ft_lib); } void blf_font_exit(void) { FT_Done_FreeType(ft_lib); + BLI_spin_end(&ft_lib_mutex); } void blf_font_size(FontBLF *font, unsigned int size, unsigned int dpi) @@ -572,6 +576,7 @@ static void blf_font_fill(FontBLF *font) font->buf_info.col[3] = 0; font->ft_lib = ft_lib; + font->ft_lib_mutex = &ft_lib_mutex; } FontBLF *blf_font_new(const char *name, const char *filename) diff --git a/source/blender/blenfont/intern/blf_glyph.c b/source/blender/blenfont/intern/blf_glyph.c index 4812f8f23f7..55424145b43 100644 --- a/source/blender/blenfont/intern/blf_glyph.c +++ b/source/blender/blenfont/intern/blf_glyph.c @@ -48,6 +48,7 @@ #include "BLI_listbase.h" #include "BLI_rect.h" +#include "BLI_threads.h" #include "BIF_gl.h" #include "BLF_api.h" @@ -224,6 +225,19 @@ GlyphBLF *blf_glyph_add(FontBLF *font, unsigned int index, unsigned int c) if (g) return g; + /* glyphs are dynamically created as needed by font rendering. this means that + * to make font rendering thread safe we have to do locking here. note that this + * must be a lock for the whole library and not just per font, because the font + * renderer uses a shared buffer internally */ + BLI_spin_lock(font->ft_lib_mutex); + + /* search again after locking */ + g = blf_glyph_search(font->glyph_cache, c); + if (g) { + BLI_spin_unlock(font->ft_lib_mutex); + return g; + } + if (font->flags & BLF_HINTING) flags &= ~FT_LOAD_NO_HINTING; @@ -231,8 +245,11 @@ GlyphBLF *blf_glyph_add(FontBLF *font, unsigned int index, unsigned int c) err = FT_Load_Glyph(font->face, (FT_UInt)index, FT_LOAD_TARGET_MONO); else err = FT_Load_Glyph(font->face, (FT_UInt)index, flags); - if (err) + + if (err) { + BLI_spin_unlock(font->ft_lib_mutex); return NULL; + } /* get the glyph. */ slot = font->face->glyph; @@ -251,8 +268,10 @@ GlyphBLF *blf_glyph_add(FontBLF *font, unsigned int index, unsigned int c) err = FT_Render_Glyph(slot, FT_RENDER_MODE_NORMAL); } - if (err || slot->format != FT_GLYPH_FORMAT_BITMAP) + if (err || slot->format != FT_GLYPH_FORMAT_BITMAP) { + BLI_spin_unlock(font->ft_lib_mutex); return NULL; + } g = (GlyphBLF *)MEM_callocN(sizeof(GlyphBLF), "blf_glyph_add"); g->c = c; @@ -289,6 +308,9 @@ GlyphBLF *blf_glyph_add(FontBLF *font, unsigned int index, unsigned int c) key = blf_hash(g->c); BLI_addhead(&(font->glyph_cache->bucket[key]), g); + + BLI_spin_unlock(font->ft_lib_mutex); + return g; } diff --git a/source/blender/blenfont/intern/blf_internal_types.h b/source/blender/blenfont/intern/blf_internal_types.h index 36294bfe3b5..096ff50a3ca 100644 --- a/source/blender/blenfont/intern/blf_internal_types.h +++ b/source/blender/blenfont/intern/blf_internal_types.h @@ -217,6 +217,9 @@ typedef struct FontBLF { /* freetype2 lib handle. */ FT_Library ft_lib; + /* Mutex lock for library */ + SpinLock *ft_lib_mutex; + /* freetype2 face. */ FT_Face face; diff --git a/source/blender/blenkernel/intern/image_gen.c b/source/blender/blenkernel/intern/image_gen.c index c31ec593e54..eda22a095ef 100644 --- a/source/blender/blenkernel/intern/image_gen.c +++ b/source/blender/blenkernel/intern/image_gen.c @@ -287,7 +287,7 @@ static void checker_board_text(unsigned char *rect, float *rect_float, int width int x, y; int pen_x, pen_y; char text[3] = {'A', '1', '\0'}; - const int mono = blf_mono_font; + const int mono = blf_mono_font_render; BLF_size(mono, 54, 72); /* hard coded size! */ |