Daniel Lehman : gdi32: Use HandleToULong inline function to convert handle to index instead of casting .
Alexandre Julliard
julliard at winehq.org
Fri Oct 12 11:37:44 CDT 2012
Module: wine
Branch: master
Commit: ea6e0a833b86cbc1b0b518263d529dc4c32f9bcc
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ea6e0a833b86cbc1b0b518263d529dc4c32f9bcc
Author: Daniel Lehman <dlehman at esri.com>
Date: Mon Apr 16 14:53:43 2012 -0700
gdi32: Use HandleToULong inline function to convert handle to index instead of casting.
---
dlls/gdi32/gdiobj.c | 4 ++--
dlls/gdi32/tests/gdiobj.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 46 insertions(+), 2 deletions(-)
diff --git a/dlls/gdi32/gdiobj.c b/dlls/gdi32/gdiobj.c
index 14ac692..06279dd 100644
--- a/dlls/gdi32/gdiobj.c
+++ b/dlls/gdi32/gdiobj.c
@@ -699,7 +699,7 @@ void *free_gdi_handle( HGDIOBJ handle )
GDIOBJHDR *object = NULL;
int i;
- i = ((ULONG_PTR)handle >> 2) - FIRST_LARGE_HANDLE;
+ i = (HandleToULong(handle) >> 2) - FIRST_LARGE_HANDLE;
if (i >= 0 && i < MAX_LARGE_HANDLES)
{
EnterCriticalSection( &gdi_section );
@@ -732,7 +732,7 @@ void *GDI_GetObjPtr( HGDIOBJ handle, WORD type )
EnterCriticalSection( &gdi_section );
- i = ((UINT_PTR)handle >> 2) - FIRST_LARGE_HANDLE;
+ i = (HandleToULong(handle) >> 2) - FIRST_LARGE_HANDLE;
if (i >= 0 && i < MAX_LARGE_HANDLES)
{
ptr = large_handles[i];
diff --git a/dlls/gdi32/tests/gdiobj.c b/dlls/gdi32/tests/gdiobj.c
index c854311..3b9f734 100644
--- a/dlls/gdi32/tests/gdiobj.c
+++ b/dlls/gdi32/tests/gdiobj.c
@@ -319,10 +319,54 @@ static void test_region(void)
DeleteObject(hrgn);
}
+static void test_handles_on_win64(void)
+{
+ int i;
+ BOOL ret;
+ DWORD type;
+ HRGN hrgn, hrgn_test;
+
+ static const struct
+ {
+ ULONG high;
+ ULONG low;
+ BOOL ret;
+ } cases[] =
+ {
+ { 0x00000000, 0x00000000, TRUE },
+ { 0x00000000, 0x0000ffe0, FALSE }, /* just over MAX_LARGE_HANDLES */
+ { 0x00000000, 0x0000ffb0, FALSE }, /* just under MAX_LARGE_HANDLES */
+ { 0xffffffff, 0xffff0000, FALSE },
+ { 0xffffffff, 0x00000000, TRUE },
+ { 0xdeadbeef, 0x00000000, TRUE },
+ { 0xcccccccc, 0xcccccccc, FALSE }
+ };
+
+ if (sizeof(void*) != 8)
+ return;
+
+ for (i = 0; i < sizeof(cases)/sizeof(cases[0]); i++)
+ {
+ hrgn = CreateRectRgn(10, 10, 20, 20);
+ hrgn_test = (HRGN)(ULONG_PTR)((ULONG_PTR)hrgn | ((ULONGLONG)cases[i].high << 32) | cases[i].low);
+ type = GetObjectType( hrgn_test );
+ if (cases[i].ret)
+ ok( type == OBJ_REGION, "wrong type %u\n", type );
+ else
+ ok( type == 0, "wrong type %u\n", type );
+ ret = DeleteObject(hrgn_test);
+ ok( cases[i].ret == ret, "DeleteObject should return %s (%p)\n",
+ cases[i].ret ? "TRUE" : "FALSE", hrgn_test);
+ /* actually free it if above is expected to fail */
+ if (!ret) DeleteObject(hrgn);
+ }
+}
+
START_TEST(gdiobj)
{
test_gdi_objects();
test_thread_objects();
test_GetCurrentObject();
test_region();
+ test_handles_on_win64();
}
More information about the wine-cvs
mailing list