From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/d2d1/bitmap_render_target.c | 70 ++++++++++++++++++++++++-------- dlls/d2d1/d2d1_private.h | 2 + dlls/d2d1/device.c | 2 + 3 files changed, 56 insertions(+), 18 deletions(-)
diff --git a/dlls/d2d1/bitmap_render_target.c b/dlls/d2d1/bitmap_render_target.c index ce8b8965d39..442acbad5c7 100644 --- a/dlls/d2d1/bitmap_render_target.c +++ b/dlls/d2d1/bitmap_render_target.c @@ -641,10 +641,47 @@ static BOOL STDMETHODCALLTYPE d2d_bitmap_render_target_IsSupported(ID2D1BitmapRe const D2D1_RENDER_TARGET_PROPERTIES *desc) { struct d2d_bitmap_render_target *render_target = impl_from_ID2D1BitmapRenderTarget(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_UNKNOWN + || 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_IGNORE + || desc->pixelFormat.alphaMode == D2D1_ALPHA_MODE_UNKNOWN)))) + return FALSE; + + if (!(desc->usage == D2D1_RENDER_TARGET_USAGE_NONE + || (render_target->options == D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_GDI_COMPATIBLE + && desc->usage == D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE) + || (target_desc->usage == D2D1_RENDER_TARGET_USAGE_FORCE_BITMAP_REMOTING + && desc->usage == D2D1_RENDER_TARGET_USAGE_FORCE_BITMAP_REMOTING))) + return FALSE; + + return TRUE; }
static HRESULT STDMETHODCALLTYPE d2d_bitmap_render_target_GetBitmap(ID2D1BitmapRenderTarget *iface, @@ -730,7 +767,6 @@ HRESULT d2d_bitmap_render_target_init(struct d2d_bitmap_render_target *render_ta const D2D1_SIZE_U *pixel_size, const D2D1_PIXEL_FORMAT *pixel_format, D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS options) { - D2D1_RENDER_TARGET_PROPERTIES dxgi_rt_desc; D2D1_BITMAP_PROPERTIES1 bitmap_desc; ID2D1DeviceContext *context; D2D1_SIZE_U bitmap_size; @@ -740,10 +776,8 @@ HRESULT d2d_bitmap_render_target_init(struct d2d_bitmap_render_target *render_ta FIXME("Compatible target options are ignored, %#x.\n", options);
render_target->ID2D1BitmapRenderTarget_iface.lpVtbl = &d2d_bitmap_render_target_vtbl; - - dxgi_rt_desc.type = parent_target->desc.type; - dxgi_rt_desc.usage = parent_target->desc.usage; - dxgi_rt_desc.minLevel = parent_target->desc.minLevel; + render_target->options = options; + render_target->desc = parent_target->desc;
if (pixel_size) { @@ -763,29 +797,29 @@ HRESULT d2d_bitmap_render_target_init(struct d2d_bitmap_render_target *render_ta
if (size && size->width != 0.0f && size->height != 0.0f) { - dxgi_rt_desc.dpiX = (bitmap_size.width * 96.0f) / size->width; - dxgi_rt_desc.dpiY = (bitmap_size.height * 96.0f) / size->height; + render_target->desc.dpiX = (bitmap_size.width * 96.0f) / size->width; + render_target->desc.dpiY = (bitmap_size.height * 96.0f) / size->height; } else { - dxgi_rt_desc.dpiX = parent_target->desc.dpiX; - dxgi_rt_desc.dpiY = parent_target->desc.dpiY; + render_target->desc.dpiX = parent_target->desc.dpiX; + render_target->desc.dpiY = parent_target->desc.dpiY; }
if (!pixel_format || pixel_format->format == DXGI_FORMAT_UNKNOWN) - dxgi_rt_desc.pixelFormat.format = parent_target->desc.pixelFormat.format; + render_target->desc.pixelFormat.format = parent_target->desc.pixelFormat.format; else - dxgi_rt_desc.pixelFormat.format = pixel_format->format; + render_target->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; + render_target->desc.pixelFormat.alphaMode = D2D1_ALPHA_MODE_PREMULTIPLIED; else - dxgi_rt_desc.pixelFormat.alphaMode = pixel_format->alphaMode; + render_target->desc.pixelFormat.alphaMode = pixel_format->alphaMode;
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))) + &render_target->desc, (void **)&render_target->dxgi_inner))) { WARN("Failed to create DXGI surface render target, hr %#lx.\n", hr); return hr; @@ -803,9 +837,9 @@ HRESULT d2d_bitmap_render_target_init(struct d2d_bitmap_render_target *render_ta return hr; }
- bitmap_desc.pixelFormat = dxgi_rt_desc.pixelFormat; - bitmap_desc.dpiX = dxgi_rt_desc.dpiX; - bitmap_desc.dpiY = dxgi_rt_desc.dpiY; + bitmap_desc.pixelFormat = render_target->desc.pixelFormat; + bitmap_desc.dpiX = render_target->desc.dpiX; + bitmap_desc.dpiY = render_target->desc.dpiY; bitmap_desc.bitmapOptions = D2D1_BITMAP_OPTIONS_TARGET; bitmap_desc.colorContext = NULL;
diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h index 0206f474dbe..f5d939126e3 100644 --- a/dlls/d2d1/d2d1_private.h +++ b/dlls/d2d1/d2d1_private.h @@ -275,6 +275,8 @@ HRESULT d2d_hwnd_render_target_init(struct d2d_hwnd_render_target *render_target struct d2d_bitmap_render_target { ID2D1BitmapRenderTarget ID2D1BitmapRenderTarget_iface; + D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS options; + D2D1_RENDER_TARGET_PROPERTIES desc; LONG refcount;
ID2D1RenderTarget *dxgi_target; diff --git a/dlls/d2d1/device.c b/dlls/d2d1/device.c index 72781a48d10..eeb5f92962a 100644 --- a/dlls/d2d1/device.c +++ b/dlls/d2d1/device.c @@ -4448,6 +4448,8 @@ HRESULT d2d_d3d_create_render_target(ID2D1Device *device, IDXGISurface *surface, return hr; }
+ object->desc.type = desc->type; + object->desc.usage = desc->usage; ID2D1DeviceContext1_SetDpi(&object->ID2D1DeviceContext1_iface, bitmap_desc.dpiX, bitmap_desc.dpiY);
if (surface)