From: Andrew Eikum Subject: [PATCH 2/4] d2d1: Implement FillContainsPoint for paths Message-Id: <20161021162853.GA7470@foghorn.codeweavers.com> Date: Fri, 21 Oct 2016 11:28:53 -0500 Signed-off-by: Andrew Eikum --- dlls/d2d1/geometry.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/dlls/d2d1/geometry.c b/dlls/d2d1/geometry.c index eba9911..eb4f98e 100644 --- a/dlls/d2d1/geometry.c +++ b/dlls/d2d1/geometry.c @@ -1924,9 +1924,11 @@ static HRESULT STDMETHODCALLTYPE d2d_geometry_sink_Close(ID2D1GeometrySink *ifac } done: - d2d_path_geometry_free_figures(geometry); if (FAILED(hr)) + { + d2d_path_geometry_free_figures(geometry); geometry->u.path.state = D2D_GEOMETRY_STATE_ERROR; + } return hr; } @@ -2112,10 +2114,27 @@ static HRESULT STDMETHODCALLTYPE d2d_path_geometry_StrokeContainsPoint(ID2D1Path static HRESULT STDMETHODCALLTYPE d2d_path_geometry_FillContainsPoint(ID2D1PathGeometry *iface, D2D1_POINT_2F point, const D2D1_MATRIX_3X2_F *transform, float tolerance, BOOL *contains) { - FIXME("iface %p, point {%.8e, %.8e}, transform %p, tolerance %.8e, contains %p stub!\n", + struct d2d_geometry *geometry = impl_from_ID2D1PathGeometry(iface); + D2D1_MATRIX_3X2_F g_i; + D2D1_POINT_2F probe; + + TRACE("iface %p, point {%.8e, %.8e}, transform %p, tolerance %.8e, contains %p\n", iface, point.x, point.y, transform, tolerance, contains); - return E_NOTIMPL; + if (transform) + { + if (!d2d_matrix_invert(&g_i, transform)) + return D2DERR_UNSUPPORTED_OPERATION; + d2d_point_transform(&probe, &g_i, point.x, point.y); + } + else + probe = point; + + *contains = !!d2d_path_geometry_point_inside(geometry, &probe); + + TRACE("-> %#x\n", *contains); + + return S_OK; } static HRESULT STDMETHODCALLTYPE d2d_path_geometry_CompareWithGeometry(ID2D1PathGeometry *iface, -- 2.10.0