diff options
| author | Eli Zaretskii <eliz@gnu.org> | 2017-08-18 11:32:10 +0300 |
|---|---|---|
| committer | Eli Zaretskii <eliz@gnu.org> | 2017-08-18 11:32:10 +0300 |
| commit | a1ed97e5108450853fb983d96e4b14c26393231b (patch) | |
| tree | b933990c11c9173458307ae66a74d9b73d940517 | |
| parent | efb508bbb42a214966483c911f2cfc5a4eba73f5 (diff) | |
| download | emacs-a1ed97e5108450853fb983d96e4b14c26393231b.tar.gz | |
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.
| -rw-r--r-- | src/w32term.c | 26 | ||||
| -rw-r--r-- | 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 <http://www.gnu.org/licenses/>. */ #include <fcntl.h> /* for O_RDWR */ #endif #include <imm.h> +#include <math.h> #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; |
