diff options
author | Irie Shinsuke <irieshinsuke@yahoo.co.jp> | 2013-03-12 11:25:53 +0400 |
---|---|---|
committer | Irie Shinsuke <irieshinsuke@yahoo.co.jp> | 2013-03-12 11:25:53 +0400 |
commit | 5792e77239c43aea0afc21b2df96153ba31c5399 (patch) | |
tree | 47eb20f56f932f984800329781f2e75e38e7eb78 /source/blender/blenlib | |
parent | 6669ee4784ac6591711298eb01f8e0b06793c60a (diff) |
Patch [#34373] Use i18n monospace font in Text editor and Python console
This patch allows Blender to display i18n monospace font in the text
editor and the Python interactive console. Wide characters that occupy
multiple columns such as CJK characters can be displayed correctly.
Furthermore, wrapping, selection, suggestion, cursor drawing, and
syntax highlighting should work.
Also fixes a bug [#34543]: In Text Editor false color in comment on cyrillic
To estimate how many columns each character occupies, this patch uses
wcwidth.c written by Markus Kuhn and distributed under MIT-style license:
http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c
wcwidth.c is stored in extern/wcwidth and used as a static library.
This patch adds new API to blenfont, blenlib and blenkernel:
BLF_get_unifont_mono()
BLF_free_unifont_mono()
BLF_draw_mono()
BLI_wcwidth()
BLI_wcswidth()
BLI_str_utf8_char_width()
BLI_str_utf8_char_width_safe()
txt_utf8_offset_to_column()
txt_utf8_column_to_offset()
Diffstat (limited to 'source/blender/blenlib')
-rw-r--r-- | source/blender/blenlib/BLI_string_utf8.h | 9 | ||||
-rw-r--r-- | source/blender/blenlib/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/blenlib/SConscript | 2 | ||||
-rw-r--r-- | source/blender/blenlib/intern/string_utf8.c | 37 |
4 files changed, 47 insertions, 2 deletions
diff --git a/source/blender/blenlib/BLI_string_utf8.h b/source/blender/blenlib/BLI_string_utf8.h index 30d5c28bf98..d20cbd2a91c 100644 --- a/source/blender/blenlib/BLI_string_utf8.h +++ b/source/blender/blenlib/BLI_string_utf8.h @@ -56,7 +56,14 @@ size_t BLI_strnlen_utf8(const char *start, const size_t maxlen); size_t BLI_strncpy_wchar_as_utf8(char *__restrict dst, const wchar_t *__restrict src, const size_t maxcpy); size_t BLI_strncpy_wchar_from_utf8(wchar_t *__restrict dst, const char *__restrict src, const size_t maxcpy); -#define BLI_UTF8_MAX 6 +/* count columns that character/string occupies, based on wcwidth.c */ +int BLI_wcwidth(wchar_t ucs); +int BLI_wcswidth(const wchar_t *pwcs, size_t n); +int BLI_str_utf8_char_width(const char *p); /* warning, can return -1 on bad chars */ +int BLI_str_utf8_char_width_safe(const char *p); + +#define BLI_UTF8_MAX 6 /* mem */ +#define BLI_UTF8_WIDTH_MAX 2 /* columns */ #define BLI_UTF8_ERR ((unsigned int)-1) #ifdef __cplusplus diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt index e5851109d87..bd6e84f7ef9 100644 --- a/source/blender/blenlib/CMakeLists.txt +++ b/source/blender/blenlib/CMakeLists.txt @@ -29,6 +29,7 @@ set(INC ../makesdna ../../../intern/ghost ../../../intern/guardedalloc + ../../../extern/wcwidth ) set(INC_SYS diff --git a/source/blender/blenlib/SConscript b/source/blender/blenlib/SConscript index 2be06f7311d..41a9fe9e8b4 100644 --- a/source/blender/blenlib/SConscript +++ b/source/blender/blenlib/SConscript @@ -31,7 +31,7 @@ sources = env.Glob('intern/*.c') cflags='' # don't add ../blenkernel back! -incs = '. ../makesdna #/intern/guardedalloc #/intern/ghost' +incs = '. ../makesdna #/intern/guardedalloc #/intern/ghost #/extern/wcwidth' incs += ' ' + env['BF_FREETYPE_INC'] incs += ' ' + env['BF_ZLIB_INC'] diff --git a/source/blender/blenlib/intern/string_utf8.c b/source/blender/blenlib/intern/string_utf8.c index 26235de4dd2..fe8f3c20ab4 100644 --- a/source/blender/blenlib/intern/string_utf8.c +++ b/source/blender/blenlib/intern/string_utf8.c @@ -33,6 +33,7 @@ #include <string.h> #include <wchar.h> #include <wctype.h> +#include <wcwidth.h> #include <stdio.h> #include <stdlib.h> @@ -317,6 +318,42 @@ size_t BLI_strncpy_wchar_from_utf8(wchar_t *__restrict dst_w, const char *__rest /* end wchar_t / utf8 functions */ /* --------------------------------------------------------------------------*/ +/* count columns that character/string occupies, based on wcwidth.c */ + +int BLI_wcwidth(wchar_t ucs) +{ + return mk_wcwidth(ucs); +} + +int BLI_wcswidth(const wchar_t *pwcs, size_t n) +{ + return mk_wcswidth(pwcs, n); +} + +int BLI_str_utf8_char_width(const char *p) +{ + unsigned int unicode = BLI_str_utf8_as_unicode(p); + if (unicode == BLI_UTF8_ERR) + return -1; + + return BLI_wcwidth((wchar_t)unicode); +} + +int BLI_str_utf8_char_width_safe(const char *p) +{ + int columns; + + unsigned int unicode = BLI_str_utf8_as_unicode(p); + if (unicode == BLI_UTF8_ERR) + return 1; + + columns = BLI_wcwidth((wchar_t)unicode); + + return (columns < 0) ? 1 : columns; +} + +/* --------------------------------------------------------------------------*/ + /* copied from glib's gutf8.c, added 'Err' arg */ /* note, glib uses unsigned int for unicode, best we do the same, |