render: fix underline/strikeout positioning

There were two errors:

* We subtracted half the line width instead of adding it to the
  baseline

* We rounded the line positioning and thickness before the positioning
  calculation. In particular, rounding the thickness before using it
  to adjust the position was wrong. Now we round just before the
  pixman call.
This commit is contained in:
Daniel Eklöf 2019-11-30 14:53:22 +01:00
parent 7be98291e1
commit 90bfcc1fbd
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
3 changed files with 21 additions and 19 deletions

View file

@ -105,12 +105,13 @@ draw_underline(const struct terminal *term, pixman_image_t *pix,
const pixman_color_t *color, int x, int y, int cols)
{
int baseline = y + font_baseline(term);
int width = font->underline.thickness;
int y_under = baseline - font->underline.position - width / 2;
double width = font->underline.thickness;
int y_under = floor(baseline - font->underline.position + width / 2.);
pixman_image_fill_rectangles(
PIXMAN_OP_SRC, pix, color,
1, &(pixman_rectangle16_t){x, y_under, cols * term->cell_width, width});
1, &(pixman_rectangle16_t){
x, y_under, cols * term->cell_width, round(max(1., width))});
}
static void
@ -119,12 +120,13 @@ draw_strikeout(const struct terminal *term, pixman_image_t *pix,
const pixman_color_t *color, int x, int y, int cols)
{
int baseline = y + font_baseline(term);
int width = font->strikeout.thickness;
int y_strike = baseline - font->strikeout.position - width / 2;
double width = font->strikeout.thickness;
int y_strike = floor(baseline - font->strikeout.position + width / 2.);
pixman_image_fill_rectangles(
PIXMAN_OP_SRC, pix, color,
1, &(pixman_rectangle16_t){x, y_strike, cols * term->cell_width, width});
1, &(pixman_rectangle16_t){
x, y_strike, cols * term->cell_width, round(max(1., width))});
}
static bool