render: optionally enable heuristics that deal with private usage area chars

Try to detect double-width *glyphs* for single-width *characters*, and
allow them to overflow into the next cell.

This is only done for single-width chars with a glyph width that is at
least 1.5 cells wide, but at most 3 cells.

The feature is gated by the new
‘tweak.allow-overflowing-double-width-glyphs’, and is disabled by
default.

Closes #116
This commit is contained in:
Daniel Eklöf 2020-09-03 17:37:44 +02:00
parent bb8d9378c9
commit b71016c25d
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
5 changed files with 52 additions and 1 deletions

View file

@ -433,6 +433,31 @@ render_cell(struct terminal *term, pixman_image_t *pix,
const int cols_left = term->cols - col;
int cell_cols = glyph != NULL ? max(1, min(glyph->cols, cols_left)) : 1;
/*
* Hack!
*
* Deal with double-width glyphs for which wcwidth() returns
* 1. Typically Unicode private usage area characters,
* e.g. powerline, or nerd hack fonts.
*
* Users can enable a tweak option that lets this glyphs
* overflow/bleed into the neighbouring cell.
*
* We only apply this workaround if:
* - the user has explicitly enabled this feature
* - the *character* width is 1
* - the *glyph* width is at least 1.5 cells
* - the *glyph* width is less than 3 cells
*/
if (term->conf->tweak.allow_overflowing_double_width_glyphs &&
glyph != NULL &&
glyph->cols == 1 &&
glyph->width >= term->cell_width * 15 / 10 &&
glyph->width < 3 * term->cell_width)
{
cell_cols = min(2, cols_left);
}
pixman_region32_t clip;
pixman_region32_init_rect(
&clip, x, y,