render: fix double-width glyphs glitching when surrounding cells overflow into it

If cells overflowed (for example, by using an italic font that isn’t
truly monospaced) into a double-width glyph (that itself is *not*
overflowing), then the double-width glyph would glitch when being
rendered; typically the second half of it would occasionally
disappear.

This happened because we tried to rasterize the second cell of the
double-width glyph. This cell contains a special “spacer”
value. Rasterizing that typically results the font’s “not available”
glyph.

If _that_ glyph overflows, things broke; we’d later end up forcing a
re-render of it (thus erasing half the double-width glyph). But since
the double-width glyph _itself_ doesn’t overflow, _it_ wouldn’t be
re-rendered, leaving it half erased.

Fix by recognizing spacer cells, and not trying to rasterize them (set
glyph count to 0, and cell count to 1).

Closes #1256
This commit is contained in:
Daniel Eklöf 2023-01-15 14:42:48 +01:00
parent d1220aebfd
commit a9298959a1
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
2 changed files with 13 additions and 6 deletions

View file

@ -646,17 +646,21 @@ render_cell(struct terminal *term, pixman_image_t *pix,
}
}
if (single == NULL && grapheme == NULL) {
xassert(base != 0);
single = fcft_rasterize_char_utf32(font, base, term->font_subpixel);
if (single == NULL) {
if (unlikely(base >= CELL_SPACER)) {
glyph_count = 0;
cell_cols = 1;
} else {
glyph_count = 1;
glyphs = &single;
xassert(base != 0);
single = fcft_rasterize_char_utf32(font, base, term->font_subpixel);
if (single == NULL) {
glyph_count = 0;
cell_cols = 1;
} else {
glyph_count = 1;
glyphs = &single;
cell_cols = single->cols;
}
}
}
}