[PATCH 1/5] d2d1: Avoid degenerate line segments.
Henri Verbeet
hverbeet at codeweavers.com
Fri Feb 3 06:37:08 CST 2017
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
dlls/d2d1/geometry.c | 27 ++++++++++++++++++++++-----
1 file changed, 22 insertions(+), 5 deletions(-)
diff --git a/dlls/d2d1/geometry.c b/dlls/d2d1/geometry.c
index 35b1aef..c1ec461 100644
--- a/dlls/d2d1/geometry.c
+++ b/dlls/d2d1/geometry.c
@@ -498,6 +498,12 @@ static BOOL d2d_figure_insert_vertex(struct d2d_figure *figure, size_t idx, D2D1
static BOOL d2d_figure_add_vertex(struct d2d_figure *figure, D2D1_POINT_2F vertex)
{
+ size_t last = figure->vertex_count - 1;
+
+ if (figure->vertex_count && figure->vertex_types[last] == D2D_VERTEX_TYPE_LINE
+ && !memcmp(&figure->vertices[last], &vertex, sizeof(vertex)))
+ return TRUE;
+
if (!d2d_array_reserve((void **)&figure->vertices, &figure->vertices_size,
figure->vertex_count + 1, sizeof(*figure->vertices)))
{
@@ -1181,7 +1187,7 @@ static BOOL d2d_path_geometry_point_inside(const struct d2d_geometry *geometry,
const D2D1_POINT_2F *p0, *p1;
D2D1_POINT_2F v_p, v_probe;
unsigned int score;
- size_t i, j;
+ size_t i, j, last;
for (i = 0, score = 0; i < geometry->u.path.figure_count; ++i)
{
@@ -1191,8 +1197,14 @@ static BOOL d2d_path_geometry_point_inside(const struct d2d_geometry *geometry,
|| probe->y < figure->bounds.top || probe->y > figure->bounds.bottom)
continue;
- p0 = &figure->vertices[figure->vertex_count - 1];
- for (j = 0; j < figure->vertex_count; ++j)
+ last = figure->vertex_count - 1;
+ if (!triangles_only)
+ {
+ while (last && figure->vertex_types[last] == D2D_VERTEX_TYPE_NONE)
+ --last;
+ }
+ p0 = &figure->vertices[last];
+ for (j = 0; j <= last; ++j)
{
if (!triangles_only && figure->vertex_types[j] == D2D_VERTEX_TYPE_NONE)
continue;
@@ -1431,6 +1443,10 @@ static BOOL d2d_cdt_insert_segments(struct d2d_cdt *cdt, struct d2d_geometry *ge
{
figure = &geometry->u.path.figures[i];
+ /* Degenerate figure. */
+ if (figure->vertex_count < 2)
+ continue;
+
p = bsearch(&figure->vertices[figure->vertex_count - 1], cdt->vertices,
geometry->fill.vertex_count, sizeof(*p), d2d_cdt_compare_vertices);
start_vertex = p - cdt->vertices;
@@ -1880,8 +1896,9 @@ static void STDMETHODCALLTYPE d2d_geometry_sink_EndFigure(ID2D1GeometrySink *ifa
figure = &geometry->u.path.figures[geometry->u.path.figure_count - 1];
figure->vertex_types[figure->vertex_count - 1] = D2D_VERTEX_TYPE_LINE;
- if (figure_end != D2D1_FIGURE_END_CLOSED)
- FIXME("Ignoring figure_end %#x.\n", figure_end);
+ if (figure_end == D2D1_FIGURE_END_CLOSED && !memcmp(&figure->vertices[0],
+ &figure->vertices[figure->vertex_count - 1], sizeof(*figure->vertices)))
+ --figure->vertex_count;
geometry->u.path.state = D2D_GEOMETRY_STATE_OPEN;
}
--
2.1.4
More information about the wine-patches
mailing list