From 5792e77239c43aea0afc21b2df96153ba31c5399 Mon Sep 17 00:00:00 2001 From: Irie Shinsuke Date: Tue, 12 Mar 2013 07:25:53 +0000 Subject: 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() --- .../blender/editors/space_console/console_draw.c | 42 ++++++++++++++-------- 1 file changed, 28 insertions(+), 14 deletions(-) (limited to 'source/blender/editors/space_console') diff --git a/source/blender/editors/space_console/console_draw.c b/source/blender/editors/space_console/console_draw.c index 73747239255..cb191d0b15e 100644 --- a/source/blender/editors/space_console/console_draw.c +++ b/source/blender/editors/space_console/console_draw.c @@ -150,6 +150,26 @@ static int console_textview_line_get(struct TextViewContext *tvc, const char **l return 1; } +static void console_cursor_wrap_offset(const char *str, int width, int *row, int *column, const char *end) +{ + int col; + + for (; *str; str += BLI_str_utf8_size_safe(str)) { + col = BLI_str_utf8_char_width_safe(str); + + if (*column + col > width) { + (*row)++; + *column = 0; + } + + if (end && str >= end) + break; + + *column += col; + } + return; +} + static int console_textview_line_color(struct TextViewContext *tvc, unsigned char fg[3], unsigned char UNUSED(bg[3])) { ConsoleLine *cl_iter = (ConsoleLine *)tvc->iter; @@ -158,24 +178,18 @@ static int console_textview_line_color(struct TextViewContext *tvc, unsigned cha if (tvc->iter_index == 0) { const SpaceConsole *sc = (SpaceConsole *)tvc->arg1; const ConsoleLine *cl = (ConsoleLine *)sc->history.last; - const int prompt_len = BLI_strlen_utf8(sc->prompt); - const int cursor_loc = BLI_strnlen_utf8(cl->line, cl->cursor) + prompt_len; - const int line_len = BLI_strlen_utf8(cl->line) + prompt_len; + int offl = 0, offc = 0; int xy[2] = {CONSOLE_DRAW_MARGIN, CONSOLE_DRAW_MARGIN}; int pen[2]; xy[1] += tvc->lheight / 6; - /* account for wrapping */ - if (line_len < tvc->console_width) { - /* simple case, no wrapping */ - pen[0] = tvc->cwidth * cursor_loc; - pen[1] = -2; - } - else { - /* wrap */ - pen[0] = tvc->cwidth * (cursor_loc % tvc->console_width); - pen[1] = -2 + (((line_len / tvc->console_width) - (cursor_loc / tvc->console_width)) * tvc->lheight); - } + console_cursor_wrap_offset(sc->prompt, tvc->console_width, &offl, &offc, NULL); + console_cursor_wrap_offset(cl->line, tvc->console_width, &offl, &offc, cl->line + cl->cursor); + pen[0] = tvc->cwidth * offc; + pen[1] = -2 - tvc->lheight * offl; + + console_cursor_wrap_offset(cl->line + cl->cursor, tvc->console_width, &offl, &offc, NULL); + pen[1] += tvc->lheight * offl; /* cursor */ UI_GetThemeColor3ubv(TH_CONSOLE_CURSOR, fg); -- cgit v1.2.3