From: Conor McCarthy cmccarthy@codeweavers.com
To eliminate rounding errors, and for consistency with cursor mapping. --- dlls/win32u/sysparams.c | 52 +++++++++++------------------------------ 1 file changed, 13 insertions(+), 39 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 8f28c910ecd..34df99f1238 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -1997,50 +1997,24 @@ static void monitor_get_map_info( struct monitor *monitor, UINT dpi_from, MONITO info->dpi_ratio_to = (float)dpi_to / dpi_from; }
-/* display_lock must be held */ -static RECT map_monitor_rect( struct monitor *monitor, RECT rect, UINT dpi_from, MONITOR_DPI_TYPE type_from, - UINT dpi_to, MONITOR_DPI_TYPE type_to ) +static RECT map_monitor_rect_from_info( RECT rect, const struct monitor_map_info *info ) { - UINT x, y; - - assert( type_from != type_to ); + POINT *left_top = (POINT *)&rect.left, *right_bottom = (POINT *)&rect.right;
- if (monitor->source) - { - DEVMODEW current_mode = {.dmSize = sizeof(DEVMODEW)}, *mode_from, *mode_to; - UINT num, den, dpi; + *left_top = map_monitor_point( *left_top, info ); + *right_bottom = map_monitor_point( *right_bottom, info );
- source_get_current_settings( monitor->source, ¤t_mode ); - - dpi = monitor_get_dpi( monitor, MDT_DEFAULT, &x, &y ); - if (!dpi_from) dpi_from = dpi; - if (!dpi_to) dpi_to = dpi; - - if (type_from == MDT_RAW_DPI) - { - monitor_virt_to_raw_ratio( monitor, &den, &num ); - mode_from = &monitor->source->physical; - mode_to = ¤t_mode; - } - else - { - monitor_virt_to_raw_ratio( monitor, &num, &den ); - mode_from = ¤t_mode; - mode_to = &monitor->source->physical; - } + return rect; +}
- rect = map_dpi_rect( rect, dpi_from, dpi * 2 ); - OffsetRect( &rect, -mode_from->dmPosition.x * 2 - mode_from->dmPelsWidth, - -mode_from->dmPosition.y * 2 - mode_from->dmPelsHeight ); - rect = map_dpi_rect( rect, den, num ); - OffsetRect( &rect, mode_to->dmPosition.x * 2 + mode_to->dmPelsWidth, - mode_to->dmPosition.y * 2 + mode_to->dmPelsHeight ); - return map_dpi_rect( rect, dpi * 2, dpi_to ); - } +/* display_lock must be held */ +static RECT map_monitor_rect( struct monitor *monitor, RECT rect, UINT dpi_from, MONITOR_DPI_TYPE type_from, + UINT dpi_to, MONITOR_DPI_TYPE type_to ) +{ + struct monitor_map_info info;
- if (!dpi_from) dpi_from = monitor_get_dpi( monitor, type_from, &x, &y ); - if (!dpi_to) dpi_to = monitor_get_dpi( monitor, type_to, &x, &y ); - return map_dpi_rect( rect, dpi_from, dpi_to ); + monitor_get_map_info( monitor, dpi_from, type_from, dpi_to, type_to, &info ); + return map_monitor_rect_from_info( rect, &info ); }
/* display_lock must be held */