Wine-devel
Threads by month
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
September 2018
- 70 participants
- 627 discussions
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/windowscodecs/proxy.c | 15 +++++++++++++++
dlls/windowscodecs/windowscodecs.spec | 6 +++---
2 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/dlls/windowscodecs/proxy.c b/dlls/windowscodecs/proxy.c
index a28b38681e..5fd38724b5 100644
--- a/dlls/windowscodecs/proxy.c
+++ b/dlls/windowscodecs/proxy.c
@@ -626,6 +626,21 @@ HRESULT WINAPI IWICStream_InitializeFromMemory_Proxy_W(IWICStream *iface,
return IWICStream_InitializeFromMemory(iface, pbBuffer, cbBufferSize);
}
+HRESULT WINAPI IWICPixelFormatInfo_GetBitsPerPixel_Proxy_W(IWICPixelFormatInfo *iface, UINT *bpp)
+{
+ return IWICPixelFormatInfo_GetBitsPerPixel(iface, bpp);
+}
+
+HRESULT WINAPI IWICPixelFormatInfo_GetChannelCount_Proxy_W(IWICPixelFormatInfo *iface, UINT *count)
+{
+ return IWICPixelFormatInfo_GetChannelCount(iface, count);
+}
+
+HRESULT WINAPI IWICPixelFormatInfo_GetChannelMask_Proxy_W(IWICPixelFormatInfo *iface, UINT channel, UINT buffer_size, BYTE *buffer, UINT *actual)
+{
+ return IWICPixelFormatInfo_GetChannelMask(iface, channel, buffer_size, buffer, actual);
+}
+
HRESULT WINAPI WICCreateColorContext_Proxy(IWICImagingFactory *iface, IWICColorContext **ppIWICColorContext)
{
TRACE("%p, %p\n", iface, ppIWICColorContext);
diff --git a/dlls/windowscodecs/windowscodecs.spec b/dlls/windowscodecs/windowscodecs.spec
index 905ef835af..ae3660c6f3 100644
--- a/dlls/windowscodecs/windowscodecs.spec
+++ b/dlls/windowscodecs/windowscodecs.spec
@@ -99,9 +99,9 @@
@ stdcall IWICPalette_InitializeFromBitmap_Proxy(ptr ptr long long) IWICPalette_InitializeFromBitmap_Proxy_W
@ stdcall IWICPalette_InitializeFromPalette_Proxy(ptr ptr) IWICPalette_InitializeFromPalette_Proxy_W
@ stdcall IWICPalette_InitializePredefined_Proxy(ptr long long) IWICPalette_InitializePredefined_Proxy_W
-@ stub IWICPixelFormatInfo_GetBitsPerPixel_Proxy
-@ stub IWICPixelFormatInfo_GetChannelCount_Proxy
-@ stub IWICPixelFormatInfo_GetChannelMask_Proxy
+@ stdcall IWICPixelFormatInfo_GetBitsPerPixel_Proxy(ptr ptr) IWICPixelFormatInfo_GetBitsPerPixel_Proxy_W
+@ stdcall IWICPixelFormatInfo_GetChannelCount_Proxy(ptr ptr) IWICPixelFormatInfo_GetChannelCount_Proxy_W
+@ stdcall IWICPixelFormatInfo_GetChannelMask_Proxy(ptr long long ptr ptr) IWICPixelFormatInfo_GetChannelMask_Proxy_W
@ stdcall IWICStream_InitializeFromIStream_Proxy(ptr ptr) IWICStream_InitializeFromIStream_Proxy_W
@ stdcall IWICStream_InitializeFromMemory_Proxy(ptr ptr long) IWICStream_InitializeFromMemory_Proxy_W
@ stdcall WICConvertBitmapSource(ptr ptr ptr)
--
2.19.0
1
0
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/opcservices/package.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/dlls/opcservices/package.c b/dlls/opcservices/package.c
index 5534fe6783..06bbb3d37c 100644
--- a/dlls/opcservices/package.c
+++ b/dlls/opcservices/package.c
@@ -1723,7 +1723,8 @@ static HRESULT opc_package_collect_content_types(IOpcPackage *package, struct co
if (FAILED(hr))
break;
- IOpcPartEnumerator_MoveNext(enumerator, &has_next);
+ if (FAILED(hr = IOpcPartEnumerator_MoveNext(enumerator, &has_next)))
+ break;
}
IOpcPartEnumerator_Release(enumerator);
--
2.19.0
1
3
29 Sep '18
CID 1439780
Signed-off-by: Marcus Meissner <marcus(a)jet.franken.de>
---
dlls/devenum/createdevenum.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/devenum/createdevenum.c b/dlls/devenum/createdevenum.c
index 9b7ee3f053..e44e6ecda4 100644
--- a/dlls/devenum/createdevenum.c
+++ b/dlls/devenum/createdevenum.c
@@ -791,7 +791,7 @@ static void register_avicap_devices(void)
for (i = 0; i < 10; ++i)
{
- if (!capGetDriverDescriptionW(i, name, sizeof(name), version, sizeof(version)))
+ if (!capGetDriverDescriptionW(i, name, ARRAY_SIZE(name), version, ARRAY_SIZE(version)))
break;
friendlyname[5] = '0' + i;
--
2.19.0
1
0
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/ntdll/tests/file.c | 106 ++++++++++++++++++++++--------------------------
1 file changed, 48 insertions(+), 58 deletions(-)
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
index b4223b3..b7ccf49 100644
--- a/dlls/ntdll/tests/file.c
+++ b/dlls/ntdll/tests/file.c
@@ -108,10 +108,6 @@ static HANDLE create_temp_file( ULONG flags )
#define CKEY_FIRST 0x1030341
#define CKEY_SECOND 0x132E46
-static ULONG_PTR completionKey;
-static IO_STATUS_BLOCK ioSb;
-static ULONG_PTR completionValue;
-
static ULONG get_pending_msgs(HANDLE h)
{
NTSTATUS res;
@@ -124,21 +120,6 @@ static ULONG get_pending_msgs(HANDLE h)
return a;
}
-static BOOL get_msg(HANDLE h)
-{
- LARGE_INTEGER timeout = {{-10000000*3}};
- DWORD res = pNtRemoveIoCompletion( h, &completionKey, &completionValue, &ioSb, &timeout);
- ok( res == STATUS_SUCCESS, "NtRemoveIoCompletion failed: %x\n", res );
- if (res != STATUS_SUCCESS)
- {
- completionKey = completionValue = 0;
- memset(&ioSb, 0, sizeof(ioSb));
- return FALSE;
- }
- return TRUE;
-}
-
-
static void WINAPI apc( void *arg, IO_STATUS_BLOCK *iosb, ULONG reserved )
{
int *count = arg;
@@ -881,6 +862,9 @@ static void nt_mailslot_test(void)
static void test_iocp_setcompletion(HANDLE h)
{
+ LARGE_INTEGER timeout = {{0}};
+ IO_STATUS_BLOCK iosb;
+ ULONG_PTR key, value;
NTSTATUS res;
ULONG count;
SIZE_T size = 3;
@@ -893,13 +877,12 @@ static void test_iocp_setcompletion(HANDLE h)
count = get_pending_msgs(h);
ok( count == 1, "Unexpected msg count: %d\n", count );
- if (get_msg(h))
- {
- ok( completionKey == CKEY_FIRST, "Invalid completion key: %lx\n", completionKey );
- ok( ioSb.Information == size, "Invalid ioSb.Information: %lu\n", ioSb.Information );
- ok( U(ioSb).Status == STATUS_INVALID_DEVICE_REQUEST, "Invalid ioSb.Status: %x\n", U(ioSb).Status);
- ok( completionValue == CVALUE_FIRST, "Invalid completion value: %lx\n", completionValue );
- }
+ res = pNtRemoveIoCompletion( h, &key, &value, &iosb, &timeout );
+ ok( res == STATUS_SUCCESS, "NtRemoveIoCompletion failed: %#x\n", res );
+ ok( key == CKEY_FIRST, "Invalid completion key: %#lx\n", key );
+ ok( iosb.Information == size, "Invalid iosb.Information: %lu\n", iosb.Information );
+ ok( U(iosb).Status == STATUS_INVALID_DEVICE_REQUEST, "Invalid iosb.Status: %#x\n", U(iosb).Status );
+ ok( value == CVALUE_FIRST, "Invalid completion value: %#lx\n", value );
count = get_pending_msgs(h);
ok( !count, "Unexpected msg count: %d\n", count );
@@ -911,7 +894,9 @@ static void test_iocp_fileio(HANDLE h)
IO_STATUS_BLOCK iosb;
FILE_COMPLETION_INFORMATION fci = {h, CKEY_SECOND};
+ LARGE_INTEGER timeout = {{0}};
HANDLE hPipeSrv, hPipeClt;
+ ULONG_PTR key, value;
NTSTATUS res;
hPipeSrv = CreateNamedPipeA( pipe_name, PIPE_ACCESS_INBOUND, PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, 4, 1024, 1024, 1000, NULL );
@@ -960,14 +945,15 @@ static void test_iocp_fileio(HANDLE h)
ok( !count, "Unexpected msg count: %ld\n", count );
WriteFile( hPipeClt, send_buf, TEST_BUF_LEN, &read, NULL );
- if (get_msg(h))
- {
- ok( completionKey == CKEY_SECOND, "Invalid completion key: %lx\n", completionKey );
- ok( ioSb.Information == 3, "Invalid ioSb.Information: %ld\n", ioSb.Information );
- ok( U(ioSb).Status == STATUS_SUCCESS, "Invalid ioSb.Status: %x\n", U(ioSb).Status);
- ok( completionValue == (ULONG_PTR)&o, "Invalid completion value: %lx\n", completionValue );
- ok( !memcmp( send_buf, recv_buf, TEST_BUF_LEN ), "Receive buffer (%x %x %x) did not match send buffer (%x %x %x)\n", recv_buf[0], recv_buf[1], recv_buf[2], send_buf[0], send_buf[1], send_buf[2] );
- }
+ res = pNtRemoveIoCompletion( h, &key, &value, &iosb, &timeout );
+ ok( res == STATUS_SUCCESS, "NtRemoveIoCompletion failed: %#x\n", res );
+ ok( key == CKEY_SECOND, "Invalid completion key: %#lx\n", key );
+ ok( iosb.Information == 3, "Invalid iosb.Information: %ld\n", iosb.Information );
+ ok( U(iosb).Status == STATUS_SUCCESS, "Invalid iosb.Status: %#x\n", U(iosb).Status );
+ ok( value == (ULONG_PTR)&o, "Invalid completion value: %#lx\n", value );
+ ok( !memcmp( send_buf, recv_buf, TEST_BUF_LEN ),
+ "Receive buffer (%02x %02x %02x) did not match send buffer (%02x %02x %02x)\n",
+ recv_buf[0], recv_buf[1], recv_buf[2], send_buf[0], send_buf[1], send_buf[2] );
count = get_pending_msgs(h);
ok( !count, "Unexpected msg count: %ld\n", count );
@@ -979,27 +965,29 @@ static void test_iocp_fileio(HANDLE h)
ReadFile( hPipeSrv, recv_buf, 2, &read, &o);
count = get_pending_msgs(h);
ok( count == 1, "Unexpected msg count: %ld\n", count );
- if (get_msg(h))
- {
- ok( completionKey == CKEY_SECOND, "Invalid completion key: %lx\n", completionKey );
- ok( ioSb.Information == 2, "Invalid ioSb.Information: %ld\n", ioSb.Information );
- ok( U(ioSb).Status == STATUS_SUCCESS, "Invalid ioSb.Status: %x\n", U(ioSb).Status);
- ok( completionValue == (ULONG_PTR)&o, "Invalid completion value: %lx\n", completionValue );
- ok( !memcmp( send_buf, recv_buf, 2 ), "Receive buffer (%x %x) did not match send buffer (%x %x)\n", recv_buf[0], recv_buf[1], send_buf[0], send_buf[1] );
- }
+
+ res = pNtRemoveIoCompletion( h, &key, &value, &iosb, &timeout );
+ ok( res == STATUS_SUCCESS, "NtRemoveIoCompletion failed: %#x\n", res );
+ ok( key == CKEY_SECOND, "Invalid completion key: %#lx\n", key );
+ ok( iosb.Information == 2, "Invalid iosb.Information: %ld\n", iosb.Information );
+ ok( U(iosb).Status == STATUS_SUCCESS, "Invalid iosb.Status: %#x\n", U(iosb).Status );
+ ok( value == (ULONG_PTR)&o, "Invalid completion value: %#lx\n", value );
+ ok( !memcmp( send_buf, recv_buf, 2 ),
+ "Receive buffer (%02x %02x) did not match send buffer (%02x %02x)\n",
+ recv_buf[0], recv_buf[1], send_buf[0], send_buf[1] );
ReadFile( hPipeSrv, recv_buf, TEST_BUF_LEN, &read, &o);
CloseHandle( hPipeSrv );
count = get_pending_msgs(h);
ok( count == 1, "Unexpected msg count: %ld\n", count );
- if (get_msg(h))
- {
- ok( completionKey == CKEY_SECOND, "Invalid completion key: %lx\n", completionKey );
- ok( ioSb.Information == 0, "Invalid ioSb.Information: %ld\n", ioSb.Information );
- /* wine sends wrong status here */
- ok( U(ioSb).Status == STATUS_PIPE_BROKEN, "Invalid ioSb.Status: %x\n", U(ioSb).Status);
- ok( completionValue == (ULONG_PTR)&o, "Invalid completion value: %lx\n", completionValue );
- }
+
+ res = pNtRemoveIoCompletion( h, &key, &value, &iosb, &timeout );
+ ok( res == STATUS_SUCCESS, "NtRemoveIoCompletion failed: %#x\n", res );
+ ok( key == CKEY_SECOND, "Invalid completion key: %lx\n", key );
+ ok( iosb.Information == 0, "Invalid iosb.Information: %ld\n", iosb.Information );
+ /* wine sends wrong status here */
+ ok( U(iosb).Status == STATUS_PIPE_BROKEN, "Invalid iosb.Status: %x\n", U(iosb).Status );
+ ok( value == (ULONG_PTR)&o, "Invalid completion value: %lx\n", value );
}
CloseHandle( hPipeClt );
@@ -1034,14 +1022,16 @@ static void test_iocp_fileio(HANDLE h)
WriteFile( hPipeClt, send_buf, TEST_BUF_LEN, &read, NULL );
- if (get_msg(h))
- {
- ok( completionKey == CKEY_SECOND, "Invalid completion key: %lx\n", completionKey );
- ok( ioSb.Information == 3, "Invalid ioSb.Information: %ld\n", ioSb.Information );
- ok( U(ioSb).Status == STATUS_SUCCESS, "Invalid ioSb.Status: %x\n", U(ioSb).Status);
- ok( completionValue == (ULONG_PTR)&o, "Invalid completion value: %lx\n", completionValue );
- ok( !memcmp( send_buf, recv_buf, TEST_BUF_LEN ), "Receive buffer (%x %x %x) did not match send buffer (%x %x %x)\n", recv_buf[0], recv_buf[1], recv_buf[2], send_buf[0], send_buf[1], send_buf[2] );
- }
+ res = pNtRemoveIoCompletion( h, &key, &value, &iosb, &timeout );
+ ok( res == STATUS_SUCCESS, "NtRemoveIoCompletion failed: %#x\n", res );
+ ok( key == CKEY_SECOND, "Invalid completion key: %#lx\n", key );
+ ok( iosb.Information == 3, "Invalid iosb.Information: %ld\n", iosb.Information );
+ ok( U(iosb).Status == STATUS_SUCCESS, "Invalid iosb.Status: %#x\n", U(iosb).Status );
+ ok( value == (ULONG_PTR)&o, "Invalid completion value: %#lx\n", value );
+ ok( !memcmp( send_buf, recv_buf, TEST_BUF_LEN ),
+ "Receive buffer (%02x %02x %02x) did not match send buffer (%02x %02x %02x)\n",
+ recv_buf[0], recv_buf[1], recv_buf[2], send_buf[0], send_buf[1], send_buf[2] );
+
count = get_pending_msgs(h);
ok( !count, "Unexpected msg count: %ld\n", count );
--
2.7.4
2
11
[PATCH 5/5] d2d1: Implement d2d_device_context_SetTarget() for bitmap targets.
by Henri Verbeet 28 Sep '18
by Henri Verbeet 28 Sep '18
28 Sep '18
From: Nikolay Sivov <nsivov(a)codeweavers.com>
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/d2d1/bitmap.c | 23 +++-
dlls/d2d1/bitmap_render_target.c | 74 ++++-------
dlls/d2d1/d2d1_private.h | 6 +-
dlls/d2d1/dc_render_target.c | 96 ++++++--------
dlls/d2d1/device.c | 270 +++++++++++++++++++++------------------
dlls/d2d1/hwnd_render_target.c | 19 ++-
dlls/d2d1/tests/d2d1.c | 68 +++++++---
7 files changed, 294 insertions(+), 262 deletions(-)
diff --git a/dlls/d2d1/bitmap.c b/dlls/d2d1/bitmap.c
index efb320445fb..3948c26ec90 100644
--- a/dlls/d2d1/bitmap.c
+++ b/dlls/d2d1/bitmap.c
@@ -70,6 +70,8 @@ static ULONG STDMETHODCALLTYPE d2d_bitmap_Release(ID2D1Bitmap1 *iface)
if (!refcount)
{
ID3D10ShaderResourceView_Release(bitmap->view);
+ if (bitmap->rtv)
+ ID3D10RenderTargetView_Release(bitmap->rtv);
if (bitmap->surface)
IDXGISurface_Release(bitmap->surface);
ID2D1Factory_Release(bitmap->factory);
@@ -274,6 +276,10 @@ static BOOL format_supported(const D2D1_PIXEL_FORMAT *format)
static void d2d_bitmap_init(struct d2d_bitmap *bitmap, struct d2d_device_context *context,
ID3D10ShaderResourceView *view, D2D1_SIZE_U size, const D2D1_BITMAP_PROPERTIES1 *desc)
{
+ ID3D10Resource *resource;
+ ID3D10Device *d3d_device;
+ HRESULT hr;
+
bitmap->ID2D1Bitmap1_iface.lpVtbl = &d2d_bitmap_vtbl;
bitmap->refcount = 1;
ID2D1Factory_AddRef(bitmap->factory = context->factory);
@@ -283,15 +289,22 @@ static void d2d_bitmap_init(struct d2d_bitmap *bitmap, struct d2d_device_context
bitmap->dpi_x = desc->dpiX;
bitmap->dpi_y = desc->dpiY;
bitmap->options = desc->bitmapOptions;
- if (d2d_device_context_is_dxgi_target(context))
- {
- ID3D10Resource *resource;
- ID3D10ShaderResourceView_GetResource(bitmap->view, &resource);
+ ID3D10ShaderResourceView_GetResource(bitmap->view, &resource);
+
+ if (d2d_device_context_is_dxgi_target(context))
ID3D10Resource_QueryInterface(resource, &IID_IDXGISurface, (void **)&bitmap->surface);
- ID3D10Resource_Release(resource);
+
+ if (bitmap->options & D2D1_BITMAP_OPTIONS_TARGET)
+ {
+ ID3D10Resource_GetDevice(resource, &d3d_device);
+ if (FAILED(hr = ID3D10Device_CreateRenderTargetView(d3d_device, resource, NULL, &bitmap->rtv)))
+ WARN("Failed to create rtv, hr %#x.\n", hr);
+ ID3D10Device_Release(d3d_device);
}
+ ID3D10Resource_Release(resource);
+
if (bitmap->dpi_x == 0.0f && bitmap->dpi_y == 0.0f)
{
bitmap->dpi_x = 96.0f;
diff --git a/dlls/d2d1/bitmap_render_target.c b/dlls/d2d1/bitmap_render_target.c
index df5b013a0b5..836fa567e70 100644
--- a/dlls/d2d1/bitmap_render_target.c
+++ b/dlls/d2d1/bitmap_render_target.c
@@ -69,7 +69,8 @@ static ULONG STDMETHODCALLTYPE d2d_bitmap_render_target_Release(ID2D1BitmapRende
if (!refcount)
{
IUnknown_Release(render_target->dxgi_inner);
- ID2D1Bitmap_Release(render_target->bitmap);
+ if (render_target->bitmap)
+ ID2D1Bitmap_Release(render_target->bitmap);
heap_free(render_target);
}
@@ -733,10 +734,9 @@ HRESULT d2d_bitmap_render_target_init(struct d2d_bitmap_render_target *render_ta
D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS options)
{
D2D1_RENDER_TARGET_PROPERTIES dxgi_rt_desc;
- D2D1_BITMAP_PROPERTIES bitmap_desc;
- D3D10_TEXTURE2D_DESC texture_desc;
- IDXGISurface *dxgi_surface;
- ID3D10Texture2D *texture;
+ D2D1_BITMAP_PROPERTIES1 bitmap_desc;
+ ID2D1DeviceContext *context;
+ D2D1_SIZE_U bitmap_size;
HRESULT hr;
if (options)
@@ -750,24 +750,24 @@ HRESULT d2d_bitmap_render_target_init(struct d2d_bitmap_render_target *render_ta
if (pixel_size)
{
- texture_desc.Width = pixel_size->width;
- texture_desc.Height = pixel_size->height;
+ bitmap_size.width = pixel_size->width;
+ bitmap_size.height = pixel_size->height;
}
else if (size)
{
- texture_desc.Width = ceilf((size->width * parent_target->desc.dpiX) / 96.0f);
- texture_desc.Height = ceilf((size->height * parent_target->desc.dpiY) / 96.0f);
+ bitmap_size.width = ceilf((size->width * parent_target->desc.dpiX) / 96.0f);
+ bitmap_size.height = ceilf((size->height * parent_target->desc.dpiY) / 96.0f);
}
else
{
- texture_desc.Width = parent_target->pixel_size.width;
- texture_desc.Height = parent_target->pixel_size.height;
+ bitmap_size.width = parent_target->pixel_size.width;
+ bitmap_size.height = parent_target->pixel_size.height;
}
- if (size)
+ if (size && size->width != 0.0f && size->height != 0.0f)
{
- dxgi_rt_desc.dpiX = (texture_desc.Width * 96.0f) / size->width;
- dxgi_rt_desc.dpiY = (texture_desc.Height * 96.0f) / size->height;
+ dxgi_rt_desc.dpiX = (bitmap_size.width * 96.0f) / size->width;
+ dxgi_rt_desc.dpiY = (bitmap_size.height * 96.0f) / size->height;
}
else
{
@@ -776,46 +776,21 @@ HRESULT d2d_bitmap_render_target_init(struct d2d_bitmap_render_target *render_ta
}
if (!pixel_format || pixel_format->format == DXGI_FORMAT_UNKNOWN)
- texture_desc.Format = parent_target->desc.pixelFormat.format;
+ dxgi_rt_desc.pixelFormat.format = parent_target->desc.pixelFormat.format;
else
- texture_desc.Format = pixel_format->format;
- dxgi_rt_desc.pixelFormat.format = texture_desc.Format;
+ dxgi_rt_desc.pixelFormat.format = pixel_format->format;
if (!pixel_format || pixel_format->alphaMode == D2D1_ALPHA_MODE_UNKNOWN)
dxgi_rt_desc.pixelFormat.alphaMode = D2D1_ALPHA_MODE_PREMULTIPLIED;
else
dxgi_rt_desc.pixelFormat.alphaMode = pixel_format->alphaMode;
- texture_desc.MipLevels = 1;
- texture_desc.ArraySize = 1;
- texture_desc.SampleDesc.Count = 1;
- texture_desc.SampleDesc.Quality = 0;
- texture_desc.Usage = D3D10_USAGE_DEFAULT;
- texture_desc.BindFlags = D3D10_BIND_RENDER_TARGET | D3D10_BIND_SHADER_RESOURCE;
- texture_desc.CPUAccessFlags = 0;
- texture_desc.MiscFlags = 0;
-
- if (FAILED(hr = ID3D10Device_CreateTexture2D(parent_target->d3d_device, &texture_desc, NULL, &texture)))
- {
- WARN("Failed to create texture, hr %#x.\n", hr);
- return hr;
- }
-
- hr = ID3D10Texture2D_QueryInterface(texture, &IID_IDXGISurface, (void **)&dxgi_surface);
- ID3D10Texture2D_Release(texture);
- if (FAILED(hr))
- {
- WARN("Failed to get DXGI surface interface, hr %#x.\n", hr);
- return hr;
- }
-
- if (FAILED(hr = d2d_d3d_create_render_target(parent_target->device, dxgi_surface,
+ if (FAILED(hr = d2d_d3d_create_render_target(parent_target->device, 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);
- IDXGISurface_Release(dxgi_surface);
return hr;
}
@@ -824,20 +799,23 @@ HRESULT d2d_bitmap_render_target_init(struct d2d_bitmap_render_target *render_ta
{
WARN("Failed to retrieve ID2D1RenderTarget interface, hr %#x.\n", hr);
IUnknown_Release(render_target->dxgi_inner);
- IDXGISurface_Release(dxgi_surface);
return hr;
}
bitmap_desc.pixelFormat = dxgi_rt_desc.pixelFormat;
bitmap_desc.dpiX = dxgi_rt_desc.dpiX;
bitmap_desc.dpiY = dxgi_rt_desc.dpiY;
-
- hr = ID2D1RenderTarget_CreateSharedBitmap(render_target->dxgi_target, &IID_IDXGISurface, dxgi_surface,
- &bitmap_desc, &render_target->bitmap);
- IDXGISurface_Release(dxgi_surface);
+ bitmap_desc.bitmapOptions = D2D1_BITMAP_OPTIONS_TARGET;
+ bitmap_desc.colorContext = NULL;
+
+ ID2D1RenderTarget_QueryInterface(render_target->dxgi_target, &IID_ID2D1DeviceContext, (void **)&context);
+ hr = ID2D1DeviceContext_CreateBitmap(context, bitmap_size, NULL, 0, &bitmap_desc,
+ (ID2D1Bitmap1 **)&render_target->bitmap);
+ ID2D1DeviceContext_SetTarget(context, (ID2D1Image *)render_target->bitmap);
+ ID2D1DeviceContext_Release(context);
if (FAILED(hr))
{
- WARN("Failed to create shared bitmap, hr %#x.\n", hr);
+ WARN("Failed to create target bitmap, hr %#x.\n", hr);
ID2D1RenderTarget_Release(render_target->dxgi_target);
IUnknown_Release(render_target->dxgi_inner);
return hr;
diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h
index 726d143d86e..0a5bc36c9ab 100644
--- a/dlls/d2d1/d2d1_private.h
+++ b/dlls/d2d1/d2d1_private.h
@@ -136,7 +136,7 @@ struct d2d_device_context
ID2D1Factory *factory;
ID2D1Device *device;
ID3D10Device *d3d_device;
- ID3D10RenderTargetView *view;
+ struct d2d_bitmap *target;
ID3D10StateBlock *stateblock;
struct d2d_shape_resources shape_resources[D2D_SHAPE_TYPE_COUNT];
ID3D10PixelShader *ps;
@@ -159,7 +159,6 @@ struct d2d_device_context
HRESULT d2d_d3d_create_render_target(ID2D1Device *device, IDXGISurface *surface, IUnknown *outer_unknown,
const struct d2d_device_context_ops *ops, const D2D1_RENDER_TARGET_PROPERTIES *desc,
void **render_target) DECLSPEC_HIDDEN;
-HRESULT d2d_d3d_render_target_create_rtv(ID2D1RenderTarget *render_target, IDXGISurface1 *surface) DECLSPEC_HIDDEN;
static inline BOOL d2d_device_context_is_dxgi_target(const struct d2d_device_context *context)
{
@@ -191,6 +190,8 @@ struct d2d_dc_render_target
LONG refcount;
IDXGISurface1 *dxgi_surface;
+ D2D1_PIXEL_FORMAT pixel_format;
+ ID3D10Device1 *d3d_device;
ID2D1RenderTarget *dxgi_target;
IUnknown *dxgi_inner;
@@ -345,6 +346,7 @@ struct d2d_bitmap
ID2D1Factory *factory;
ID3D10ShaderResourceView *view;
+ ID3D10RenderTargetView *rtv;
IDXGISurface *surface;
D2D1_SIZE_U pixel_size;
D2D1_PIXEL_FORMAT format;
diff --git a/dlls/d2d1/dc_render_target.c b/dlls/d2d1/dc_render_target.c
index 9a0f458fafe..b4306fb2fec 100644
--- a/dlls/d2d1/dc_render_target.c
+++ b/dlls/d2d1/dc_render_target.c
@@ -99,7 +99,9 @@ static ULONG STDMETHODCALLTYPE d2d_dc_render_target_Release(ID2D1DCRenderTarget
if (!refcount)
{
IUnknown_Release(render_target->dxgi_inner);
- IDXGISurface1_Release(render_target->dxgi_surface);
+ if (render_target->dxgi_surface)
+ IDXGISurface1_Release(render_target->dxgi_surface);
+ ID3D10Device1_Release(render_target->d3d_device);
heap_free(render_target);
}
@@ -686,8 +688,9 @@ static HRESULT STDMETHODCALLTYPE d2d_dc_render_target_BindDC(ID2D1DCRenderTarget
struct d2d_dc_render_target *render_target = impl_from_ID2D1DCRenderTarget(iface);
D3D10_TEXTURE2D_DESC texture_desc;
IDXGISurface1 *dxgi_surface;
+ ID2D1DeviceContext *context;
ID3D10Texture2D *texture;
- ID3D10Device *device;
+ ID2D1Bitmap1 *bitmap;
HRESULT hr;
TRACE("iface %p, hdc %p, rect %s.\n", iface, hdc, wine_dbgstr_rect(rect));
@@ -695,27 +698,19 @@ static HRESULT STDMETHODCALLTYPE d2d_dc_render_target_BindDC(ID2D1DCRenderTarget
if (!hdc)
return E_INVALIDARG;
- /* Recreate surface using specified size and original texture description. */
- if (FAILED(hr = IDXGISurface1_QueryInterface(render_target->dxgi_surface, &IID_ID3D10Texture2D, (void **)&texture)))
- {
- WARN("Failed to get texture interface, hr %#x.\n", hr);
- return hr;
- }
-
- ID3D10Texture2D_GetDesc(texture, &texture_desc);
- ID3D10Texture2D_Release(texture);
texture_desc.Width = rect->right - rect->left;
texture_desc.Height = rect->bottom - rect->top;
+ texture_desc.MipLevels = 1;
+ texture_desc.ArraySize = 1;
+ texture_desc.Format = render_target->pixel_format.format;
+ texture_desc.SampleDesc.Count = 1;
+ texture_desc.SampleDesc.Quality = 0;
+ texture_desc.Usage = D3D10_USAGE_DEFAULT;
+ texture_desc.BindFlags = D3D10_BIND_RENDER_TARGET | D3D10_BIND_SHADER_RESOURCE;
+ texture_desc.CPUAccessFlags = 0;
+ texture_desc.MiscFlags = D3D10_RESOURCE_MISC_GDI_COMPATIBLE;
- if (FAILED(hr = IDXGISurface1_GetDevice(render_target->dxgi_surface, &IID_ID3D10Device, (void **)&device)))
- {
- WARN("Failed to get device from dxgi surface, hr %#x.\n", hr);
- return hr;
- }
-
- hr = ID3D10Device_CreateTexture2D(device, &texture_desc, NULL, &texture);
- ID3D10Device_Release(device);
- if (FAILED(hr))
+ if (FAILED(hr = ID3D10Device1_CreateTexture2D(render_target->d3d_device, &texture_desc, NULL, &texture)))
{
WARN("Failed to create texture, hr %#x.\n", hr);
return hr;
@@ -730,14 +725,24 @@ static HRESULT STDMETHODCALLTYPE d2d_dc_render_target_BindDC(ID2D1DCRenderTarget
}
/* Switch dxgi target to new surface. */
- if (FAILED(hr = d2d_d3d_render_target_create_rtv(render_target->dxgi_target, dxgi_surface)))
+ ID2D1RenderTarget_QueryInterface(render_target->dxgi_target, &IID_ID2D1DeviceContext, (void **)&context);
+ hr = ID2D1DeviceContext_CreateBitmapFromDxgiSurface(context, (IDXGISurface *)dxgi_surface, NULL, &bitmap);
+ if (SUCCEEDED(hr))
{
- WARN("Failed to set new surface, hr %#x.\n", hr);
+ ID2D1DeviceContext_SetTarget(context, (ID2D1Image *)bitmap);
+ ID2D1Bitmap1_Release(bitmap);
+ }
+ ID2D1DeviceContext_Release(context);
+
+ if (FAILED(hr))
+ {
+ WARN("Failed to create new target bitmap, hr %#x.\n", hr);
IDXGISurface1_Release(dxgi_surface);
return hr;
}
- IDXGISurface1_Release(render_target->dxgi_surface);
+ if (render_target->dxgi_surface)
+ IDXGISurface1_Release(render_target->dxgi_surface);
render_target->dxgi_surface = dxgi_surface;
render_target->hdc = hdc;
@@ -816,8 +821,6 @@ static const struct d2d_device_context_ops d2d_dc_render_target_ops =
HRESULT d2d_dc_render_target_init(struct d2d_dc_render_target *render_target, ID2D1Factory1 *factory,
ID3D10Device1 *d3d_device, const D2D1_RENDER_TARGET_PROPERTIES *desc)
{
- D3D10_TEXTURE2D_DESC texture_desc;
- ID3D10Texture2D *texture;
IDXGIDevice *dxgi_device;
ID2D1Device *device;
HRESULT hr;
@@ -828,14 +831,8 @@ HRESULT d2d_dc_render_target_init(struct d2d_dc_render_target *render_target, ID
SetRectEmpty(&render_target->dst_rect);
render_target->hdc = NULL;
- /* Dummy 1x1 texture, recreated on BindDC(). */
- texture_desc.Width = 1;
- texture_desc.Height = 1;
- texture_desc.MipLevels = 1;
- texture_desc.ArraySize = 1;
-
- texture_desc.Format = desc->pixelFormat.format;
- switch (texture_desc.Format)
+ render_target->pixel_format = desc->pixelFormat;
+ switch (desc->pixelFormat.format)
{
case DXGI_FORMAT_B8G8R8A8_UNORM:
if (desc->pixelFormat.alphaMode == D2D1_ALPHA_MODE_PREMULTIPLIED
@@ -843,31 +840,10 @@ HRESULT d2d_dc_render_target_init(struct d2d_dc_render_target *render_target, ID
break;
default:
- FIXME("Unhandled format %#x, alpha mode %u.\n", texture_desc.Format, desc->pixelFormat.alphaMode);
+ FIXME("Unhandled format %#x, alpha mode %u.\n", desc->pixelFormat.format, desc->pixelFormat.alphaMode);
return D2DERR_UNSUPPORTED_PIXEL_FORMAT;
}
- texture_desc.SampleDesc.Count = 1;
- texture_desc.SampleDesc.Quality = 0;
- texture_desc.Usage = D3D10_USAGE_DEFAULT;
- texture_desc.BindFlags = D3D10_BIND_RENDER_TARGET | D3D10_BIND_SHADER_RESOURCE;
- texture_desc.CPUAccessFlags = 0;
- texture_desc.MiscFlags = D3D10_RESOURCE_MISC_GDI_COMPATIBLE;
-
- if (FAILED(hr = ID3D10Device1_CreateTexture2D(d3d_device, &texture_desc, NULL, &texture)))
- {
- WARN("Failed to create texture, hr %#x.\n", hr);
- return hr;
- }
-
- hr = ID3D10Texture2D_QueryInterface(texture, &IID_IDXGISurface1, (void **)&render_target->dxgi_surface);
- ID3D10Texture2D_Release(texture);
- if (FAILED(hr))
- {
- WARN("Failed to get DXGI surface interface, hr %#x.\n", hr);
- return hr;
- }
-
if (FAILED(hr = ID3D10Device1_QueryInterface(d3d_device, &IID_IDXGIDevice, (void **)&dxgi_device)))
{
WARN("Failed to get DXGI device interface, hr %#x.\n", hr);
@@ -882,14 +858,12 @@ HRESULT d2d_dc_render_target_init(struct d2d_dc_render_target *render_target, ID
return hr;
}
- hr = d2d_d3d_create_render_target(device, (IDXGISurface *)render_target->dxgi_surface,
- (IUnknown *)&render_target->ID2D1DCRenderTarget_iface, &d2d_dc_render_target_ops,
- desc, (void **)&render_target->dxgi_inner);
+ hr = d2d_d3d_create_render_target(device, NULL, (IUnknown *)&render_target->ID2D1DCRenderTarget_iface,
+ &d2d_dc_render_target_ops, desc, (void **)&render_target->dxgi_inner);
ID2D1Device_Release(device);
if (FAILED(hr))
{
WARN("Failed to create DXGI surface render target, hr %#x.\n", hr);
- IDXGISurface1_Release(render_target->dxgi_surface);
return hr;
}
@@ -898,9 +872,11 @@ HRESULT d2d_dc_render_target_init(struct d2d_dc_render_target *render_target, ID
{
WARN("Failed to retrieve ID2D1RenderTarget interface, hr %#x.\n", hr);
IUnknown_Release(render_target->dxgi_inner);
- IDXGISurface1_Release(render_target->dxgi_surface);
return hr;
}
+ render_target->d3d_device = d3d_device;
+ ID3D10Device1_AddRef(render_target->d3d_device);
+
return S_OK;
}
diff --git a/dlls/d2d1/device.c b/dlls/d2d1/device.c
index 9bf8ef65acd..97ec0afe88c 100644
--- a/dlls/d2d1/device.c
+++ b/dlls/d2d1/device.c
@@ -43,6 +43,8 @@ static inline struct d2d_device *impl_from_ID2D1Device(ID2D1Device *iface)
return CONTAINING_RECORD(iface, struct d2d_device, ID2D1Device_iface);
}
+static struct d2d_device *unsafe_impl_from_ID2D1Device(ID2D1Device *iface);
+
static ID2D1Brush *d2d_draw_get_text_brush(struct d2d_draw_text_layout_ctx *context, IUnknown *effect)
{
ID2D1Brush *brush = NULL;
@@ -175,7 +177,7 @@ static void d2d_device_context_draw(struct d2d_device_context *render_target, en
}
ID3D10Device_RSSetScissorRects(device, 1, &scissor_rect);
ID3D10Device_RSSetState(device, render_target->rs);
- ID3D10Device_OMSetRenderTargets(device, 1, &render_target->view, NULL);
+ ID3D10Device_OMSetRenderTargets(device, 1, &render_target->target->rtv, NULL);
if (brush)
{
ID3D10Device_OMSetBlendState(device, render_target->bs, blend_factor, D3D10_DEFAULT_SAMPLE_MASK);
@@ -261,7 +263,8 @@ static ULONG STDMETHODCALLTYPE d2d_device_context_inner_Release(IUnknown *iface)
IDWriteRenderingParams_Release(context->default_text_rendering_params);
if (context->text_rendering_params)
IDWriteRenderingParams_Release(context->text_rendering_params);
- ID3D10BlendState_Release(context->bs);
+ if (context->bs)
+ ID3D10BlendState_Release(context->bs);
ID3D10RasterizerState_Release(context->rs);
ID3D10Buffer_Release(context->vb);
ID3D10Buffer_Release(context->ib);
@@ -272,7 +275,8 @@ static ULONG STDMETHODCALLTYPE d2d_device_context_inner_Release(IUnknown *iface)
ID3D10InputLayout_Release(context->shape_resources[i].il);
}
context->stateblock->lpVtbl->Release(context->stateblock);
- ID3D10RenderTargetView_Release(context->view);
+ if (context->target)
+ ID2D1Bitmap1_Release(&context->target->ID2D1Bitmap1_iface);
ID3D10Device_Release(context->d3d_device);
ID2D1Factory_Release(context->factory);
ID2D1Device_Release(context->device);
@@ -1979,14 +1983,95 @@ static void STDMETHODCALLTYPE d2d_device_context_GetDevice(ID2D1DeviceContext *i
ID2D1Device_AddRef(*device);
}
+static void d2d_device_context_reset_target(struct d2d_device_context *context)
+{
+ if (!context->target)
+ return;
+
+ ID2D1Bitmap1_Release(&context->target->ID2D1Bitmap1_iface);
+ context->target = NULL;
+
+ context->desc.dpiX = 96.0f;
+ context->desc.dpiY = 96.0f;
+
+ memset(&context->desc.pixelFormat, 0, sizeof(context->desc.pixelFormat));
+ memset(&context->pixel_size, 0, sizeof(context->pixel_size));
+
+ ID3D10BlendState_Release(context->bs);
+ context->bs = NULL;
+}
+
static void STDMETHODCALLTYPE d2d_device_context_SetTarget(ID2D1DeviceContext *iface, ID2D1Image *target)
{
- FIXME("iface %p, target %p stub!\n", iface, target);
+ struct d2d_device_context *context = impl_from_ID2D1DeviceContext(iface);
+ struct d2d_bitmap *bitmap_impl;
+ D3D10_BLEND_DESC blend_desc;
+ ID2D1Bitmap *bitmap;
+ HRESULT hr;
+
+ TRACE("iface %p, target %p.\n", iface, target);
+
+ if (!target)
+ {
+ d2d_device_context_reset_target(context);
+ return;
+ }
+
+ if (FAILED(ID2D1Image_QueryInterface(target, &IID_ID2D1Bitmap, (void **)&bitmap)))
+ {
+ FIXME("Only bitmap targets are supported.\n");
+ return;
+ }
+
+ bitmap_impl = unsafe_impl_from_ID2D1Bitmap(bitmap);
+
+ if (!(bitmap_impl->options & D2D1_BITMAP_OPTIONS_TARGET))
+ {
+ context->error.code = D2DERR_INVALID_TARGET;
+ context->error.tag1 = context->drawing_state.tag1;
+ context->error.tag2 = context->drawing_state.tag2;
+ return;
+ }
+
+ d2d_device_context_reset_target(context);
+
+ /* Set sizes and pixel format. */
+ context->desc.dpiX = bitmap_impl->dpi_x;
+ context->desc.dpiY = bitmap_impl->dpi_y;
+ context->pixel_size = bitmap_impl->pixel_size;
+ context->desc.pixelFormat = bitmap_impl->format;
+ context->target = bitmap_impl;
+
+ memset(&blend_desc, 0, sizeof(blend_desc));
+ blend_desc.BlendEnable[0] = TRUE;
+ blend_desc.SrcBlend = D3D10_BLEND_ONE;
+ blend_desc.DestBlend = D3D10_BLEND_INV_SRC_ALPHA;
+ blend_desc.BlendOp = D3D10_BLEND_OP_ADD;
+ if (context->desc.pixelFormat.alphaMode == D2D1_ALPHA_MODE_IGNORE)
+ {
+ blend_desc.SrcBlendAlpha = D3D10_BLEND_ZERO;
+ blend_desc.DestBlendAlpha = D3D10_BLEND_ONE;
+ }
+ else
+ {
+ blend_desc.SrcBlendAlpha = D3D10_BLEND_ONE;
+ blend_desc.DestBlendAlpha = D3D10_BLEND_INV_SRC_ALPHA;
+ }
+ blend_desc.BlendOpAlpha = D3D10_BLEND_OP_ADD;
+ blend_desc.RenderTargetWriteMask[0] = D3D10_COLOR_WRITE_ENABLE_ALL;
+ if (FAILED(hr = ID3D10Device_CreateBlendState(context->d3d_device, &blend_desc, &context->bs)))
+ WARN("Failed to create blend state, hr %#x.\n", hr);
}
static void STDMETHODCALLTYPE d2d_device_context_GetTarget(ID2D1DeviceContext *iface, ID2D1Image **target)
{
- FIXME("iface %p, target %p stub!\n", iface, target);
+ struct d2d_device_context *context = impl_from_ID2D1DeviceContext(iface);
+
+ TRACE("iface %p, target %p.\n", iface, target);
+
+ *target = context->target ? (ID2D1Image *)&context->target->ID2D1Bitmap1_iface : NULL;
+ if (*target)
+ ID2D1Image_AddRef(*target);
}
static void STDMETHODCALLTYPE d2d_device_context_SetRenderingControls(ID2D1DeviceContext *iface,
@@ -2538,7 +2623,7 @@ static HRESULT d2d_device_context_get_surface(struct d2d_device_context *render_
ID3D10Resource *resource;
HRESULT hr;
- ID3D10RenderTargetView_GetResource(render_target->view, &resource);
+ ID3D10RenderTargetView_GetResource(render_target->target->rtv, &resource);
hr = ID3D10Resource_QueryInterface(resource, &IID_IDXGISurface1, (void **)surface);
ID3D10Resource_Release(resource);
if (FAILED(hr))
@@ -2600,17 +2685,14 @@ static const struct ID2D1GdiInteropRenderTargetVtbl d2d_gdi_interop_render_targe
};
static HRESULT d2d_device_context_init(struct d2d_device_context *render_target, ID2D1Device *device,
- IDXGISurface *surface, IUnknown *outer_unknown, const struct d2d_device_context_ops *ops,
- const D2D1_RENDER_TARGET_PROPERTIES *desc)
+ IUnknown *outer_unknown, const struct d2d_device_context_ops *ops)
{
D3D10_SUBRESOURCE_DATA buffer_data;
D3D10_STATE_BLOCK_MASK state_mask;
- DXGI_SURFACE_DESC surface_desc;
+ struct d2d_device *device_impl;
IDWriteFactory *dwrite_factory;
D3D10_RASTERIZER_DESC rs_desc;
D3D10_BUFFER_DESC buffer_desc;
- D3D10_BLEND_DESC blend_desc;
- ID3D10Resource *resource;
unsigned int i;
HRESULT hr;
@@ -3460,25 +3542,6 @@ static HRESULT d2d_device_context_init(struct d2d_device_context *render_target,
{ 1.0f, -1.0f},
};
static const UINT16 indices[] = {0, 1, 2, 2, 1, 3};
- float dpi_x, dpi_y;
-
- dpi_x = desc->dpiX;
- dpi_y = desc->dpiY;
-
- if (dpi_x == 0.0f && dpi_y == 0.0f)
- {
- dpi_x = 96.0f;
- dpi_y = 96.0f;
- }
- else if (dpi_x <= 0.0f || dpi_y <= 0.0f)
- return E_INVALIDARG;
-
- if (desc->type != D2D1_RENDER_TARGET_TYPE_DEFAULT && desc->type != D2D1_RENDER_TARGET_TYPE_HARDWARE)
- WARN("Ignoring render target type %#x.\n", desc->type);
- if (desc->usage != D2D1_RENDER_TARGET_USAGE_NONE)
- FIXME("Ignoring render target usage %#x.\n", desc->usage);
- if (desc->minLevel != D2D1_FEATURE_LEVEL_DEFAULT)
- WARN("Ignoring feature level %#x.\n", desc->minLevel);
render_target->ID2D1DeviceContext_iface.lpVtbl = &d2d_device_context_vtbl;
render_target->ID2D1GdiInteropRenderTarget_iface.lpVtbl = &d2d_gdi_interop_render_target_vtbl;
@@ -3492,27 +3555,15 @@ static HRESULT d2d_device_context_init(struct d2d_device_context *render_target,
render_target->outer_unknown = outer_unknown ? outer_unknown : &render_target->IUnknown_iface;
render_target->ops = ops;
- if (FAILED(hr = IDXGISurface_GetDevice(surface, &IID_ID3D10Device, (void **)&render_target->d3d_device)))
+ device_impl = unsafe_impl_from_ID2D1Device(device);
+ if (FAILED(hr = IDXGIDevice_QueryInterface(device_impl->dxgi_device,
+ &IID_ID3D10Device, (void **)&render_target->d3d_device)))
{
WARN("Failed to get device interface, hr %#x.\n", hr);
ID2D1Factory_Release(render_target->factory);
return hr;
}
- if (FAILED(hr = IDXGISurface_QueryInterface(surface, &IID_ID3D10Resource, (void **)&resource)))
- {
- WARN("Failed to get ID3D10Resource interface, hr %#x.\n", hr);
- goto err;
- }
-
- hr = ID3D10Device_CreateRenderTargetView(render_target->d3d_device, resource, NULL, &render_target->view);
- ID3D10Resource_Release(resource);
- if (FAILED(hr))
- {
- WARN("Failed to create rendertarget view, hr %#x.\n", hr);
- goto err;
- }
-
if (FAILED(hr = D3D10StateBlockMaskEnableAll(&state_mask)))
{
WARN("Failed to create stateblock mask, hr %#x.\n", hr);
@@ -3597,29 +3648,6 @@ static HRESULT d2d_device_context_init(struct d2d_device_context *render_target,
goto err;
}
- memset(&blend_desc, 0, sizeof(blend_desc));
- blend_desc.BlendEnable[0] = TRUE;
- blend_desc.SrcBlend = D3D10_BLEND_ONE;
- blend_desc.DestBlend = D3D10_BLEND_INV_SRC_ALPHA;
- blend_desc.BlendOp = D3D10_BLEND_OP_ADD;
- if (desc->pixelFormat.alphaMode == D2D1_ALPHA_MODE_IGNORE)
- {
- blend_desc.SrcBlendAlpha = D3D10_BLEND_ZERO;
- blend_desc.DestBlendAlpha = D3D10_BLEND_ONE;
- }
- else
- {
- blend_desc.SrcBlendAlpha = D3D10_BLEND_ONE;
- blend_desc.DestBlendAlpha = D3D10_BLEND_INV_SRC_ALPHA;
- }
- blend_desc.BlendOpAlpha = D3D10_BLEND_OP_ADD;
- blend_desc.RenderTargetWriteMask[0] = D3D10_COLOR_WRITE_ENABLE_ALL;
- if (FAILED(hr = ID3D10Device_CreateBlendState(render_target->d3d_device, &blend_desc, &render_target->bs)))
- {
- WARN("Failed to create blend state, hr %#x.\n", hr);
- goto err;
- }
-
if (FAILED(hr = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED,
&IID_IDWriteFactory, (IUnknown **)&dwrite_factory)))
{
@@ -3635,15 +3663,6 @@ static HRESULT d2d_device_context_init(struct d2d_device_context *render_target,
goto err;
}
- if (FAILED(hr = IDXGISurface_GetDesc(surface, &surface_desc)))
- {
- WARN("Failed to get surface desc, hr %#x.\n", hr);
- goto err;
- }
-
- render_target->desc.pixelFormat = desc->pixelFormat;
- render_target->pixel_size.width = surface_desc.Width;
- render_target->pixel_size.height = surface_desc.Height;
render_target->drawing_state.transform = identity;
if (!d2d_clip_stack_init(&render_target->clip_stack))
@@ -3653,16 +3672,14 @@ static HRESULT d2d_device_context_init(struct d2d_device_context *render_target,
goto err;
}
- render_target->desc.dpiX = dpi_x;
- render_target->desc.dpiY = dpi_y;
+ render_target->desc.dpiX = 96.0f;
+ render_target->desc.dpiY = 96.0f;
return S_OK;
err:
if (render_target->default_text_rendering_params)
IDWriteRenderingParams_Release(render_target->default_text_rendering_params);
- if (render_target->bs)
- ID3D10BlendState_Release(render_target->bs);
if (render_target->rs)
ID3D10RasterizerState_Release(render_target->rs);
if (render_target->vb)
@@ -3680,8 +3697,6 @@ err:
}
if (render_target->stateblock)
render_target->stateblock->lpVtbl->Release(render_target->stateblock);
- if (render_target->view)
- ID3D10RenderTargetView_Release(render_target->view);
if (render_target->d3d_device)
ID3D10Device_Release(render_target->d3d_device);
ID2D1Device_Release(render_target->device);
@@ -3692,65 +3707,62 @@ err:
HRESULT d2d_d3d_create_render_target(ID2D1Device *device, IDXGISurface *surface, IUnknown *outer_unknown,
const struct d2d_device_context_ops *ops, const D2D1_RENDER_TARGET_PROPERTIES *desc, void **render_target)
{
+ D2D1_BITMAP_PROPERTIES1 bitmap_desc;
struct d2d_device_context *object;
+ ID2D1Bitmap1 *bitmap;
HRESULT hr;
+ if (desc->type != D2D1_RENDER_TARGET_TYPE_DEFAULT && desc->type != D2D1_RENDER_TARGET_TYPE_HARDWARE)
+ WARN("Ignoring render target type %#x.\n", desc->type);
+ if (desc->usage != D2D1_RENDER_TARGET_USAGE_NONE)
+ FIXME("Ignoring render target usage %#x.\n", desc->usage);
+ if (desc->minLevel != D2D1_FEATURE_LEVEL_DEFAULT)
+ WARN("Ignoring feature level %#x.\n", desc->minLevel);
+
+ bitmap_desc.dpiX = desc->dpiX;
+ bitmap_desc.dpiY = desc->dpiY;
+
+ if (bitmap_desc.dpiX == 0.0f && bitmap_desc.dpiY == 0.0f)
+ {
+ bitmap_desc.dpiX = 96.0f;
+ bitmap_desc.dpiY = 96.0f;
+ }
+ else if (bitmap_desc.dpiX <= 0.0f || bitmap_desc.dpiY <= 0.0f)
+ return E_INVALIDARG;
+
if (!(object = heap_alloc_zero(sizeof(*object))))
return E_OUTOFMEMORY;
- if (FAILED(hr = d2d_device_context_init(object, device, surface, outer_unknown, ops, desc)))
+ if (FAILED(hr = d2d_device_context_init(object, device, outer_unknown, ops)))
{
WARN("Failed to initialize render target, hr %#x.\n", hr);
heap_free(object);
return hr;
}
- TRACE("Created render target %p.\n", object);
- *render_target = outer_unknown ? &object->IUnknown_iface : (IUnknown *)&object->ID2D1DeviceContext_iface;
-
- return S_OK;
-}
-
-HRESULT d2d_d3d_render_target_create_rtv(ID2D1RenderTarget *iface, IDXGISurface1 *surface)
-{
- struct d2d_device_context *render_target = impl_from_ID2D1RenderTarget(iface);
- DXGI_SURFACE_DESC surface_desc;
- ID3D10RenderTargetView *view;
- ID3D10Resource *resource;
- HRESULT hr;
-
- if (!surface)
+ if (surface)
{
- ID3D10RenderTargetView_Release(render_target->view);
- render_target->view = NULL;
- return S_OK;
- }
-
- if (FAILED(hr = IDXGISurface1_GetDesc(surface, &surface_desc)))
- {
- WARN("Failed to get surface desc, hr %#x.\n", hr);
- return hr;
- }
+ bitmap_desc.pixelFormat = desc->pixelFormat;
+ bitmap_desc.bitmapOptions = D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW;
+ bitmap_desc.colorContext = NULL;
- if (FAILED(hr = IDXGISurface1_QueryInterface(surface, &IID_ID3D10Resource, (void **)&resource)))
- {
- WARN("Failed to get ID3D10Resource interface, hr %#x.\n", hr);
- return hr;
- }
+ if (FAILED(hr = ID2D1DeviceContext_CreateBitmapFromDxgiSurface(&object->ID2D1DeviceContext_iface,
+ surface, &bitmap_desc, &bitmap)))
+ {
+ WARN("Failed to create target bitmap, hr %#x.\n", hr);
+ IUnknown_Release(&object->IUnknown_iface);
+ heap_free(object);
+ return hr;
+ }
- hr = ID3D10Device_CreateRenderTargetView(render_target->d3d_device, resource, NULL, &view);
- ID3D10Resource_Release(resource);
- if (FAILED(hr))
- {
- WARN("Failed to create rendertarget view, hr %#x.\n", hr);
- return hr;
+ ID2D1DeviceContext_SetTarget(&object->ID2D1DeviceContext_iface, (ID2D1Image *)bitmap);
+ ID2D1Bitmap1_Release(bitmap);
}
+ else
+ object->desc.pixelFormat = desc->pixelFormat;
- render_target->pixel_size.width = surface_desc.Width;
- render_target->pixel_size.height = surface_desc.Height;
- if (render_target->view)
- ID3D10RenderTargetView_Release(render_target->view);
- render_target->view = view;
+ TRACE("Created render target %p.\n", object);
+ *render_target = outer_unknown ? &object->IUnknown_iface : (IUnknown *)&object->ID2D1DeviceContext_iface;
return S_OK;
}
@@ -3861,6 +3873,14 @@ static const struct ID2D1DeviceVtbl d2d_device_vtbl =
d2d_device_ClearResources,
};
+static struct d2d_device *unsafe_impl_from_ID2D1Device(ID2D1Device *iface)
+{
+ if (!iface)
+ return NULL;
+ assert(iface->lpVtbl == &d2d_device_vtbl);
+ return CONTAINING_RECORD(iface, struct d2d_device, ID2D1Device_iface);
+}
+
void d2d_device_init(struct d2d_device *device, ID2D1Factory1 *iface, IDXGIDevice *dxgi_device)
{
device->ID2D1Device_iface.lpVtbl = &d2d_device_vtbl;
diff --git a/dlls/d2d1/hwnd_render_target.c b/dlls/d2d1/hwnd_render_target.c
index 9b8771f895d..d0b96959338 100644
--- a/dlls/d2d1/hwnd_render_target.c
+++ b/dlls/d2d1/hwnd_render_target.c
@@ -675,11 +675,14 @@ static HRESULT STDMETHODCALLTYPE d2d_hwnd_render_target_Resize(ID2D1HwndRenderTa
{
struct d2d_hwnd_render_target *render_target = impl_from_ID2D1HwndRenderTarget(iface);
IDXGISurface1 *dxgi_surface;
+ ID2D1DeviceContext *context;
+ ID2D1Bitmap1 *bitmap;
HRESULT hr;
TRACE("iface %p, width %u, height %u.\n", iface, size->width, size->height);
- d2d_d3d_render_target_create_rtv(render_target->dxgi_target, NULL);
+ ID2D1RenderTarget_QueryInterface(render_target->dxgi_target, &IID_ID2D1DeviceContext, (void **)&context);
+ ID2D1DeviceContext_SetTarget(context, NULL);
if (SUCCEEDED(hr = IDXGISwapChain_ResizeBuffers(render_target->swapchain, 1, size->width, size->height,
DXGI_FORMAT_UNKNOWN, 0)))
@@ -688,13 +691,25 @@ static HRESULT STDMETHODCALLTYPE d2d_hwnd_render_target_Resize(ID2D1HwndRenderTa
(void **)&dxgi_surface)))
{
WARN("Failed to get buffer, hr %#x.\n", hr);
+ ID2D1DeviceContext_Release(context);
return hr;
}
- hr = d2d_d3d_render_target_create_rtv(render_target->dxgi_target, dxgi_surface);
+ hr = ID2D1DeviceContext_CreateBitmapFromDxgiSurface(context, (IDXGISurface *)dxgi_surface, NULL, &bitmap);
IDXGISurface1_Release(dxgi_surface);
+ if (FAILED(hr))
+ {
+ WARN("Failed to create target bitmap, hr %#x.\n", hr);
+ ID2D1DeviceContext_Release(context);
+ return hr;
+ }
+
+ ID2D1DeviceContext_SetTarget(context, (ID2D1Image *)bitmap);
+ ID2D1Bitmap1_Release(bitmap);
}
+ ID2D1DeviceContext_Release(context);
+
return hr;
}
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index 97d27dad36c..54d5618f171 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -813,8 +813,9 @@ static void check_bitmap_surface_(unsigned int line, ID2D1Bitmap *bitmap, BOOL h
if (!(options & D2D1_BITMAP_OPTIONS_CANNOT_DRAW))
bind_flags |= D3D10_BIND_SHADER_RESOURCE;
- ok_(__FILE__, line)(desc.BindFlags == bind_flags, "Unexpected bind flags %#x for bitmap options %#x.\n",
- desc.BindFlags, options);
+ todo_wine_if (options == D2D1_BITMAP_OPTIONS_TARGET)
+ ok_(__FILE__, line)(desc.BindFlags == bind_flags, "Unexpected bind flags %#x for bitmap options %#x.\n",
+ desc.BindFlags, options);
ok_(__FILE__, line)(!desc.CPUAccessFlags, "Unexpected cpu access flags %#x.\n", desc.CPUAccessFlags);
ok_(__FILE__, line)(!desc.MiscFlags, "Unexpected misc flags %#x.\n", desc.MiscFlags);
@@ -5283,9 +5284,7 @@ static void test_compatible_target_size_(unsigned int line, ID2D1RenderTarget *r
{
hr = ID2D1RenderTarget_CreateCompatibleRenderTarget(rt, size_tests[i].size, size_tests[i].pixel_size,
NULL, D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_NONE, &bitmap_rt);
- todo_wine ok_(__FILE__, line)(SUCCEEDED(hr), "%u: Failed to create render target, hr %#x.\n", i, hr);
- if (FAILED(hr))
- return;
+ ok_(__FILE__, line)(SUCCEEDED(hr), "%u: Failed to create render target, hr %#x.\n", i, hr);
if (size_tests[i].pixel_size)
{
@@ -5519,13 +5518,11 @@ static void test_bitmap_target(void)
ok(SUCCEEDED(hr), "Failed to create render target, hr %#x.\n", hr);
pixel_size = ID2D1BitmapRenderTarget_GetPixelSize(rt);
-todo_wine
ok(pixel_size.width == 0 && pixel_size.height == 0, "Got wrong size\n");
hr = ID2D1BitmapRenderTarget_GetBitmap(rt, &bitmap);
ok(SUCCEEDED(hr), "GetBitmap() failed, hr %#x.\n", hr);
pixel_size = ID2D1Bitmap_GetPixelSize(bitmap);
-todo_wine
ok(pixel_size.width == 0 && pixel_size.height == 0, "Got wrong size\n");
ID2D1Bitmap_Release(bitmap);
@@ -6989,14 +6986,10 @@ static void check_rt_bitmap_surface_(unsigned int line, ID2D1RenderTarget *rt, B
bitmap2 = NULL;
ID2D1DeviceContext_GetTarget(context2, (ID2D1Image **)&bitmap2);
- todo_wine ok_(__FILE__, line)(bitmap2 == bitmap, "Unexpected bitmap.\n");
-
- if (bitmap2)
- {
- check_bitmap_surface_(line, bitmap, has_surface, D2D1_BITMAP_OPTIONS_TARGET);
+ ok_(__FILE__, line)(bitmap2 == bitmap, "Unexpected bitmap.\n");
- ID2D1Bitmap_Release(bitmap2);
- }
+ check_bitmap_surface_(line, bitmap, has_surface, D2D1_BITMAP_OPTIONS_TARGET);
+ ID2D1Bitmap_Release(bitmap2);
ID2D1Bitmap_Release(bitmap);
ID2D1BitmapRenderTarget_Release(compatible_rt);
@@ -7093,6 +7086,8 @@ static void test_bitmap_surface(void)
ID2D1Bitmap1 *bitmap;
ID2D1Device *device;
ID2D1Image *target;
+ D2D1_SIZE_U size;
+ D2D1_TAG t1, t2;
unsigned int i;
HWND window;
HRESULT hr;
@@ -7126,14 +7121,10 @@ static void test_bitmap_surface(void)
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);
@@ -7213,8 +7204,45 @@ if (SUCCEEDED(hr))
check_rt_bitmap_surface((ID2D1RenderTarget *)device_context, TRUE, D2D1_BITMAP_OPTIONS_NONE);
- ID2D1DeviceContext_Release(device_context);
ID2D1Bitmap1_Release(bitmap);
+
+ /* Without D2D1_BITMAP_OPTIONS_TARGET. */
+ memset(&bitmap_desc, 0, sizeof(bitmap_desc));
+ bitmap_desc.pixelFormat = ID2D1DeviceContext_GetPixelFormat(device_context);
+ size.width = size.height = 4;
+ hr = ID2D1DeviceContext_CreateBitmap(device_context, size, NULL, 0, &bitmap_desc, &bitmap);
+ ok(SUCCEEDED(hr), "Failed to create a bitmap, hr %#x.\n", hr);
+ check_bitmap_surface((ID2D1Bitmap *)bitmap, TRUE, D2D1_BITMAP_OPTIONS_NONE);
+ ID2D1DeviceContext_SetTags(device_context, 1, 2);
+
+ ID2D1DeviceContext_BeginDraw(device_context);
+ ID2D1DeviceContext_SetTarget(device_context, (ID2D1Image *)bitmap);
+ hr = ID2D1DeviceContext_EndDraw(device_context, &t1, &t2);
+ ok(hr == D2DERR_INVALID_TARGET, "Unexpected hr %#x.\n", hr);
+ ok(t1 == 1 && t2 == 2, "Unexpected tags %s:%s.\n", wine_dbgstr_longlong(t1), wine_dbgstr_longlong(t2));
+
+ ID2D1Bitmap1_Release(bitmap);
+
+ ID2D1DeviceContext_GetTarget(device_context, (ID2D1Image **)&bitmap);
+ ok(!!bitmap, "Expected target bitmap.\n");
+ ID2D1Bitmap1_Release(bitmap);
+
+ bitmap_desc.bitmapOptions = D2D1_BITMAP_OPTIONS_TARGET;
+ hr = ID2D1DeviceContext_CreateBitmap(device_context, size, NULL, 0, &bitmap_desc, &bitmap);
+ ok(SUCCEEDED(hr), "Failed to create a bitmap, hr %#x.\n", hr);
+ check_bitmap_surface((ID2D1Bitmap *)bitmap, TRUE, D2D1_BITMAP_OPTIONS_TARGET);
+ ID2D1DeviceContext_SetTarget(device_context, NULL);
+ ID2D1DeviceContext_SetTags(device_context, 3, 4);
+
+ ID2D1DeviceContext_BeginDraw(device_context);
+ ID2D1DeviceContext_SetTarget(device_context, (ID2D1Image *)bitmap);
+ hr = ID2D1DeviceContext_EndDraw(device_context, &t1, &t2);
+ ok(SUCCEEDED(hr), "Failed to end draw, hr %#x.\n", hr);
+ ok(!t1 && !t2, "Unexpected tags %s:%s.\n", wine_dbgstr_longlong(t1), wine_dbgstr_longlong(t2));
+
+ ID2D1Bitmap1_Release(bitmap);
+
+ ID2D1DeviceContext_Release(device_context);
}
ID2D1Device_Release(device);
IDXGIDevice_Release(dxgi_device);
--
2.11.0
1
0
[PATCH 4/5] d2d1: Default to pre-multiplied alpha mode in CreateBitmapFromDxgiSurface().
by Henri Verbeet 28 Sep '18
by Henri Verbeet 28 Sep '18
28 Sep '18
From: Nikolay Sivov <nsivov(a)codeweavers.com>
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/d2d1/device.c | 1 +
dlls/d2d1/tests/d2d1.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++---
2 files changed, 64 insertions(+), 3 deletions(-)
diff --git a/dlls/d2d1/device.c b/dlls/d2d1/device.c
index d1c1845171f..9bf8ef65acd 100644
--- a/dlls/d2d1/device.c
+++ b/dlls/d2d1/device.c
@@ -1852,6 +1852,7 @@ static HRESULT STDMETHODCALLTYPE d2d_device_context_CreateBitmapFromDxgiSurface(
memset(&bitmap_desc, 0, sizeof(bitmap_desc));
bitmap_desc.pixelFormat.format = surface_desc.Format;
+ bitmap_desc.pixelFormat.alphaMode = D2D1_ALPHA_MODE_PREMULTIPLIED;
bitmap_desc.bitmapOptions = D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW;
desc = &bitmap_desc;
}
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index 03d21532b81..97d27dad36c 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -7017,6 +7017,41 @@ static void check_rt_bitmap_surface_(unsigned int line, ID2D1RenderTarget *rt, B
ID2D1DCRenderTarget_Release(dc_rt);
}
+static IDXGISurface *create_surface(IDXGIDevice *dxgi_device, DXGI_FORMAT format)
+{
+ D3D10_TEXTURE2D_DESC texture_desc;
+ ID3D10Texture2D *texture;
+ ID3D10Device *d3d_device;
+ IDXGISurface *surface;
+ HRESULT hr;
+
+ texture_desc.Width = 1;
+ texture_desc.Height = 1;
+ texture_desc.MipLevels = 1;
+ texture_desc.ArraySize = 1;
+ texture_desc.Format = format;
+ texture_desc.SampleDesc.Count = 1;
+ texture_desc.SampleDesc.Quality = 0;
+ texture_desc.Usage = D3D10_USAGE_DEFAULT;
+ texture_desc.BindFlags = D3D10_BIND_SHADER_RESOURCE;
+ texture_desc.CPUAccessFlags = 0;
+ texture_desc.MiscFlags = 0;
+
+ hr = IDXGIDevice_QueryInterface(dxgi_device, &IID_ID3D10Device, (void **)&d3d_device);
+ ok(SUCCEEDED(hr), "Failed to get device interface, hr %#x.\n", hr);
+
+ hr = ID3D10Device_CreateTexture2D(d3d_device, &texture_desc, NULL, &texture);
+ ok(SUCCEEDED(hr), "Failed to create a texture, hr %#x.\n", hr);
+
+ hr = ID3D10Texture2D_QueryInterface(texture, &IID_IDXGISurface, (void **)&surface);
+ ok(SUCCEEDED(hr), "Failed to get surface interface, hr %#x.\n", hr);
+
+ ID3D10Device_Release(d3d_device);
+ ID3D10Texture2D_Release(texture);
+
+ return surface;
+}
+
static void test_bitmap_surface(void)
{
static const struct bitmap_format_test
@@ -7048,12 +7083,13 @@ static void test_bitmap_surface(void)
D2D1_RENDER_TARGET_PROPERTIES rt_desc;
D2D1_BITMAP_PROPERTIES1 bitmap_desc;
ID2D1DeviceContext *device_context;
+ IDXGISurface *surface, *surface2;
+ D2D1_PIXEL_FORMAT pixel_format;
ID3D10Device1 *d3d_device;
IDXGISwapChain *swapchain;
IDXGIDevice *dxgi_device;
ID2D1Factory1 *factory;
ID2D1RenderTarget *rt;
- IDXGISurface *surface;
ID2D1Bitmap1 *bitmap;
ID2D1Device *device;
ID2D1Image *target;
@@ -7119,8 +7155,6 @@ if (SUCCEEDED(hr))
{
for (i = 0; i < ARRAY_SIZE(bitmap_format_tests); ++i)
{
- D2D1_PIXEL_FORMAT pixel_format;
-
memset(&bitmap_desc, 0, sizeof(bitmap_desc));
bitmap_desc.pixelFormat = bitmap_format_tests[i].original;
bitmap_desc.bitmapOptions = D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW;
@@ -7141,9 +7175,35 @@ if (SUCCEEDED(hr))
}
}
+ /* A8 surface */
+ hr = IDXGISurface_GetDevice(surface, &IID_IDXGIDevice, (void **)&dxgi_device);
+ ok(SUCCEEDED(hr), "Failed to get the device, hr %#x.\n", hr);
+
+ surface2 = create_surface(dxgi_device, DXGI_FORMAT_A8_UNORM);
+
+ hr = ID2D1DeviceContext_CreateBitmapFromDxgiSurface(device_context, surface2, NULL, &bitmap);
+ ok(SUCCEEDED(hr) || broken(hr == WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT) /* Win7 */,
+ "Failed to create a bitmap, hr %#x.\n", hr);
+
+ if (SUCCEEDED(hr))
+ {
+ pixel_format = ID2D1Bitmap1_GetPixelFormat(bitmap);
+ ok(pixel_format.alphaMode == D2D1_ALPHA_MODE_PREMULTIPLIED,
+ "Unexpected alpha mode %#x.\n", pixel_format.alphaMode);
+
+ ID2D1Bitmap1_Release(bitmap);
+ }
+
+ IDXGIDevice_Release(dxgi_device);
+ IDXGISurface_Release(surface2);
+
hr = ID2D1DeviceContext_CreateBitmapFromDxgiSurface(device_context, surface, NULL, &bitmap);
ok(SUCCEEDED(hr), "Failed to create a bitmap, hr %#x.\n", hr);
+ pixel_format = ID2D1Bitmap1_GetPixelFormat(bitmap);
+ ok(pixel_format.alphaMode == D2D1_ALPHA_MODE_PREMULTIPLIED,
+ "Unexpected alpha mode %#x.\n", pixel_format.alphaMode);
+
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);
--
2.11.0
1
0
From: Nikolay Sivov <nsivov(a)codeweavers.com>
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/d2d1/bitmap.c | 2 ++
dlls/d2d1/tests/d2d1.c | 21 +++++++++++++++++++++
2 files changed, 23 insertions(+)
diff --git a/dlls/d2d1/bitmap.c b/dlls/d2d1/bitmap.c
index 85514627ca6..efb320445fb 100644
--- a/dlls/d2d1/bitmap.c
+++ b/dlls/d2d1/bitmap.c
@@ -317,6 +317,8 @@ HRESULT d2d_bitmap_create(struct d2d_device_context *context, D2D1_SIZE_U size,
texture_desc.Width = size.width;
texture_desc.Height = size.height;
+ if (!texture_desc.Width || !texture_desc.Height)
+ texture_desc.Width = texture_desc.Height = 1;
texture_desc.MipLevels = 1;
texture_desc.ArraySize = 1;
texture_desc.Format = desc->pixelFormat.format;
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index 4eb14223c45..03d21532b81 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -819,6 +819,8 @@ static void check_bitmap_surface_(unsigned int line, ID2D1Bitmap *bitmap, BOOL h
ok_(__FILE__, line)(!desc.MiscFlags, "Unexpected misc flags %#x.\n", desc.MiscFlags);
pixel_size = ID2D1Bitmap_GetPixelSize(bitmap);
+ if (!pixel_size.width || !pixel_size.height)
+ pixel_size.width = pixel_size.height = 1;
ok_(__FILE__, line)(desc.Width == pixel_size.width, "Got width %u, expected %u.\n",
desc.Width, pixel_size.width);
ok_(__FILE__, line)(desc.Height == pixel_size.height, "Got height %u, expected %u.\n",
@@ -6889,6 +6891,25 @@ static void check_rt_bitmap_surface_(unsigned int line, ID2D1RenderTarget *rt, B
ID2D1Bitmap_Release(bitmap);
+ /* Zero sized bitmaps. */
+ set_size_u(&size, 0, 0);
+ hr = ID2D1RenderTarget_CreateBitmap(rt, size, NULL, 0, &bitmap_desc, &bitmap);
+ ok_(__FILE__, line)(SUCCEEDED(hr), "Failed to create bitmap, hr %#x.\n", hr);
+ check_bitmap_surface_(line, bitmap, has_surface, options);
+ ID2D1Bitmap_Release(bitmap);
+
+ set_size_u(&size, 2, 0);
+ hr = ID2D1RenderTarget_CreateBitmap(rt, size, NULL, 0, &bitmap_desc, &bitmap);
+ ok_(__FILE__, line)(SUCCEEDED(hr), "Failed to create bitmap, hr %#x.\n", hr);
+ check_bitmap_surface_(line, bitmap, has_surface, options);
+ ID2D1Bitmap_Release(bitmap);
+
+ set_size_u(&size, 0, 2);
+ hr = ID2D1RenderTarget_CreateBitmap(rt, size, NULL, 0, &bitmap_desc, &bitmap);
+ ok_(__FILE__, line)(SUCCEEDED(hr), "Failed to create bitmap, hr %#x.\n", hr);
+ check_bitmap_surface_(line, bitmap, has_surface, options);
+ ID2D1Bitmap_Release(bitmap);
+
/* WIC bitmap. */
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
--
2.11.0
1
0
[PATCH 2/5] d2d1: Implement d2d_device_context_ID2D1DeviceContext_CreateBitmap().
by Henri Verbeet 28 Sep '18
by Henri Verbeet 28 Sep '18
28 Sep '18
From: Nikolay Sivov <nsivov(a)codeweavers.com>
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/d2d1/device.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/dlls/d2d1/device.c b/dlls/d2d1/device.c
index be31ecafc8f..d1c1845171f 100644
--- a/dlls/d2d1/device.c
+++ b/dlls/d2d1/device.c
@@ -1783,10 +1783,17 @@ static HRESULT STDMETHODCALLTYPE d2d_device_context_ID2D1DeviceContext_CreateBit
D2D1_SIZE_U size, const void *src_data, UINT32 pitch,
const D2D1_BITMAP_PROPERTIES1 *desc, ID2D1Bitmap1 **bitmap)
{
- FIXME("iface %p, size {%u, %u}, src_data %p, pitch %u, desc %p, bitmap %p stub!\n",
+ struct d2d_device_context *context = impl_from_ID2D1DeviceContext(iface);
+ struct d2d_bitmap *object;
+ HRESULT hr;
+
+ TRACE("iface %p, size {%u, %u}, src_data %p, pitch %u, desc %p, bitmap %p.\n",
iface, size.width, size.height, src_data, pitch, desc, bitmap);
- return E_NOTIMPL;
+ if (SUCCEEDED(hr = d2d_bitmap_create(context, size, src_data, pitch, desc, &object)))
+ *bitmap = &object->ID2D1Bitmap1_iface;
+
+ return hr;
}
static HRESULT STDMETHODCALLTYPE d2d_device_context_ID2D1DeviceContext_CreateBitmapFromWicBitmap(
--
2.11.0
1
0
[PATCH 1/5] d2d1/tests: Add some tests for compatible target size handling.
by Henri Verbeet 28 Sep '18
by Henri Verbeet 28 Sep '18
28 Sep '18
From: Nikolay Sivov <nsivov(a)codeweavers.com>
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/d2d1/tests/d2d1.c | 166 ++++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 149 insertions(+), 17 deletions(-)
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index 3005b43e44d..4eb14223c45 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -795,6 +795,8 @@ static void check_bitmap_surface_(unsigned int line, ID2D1Bitmap *bitmap, BOOL h
{
D3D10_TEXTURE2D_DESC desc;
ID3D10Texture2D *texture;
+ D2D1_SIZE_U pixel_size;
+ DWORD bind_flags = 0;
ok_(__FILE__, line)(SUCCEEDED(hr), "Failed to get bitmap surface, hr %#x.\n", hr);
ok_(__FILE__, line)(!!surface, "Expected surface instance.\n");
@@ -805,11 +807,22 @@ static void check_bitmap_surface_(unsigned int line, ID2D1Bitmap *bitmap, BOOL h
ID3D10Texture2D_GetDesc(texture, &desc);
ok_(__FILE__, line)(desc.Usage == 0, "Unexpected usage %#x.\n", desc.Usage);
- ok_(__FILE__, line)(desc.BindFlags == (options & D2D1_BITMAP_OPTIONS_TARGET ?
- D3D10_BIND_RENDER_TARGET : D3D10_BIND_SHADER_RESOURCE),
- "Unexpected bind flags %#x, bitmap options %#x.\n", desc.BindFlags, options);
- ok_(__FILE__, line)(desc.CPUAccessFlags == 0, "Unexpected cpu access flags %#x.\n", desc.CPUAccessFlags);
- ok_(__FILE__, line)(desc.MiscFlags == 0, "Unexpected misc flags %#x.\n", desc.MiscFlags);
+
+ if (options & D2D1_BITMAP_OPTIONS_TARGET)
+ bind_flags |= D3D10_BIND_RENDER_TARGET;
+ if (!(options & D2D1_BITMAP_OPTIONS_CANNOT_DRAW))
+ bind_flags |= D3D10_BIND_SHADER_RESOURCE;
+
+ ok_(__FILE__, line)(desc.BindFlags == bind_flags, "Unexpected bind flags %#x for bitmap options %#x.\n",
+ desc.BindFlags, options);
+ ok_(__FILE__, line)(!desc.CPUAccessFlags, "Unexpected cpu access flags %#x.\n", desc.CPUAccessFlags);
+ ok_(__FILE__, line)(!desc.MiscFlags, "Unexpected misc flags %#x.\n", desc.MiscFlags);
+
+ pixel_size = ID2D1Bitmap_GetPixelSize(bitmap);
+ ok_(__FILE__, line)(desc.Width == pixel_size.width, "Got width %u, expected %u.\n",
+ desc.Width, pixel_size.width);
+ ok_(__FILE__, line)(desc.Height == pixel_size.height, "Got height %u, expected %u.\n",
+ desc.Height, pixel_size.height);
ID3D10Texture2D_Release(texture);
@@ -5234,6 +5247,101 @@ static void test_hwnd_target(void)
ID2D1Factory_Release(factory);
}
+#define test_compatible_target_size(r) test_compatible_target_size_(__LINE__, r)
+static void test_compatible_target_size_(unsigned int line, ID2D1RenderTarget *rt)
+{
+ static const D2D1_SIZE_F size_1_0 = { 1.0f, 0.0f };
+ static const D2D1_SIZE_F size_1_1 = { 1.0f, 1.0f };
+ static const D2D1_SIZE_U px_size_1_1 = { 1, 1 };
+ static const D2D1_SIZE_U zero_px_size;
+ static const D2D1_SIZE_F zero_size;
+ static const struct size_test
+ {
+ const D2D1_SIZE_U *pixel_size;
+ const D2D1_SIZE_F *size;
+ }
+ size_tests[] =
+ {
+ { &zero_px_size, NULL },
+ { &zero_px_size, &zero_size },
+ { NULL, &zero_size },
+ { NULL, &size_1_0 },
+ { &px_size_1_1, &size_1_1 },
+ };
+ float dpi_x, dpi_y, rt_dpi_x, rt_dpi_y;
+ D2D1_SIZE_U pixel_size, expected_size;
+ ID2D1BitmapRenderTarget *bitmap_rt;
+ ID2D1DeviceContext *context;
+ unsigned int i;
+ HRESULT hr;
+
+ ID2D1RenderTarget_GetDpi(rt, &rt_dpi_x, &rt_dpi_y);
+
+ for (i = 0; i < ARRAY_SIZE(size_tests); ++i)
+ {
+ hr = ID2D1RenderTarget_CreateCompatibleRenderTarget(rt, size_tests[i].size, size_tests[i].pixel_size,
+ NULL, D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_NONE, &bitmap_rt);
+ todo_wine ok_(__FILE__, line)(SUCCEEDED(hr), "%u: Failed to create render target, hr %#x.\n", i, hr);
+ if (FAILED(hr))
+ return;
+
+ if (size_tests[i].pixel_size)
+ {
+ expected_size = *size_tests[i].pixel_size;
+ }
+ else if (size_tests[i].size)
+ {
+ expected_size.width = ceilf((size_tests[i].size->width * rt_dpi_x) / 96.0f);
+ expected_size.height = ceilf((size_tests[i].size->height * rt_dpi_y) / 96.0f);
+ }
+ else
+ {
+ expected_size = ID2D1RenderTarget_GetPixelSize(rt);
+ }
+
+ pixel_size = ID2D1BitmapRenderTarget_GetPixelSize(bitmap_rt);
+ ok_(__FILE__, line)(!memcmp(&pixel_size, &expected_size, sizeof(pixel_size)),
+ "%u: unexpected target size %ux%u.\n", i, pixel_size.width, pixel_size.height);
+
+ ID2D1BitmapRenderTarget_GetDpi(bitmap_rt, &dpi_x, &dpi_y);
+ if (size_tests[i].pixel_size && size_tests[i].size && size_tests[i].size->width != 0.0f
+ && size_tests[i].size->height != 0.0f)
+ {
+ ok_(__FILE__, line)(dpi_x == pixel_size.width * 96.0f / size_tests[i].size->width
+ && dpi_y == pixel_size.height * 96.0f / size_tests[i].size->height,
+ "%u: unexpected target dpi %.8ex%.8e.\n", i, dpi_x, dpi_y);
+ }
+ else
+ ok_(__FILE__, line)(dpi_x == rt_dpi_x && dpi_y == rt_dpi_y,
+ "%u: unexpected target dpi %.8ex%.8e.\n", i, dpi_x, dpi_y);
+ ID2D1BitmapRenderTarget_Release(bitmap_rt);
+ }
+
+ pixel_size.height = pixel_size.width = 0;
+ hr = ID2D1RenderTarget_CreateCompatibleRenderTarget(rt, NULL, &pixel_size, NULL,
+ D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_NONE, &bitmap_rt);
+ ok_(__FILE__, line)(SUCCEEDED(hr), "Failed to create render target, hr %#x.\n", hr);
+
+ if (SUCCEEDED(ID2D1BitmapRenderTarget_QueryInterface(bitmap_rt, &IID_ID2D1DeviceContext, (void **)&context)))
+ {
+ ID2D1Bitmap *bitmap;
+
+ pixel_size = ID2D1DeviceContext_GetPixelSize(context);
+ ok_(__FILE__, line)(!pixel_size.width && !pixel_size.height, "Unexpected target size %ux%u.\n",
+ pixel_size.width, pixel_size.height);
+
+ ID2D1DeviceContext_GetTarget(context, (ID2D1Image **)&bitmap);
+ pixel_size = ID2D1Bitmap_GetPixelSize(bitmap);
+ ok_(__FILE__, line)(!pixel_size.width && !pixel_size.height, "Unexpected target size %ux%u.\n",
+ pixel_size.width, pixel_size.height);
+ ID2D1Bitmap_Release(bitmap);
+
+ ID2D1DeviceContext_Release(context);
+ }
+
+ ID2D1BitmapRenderTarget_Release(bitmap_rt);
+}
+
static void test_bitmap_target(void)
{
D2D1_HWND_RENDER_TARGET_PROPERTIES hwnd_rt_desc;
@@ -5280,6 +5388,8 @@ static void test_bitmap_target(void)
hr = ID2D1Factory_CreateHwndRenderTarget(factory, &desc, &hwnd_rt_desc, &hwnd_rt);
ok(SUCCEEDED(hr), "Failed to create render target, hr %#x.\n", hr);
+ test_compatible_target_size((ID2D1RenderTarget *)hwnd_rt);
+
hr = ID2D1HwndRenderTarget_CreateCompatibleRenderTarget(hwnd_rt, NULL, NULL, NULL,
D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_NONE, &rt);
ok(SUCCEEDED(hr), "Failed to create render target, hr %#x.\n", hr);
@@ -5393,13 +5503,15 @@ static void test_bitmap_target(void)
desc.type = D2D1_RENDER_TARGET_TYPE_DEFAULT;
desc.pixelFormat.format = DXGI_FORMAT_B8G8R8A8_UNORM;
desc.pixelFormat.alphaMode = D2D1_ALPHA_MODE_PREMULTIPLIED;
- desc.dpiX = 96.0f;
+ desc.dpiX = 192.0f;
desc.dpiY = 96.0f;
desc.usage = D2D1_RENDER_TARGET_USAGE_NONE;
desc.minLevel = D2D1_FEATURE_LEVEL_DEFAULT;
hr = ID2D1Factory_CreateDCRenderTarget(factory, &desc, &dc_rt);
ok(SUCCEEDED(hr), "Failed to create target, hr %#x.\n", hr);
+ test_compatible_target_size((ID2D1RenderTarget *)dc_rt);
+
hr = ID2D1DCRenderTarget_CreateCompatibleRenderTarget(dc_rt, NULL, NULL, NULL,
D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_NONE, &rt);
ok(SUCCEEDED(hr), "Failed to create render target, hr %#x.\n", hr);
@@ -6748,13 +6860,13 @@ static void test_create_device(void)
#define check_rt_bitmap_surface(r, s, o) check_rt_bitmap_surface_(__LINE__, r, s, o)
static void check_rt_bitmap_surface_(unsigned int line, ID2D1RenderTarget *rt, BOOL has_surface, DWORD options)
{
+ ID2D1BitmapRenderTarget *compatible_rt;
D2D1_BITMAP_PROPERTIES bitmap_desc;
- ID2D1RenderTarget *compatible_rt;
IWICImagingFactory *wic_factory;
+ ID2D1Bitmap *bitmap, *bitmap2;
ID2D1DeviceContext *context;
ID2D1DCRenderTarget *dc_rt;
IWICBitmap *wic_bitmap;
- ID2D1Bitmap *bitmap;
ID2D1Image *target;
D2D1_SIZE_U size;
HRESULT hr;
@@ -6833,10 +6945,10 @@ static void check_rt_bitmap_surface_(unsigned int line, ID2D1RenderTarget *rt, B
ID2D1DeviceContext_GetDevice(context, &device);
hr = ID2D1RenderTarget_CreateCompatibleRenderTarget(rt, NULL, NULL, NULL,
- D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_NONE, (ID2D1BitmapRenderTarget **)&compatible_rt);
+ D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_NONE, &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);
+ hr = ID2D1BitmapRenderTarget_QueryInterface(compatible_rt, &IID_ID2D1DeviceContext, (void **)&context2);
ok_(__FILE__, line)(SUCCEEDED(hr), "Failed to get device context, hr %#x.\n", hr);
ID2D1DeviceContext_GetDevice(context2, &device2);
@@ -6845,20 +6957,34 @@ static void check_rt_bitmap_surface_(unsigned int line, ID2D1RenderTarget *rt, B
ID2D1Device_Release(device);
ID2D1Device_Release(device2);
- ID2D1DeviceContext_Release(context2);
-
- hr = ID2D1RenderTarget_CreateBitmap(compatible_rt, size, bitmap_data, sizeof(*bitmap_data), &bitmap_desc, &bitmap);
+ hr = ID2D1BitmapRenderTarget_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);
-
check_bitmap_surface_(line, bitmap, has_surface, options);
- ID2D1RenderTarget_Release(compatible_rt);
+ ID2D1Bitmap_Release(bitmap);
+
+ hr = ID2D1BitmapRenderTarget_GetBitmap(compatible_rt, &bitmap);
+ ok_(__FILE__, line)(SUCCEEDED(hr), "Failed to get compatible target bitmap, hr %#x.\n", hr);
+
+ bitmap2 = NULL;
+ ID2D1DeviceContext_GetTarget(context2, (ID2D1Image **)&bitmap2);
+ todo_wine ok_(__FILE__, line)(bitmap2 == bitmap, "Unexpected bitmap.\n");
+
+ if (bitmap2)
+ {
+ check_bitmap_surface_(line, bitmap, has_surface, D2D1_BITMAP_OPTIONS_TARGET);
+ ID2D1Bitmap_Release(bitmap2);
+ }
ID2D1Bitmap_Release(bitmap);
+
+ ID2D1BitmapRenderTarget_Release(compatible_rt);
+ ID2D1DeviceContext_Release(context2);
}
else
{
hr = ID2D1RenderTarget_CreateCompatibleRenderTarget(rt, NULL, NULL, NULL,
- D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_NONE, (ID2D1BitmapRenderTarget **)&compatible_rt);
+ D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_NONE, &compatible_rt);
todo_wine
ok_(__FILE__, line)(hr == WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT, "Unexpected hr %#x.\n", hr);
}
@@ -7024,7 +7150,13 @@ if (SUCCEEDED(hr))
hr = ID2D1Factory1_CreateDCRenderTarget(factory, &rt_desc, (ID2D1DCRenderTarget **)&rt);
ok(SUCCEEDED(hr), "Failed to create target, hr %#x.\n", hr);
- check_rt_bitmap_surface(rt, FALSE, D2D1_BITMAP_OPTIONS_NONE);
+ hr = ID2D1RenderTarget_QueryInterface(rt, &IID_ID2D1DeviceContext, (void **)&device_context);
+ ok(SUCCEEDED(hr), "Failed to get device context, hr %#x.\n", hr);
+
+ ID2D1DeviceContext_GetTarget(device_context, (ID2D1Image **)&bitmap);
+ ok(!bitmap, "Unexpected target.\n");
+
+ ID2D1DeviceContext_Release(device_context);
ID2D1RenderTarget_Release(rt);
/* HWND target */
--
2.11.0
1
0
t
Wysłano z telefonu Samsung
-------- Oryginalna wiadomość --------Od: Alexandre Julliard <julliard(a)winehq.org> Data: 28.09.2018 21:18 (GMT+01:00) Do: wine-announce(a)winehq.org Temat: Wine rele
The Wine development release 3.17 is now available.
What's new in this release (see below for details):
- Improved Shell Autocomplete support.
- More implementation of OPC Services.
- Improvements to the Pager common control.
- Various bug fixes.
The source is available from the following locations:
https://dl.winehq.org/wine/source/3.x/wine-3.17.tar.xz
http://mirrors.ibiblio.org/wine/source/3.x/wine-3.17.tar.xz
Binary packages for various distributions will be available from:
https://www.winehq.org/download
You will find documentation on https://www.winehq.org/documentation
You can also get the current source directly from the git
repository. Check https://www.winehq.org/git for details.
Wine is available thanks to the work of many people. See the file
AUTHORS in the distribution for the complete list.
----------------------------------------------------------------
Bugs fixed in 3.17 (total 36):
18271 MSI creates incompatible msi file in a specific case of create table
22995 Adobe FrameMaker 8 installer displays complaint about installation path drive type
23487 Buccaneer: freezes when changing screen resolution
25617 Clones <v1.30 crashes after some time (occasionally with an out of memory error)
27288 Facade installation ends prematurely when installing to a directory name with a space
28000 World War One Gold hangs during the initial loading stage
29603 Ski Challenge 2010: extremely long loading times (unless Win98 mode is set)
30785 MS Office 2007 reports msxml5 as not installed (WoW64)
34522 Drakan: Order of the Flame demo crashes before entering the main menu (needs native directmusic dlls)
34739 manual install of wine gecko gets in the wrong directory in Wow64 wine
38742 Watch_Dogs fail to run after successful Uplay installation
39020 aSc TimeTables 2016 (trial): window scrollbar is slow to respond
41039 Multiple kernel drivers crash on unimplemented function ntoskrnl.exe.FsRtlIsNameInExpression (VirtualBox, QQProtect for Tencent TIM (com.qq.office) 2.1.x)
41325 Actions of MSI installer properties missing or wrong
43550 Photoshop Elements 15 spams console with fixme:file:MoveFileWithProgressW MOVEFILE_WRITE_THROUGH unimplemented
43890 Divinity: Original Sin 2 does not successfully launch
44583 CryptBinaryToStringW returns wrong required buffer size.
45036 Cisco Jabber 11.x crashes on unimplemented function IPHLPAPI.DLL.GetIpNetTable2
45320 cmd creates an environment variable with an empty name
45347 Google Chrome installer crashes on unimplemented function propsys.dll.InitPropVariantFromCLSID
45485 Virtual Desktop "has no name"
45523 FIFA 18 Demo needs KERNEL32.dll.SetProcessWorkingSetSizeEx
45538 Multiple applications crash on unimplemented function msvcr120.dll.?wait(a)Concurrency@@YAXI(a)Z (Amazon Workspaces client, EnginePrime, Bethesda Launcher Updater)
45569 League of Legends 8.12+ needs NtQueryInformationProcess(ProcessCookie) stub
45673 Calling delegated proxy methods returns 0x800706b5 (RPC_S_UNKNOWN_IF), "err:rpc:RpcAssoc_BindConnection syntax {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}, 0.0 not supported"
45691 Installation of anno 1404 (GOG version Gold edition) fails on architecture win64 with wine 3.14
45724 Multiple EndScene calls result in multiple glFlush (FF XIV)
45813 Orbit Profiler crashes due to unimplemeneted function advapi32.TraceSetInformation()
45823 Paint.net (4.1.*) installer fails with error messagebox: System.NotImplementedException: : hr = m_pFactory1->CreateDrawingStateBlock
45831 Slack installer (Squirrel) fails:Unhandled Exception: System.AccessViolationException:at MS.Win32.PresentationCore.UnsafeNativeMethods.WICMetadataQueryReader.ContainsMetadataByName
45832 Windower 5 beta (FF XI tool) crash: Unhandled Exception: System.NotImplementedException at Windower.UI.Views.RootView.OnSourceInitialized (DwmExtendFrameIntoClientArea should return S_OK)
45833 Paint.net (4.1.*) installer fails with error messagebox: System.NotImplementedException: d2ddevicecontext.cpp (228) : hr = pDeviceContext->CreateBitmapBrush
45845 Microsoft Office 2010: installer crashes at the beginning of the installation process
45848 Assassin's Creed Chronicles: China - player model rendering issues in DX11 mode
45849 Paint.net (4.1.*) installer fails with error messagebox: System.NotImplementedException: d2ddevicecontext.cpp (326) : hr = m_pDeviceContext->CreateEffect( apBrush
45861 PhaseOne CaptureOne 11.2 (.NET 4.7 app) crashes on unimplemented function mscms.dll.WcsGetUsePerUserProfiles
----------------------------------------------------------------
Changes since 3.16:
Alex Henrie (9):
kernel32: Add DECLSPEC_HOTPATCH to functions patched by libtcmalloc.
ntdll: Add DECLSPEC_HOTPATCH to functions patched by libtcmalloc.
oleaut32: Add DECLSPEC_HOTPATCH to functions patched by MS Word 2010.
msvcrt: Add DECLSPEC_HOTPATCH to functions patched by libtcmalloc.
wmp/tests: Destroy the window before calling CoUninitialize.
imm32: Avoid using GCC's typeof extension.
gdi32: Avoid using GCC's typeof extension.
msvcrt: Use isnan instead of isnanf.
riched20: Avoid using GCC's typeof extension.
Alexandre Julliard (19):
server: Avoid potential size overflow for empty object attributes.
ntoskrnl/tests: Fix error check that fails on Windows.
server: Align object attributes to a DWORD-boundary.
server: Allow specifying the security descriptor for a new thread.
server: Move initial thread creation out of the create_process() function.
server: Specify the process in which to create a new thread.
server: Create the initial thread as a separate request.
server: Allow specifying the security descriptor for a new process.
server: Store the process exe file in the process structure.
server: Don't return the process exe file to the client.
server: Return more specific error status for NE binaries.
kernel32: Reimplement GetBinaryTypeW to rely on the server for header parsing.
kernel32: Remove the DOS/Win16/OS2 binary distinction.
kernel32: Move MODULE_get_binary_info implementation to process.c.
kernel32: Retrieve binary information from the server for PE files.
kernel32: Determine 32/64-bitness from the PE architecture.
kernel32: Return the binary type from get_binary_info().
kernel32: Get rid of the binary_info structure.
kernel32: Create a fresh PE info structure when running winevdm.
Alistair Leslie-Hughes (3):
kernel32/tests: Tests for ProcessCookie in NtQueryInformationProcess.
mfplat: Add MFCopyImage stub.
dsound: Don't trace current thread ID.
Andrew Eikum (1):
winedbg: In gdbproxy file, allow wine paths with spaces.
Andrew Wesie (3):
ntdll: Stub for ProcessCookie in NtQueryInformationProcess.
wined3d: Remove extraneous flush from EndScene.
wined3d: Use query buffer objects for occlusion queries.
André Hentschel (5):
advapi32/tests: Allow ERROR_ACCESS_DENIED for newer Win10.
qcap/tests: AVICo might be unavaiable on newer Win10.
kernel32: Add stub for SetProcessWorkingSetSizeEx.
user32/tests: Allow newer Win10 behaviour.
wininet/tests: Skip tests when querying INTERNET_OPTION_SECURITY_CERTIFICATE_STRUCT fails (newer win10).
Austin English (2):
winscard: Add SCardCancel stub.
iphlpapi: Add GetIpNetTable2 stub.
Dmitry Timoshkov (9):
windowscodecs: IWICMetadataQueryReader::GetMetadataByName() should accept NULL for returned value.
msi: Fix a typo.
msi: Move parameter checks to a common helper in MsiSummaryInfoSetProperty.
msi: Do not attempt to copy a non-string property in MsiSummaryInfoGetProperty.
msi/tests: Also test full range of properties for MsiSummaryInfoSetPropertyW.
msi/tests: Add a test for repetitive MsiGetActiveDatabase calls.
ntdll/tests: Fix compilation with PSDK.
ntdll/tests: Clarify some file disposition test results, remove useless tests.
ntdll/tests: Add more file disposition tests.
Fabian Maurer (5):
comctl32/taskdialog: Use parentheses around & operator.
opcservices: Add missing break (coverity).
oleview: Add missing break (coverity).
shell32/brsfolder: Add shortcut to rename folders with the F2 key.
shell32/brsfolder: Add shortcut to delete folders with the delete key.
François Gouget (6):
msxml3/tests: Make test_namespaces_as_attributes() static.
mshtml: Make HTMLStyle_init_dispex_info() static.
winhttp: Make winsock_init() static.
winebus.sys: Add a trailing '\n' to a TRACE().
quartz/tests: Make testpin_{AddRef,Release}() static.
wined3d: Modernize the macOS spelling.
Gabriel Ivăncescu (20):
shell32/autocomplete: Move the autocomplete processing and WM_KEYUP to separate functions.
shell32/autocomplete: Redesign the window proc to trigger on key presses instead of key release.
shell32/autocomplete: Don't auto-append on control characters.
shell32/autocomplete: Simplify a calculation.
shell32/autocomplete: Avoid another buffer overflow and handle arbitrary sizes for the auto-append string.
shell32/autocomplete: Remove the property after replacing the callback instead of before.
shell32/tests: Send WM_CHAR instead of WM_KEYUP.
shell32/autocomplete: Fix going up through the suggestion listbox.
shell32/autocomplete: Handle more messages for autocompletion.
shell32/autocomplete: Forward to the edit control outside of the switch to simplify the code.
shell32/autocomplete: Don't autocomplete at all on most control characters.
shell32/autocomplete: Send some messages directly to the edit control's procedure.
shell32/autocomplete: Handle WM_SETTEXT for autocompletion.
shell32/autocomplete: Pass hwnd for consistency with the other calls.
shell32/tests: Test hijacking the edit control's procedure after AutoComplete.
shell32/autocomplete: Remove flicker while redrawing the AutoComplete listbox.
shell32/autocomplete: Use 0 instead of CW_USEDEFAULT.
shell32/autocomplete: Use the same font for the AutoComplete listbox as the edit control.
shell32/autocomplete: Don't auto-append unless the caret is at the end.
shell32/autocomplete: Implement PageDown and PageUp for the auto-suggest listbox.
Gijs Vermeulen (2):
kernel32: Add GetQueuedCompletionStatusEx stub.
Revert "kernel32: Add GetQueuedCompletionStatusEx stub.".
Hans Leidekker (6):
msi/tests: Drop workarounds for Windows 2000.
msi: Allow recursive changes to the target folder path.
appwiz.cpl: Read more application attributes from the registry.
msi/tests: SQLGetInstalledDrivers fails if there are no ODBC drivers installed.
msi: Add support for ARPNOMODIFY, APRNOREMOVE and ARPNOREPAIR.
wbemprox: Implement StdRegProv.CreateKey.
Henri Verbeet (27):
wined3d: Make the resource parameter to wined3d_resource_get_decompress_format() const.
wined3d: Get rid of the "format_count" field from struct wined3d_adapter.
wined3d: Properly initialise the driver info in wined3d_adapter_no3d_init().
wined3d: Reorder the formats in debug_d3dformat() to match the enum order.
wined3d: Store the NPOT texture capabilities in struct wined3d_d3d_info.
wined3d: Rename "wined3d_adapter_opengl" to "wined3d_adapter_gl".
wined3d: Disallow creating devices without adapters in wined3d_device_create().
wined3d: Move the OpenGL vertex format to a separate structure.
wined3d: Move the OpenGL view class to struct wined3d_format_gl.
d3d8/tests: Properly check whether creating a device succeeded in test_flip().
d3d9/tests: Properly check whether creating a device succeeded in test_flip().
wined3d: Accept "renderer" in addition to "DirectDrawRenderer".
wined3d: Introduce WINED3DFMT_FLAG_BLIT.
wined3d: Move the OpenGL texture format to struct wined3d_format_gl.
d2d1: Introduce a debug helper for D2D1_POINT_2F.
ddraw: Do not report IID_IDirect3DHALDevice in ddraw_find_device() with DDRAW_NO3D.
wined3d: Do not report WINEDDSCAPS_VIDEOMEMORY for WINED3D_NO3D adapters.
ddraw: Reject creating DDSCAPS_VIDEOMEMORY surfaces with DDRAW_NO3D.
wined3d: Store the wined3d creation flags for NO3D adapters as well.
wined3d: Support NPOT textures on NO3D adapters.
wined3d: Set a feature level for NO3D adapters.
wined3d: Get rid of the "pointsize_min" and "pointsize_max" fields from struct wined3d_gl_limits.
wined3d: Move "texture_size" from struct wined3d_gl_limits to struct wined3d_d3d_limits.
ddraw: Do not request 3D-usages for DDRAW_NO3D surfaces.
wined3d: Do not create DCs for all textures on WINED3D_NO3D adapters.
ddraw: Only do asynchronous clears when the application asked for them.
ddraw: Check for DDRAW_NO3D before checking for a video memory surface in d3d_device_create().
Huw D. M. Davies (2):
setupapi: For consistency use __x86_64__ instead of __x86_64.
msvcp90: Remove unnecessary check for __arm__.
Jacek Caban (3):
winhttp: Modify index only if query_headers succeeded.
winhttp: Set last error in WinHttpQueryAuthSchemes when no auth scheme is found.
user32: Make sure that passed window handle is scroll control before accessing wExtra in SCROLL_GetInternalInfo.
Jactry Zeng (3):
include: Add ITextDocument2Old and ITextDocument2 interface.
riched20: Add stub for ITextDocument2Old interface.
msftedit: Add tests for interfaces.
Jason Edmeades (1):
msvcrt: Do not put cmd.exe special environment variables into the environ.
Jim Mussared (1):
comctl32/listview: Fix subitem invalidation.
Joris van der Wel (1):
advapi32/tests: Add additional tests for passing a thread sd to CreateProcess.
Józef Kucia (44):
wined3d: Use get_format_internal() to get WINED3DFMT_UNKNOWN.
wined3d: Add missing formats to debug_d3dformat().
wined3d: Store additional flags directly in wined3d_format_block_info.
wined3d: Initialise typeless_id for typeless formats early.
wined3d: Initialise typeless formats after all formats properties are initialised.
wined3d: Move get_flexible_vertex_size() to device.c.
wined3d: Cleanup get_flexible_vertex_size().
include: Add d3d11on12 header.
d3d11: Add D3D11On12CreateDevice() stub.
wined3d: Implement vCoverage register.
wined3d: Apply legacy format swizzles only when requested.
d3d11/tests: Add a few more tests for texture formats.
dxgi: Factor out dxgi_validate_swapchain_desc().
dxgi: Validate swapchain desc in d3d12_swapchain_ResizeBuffers().
dxgi: Validate formats for flip presentation model.
dxgi: Add support for DXGI_FORMAT_R16G16B16A16_FLOAT D3D12 swapchains.
dxgi/tests: Add test for swapchain formats.
dbghelp: Fix memory leak in SymInitializeW() (Coverity).
user32: Call DefWindowProc() in DesktopWndProc().
user32/tests: Add test for desktop window procedure.
dxgi/tests: Add test for swapchain window messages.
dxgi/tests: Add test for swapchain window styles.
dxgi/tests: Avoid "skipping tests" in skip() messages.
wined3d: Introduce get_format_by_idx() helper function.
wined3d: Introduce separate function for OpenGL formats initialisation.
wined3d: Add support for variable-sized format structures.
wined3d: Allocate memory for formats in wined3d_adapter_init_format_info().
wined3d: Store max_clip_distances in struct d3d_info.
dxgi: Introduce wined3d_feature_level_from_d3d() helper function.
wined3d: Make feature level enum compatible with Direct3D enum.
wined3d: Add remaining feature levels.
wined3d: Pass feature levels to wined3d_device_create().
wined3d: Introduce wined3d_device_get_feature_level().
dxgi: Get rid of set_feature_level() from dxgi_device_layer.
dxgi: Simplify dxgi_adapter_GetDesc().
dxgi: Merge dxgi_check_feature_level_support() into dxgi_adapter_CheckInterfaceSupport().
wined3d: Cleanup fallback cards list.
d3d11: Trace skipped DXBC chunks.
wined3d: Derive allowed shader versions from the current feature level.
wined3d: Add GL_ARB_shader_viewport_layer_array extension.
d3d10core/tests: Add test for staging buffers.
d3d10core/tests: Add a few more tests for texture formats.
d3d10core/tests: Use SetRect() in more places.
d3d11/tests: Use SetRect() in more places.
Louis Lenders (3):
dwmapi: Return S_OK in DwmExtendFrameIntoClientArea.
mscms: Add stub for WcsGetUsePerUserProfiles.
mscms: Update spec to Windows 7.
Michael Stefaniuc (11):
setupapi: Use the ARRAY_SIZE() macro.
shlwapi: Avoid a temporary variable.
shlwapi: Avoid ARRAY_SIZE-like macros.
shlwapi: Use the ARRAY_SIZE() macro.
uxtheme: Use the ARRAY_SIZE() macro.
winex11.drv: Use the ARRAY_SIZE() macro.
winmm: Use the ARRAY_SIZE() macro.
wininet: Avoid an ARRAY_SIZE-like macro.
wininet: Use the ARRAY_SIZE() macro.
winhttp: Avoid a variable that holds an ARRAY_SIZE() result.
winhttp: Use the ARRAY_SIZE() macro.
Nikolay Sivov (40):
d2d1: Implement GetSurface() for bitmaps.
include: Add ID2D1BitmapBrush1 definition.
comctl32/button: Fix text buffer leak (Coverity).
propsys: Add InitPropVariantFromCLSID().
xmllite/writer: Fix "xml:space" output.
opcservices/tests: Fix copy-pasted copyright line.
d2d1: Update to ID2D1BitmapBrush1.
d2d1: Implement newer CreateBitmapBrush() variant.
include: Add ID2D1Effect definition.
urlmon/tests: Add IsEqual test for custom IUri implementation.
opcservices/uri: Fix IsEqual() to work with OPC URI objects.
opcservices/tests: Add some GetRelativeUri() tests.
opcservices: Fix path used for part URIs.
opcservices: Implement CombinePartUri().
opcservices: Write package parts.
opcservices: Write relationship parts.
opcservices: Improve error handling (Coverity).
opcservices: Implement GetPart().
opcservices: Implement PartExists().
opcservices: Write full content type stream.
d2d1: Implement CreateBitmapFromDxgiSurface().
opcservices: Improve parameter validation in CreateRelationship().
opcservices: Enforce unique relationship id.
opcservices: Initialize archive write position.
opcservices: Fix relationship stream names.
opcservices: Add content type entry for relationship parts.
opcservices: Write relationship stream for parts.
opcservices: Update content stream position on Read().
xmllite/writer: Fix writing prefixed attributes.
dwrite/layout: Test resulting line width before adding inline trimming run.
d2d1: Fix compatible target initialization.
d2d1/tests: Test that device is reused for compatible targets.
d2d1: Implement GetDevice() for device context.
crypt32/base64: Fix certificate request header and trailer in CryptBinaryToStringW() output.
crypt32: Fix NULL output buffer handling for CryptBinaryToString().
crypt32: Fix output buffer handling for CRYPT_STRING_BINARY case.
crypt32: Fix formatted output length for base64.
d2d1: Add ID2D1Effect stub.
d2d1: Use surface format for shared bitmap if it wasn't specified.
crypt32: Add CRYPT_STRING_BINARY mode for CryptBinaryToStringW().
Owen Rudge (6):
wsdapi: Ignore duplicate messages.
wsdapi: Implement matching of names in MatchProbeEx.
wsdapi: Implement generation of ProbeMatches message.
wsdapi: Send Probe Matches message via UDP unicast.
wsdapi: Don't include null character at the end of sent messages.
wsdapi: Prefer Wine version.
Piotr Caban (5):
ole32: Initialize more FORMATETC fields using InitFormatEtc helper.
ole32: Add IDataObject_GetData tests on synthesized format.
ole32: Change DataObjectImpl_GetData return value to show more implementation problems.
ole32: Improve OleClipboardData GetData implementation.
ole32: Add more IStorage clipboard tests.
Ricky Zhou (1):
winemac: Allow Command to be mapped to Ctrl.
Sven Baars (2):
user32/tests: Use the correct procedure for dialog tests (Valgrind).
comctl32: Add NULL checks to SetWindowSubclass (Valgrind).
Zebediah Figura (37):
rpcrt4/tests: Add tests for delegated proxy methods.
ole32: Use the real proxy IID in ClientRpcChannelBuffer_GetBuffer().
quartz/filtergraph: Return correct interface for IID_IGraphVersion.
quartz/tests: Add some tests for IFilterGraph_EnumFilters().
quartz/filtergraph: Factor out find_filter_by_name().
quartz: Merge enumfilters.c into filtergraph.c.
quartz/filtergraph: Pass an IFilterGraphImpl to create_enum_filters().
quartz/filtergraph: Use a linked list to store filters.
quartz/tests: Rewrite test_render_filter_priority().
quartz/tests: Test interfaces exposed by the filter graph.
quartz/tests: Add some tests for IFilterGraph_Add/RemoveFilter().
quartz/filtergraph: Unset the name of a removed filter.
quartz/tests: Add some tests for IFilterGraph_FindFilterByName().
quartz/tests: Get rid of test_graph_builder().
quartz/tests: Add some tests for IFilterGraph_ConnectDirect() and IFilterGraph_Disconnect().
quartz/tests: Add some tests for IGraphBuilder_Connect().
quartz/filtergraph: Don't use QueryInternalConnections() to find output pins in FilterGraph2_Connect().
quartz/filtergraph: Try filters in the graph first in FilterGraph2_Connect().
quartz/filtergraph: Check pin name instead of id in connect_output_pin().
quartz/filtergraph: Try other output pins if one shouldn't be rendered.
quartz/filtergraph: Simplify FilterGraph2_RenderRecurse().
quartz/filtergraph: Don't recursively render pins whose names begin with ~.
dbghelp/dwarf: Use debugstr_a() to trace external strings.
devenum: Factor friendly name and CLSID registration into register_codec().
devenum: Register AVI capture devices as codec devices.
devenum: Only scan for devices for the requested filter category.
quartz/filtergraph: Improve HRESULT propagation from IFilterGraph2_Connect().
quartz/tests: Add some tests for IMediaFilter_SetSyncSource() and IMediaFilter_GetSyncSource().
quartz/filtergraph: Also set the default sync source if necessary in IMediaControl_Pause().
quartz/tests: Add some tests for filter states.
quartz/filtergraph: Implement IMediaControl state functions on top of IMediaFilter.
quartz/tests/filtergraph: Add some tests for EC_COMPLETE.
quartz/filtergraph: Check for AM_FILTER_MISC_FLAGS_IS_RENDERER or IMediaSeeking to count renderers.
quartz/tests: Move file source filter tests to filesource.c.
quartz/tests/filesource: Test interfaces exposed by the file source filter.
quartz/filesource: Don't expose IAMFilterMiscFlags.
strmbase: Fix implementation of IEnumPins_Skip().
Zhiyi Zhang (10):
wineboot: Create user folders if they don't exist.
comdlg32/tests: Fix crashes.
comdlg32: Check invalid options in IFileDialog::SetOptions.
comdlg32/tests: Fix failures on newer Windows 10.
comctl32/pager: Support toolbar notification conversion.
comctl32/pager: Support tooltip notification conversion.
comctl32/pager: Support comboboxex notification conversion.
comctl32/pager: Support date time picker notification conversion.
comctl32/pager: Support list view notification conversion.
comctl32/pager: Support tree view notification conversion.
--
Alexandre Julliard
julliard(a)winehq.org
1
0