INT Test_NtUserScrollDC(PTESTINFO pti) { HWND hWnd; HDC hDC; HRGN hRgn, hTmpRgn; RECT rcScroll, rcClip, rcUpdate; RECT rect = {0,0,100,100}; INT Result; hWnd = CreateWindowA("BUTTON", "Test", BS_PUSHBUTTON | WS_VISIBLE, 0, 0, 50, 100, NULL, NULL, g_hInstance, 0); ASSERT(hWnd); RedrawWindow(hWnd, &rect, NULL, RDW_UPDATENOW); hDC = GetDC(hWnd); ASSERT(hDC); hRgn = CreateRectRgn(0,0,10,10); /* Test inverted clip rect */ rcScroll.left = 0; rcScroll.top = 25; rcScroll.right = 100; rcScroll.bottom = 40; rcClip.left = 0; rcClip.top = 35; rcClip.right = -70; rcClip.bottom = -1000; SetLastError(ERROR_SUCCESS); Result = NtUserScrollDC(hDC, 10, 20, &rcScroll, &rcClip, hRgn, &rcUpdate); RTEST(Result == 1); RTEST(GetLastError() == ERROR_SUCCESS); /* Test inverted scroll rect */ rcScroll.left = 0; rcScroll.top = 25; rcScroll.right = -100; rcScroll.bottom = -40; rcClip.left = 0; rcClip.top = 35; rcClip.right = 70; rcClip.bottom = 1000; SetLastError(ERROR_SUCCESS); Result = NtUserScrollDC(hDC, 10, 20, &rcScroll, &rcClip, hRgn, &rcUpdate); RTEST(Result == 1); RTEST(GetLastError() == ERROR_SUCCESS); rcScroll.left = 0; rcScroll.top = 25; rcScroll.right = 100; rcScroll.bottom = 40; /* Test invalid update region */ SetLastError(ERROR_SUCCESS); Result = NtUserScrollDC(hDC, 10, 20, &rcScroll, &rcClip, (HRGN)0x123456, &rcUpdate); RTEST(Result == 0); TEST(GetLastError() == ERROR_INVALID_HANDLE); /* Test invalid dc */ SetLastError(ERROR_SUCCESS); Result = NtUserScrollDC((HDC)0x123456, 10, 20, &rcScroll, &rcClip, hRgn, &rcUpdate); RTEST(Result == 0); RTEST(GetLastError() == ERROR_SUCCESS); /* Test invalid update rect */ SetLastError(ERROR_SUCCESS); Result = NtUserScrollDC(hDC, 10, 20, &rcScroll, &rcClip, hRgn, (PVOID)0x80001000); RTEST(Result == 0); RTEST(GetLastError() == ERROR_NOACCESS); Result = NtUserScrollDC(hDC, 10, 20, &rcScroll, &rcClip, hRgn, &rcUpdate); RTEST(Result == TRUE); RTEST(rcUpdate.left == 0); RTEST(rcUpdate.top == 35); RTEST(rcUpdate.right == 70); RTEST(rcUpdate.bottom == 55); hTmpRgn = CreateRectRgn(10,45,70,55); Result = CombineRgn(hRgn, hRgn, hTmpRgn, RGN_XOR); RTEST(Result == SIMPLEREGION); SetRectRgn(hTmpRgn,0,35,70,40); Result = CombineRgn(hRgn, hRgn, hTmpRgn, RGN_XOR); RTEST(Result == NULLREGION); DeleteObject(hTmpRgn); /* TODO: Test with another window in front */ /* TODO: Test with different viewport extension */ ReleaseDC(hWnd, hDC); DestroyWindow(hWnd); DeleteObject(hRgn); return APISTATUS_NORMAL; }