Module: wine Branch: master Commit: c575f04b6841fc107e8703a59516ad3da0463553 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c575f04b6841fc107e8703a595...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Thu Oct 8 20:07:43 2015 +0200
d2d1: Properly check if a face is real in d2d_path_geometry_add_face().
In particular, the existing test may fail if the convex hull has only three vertices.
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/d2d1/geometry.c | 3 +-- dlls/d2d1/tests/d2d1.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-)
diff --git a/dlls/d2d1/geometry.c b/dlls/d2d1/geometry.c index 80d004b..3919080 100644 --- a/dlls/d2d1/geometry.c +++ b/dlls/d2d1/geometry.c @@ -1234,8 +1234,7 @@ static BOOL d2d_path_geometry_add_face(struct d2d_geometry *geometry, const stru probe.x += cdt->vertices[d2d_cdt_edge_origin(cdt, &tmp)].x * 0.50f; probe.y += cdt->vertices[d2d_cdt_edge_origin(cdt, &tmp)].y * 0.50f;
- d2d_cdt_edge_next_left(cdt, &tmp, &tmp); - if (tmp.idx == base_edge->idx && d2d_path_geometry_point_inside(geometry, &probe)) + if (d2d_cdt_leftof(cdt, face->v[2], base_edge) && d2d_path_geometry_point_inside(geometry, &probe)) ++geometry->face_count;
return TRUE; diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c index dfc560f..67901b6 100644 --- a/dlls/d2d1/tests/d2d1.c +++ b/dlls/d2d1/tests/d2d1.c @@ -1630,6 +1630,46 @@ static void test_path_geometry(void) ID2D1TransformedGeometry_Release(transformed_geometry); ID2D1PathGeometry_Release(geometry);
+ hr = ID2D1Factory_CreatePathGeometry(factory, &geometry); + ok(SUCCEEDED(hr), "Failed to create path geometry, hr %#x.\n", hr); + hr = ID2D1PathGeometry_Open(geometry, &sink); + ok(SUCCEEDED(hr), "Failed to open geometry sink, hr %#x.\n", hr); + + set_point(&point, 40.0f, 20.0f); + ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED); + set_point(&point, 75.0f, 300.0f); + ID2D1GeometrySink_AddLine(sink, point); + set_point(&point, 5.0f, 300.0f); + ID2D1GeometrySink_AddLine(sink, point); + ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED); + + set_point(&point, 40.0f, 290.0f); + ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED); + set_point(&point, 55.0f, 160.0f); + ID2D1GeometrySink_AddLine(sink, point); + set_point(&point, 25.0f, 160.0f); + ID2D1GeometrySink_AddLine(sink, point); + ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED); + + hr = ID2D1GeometrySink_Close(sink); + ok(SUCCEEDED(hr), "Failed to close geometry sink, hr %#x.\n", hr); + hr = ID2D1PathGeometry_GetFigureCount(geometry, &count); + ok(SUCCEEDED(hr), "Failed to get figure count, hr %#x.\n", hr); + ok(count == 2, "Got unexpected figure count %u.\n", count); + hr = ID2D1PathGeometry_GetSegmentCount(geometry, &count); + ok(SUCCEEDED(hr), "Failed to get segment count, hr %#x.\n", hr); + ok(count == 6, "Got unexpected segment count %u.\n", count); + ID2D1GeometrySink_Release(sink); + + ID2D1RenderTarget_BeginDraw(rt); + ID2D1RenderTarget_Clear(rt, &color); + ID2D1RenderTarget_FillGeometry(rt, (ID2D1Geometry *)geometry, (ID2D1Brush *)brush, NULL); + hr = ID2D1RenderTarget_EndDraw(rt, NULL, NULL); + ok(SUCCEEDED(hr), "Failed to end draw, hr %#x.\n", hr); + match = compare_surface(surface, "a875e68e0cb9c055927b1b50b879f90b24e38470"); + ok(match, "Surface does not match.\n"); + ID2D1PathGeometry_Release(geometry); + ID2D1SolidColorBrush_Release(brush); ID2D1RenderTarget_Release(rt); refcount = ID2D1Factory_Release(factory);