From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/d2d1/geometry.c | 38 ++++++++++++++++++++++++++++++++++++-- dlls/d2d1/tests/d2d1.c | 38 +++++++++++++++++++++++--------------- 2 files changed, 59 insertions(+), 17 deletions(-)
diff --git a/dlls/d2d1/geometry.c b/dlls/d2d1/geometry.c index e9ed1e43ff5..d402ec1e842 100644 --- a/dlls/d2d1/geometry.c +++ b/dlls/d2d1/geometry.c @@ -4499,12 +4499,46 @@ static HRESULT STDMETHODCALLTYPE d2d_rectangle_geometry_Outline(ID2D1RectangleGe return E_NOTIMPL; }
+static float d2d_triangle_area(const D2D1_TRIANGLE *triangle) +{ + D2D1_POINT_2F point2, point3; + + /* Translate one vertex to origin */ + point2.x = triangle->point2.x - triangle->point1.x; + point2.y = triangle->point2.y - triangle->point1.y; + point3.x = triangle->point3.x - triangle->point1.x; + point3.y = triangle->point3.y - triangle->point1.y; + + return 0.5f * fabsf(point2.x * point3.y - point3.x * point2.y); +} + static HRESULT STDMETHODCALLTYPE d2d_rectangle_geometry_ComputeArea(ID2D1RectangleGeometry *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_ID2D1RectangleGeometry(iface); + const D2D_RECT_F *rect = &geometry->u.rectangle.rect; + D2D1_TRIANGLE triangle; + D2D1_MATRIX_3X2_F m;
- return E_NOTIMPL; + TRACE("iface %p, transform %p, tolerance %.8e, area %p.\n", iface, transform, tolerance, area); + + if (transform) + { + m = *transform; + m._31 = m._32 = 0.0f; + + d2d_point_transform(&triangle.point1, &m, rect->left, rect->bottom); + d2d_point_transform(&triangle.point2, &m, rect->left, rect->top); + d2d_point_transform(&triangle.point3, &m, rect->right, rect->top); + + *area = 2 * d2d_triangle_area(&triangle); + } + else + { + *area = fabsf((rect->right - rect->left) * (rect->bottom - rect->top)); + } + + return S_OK; }
static HRESULT STDMETHODCALLTYPE d2d_rectangle_geometry_ComputeLength(ID2D1RectangleGeometry *iface, diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index 6c92fa1b81a..08fca37b66c 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -15499,39 +15499,47 @@ static void test_compute_geometry_area(BOOL d3d11) ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
hr = ID2D1RectangleGeometry_ComputeArea(rectangle_geometry, NULL, 0.01f, &area); - todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); - if (hr == S_OK) - ok(compare_float(area, 4.0f, 0), "Unexpected value %.8e.\n", area); + ok(compare_float(area, 4.0f, 0), "Unexpected value %.8e.\n", area);
hr = ID2D1RectangleGeometry_ComputeArea(rectangle_geometry, NULL, 200.0f, &area); - todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); - if (hr == S_OK) - ok(compare_float(area, 4.0f, 0), "Unexpected value %.8e.\n", area); + ok(compare_float(area, 4.0f, 0), "Unexpected value %.8e.\n", area);
set_matrix_identity(&matrix); scale_matrix(&matrix, 1.0f, 2.0f); hr = ID2D1RectangleGeometry_ComputeArea(rectangle_geometry, &matrix, 0.01f, &area); - todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); - if (hr == S_OK) - ok(compare_float(area, 8.0f, 0), "Unexpected value %.8e.\n", area); + ok(compare_float(area, 8.0f, 0), "Unexpected value %.8e.\n", area);
rotate_matrix(&matrix, 0.5f); hr = ID2D1RectangleGeometry_ComputeArea(rectangle_geometry, &matrix, 200.0f, &area); - todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); - if (hr == S_OK) - ok(compare_float(area, 8.0f, 0), "Unexpected value %.8e.\n", area); + ok(compare_float(area, 8.0f, 0), "Unexpected value %.8e.\n", area);
skew_matrix(&matrix, 0.1f, 1.5f); hr = ID2D1RectangleGeometry_ComputeArea(rectangle_geometry, &matrix, 200.0f, &area); - todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); - if (hr == S_OK) - ok(compare_float(area, 6.8f, 0), "Unexpected value %.8e.\n", area); + ok(compare_float(area, 6.8f, 0), "Unexpected value %.8e.\n", area); + + ID2D1RectangleGeometry_Release(rectangle_geometry);
+ set_rect(&rect, 50.0f, 0.0f, 40.0f, 100.0f); + hr = ID2D1Factory_CreateRectangleGeometry(ctx.factory, &rect, &rectangle_geometry); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + + hr = ID2D1RectangleGeometry_ComputeArea(rectangle_geometry, NULL, 1.0f, &area); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + ok(compare_float(area, 1000.0f, 0), "Unexpected value %.8e.\n", area); + ID2D1RectangleGeometry_Release(rectangle_geometry); + + set_rect(&rect, 0.0f, 100.0f, 40.0f, 50.0f); + hr = ID2D1Factory_CreateRectangleGeometry(ctx.factory, &rect, &rectangle_geometry); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + + hr = ID2D1RectangleGeometry_ComputeArea(rectangle_geometry, NULL, 1.0f, &area); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); + ok(compare_float(area, 2000.0f, 0), "Unexpected value %.8e.\n", area); ID2D1RectangleGeometry_Release(rectangle_geometry);
release_test_context(&ctx);