From 11a75a65d705bf1d732ec6e3f2ee904f54cbce9c Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Thu, 14 Apr 2022 14:11:09 +0200 Subject: [PATCH] win32u: Introduce NtUserMapWindowPoints. And use it in user32. Signed-off-by: Jacek Caban Signed-off-by: Huw Davies Signed-off-by: Alexandre Julliard --- dlls/user32/winpos.c | 22 ++-------------------- dlls/win32u/window.c | 7 +++++++ include/ntuser.h | 18 ++++++++++++++++++ 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/dlls/user32/winpos.c b/dlls/user32/winpos.c index c38e0fabb1c..14511c22d9d 100644 --- a/dlls/user32/winpos.c +++ b/dlls/user32/winpos.c @@ -356,27 +356,9 @@ static BOOL WINPOS_GetWinOffset( HWND hwndFrom, HWND hwndTo, BOOL *mirrored, POI /******************************************************************* * MapWindowPoints (USER32.@) */ -INT WINAPI MapWindowPoints( HWND hwndFrom, HWND hwndTo, LPPOINT lppt, UINT count ) +INT WINAPI MapWindowPoints( HWND hwnd_from, HWND hwnd_to, POINT *points, UINT count ) { - BOOL mirrored; - POINT offset; - UINT i; - - if (!WINPOS_GetWinOffset( hwndFrom, hwndTo, &mirrored, &offset )) return 0; - - for (i = 0; i < count; i++) - { - lppt[i].x += offset.x; - lppt[i].y += offset.y; - if (mirrored) lppt[i].x = -lppt[i].x; - } - if (mirrored && count == 2) /* special case for rectangle */ - { - int tmp = lppt[0].x; - lppt[0].x = lppt[1].x; - lppt[1].x = tmp; - } - return MAKELONG( LOWORD(offset.x), LOWORD(offset.y) ); + return NtUserMapWindowPoints( hwnd_from, hwnd_to, points, count ); } diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c index eefc48a7d2d..3ecbc043fc8 100644 --- a/dlls/win32u/window.c +++ b/dlls/win32u/window.c @@ -5151,6 +5151,13 @@ ULONG_PTR WINAPI NtUserCallHwndParam( HWND hwnd, DWORD_PTR param, DWORD code ) case NtUserCallHwndParam_KillSystemTimer: return kill_system_timer( hwnd, param ); + case NtUserCallHwndParam_MapWindowPoints: + { + struct map_window_points_params *params = (void *)param; + return map_window_points( hwnd, params->hwnd_to, params->points, params->count, + get_thread_dpi() ); + } + case NtUserCallHwndParam_MirrorRgn: return mirror_window_region( hwnd, UlongToHandle(param) ); diff --git a/include/ntuser.h b/include/ntuser.h index d8228a521e2..41abc1e2e14 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -852,6 +852,7 @@ enum NtUserCallHwndParam_GetWindowWord, NtUserCallHwndParam_IsChild, NtUserCallHwndParam_KillSystemTimer, + NtUserCallHwndParam_MapWindowPoints, NtUserCallHwndParam_MirrorRgn, NtUserCallHwndParam_MonitorFromWindow, NtUserCallHwndParam_ScreenToClient, @@ -968,6 +969,23 @@ static inline BOOL NtUserKillSystemTimer( HWND hwnd, UINT_PTR id ) return NtUserCallHwndParam( hwnd, id, NtUserCallHwndParam_KillSystemTimer ); } +struct map_window_points_params +{ + HWND hwnd_to; + POINT *points; + UINT count; +}; + +static inline int NtUserMapWindowPoints( HWND hwnd_from, HWND hwnd_to, POINT *points, UINT count ) +{ + struct map_window_points_params params; + params.hwnd_to = hwnd_to; + params.points = points; + params.count = count; + return NtUserCallHwndParam( hwnd_from, (UINT_PTR)¶ms, + NtUserCallHwndParam_MapWindowPoints ); +} + static inline BOOL NtUserMirrorRgn( HWND hwnd, HRGN hrgn ) { return NtUserCallHwndParam( hwnd, HandleToUlong(hrgn), NtUserCallHwndParam_MirrorRgn );