Nikolay Sivov : d2d1: Implement d2d_geometry_group_GetBounds().

Alexandre Julliard julliard at winehq.org
Mon Mar 15 16:59:12 CDT 2021


Module: wine
Branch: master
Commit: 1cd678d6a0638698f27f9f3e4a1f42bb566e524f
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=1cd678d6a0638698f27f9f3e4a1f42bb566e524f

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Mar 15 10:38:15 2021 +0300

d2d1: Implement d2d_geometry_group_GetBounds().

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50411
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/d2d1/geometry.c   | 19 +++++++++++++++++--
 dlls/d2d1/tests/d2d1.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 66 insertions(+), 2 deletions(-)

diff --git a/dlls/d2d1/geometry.c b/dlls/d2d1/geometry.c
index c32de310353..6da93de3eb4 100644
--- a/dlls/d2d1/geometry.c
+++ b/dlls/d2d1/geometry.c
@@ -4880,9 +4880,24 @@ static void STDMETHODCALLTYPE d2d_geometry_group_GetFactory(ID2D1GeometryGroup *
 static HRESULT STDMETHODCALLTYPE d2d_geometry_group_GetBounds(ID2D1GeometryGroup *iface,
         const D2D1_MATRIX_3X2_F *transform, D2D1_RECT_F *bounds)
 {
-    FIXME("iface %p, transform %p, bounds %p stub!.\n", iface, transform, bounds);
+    struct d2d_geometry *geometry = impl_from_ID2D1GeometryGroup(iface);
+    D2D1_RECT_F rect;
+    unsigned int i;
 
-    return E_NOTIMPL;
+    TRACE("iface %p, transform %p, bounds %p.\n", iface, transform, bounds);
+
+    bounds->left = FLT_MAX;
+    bounds->top = FLT_MAX;
+    bounds->right = -FLT_MAX;
+    bounds->bottom = -FLT_MAX;
+
+    for (i = 0; i < geometry->u.group.geometry_count; ++i)
+    {
+        if (SUCCEEDED(ID2D1Geometry_GetBounds(geometry->u.group.src_geometries[i], transform, &rect)))
+            d2d_rect_union(bounds, &rect);
+    }
+
+    return S_OK;
 }
 
 static HRESULT STDMETHODCALLTYPE d2d_geometry_group_GetWidenedBounds(ID2D1GeometryGroup *iface,
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index 1dc7a27ca5b..a046a21c7f6 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -9566,6 +9566,54 @@ static void test_colour_space(BOOL d3d11)
     }
 }
 
+static void test_geometry_group(BOOL d3d11)
+{
+    ID2D1Factory *factory;
+    ID2D1GeometryGroup *group;
+    ID2D1Geometry *geometries[2];
+    D2D1_RECT_F rect;
+    HRESULT hr;
+    D2D1_MATRIX_3X2_F matrix;
+    BOOL match;
+
+    hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &IID_ID2D1Factory, NULL, (void **)&factory);
+    ok(SUCCEEDED(hr), "Failed to create factory, hr %#x.\n", hr);
+
+    set_rect(&rect, -1.0f, -1.0f, 1.0f, 1.0f);
+    hr = ID2D1Factory_CreateRectangleGeometry(factory, &rect, (ID2D1RectangleGeometry **)&geometries[0]);
+    ok(SUCCEEDED(hr), "Failed to create geometry, hr %#x.\n", hr);
+
+    set_rect(&rect, -2.0f, -2.0f, 0.0f, 2.0f);
+    hr = ID2D1Factory_CreateRectangleGeometry(factory, &rect, (ID2D1RectangleGeometry **)&geometries[1]);
+    ok(SUCCEEDED(hr), "Failed to create geometry, hr %#x.\n", hr);
+
+    hr = ID2D1Factory_CreateGeometryGroup(factory, D2D1_FILL_MODE_ALTERNATE, geometries, 2, &group);
+    ok(SUCCEEDED(hr), "Failed to create geometry group, hr %#x.\n", hr);
+
+    set_rect(&rect, 0.0f, 0.0f, 0.0f, 0.0f);
+    hr = ID2D1GeometryGroup_GetBounds(group, NULL, &rect);
+    ok(SUCCEEDED(hr), "Failed to get geometry group bounds, hr %#x.\n", hr);
+    match = compare_rect(&rect, -2.0f, -2.0f, 1.0f, 2.0f, 0);
+    ok(match, "Got unexpected rectangle {%.8e, %.8e, %.8e, %.8e}.\n",
+            rect.left, rect.top, rect.right, rect.bottom);
+
+    set_matrix_identity(&matrix);
+    translate_matrix(&matrix, 80.0f, 640.0f);
+    scale_matrix(&matrix, 2.0f, 0.5f);
+    hr = ID2D1GeometryGroup_GetBounds(group, &matrix, &rect);
+    ok(SUCCEEDED(hr), "Failed to get geometry group bounds, hr %#x.\n", hr);
+    match = compare_rect(&rect, 76.0f, 639.0f, 82.0f, 641.0f, 0);
+    ok(match, "Got unexpected rectangle {%.8e, %.8e, %.8e, %.8e}.\n",
+            rect.left, rect.top, rect.right, rect.bottom);
+
+    ID2D1GeometryGroup_Release(group);
+
+    ID2D1Geometry_Release(geometries[0]);
+    ID2D1Geometry_Release(geometries[1]);
+
+    ID2D1Factory_Release(factory);
+}
+
 START_TEST(d2d1)
 {
     HMODULE d2d1_dll = GetModuleHandleA("d2d1.dll");
@@ -9625,6 +9673,7 @@ START_TEST(d2d1)
     queue_test(test_wic_bitmap_format);
     queue_d3d10_test(test_math);
     queue_d3d10_test(test_colour_space);
+    queue_test(test_geometry_group);
 
     run_queued_tests();
 }




More information about the wine-cvs mailing list