From a1ed97e5108450853fb983d96e4b14c26393231b Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Fri, 18 Aug 2017 11:32:10 +0300 Subject: [PATCH] Implement HiDPI support for underwave on MS-Windows * src/w32term.c (x_get_scale_factor): New function. (w32_draw_underwave): Use it. * src/xterm.c (x_draw_underwave): Offset the wave starting point to make it identical with original code. --- src/w32term.c | 26 +++++++++++++++++++++++--- src/xterm.c | 2 +- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/w32term.c b/src/w32term.c index 0f7bb9337f6..6d2fa335859 100644 --- a/src/w32term.c +++ b/src/w32term.c @@ -32,6 +32,7 @@ along with GNU Emacs. If not, see . */ #include /* for O_RDWR */ #endif #include +#include #include "coding.h" #include "frame.h" @@ -308,6 +309,20 @@ w32_restore_glyph_string_clip (struct glyph_string *s) } } +static void +x_get_scale_factor(struct w32_display_info *dpyinfo, int *scale_x, int *scale_y) +{ + const int base_res = 96; + + *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. @@ -322,7 +337,12 @@ w32_restore_glyph_string_clip (struct glyph_string *s) static void w32_draw_underwave (struct glyph_string *s, COLORREF color) { - int wave_height = 3, wave_length = 2; + struct w32_display_info *dpyinfo = FRAME_DISPLAY_INFO (s->f); + + int scale_x, scale_y; + x_get_scale_factor (dpyinfo, &scale_x, &scale_y); + + int wave_height = 3 * scale_y, wave_length = 2 * scale_x, thickness = scale_y; int dx, dy, x0, y0, width, x1, y1, x2, y2, odd, xmax; XRectangle wave_clip, string_clip, final_clip; RECT w32_final_clip, w32_string_clip; @@ -331,7 +351,7 @@ w32_draw_underwave (struct glyph_string *s, COLORREF color) dx = wave_length; dy = wave_height - 1; x0 = s->x; - y0 = s->ybase - wave_height + 3; + y0 = s->ybase + wave_height / 2 - scale_y; width = s->width; xmax = x0 + width; @@ -348,7 +368,7 @@ w32_draw_underwave (struct glyph_string *s, COLORREF color) if (!x_intersect_rectangles (&wave_clip, &string_clip, &final_clip)) return; - hp = CreatePen (PS_SOLID, 0, color); + hp = CreatePen (PS_SOLID, thickness, color); oldhp = SelectObject (s->hdc, hp); CONVERT_FROM_XRECT (final_clip, w32_final_clip); w32_set_clip_rectangle (s->hdc, &w32_final_clip); diff --git a/src/xterm.c b/src/xterm.c index 5c1b061566f..2efa70b1dca 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -3519,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 / 2; + y0 = s->ybase + wave_height / 2 - scale_y; width = s->width; xmax = x0 + width; -- 2.39.2