diff --git a/dlls/gdi32/clipping.c b/dlls/gdi32/clipping.c index 4e294b6a91f..a942fe19cf8 100644 --- a/dlls/gdi32/clipping.c +++ b/dlls/gdi32/clipping.c @@ -385,7 +385,7 @@ INT WINAPI GetClipRgn( HDC hdc, HRGN hRgn ) { INT ret = -1; DC * dc; - if (hRgn && (dc = get_dc_ptr( hdc ))) + if ((dc = get_dc_ptr( hdc ))) { if( dc->hClipRgn ) { diff --git a/dlls/gdi32/tests/clipping.c b/dlls/gdi32/tests/clipping.c index 06cb22a03c5..0bca17908eb 100644 --- a/dlls/gdi32/tests/clipping.c +++ b/dlls/gdi32/tests/clipping.c @@ -265,8 +265,96 @@ static void test_ExtCreateRegion(void) DeleteObject(hrgn); } +static void test_GetClipRgn(void) +{ + HDC hdc; + HRGN hrgn, hrgn2, hrgn3, hrgn4; + int ret; + + /* Test calling GetClipRgn with NULL device context and region handles. */ + ret = GetClipRgn(NULL, NULL); + ok(ret == -1, "Expected GetClipRgn to return -1, got %d\n", ret); + + hdc = GetDC(NULL); + ok(hdc != NULL, "Expected GetDC to return a valid device context handle\n"); + + /* Test calling GetClipRgn with a valid device context and NULL region. */ + ret = GetClipRgn(hdc, NULL); + ok(ret == 0 || + ret == -1 /* Win9x */, + "Expected GetClipRgn to return 0, got %d\n", ret); + + /* Initialize the test regions. */ + hrgn = CreateRectRgn(100, 100, 100, 100); + ok(hrgn != NULL, + "Expected CreateRectRgn to return a handle to a new rectangular region\n"); + + hrgn2 = CreateRectRgn(1, 2, 3, 4); + ok(hrgn2 != NULL, + "Expected CreateRectRgn to return a handle to a new rectangular region\n"); + + hrgn3 = CreateRectRgn(1, 2, 3, 4); + ok(hrgn3 != NULL, + "Expected CreateRectRgn to return a handle to a new rectangular region\n"); + + hrgn4 = CreateRectRgn(1, 2, 3, 4); + ok(hrgn4 != NULL, + "Expected CreateRectRgn to return a handle to a new rectangular region\n"); + + /* Try getting a clipping region from the device context + * when the device context's clipping region isn't set. */ + ret = GetClipRgn(hdc, hrgn2); + ok(ret == 0, "Expected GetClipRgn to return 0, got %d\n", ret); + + /* The region passed to GetClipRgn should be unchanged. */ + ret = EqualRgn(hrgn2, hrgn3); + ok(ret == 1, + "Expected EqualRgn to compare the two regions as equal, got %d\n", ret); + + /* Try setting and getting back a clipping region. */ + ret = SelectClipRgn(hdc, hrgn); + ok(ret == NULLREGION, + "Expected SelectClipRgn to return NULLREGION, got %d\n", ret); + + /* Passing a NULL region handle when the device context + * has a clipping region results in an error. */ + ret = GetClipRgn(hdc, NULL); + ok(ret == -1, "Expected GetClipRgn to return -1, got %d\n", ret); + + ret = GetClipRgn(hdc, hrgn2); + ok(ret == 1, "Expected GetClipRgn to return 1, got %d\n", ret); + + ret = EqualRgn(hrgn, hrgn2); + ok(ret == 1, + "Expected EqualRgn to compare the two regions as equal, got %d\n", ret); + + /* Try unsetting and then query the clipping region. */ + ret = SelectClipRgn(hdc, NULL); + ok(ret == SIMPLEREGION, + "Expected SelectClipRgn to return SIMPLEREGION, got %d\n", ret); + + ret = GetClipRgn(hdc, NULL); + ok(ret == 0 || + ret == -1 /* Win9x */, + "Expected GetClipRgn to return 0, got %d\n", ret); + + ret = GetClipRgn(hdc, hrgn3); + ok(ret == 0, "Expected GetClipRgn to return 0, got %d\n", ret); + + ret = EqualRgn(hrgn3, hrgn4); + ok(ret == 1, + "Expected EqualRgn to compare the two regions as equal, got %d\n", ret); + + DeleteObject(hrgn4); + DeleteObject(hrgn3); + DeleteObject(hrgn2); + DeleteObject(hrgn); + ReleaseDC(NULL, hdc); +} + START_TEST(clipping) { test_GetRandomRgn(); test_ExtCreateRegion(); + test_GetClipRgn(); }