From 9e4be5467cca9f8ce9bf2c8c97c6198c113c2641 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Wed, 23 Feb 2022 13:39:47 +0100 Subject: [PATCH] win32u: Move NtUserGetIconSize implementation from user32. Signed-off-by: Jacek Caban Signed-off-by: Huw Davies Signed-off-by: Alexandre Julliard --- dlls/user32/cursoricon.c | 13 +++---------- dlls/win32u/cursoricon.c | 35 +++++++++++++++++++++++++++++++++++ dlls/win32u/syscall.c | 1 + dlls/win32u/win32u.spec | 2 +- dlls/wow64win/syscall.h | 1 + dlls/wow64win/user.c | 10 ++++++++++ include/ntuser.h | 1 + 7 files changed, 52 insertions(+), 11 deletions(-) diff --git a/dlls/user32/cursoricon.c b/dlls/user32/cursoricon.c index e97d4f1e0d9..26c82c2c70c 100644 --- a/dlls/user32/cursoricon.c +++ b/dlls/user32/cursoricon.c @@ -334,16 +334,9 @@ static int DIB_GetBitmapInfo( const BITMAPINFOHEADER *header, LONG *width, */ BOOL get_icon_size( HICON handle, SIZE *size ) { - struct cursoricon_object *info; - struct cursoricon_frame *frame; - - if (!(info = get_icon_ptr( handle ))) return FALSE; - frame = get_icon_frame( info, 0 ); - size->cx = frame->width; - size->cy = frame->height; - release_icon_frame( info, frame); - release_user_handle_ptr( info ); - return TRUE; + BOOL ret = NtUserGetIconSize( handle, 0, &size->cx, &size->cy ); + if (ret) size->cy /= 2; + return ret; } struct png_wrapper diff --git a/dlls/win32u/cursoricon.c b/dlls/win32u/cursoricon.c index c83f3790c11..f0a9c1b0609 100644 --- a/dlls/win32u/cursoricon.c +++ b/dlls/win32u/cursoricon.c @@ -212,6 +212,22 @@ HICON alloc_cursoricon_handle( BOOL is_icon ) return handle; } +static struct cursoricon_object *get_icon_frame_ptr( HICON handle, UINT step ) +{ + struct cursoricon_object *obj, *ret; + + if (!(obj = get_icon_ptr( handle ))) return NULL; + if (!obj->is_ani) return obj; + if (step >= obj->ani.num_steps) + { + release_user_handle_ptr( obj ); + return NULL; + } + ret = get_icon_ptr( obj->ani.frames[step] ); + release_user_handle_ptr( obj ); + return ret; +} + static BOOL free_icon_handle( HICON handle ) { struct cursoricon_object *obj = free_user_handle( handle, NTUSER_OBJ_ICON ); @@ -403,3 +419,22 @@ HICON WINAPI NtUserFindExistingCursorIcon( UNICODE_STRING *module, UNICODE_STRIN user_unlock(); return ret; } + +/*********************************************************************** + * NtUserGetIconSize (win32u.@) + */ +BOOL WINAPI NtUserGetIconSize( HICON handle, UINT step, LONG *width, LONG *height ) +{ + struct cursoricon_object *obj; + + if (!(obj = get_icon_frame_ptr( handle, step ))) + { + SetLastError( ERROR_INVALID_CURSOR_HANDLE ); + return FALSE; + } + + *width = obj->frame.width; + *height = obj->frame.height * 2; + release_user_handle_ptr( obj ); + return TRUE; +} diff --git a/dlls/win32u/syscall.c b/dlls/win32u/syscall.c index b4255449b83..54d9d6ea754 100644 --- a/dlls/win32u/syscall.c +++ b/dlls/win32u/syscall.c @@ -117,6 +117,7 @@ static void * const syscalls[] = NtUserGetDoubleClickTime, NtUserGetDpiForMonitor, NtUserGetForegroundWindow, + NtUserGetIconSize, NtUserGetKeyState, NtUserGetKeyboardLayout, NtUserGetKeyboardLayoutName, diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec index 20ee7a3cebd..dddc3a5b187 100644 --- a/dlls/win32u/win32u.spec +++ b/dlls/win32u/win32u.spec @@ -935,7 +935,7 @@ @ stub NtUserGetHDevName @ stub NtUserGetHimetricScaleFactorFromPixelLocation @ stub NtUserGetIconInfo -@ stub NtUserGetIconSize +@ stdcall -syscall NtUserGetIconSize(long long ptr ptr) @ stub NtUserGetImeHotKey @ stub NtUserGetImeInfoEx @ stub NtUserGetInputContainerId diff --git a/dlls/wow64win/syscall.h b/dlls/wow64win/syscall.h index 0141a216ee9..0908c2db019 100644 --- a/dlls/wow64win/syscall.h +++ b/dlls/wow64win/syscall.h @@ -104,6 +104,7 @@ SYSCALL_ENTRY( NtUserGetDoubleClickTime ) \ SYSCALL_ENTRY( NtUserGetDpiForMonitor ) \ SYSCALL_ENTRY( NtUserGetForegroundWindow ) \ + SYSCALL_ENTRY( NtUserGetIconSize ) \ SYSCALL_ENTRY( NtUserGetKeyState ) \ SYSCALL_ENTRY( NtUserGetKeyboardLayout ) \ SYSCALL_ENTRY( NtUserGetKeyboardLayoutName ) \ diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index cd345429af7..6b50f545948 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -279,6 +279,16 @@ NTSTATUS WINAPI wow64_NtUserFindExistingCursorIcon( UINT *args ) return HandleToUlong( ret ); } +NTSTATUS WINAPI wow64_NtUserGetIconSize( UINT *args ) +{ + HICON handle = get_handle( &args ); + UINT step = get_ulong( &args ); + LONG *width = get_ptr( &args ); + LONG *height = get_ptr( &args ); + + return NtUserGetIconSize( handle, step, width, height ); +} + NTSTATUS WINAPI wow64_NtUserAttachThreadInput( UINT *args ) { DWORD from = get_ulong( &args ); diff --git a/include/ntuser.h b/include/ntuser.h index f385f91f8ce..6c6e6518297 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -204,6 +204,7 @@ LONG WINAPI NtUserGetDisplayConfigBufferSizes( UINT32 flags, UINT32 *num_path UINT WINAPI NtUserGetDoubleClickTime(void); BOOL WINAPI NtUserGetDpiForMonitor( HMONITOR monitor, UINT type, UINT *x, UINT *y ); HWND WINAPI NtUserGetForegroundWindow(void); +BOOL WINAPI NtUserGetIconSize( HICON handle, UINT step, LONG *width, LONG *height ); INT WINAPI NtUserGetKeyNameText( LONG lparam, WCHAR *buffer, INT size ); SHORT WINAPI NtUserGetKeyState( INT vkey ); HKL WINAPI NtUserGetKeyboardLayout( DWORD thread_id );