Nikolay Sivov : d2d1: Fix compatible target initialization.
Alexandre Julliard
julliard at winehq.org
Mon Sep 24 15:48:23 CDT 2018
Module: wine
Branch: master
Commit: dc67508338be4c7486d823f56dcb33a07be2dff8
URL: https://source.winehq.org/git/wine.git/?a=commit;h=dc67508338be4c7486d823f56dcb33a07be2dff8
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Mon Sep 24 07:58:29 2018 +0300
d2d1: Fix compatible target initialization.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/d2d1/bitmap_render_target.c | 8 ++++-
dlls/d2d1/device.c | 4 +--
dlls/d2d1/tests/d2d1.c | 67 ++++++++++++++++++++++++++++++++++++++--
3 files changed, 73 insertions(+), 6 deletions(-)
diff --git a/dlls/d2d1/bitmap_render_target.c b/dlls/d2d1/bitmap_render_target.c
index 57f5b23..6cea509 100644
--- a/dlls/d2d1/bitmap_render_target.c
+++ b/dlls/d2d1/bitmap_render_target.c
@@ -722,6 +722,11 @@ static const struct ID2D1BitmapRenderTargetVtbl d2d_bitmap_render_target_vtbl =
d2d_bitmap_render_target_GetBitmap
};
+static const struct d2d_device_context_ops d2d_bitmap_render_target_ops =
+{
+ NULL,
+};
+
HRESULT d2d_bitmap_render_target_init(struct d2d_bitmap_render_target *render_target,
const struct d2d_device_context *parent_target, const D2D1_SIZE_F *size,
const D2D1_SIZE_U *pixel_size, const D2D1_PIXEL_FORMAT *pixel_format,
@@ -805,7 +810,8 @@ HRESULT d2d_bitmap_render_target_init(struct d2d_bitmap_render_target *render_ta
}
if (FAILED(hr = d2d_d3d_create_render_target(parent_target->factory, dxgi_surface,
- (IUnknown *)&render_target->ID2D1BitmapRenderTarget_iface, NULL,
+ (IUnknown *)&render_target->ID2D1BitmapRenderTarget_iface,
+ parent_target->ops ? &d2d_bitmap_render_target_ops : NULL,
&dxgi_rt_desc, (void **)&render_target->dxgi_inner)))
{
WARN("Failed to create DXGI surface render target, hr %#x.\n", hr);
diff --git a/dlls/d2d1/device.c b/dlls/d2d1/device.c
index d20377b..f1d0dad 100644
--- a/dlls/d2d1/device.c
+++ b/dlls/d2d1/device.c
@@ -1515,7 +1515,7 @@ static HRESULT STDMETHODCALLTYPE d2d_device_context_Flush(ID2D1DeviceContext *if
FIXME("iface %p, tag1 %p, tag2 %p stub!\n", iface, tag1, tag2);
- if (context->ops)
+ if (context->ops && context->ops->device_context_present)
context->ops->device_context_present(context->outer_unknown);
return E_NOTIMPL;
@@ -1693,7 +1693,7 @@ static HRESULT STDMETHODCALLTYPE d2d_device_context_EndDraw(ID2D1DeviceContext *
if (tag2)
*tag2 = context->error.tag2;
- if (context->ops)
+ if (context->ops && context->ops->device_context_present)
{
if (FAILED(hr = context->ops->device_context_present(context->outer_unknown)))
context->error.code = hr;
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index 4136b69..9e6ce06 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -6705,8 +6705,10 @@ static void check_rt_bitmap_surface_(unsigned int line, ID2D1RenderTarget *rt, B
ID2D1RenderTarget *compatible_rt;
IWICImagingFactory *wic_factory;
ID2D1DeviceContext *context;
+ ID2D1DCRenderTarget *dc_rt;
IWICBitmap *wic_bitmap;
ID2D1Bitmap *bitmap;
+ ID2D1Image *target;
D2D1_SIZE_U size;
HRESULT hr;
@@ -6749,13 +6751,37 @@ static void check_rt_bitmap_surface_(unsigned int line, ID2D1RenderTarget *rt, B
CoUninitialize();
- if (FAILED(ID2D1RenderTarget_QueryInterface(rt, &IID_ID2D1DeviceContext, (void **)&context)))
+ /* Compatible target follows its parent. */
+ hr = ID2D1RenderTarget_QueryInterface(rt, &IID_ID2D1DeviceContext, (void **)&context);
+ ok_(__FILE__, line)(SUCCEEDED(hr), "Failed to get device context, hr %#x.\n", hr);
+
+ dc_rt = NULL;
+ ID2D1RenderTarget_QueryInterface(rt, &IID_ID2D1DCRenderTarget, (void **)&dc_rt);
+
+ bitmap = NULL;
+ target = NULL;
+ ID2D1DeviceContext_GetTarget(context, &target);
+ if (target && FAILED(ID2D1Image_QueryInterface(target, &IID_ID2D1Bitmap, (void **)&bitmap)))
+ {
+ ID2D1Image_Release(target);
+ target = NULL;
+ }
+ if (bitmap)
+ ID2D1Bitmap_Release(bitmap);
+
+ /* Pixel format is not defined until target is set, for DC target it's specified on creation. */
+ if (target || dc_rt)
{
- /* Compatible target follows its parent. */
+ ID2D1DeviceContext *context2;
+
hr = ID2D1RenderTarget_CreateCompatibleRenderTarget(rt, NULL, NULL, NULL,
D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_NONE, (ID2D1BitmapRenderTarget **)&compatible_rt);
ok_(__FILE__, line)(SUCCEEDED(hr), "Failed to create compatible render target, hr %#x.\n", hr);
+ hr = ID2D1RenderTarget_QueryInterface(compatible_rt, &IID_ID2D1DeviceContext, (void **)&context2);
+ ok_(__FILE__, line)(SUCCEEDED(hr), "Failed to get device context, hr %#x.\n", hr);
+ ID2D1DeviceContext_Release(context2);
+
hr = ID2D1RenderTarget_CreateBitmap(compatible_rt, size, bitmap_data, sizeof(*bitmap_data), &bitmap_desc, &bitmap);
ok_(__FILE__, line)(SUCCEEDED(hr), "Failed to create bitmap, hr %#x.\n", hr);
@@ -6765,7 +6791,18 @@ static void check_rt_bitmap_surface_(unsigned int line, ID2D1RenderTarget *rt, B
ID2D1Bitmap_Release(bitmap);
}
else
- ID2D1DeviceContext_Release(context);
+ {
+ hr = ID2D1RenderTarget_CreateCompatibleRenderTarget(rt, NULL, NULL, NULL,
+ D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_NONE, (ID2D1BitmapRenderTarget **)&compatible_rt);
+ todo_wine
+ ok_(__FILE__, line)(hr == WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT, " --- Unexpected hr %#x.\n", hr);
+ }
+
+ ID2D1DeviceContext_Release(context);
+ if (target)
+ ID2D1Image_Release(target);
+ if (dc_rt)
+ ID2D1DCRenderTarget_Release(dc_rt);
}
static void test_bitmap_surface(void)
@@ -6782,6 +6819,7 @@ static void test_bitmap_surface(void)
IDXGISurface *surface;
ID2D1Bitmap1 *bitmap;
ID2D1Device *device;
+ ID2D1Image *target;
HWND window;
HRESULT hr;
@@ -6809,7 +6847,23 @@ static void test_bitmap_surface(void)
rt = create_render_target(surface);
ok(!!rt, "Failed to create render target.\n");
+ hr = ID2D1RenderTarget_QueryInterface(rt, &IID_ID2D1DeviceContext, (void **)&device_context);
+ ok(SUCCEEDED(hr), "Failed to get device context, hr %#x.\n", hr);
+
+ bitmap = NULL;
+ ID2D1DeviceContext_GetTarget(device_context, (ID2D1Image **)&bitmap);
+todo_wine
+ ok(!!bitmap, "Unexpected target.\n");
+
+if (bitmap)
+{
+ check_bitmap_surface((ID2D1Bitmap *)bitmap, TRUE, D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW);
+ ID2D1Bitmap1_Release(bitmap);
+}
check_rt_bitmap_surface(rt, TRUE, D2D1_BITMAP_OPTIONS_NONE);
+
+ ID2D1DeviceContext_Release(device_context);
+
ID2D1RenderTarget_Release(rt);
/* Bitmap created from DXGI surface. */
@@ -6836,7 +6890,14 @@ if (SUCCEEDED(hr))
check_bitmap_surface((ID2D1Bitmap *)bitmap, TRUE, D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW);
check_rt_bitmap_surface((ID2D1RenderTarget *)device_context, TRUE, D2D1_BITMAP_OPTIONS_NONE);
+ ID2D1DeviceContext_SetTarget(device_context, (ID2D1Image *)bitmap);
+ ID2D1DeviceContext_GetTarget(device_context, &target);
+ ok(target == (ID2D1Image *)bitmap, "Unexpected target.\n");
+
+ check_rt_bitmap_surface((ID2D1RenderTarget *)device_context, TRUE, D2D1_BITMAP_OPTIONS_NONE);
+
ID2D1DeviceContext_Release(device_context);
+ ID2D1Bitmap1_Release(bitmap);
}
ID2D1Device_Release(device);
IDXGIDevice_Release(dxgi_device);
More information about the wine-cvs
mailing list