[PATCH 2/5] d2d1: Implement d2d_layer_GetSize().

Henri Verbeet hverbeet at codeweavers.com
Fri Jun 2 10:56:32 CDT 2017


Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
 dlls/d2d1/d2d1_private.h  |  3 ++-
 dlls/d2d1/layer.c         | 11 +++++++----
 dlls/d2d1/render_target.c |  2 +-
 dlls/d2d1/tests/d2d1.c    | 12 ++++++++++++
 4 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h
index 12a230b..377adf6 100644
--- a/dlls/d2d1/d2d1_private.h
+++ b/dlls/d2d1/d2d1_private.h
@@ -242,9 +242,10 @@ struct d2d_layer
     LONG refcount;
 
     ID2D1Factory *factory;
+    D2D1_SIZE_F size;
 };
 
-HRESULT d2d_layer_create(ID2D1Factory *factory, struct d2d_layer **layer) DECLSPEC_HIDDEN;
+HRESULT d2d_layer_create(ID2D1Factory *factory, const D2D1_SIZE_F *size, struct d2d_layer **layer) DECLSPEC_HIDDEN;
 
 struct d2d_mesh
 {
diff --git a/dlls/d2d1/layer.c b/dlls/d2d1/layer.c
index 0fcd185..25a331b 100644
--- a/dlls/d2d1/layer.c
+++ b/dlls/d2d1/layer.c
@@ -84,10 +84,11 @@ static void STDMETHODCALLTYPE d2d_layer_GetFactory(ID2D1Layer *iface, ID2D1Facto
 
 static D2D1_SIZE_F * STDMETHODCALLTYPE d2d_layer_GetSize(ID2D1Layer *iface, D2D1_SIZE_F *size)
 {
-    FIXME("iface %p, size %p stub!\n", iface, size);
+    struct d2d_layer *layer = impl_from_ID2D1Layer(iface);
+
+    TRACE("iface %p, size %p.\n", iface, size);
 
-    size->width = 0;
-    size->height = 0;
+    *size = layer->size;
     return size;
 }
 
@@ -100,7 +101,7 @@ static const struct ID2D1LayerVtbl d2d_layer_vtbl =
     d2d_layer_GetSize,
 };
 
-HRESULT d2d_layer_create(ID2D1Factory *factory, struct d2d_layer **layer)
+HRESULT d2d_layer_create(ID2D1Factory *factory, const D2D1_SIZE_F *size, struct d2d_layer **layer)
 {
     if (!(*layer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(**layer))))
         return E_OUTOFMEMORY;
@@ -108,6 +109,8 @@ HRESULT d2d_layer_create(ID2D1Factory *factory, struct d2d_layer **layer)
     (*layer)->ID2D1Layer_iface.lpVtbl = &d2d_layer_vtbl;
     (*layer)->refcount = 1;
     ID2D1Factory_AddRef((*layer)->factory = factory);
+    if (size)
+        (*layer)->size = *size;
 
     TRACE("Created layer %p.\n", *layer);
 
diff --git a/dlls/d2d1/render_target.c b/dlls/d2d1/render_target.c
index ecab51f..ec8e4d0 100644
--- a/dlls/d2d1/render_target.c
+++ b/dlls/d2d1/render_target.c
@@ -464,7 +464,7 @@ static HRESULT STDMETHODCALLTYPE d2d_d3d_render_target_CreateLayer(ID2D1RenderTa
 
     TRACE("iface %p, size %p, layer %p.\n", iface, size, layer);
 
-    if (SUCCEEDED(hr = d2d_layer_create(render_target->factory, &object)))
+    if (SUCCEEDED(hr = d2d_layer_create(render_target->factory, size, &object)))
         *layer = &object->ID2D1Layer_iface;
 
     return hr;
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index 72903ef..6993dc6 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -4536,6 +4536,7 @@ static void test_layer(void)
     ID3D10Device1 *device;
     IDXGISurface *surface;
     ID2D1Layer *layer;
+    D2D1_SIZE_F size;
     ULONG refcount;
     HWND window;
     HRESULT hr;
@@ -4561,6 +4562,17 @@ static void test_layer(void)
     ID2D1Layer_GetFactory(layer, &layer_factory);
     ok(layer_factory == factory, "Got unexpected layer factory %p, expected %p.\n", layer_factory, factory);
     ID2D1Factory_Release(layer_factory);
+    size = ID2D1Layer_GetSize(layer);
+    ok(size.width == 0.0f, "Got unexpected width %.8e.\n", size.width);
+    ok(size.height == 0.0f, "Got unexpected height %.8e.\n", size.height);
+    ID2D1Layer_Release(layer);
+
+    set_size_f(&size, 800.0f, 600.0f);
+    hr = ID2D1RenderTarget_CreateLayer(rt, &size, &layer);
+    ok(SUCCEEDED(hr), "Failed to create layer, hr %#x.\n", hr);
+    size = ID2D1Layer_GetSize(layer);
+    ok(size.width == 800.0f, "Got unexpected width %.8e.\n", size.width);
+    ok(size.height == 600.0f, "Got unexpected height %.8e.\n", size.height);
     ID2D1Layer_Release(layer);
 
     ID2D1RenderTarget_Release(rt);
-- 
2.1.4




More information about the wine-patches mailing list