From efb508bbb42a214966483c911f2cfc5a4eba73f5 Mon Sep 17 00:00:00 2001 From: Stephen Pegoraro Date: Fri, 18 Aug 2017 11:02:40 +0300 Subject: [PATCH] Support HiDPI displays for wave style underlines * src/xterm.c (x_draw_underwave): Compute height, length and thickness based on scale factor. (x_get_scale_factor): New function. Copyright-paperwork-exempt: yes --- src/xterm.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/xterm.c b/src/xterm.c index a214cd81031..5c1b061566f 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -23,9 +23,7 @@ along with GNU Emacs. If not, see . */ #include #include #include -#ifdef USE_CAIRO #include -#endif #include "lisp.h" #include "blockinput.h" @@ -3475,6 +3473,21 @@ x_draw_stretch_glyph_string (struct glyph_string *s) s->background_filled_p = true; } +static void +x_get_scale_factor(Display *disp, int *scale_x, int *scale_y) +{ + const int base_res = 96; + struct x_display_info * dpyinfo = x_display_info_for_display (disp); + + *scale_x = *scale_y = 1; + + if (dpyinfo) + { + *scale_x = floor (dpyinfo->resx / base_res); + *scale_y = floor (dpyinfo->resy / base_res); + } +} + /* Draw a wavy line under S. The wave fills wave_height pixels from y0. @@ -3485,11 +3498,16 @@ x_draw_stretch_glyph_string (struct glyph_string *s) wave_height = 3 | * * * * */ - static void x_draw_underwave (struct glyph_string *s) { - int wave_height = 3, wave_length = 2; + /* Adjust for scale/HiDPI. */ + int scale_x, scale_y; + + x_get_scale_factor (s->display, &scale_x, &scale_y); + + int wave_height = 3 * scale_y, wave_length = 2 * scale_x, thickness = scale_y; + #ifdef USE_CAIRO x_draw_horizontal_wave (s->f, s->gc, s->x, s->ybase - wave_height + 3, s->width, wave_height, wave_length); @@ -3501,7 +3519,7 @@ x_draw_underwave (struct glyph_string *s) dx = wave_length; dy = wave_height - 1; x0 = s->x; - y0 = s->ybase - wave_height + 3; + y0 = s->ybase + wave_height / 2; width = s->width; xmax = x0 + width; @@ -3535,6 +3553,8 @@ x_draw_underwave (struct glyph_string *s) while (x1 <= xmax) { + XSetLineAttributes (s->display, s->gc, thickness, LineSolid, CapButt, + JoinRound); XDrawLine (s->display, FRAME_X_DRAWABLE (s->f), s->gc, x1, y1, x2, y2); x1 = x2, y1 = y2; x2 += dx, y2 = y0 + odd*dy; -- 2.39.2