From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/d2d1/d2d1_private.h | 1 + dlls/d2d1/dc_render_target.c | 36 +++++++++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-)
diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h index 4ccb311a234..0206f474dbe 100644 --- a/dlls/d2d1/d2d1_private.h +++ b/dlls/d2d1/d2d1_private.h @@ -239,6 +239,7 @@ HRESULT d2d_wic_render_target_init(struct d2d_wic_render_target *render_target, struct d2d_dc_render_target { ID2D1DCRenderTarget ID2D1DCRenderTarget_iface; + D2D1_RENDER_TARGET_PROPERTIES desc; LONG refcount;
IDXGISurface1 *dxgi_surface; diff --git a/dlls/d2d1/dc_render_target.c b/dlls/d2d1/dc_render_target.c index 30eafe361d1..f9697332e25 100644 --- a/dlls/d2d1/dc_render_target.c +++ b/dlls/d2d1/dc_render_target.c @@ -673,10 +673,43 @@ static BOOL STDMETHODCALLTYPE d2d_dc_render_target_IsSupported(ID2D1DCRenderTarg const D2D1_RENDER_TARGET_PROPERTIES *desc) { struct d2d_dc_render_target *render_target = impl_from_ID2D1DCRenderTarget(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 == D2D1_ALPHA_MODE_PREMULTIPLIED + && (desc->pixelFormat.alphaMode == D2D1_ALPHA_MODE_UNKNOWN + || desc->pixelFormat.alphaMode == D2D1_ALPHA_MODE_PREMULTIPLIED)) + || (pixel_format.alphaMode == D2D1_ALPHA_MODE_IGNORE + && (desc->pixelFormat.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 + || desc->usage == D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE)) + return FALSE; + + return TRUE; }
static HRESULT STDMETHODCALLTYPE d2d_dc_render_target_BindDC(ID2D1DCRenderTarget *iface, @@ -808,6 +841,7 @@ HRESULT d2d_dc_render_target_init(struct d2d_dc_render_target *render_target, ID HRESULT hr;
render_target->ID2D1DCRenderTarget_iface.lpVtbl = &d2d_dc_render_target_vtbl; + render_target->desc = *desc;
/* Set with BindDC(). */ SetRectEmpty(&render_target->dst_rect);