Fix T67620: Font preview translations malfunction in Blender 2.8
authorBastien Montagne <montagne29@wanadoo.fr>
Mon, 29 Jul 2019 12:10:54 +0000 (14:10 +0200)
committerBastien Montagne <montagne29@wanadoo.fr>
Mon, 29 Jul 2019 12:11:35 +0000 (14:11 +0200)
We cannot reliably use translations API from non-main threads.

Now storing translated strings in a static cache, with basic mechanism
to update it on language change.

Reviewers: brecht, campbellbarton

Differential Revision: https://developer.blender.org/D5350

source/blender/blenfont/BLF_api.h
source/blender/blenfont/intern/blf_thumbs.c
source/blender/blentranslation/CMakeLists.txt
source/blender/blentranslation/intern/blt_lang.c
source/blender/editors/space_file/filelist.c
source/blender/imbuf/IMB_thumbs.h
source/blender/imbuf/intern/thumbs_font.c
source/blender/windowmanager/intern/wm_init_exit.c

index 448bb0d621ab474830c76780da6e61c41721ecee..bf0aa96df849bab80337976729fcef8fa3394b56 100644 (file)
@@ -223,6 +223,7 @@ void BLF_dir_free(char **dirs, int count) ATTR_NONNULL();
 /* blf_thumbs.c */
 void BLF_thumb_preview(const char *filename,
                        const char **draw_str,
+                       const char **i18n_draw_str,
                        const unsigned char draw_str_lines,
                        const float font_color[4],
                        const int font_size,
index 802f97fc5f5536900e9b814408aa44940a32e5bb..d6710b91539b27b260c64c73d8175aa6b2246e95 100644 (file)
@@ -50,6 +50,7 @@
  */
 void BLF_thumb_preview(const char *filename,
                        const char **draw_str,
+                       const char **i18n_draw_str,
                        const unsigned char draw_str_lines,
                        const float font_color[4],
                        const int font_size,
@@ -90,7 +91,7 @@ void BLF_thumb_preview(const char *filename,
   blf_draw_buffer__start(font);
 
   for (i = 0; i < draw_str_lines; i++) {
-    const char *draw_str_i18n = BLT_translate_do(BLT_I18NCONTEXT_DEFAULT, draw_str[i]);
+    const char *draw_str_i18n = i18n_draw_str[i] != NULL ? i18n_draw_str[i] : draw_str[i];
     const size_t draw_str_i18n_len = strlen(draw_str_i18n);
     int draw_str_i18n_nbr = 0;
 
index 34952911dce9785f80223121411482c5e37faef1..70e68ca06d720904874bca7673aee43cbfea8e9b 100644 (file)
@@ -22,6 +22,7 @@ set(INC
   .
   ../blenkernel
   ../blenlib
+  ../imbuf
   ../makesdna
   ../makesrna
   ../../../intern/guardedalloc
index 75a4681deb2b592f245bc48f8ef1c66fc28136e7..82386a17776cfe5090e114a93121082ce0489607 100644 (file)
@@ -42,6 +42,8 @@
 
 #include "BKE_appdir.h"
 
+#include "IMB_thumbs.h"
+
 #include "DNA_userdef_types.h"
 
 #include "MEM_guardedalloc.h"
@@ -288,6 +290,7 @@ void BLT_lang_set(const char *str)
   (void)str;
 #endif
   blt_lang_check_ime_supported();
+  IMB_thumb_clear_translations();
 }
 
 /* Get the current locale (short code, e.g. es_ES). */
index 9004eaa7bf66cc63d5f62f2613400f8433c97f85..e06ee620ea7469b9abf717b8463ed13ec1340a6a 100644 (file)
@@ -1317,6 +1317,9 @@ static void filelist_cache_init(FileListEntryCache *cache, size_t cache_size)
 
   cache->size = cache_size;
   cache->flags = FLC_IS_INIT;
+
+  /* We cannot translate from non-main thread, so init translated strings once from here. */
+  IMB_thumb_ensure_translations();
 }
 
 static void filelist_cache_free(FileListEntryCache *cache)
index bac408e869b67da1683435a8f4d49dc25a5f2d27..5c7a60bbdcf05cbf59de6fbea323bbeb03c3845a 100644 (file)
@@ -59,27 +59,34 @@ typedef enum ThumbSource {
 #define THUMB_DEFAULT_HASH "00000000000000000000000000000000"
 
 /* create thumbnail for file and returns new imbuf for thumbnail */
-ImBuf *IMB_thumb_create(const char *path, ThumbSize size, ThumbSource source, ImBuf *ibuf);
+struct ImBuf *IMB_thumb_create(const char *path,
+                               ThumbSize size,
+                               ThumbSource source,
+                               struct ImBuf *ibuf);
 
 /* read thumbnail for file and returns new imbuf for thumbnail */
-ImBuf *IMB_thumb_read(const char *path, ThumbSize size);
+struct ImBuf *IMB_thumb_read(const char *path, ThumbSize size);
 
 /* delete all thumbs for the file */
 void IMB_thumb_delete(const char *path, ThumbSize size);
 
 /* return the state of the thumb, needed to determine how to manage the thumb */
-ImBuf *IMB_thumb_manage(const char *path, ThumbSize size, ThumbSource source);
+struct ImBuf *IMB_thumb_manage(const char *path, ThumbSize size, ThumbSource source);
 
 /* create the necessary dirs to store the thumbnails */
 void IMB_thumb_makedirs(void);
 
 /* special function for loading a thumbnail embedded into a blend file */
-ImBuf *IMB_thumb_load_blend(const char *blen_path, const char *blen_group, const char *blen_id);
+struct ImBuf *IMB_thumb_load_blend(const char *blen_path,
+                                   const char *blen_group,
+                                   const char *blen_id);
 void IMB_thumb_overlay_blend(unsigned int *thumb, int width, int height, float aspect);
 
 /* special function for previewing fonts */
-ImBuf *IMB_thumb_load_font(const char *filename, unsigned int x, unsigned int y);
+struct ImBuf *IMB_thumb_load_font(const char *filename, unsigned int x, unsigned int y);
 bool IMB_thumb_load_font_get_hash(char *r_hash);
+void IMB_thumb_clear_translations(void);
+void IMB_thumb_ensure_translations(void);
 
 /* Threading */
 void IMB_thumb_locks_acquire(void);
index 1213927d329ee27d1f17e41b839f6420565b8035..d9a4363d01ca0635b3766e9f16b6e1bd50aa2cc2 100644 (file)
 #include "../../blenfont/BLF_api.h"
 #include "../../blentranslation/BLT_translation.h"
 
-static const char *thumb_str[] = {
-    N_("AaBbCc"),
+#define THUMB_TXT_ITEMS \
+  N_("AaBbCc"), N_("The quick"), N_("brown fox"), N_("jumps over"), N_("the lazy dog"),
 
-    N_("The quick"),
-    N_("brown fox"),
-    N_("jumps over"),
-    N_("the lazy dog"),
-};
+static const char *thumb_str[] = {THUMB_TXT_ITEMS};
+
+static const char *i18n_thumb_str[] = {THUMB_TXT_ITEMS};
+
+#undef THUMB_TXT_ITEMS
+
+void IMB_thumb_clear_translations(void)
+{
+  for (int i = ARRAY_SIZE(thumb_str); i-- > 0;) {
+    i18n_thumb_str[i] = NULL;
+    printf("%s: clearing i18n string %d\n", __func__, i);
+  }
+}
+
+void IMB_thumb_ensure_translations(void)
+{
+  for (int i = ARRAY_SIZE(thumb_str); i-- > 0;) {
+    i18n_thumb_str[i] = BLT_translate_do(BLT_I18NCONTEXT_DEFAULT, thumb_str[i]);
+    printf("%s: translated %s to %s\n", __func__, thumb_str[i], i18n_thumb_str[i]);
+  }
+}
 
 struct ImBuf *IMB_thumb_load_font(const char *filename, unsigned int x, unsigned int y)
 {
@@ -62,6 +78,7 @@ struct ImBuf *IMB_thumb_load_font(const char *filename, unsigned int x, unsigned
 
   BLF_thumb_preview(filename,
                     thumb_str,
+                    i18n_thumb_str,
                     ARRAY_SIZE(thumb_str),
                     font_color,
                     font_size,
@@ -87,8 +104,9 @@ bool IMB_thumb_load_font_get_hash(char *r_hash)
   len += BLI_strncpy_rlen(str + len, THUMB_DEFAULT_HASH, sizeof(buf) - len);
 
   for (i = 0; (i < draw_str_lines) && (len < sizeof(buf)); i++) {
-    len += BLI_strncpy_rlen(
-        str + len, BLT_translate_do(BLT_I18NCONTEXT_DEFAULT, thumb_str[i]), sizeof(buf) - len);
+    len += BLI_strncpy_rlen(str + len,
+                            i18n_thumb_str[i] != NULL ? i18n_thumb_str[i] : thumb_str[i],
+                            sizeof(buf) - len);
   }
 
   BLI_hash_md5_buffer(str, len, digest);
index f3c941627861e8f6ebc7d67e355053f6f5ef2d90..763bdbb9cf0ed65366bc160da28637cbebe88dcc 100644 (file)
@@ -80,6 +80,8 @@
 #include "RE_engine.h"
 #include "RE_pipeline.h" /* RE_ free stuff */
 
+#include "IMB_thumbs.h"
+
 #ifdef WITH_PYTHON
 #  include "BPY_extern.h"
 #endif
@@ -299,6 +301,9 @@ void WM_init(bContext *C, int argc, const char **argv)
   /* Call again to set from userpreferences... */
   BLT_lang_set(NULL);
 
+  /* That one is generated on demand, we need to be sure it's clear on init. */
+  IMB_thumb_clear_translations();
+
   if (!G.background) {
 
 #ifdef WITH_INPUT_NDOF