[PATCH] d2d1/tests: A DC target test for switching from one HDC to another

Nikolay Sivov nsivov at codeweavers.com
Fri Sep 2 07:02:01 CDT 2016


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/d2d1/tests/Makefile.in |  2 +-
 dlls/d2d1/tests/d2d1.c      | 94 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 95 insertions(+), 1 deletion(-)

diff --git a/dlls/d2d1/tests/Makefile.in b/dlls/d2d1/tests/Makefile.in
index 28b741f..91ede78 100644
--- a/dlls/d2d1/tests/Makefile.in
+++ b/dlls/d2d1/tests/Makefile.in
@@ -1,5 +1,5 @@
 TESTDLL   = d2d1.dll
-IMPORTS   = d2d1 d3d10_1 dwrite dxguid uuid user32 advapi32 ole32
+IMPORTS   = d2d1 d3d10_1 dwrite dxguid uuid user32 advapi32 ole32 gdi32
 
 C_SRCS = \
 	d2d1.c
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index 7f9632f..dbbe7d0 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -2626,6 +2626,26 @@ todo_wine
     DestroyWindow(window);
 }
 
+static void create_target_dibsection(HDC hdc, UINT32 width, UINT32 height)
+{
+    char bmibuf[FIELD_OFFSET(BITMAPINFO, bmiColors[256])];
+    BITMAPINFO *bmi = (BITMAPINFO*)bmibuf;
+    HBITMAP hbm;
+
+    memset(bmi, 0, sizeof(bmibuf));
+    bmi->bmiHeader.biSize = sizeof(bmi->bmiHeader);
+    bmi->bmiHeader.biHeight = -height;
+    bmi->bmiHeader.biWidth = width;
+    bmi->bmiHeader.biBitCount = 32;
+    bmi->bmiHeader.biPlanes = 1;
+    bmi->bmiHeader.biCompression = BI_RGB;
+
+    hbm = CreateDIBSection(hdc, bmi, DIB_RGB_COLORS, NULL, NULL, 0);
+    ok(hbm != NULL, "Failed to create a dib section.\n");
+
+    DeleteObject(SelectObject(hdc, hbm));
+}
+
 static void test_dc_target(void)
 {
     static const D2D1_PIXEL_FORMAT invalid_formats[] =
@@ -2641,7 +2661,11 @@ static void test_dc_target(void)
     D2D1_COLOR_F color;
     D2D1_SIZE_F size;
     unsigned int i;
+    HDC hdc, hdc2;
+    COLORREF clr;
     HRESULT hr;
+    RECT rect;
+    D2D_RECT_F r;
 
     hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &IID_ID2D1Factory, NULL, (void **)&factory);
     ok(SUCCEEDED(hr), "Failed to create factory, hr %#x.\n", hr);
@@ -2687,6 +2711,76 @@ if (SUCCEEDED(hr))
     ok(hr == D2DERR_WRONG_STATE, "Got unexpected hr %#x.\n", hr);
 
     ID2D1DCRenderTarget_Release(rt);
+
+    /* BindDC() */
+    hr = ID2D1Factory_CreateDCRenderTarget(factory, &desc, &rt);
+    ok(SUCCEEDED(hr), "Failed to create target, hr %#x.\n", hr);
+
+    hdc = CreateCompatibleDC(NULL);
+    ok(hdc != NULL, "Failed to create an HDC.\n");
+
+    create_target_dibsection(hdc, 16, 16);
+
+    SetRect(&rect, 0, 0, 32, 32);
+    hr = ID2D1DCRenderTarget_BindDC(rt, NULL, &rect);
+    ok(hr == E_INVALIDARG, "BindDC() returned %#x.\n", hr);
+
+    hr = ID2D1DCRenderTarget_BindDC(rt, hdc, &rect);
+    ok(hr == S_OK, "BindDC() returned %#x.\n", hr);
+
+    /* target size comes from specified dimensions, not from selected bitmap size */
+    size = ID2D1DCRenderTarget_GetSize(rt);
+    ok(size.width == 32.0f, "got width %.08e.\n", size.width);
+    ok(size.height == 32.0f, "got height %.08e.\n", size.height);
+
+    /* clear one HDC to red, switch to another one, partially fill it and test contents */
+    ID2D1DCRenderTarget_BeginDraw(rt);
+
+    set_color(&color, 1.0f, 0.0f, 0.0f, 1.0f);
+    ID2D1DCRenderTarget_Clear(rt, &color);
+
+    hr = ID2D1DCRenderTarget_EndDraw(rt, NULL, NULL);
+    ok(SUCCEEDED(hr), "EndDraw() failed, hr %#x.\n", hr);
+
+    clr = GetPixel(hdc, 0, 0);
+    ok(clr == RGB(255, 0, 0), "Got color %#x\n", clr);
+
+    hdc2 = CreateCompatibleDC(NULL);
+    ok(hdc2 != NULL, "Failed to create an HDC.\n");
+
+    create_target_dibsection(hdc2, 16, 16);
+
+    hr = ID2D1DCRenderTarget_BindDC(rt, hdc2, &rect);
+    ok(hr == S_OK, "BindDC() returned %#x.\n", hr);
+
+    clr = GetPixel(hdc2, 0, 0);
+    ok(clr == 0, "Got color %#x\n", clr);
+
+    set_color(&color, 0.0f, 1.0f, 0.0f, 1.0f);
+    hr = ID2D1DCRenderTarget_CreateSolidColorBrush(rt, &color, NULL, &brush);
+    ok(SUCCEEDED(hr), "Failed to create brush, hr %#x.\n", hr);
+
+    ID2D1DCRenderTarget_BeginDraw(rt);
+
+    r.left = r.top = 0.0f;
+    r.bottom = 16.0f;
+    r.right = 8.0f;
+    ID2D1DCRenderTarget_FillRectangle(rt, &r, (ID2D1Brush*)brush);
+
+    hr = ID2D1DCRenderTarget_EndDraw(rt, NULL, NULL);
+    ok(SUCCEEDED(hr), "EndDraw() failed, hr %#x.\n", hr);
+
+    ID2D1SolidColorBrush_Release(brush);
+
+    clr = GetPixel(hdc2, 0, 0);
+    ok(clr == RGB(0, 255, 0), "Got color %#x\n", clr);
+
+    clr = GetPixel(hdc2, 10, 0);
+    ok(clr == 0, "Got color %#x\n", clr);
+
+    DeleteDC(hdc);
+    DeleteDC(hdc2);
+    ID2D1DCRenderTarget_Release(rt);
 }
     ID2D1Factory_Release(factory);
 }
-- 
2.9.3




More information about the wine-patches mailing list