render: force underlines to be visible

In some cases, the underline position (typically provided by the font,
mind you), end up below the cell, making it visible.

Note that below the cell here means below the line. I.e. the font
provided underline position is below the font provided line height...

Oh well.

Doing this in foot rather than fcft, since other applications
typically don’t have to clip the rendered text.

Closes #503
This commit is contained in:
Daniel Eklöf 2021-05-11 17:40:59 +02:00
parent 9b5330bf29
commit 2ac8509c82
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
2 changed files with 10 additions and 2 deletions

View file

@ -75,8 +75,10 @@
### Deprecated
* **bell** option in `foot.ini`; set actions in **[bell]** section instead.
### Removed
* Buffer damage quirk for Plasma/KWin.
@ -93,6 +95,9 @@
(https://codeberg.org/dnkl/foot/issues/495).
* Assertion when emitting a sixel occupying the entire scrollback
history (https://codeberg.org/dnkl/foot/issues/494).
* Font underlines being positioned below the cell (and thus being
invisible) for certain combinations of fonts and font sizes
(https://codeberg.org/dnkl/foot/issues/503).
### Security

View file

@ -317,11 +317,14 @@ draw_underline(const struct terminal *term, pixman_image_t *pix,
const struct fcft_font *font,
const pixman_color_t *color, int x, int y, int cols)
{
/* Make sure the line isn't positioned below the cell */
int y_ofs = font_baseline(term) - font->underline.position;
y_ofs = min(y_ofs, term->cell_height - font->underline.thickness);
pixman_image_fill_rectangles(
PIXMAN_OP_SRC, pix, color,
1, &(pixman_rectangle16_t){
x, y + font_baseline(term) - font->underline.position,
cols * term->cell_width, font->underline.thickness});
x, y + y_ofs, cols * term->cell_width, font->underline.thickness});
}
static void