[PATCH 1/5] d2d1: Implement CreateDeviceContext().

Nikolay Sivov nsivov at codeweavers.com
Tue Oct 2 01:33:05 CDT 2018


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/d2d1/device.c     | 23 +++++++++++++++++++++--
 dlls/d2d1/tests/d2d1.c | 16 ++++++----------
 2 files changed, 27 insertions(+), 12 deletions(-)

diff --git a/dlls/d2d1/device.c b/dlls/d2d1/device.c
index 97ec0afe88..967b90d038 100644
--- a/dlls/d2d1/device.c
+++ b/dlls/d2d1/device.c
@@ -3826,9 +3826,28 @@ static void WINAPI d2d_device_GetFactory(ID2D1Device *iface, ID2D1Factory **fact
 static HRESULT WINAPI d2d_device_CreateDeviceContext(ID2D1Device *iface, D2D1_DEVICE_CONTEXT_OPTIONS options,
         ID2D1DeviceContext **context)
 {
-    FIXME("iface %p, options %#x, context %p stub!\n", iface, options, context);
+    struct d2d_device_context *object;
+    HRESULT hr;
 
-    return E_NOTIMPL;
+    TRACE("iface %p, options %#x, context %p.\n", iface, options, context);
+
+    if (options)
+        FIXME("Options are ignored %#x.\n", options);
+
+    if (!(object = heap_alloc_zero(sizeof(*object))))
+        return E_OUTOFMEMORY;
+
+    if (FAILED(hr = d2d_device_context_init(object, iface, NULL, NULL)))
+    {
+        WARN("Failed to initialize device context, hr %#x.\n", hr);
+        heap_free(object);
+        return hr;
+    }
+
+    TRACE("Created device context %p.\n", object);
+    *context = &object->ID2D1DeviceContext_iface;
+
+    return S_OK;
 }
 
 static HRESULT WINAPI d2d_device_CreatePrintControl(ID2D1Device *iface, IWICImagingFactory *wic_factory,
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index 54d5618f17..d31c8ad97e 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -6999,7 +6999,6 @@ static void check_rt_bitmap_surface_(unsigned int line, ID2D1RenderTarget *rt, B
     {
         hr = ID2D1RenderTarget_CreateCompatibleRenderTarget(rt, NULL, NULL, NULL,
                  D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_NONE, &compatible_rt);
-    todo_wine
         ok_(__FILE__, line)(hr == WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT, "Unexpected hr %#x.\n", hr);
     }
 
@@ -7139,11 +7138,8 @@ static void test_bitmap_surface(void)
     ok(SUCCEEDED(hr), "Failed to get ID2D1Device, hr %#x.\n", hr);
 
     hr = ID2D1Device_CreateDeviceContext(device, D2D1_DEVICE_CONTEXT_OPTIONS_NONE, &device_context);
-todo_wine
     ok(SUCCEEDED(hr), "Failed to create device context, hr %#x.\n", hr);
 
-if (SUCCEEDED(hr))
-{
     for (i = 0; i < ARRAY_SIZE(bitmap_format_tests); ++i)
     {
         memset(&bitmap_desc, 0, sizeof(bitmap_desc));
@@ -7151,9 +7147,10 @@ if (SUCCEEDED(hr))
         bitmap_desc.bitmapOptions = D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW;
 
         hr = ID2D1DeviceContext_CreateBitmapFromDxgiSurface(device_context, surface, &bitmap_desc, &bitmap);
+    todo_wine_if(bitmap_format_tests[i].hr == WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT)
         ok(hr == bitmap_format_tests[i].hr, "%u: unexpected hr %#x.\n", i, hr);
 
-        if (SUCCEEDED(hr))
+        if (SUCCEEDED(bitmap_format_tests[i].hr))
         {
             pixel_format = ID2D1Bitmap1_GetPixelFormat(bitmap);
 
@@ -7243,7 +7240,7 @@ if (SUCCEEDED(hr))
     ID2D1Bitmap1_Release(bitmap);
 
     ID2D1DeviceContext_Release(device_context);
-}
+
     ID2D1Device_Release(device);
     IDXGIDevice_Release(dxgi_device);
     IDXGISurface_Release(surface);
@@ -7352,11 +7349,8 @@ static void test_device_context(void)
     IDXGIDevice_Release(dxgi_device);
 
     hr = ID2D1Device_CreateDeviceContext(device, D2D1_DEVICE_CONTEXT_OPTIONS_NONE, &device_context);
-todo_wine
     ok(SUCCEEDED(hr), "Failed to create device context, hr %#x.\n", hr);
 
-if (SUCCEEDED(hr))
-{
     ID2D1DeviceContext_GetDevice(device_context, &device2);
     ok(device2 == device, "Unexpected device instance.\n");
     ID2D1Device_Release(device2);
@@ -7434,6 +7428,7 @@ if (SUCCEEDED(hr))
     ok(options == (D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW),
             "Unexpected bitmap options %#x.\n", options);
     hr = ID2D1Bitmap1_GetSurface(bitmap, &surface);
+todo_wine
     ok(hr == E_FAIL, "Unexpected hr %#x.\n", hr);
     ID2D1Bitmap1_Release(bitmap);
 
@@ -7495,6 +7490,7 @@ if (SUCCEEDED(hr))
 
     ID2D1DeviceContext_GetTarget(device_context, (ID2D1Image **)&bitmap);
     options = ID2D1Bitmap1_GetOptions(bitmap);
+todo_wine
     ok(options == (D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW | D2D1_BITMAP_OPTIONS_GDI_COMPATIBLE),
             "Unexpected bitmap options %#x.\n", options);
     hr = ID2D1Bitmap1_GetSurface(bitmap, &surface);
@@ -7508,7 +7504,7 @@ if (SUCCEEDED(hr))
     ID2D1DeviceContext_Release(device_context);
     ID2D1DCRenderTarget_Release(dc_rt);
     DeleteDC(hdc);
-}
+
     ID2D1Device_Release(device);
     ID2D1Factory1_Release(factory);
     ID3D10Device1_Release(d3d_device);
-- 
2.19.0




More information about the wine-devel mailing list