[PATCH] uxtheme/tests: Some tests for buffered painting API
Nikolay Sivov
nsivov at codeweavers.com
Thu Jan 19 08:13:29 CST 2017
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/uxtheme/tests/Makefile.in | 2 +-
dlls/uxtheme/tests/system.c | 141 ++++++++++++++++++++++++++++++++++++++++-
2 files changed, 139 insertions(+), 4 deletions(-)
diff --git a/dlls/uxtheme/tests/Makefile.in b/dlls/uxtheme/tests/Makefile.in
index 5e6c272c17..42bdcfaa36 100644
--- a/dlls/uxtheme/tests/Makefile.in
+++ b/dlls/uxtheme/tests/Makefile.in
@@ -1,5 +1,5 @@
TESTDLL = uxtheme.dll
-IMPORTS = user32 uxtheme
+IMPORTS = user32 gdi32 uxtheme
C_SRCS = \
system.c
diff --git a/dlls/uxtheme/tests/system.c b/dlls/uxtheme/tests/system.c
index d40679d0d5..d7ba43c6d6 100644
--- a/dlls/uxtheme/tests/system.c
+++ b/dlls/uxtheme/tests/system.c
@@ -27,13 +27,30 @@
#include "wine/test.h"
static HTHEME (WINAPI * pOpenThemeDataEx)(HWND, LPCWSTR, DWORD);
-
-#define UXTHEME_GET_PROC(func) p ## func = (void*)GetProcAddress(hUxtheme, #func);
+static HPAINTBUFFER (WINAPI *pBeginBufferedPaint)(HDC, const RECT *, BP_BUFFERFORMAT, BP_PAINTPARAMS *, HDC *);
+static HRESULT (WINAPI *pBufferedPaintClear)(HPAINTBUFFER, const RECT *);
+static HRESULT (WINAPI *pEndBufferedPaint)(HPAINTBUFFER, BOOL);
+static HRESULT (WINAPI *pGetBufferedPaintBits)(HPAINTBUFFER, RGBQUAD **, int *);
+static HDC (WINAPI *pGetBufferedPaintDC)(HPAINTBUFFER);
+static HDC (WINAPI *pGetBufferedPaintTargetDC)(HPAINTBUFFER);
+static HRESULT (WINAPI *pGetBufferedPaintTargetRect)(HPAINTBUFFER, RECT *);
static void init_funcs(void)
{
HMODULE hUxtheme = GetModuleHandleA("uxtheme.dll");
- UXTHEME_GET_PROC(OpenThemeDataEx)
+
+#define UXTHEME_GET_PROC(func) p ## func = (void*)GetProcAddress(hUxtheme, #func)
+ UXTHEME_GET_PROC(BeginBufferedPaint);
+ UXTHEME_GET_PROC(BufferedPaintClear);
+ UXTHEME_GET_PROC(EndBufferedPaint);
+ UXTHEME_GET_PROC(GetBufferedPaintBits);
+ UXTHEME_GET_PROC(GetBufferedPaintDC);
+ UXTHEME_GET_PROC(GetBufferedPaintTargetDC);
+ UXTHEME_GET_PROC(GetBufferedPaintTargetRect);
+ UXTHEME_GET_PROC(BufferedPaintClear);
+
+ UXTHEME_GET_PROC(OpenThemeDataEx);
+#undef UXTHEME_GET_PROC
}
static void test_IsThemed(void)
@@ -506,6 +523,122 @@ static void test_CloseThemeData(void)
ok( hRes == E_HANDLE, "Expected E_HANDLE, got 0x%08x\n", hRes);
}
+static void test_buffered_paint(void)
+{
+ BP_PAINTPARAMS params = { 0 };
+ BP_BUFFERFORMAT format;
+ HDC target, src, hdc;
+ HPAINTBUFFER buffer;
+ RECT rect, rect2;
+ HRESULT hr;
+
+ if (!pBeginBufferedPaint)
+ {
+ win_skip("Buffered painting API is not supported.\n");
+ return;
+ }
+
+ buffer = pBeginBufferedPaint(NULL, NULL, BPBF_COMPATIBLEBITMAP,
+ NULL, NULL);
+ ok(buffer == NULL, "Unexpected buffer %p\n", buffer);
+
+ target = CreateCompatibleDC(0);
+ buffer = pBeginBufferedPaint(target, NULL, BPBF_COMPATIBLEBITMAP,
+ NULL, NULL);
+ ok(buffer == NULL, "Unexpected buffer %p\n", buffer);
+
+ params.cbSize = sizeof(params);
+ buffer = pBeginBufferedPaint(target, NULL, BPBF_COMPATIBLEBITMAP,
+ ¶ms, NULL);
+ ok(buffer == NULL, "Unexpected buffer %p\n", buffer);
+
+ buffer = pBeginBufferedPaint(target, NULL, BPBF_COMPATIBLEBITMAP,
+ ¶ms, &src);
+ ok(buffer == NULL, "Unexpected buffer %p\n", buffer);
+
+ /* target rect is mandatory */
+ rect.left = rect.top = 0;
+ rect.right = rect.bottom = 0;
+ buffer = pBeginBufferedPaint(target, &rect, BPBF_COMPATIBLEBITMAP,
+ ¶ms, &src);
+ ok(buffer == NULL, "Unexpected buffer %p\n", buffer);
+
+ rect.left = rect.top = 0;
+ rect.right = rect.bottom = 5;
+ buffer = pBeginBufferedPaint(target, &rect, BPBF_COMPATIBLEBITMAP,
+ ¶ms, &src);
+todo_wine
+ ok(buffer != NULL, "Unexpected buffer %p\n", buffer);
+ hr = pEndBufferedPaint(buffer, FALSE);
+ ok(hr == S_OK, "Unexpected return code %#x\n", hr);
+
+ rect.left = rect.top = 0;
+ rect.right = rect.bottom = 5;
+ buffer = pBeginBufferedPaint(target, &rect, BPBF_COMPATIBLEBITMAP,
+ ¶ms, &src);
+todo_wine
+ ok(buffer != NULL, "Unexpected buffer %p\n", buffer);
+
+ /* clearing */
+ hr = pBufferedPaintClear(NULL, NULL);
+todo_wine
+ ok(hr == E_FAIL, "Unexpected return code %#x\n", hr);
+
+ hr = pBufferedPaintClear(buffer, NULL);
+todo_wine
+ ok(hr == S_OK, "Unexpected return code %#x\n", hr);
+
+ /* access buffer attributes */
+ hdc = pGetBufferedPaintDC(buffer);
+todo_wine
+ ok(hdc == src, "Unexpected hdc, %p, buffered dc %p\n", hdc, src);
+
+ hdc = pGetBufferedPaintTargetDC(buffer);
+todo_wine
+ ok(hdc == target, "Unexpected target hdc %p, original %p\n", hdc, target);
+
+ hr = pGetBufferedPaintTargetRect(buffer, NULL);
+todo_wine
+ ok(hr == E_POINTER, "Unexpected return code %#x\n", hr);
+
+ SetRectEmpty(&rect2);
+ hr = pGetBufferedPaintTargetRect(buffer, &rect2);
+todo_wine {
+ ok(hr == S_OK, "Unexpected return code %#x\n", hr);
+ ok(EqualRect(&rect, &rect2), "Wrong target rect\n");
+}
+ hr = pEndBufferedPaint(buffer, FALSE);
+ ok(hr == S_OK, "Unexpected return code %#x\n", hr);
+
+ /* access buffer bits */
+ for (format = BPBF_COMPATIBLEBITMAP; format <= BPBF_TOPDOWNMONODIB; format++)
+ {
+ RGBQUAD *bits;
+ int row;
+
+ buffer = pBeginBufferedPaint(target, &rect, format, ¶ms, &src);
+
+ /* only works for DIB buffers */
+ bits = NULL;
+ row = 0;
+ hr = pGetBufferedPaintBits(buffer, &bits, &row);
+todo_wine {
+ if (format == BPBF_COMPATIBLEBITMAP)
+ ok(hr == E_FAIL, "Unexpected return code %#x\n", hr);
+ else
+ {
+ ok(hr == S_OK, "Unexpected return code %#x\n", hr);
+ ok(bits != NULL, "Bitmap bits %p\n", bits);
+ ok(row > 0, "Bitmap width %d\n", row);
+ }
+}
+ hr = pEndBufferedPaint(buffer, FALSE);
+ ok(hr == S_OK, "Unexpected return code %#x\n", hr);
+ }
+
+ DeleteDC(target);
+}
+
START_TEST(system)
{
init_funcs();
@@ -541,4 +674,6 @@ START_TEST(system)
/* CloseThemeData */
trace("Starting test_CloseThemeData()\n");
test_CloseThemeData();
+
+ test_buffered_paint();
}
--
2.11.0
More information about the wine-patches
mailing list