From bc71dbc78a455b46a91619bcd38af45e4e9831fb Mon Sep 17 00:00:00 2001 From: Stephen Pegoraro Date: Sat, 29 Jul 2017 11:12:03 +0800 Subject: [PATCH] Implement HiDPI support 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. --- src/xterm.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/xterm.c b/src/xterm.c index a214cd8103..5476c22a0b 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,15 @@ x_draw_stretch_glyph_string (struct glyph_string *s) s->background_filled_p = true; } +static int x_get_scale_factor(Display *disp) +{ + struct x_display_info * dpyinfo = x_display_info_for_display (disp); + if (!dpyinfo) + emacs_abort (); + + return floor(dpyinfo->resy / 96); +} + /* Draw a wavy line under S. The wave fills wave_height pixels from y0. @@ -3485,11 +3492,13 @@ 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_get_scale_factor (s->display); + int wave_height = 3 * scale, wave_length = 2 * scale, thickness = scale; + #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 +3510,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 +3544,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.13.3