[PATCH 5/5] d2d1: Implement d2d_d3d_render_target_GetPixelSize().

Henri Verbeet hverbeet at codeweavers.com
Wed Sep 3 00:48:23 CDT 2014


---
 dlls/d2d1/d2d1_private.h  |    3 ++-
 dlls/d2d1/factory.c       |    8 +++++++-
 dlls/d2d1/render_target.c |   21 +++++++++++++++++----
 3 files changed, 26 insertions(+), 6 deletions(-)

diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h
index 001c986..925fafb 100644
--- a/dlls/d2d1/d2d1_private.h
+++ b/dlls/d2d1/d2d1_private.h
@@ -29,10 +29,11 @@ struct d2d_d3d_render_target
     ID2D1RenderTarget ID2D1RenderTarget_iface;
     LONG refcount;
 
+    D2D1_SIZE_U pixel_size;
     D2D1_MATRIX_3X2_F transform;
 };
 
-void d2d_d3d_render_target_init(struct d2d_d3d_render_target *render_target, ID2D1Factory *factory,
+HRESULT d2d_d3d_render_target_init(struct d2d_d3d_render_target *render_target, ID2D1Factory *factory,
         IDXGISurface *surface, const D2D1_RENDER_TARGET_PROPERTIES *desc) DECLSPEC_HIDDEN;
 
 struct d2d_gradient
diff --git a/dlls/d2d1/factory.c b/dlls/d2d1/factory.c
index 0bc465e..f8cd912 100644
--- a/dlls/d2d1/factory.c
+++ b/dlls/d2d1/factory.c
@@ -191,13 +191,19 @@ static HRESULT STDMETHODCALLTYPE d2d_factory_CreateDxgiSurfaceRenderTarget(ID2D1
         IDXGISurface *surface, const D2D1_RENDER_TARGET_PROPERTIES *desc, ID2D1RenderTarget **render_target)
 {
     struct d2d_d3d_render_target *object;
+    HRESULT hr;
 
     TRACE("iface %p, surface %p, desc %p, render_target %p.\n", iface, surface, desc, render_target);
 
     if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
         return E_OUTOFMEMORY;
 
-    d2d_d3d_render_target_init(object, iface, surface, desc);
+    if (FAILED(hr = d2d_d3d_render_target_init(object, iface, surface, desc)))
+    {
+        WARN("Failed to initialize render target, hr %#x.\n", hr);
+        HeapFree(GetProcessHeap(), 0, object);
+        return hr;
+    }
 
     TRACE("Created render target %p.\n", object);
     *render_target = &object->ID2D1RenderTarget_iface;
diff --git a/dlls/d2d1/render_target.c b/dlls/d2d1/render_target.c
index 3897a1c..2c079a3 100644
--- a/dlls/d2d1/render_target.c
+++ b/dlls/d2d1/render_target.c
@@ -483,11 +483,11 @@ static D2D1_SIZE_F STDMETHODCALLTYPE d2d_d3d_render_target_GetSize(ID2D1RenderTa
 
 static D2D1_SIZE_U STDMETHODCALLTYPE d2d_d3d_render_target_GetPixelSize(ID2D1RenderTarget *iface)
 {
-    static const D2D1_SIZE_U size = {0, 0};
+    struct d2d_d3d_render_target *render_target = impl_from_ID2D1RenderTarget(iface);
 
-    FIXME("iface %p stub!\n", iface);
+    TRACE("iface %p.\n", iface);
 
-    return size;
+    return render_target->pixel_size;
 }
 
 static UINT32 STDMETHODCALLTYPE d2d_d3d_render_target_GetMaximumBitmapSize(ID2D1RenderTarget *iface)
@@ -566,9 +566,12 @@ static const struct ID2D1RenderTargetVtbl d2d_d3d_render_target_vtbl =
     d2d_d3d_render_target_IsSupported,
 };
 
-void d2d_d3d_render_target_init(struct d2d_d3d_render_target *render_target, ID2D1Factory *factory,
+HRESULT d2d_d3d_render_target_init(struct d2d_d3d_render_target *render_target, ID2D1Factory *factory,
         IDXGISurface *surface, const D2D1_RENDER_TARGET_PROPERTIES *desc)
 {
+    DXGI_SURFACE_DESC surface_desc;
+    HRESULT hr;
+
     static const D2D1_MATRIX_3X2_F identity =
     {
         1.0f, 0.0f,
@@ -581,5 +584,15 @@ void d2d_d3d_render_target_init(struct d2d_d3d_render_target *render_target, ID2
     render_target->ID2D1RenderTarget_iface.lpVtbl = &d2d_d3d_render_target_vtbl;
     render_target->refcount = 1;
 
+    if (FAILED(hr = IDXGISurface_GetDesc(surface, &surface_desc)))
+    {
+        WARN("Failed to get surface desc, hr %#x.\n", hr);
+        return hr;
+    }
+
+    render_target->pixel_size.width = surface_desc.Width;
+    render_target->pixel_size.height = surface_desc.Height;
     render_target->transform = identity;
+
+    return S_OK;
 }
-- 
1.7.10.4




More information about the wine-patches mailing list