Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenfont/intern/blf.c1
-rw-r--r--source/blender/blenfont/intern/blf_dir.c1
-rw-r--r--source/blender/blenfont/intern/blf_font.c5
-rw-r--r--source/blender/blenfont/intern/blf_glyph.c26
-rw-r--r--source/blender/blenfont/intern/blf_internal_types.h3
-rw-r--r--source/blender/blenkernel/intern/image_gen.c2
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! */