From 3c19b5050040fb74e4e39048f17dce853fdafc08 Mon Sep 17 00:00:00 2001 From: Dusan Popovic Date: Sat, 20 Nov 2021 22:03:30 +0000 Subject: patch 8.2.3635: GTK: composing underline does not show Problem: GTK: composing underline does not show. Solution: Include composing character in pango call. A few more optimizations for ligatures. (Dusan Popovic, closes #9171, closes #9147) --- src/gui_gtk_x11.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) (limited to 'src/gui_gtk_x11.c') diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c index 6135657fa2..40d7712316 100644 --- a/src/gui_gtk_x11.c +++ b/src/gui_gtk_x11.c @@ -5504,7 +5504,6 @@ gui_gtk2_draw_string(int row, int col, char_u *s, int len, int flags) int should_need_pango = FALSE; int slen; int is_ligature; - int next_is_ligature; int is_utf8; char_u backup_ch; @@ -5564,8 +5563,16 @@ gui_gtk2_draw_string(int row, int col, char_u *s, int len, int flags) // substrings byte_sum = 0; cs = s; - // look ahead, 0=ascii 1=unicode/ligatures - needs_pango = ((*cs & 0x80) || gui.ligatures_map[*cs]); + // First char decides starting needs_pango mode, 0=ascii 1=utf8/ligatures. + // Even if it is ligature char, two chars or more make ligature. + // Ascii followed by utf8 is also going trough pango. + is_utf8 = (*cs & 0x80); + is_ligature = gui.ligatures_map[*cs] && (len > 1); + if (is_ligature) + is_ligature = gui.ligatures_map[*(cs + 1)]; + if (!is_utf8 && len > 1) + is_utf8 = (*(cs + 1) & 0x80) != 0; + needs_pango = is_utf8 || is_ligature; // split string into ascii and non-ascii (ligatures + utf-8) substrings, // print glyphs or use Pango @@ -5579,17 +5586,15 @@ gui_gtk2_draw_string(int row, int col, char_u *s, int len, int flags) if (is_ligature && !needs_pango) { if ((slen + 1) < (len - byte_sum)) - { - next_is_ligature = gui.ligatures_map[*(cs + slen + 1)]; - if (!next_is_ligature) - is_ligature = 0; - } + is_ligature = gui.ligatures_map[*(cs + slen + 1)]; else - { is_ligature = 0; - } } is_utf8 = *(cs + slen) & 0x80; + // ascii followed by utf8 could be combining + // if so send it trough pango + if ((!is_utf8) && ((slen + 1) < (len - byte_sum))) + is_utf8 = (*(cs + slen + 1) & 0x80); should_need_pango = (is_ligature || is_utf8); if (needs_pango != should_need_pango) // mode switch break; @@ -5599,7 +5604,7 @@ gui_gtk2_draw_string(int row, int col, char_u *s, int len, int flags) { slen++; // ligature char by char } - else + else if (is_utf8) { if ((*(cs + slen) & 0xC0) == 0x80) { @@ -5633,6 +5638,10 @@ gui_gtk2_draw_string(int row, int col, char_u *s, int len, int flags) slen++; } } + else + { + slen++; + } } else { -- cgit v1.2.3