From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/d2d1/geometry.c | 11 +++++++++-- dlls/d2d1/tests/d2d1.c | 26 ++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/dlls/d2d1/geometry.c b/dlls/d2d1/geometry.c index d402ec1e842..11ca5bded7a 100644 --- a/dlls/d2d1/geometry.c +++ b/dlls/d2d1/geometry.c @@ -5159,9 +5159,16 @@ static HRESULT STDMETHODCALLTYPE d2d_transformed_geometry_Outline(ID2D1Transform static HRESULT STDMETHODCALLTYPE d2d_transformed_geometry_ComputeArea(ID2D1TransformedGeometry *iface, const D2D1_MATRIX_3X2_F *transform, float tolerance, float *area) { - FIXME("iface %p, transform %p, tolerance %.8e, area %p stub!\n", iface, transform, tolerance, area); + struct d2d_geometry *geometry = impl_from_ID2D1TransformedGeometry(iface); + D2D1_MATRIX_3X2_F g;
- return E_NOTIMPL; + TRACE("iface %p, transform %p, tolerance %.8e, area %p.\n", iface, transform, tolerance, area); + + g = geometry->transform; + if (transform) + d2d_matrix_multiply(&g, transform); + + return ID2D1Geometry_ComputeArea(geometry->u.transformed.src_geometry, &g, tolerance, area); }
static HRESULT STDMETHODCALLTYPE d2d_transformed_geometry_ComputeLength(ID2D1TransformedGeometry *iface, diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index 08fca37b66c..f83dcd8f075 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -15448,6 +15448,7 @@ static void test_effect_vertex_buffer(BOOL d3d11)
static void test_compute_geometry_area(BOOL d3d11) { + ID2D1TransformedGeometry *transformed_geometry; ID2D1RectangleGeometry *rectangle_geometry; ID2D1EllipseGeometry *ellipse_geometry; struct d2d1_test_context ctx; @@ -15542,6 +15543,31 @@ static void test_compute_geometry_area(BOOL d3d11) ok(compare_float(area, 2000.0f, 0), "Unexpected value %.8e.\n", area); ID2D1RectangleGeometry_Release(rectangle_geometry);
+ /* Transformed geometry */ + set_rect(&rect, -1.0f, -1.0f, 1.0f, 1.0f); + hr = ID2D1Factory_CreateRectangleGeometry(ctx.factory, &rect, &rectangle_geometry); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + + set_matrix_identity(&matrix); + translate_matrix(&matrix, 240.0f, 720.0f); + scale_matrix(&matrix, 40.0f, 120.0f); + hr = ID2D1Factory_CreateTransformedGeometry(ctx.factory, (ID2D1Geometry *)rectangle_geometry, + &matrix, &transformed_geometry); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + + hr = ID2D1TransformedGeometry_ComputeArea(transformed_geometry, NULL, 1.0f, &area); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + ok(compare_float(area, 1.92e+4f, 0), "Unexpected value %.8e.\n", area); + + set_matrix_identity(&matrix); + skew_matrix(&matrix, 0.1f, 1.5f); + hr = ID2D1TransformedGeometry_ComputeArea(transformed_geometry, &matrix, 1.0f, &area); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + ok(compare_float(area, 1.632e+4f, 0), "Unexpected value %.8e.\n", area); + + ID2D1TransformedGeometry_Release(transformed_geometry); + ID2D1RectangleGeometry_Release(rectangle_geometry); + release_test_context(&ctx); }