Alexandre Julliard : server: Map region to the window DPI in redraw_region ().
Alexandre Julliard
julliard at winehq.org
Fri Aug 24 13:59:15 CDT 2018
Module: wine
Branch: master
Commit: 8698b600c64931b6fe3ed759227e0d902b6531d5
URL: https://source.winehq.org/git/wine.git/?a=commit;h=8698b600c64931b6fe3ed759227e0d902b6531d5
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Aug 24 12:45:43 2018 +0200
server: Map region to the window DPI in redraw_region().
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
server/region.c | 12 ++++++++++++
server/user.h | 1 +
server/window.c | 27 ++++++++++++++++++++++-----
3 files changed, 35 insertions(+), 5 deletions(-)
diff --git a/server/region.c b/server/region.c
index 0e52f2f..9f377ee 100644
--- a/server/region.c
+++ b/server/region.c
@@ -724,6 +724,18 @@ void mirror_region( const rectangle_t *client_rect, struct region *region )
}
+/* scale a region for a given dpi factor */
+void scale_region( struct region *region, unsigned int dpi_from, unsigned int dpi_to )
+{
+ rectangle_t *rect, *end;
+
+ if (!region->num_rects) return;
+ for (rect = region->rects, end = rect + region->num_rects; rect < end; rect++)
+ scale_dpi_rect( rect, dpi_from, dpi_to );
+ scale_dpi_rect( ®ion->extents, dpi_from, dpi_to );
+}
+
+
/* make a copy of a region; returns dst or NULL on error */
struct region *copy_region( struct region *dst, const struct region *src )
{
diff --git a/server/user.h b/server/user.h
index fe3aa09..eb1b7ce 100644
--- a/server/user.h
+++ b/server/user.h
@@ -135,6 +135,7 @@ extern int is_region_empty( const struct region *region );
extern void get_region_extents( const struct region *region, rectangle_t *rect );
extern void offset_region( struct region *region, int x, int y );
extern void mirror_region( const rectangle_t *client_rect, struct region *region );
+extern void scale_region( struct region *region, unsigned int dpi_from, unsigned int dpi_to );
extern struct region *copy_region( struct region *dst, const struct region *src );
extern struct region *intersect_region( struct region *dst, const struct region *src1,
const struct region *src2 );
diff --git a/server/window.c b/server/window.c
index e45cf38..8d056a2 100644
--- a/server/window.c
+++ b/server/window.c
@@ -649,6 +649,15 @@ static void map_dpi_rect( struct window *win, rectangle_t *rect, unsigned int fr
scale_dpi_rect( rect, from, to );
}
+/* map a region between different DPI scaling levels */
+static void map_dpi_region( struct window *win, struct region *region, unsigned int from, unsigned int to )
+{
+ if (!from) from = get_monitor_dpi( win );
+ if (!to) to = get_monitor_dpi( win );
+ if (from == to) return;
+ scale_region( region, from, to );
+}
+
/* check if window and all its ancestors are visible */
static int is_visible( const struct window *win )
{
@@ -1388,7 +1397,7 @@ static void validate_parents( struct window *child )
/* add/subtract a region (in client coordinates) to the update region of the window */
static void redraw_window( struct window *win, struct region *region, int frame, unsigned int flags )
{
- struct region *tmp;
+ struct region *child_rgn, *tmp;
struct window *child;
if (flags & RDW_INVALIDATE)
@@ -1450,11 +1459,19 @@ static void redraw_window( struct window *win, struct region *region, int frame,
LIST_FOR_EACH_ENTRY( child, &win->children, struct window, entry )
{
if (!(child->style & WS_VISIBLE)) continue;
- if (!rect_in_region( tmp, &child->window_rect )) continue;
- offset_region( tmp, -child->client_rect.left, -child->client_rect.top );
- redraw_window( child, tmp, 1, flags );
- offset_region( tmp, child->client_rect.left, child->client_rect.top );
+ if (!(child_rgn = create_empty_region())) continue;
+ if (copy_region( child_rgn, tmp ))
+ {
+ map_dpi_region( child, child_rgn, win->dpi, child->dpi );
+ if (rect_in_region( child_rgn, &child->window_rect ))
+ {
+ offset_region( child_rgn, -child->client_rect.left, -child->client_rect.top );
+ redraw_window( child, child_rgn, 1, flags );
+ }
+ }
+ free_region( child_rgn );
}
+
free_region( tmp );
}
More information about the wine-cvs
mailing list