Wine-devel
Threads by month
- ----- 2026 -----
- March
- February
- January
- ----- 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
12 Sep '18
From: Józef Kucia <jkucia(a)codeweavers.com>
For consistency with vkd3d_allocate_buffer_memory().
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
libs/vkd3d/resource.c | 21 ++++++++++-----------
1 file changed, 10 insertions(+), 11 deletions(-)
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index 219b95c37194..37c8dff21073 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -501,27 +501,25 @@ HRESULT vkd3d_allocate_buffer_memory(struct d3d12_device *device, VkBuffer vk_bu
return S_OK;
}
-static HRESULT vkd3d_allocate_image_memory(struct d3d12_resource *resource, struct d3d12_device *device,
- const D3D12_HEAP_PROPERTIES *heap_properties, D3D12_HEAP_FLAGS heap_flags)
+static HRESULT vkd3d_allocate_image_memory(struct d3d12_device *device, VkImage vk_image,
+ const D3D12_HEAP_PROPERTIES *heap_properties, D3D12_HEAP_FLAGS heap_flags,
+ VkDeviceMemory *vk_memory)
{
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
VkMemoryRequirements memory_requirements;
VkResult vr;
HRESULT hr;
- assert(D3D12_RESOURCE_DIMENSION_TEXTURE1D <= resource->desc.Dimension
- && resource->desc.Dimension <= D3D12_RESOURCE_DIMENSION_TEXTURE3D);
-
- VK_CALL(vkGetImageMemoryRequirements(device->vk_device, resource->u.vk_image, &memory_requirements));
+ VK_CALL(vkGetImageMemoryRequirements(device->vk_device, vk_image, &memory_requirements));
if (FAILED(hr = vkd3d_allocate_device_memory(device, heap_properties, heap_flags,
- &memory_requirements, &resource->vk_memory)))
+ &memory_requirements, vk_memory)))
return hr;
- if ((vr = VK_CALL(vkBindImageMemory(device->vk_device, resource->u.vk_image, resource->vk_memory, 0))) < 0)
+ if ((vr = VK_CALL(vkBindImageMemory(device->vk_device, vk_image, *vk_memory, 0))) < 0)
{
WARN("Failed to bind memory, vr %d.\n", vr);
- VK_CALL(vkFreeMemory(device->vk_device, resource->vk_memory, NULL));
- resource->vk_memory = VK_NULL_HANDLE;
+ VK_CALL(vkFreeMemory(device->vk_device, *vk_memory, NULL));
+ *vk_memory = VK_NULL_HANDLE;
return hresult_from_vk_result(vr);
}
@@ -977,7 +975,8 @@ static HRESULT d3d12_committed_resource_init(struct d3d12_resource *resource, st
resource->flags |= VKD3D_RESOURCE_INITIAL_STATE_TRANSITION;
if (FAILED(hr = vkd3d_create_image(resource, device, heap_properties, heap_flags)))
return hr;
- if (FAILED(hr = vkd3d_allocate_image_memory(resource, device, heap_properties, heap_flags)))
+ if (FAILED(hr = vkd3d_allocate_image_memory(device, resource->u.vk_image,
+ heap_properties, heap_flags, &resource->vk_memory)))
{
d3d12_resource_destroy(resource, device);
return hr;
--
2.16.4
2
1
Signed-off-by: Aric Stewart <aric(a)codeweavers.com>
---
dlls/winebus.sys/main.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 53 insertions(+)
1
0
Signed-off-by: Aric Stewart <aric(a)codeweavers.com>
---
dlls/winebus.sys/bus.h | 3 +++
dlls/winebus.sys/bus_iohid.c | 33 ++++++++++++++++++++++++---------
dlls/winebus.sys/bus_sdl.c | 10 ++++++++++
dlls/winebus.sys/bus_udev.c | 10 ++++++++++
dlls/winebus.sys/main.c | 9 +++++++++
5 files changed, 56 insertions(+), 9 deletions(-)
1
0
12 Sep '18
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/d2d1/d2d1_private.h | 2 +-
dlls/d2d1/factory.c | 2 +-
dlls/d2d1/wic_render_target.c | 654 +-----------------------------------------
3 files changed, 12 insertions(+), 646 deletions(-)
diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h
index f9fd8c72cd6..4148a685bac 100644
--- a/dlls/d2d1/d2d1_private.h
+++ b/dlls/d2d1/d2d1_private.h
@@ -162,7 +162,7 @@ HRESULT d2d_d3d_render_target_create_rtv(ID2D1RenderTarget *render_target, IDXGI
struct d2d_wic_render_target
{
- ID2D1RenderTarget ID2D1RenderTarget_iface;
+ IUnknown IUnknown_iface;
LONG refcount;
IDXGISurface *dxgi_surface;
diff --git a/dlls/d2d1/factory.c b/dlls/d2d1/factory.c
index b46d14c0d7e..1a28663e891 100644
--- a/dlls/d2d1/factory.c
+++ b/dlls/d2d1/factory.c
@@ -300,7 +300,7 @@ static HRESULT STDMETHODCALLTYPE d2d_factory_CreateWicBitmapRenderTarget(ID2D1Fa
}
TRACE("Created render target %p.\n", object);
- *render_target = &object->ID2D1RenderTarget_iface;
+ *render_target = object->dxgi_target;
return S_OK;
}
diff --git a/dlls/d2d1/wic_render_target.c b/dlls/d2d1/wic_render_target.c
index e342535838f..27236e29631 100644
--- a/dlls/d2d1/wic_render_target.c
+++ b/dlls/d2d1/wic_render_target.c
@@ -27,7 +27,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d2d);
static inline struct d2d_wic_render_target *impl_from_IUnknown(IUnknown *iface)
{
- return CONTAINING_RECORD(iface, struct d2d_wic_render_target, ID2D1RenderTarget_iface);
+ return CONTAINING_RECORD(iface, struct d2d_wic_render_target, IUnknown_iface);
}
static HRESULT d2d_wic_render_target_present(IUnknown *outer_unknown)
@@ -102,32 +102,18 @@ end:
return S_OK;
}
-static inline struct d2d_wic_render_target *impl_from_ID2D1RenderTarget(ID2D1RenderTarget *iface)
+static HRESULT STDMETHODCALLTYPE d2d_wic_render_target_QueryInterface(IUnknown *iface, REFIID iid, void **out)
{
- return CONTAINING_RECORD(iface, struct d2d_wic_render_target, ID2D1RenderTarget_iface);
-}
-
-static HRESULT STDMETHODCALLTYPE d2d_wic_render_target_QueryInterface(ID2D1RenderTarget *iface, REFIID iid, void **out)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
+ struct d2d_wic_render_target *render_target = impl_from_IUnknown(iface);
TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
- if (IsEqualGUID(iid, &IID_ID2D1RenderTarget)
- || IsEqualGUID(iid, &IID_ID2D1Resource)
- || IsEqualGUID(iid, &IID_IUnknown))
- {
- ID2D1RenderTarget_AddRef(iface);
- *out = iface;
- return S_OK;
- }
-
return IUnknown_QueryInterface(render_target->dxgi_inner, iid, out);
}
-static ULONG STDMETHODCALLTYPE d2d_wic_render_target_AddRef(ID2D1RenderTarget *iface)
+static ULONG STDMETHODCALLTYPE d2d_wic_render_target_AddRef(IUnknown *iface)
{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
+ struct d2d_wic_render_target *render_target = impl_from_IUnknown(iface);
ULONG refcount = InterlockedIncrement(&render_target->refcount);
TRACE("%p increasing refcount to %u.\n", iface, refcount);
@@ -135,9 +121,9 @@ static ULONG STDMETHODCALLTYPE d2d_wic_render_target_AddRef(ID2D1RenderTarget *i
return refcount;
}
-static ULONG STDMETHODCALLTYPE d2d_wic_render_target_Release(ID2D1RenderTarget *iface)
+static ULONG STDMETHODCALLTYPE d2d_wic_render_target_Release(IUnknown *iface)
{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
+ struct d2d_wic_render_target *render_target = impl_from_IUnknown(iface);
ULONG refcount = InterlockedDecrement(&render_target->refcount);
TRACE("%p decreasing refcount to %u.\n", iface, refcount);
@@ -154,631 +140,11 @@ static ULONG STDMETHODCALLTYPE d2d_wic_render_target_Release(ID2D1RenderTarget *
return refcount;
}
-static void STDMETHODCALLTYPE d2d_wic_render_target_GetFactory(ID2D1RenderTarget *iface, ID2D1Factory **factory)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, factory %p.\n", iface, factory);
-
- ID2D1RenderTarget_GetFactory(render_target->dxgi_target, factory);
-}
-
-static HRESULT STDMETHODCALLTYPE d2d_wic_render_target_CreateBitmap(ID2D1RenderTarget *iface,
- D2D1_SIZE_U size, const void *src_data, UINT32 pitch, const D2D1_BITMAP_PROPERTIES *desc, ID2D1Bitmap **bitmap)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- 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 ID2D1RenderTarget_CreateBitmap(render_target->dxgi_target, size, src_data, pitch, desc, bitmap);
-}
-
-static HRESULT STDMETHODCALLTYPE d2d_wic_render_target_CreateBitmapFromWicBitmap(ID2D1RenderTarget *iface,
- IWICBitmapSource *bitmap_source, const D2D1_BITMAP_PROPERTIES *desc, ID2D1Bitmap **bitmap)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, bitmap_source %p, desc %p, bitmap %p.\n",
- iface, bitmap_source, desc, bitmap);
-
- return ID2D1RenderTarget_CreateBitmapFromWicBitmap(render_target->dxgi_target, bitmap_source, desc, bitmap);
-}
-
-static HRESULT STDMETHODCALLTYPE d2d_wic_render_target_CreateSharedBitmap(ID2D1RenderTarget *iface,
- REFIID iid, void *data, const D2D1_BITMAP_PROPERTIES *desc, ID2D1Bitmap **bitmap)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, iid %s, data %p, desc %p, bitmap %p.\n",
- iface, debugstr_guid(iid), data, desc, bitmap);
-
- return ID2D1RenderTarget_CreateSharedBitmap(render_target->dxgi_target, iid, data, desc, bitmap);
-}
-
-static HRESULT STDMETHODCALLTYPE d2d_wic_render_target_CreateBitmapBrush(ID2D1RenderTarget *iface,
- ID2D1Bitmap *bitmap, const D2D1_BITMAP_BRUSH_PROPERTIES *bitmap_brush_desc,
- const D2D1_BRUSH_PROPERTIES *brush_desc, ID2D1BitmapBrush **brush)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, bitmap %p, bitmap_brush_desc %p, brush_desc %p, brush %p.\n",
- iface, bitmap, bitmap_brush_desc, brush_desc, brush);
-
- return ID2D1RenderTarget_CreateBitmapBrush(render_target->dxgi_target,
- bitmap, bitmap_brush_desc, brush_desc, brush);
-}
-
-static HRESULT STDMETHODCALLTYPE d2d_wic_render_target_CreateSolidColorBrush(ID2D1RenderTarget *iface,
- const D2D1_COLOR_F *color, const D2D1_BRUSH_PROPERTIES *desc, ID2D1SolidColorBrush **brush)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, color %p, desc %p, brush %p.\n", iface, color, desc, brush);
-
- return ID2D1RenderTarget_CreateSolidColorBrush(render_target->dxgi_target, color, desc, brush);
-}
-
-static HRESULT STDMETHODCALLTYPE d2d_wic_render_target_CreateGradientStopCollection(ID2D1RenderTarget *iface,
- const D2D1_GRADIENT_STOP *stops, UINT32 stop_count, D2D1_GAMMA gamma, D2D1_EXTEND_MODE extend_mode,
- ID2D1GradientStopCollection **gradient)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, stops %p, stop_count %u, gamma %#x, extend_mode %#x, gradient %p.\n",
- iface, stops, stop_count, gamma, extend_mode, gradient);
-
- return ID2D1RenderTarget_CreateGradientStopCollection(render_target->dxgi_target,
- stops, stop_count, gamma, extend_mode, gradient);
-}
-
-static HRESULT STDMETHODCALLTYPE d2d_wic_render_target_CreateLinearGradientBrush(ID2D1RenderTarget *iface,
- const D2D1_LINEAR_GRADIENT_BRUSH_PROPERTIES *gradient_brush_desc, const D2D1_BRUSH_PROPERTIES *brush_desc,
- ID2D1GradientStopCollection *gradient, ID2D1LinearGradientBrush **brush)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, gradient_brush_desc %p, brush_desc %p, gradient %p, brush %p.\n",
- iface, gradient_brush_desc, brush_desc, gradient, brush);
-
- return ID2D1RenderTarget_CreateLinearGradientBrush(render_target->dxgi_target,
- gradient_brush_desc, brush_desc, gradient, brush);
-}
-
-static HRESULT STDMETHODCALLTYPE d2d_wic_render_target_CreateRadialGradientBrush(ID2D1RenderTarget *iface,
- const D2D1_RADIAL_GRADIENT_BRUSH_PROPERTIES *gradient_brush_desc, const D2D1_BRUSH_PROPERTIES *brush_desc,
- ID2D1GradientStopCollection *gradient, ID2D1RadialGradientBrush **brush)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, gradient_brush_desc %p, brush_desc %p, gradient %p, brush %p.\n",
- iface, gradient_brush_desc, brush_desc, gradient, brush);
-
- return ID2D1RenderTarget_CreateRadialGradientBrush(render_target->dxgi_target,
- gradient_brush_desc, brush_desc, gradient, brush);
-}
-
-static HRESULT STDMETHODCALLTYPE d2d_wic_render_target_CreateCompatibleRenderTarget(ID2D1RenderTarget *iface,
- const D2D1_SIZE_F *size, const D2D1_SIZE_U *pixel_size, const D2D1_PIXEL_FORMAT *format,
- D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS options, ID2D1BitmapRenderTarget **render_target)
-{
- struct d2d_wic_render_target *rt = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, size %p, pixel_size %p, format %p, options %#x, render_target %p,\n",
- iface, size, pixel_size, format, options, render_target);
-
- return ID2D1RenderTarget_CreateCompatibleRenderTarget(rt->dxgi_target,
- size, pixel_size, format, options, render_target);
-}
-
-static HRESULT STDMETHODCALLTYPE d2d_wic_render_target_CreateLayer(ID2D1RenderTarget *iface,
- const D2D1_SIZE_F *size, ID2D1Layer **layer)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, size %p, layer %p.\n", iface, size, layer);
-
- return ID2D1RenderTarget_CreateLayer(render_target->dxgi_target, size, layer);
-}
-
-static HRESULT STDMETHODCALLTYPE d2d_wic_render_target_CreateMesh(ID2D1RenderTarget *iface, ID2D1Mesh **mesh)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, mesh %p.\n", iface, mesh);
-
- return ID2D1RenderTarget_CreateMesh(render_target->dxgi_target, mesh);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_DrawLine(ID2D1RenderTarget *iface,
- D2D1_POINT_2F p0, D2D1_POINT_2F p1, ID2D1Brush *brush, float stroke_width, ID2D1StrokeStyle *stroke_style)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, p0 {%.8e, %.8e}, p1 {%.8e, %.8e}, brush %p, stroke_width %.8e, stroke_style %p.\n",
- iface, p0.x, p0.y, p1.x, p1.y, brush, stroke_width, stroke_style);
-
- ID2D1RenderTarget_DrawLine(render_target->dxgi_target, p0, p1, brush, stroke_width, stroke_style);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_DrawRectangle(ID2D1RenderTarget *iface,
- const D2D1_RECT_F *rect, ID2D1Brush *brush, float stroke_width, ID2D1StrokeStyle *stroke_style)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, rect %s, brush %p, stroke_width %.8e, stroke_style %p.\n",
- iface, debug_d2d_rect_f(rect), brush, stroke_width, stroke_style);
-
- ID2D1RenderTarget_DrawRectangle(render_target->dxgi_target, rect, brush, stroke_width, stroke_style);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_FillRectangle(ID2D1RenderTarget *iface,
- const D2D1_RECT_F *rect, ID2D1Brush *brush)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, rect %s, brush %p.\n", iface, debug_d2d_rect_f(rect), brush);
-
- ID2D1RenderTarget_FillRectangle(render_target->dxgi_target, rect, brush);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_DrawRoundedRectangle(ID2D1RenderTarget *iface,
- const D2D1_ROUNDED_RECT *rect, ID2D1Brush *brush, float stroke_width, ID2D1StrokeStyle *stroke_style)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, rect %p, brush %p, stroke_width %.8e, stroke_style %p.\n",
- iface, rect, brush, stroke_width, stroke_style);
-
- ID2D1RenderTarget_DrawRoundedRectangle(render_target->dxgi_target, rect, brush, stroke_width, stroke_style);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_FillRoundedRectangle(ID2D1RenderTarget *iface,
- const D2D1_ROUNDED_RECT *rect, ID2D1Brush *brush)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, rect %p, brush %p.\n", iface, rect, brush);
-
- ID2D1RenderTarget_FillRoundedRectangle(render_target->dxgi_target, rect, brush);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_DrawEllipse(ID2D1RenderTarget *iface,
- const D2D1_ELLIPSE *ellipse, ID2D1Brush *brush, float stroke_width, ID2D1StrokeStyle *stroke_style)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, ellipse %p, brush %p, stroke_width %.8e, stroke_style %p.\n",
- iface, ellipse, brush, stroke_width, stroke_style);
-
- ID2D1RenderTarget_DrawEllipse(render_target->dxgi_target, ellipse, brush, stroke_width, stroke_style);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_FillEllipse(ID2D1RenderTarget *iface,
- const D2D1_ELLIPSE *ellipse, ID2D1Brush *brush)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, ellipse %p, brush %p.\n", iface, ellipse, brush);
-
- ID2D1RenderTarget_FillEllipse(render_target->dxgi_target, ellipse, brush);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_DrawGeometry(ID2D1RenderTarget *iface,
- ID2D1Geometry *geometry, ID2D1Brush *brush, float stroke_width, ID2D1StrokeStyle *stroke_style)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, geometry %p, brush %p, stroke_width %.8e, stroke_style %p.\n",
- iface, geometry, brush, stroke_width, stroke_style);
-
- ID2D1RenderTarget_DrawGeometry(render_target->dxgi_target, geometry, brush, stroke_width, stroke_style);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_FillGeometry(ID2D1RenderTarget *iface,
- ID2D1Geometry *geometry, ID2D1Brush *brush, ID2D1Brush *opacity_brush)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, geometry %p, brush %p, opacity_brush %p.\n", iface, geometry, brush, opacity_brush);
-
- ID2D1RenderTarget_FillGeometry(render_target->dxgi_target, geometry, brush, opacity_brush);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_FillMesh(ID2D1RenderTarget *iface,
- ID2D1Mesh *mesh, ID2D1Brush *brush)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, mesh %p, brush %p.\n", iface, mesh, brush);
-
- ID2D1RenderTarget_FillMesh(render_target->dxgi_target, mesh, brush);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_FillOpacityMask(ID2D1RenderTarget *iface,
- ID2D1Bitmap *mask, ID2D1Brush *brush, D2D1_OPACITY_MASK_CONTENT content,
- const D2D1_RECT_F *dst_rect, const D2D1_RECT_F *src_rect)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, mask %p, brush %p, content %#x, dst_rect %s, src_rect %s.\n",
- iface, mask, brush, content, debug_d2d_rect_f(dst_rect), debug_d2d_rect_f(src_rect));
-
- ID2D1RenderTarget_FillOpacityMask(render_target->dxgi_target,
- mask, brush, content, dst_rect, src_rect);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_DrawBitmap(ID2D1RenderTarget *iface,
- ID2D1Bitmap *bitmap, const D2D1_RECT_F *dst_rect, float opacity,
- D2D1_BITMAP_INTERPOLATION_MODE interpolation_mode, const D2D1_RECT_F *src_rect)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, bitmap %p, dst_rect %s, opacity %.8e, interpolation_mode %#x, src_rect %s.\n",
- iface, bitmap, debug_d2d_rect_f(dst_rect), opacity, interpolation_mode, debug_d2d_rect_f(src_rect));
-
- ID2D1RenderTarget_DrawBitmap(render_target->dxgi_target,
- bitmap, dst_rect, opacity, interpolation_mode, src_rect);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_DrawText(ID2D1RenderTarget *iface,
- const WCHAR *string, UINT32 string_len, IDWriteTextFormat *text_format, const D2D1_RECT_F *layout_rect,
- ID2D1Brush *brush, D2D1_DRAW_TEXT_OPTIONS options, DWRITE_MEASURING_MODE measuring_mode)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, string %s, string_len %u, text_format %p, layout_rect %s, "
- "brush %p, options %#x, measuring_mode %#x.\n",
- iface, debugstr_wn(string, string_len), string_len, text_format, debug_d2d_rect_f(layout_rect),
- brush, options, measuring_mode);
-
- ID2D1RenderTarget_DrawText(render_target->dxgi_target, string, string_len,
- text_format, layout_rect, brush, options, measuring_mode);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_DrawTextLayout(ID2D1RenderTarget *iface,
- D2D1_POINT_2F origin, IDWriteTextLayout *layout, ID2D1Brush *brush, D2D1_DRAW_TEXT_OPTIONS options)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, origin {%.8e, %.8e}, layout %p, brush %p, options %#x.\n",
- iface, origin.x, origin.y, layout, brush, options);
-
- ID2D1RenderTarget_DrawTextLayout(render_target->dxgi_target, origin, layout, brush, options);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_DrawGlyphRun(ID2D1RenderTarget *iface,
- D2D1_POINT_2F baseline_origin, const DWRITE_GLYPH_RUN *glyph_run, ID2D1Brush *brush,
- DWRITE_MEASURING_MODE measuring_mode)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, baseline_origin {%.8e, %.8e}, glyph_run %p, brush %p, measuring_mode %#x.\n",
- iface, baseline_origin.x, baseline_origin.y, glyph_run, brush, measuring_mode);
-
- ID2D1RenderTarget_DrawGlyphRun(render_target->dxgi_target,
- baseline_origin, glyph_run, brush, measuring_mode);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_SetTransform(ID2D1RenderTarget *iface,
- const D2D1_MATRIX_3X2_F *transform)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, transform %p.\n", iface, transform);
-
- ID2D1RenderTarget_SetTransform(render_target->dxgi_target, transform);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_GetTransform(ID2D1RenderTarget *iface,
- D2D1_MATRIX_3X2_F *transform)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, transform %p.\n", iface, transform);
-
- ID2D1RenderTarget_GetTransform(render_target->dxgi_target, transform);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_SetAntialiasMode(ID2D1RenderTarget *iface,
- D2D1_ANTIALIAS_MODE antialias_mode)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, antialias_mode %#x.\n", iface, antialias_mode);
-
- ID2D1RenderTarget_SetAntialiasMode(render_target->dxgi_target, antialias_mode);
-}
-
-static D2D1_ANTIALIAS_MODE STDMETHODCALLTYPE d2d_wic_render_target_GetAntialiasMode(ID2D1RenderTarget *iface)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p.\n", iface);
-
- return ID2D1RenderTarget_GetAntialiasMode(render_target->dxgi_target);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_SetTextAntialiasMode(ID2D1RenderTarget *iface,
- D2D1_TEXT_ANTIALIAS_MODE antialias_mode)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, antialias_mode %#x.\n", iface, antialias_mode);
-
- ID2D1RenderTarget_SetTextAntialiasMode(render_target->dxgi_target, antialias_mode);
-}
-
-static D2D1_TEXT_ANTIALIAS_MODE STDMETHODCALLTYPE d2d_wic_render_target_GetTextAntialiasMode(ID2D1RenderTarget *iface)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p.\n", iface);
-
- return ID2D1RenderTarget_GetTextAntialiasMode(render_target->dxgi_target);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_SetTextRenderingParams(ID2D1RenderTarget *iface,
- IDWriteRenderingParams *text_rendering_params)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, text_rendering_params %p.\n", iface, text_rendering_params);
-
- ID2D1RenderTarget_SetTextRenderingParams(render_target->dxgi_target, text_rendering_params);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_GetTextRenderingParams(ID2D1RenderTarget *iface,
- IDWriteRenderingParams **text_rendering_params)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, text_rendering_params %p.\n", iface, text_rendering_params);
-
- ID2D1RenderTarget_GetTextRenderingParams(render_target->dxgi_target, text_rendering_params);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_SetTags(ID2D1RenderTarget *iface, D2D1_TAG tag1, D2D1_TAG tag2)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, tag1 %s, tag2 %s.\n", iface, wine_dbgstr_longlong(tag1), wine_dbgstr_longlong(tag2));
-
- ID2D1RenderTarget_SetTags(render_target->dxgi_target, tag1, tag2);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_GetTags(ID2D1RenderTarget *iface, D2D1_TAG *tag1, D2D1_TAG *tag2)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, tag1 %p, tag2 %p.\n", iface, tag1, tag2);
-
- ID2D1RenderTarget_GetTags(render_target->dxgi_target, tag1, tag2);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_PushLayer(ID2D1RenderTarget *iface,
- const D2D1_LAYER_PARAMETERS *layer_parameters, ID2D1Layer *layer)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, layer_parameters %p, layer %p.\n", iface, layer_parameters, layer);
-
- ID2D1RenderTarget_PushLayer(render_target->dxgi_target, layer_parameters, layer);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_PopLayer(ID2D1RenderTarget *iface)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p.\n", iface);
-
- ID2D1RenderTarget_PopLayer(render_target->dxgi_target);
-}
-
-static HRESULT STDMETHODCALLTYPE d2d_wic_render_target_Flush(ID2D1RenderTarget *iface, D2D1_TAG *tag1, D2D1_TAG *tag2)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, tag1 %p, tag2 %p.\n", iface, tag1, tag2);
-
- return ID2D1RenderTarget_Flush(render_target->dxgi_target, tag1, tag2);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_SaveDrawingState(ID2D1RenderTarget *iface,
- ID2D1DrawingStateBlock *state_block)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, state_block %p.\n", iface, state_block);
-
- ID2D1RenderTarget_SaveDrawingState(render_target->dxgi_target, state_block);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_RestoreDrawingState(ID2D1RenderTarget *iface,
- ID2D1DrawingStateBlock *state_block)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, state_block %p.\n", iface, state_block);
-
- ID2D1RenderTarget_RestoreDrawingState(render_target->dxgi_target, state_block);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_PushAxisAlignedClip(ID2D1RenderTarget *iface,
- const D2D1_RECT_F *clip_rect, D2D1_ANTIALIAS_MODE antialias_mode)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, clip_rect %s, antialias_mode %#x.\n", iface, debug_d2d_rect_f(clip_rect), antialias_mode);
-
- ID2D1RenderTarget_PushAxisAlignedClip(render_target->dxgi_target, clip_rect, antialias_mode);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_PopAxisAlignedClip(ID2D1RenderTarget *iface)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p.\n", iface);
-
- ID2D1RenderTarget_PopAxisAlignedClip(render_target->dxgi_target);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_Clear(ID2D1RenderTarget *iface, const D2D1_COLOR_F *color)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, color %p.\n", iface, color);
-
- ID2D1RenderTarget_Clear(render_target->dxgi_target, color);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_BeginDraw(ID2D1RenderTarget *iface)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p.\n", iface);
-
- ID2D1RenderTarget_BeginDraw(render_target->dxgi_target);
-}
-
-static HRESULT STDMETHODCALLTYPE d2d_wic_render_target_EndDraw(ID2D1RenderTarget *iface,
- D2D1_TAG *tag1, D2D1_TAG *tag2)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, tag1 %p, tag2 %p.\n", iface, tag1, tag2);
-
- return ID2D1RenderTarget_EndDraw(render_target->dxgi_target, tag1, tag2);
-}
-
-static D2D1_PIXEL_FORMAT * STDMETHODCALLTYPE d2d_wic_render_target_GetPixelFormat(ID2D1RenderTarget *iface,
- D2D1_PIXEL_FORMAT *format)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, format %p.\n", iface, format);
-
- *format = ID2D1RenderTarget_GetPixelFormat(render_target->dxgi_target);
- return format;
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_SetDpi(ID2D1RenderTarget *iface, float dpi_x, float dpi_y)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, dpi_x %.8e, dpi_y %.8e.\n", iface, dpi_x, dpi_y);
-
- ID2D1RenderTarget_SetDpi(render_target->dxgi_target, dpi_x, dpi_y);
-}
-
-static void STDMETHODCALLTYPE d2d_wic_render_target_GetDpi(ID2D1RenderTarget *iface, float *dpi_x, float *dpi_y)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, dpi_x %p, dpi_y %p.\n", iface, dpi_x, dpi_y);
-
- ID2D1RenderTarget_GetDpi(render_target->dxgi_target, dpi_x, dpi_y);
-}
-
-static D2D1_SIZE_F * STDMETHODCALLTYPE d2d_wic_render_target_GetSize(ID2D1RenderTarget *iface, D2D1_SIZE_F *size)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, size %p.\n", iface, size);
-
- *size = ID2D1RenderTarget_GetSize(render_target->dxgi_target);
- return size;
-}
-
-static D2D1_SIZE_U * STDMETHODCALLTYPE d2d_wic_render_target_GetPixelSize(ID2D1RenderTarget *iface,
- D2D1_SIZE_U *pixel_size)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, pixel_size %p.\n", iface, pixel_size);
-
- *pixel_size = ID2D1RenderTarget_GetPixelSize(render_target->dxgi_target);
- return pixel_size;
-}
-
-static UINT32 STDMETHODCALLTYPE d2d_wic_render_target_GetMaximumBitmapSize(ID2D1RenderTarget *iface)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p.\n", iface);
-
- return ID2D1RenderTarget_GetMaximumBitmapSize(render_target->dxgi_target);
-}
-
-static BOOL STDMETHODCALLTYPE d2d_wic_render_target_IsSupported(ID2D1RenderTarget *iface,
- const D2D1_RENDER_TARGET_PROPERTIES *desc)
-{
- struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
-
- TRACE("iface %p, desc %p.\n", iface, desc);
-
- return ID2D1RenderTarget_IsSupported(render_target->dxgi_target, desc);
-}
-
-static const struct ID2D1RenderTargetVtbl d2d_wic_render_target_vtbl =
+static const struct IUnknownVtbl d2d_wic_render_target_vtbl =
{
d2d_wic_render_target_QueryInterface,
d2d_wic_render_target_AddRef,
d2d_wic_render_target_Release,
- d2d_wic_render_target_GetFactory,
- d2d_wic_render_target_CreateBitmap,
- d2d_wic_render_target_CreateBitmapFromWicBitmap,
- d2d_wic_render_target_CreateSharedBitmap,
- d2d_wic_render_target_CreateBitmapBrush,
- d2d_wic_render_target_CreateSolidColorBrush,
- d2d_wic_render_target_CreateGradientStopCollection,
- d2d_wic_render_target_CreateLinearGradientBrush,
- d2d_wic_render_target_CreateRadialGradientBrush,
- d2d_wic_render_target_CreateCompatibleRenderTarget,
- d2d_wic_render_target_CreateLayer,
- d2d_wic_render_target_CreateMesh,
- d2d_wic_render_target_DrawLine,
- d2d_wic_render_target_DrawRectangle,
- d2d_wic_render_target_FillRectangle,
- d2d_wic_render_target_DrawRoundedRectangle,
- d2d_wic_render_target_FillRoundedRectangle,
- d2d_wic_render_target_DrawEllipse,
- d2d_wic_render_target_FillEllipse,
- d2d_wic_render_target_DrawGeometry,
- d2d_wic_render_target_FillGeometry,
- d2d_wic_render_target_FillMesh,
- d2d_wic_render_target_FillOpacityMask,
- d2d_wic_render_target_DrawBitmap,
- d2d_wic_render_target_DrawText,
- d2d_wic_render_target_DrawTextLayout,
- d2d_wic_render_target_DrawGlyphRun,
- d2d_wic_render_target_SetTransform,
- d2d_wic_render_target_GetTransform,
- d2d_wic_render_target_SetAntialiasMode,
- d2d_wic_render_target_GetAntialiasMode,
- d2d_wic_render_target_SetTextAntialiasMode,
- d2d_wic_render_target_GetTextAntialiasMode,
- d2d_wic_render_target_SetTextRenderingParams,
- d2d_wic_render_target_GetTextRenderingParams,
- d2d_wic_render_target_SetTags,
- d2d_wic_render_target_GetTags,
- d2d_wic_render_target_PushLayer,
- d2d_wic_render_target_PopLayer,
- d2d_wic_render_target_Flush,
- d2d_wic_render_target_SaveDrawingState,
- d2d_wic_render_target_RestoreDrawingState,
- d2d_wic_render_target_PushAxisAlignedClip,
- d2d_wic_render_target_PopAxisAlignedClip,
- d2d_wic_render_target_Clear,
- d2d_wic_render_target_BeginDraw,
- d2d_wic_render_target_EndDraw,
- d2d_wic_render_target_GetPixelFormat,
- d2d_wic_render_target_SetDpi,
- d2d_wic_render_target_GetDpi,
- d2d_wic_render_target_GetSize,
- d2d_wic_render_target_GetPixelSize,
- d2d_wic_render_target_GetMaximumBitmapSize,
- d2d_wic_render_target_IsSupported,
};
static const struct d2d_device_context_ops d2d_wic_render_target_ops =
@@ -793,7 +159,7 @@ HRESULT d2d_wic_render_target_init(struct d2d_wic_render_target *render_target,
ID3D10Texture2D *texture;
HRESULT hr;
- render_target->ID2D1RenderTarget_iface.lpVtbl = &d2d_wic_render_target_vtbl;
+ render_target->IUnknown_iface.lpVtbl = &d2d_wic_render_target_vtbl;
if (FAILED(hr = IWICBitmap_GetSize(bitmap, &render_target->width, &render_target->height)))
{
@@ -875,7 +241,7 @@ HRESULT d2d_wic_render_target_init(struct d2d_wic_render_target *render_target,
}
if (FAILED(hr = d2d_d3d_create_render_target(factory, render_target->dxgi_surface,
- (IUnknown *)&render_target->ID2D1RenderTarget_iface, &d2d_wic_render_target_ops,
+ &render_target->IUnknown_iface, &d2d_wic_render_target_ops,
desc, (void **)&render_target->dxgi_inner)))
{
WARN("Failed to create DXGI surface render target, hr %#x.\n", hr);
--
2.11.0
1
0
12 Sep '18
From: Nikolay Sivov <nsivov(a)codeweavers.com>
In order to expose the ID2D1DeviceContext interface for them.
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/d2d1/bitmap_render_target.c | 23 ++++---
dlls/d2d1/d2d1_private.h | 14 ++++-
dlls/d2d1/dc_render_target.c | 57 +++++++++--------
dlls/d2d1/device.c | 129 +++++++++++++++++++++++++++------------
dlls/d2d1/factory.c | 2 +-
dlls/d2d1/hwnd_render_target.c | 51 +++++++++-------
dlls/d2d1/wic_render_target.c | 61 ++++++++++--------
7 files changed, 218 insertions(+), 119 deletions(-)
diff --git a/dlls/d2d1/bitmap_render_target.c b/dlls/d2d1/bitmap_render_target.c
index c106e211d61..57f5b23b511 100644
--- a/dlls/d2d1/bitmap_render_target.c
+++ b/dlls/d2d1/bitmap_render_target.c
@@ -45,13 +45,8 @@ static HRESULT STDMETHODCALLTYPE d2d_bitmap_render_target_QueryInterface(ID2D1Bi
*out = iface;
return S_OK;
}
- else if (IsEqualGUID(iid, &IID_ID2D1GdiInteropRenderTarget))
- return ID2D1RenderTarget_QueryInterface(render_target->dxgi_target, iid, out);
- WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
-
- *out = NULL;
- return E_NOINTERFACE;
+ return IUnknown_QueryInterface(render_target->dxgi_inner, iid, out);
}
static ULONG STDMETHODCALLTYPE d2d_bitmap_render_target_AddRef(ID2D1BitmapRenderTarget *iface)
@@ -73,7 +68,7 @@ static ULONG STDMETHODCALLTYPE d2d_bitmap_render_target_Release(ID2D1BitmapRende
if (!refcount)
{
- ID2D1RenderTarget_Release(render_target->dxgi_target);
+ IUnknown_Release(render_target->dxgi_inner);
ID2D1Bitmap_Release(render_target->bitmap);
heap_free(render_target);
}
@@ -743,7 +738,6 @@ 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;
- render_target->refcount = 1;
dxgi_rt_desc.type = parent_target->desc.type;
dxgi_rt_desc.usage = parent_target->desc.usage;
@@ -811,13 +805,23 @@ HRESULT d2d_bitmap_render_target_init(struct d2d_bitmap_render_target *render_ta
}
if (FAILED(hr = d2d_d3d_create_render_target(parent_target->factory, dxgi_surface,
- (IUnknown *)&render_target->ID2D1BitmapRenderTarget_iface, &dxgi_rt_desc, &render_target->dxgi_target)))
+ (IUnknown *)&render_target->ID2D1BitmapRenderTarget_iface, 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;
}
+ if (FAILED(hr = IUnknown_QueryInterface(render_target->dxgi_inner,
+ &IID_ID2D1RenderTarget, (void **)&render_target->dxgi_target)))
+ {
+ 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;
@@ -829,6 +833,7 @@ HRESULT d2d_bitmap_render_target_init(struct d2d_bitmap_render_target *render_ta
{
WARN("Failed to create shared 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 e00b9427977..f9fd8c72cd6 100644
--- a/dlls/d2d1/d2d1_private.h
+++ b/dlls/d2d1/d2d1_private.h
@@ -117,14 +117,21 @@ struct d2d_ps_cb
struct d2d_brush_cb opacity_brush;
};
+struct d2d_device_context_ops
+{
+ HRESULT (*device_context_present)(IUnknown *outer_unknown);
+};
+
struct d2d_device_context
{
ID2D1DeviceContext ID2D1DeviceContext_iface;
ID2D1GdiInteropRenderTarget ID2D1GdiInteropRenderTarget_iface;
IDWriteTextRenderer IDWriteTextRenderer_iface;
+ IUnknown IUnknown_iface;
LONG refcount;
IUnknown *outer_unknown;
+ const struct d2d_device_context_ops *ops;
ID2D1Factory *factory;
ID3D10Device *device;
@@ -149,7 +156,8 @@ struct d2d_device_context
};
HRESULT d2d_d3d_create_render_target(ID2D1Factory *factory, IDXGISurface *surface, IUnknown *outer_unknown,
- const D2D1_RENDER_TARGET_PROPERTIES *desc, ID2D1RenderTarget **render_target) DECLSPEC_HIDDEN;
+ 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;
struct d2d_wic_render_target
@@ -159,6 +167,7 @@ struct d2d_wic_render_target
IDXGISurface *dxgi_surface;
ID2D1RenderTarget *dxgi_target;
+ IUnknown *dxgi_inner;
ID3D10Texture2D *readback_texture;
IWICBitmap *bitmap;
@@ -177,6 +186,7 @@ struct d2d_dc_render_target
IDXGISurface1 *dxgi_surface;
ID2D1RenderTarget *dxgi_target;
+ IUnknown *dxgi_inner;
RECT dst_rect;
HDC hdc;
@@ -191,6 +201,7 @@ struct d2d_hwnd_render_target
LONG refcount;
ID2D1RenderTarget *dxgi_target;
+ IUnknown *dxgi_inner;
IDXGISwapChain *swapchain;
UINT sync_interval;
HWND hwnd;
@@ -206,6 +217,7 @@ struct d2d_bitmap_render_target
LONG refcount;
ID2D1RenderTarget *dxgi_target;
+ IUnknown *dxgi_inner;
ID2D1Bitmap *bitmap;
};
diff --git a/dlls/d2d1/dc_render_target.c b/dlls/d2d1/dc_render_target.c
index d5e4f47e6dd..8e43bcc3076 100644
--- a/dlls/d2d1/dc_render_target.c
+++ b/dlls/d2d1/dc_render_target.c
@@ -24,17 +24,26 @@
WINE_DEFAULT_DEBUG_CHANNEL(d2d);
-static void sync_bitmap(struct d2d_dc_render_target *render_target)
+static inline struct d2d_dc_render_target *impl_from_IUnknown(IUnknown *iface)
{
+ return CONTAINING_RECORD(iface, struct d2d_dc_render_target, ID2D1DCRenderTarget_iface);
+}
+
+static HRESULT d2d_dc_render_target_present(IUnknown *outer_unknown)
+{
+ struct d2d_dc_render_target *render_target = impl_from_IUnknown(outer_unknown);
const RECT *dst_rect = &render_target->dst_rect;
RECT empty_rect;
HDC src_hdc;
HRESULT hr;
+ if (!render_target->hdc)
+ return D2DERR_WRONG_STATE;
+
if (FAILED(hr = IDXGISurface1_GetDC(render_target->dxgi_surface, FALSE, &src_hdc)))
{
WARN("GetDC() failed, %#x.\n", hr);
- return;
+ return S_OK;
}
BitBlt(render_target->hdc, dst_rect->left, dst_rect->top, dst_rect->right - dst_rect->left,
@@ -42,6 +51,8 @@ static void sync_bitmap(struct d2d_dc_render_target *render_target)
SetRectEmpty(&empty_rect);
IDXGISurface1_ReleaseDC(render_target->dxgi_surface, &empty_rect);
+
+ return S_OK;
}
static inline struct d2d_dc_render_target *impl_from_ID2D1DCRenderTarget(ID2D1DCRenderTarget *iface)
@@ -64,13 +75,8 @@ static HRESULT STDMETHODCALLTYPE d2d_dc_render_target_QueryInterface(ID2D1DCRend
*out = iface;
return S_OK;
}
- else if (IsEqualGUID(iid, &IID_ID2D1GdiInteropRenderTarget))
- return ID2D1RenderTarget_QueryInterface(render_target->dxgi_target, iid, out);
-
- WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
- *out = NULL;
- return E_NOINTERFACE;
+ return IUnknown_QueryInterface(render_target->dxgi_inner, iid, out);
}
static ULONG STDMETHODCALLTYPE d2d_dc_render_target_AddRef(ID2D1DCRenderTarget *iface)
@@ -92,7 +98,7 @@ static ULONG STDMETHODCALLTYPE d2d_dc_render_target_Release(ID2D1DCRenderTarget
if (!refcount)
{
- ID2D1RenderTarget_Release(render_target->dxgi_target);
+ IUnknown_Release(render_target->dxgi_inner);
IDXGISurface1_Release(render_target->dxgi_surface);
heap_free(render_target);
}
@@ -524,14 +530,10 @@ static void STDMETHODCALLTYPE d2d_dc_render_target_PopLayer(ID2D1DCRenderTarget
static HRESULT STDMETHODCALLTYPE d2d_dc_render_target_Flush(ID2D1DCRenderTarget *iface, D2D1_TAG *tag1, D2D1_TAG *tag2)
{
struct d2d_dc_render_target *render_target = impl_from_ID2D1DCRenderTarget(iface);
- HRESULT hr;
TRACE("iface %p, tag1 %p, tag2 %p.\n", iface, tag1, tag2);
- hr = ID2D1RenderTarget_Flush(render_target->dxgi_target, tag1, tag2);
- sync_bitmap(render_target);
-
- return hr;
+ return ID2D1RenderTarget_Flush(render_target->dxgi_target, tag1, tag2);
}
static void STDMETHODCALLTYPE d2d_dc_render_target_SaveDrawingState(ID2D1DCRenderTarget *iface,
@@ -595,17 +597,10 @@ static HRESULT STDMETHODCALLTYPE d2d_dc_render_target_EndDraw(ID2D1DCRenderTarge
D2D1_TAG *tag1, D2D1_TAG *tag2)
{
struct d2d_dc_render_target *render_target = impl_from_ID2D1DCRenderTarget(iface);
- HRESULT hr;
TRACE("iface %p, tag1 %p, tag2 %p.\n", iface, tag1, tag2);
- if (!render_target->hdc)
- return D2DERR_WRONG_STATE;
-
- hr = ID2D1RenderTarget_EndDraw(render_target->dxgi_target, tag1, tag2);
- sync_bitmap(render_target);
-
- return hr;
+ return ID2D1RenderTarget_EndDraw(render_target->dxgi_target, tag1, tag2);
}
static D2D1_PIXEL_FORMAT * STDMETHODCALLTYPE d2d_dc_render_target_GetPixelFormat(ID2D1DCRenderTarget *iface,
@@ -813,6 +808,11 @@ static const struct ID2D1DCRenderTargetVtbl d2d_dc_render_target_vtbl =
d2d_dc_render_target_BindDC,
};
+static const struct d2d_device_context_ops d2d_dc_render_target_ops =
+{
+ d2d_dc_render_target_present,
+};
+
HRESULT d2d_dc_render_target_init(struct d2d_dc_render_target *render_target, ID2D1Factory *factory,
ID3D10Device1 *device, const D2D1_RENDER_TARGET_PROPERTIES *desc)
{
@@ -821,7 +821,6 @@ 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->refcount = 1;
/* Set with BindDC(). */
SetRectEmpty(&render_target->dst_rect);
@@ -868,12 +867,22 @@ HRESULT d2d_dc_render_target_init(struct d2d_dc_render_target *render_target, ID
}
if (FAILED(hr = d2d_d3d_create_render_target(factory, (IDXGISurface *)render_target->dxgi_surface,
- (IUnknown *)&render_target->ID2D1DCRenderTarget_iface, desc, &render_target->dxgi_target)))
+ (IUnknown *)&render_target->ID2D1DCRenderTarget_iface, &d2d_dc_render_target_ops,
+ desc, (void **)&render_target->dxgi_inner)))
{
WARN("Failed to create DXGI surface render target, hr %#x.\n", hr);
IDXGISurface1_Release(render_target->dxgi_surface);
return hr;
}
+ if (FAILED(hr = IUnknown_QueryInterface(render_target->dxgi_inner,
+ &IID_ID2D1RenderTarget, (void **)&render_target->dxgi_target)))
+ {
+ WARN("Failed to retrieve ID2D1RenderTarget interface, hr %#x.\n", hr);
+ IUnknown_Release(render_target->dxgi_inner);
+ IDXGISurface1_Release(render_target->dxgi_surface);
+ return hr;
+ }
+
return S_OK;
}
diff --git a/dlls/d2d1/device.c b/dlls/d2d1/device.c
index bba4870dd4e..4478a19f9fd 100644
--- a/dlls/d2d1/device.c
+++ b/dlls/d2d1/device.c
@@ -193,6 +193,11 @@ static void d2d_device_context_draw(struct d2d_device_context *render_target, en
WARN("Failed to apply stateblock, hr %#x.\n", hr);
}
+static inline struct d2d_device_context *impl_from_IUnknown(IUnknown *iface)
+{
+ return CONTAINING_RECORD(iface, struct d2d_device_context, IUnknown_iface);
+}
+
static inline struct d2d_device_context *impl_from_ID2D1DeviceContext(ID2D1DeviceContext *iface)
{
return CONTAINING_RECORD(iface, struct d2d_device_context, ID2D1DeviceContext_iface);
@@ -203,9 +208,9 @@ static inline struct d2d_device_context *impl_from_ID2D1RenderTarget(ID2D1Render
return CONTAINING_RECORD(iface, struct d2d_device_context, ID2D1DeviceContext_iface);
}
-static HRESULT STDMETHODCALLTYPE d2d_device_context_QueryInterface(ID2D1DeviceContext *iface, REFIID iid, void **out)
+static HRESULT STDMETHODCALLTYPE d2d_device_context_inner_QueryInterface(IUnknown *iface, REFIID iid, void **out)
{
- struct d2d_device_context *render_target = impl_from_ID2D1DeviceContext(iface);
+ struct d2d_device_context *context = impl_from_IUnknown(iface);
TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
@@ -214,14 +219,14 @@ static HRESULT STDMETHODCALLTYPE d2d_device_context_QueryInterface(ID2D1DeviceCo
|| IsEqualGUID(iid, &IID_ID2D1Resource)
|| IsEqualGUID(iid, &IID_IUnknown))
{
- ID2D1DeviceContext_AddRef(iface);
- *out = iface;
+ ID2D1DeviceContext_AddRef(&context->ID2D1DeviceContext_iface);
+ *out = &context->ID2D1DeviceContext_iface;
return S_OK;
}
else if (IsEqualGUID(iid, &IID_ID2D1GdiInteropRenderTarget))
{
- ID2D1GdiInteropRenderTarget_AddRef(&render_target->ID2D1GdiInteropRenderTarget_iface);
- *out = &render_target->ID2D1GdiInteropRenderTarget_iface;
+ ID2D1GdiInteropRenderTarget_AddRef(&context->ID2D1GdiInteropRenderTarget_iface);
+ *out = &context->ID2D1GdiInteropRenderTarget_iface;
return S_OK;
}
@@ -231,20 +236,20 @@ static HRESULT STDMETHODCALLTYPE d2d_device_context_QueryInterface(ID2D1DeviceCo
return E_NOINTERFACE;
}
-static ULONG STDMETHODCALLTYPE d2d_device_context_AddRef(ID2D1DeviceContext *iface)
+static ULONG STDMETHODCALLTYPE d2d_device_context_inner_AddRef(IUnknown *iface)
{
- struct d2d_device_context *render_target = impl_from_ID2D1DeviceContext(iface);
- ULONG refcount = InterlockedIncrement(&render_target->refcount);
+ struct d2d_device_context *context = impl_from_IUnknown(iface);
+ ULONG refcount = InterlockedIncrement(&context->refcount);
TRACE("%p increasing refcount to %u.\n", iface, refcount);
return refcount;
}
-static ULONG STDMETHODCALLTYPE d2d_device_context_Release(ID2D1DeviceContext *iface)
+static ULONG STDMETHODCALLTYPE d2d_device_context_inner_Release(IUnknown *iface)
{
- struct d2d_device_context *render_target = impl_from_ID2D1DeviceContext(iface);
- ULONG refcount = InterlockedDecrement(&render_target->refcount);
+ struct d2d_device_context *context = impl_from_IUnknown(iface);
+ ULONG refcount = InterlockedDecrement(&context->refcount);
TRACE("%p decreasing refcount to %u.\n", iface, refcount);
@@ -252,30 +257,64 @@ static ULONG STDMETHODCALLTYPE d2d_device_context_Release(ID2D1DeviceContext *if
{
unsigned int i;
- d2d_clip_stack_cleanup(&render_target->clip_stack);
- IDWriteRenderingParams_Release(render_target->default_text_rendering_params);
- if (render_target->text_rendering_params)
- IDWriteRenderingParams_Release(render_target->text_rendering_params);
- ID3D10BlendState_Release(render_target->bs);
- ID3D10RasterizerState_Release(render_target->rs);
- ID3D10Buffer_Release(render_target->vb);
- ID3D10Buffer_Release(render_target->ib);
- ID3D10PixelShader_Release(render_target->ps);
+ d2d_clip_stack_cleanup(&context->clip_stack);
+ IDWriteRenderingParams_Release(context->default_text_rendering_params);
+ if (context->text_rendering_params)
+ IDWriteRenderingParams_Release(context->text_rendering_params);
+ ID3D10BlendState_Release(context->bs);
+ ID3D10RasterizerState_Release(context->rs);
+ ID3D10Buffer_Release(context->vb);
+ ID3D10Buffer_Release(context->ib);
+ ID3D10PixelShader_Release(context->ps);
for (i = 0; i < D2D_SHAPE_TYPE_COUNT; ++i)
{
- ID3D10VertexShader_Release(render_target->shape_resources[i].vs);
- ID3D10InputLayout_Release(render_target->shape_resources[i].il);
+ ID3D10VertexShader_Release(context->shape_resources[i].vs);
+ ID3D10InputLayout_Release(context->shape_resources[i].il);
}
- render_target->stateblock->lpVtbl->Release(render_target->stateblock);
- ID3D10RenderTargetView_Release(render_target->view);
- ID3D10Device_Release(render_target->device);
- ID2D1Factory_Release(render_target->factory);
- heap_free(render_target);
+ context->stateblock->lpVtbl->Release(context->stateblock);
+ ID3D10RenderTargetView_Release(context->view);
+ ID3D10Device_Release(context->device);
+ ID2D1Factory_Release(context->factory);
+ heap_free(context);
}
return refcount;
}
+static const struct IUnknownVtbl d2d_device_context_inner_unknown_vtbl =
+{
+ d2d_device_context_inner_QueryInterface,
+ d2d_device_context_inner_AddRef,
+ d2d_device_context_inner_Release,
+};
+
+static HRESULT STDMETHODCALLTYPE d2d_device_context_QueryInterface(ID2D1DeviceContext *iface, REFIID iid, void **out)
+{
+ struct d2d_device_context *context = impl_from_ID2D1DeviceContext(iface);
+
+ TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
+
+ return IUnknown_QueryInterface(context->outer_unknown, iid, out);
+}
+
+static ULONG STDMETHODCALLTYPE d2d_device_context_AddRef(ID2D1DeviceContext *iface)
+{
+ struct d2d_device_context *context = impl_from_ID2D1DeviceContext(iface);
+
+ TRACE("iface %p.\n", iface);
+
+ return IUnknown_AddRef(context->outer_unknown);
+}
+
+static ULONG STDMETHODCALLTYPE d2d_device_context_Release(ID2D1DeviceContext *iface)
+{
+ struct d2d_device_context *context = impl_from_ID2D1DeviceContext(iface);
+
+ TRACE("iface %p.\n", iface);
+
+ return IUnknown_Release(context->outer_unknown);
+}
+
static void STDMETHODCALLTYPE d2d_device_context_GetFactory(ID2D1DeviceContext *iface, ID2D1Factory **factory)
{
struct d2d_device_context *render_target = impl_from_ID2D1DeviceContext(iface);
@@ -1448,8 +1487,13 @@ static void STDMETHODCALLTYPE d2d_device_context_PopLayer(ID2D1DeviceContext *if
static HRESULT STDMETHODCALLTYPE d2d_device_context_Flush(ID2D1DeviceContext *iface, D2D1_TAG *tag1, D2D1_TAG *tag2)
{
+ struct d2d_device_context *context = impl_from_ID2D1DeviceContext(iface);
+
FIXME("iface %p, tag1 %p, tag2 %p stub!\n", iface, tag1, tag2);
+ if (context->ops)
+ context->ops->device_context_present(context->outer_unknown);
+
return E_NOTIMPL;
}
@@ -1615,16 +1659,23 @@ static void STDMETHODCALLTYPE d2d_device_context_BeginDraw(ID2D1DeviceContext *i
static HRESULT STDMETHODCALLTYPE d2d_device_context_EndDraw(ID2D1DeviceContext *iface,
D2D1_TAG *tag1, D2D1_TAG *tag2)
{
- struct d2d_device_context *render_target = impl_from_ID2D1DeviceContext(iface);
+ struct d2d_device_context *context = impl_from_ID2D1DeviceContext(iface);
+ HRESULT hr;
TRACE("iface %p, tag1 %p, tag2 %p.\n", iface, tag1, tag2);
if (tag1)
- *tag1 = render_target->error.tag1;
+ *tag1 = context->error.tag1;
if (tag2)
- *tag2 = render_target->error.tag2;
+ *tag2 = context->error.tag2;
+
+ if (context->ops)
+ {
+ if (FAILED(hr = context->ops->device_context_present(context->outer_unknown)))
+ context->error.code = hr;
+ }
- return render_target->error.code;
+ return context->error.code;
}
static D2D1_PIXEL_FORMAT * STDMETHODCALLTYPE d2d_device_context_GetPixelFormat(ID2D1DeviceContext *iface,
@@ -2469,7 +2520,8 @@ static const struct ID2D1GdiInteropRenderTargetVtbl d2d_gdi_interop_render_targe
};
static HRESULT d2d_device_context_init(struct d2d_device_context *render_target, ID2D1Factory *factory,
- IDXGISurface *surface, IUnknown *outer_unknown, const D2D1_RENDER_TARGET_PROPERTIES *desc)
+ IDXGISurface *surface, IUnknown *outer_unknown, const struct d2d_device_context_ops *ops,
+ const D2D1_RENDER_TARGET_PROPERTIES *desc)
{
D3D10_SUBRESOURCE_DATA buffer_data;
D3D10_STATE_BLOCK_MASK state_mask;
@@ -3351,12 +3403,13 @@ static HRESULT d2d_device_context_init(struct d2d_device_context *render_target,
render_target->ID2D1DeviceContext_iface.lpVtbl = &d2d_device_context_vtbl;
render_target->ID2D1GdiInteropRenderTarget_iface.lpVtbl = &d2d_gdi_interop_render_target_vtbl;
render_target->IDWriteTextRenderer_iface.lpVtbl = &d2d_text_renderer_vtbl;
+ render_target->IUnknown_iface.lpVtbl = &d2d_device_context_inner_unknown_vtbl;
render_target->refcount = 1;
render_target->factory = factory;
ID2D1Factory_AddRef(render_target->factory);
- render_target->outer_unknown = outer_unknown ? outer_unknown :
- (IUnknown *)&render_target->ID2D1DeviceContext_iface;
+ 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->device)))
{
@@ -3555,7 +3608,7 @@ err:
}
HRESULT d2d_d3d_create_render_target(ID2D1Factory *factory, IDXGISurface *surface, IUnknown *outer_unknown,
- const D2D1_RENDER_TARGET_PROPERTIES *desc, ID2D1RenderTarget **render_target)
+ const struct d2d_device_context_ops *ops, const D2D1_RENDER_TARGET_PROPERTIES *desc, void **render_target)
{
struct d2d_device_context *object;
HRESULT hr;
@@ -3563,7 +3616,7 @@ HRESULT d2d_d3d_create_render_target(ID2D1Factory *factory, IDXGISurface *surfac
if (!(object = heap_alloc_zero(sizeof(*object))))
return E_OUTOFMEMORY;
- if (FAILED(hr = d2d_device_context_init(object, factory, surface, outer_unknown, desc)))
+ if (FAILED(hr = d2d_device_context_init(object, factory, surface, outer_unknown, ops, desc)))
{
WARN("Failed to initialize render target, hr %#x.\n", hr);
heap_free(object);
@@ -3571,7 +3624,7 @@ HRESULT d2d_d3d_create_render_target(ID2D1Factory *factory, IDXGISurface *surfac
}
TRACE("Created render target %p.\n", object);
- *render_target = (ID2D1RenderTarget *)&object->ID2D1DeviceContext_iface;
+ *render_target = outer_unknown ? &object->IUnknown_iface : (IUnknown *)&object->ID2D1DeviceContext_iface;
return S_OK;
}
diff --git a/dlls/d2d1/factory.c b/dlls/d2d1/factory.c
index d2e53879e69..b46d14c0d7e 100644
--- a/dlls/d2d1/factory.c
+++ b/dlls/d2d1/factory.c
@@ -340,7 +340,7 @@ static HRESULT STDMETHODCALLTYPE d2d_factory_CreateDxgiSurfaceRenderTarget(ID2D1
{
TRACE("iface %p, surface %p, desc %p, render_target %p.\n", iface, surface, desc, render_target);
- return d2d_d3d_create_render_target((ID2D1Factory *)iface, surface, NULL, desc, render_target);
+ return d2d_d3d_create_render_target((ID2D1Factory *)iface, surface, NULL, NULL, desc, (void **)render_target);
}
static HRESULT STDMETHODCALLTYPE d2d_factory_CreateDCRenderTarget(ID2D1Factory1 *iface,
diff --git a/dlls/d2d1/hwnd_render_target.c b/dlls/d2d1/hwnd_render_target.c
index 04d33536a6e..1e763261197 100644
--- a/dlls/d2d1/hwnd_render_target.c
+++ b/dlls/d2d1/hwnd_render_target.c
@@ -24,12 +24,20 @@
WINE_DEFAULT_DEBUG_CHANNEL(d2d);
-static void render_target_present(struct d2d_hwnd_render_target *render_target)
+static inline struct d2d_hwnd_render_target *impl_from_IUnknown(IUnknown *iface)
{
+ return CONTAINING_RECORD(iface, struct d2d_hwnd_render_target, ID2D1HwndRenderTarget_iface);
+}
+
+static HRESULT d2d_hwnd_render_target_present(IUnknown *outer_unknown)
+{
+ struct d2d_hwnd_render_target *render_target = impl_from_IUnknown(outer_unknown);
HRESULT hr;
if (FAILED(hr = IDXGISwapChain_Present(render_target->swapchain, render_target->sync_interval, 0)))
WARN("Present failed, %#x.\n", hr);
+
+ return S_OK;
}
static inline struct d2d_hwnd_render_target *impl_from_ID2D1HwndRenderTarget(ID2D1HwndRenderTarget *iface)
@@ -53,13 +61,8 @@ static HRESULT STDMETHODCALLTYPE d2d_hwnd_render_target_QueryInterface(ID2D1Hwnd
*out = iface;
return S_OK;
}
- else if (IsEqualGUID(iid, &IID_ID2D1GdiInteropRenderTarget))
- return ID2D1RenderTarget_QueryInterface(render_target->dxgi_target, iid, out);
- WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
-
- *out = NULL;
- return E_NOINTERFACE;
+ return IUnknown_QueryInterface(render_target->dxgi_inner, iid, out);
}
static ULONG STDMETHODCALLTYPE d2d_hwnd_render_target_AddRef(ID2D1HwndRenderTarget *iface)
@@ -81,7 +84,7 @@ static ULONG STDMETHODCALLTYPE d2d_hwnd_render_target_Release(ID2D1HwndRenderTar
if (!refcount)
{
- ID2D1RenderTarget_Release(render_target->dxgi_target);
+ IUnknown_Release(render_target->dxgi_inner);
IDXGISwapChain_Release(render_target->swapchain);
heap_free(render_target);
}
@@ -516,14 +519,10 @@ static HRESULT STDMETHODCALLTYPE d2d_hwnd_render_target_Flush(ID2D1HwndRenderTar
D2D1_TAG *tag2)
{
struct d2d_hwnd_render_target *render_target = impl_from_ID2D1HwndRenderTarget(iface);
- HRESULT hr;
TRACE("iface %p, tag1 %p, tag2 %p.\n", iface, tag1, tag2);
- hr = ID2D1RenderTarget_Flush(render_target->dxgi_target, tag1, tag2);
- render_target_present(render_target);
-
- return hr;
+ return ID2D1RenderTarget_Flush(render_target->dxgi_target, tag1, tag2);
}
static void STDMETHODCALLTYPE d2d_hwnd_render_target_SaveDrawingState(ID2D1HwndRenderTarget *iface,
@@ -587,14 +586,10 @@ static HRESULT STDMETHODCALLTYPE d2d_hwnd_render_target_EndDraw(ID2D1HwndRenderT
D2D1_TAG *tag1, D2D1_TAG *tag2)
{
struct d2d_hwnd_render_target *render_target = impl_from_ID2D1HwndRenderTarget(iface);
- HRESULT hr;
TRACE("iface %p, tag1 %p, tag2 %p.\n", iface, tag1, tag2);
- hr = ID2D1RenderTarget_EndDraw(render_target->dxgi_target, tag1, tag2);
- render_target_present(render_target);
-
- return hr;
+ return ID2D1RenderTarget_EndDraw(render_target->dxgi_target, tag1, tag2);
}
static D2D1_PIXEL_FORMAT * STDMETHODCALLTYPE d2d_hwnd_render_target_GetPixelFormat(ID2D1HwndRenderTarget *iface,
@@ -776,6 +771,11 @@ static const struct ID2D1HwndRenderTargetVtbl d2d_hwnd_render_target_vtbl =
d2d_hwnd_render_target_GetHwnd
};
+static const struct d2d_device_context_ops d2d_hwnd_render_target_ops =
+{
+ d2d_hwnd_render_target_present,
+};
+
HRESULT d2d_hwnd_render_target_init(struct d2d_hwnd_render_target *render_target, ID2D1Factory *factory,
ID3D10Device1 *device, const D2D1_RENDER_TARGET_PROPERTIES *desc,
const D2D1_HWND_RENDER_TARGET_PROPERTIES *hwnd_rt_desc)
@@ -792,7 +792,6 @@ HRESULT d2d_hwnd_render_target_init(struct d2d_hwnd_render_target *render_target
return HRESULT_FROM_WIN32(ERROR_INVALID_WINDOW_HANDLE);
render_target->ID2D1HwndRenderTarget_iface.lpVtbl = &d2d_hwnd_render_target_vtbl;
- render_target->refcount = 1;
render_target->hwnd = hwnd_rt_desc->hwnd;
render_target->sync_interval = hwnd_rt_desc->presentOptions & D2D1_PRESENT_OPTIONS_IMMEDIATELY ? 0 : 1;
@@ -861,8 +860,9 @@ HRESULT d2d_hwnd_render_target_init(struct d2d_hwnd_render_target *render_target
}
render_target->ID2D1HwndRenderTarget_iface.lpVtbl = &d2d_hwnd_render_target_vtbl;
- hr = d2d_d3d_create_render_target(factory, dxgi_surface, (IUnknown *)&render_target->ID2D1HwndRenderTarget_iface,
- &dxgi_rt_desc, &render_target->dxgi_target);
+ hr = d2d_d3d_create_render_target(factory, dxgi_surface,
+ (IUnknown *)&render_target->ID2D1HwndRenderTarget_iface, &d2d_hwnd_render_target_ops,
+ &dxgi_rt_desc, (void **)&render_target->dxgi_inner);
IDXGISurface_Release(dxgi_surface);
if (FAILED(hr))
{
@@ -871,5 +871,14 @@ HRESULT d2d_hwnd_render_target_init(struct d2d_hwnd_render_target *render_target
return hr;
}
+ if (FAILED(hr = IUnknown_QueryInterface(render_target->dxgi_inner,
+ &IID_ID2D1RenderTarget, (void **)&render_target->dxgi_target)))
+ {
+ WARN("Failed to retrieve ID2D1RenderTarget interface, hr %#x.\n", hr);
+ IUnknown_Release(render_target->dxgi_inner);
+ IDXGISwapChain_Release(render_target->swapchain);
+ return hr;
+ }
+
return S_OK;
}
diff --git a/dlls/d2d1/wic_render_target.c b/dlls/d2d1/wic_render_target.c
index 5642fd44ff2..e342535838f 100644
--- a/dlls/d2d1/wic_render_target.c
+++ b/dlls/d2d1/wic_render_target.c
@@ -25,8 +25,14 @@
WINE_DEFAULT_DEBUG_CHANNEL(d2d);
-static void sync_bitmap(struct d2d_wic_render_target *render_target)
+static inline struct d2d_wic_render_target *impl_from_IUnknown(IUnknown *iface)
{
+ return CONTAINING_RECORD(iface, struct d2d_wic_render_target, ID2D1RenderTarget_iface);
+}
+
+static HRESULT d2d_wic_render_target_present(IUnknown *outer_unknown)
+{
+ struct d2d_wic_render_target *render_target = impl_from_IUnknown(outer_unknown);
D3D10_MAPPED_TEXTURE2D mapped_texture;
ID3D10Resource *src_resource;
IWICBitmapLock *bitmap_lock;
@@ -41,7 +47,7 @@ static void sync_bitmap(struct d2d_wic_render_target *render_target)
&IID_ID3D10Resource, (void **)&src_resource)))
{
ERR("Failed to get source resource interface, hr %#x.\n", hr);
- return;
+ goto end;
}
ID3D10Texture2D_GetDevice(render_target->readback_texture, &device);
@@ -56,28 +62,28 @@ static void sync_bitmap(struct d2d_wic_render_target *render_target)
if (FAILED(hr = IWICBitmap_Lock(render_target->bitmap, &dst_rect, WICBitmapLockWrite, &bitmap_lock)))
{
ERR("Failed to lock destination bitmap, hr %#x.\n", hr);
- return;
+ goto end;
}
if (FAILED(hr = IWICBitmapLock_GetDataPointer(bitmap_lock, &dst_size, &dst)))
{
ERR("Failed to get data pointer, hr %#x.\n", hr);
IWICBitmapLock_Release(bitmap_lock);
- return;
+ goto end;
}
if (FAILED(hr = IWICBitmapLock_GetStride(bitmap_lock, &dst_pitch)))
{
ERR("Failed to get stride, hr %#x.\n", hr);
IWICBitmapLock_Release(bitmap_lock);
- return;
+ goto end;
}
if (FAILED(hr = ID3D10Texture2D_Map(render_target->readback_texture, 0, D3D10_MAP_READ, 0, &mapped_texture)))
{
ERR("Failed to map readback texture, hr %#x.\n", hr);
IWICBitmapLock_Release(bitmap_lock);
- return;
+ goto end;
}
src = mapped_texture.pData;
@@ -91,6 +97,9 @@ static void sync_bitmap(struct d2d_wic_render_target *render_target)
ID3D10Texture2D_Unmap(render_target->readback_texture, 0);
IWICBitmapLock_Release(bitmap_lock);
+
+end:
+ return S_OK;
}
static inline struct d2d_wic_render_target *impl_from_ID2D1RenderTarget(ID2D1RenderTarget *iface)
@@ -112,13 +121,8 @@ static HRESULT STDMETHODCALLTYPE d2d_wic_render_target_QueryInterface(ID2D1Rende
*out = iface;
return S_OK;
}
- else if (IsEqualGUID(iid, &IID_ID2D1GdiInteropRenderTarget))
- return ID2D1RenderTarget_QueryInterface(render_target->dxgi_target, iid, out);
-
- WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
- *out = NULL;
- return E_NOINTERFACE;
+ return IUnknown_QueryInterface(render_target->dxgi_inner, iid, out);
}
static ULONG STDMETHODCALLTYPE d2d_wic_render_target_AddRef(ID2D1RenderTarget *iface)
@@ -142,7 +146,7 @@ static ULONG STDMETHODCALLTYPE d2d_wic_render_target_Release(ID2D1RenderTarget *
{
IWICBitmap_Release(render_target->bitmap);
ID3D10Texture2D_Release(render_target->readback_texture);
- ID2D1RenderTarget_Release(render_target->dxgi_target);
+ IUnknown_Release(render_target->dxgi_inner);
IDXGISurface_Release(render_target->dxgi_surface);
heap_free(render_target);
}
@@ -574,14 +578,10 @@ static void STDMETHODCALLTYPE d2d_wic_render_target_PopLayer(ID2D1RenderTarget *
static HRESULT STDMETHODCALLTYPE d2d_wic_render_target_Flush(ID2D1RenderTarget *iface, D2D1_TAG *tag1, D2D1_TAG *tag2)
{
struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
- HRESULT hr;
TRACE("iface %p, tag1 %p, tag2 %p.\n", iface, tag1, tag2);
- hr = ID2D1RenderTarget_Flush(render_target->dxgi_target, tag1, tag2);
- sync_bitmap(render_target);
-
- return hr;
+ return ID2D1RenderTarget_Flush(render_target->dxgi_target, tag1, tag2);
}
static void STDMETHODCALLTYPE d2d_wic_render_target_SaveDrawingState(ID2D1RenderTarget *iface,
@@ -645,14 +645,10 @@ static HRESULT STDMETHODCALLTYPE d2d_wic_render_target_EndDraw(ID2D1RenderTarget
D2D1_TAG *tag1, D2D1_TAG *tag2)
{
struct d2d_wic_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
- HRESULT hr;
TRACE("iface %p, tag1 %p, tag2 %p.\n", iface, tag1, tag2);
- hr = ID2D1RenderTarget_EndDraw(render_target->dxgi_target, tag1, tag2);
- sync_bitmap(render_target);
-
- return hr;
+ return ID2D1RenderTarget_EndDraw(render_target->dxgi_target, tag1, tag2);
}
static D2D1_PIXEL_FORMAT * STDMETHODCALLTYPE d2d_wic_render_target_GetPixelFormat(ID2D1RenderTarget *iface,
@@ -785,6 +781,11 @@ static const struct ID2D1RenderTargetVtbl d2d_wic_render_target_vtbl =
d2d_wic_render_target_IsSupported,
};
+static const struct d2d_device_context_ops d2d_wic_render_target_ops =
+{
+ d2d_wic_render_target_present,
+};
+
HRESULT d2d_wic_render_target_init(struct d2d_wic_render_target *render_target, ID2D1Factory *factory,
ID3D10Device1 *device, IWICBitmap *bitmap, const D2D1_RENDER_TARGET_PROPERTIES *desc)
{
@@ -793,7 +794,6 @@ HRESULT d2d_wic_render_target_init(struct d2d_wic_render_target *render_target,
HRESULT hr;
render_target->ID2D1RenderTarget_iface.lpVtbl = &d2d_wic_render_target_vtbl;
- render_target->refcount = 1;
if (FAILED(hr = IWICBitmap_GetSize(bitmap, &render_target->width, &render_target->height)))
{
@@ -875,7 +875,8 @@ HRESULT d2d_wic_render_target_init(struct d2d_wic_render_target *render_target,
}
if (FAILED(hr = d2d_d3d_create_render_target(factory, render_target->dxgi_surface,
- (IUnknown *)&render_target->ID2D1RenderTarget_iface, desc, &render_target->dxgi_target)))
+ (IUnknown *)&render_target->ID2D1RenderTarget_iface, &d2d_wic_render_target_ops,
+ desc, (void **)&render_target->dxgi_inner)))
{
WARN("Failed to create DXGI surface render target, hr %#x.\n", hr);
ID3D10Texture2D_Release(render_target->readback_texture);
@@ -883,6 +884,16 @@ HRESULT d2d_wic_render_target_init(struct d2d_wic_render_target *render_target,
return hr;
}
+ if (FAILED(hr = IUnknown_QueryInterface(render_target->dxgi_inner,
+ &IID_ID2D1RenderTarget, (void **)&render_target->dxgi_target)))
+ {
+ WARN("Failed to retrieve ID2D1RenderTarget interface, hr %#x.\n", hr);
+ IUnknown_Release(render_target->dxgi_inner);
+ ID3D10Texture2D_Release(render_target->readback_texture);
+ IDXGISurface_Release(render_target->dxgi_surface);
+ return hr;
+ }
+
render_target->bitmap = bitmap;
IWICBitmap_AddRef(bitmap);
--
2.11.0
1
0
Based on a patch by Louis Lenders.
Signed-off-by: Gijs Vermeulen <gijsvrm(a)gmail.com>
---
include/Makefile.in | 1 +
include/virtdisk.h | 202 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 203 insertions(+)
create mode 100644 include/virtdisk.h
diff --git a/include/Makefile.in b/include/Makefile.in
index ffecb98d9e..74dc293a29 100644
--- a/include/Makefile.in
+++ b/include/Makefile.in
@@ -637,6 +637,7 @@ SOURCES = \
verrsrc.h \
vfw.h \
vfwmsgs.h \
+ virtdisk.h \
vmr9.idl \
vmrender.idl \
vss.idl \
diff --git a/include/virtdisk.h b/include/virtdisk.h
new file mode 100644
index 0000000000..0927f609a8
--- /dev/null
+++ b/include/virtdisk.h
@@ -0,0 +1,202 @@
+/*
+ * Copyright 2017 Louis Lenders
+ * Copyright 2018 Gijs Vermeulen
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef __WINE_VIRTDISK_DLL_H
+#define __WINE_VIRTDISK_DLL_H
+
+#include <windows.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define VIRTUAL_STORAGE_TYPE_DEVICE_UNKNOWN 0
+#define VIRTUAL_STORAGE_TYPE_DEVICE_ISO 1
+#define VIRTUAL_STORAGE_TYPE_DEVICE_VHD 2
+
+typedef enum _ATTACH_VIRTUAL_DISK_FLAG {
+ ATTACH_VIRTUAL_DISK_FLAG_NONE = 0x00000000,
+ ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY = 0x00000001,
+ ATTACH_VIRTUAL_DISK_FLAG_NO_DRIVE_LETTER = 0x00000002,
+ ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME = 0x00000004,
+ ATTACH_VIRTUAL_DISK_FLAG_NO_LOCAL_HOST = 0x00000008
+} ATTACH_VIRTUAL_DISK_FLAG;
+
+typedef enum _ATTACH_VIRTUAL_DISK_VERSION {
+ ATTACH_VIRTUAL_DISK_VERSION_UNSPECIFIED = 0,
+ ATTACH_VIRTUAL_DISK_VERSION_1 = 1
+} ATTACH_VIRTUAL_DISK_VERSION;
+
+typedef enum _COMPACT_VIRTUAL_DISK_FLAG {
+ COMPACT_VIRTUAL_DISK_FLAG_NONE = 0x00000000
+} COMPACT_VIRTUAL_DISK_FLAG;
+
+typedef enum _COMPACT_VIRTUAL_DISK_VERSION {
+ COMPACT_VIRTUAL_DISK_VERSION_UNSPECIFIED = 0,
+ COMPACT_VIRTUAL_DISK_VERSION_1 = 1
+} COMPACT_VIRTUAL_DISK_VERSION;
+
+typedef enum _DEPENDENT_DISK_FLAG
+{
+ DEPENDENT_DISK_FLAG_NONE = 0x00000000,
+ DEPENDENT_DISK_FLAG_MULT_BACKING_FILES = 0x00000001,
+ DEPENDENT_DISK_FLAG_FULLY_ALLOCATED = 0x00000002,
+ DEPENDENT_DISK_FLAG_READ_ONLY = 0x00000004,
+ DEPENDENT_DISK_FLAG_REMOTE = 0x00000008,
+ DEPENDENT_DISK_FLAG_SYSTEM_VOLUME = 0x00000010,
+ DEPENDENT_DISK_FLAG_SYSTEM_VOLUME_PARENT = 0x00000020,
+ DEPENDENT_DISK_FLAG_REMOVABLE = 0x00000040,
+ DEPENDENT_DISK_FLAG_NO_DRIVE_LETTER = 0x00000080,
+ DEPENDENT_DISK_FLAG_PARENT = 0x00000100,
+ DEPENDENT_DISK_FLAG_NO_HOST_DISK = 0x00000200,
+ DEPENDENT_DISK_FLAG_PERMANENT_LIFETIME = 0x00000400
+} DEPENDENT_DISK_FLAG;
+
+typedef enum _EXPAND_VIRTUAL_DISK_VERSION {
+ EXPAND_VIRTUAL_DISK_VERSION_UNSPECIFIED = 0,
+ EXPAND_VIRTUAL_DISK_VERSION_1 = 1
+} EXPAND_VIRTUAL_DISK_VERSION;
+
+typedef enum _DETACH_VIRTUAL_DISK_FLAG {
+ DETACH_VIRTUAL_DISK_FLAG_NONE = 0x00000000
+} DETACH_VIRTUAL_DISK_FLAG;
+
+typedef enum _EXPAND_VIRTUAL_DISK_FLAG {
+ EXPAND_VIRTUAL_DISK_FLAG_NONE = 0x00000000
+} EXPAND_VIRTUAL_DISK_FLAG;
+
+typedef enum _GET_STORAGE_DEPENDENCY_FLAG
+{
+ GET_STORAGE_DEPENDENCY_FLAG_NONE = 0x00000000,
+ GET_STORAGE_DEPENDENCY_FLAG_HOST_VOLUMES = 0x00000001,
+ GET_STORAGE_DEPENDENCY_FLAG_DISK_HANDLE = 0x00000002
+} GET_STORAGE_DEPENDENCY_FLAG;
+
+typedef enum _MIRROR_VIRTUAL_DISK_FLAG {
+ MIRROR_VIRTUAL_DISK_FLAG_NONE = 0x00000000,
+ MIRROR_VIRTUAL_DISK_FLAG_EXISTING_FILE = 0x00000001
+} MIRROR_VIRTUAL_DISK_FLAG;
+
+typedef enum _MIRROR_VIRTUAL_DISK_VERSION {
+ MIRROR_VIRTUAL_DISK_VERSION_UNSPECIFIED = 0,
+ MIRROR_VIRTUAL_DISK_VERSION_1 = 1
+} MIRROR_VIRTUAL_DISK_VERSION;
+
+typedef enum _MERGE_VIRTUAL_DISK_FLAG {
+ MERGE_VIRTUAL_DISK_FLAG_NONE = 0x00000000
+} MERGE_VIRTUAL_DISK_FLAG;
+
+typedef enum _STORAGE_DEPENDENCY_INFO_VERSION
+{
+ STORAGE_DEPENDENCY_INFO_VERSION_UNSPECIFIED = 0x0,
+ STORAGE_DEPENDENCY_INFO_VERSION_1 = 0x1,
+ STORAGE_DEPENDENCY_INFO_VERSION_2 = 0x2
+} STORAGE_DEPENDENCY_INFO_VERSION;
+
+typedef enum _VIRTUAL_DISK_ACCESS_MASK {
+ VIRTUAL_DISK_ACCESS_NONE = 0x00000000,
+ VIRTUAL_DISK_ACCESS_ATTACH_RO = 0x00010000,
+ VIRTUAL_DISK_ACCESS_ATTACH_RW = 0x00020000,
+ VIRTUAL_DISK_ACCESS_DETACH = 0x00040000,
+ VIRTUAL_DISK_ACCESS_GET_INFO = 0x00080000,
+ VIRTUAL_DISK_ACCESS_CREATE = 0x00100000,
+ VIRTUAL_DISK_ACCESS_METAOPS = 0x00200000,
+ VIRTUAL_DISK_ACCESS_READ = 0x000d0000,
+ VIRTUAL_DISK_ACCESS_ALL = 0x003f0000,
+ VIRTUAL_DISK_ACCESS_WRITABLE = 0x00320000
+} VIRTUAL_DISK_ACCESS_MASK;
+
+typedef struct _VIRTUAL_STORAGE_TYPE
+{
+ ULONG DeviceId;
+ GUID VendorId;
+} VIRTUAL_STORAGE_TYPE, *PVIRTUAL_STORAGE_TYPE;
+
+typedef struct _ATTACH_VIRTUAL_DISK_PARAMETERS {
+ ATTACH_VIRTUAL_DISK_VERSION Version;
+ __C89_NAMELESS union {
+ struct {
+ ULONG Reserved;
+ } Version1;
+ } DUMMYUNIONNAME;
+} ATTACH_VIRTUAL_DISK_PARAMETERS, *PATTACH_VIRTUAL_DISK_PARAMETERS;
+
+typedef struct _COMPACT_VIRTUAL_DISK_PARAMETERS {
+ COMPACT_VIRTUAL_DISK_VERSION Version;
+ __C89_NAMELESS union {
+ struct {
+ ULONG Reserved;
+ } Version1;
+ } DUMMYUNIONNAME;
+} COMPACT_VIRTUAL_DISK_PARAMETERS, *PCOMPACT_VIRTUAL_DISK_PARAMETERS;
+
+typedef struct _EXPAND_VIRTUAL_DISK_PARAMETERS {
+ EXPAND_VIRTUAL_DISK_VERSION Version;
+ __C89_NAMELESS union {
+ struct {
+ ULONGLONG NewSize;
+ } Version1;
+ } DUMMYUNIONNAME;
+} EXPAND_VIRTUAL_DISK_PARAMETERS, *PEXPAND_VIRTUAL_DISK_PARAMETERS;
+
+typedef struct _STORAGE_DEPENDENCY_INFO_TYPE_1
+{
+ DEPENDENT_DISK_FLAG DependencyTypeFlags;
+ ULONG ProviderSpecificFlags;
+ VIRTUAL_STORAGE_TYPE VirtualStorageType;
+} STORAGE_DEPENDENCY_INFO_TYPE_1, *PSTORAGE_DEPENDENCY_INFO_TYPE_1;
+
+typedef struct _STORAGE_DEPENDENCY_INFO_TYPE_2
+{
+ DEPENDENT_DISK_FLAG DependencyTypeFlags;
+ ULONG ProviderSpecificFlags;
+ VIRTUAL_STORAGE_TYPE VirtualStorageType;
+ ULONG AncestorLevel;
+ PWSTR DependencyDeviceName;
+ PWSTR HostVolumeName;
+ PWSTR DependentVolumeName;
+ PWSTR DependentVolumeRelativePath;
+} STORAGE_DEPENDENCY_INFO_TYPE_2, *PSTORAGE_DEPENDENCY_INFO_TYPE_2;
+
+typedef struct _STORAGE_DEPENDENCY_INFO
+{
+ STORAGE_DEPENDENCY_INFO_VERSION Version;
+ ULONG NumberEntries;
+#if !defined(__WINESRC__) && (defined(_MSC_EXTENSIONS) || ((defined(__GNUC__) && __GNUC__ >= 3)))
+ __C89_NAMELESS union
+ {
+ STORAGE_DEPENDENCY_INFO_TYPE_1 Version1Entries[];
+ STORAGE_DEPENDENCY_INFO_TYPE_2 Version2Entries[];
+ } __C89_NAMELESSUNIONNAME;
+#endif
+} STORAGE_DEPENDENCY_INFO, *PSTORAGE_DEPENDENCY_INFO;
+
+typedef struct _VIRTUAL_DISK_PROGRESS {
+ DWORD OperationStatus;
+ ULONGLONG CurrentValue;
+ ULONGLONG CompletionValue;
+} VIRTUAL_DISK_PROGRESS, *PVIRTUAL_DISK_PROGRESS;
+
+DWORD WINAPI GetStorageDependencyInformation(HANDLE obj, GET_STORAGE_DEPENDENCY_FLAG flags, ULONG size, STORAGE_DEPENDENCY_INFO *info, ULONG *used);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __WINE_VIRTDISK_DLL_H */
--
2.18.0
2
3
[PATCH] opcservices: Partially implement content stream for package parts.
by Nikolay Sivov 12 Sep '18
by Nikolay Sivov 12 Sep '18
12 Sep '18
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/opcservices/factory.c | 2 +-
dlls/opcservices/package.c | 272 ++++++++++++++++++++++++++-
dlls/opcservices/tests/opcservices.c | 35 ++++
3 files changed, 306 insertions(+), 3 deletions(-)
diff --git a/dlls/opcservices/factory.c b/dlls/opcservices/factory.c
index 9036141495..1a98f3f49d 100644
--- a/dlls/opcservices/factory.c
+++ b/dlls/opcservices/factory.c
@@ -278,7 +278,7 @@ static HRESULT opc_filestream_create(const WCHAR *filename, OPC_STREAM_IO_MODE i
stream->refcount = 1;
*out = &stream->IStream_iface;
- TRACE("Created file steam %p.\n", *out);
+ TRACE("Created file stream %p.\n", *out);
return S_OK;
}
diff --git a/dlls/opcservices/package.c b/dlls/opcservices/package.c
index 66cc49a16e..c7ae2581cc 100644
--- a/dlls/opcservices/package.c
+++ b/dlls/opcservices/package.c
@@ -31,6 +31,22 @@
WINE_DEFAULT_DEBUG_CHANNEL(msopc);
+struct opc_content
+{
+ LONG refcount;
+ BYTE *data;
+ ULARGE_INTEGER size;
+};
+
+struct opc_content_stream
+{
+ IStream IStream_iface;
+ LONG refcount;
+
+ struct opc_content *content;
+ ULARGE_INTEGER pos;
+};
+
struct opc_package
{
IOpcPackage IOpcPackage_iface;
@@ -50,6 +66,7 @@ struct opc_part
WCHAR *content_type;
DWORD compression_options;
IOpcRelationshipSet *relationship_set;
+ struct opc_content *content;
};
struct opc_part_set
@@ -110,6 +127,243 @@ static inline struct opc_relationship *impl_from_IOpcRelationship(IOpcRelationsh
return CONTAINING_RECORD(iface, struct opc_relationship, IOpcRelationship_iface);
}
+static inline struct opc_content_stream *impl_from_IStream(IStream *iface)
+{
+ return CONTAINING_RECORD(iface, struct opc_content_stream, IStream_iface);
+}
+
+static void opc_content_release(struct opc_content *content)
+{
+ ULONG refcount = InterlockedDecrement(&content->refcount);
+
+ if (!refcount)
+ {
+ heap_free(content->data);
+ heap_free(content);
+ }
+}
+
+static HRESULT WINAPI opc_content_stream_QueryInterface(IStream *iface, REFIID iid, void **out)
+{
+ TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
+
+ if (IsEqualIID(iid, &IID_IStream) ||
+ IsEqualIID(iid, &IID_ISequentialStream) ||
+ IsEqualIID(iid, &IID_IUnknown))
+ {
+ *out = iface;
+ IStream_AddRef(iface);
+ return S_OK;
+ }
+
+ *out = NULL;
+ WARN("Unsupported interface %s.\n", debugstr_guid(iid));
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI opc_content_stream_AddRef(IStream *iface)
+{
+ struct opc_content_stream *stream = impl_from_IStream(iface);
+ ULONG refcount = InterlockedIncrement(&stream->refcount);
+
+ TRACE("%p increasing refcount to %u.\n", iface, refcount);
+
+ return refcount;
+}
+
+static ULONG WINAPI opc_content_stream_Release(IStream *iface)
+{
+ struct opc_content_stream *stream = impl_from_IStream(iface);
+ ULONG refcount = InterlockedDecrement(&stream->refcount);
+
+ TRACE("%p decreasing refcount to %u.\n", iface, refcount);
+
+ if (!refcount)
+ {
+ opc_content_release(stream->content);
+ heap_free(stream);
+ }
+
+ return refcount;
+}
+
+static HRESULT WINAPI opc_content_stream_Read(IStream *iface, void *buff, ULONG size, ULONG *num_read)
+{
+ struct opc_content_stream *stream = impl_from_IStream(iface);
+ DWORD read = 0;
+
+ TRACE("iface %p, buff %p, size %u, num_read %p.\n", iface, buff, size, num_read);
+
+ if (!num_read)
+ num_read = &read;
+
+ if (stream->content->size.QuadPart - stream->pos.QuadPart < size)
+ *num_read = stream->content->size.QuadPart - stream->pos.QuadPart;
+ else
+ *num_read = size;
+
+ if (*num_read)
+ memcpy(buff, stream->content->data + stream->pos.QuadPart, *num_read);
+
+ return S_OK;
+}
+
+static HRESULT WINAPI opc_content_stream_Write(IStream *iface, const void *data, ULONG size, ULONG *num_written)
+{
+ struct opc_content_stream *stream = impl_from_IStream(iface);
+ DWORD written = 0;
+
+ TRACE("iface %p, data %p, size %u, num_written %p.\n", iface, data, size, num_written);
+
+ if (!num_written)
+ num_written = &written;
+
+ *num_written = 0;
+
+ if (size > stream->content->size.QuadPart - stream->pos.QuadPart)
+ {
+ void *ptr = heap_realloc(stream->content->data, stream->pos.QuadPart + size);
+ if (!ptr)
+ return E_OUTOFMEMORY;
+ stream->content->data = ptr;
+ }
+
+ memcpy(stream->content->data + stream->pos.QuadPart, data, size);
+ stream->pos.QuadPart += size;
+ stream->content->size.QuadPart += size;
+ *num_written = size;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI opc_content_stream_Seek(IStream *iface, LARGE_INTEGER move, DWORD origin, ULARGE_INTEGER *newpos)
+{
+ struct opc_content_stream *stream = impl_from_IStream(iface);
+ ULARGE_INTEGER pos;
+
+ TRACE("iface %p, move %s, origin %d, newpos %p.\n", iface, wine_dbgstr_longlong(move.QuadPart), origin, newpos);
+
+ switch (origin)
+ {
+ case STREAM_SEEK_SET:
+ pos.QuadPart = move.QuadPart;
+ break;
+ case STREAM_SEEK_CUR:
+ pos.QuadPart = stream->pos.QuadPart + move.QuadPart;
+ break;
+ case STREAM_SEEK_END:
+ pos.QuadPart = stream->content->size.QuadPart + move.QuadPart;
+ default:
+ WARN("Unknown origin mode %d.\n", origin);
+ return E_INVALIDARG;
+ }
+
+ stream->pos = pos;
+
+ if (newpos)
+ *newpos = stream->pos;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI opc_content_stream_SetSize(IStream *iface, ULARGE_INTEGER size)
+{
+ FIXME("iface %p, size %s stub!\n", iface, wine_dbgstr_longlong(size.QuadPart));
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI opc_content_stream_CopyTo(IStream *iface, IStream *dest, ULARGE_INTEGER size,
+ ULARGE_INTEGER *num_read, ULARGE_INTEGER *written)
+{
+ FIXME("iface %p, dest %p, size %s, num_read %p, written %p stub!\n", iface, dest,
+ wine_dbgstr_longlong(size.QuadPart), num_read, written);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI opc_content_stream_Commit(IStream *iface, DWORD flags)
+{
+ FIXME("iface %p, flags %#x stub!\n", iface, flags);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI opc_content_stream_Revert(IStream *iface)
+{
+ FIXME("iface %p stub!\n", iface);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI opc_content_stream_LockRegion(IStream *iface, ULARGE_INTEGER offset,
+ ULARGE_INTEGER size, DWORD lock_type)
+{
+ FIXME("iface %p, offset %s, size %s, lock_type %d stub!\n", iface, wine_dbgstr_longlong(offset.QuadPart),
+ wine_dbgstr_longlong(size.QuadPart), lock_type);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI opc_content_stream_UnlockRegion(IStream *iface, ULARGE_INTEGER offset, ULARGE_INTEGER size,
+ DWORD lock_type)
+{
+ FIXME("iface %p, offset %s, size %s, lock_type %d stub!\n", iface, wine_dbgstr_longlong(offset.QuadPart),
+ wine_dbgstr_longlong(size.QuadPart), lock_type);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI opc_content_stream_Stat(IStream *iface, STATSTG *statstg, DWORD flag)
+{
+ FIXME("iface %p, statstg %p, flag %d stub!\n", iface, statstg, flag);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI opc_content_stream_Clone(IStream *iface, IStream **result)
+{
+ FIXME("iface %p, result %p stub!\n", iface, result);
+
+ return E_NOTIMPL;
+}
+
+static const IStreamVtbl opc_content_stream_vtbl =
+{
+ opc_content_stream_QueryInterface,
+ opc_content_stream_AddRef,
+ opc_content_stream_Release,
+ opc_content_stream_Read,
+ opc_content_stream_Write,
+ opc_content_stream_Seek,
+ opc_content_stream_SetSize,
+ opc_content_stream_CopyTo,
+ opc_content_stream_Commit,
+ opc_content_stream_Revert,
+ opc_content_stream_LockRegion,
+ opc_content_stream_UnlockRegion,
+ opc_content_stream_Stat,
+ opc_content_stream_Clone,
+};
+
+static HRESULT opc_content_stream_create(struct opc_content *content, IStream **out)
+{
+ struct opc_content_stream *stream;
+
+ if (!(stream = heap_alloc_zero(sizeof(*stream))))
+ return E_OUTOFMEMORY;
+
+ stream->IStream_iface.lpVtbl = &opc_content_stream_vtbl;
+ stream->refcount = 1;
+ stream->content = content;
+ InterlockedIncrement(&content->refcount);
+
+ *out = &stream->IStream_iface;
+
+ TRACE("Created content stream %p.\n", *out);
+ return S_OK;
+}
+
static HRESULT opc_relationship_set_create(IOpcUri *source_uri, IOpcRelationshipSet **relationship_set);
static WCHAR *opc_strdupW(const WCHAR *str)
@@ -168,6 +422,7 @@ static ULONG WINAPI opc_part_Release(IOpcPart *iface)
IOpcRelationshipSet_Release(part->relationship_set);
IOpcPartUri_Release(part->name);
CoTaskMemFree(part->content_type);
+ opc_content_release(part->content);
heap_free(part);
}
@@ -192,9 +447,14 @@ static HRESULT WINAPI opc_part_GetRelationshipSet(IOpcPart *iface, IOpcRelations
static HRESULT WINAPI opc_part_GetContentStream(IOpcPart *iface, IStream **stream)
{
- FIXME("iface %p, stream %p stub!\n", iface, stream);
+ struct opc_part *part = impl_from_IOpcPart(iface);
- return E_NOTIMPL;
+ TRACE("iface %p, stream %p.\n", iface, stream);
+
+ if (!stream)
+ return E_POINTER;
+
+ return opc_content_stream_create(part->content, stream);
}
static HRESULT WINAPI opc_part_GetName(IOpcPart *iface, IOpcPartUri **name)
@@ -266,6 +526,14 @@ static HRESULT opc_part_create(struct opc_part_set *set, IOpcPartUri *name, cons
return E_OUTOFMEMORY;
}
+ part->content = heap_alloc_zero(sizeof(*part->content));
+ if (!part->content)
+ {
+ IOpcPart_Release(&part->IOpcPart_iface);
+ return E_OUTOFMEMORY;
+ }
+ part->content->refcount = 1;
+
set->parts[set->count++] = part;
IOpcPart_AddRef(&part->IOpcPart_iface);
diff --git a/dlls/opcservices/tests/opcservices.c b/dlls/opcservices/tests/opcservices.c
index 84a8c12dc9..f6194609ed 100644
--- a/dlls/opcservices/tests/opcservices.c
+++ b/dlls/opcservices/tests/opcservices.c
@@ -44,12 +44,16 @@ static void test_package(void)
static const WCHAR rootW[] = {'/',0};
IOpcRelationshipSet *relset, *relset2;
IOpcPartSet *partset, *partset2;
+ IStream *stream, *stream2;
IOpcRelationship *rel;
IOpcPartUri *part_uri;
IOpcFactory *factory;
IOpcPackage *package;
+ LARGE_INTEGER move;
+ ULARGE_INTEGER pos;
IUri *target_uri;
IOpcPart *part;
+ char buff[16];
IOpcUri *uri;
HRESULT hr;
BSTR str;
@@ -82,6 +86,37 @@ static void test_package(void)
hr = IOpcPartSet_CreatePart(partset, part_uri, typeW, OPC_COMPRESSION_NONE, &part);
ok(SUCCEEDED(hr), "Failed to create a part, hr %#x.\n", hr);
+ hr = IOpcPart_GetContentStream(part, NULL);
+ ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
+
+ hr = IOpcPart_GetContentStream(part, &stream);
+ ok(SUCCEEDED(hr), "Failed to get content stream, hr %#x.\n", hr);
+
+ hr = IStream_Write(stream, "abc", 3, NULL);
+ ok(hr == S_OK, "Failed to write content, hr %#x.\n", hr);
+
+ move.QuadPart = 0;
+ hr = IStream_Seek(stream, move, STREAM_SEEK_CUR, &pos);
+ ok(SUCCEEDED(hr), "Seek failed, hr %#x.\n", hr);
+ ok(pos.QuadPart == 3, "Unexpected position.\n");
+
+ hr = IOpcPart_GetContentStream(part, &stream2);
+ ok(SUCCEEDED(hr), "Failed to get content stream, hr %#x.\n", hr);
+ ok(stream != stream2, "Unexpected instance.\n");
+
+ move.QuadPart = 0;
+ hr = IStream_Seek(stream2, move, STREAM_SEEK_CUR, &pos);
+ ok(SUCCEEDED(hr), "Seek failed, hr %#x.\n", hr);
+ ok(pos.QuadPart == 0, "Unexpected position.\n");
+
+ memset(buff, 0, sizeof(buff));
+ hr = IStream_Read(stream2, buff, sizeof(buff), NULL);
+ ok(hr == S_OK, "Failed to read content, hr %#x.\n", hr);
+ ok(!memcmp(buff, "abc", 3), "Unexpected content.\n");
+
+ IStream_Release(stream);
+ IStream_Release(stream2);
+
hr = IOpcPart_GetRelationshipSet(part, &relset);
ok(SUCCEEDED(hr), "Failed to get relationship set, hr %#x.\n", hr);
--
2.18.0
1
0
12 Sep '18
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/xmllite/tests/writer.c | 62 ++++++++++++++++++++-----------------
1 file changed, 33 insertions(+), 29 deletions(-)
diff --git a/dlls/xmllite/tests/writer.c b/dlls/xmllite/tests/writer.c
index 87cdaabce1..972eb96d9b 100644
--- a/dlls/xmllite/tests/writer.c
+++ b/dlls/xmllite/tests/writer.c
@@ -1572,6 +1572,27 @@ static void test_indentation(void)
IXmlWriter_Release(writer);
}
+static HRESULT write_attribute_string(IXmlWriter *writer, const char *prefix, const char *local,
+ const char *uri, const char *value)
+{
+ WCHAR *prefixW, *localW, *uriW, *valueW;
+ HRESULT hr;
+
+ prefixW = strdupAtoW(prefix);
+ localW = strdupAtoW(local);
+ uriW = strdupAtoW(uri);
+ valueW = strdupAtoW(value);
+
+ hr = IXmlWriter_WriteAttributeString(writer, prefixW, localW, uriW, valueW);
+
+ heap_free(prefixW);
+ heap_free(localW);
+ heap_free(uriW);
+ heap_free(valueW);
+
+ return hr;
+}
+
static void test_WriteAttributeString(void)
{
static const struct
@@ -1589,6 +1610,7 @@ static void test_WriteAttributeString(void)
{ NULL, "a", NULL, "b", "<e a=\"b\" />", "<e a=\"b\"" },
{ "prefix", "local", "uri", "b", "<e prefix:local=\"b\" xmlns:prefix=\"uri\" />", "<e prefix:local=\"b\"" },
{ NULL, "a", "http://www.w3.org/2000/xmlns/", "defuri", "<e xmlns:a=\"defuri\" />", "<e xmlns:a=\"defuri\"" },
+ { "xmlns", "a", NULL, "uri", "<e xmlns:a=\"uri\" />", "<e xmlns:a=\"uri\"" },
/* Autogenerated prefix names. */
{ NULL, "a", "defuri", NULL, "<e p1:a=\"\" xmlns:p1=\"defuri\" />", "<e p1:a=\"\"" },
@@ -1606,12 +1628,6 @@ static void test_WriteAttributeString(void)
{ "prefix", "a", "http://www.w3.org/2000/xmlns/", "defuri", "<e />", "<e", WR_E_XMLNSURIDECLARATION },
};
- static const WCHAR prefixW[] = {'p','r','e','f','i','x',0};
- static const WCHAR localW[] = {'l','o','c','a','l',0};
- static const WCHAR uriW[] = {'u','r','i',0};
- static const WCHAR elementW[] = {'e',0};
- static const WCHAR aW[] = {'a',0};
- static const WCHAR bW[] = {'b',0};
IXmlWriter *writer;
IStream *stream;
unsigned int i;
@@ -1624,22 +1640,16 @@ static void test_WriteAttributeString(void)
for (i = 0; i < ARRAY_SIZE(attribute_tests); ++i)
{
- WCHAR *prefixW, *localW, *uriW, *valueW;
-
stream = writer_set_output(writer);
hr = IXmlWriter_WriteStartDocument(writer, XmlStandalone_Omit);
ok(hr == S_OK, "Failed to start document, hr %#x.\n", hr);
- hr = IXmlWriter_WriteStartElement(writer, NULL, elementW, NULL);
+ hr = write_start_element(writer, NULL, "e", NULL);
ok(hr == S_OK, "Failed to start element, hr %#x.\n", hr);
- prefixW = strdupAtoW(attribute_tests[i].prefix);
- localW = strdupAtoW(attribute_tests[i].local);
- uriW = strdupAtoW(attribute_tests[i].uri);
- valueW = strdupAtoW(attribute_tests[i].value);
-
- hr = IXmlWriter_WriteAttributeString(writer, prefixW, localW, uriW, valueW);
+ hr = write_attribute_string(writer, attribute_tests[i].prefix, attribute_tests[i].local,
+ attribute_tests[i].uri, attribute_tests[i].value);
todo_wine_if(i != 0)
ok(hr == attribute_tests[i].hr, "%u: unexpected hr %#x.\n", i, hr);
@@ -1654,11 +1664,6 @@ static void test_WriteAttributeString(void)
hr = IXmlWriter_Flush(writer);
ok(hr == S_OK, "Failed to flush, hr %#x.\n", hr);
- heap_free(prefixW);
- heap_free(localW);
- heap_free(uriW);
- heap_free(valueW);
-
check_output(stream, attribute_tests[i].output, i == 1 || i == 2 || i == 3 || i == 4, __LINE__);
IStream_Release(stream);
}
@@ -1669,21 +1674,20 @@ static void test_WriteAttributeString(void)
hr = IXmlWriter_WriteStartDocument(writer, XmlStandalone_Omit);
ok(hr == S_OK, "got 0x%08x\n", hr);
- hr = IXmlWriter_WriteStartElement(writer, NULL, aW, NULL);
+ hr = write_start_element(writer, "p", "a", "outeruri");
ok(hr == S_OK, "got 0x%08x\n", hr);
- hr = IXmlWriter_WriteAttributeString(writer, aW, NULL, NULL, bW);
-todo_wine
- ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
-
- hr = IXmlWriter_WriteAttributeString(writer, prefixW, localW, uriW, bW);
+ hr = write_attribute_string(writer, "prefix", "local", "uri", "b");
todo_wine
ok(hr == S_OK, "got 0x%08x\n", hr);
- hr = IXmlWriter_WriteAttributeString(writer, NULL, aW, NULL, bW);
+ hr = write_attribute_string(writer, NULL, "a", NULL, "b");
ok(hr == S_OK, "got 0x%08x\n", hr);
- hr = IXmlWriter_WriteAttributeString(writer, prefixW, localW, NULL, bW);
+ hr = write_attribute_string(writer, "p", "attr", NULL, "value");
+ ok(hr == S_OK, "Failed to write attribute string, hr %#x.\n", hr);
+
+ hr = write_attribute_string(writer, "prefix", "local", NULL, "b");
todo_wine
ok(hr == WR_E_DUPLICATEATTRIBUTE, "got 0x%08x\n", hr);
@@ -1694,7 +1698,7 @@ todo_wine
ok(hr == S_OK, "got 0x%08x\n", hr);
CHECK_OUTPUT_TODO(stream,
- "<a prefix:local=\"b\" a=\"b\" xmlns:prefix=\"uri\" />");
+ "<p:a prefix:local=\"b\" a=\"b\" p:attr=\"value\" xmlns:prefix=\"uri\" xmlns:p=\"outeruri\" />");
IXmlWriter_Release(writer);
IStream_Release(stream);
--
2.18.0
1
1
[PATCH] user32: Make sure that passed window handle is scroll control before accessing wExtra in SCROLL_GetInternalInfo.
by Jacek Caban 12 Sep '18
by Jacek Caban 12 Sep '18
12 Sep '18
Fixes memory corruption in Office 2016.
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
---
I'm not sure a new window flag is the best way to handle it. I did it
the same way as it's done for MDI client.
dlls/user32/scroll.c | 7 ++++++-
dlls/user32/tests/scroll.c | 21 +++++++++++++++++++++
dlls/user32/win.h | 1 +
3 files changed, 28 insertions(+), 1 deletion(-)
1
0
Signed-off-by: Piotr Caban <piotr(a)codeweavers.com>
---
dlls/vcruntime140/Makefile.in | 1 +
dlls/vcruntime140/misc.c | 7 +++++++
dlls/vcruntime140/vcruntime140.spec | 2 +-
3 files changed, 9 insertions(+), 1 deletion(-)
1
0