From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/d2d1/d2d1_private.h | 1 + dlls/d2d1/hwnd_render_target.c | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-)
diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h index 5dab3fbb2a8..4ccb311a234 100644 --- a/dlls/d2d1/d2d1_private.h +++ b/dlls/d2d1/d2d1_private.h @@ -257,6 +257,7 @@ HRESULT d2d_dc_render_target_init(struct d2d_dc_render_target *render_target, ID struct d2d_hwnd_render_target { ID2D1HwndRenderTarget ID2D1HwndRenderTarget_iface; + D2D1_RENDER_TARGET_PROPERTIES desc; LONG refcount;
ID2D1RenderTarget *dxgi_target; diff --git a/dlls/d2d1/hwnd_render_target.c b/dlls/d2d1/hwnd_render_target.c index 4d3fe43a1b3..05010b3ce3a 100644 --- a/dlls/d2d1/hwnd_render_target.c +++ b/dlls/d2d1/hwnd_render_target.c @@ -652,10 +652,40 @@ static BOOL STDMETHODCALLTYPE d2d_hwnd_render_target_IsSupported(ID2D1HwndRender const D2D1_RENDER_TARGET_PROPERTIES *desc) { struct d2d_hwnd_render_target *render_target = impl_from_ID2D1HwndRenderTarget(iface); + const D2D1_RENDER_TARGET_PROPERTIES *target_desc = &render_target->desc; + D2D1_PIXEL_FORMAT pixel_format;
TRACE("iface %p, desc %p.\n", iface, desc);
- return ID2D1RenderTarget_IsSupported(render_target->dxgi_target, desc); + if (!(target_desc->type == desc->type + || (target_desc->type == D2D1_RENDER_TARGET_TYPE_DEFAULT + && desc->type == D2D1_RENDER_TARGET_TYPE_HARDWARE) + || (target_desc->type == D2D1_RENDER_TARGET_TYPE_HARDWARE + && desc->type == D2D1_RENDER_TARGET_TYPE_DEFAULT) + || (target_desc->type == D2D1_RENDER_TARGET_TYPE_SOFTWARE + && desc->type == D2D1_RENDER_TARGET_TYPE_DEFAULT))) + return FALSE; + + pixel_format = ID2D1RenderTarget_GetPixelFormat(render_target->dxgi_target); + if (!(pixel_format.format == desc->pixelFormat.format + || (pixel_format.format == DXGI_FORMAT_UNKNOWN + && desc->pixelFormat.format == DXGI_FORMAT_B8G8R8A8_UNORM) + || (pixel_format.format == DXGI_FORMAT_B8G8R8A8_UNORM + && desc->pixelFormat.format == DXGI_FORMAT_UNKNOWN) + || (pixel_format.format == DXGI_FORMAT_R8G8B8A8_UNORM + && desc->pixelFormat.format == DXGI_FORMAT_UNKNOWN))) + return FALSE; + + if (!(pixel_format.alphaMode == desc->pixelFormat.alphaMode + || desc->pixelFormat.alphaMode == D2D1_ALPHA_MODE_UNKNOWN + || (pixel_format.alphaMode == D2D1_ALPHA_MODE_UNKNOWN + && desc->pixelFormat.alphaMode == D2D1_ALPHA_MODE_IGNORE))) + return FALSE; + + if (!(target_desc->usage == desc->usage || desc->usage == D2D1_RENDER_TARGET_USAGE_NONE)) + return FALSE; + + return TRUE; }
static D2D1_WINDOW_STATE STDMETHODCALLTYPE d2d_hwnd_render_target_CheckWindowState(ID2D1HwndRenderTarget *iface) @@ -830,6 +860,7 @@ HRESULT d2d_hwnd_render_target_init(struct d2d_hwnd_render_target *render_target return hr; }
+ render_target->desc = *desc; dxgi_rt_desc = *desc; if (dxgi_rt_desc.dpiX == 0.0f && dxgi_rt_desc.dpiY == 0.0f) ID2D1Factory1_GetDesktopDpi(factory, &dxgi_rt_desc.dpiX, &dxgi_rt_desc.dpiY);