d2d1: Introduce a helper to check for Bézier segments.

Signed-off-by: Connor McAdams <conmanx360@gmail.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Connor McAdams 2020-05-20 23:54:44 +04:30 committed by Alexandre Julliard
parent a6a0f7ba8e
commit 0ff58fe1ac
1 changed files with 17 additions and 13 deletions

View File

@ -409,6 +409,11 @@ static void d2d_point_normalise(D2D1_POINT_2F *p)
d2d_point_scale(p, 1.0f / l);
}
static BOOL d2d_vertex_type_is_bezier(enum d2d_vertex_type t)
{
return (t == D2D_VERTEX_TYPE_BEZIER || t == D2D_VERTEX_TYPE_SPLIT_BEZIER);
}
/* This implementation is based on the paper "Adaptive Precision
* Floating-Point Arithmetic and Fast Robust Geometric Predicates" and
* associated (Public Domain) code by Jonathan Richard Shewchuk. */
@ -1875,7 +1880,7 @@ static BOOL d2d_geometry_apply_intersections(struct d2d_geometry *geometry,
figure = &geometry->u.path.figures[inter->figure_idx];
vertex_type = figure->vertex_types[inter->vertex_idx + vertex_offset];
if (vertex_type != D2D_VERTEX_TYPE_BEZIER && vertex_type != D2D_VERTEX_TYPE_SPLIT_BEZIER)
if (!d2d_vertex_type_is_bezier(vertex_type))
{
if (!d2d_figure_insert_vertex(&geometry->u.path.figures[inter->figure_idx],
inter->vertex_idx + vertex_offset + 1, inter->p))
@ -1961,9 +1966,9 @@ static BOOL d2d_geometry_intersect_self(struct d2d_geometry *geometry)
for (idx_q.vertex_idx = 0; idx_q.vertex_idx < max_q; ++idx_q.vertex_idx)
{
type_q = figure_q->vertex_types[idx_q.vertex_idx];
if (type_q == D2D_VERTEX_TYPE_BEZIER)
if (d2d_vertex_type_is_bezier(type_q))
{
if (type_p == D2D_VERTEX_TYPE_BEZIER)
if (d2d_vertex_type_is_bezier(type_p))
{
if (!d2d_geometry_intersect_bezier_bezier(geometry, &intersections,
&idx_p, 0.0f, 1.0f, &idx_q, 0.0f, 1.0f))
@ -1978,7 +1983,7 @@ static BOOL d2d_geometry_intersect_self(struct d2d_geometry *geometry)
}
else
{
if (type_p == D2D_VERTEX_TYPE_BEZIER)
if (d2d_vertex_type_is_bezier(type_p))
{
if (!d2d_geometry_intersect_bezier_line(geometry, &intersections, &idx_p, &idx_q))
goto done;
@ -1991,7 +1996,7 @@ static BOOL d2d_geometry_intersect_self(struct d2d_geometry *geometry)
}
}
}
if (type_p == D2D_VERTEX_TYPE_BEZIER)
if (d2d_vertex_type_is_bezier(type_p))
++idx_p.control_idx;
}
}
@ -2328,7 +2333,7 @@ static BOOL d2d_geometry_add_figure_outline(struct d2d_geometry *geometry,
if (!i)
{
prev_type = figure->vertex_types[figure->vertex_count - 1];
if (prev_type == D2D_VERTEX_TYPE_BEZIER)
if (d2d_vertex_type_is_bezier(prev_type))
prev = &figure->bezier_controls[figure->bezier_control_count - 1];
else
prev = &figure->vertices[figure->vertex_count - 1];
@ -2336,13 +2341,13 @@ static BOOL d2d_geometry_add_figure_outline(struct d2d_geometry *geometry,
else
{
prev_type = figure->vertex_types[i - 1];
if (prev_type == D2D_VERTEX_TYPE_BEZIER)
if (d2d_vertex_type_is_bezier(prev_type))
prev = &figure->bezier_controls[bezier_idx - 1];
else
prev = &figure->vertices[i - 1];
}
if (type == D2D_VERTEX_TYPE_BEZIER)
if (d2d_vertex_type_is_bezier(type))
next = &figure->bezier_controls[bezier_idx++];
else if (i == figure->vertex_count - 1)
next = &figure->vertices[0];
@ -2372,7 +2377,7 @@ static BOOL d2d_geometry_add_figure_outline(struct d2d_geometry *geometry,
ERR("Failed to add line segment.\n");
return FALSE;
}
else if (type == D2D_VERTEX_TYPE_BEZIER)
else if (d2d_vertex_type_is_bezier(type))
{
const D2D1_POINT_2F *p2;
@ -2674,8 +2679,7 @@ static BOOL d2d_geometry_get_bezier_segment_idx(struct d2d_geometry *geometry, s
for (; idx->vertex_idx < figure->vertex_count; ++idx->vertex_idx)
{
if (figure->vertex_types[idx->vertex_idx] == D2D_VERTEX_TYPE_BEZIER
|| figure->vertex_types[idx->vertex_idx] == D2D_VERTEX_TYPE_SPLIT_BEZIER)
if (d2d_vertex_type_is_bezier(figure->vertex_types[idx->vertex_idx]))
return TRUE;
}
}
@ -3230,7 +3234,7 @@ static HRESULT STDMETHODCALLTYPE d2d_path_geometry_GetBounds(ID2D1PathGeometry *
type = figure->vertex_types[j];
}
if (type == D2D_VERTEX_TYPE_BEZIER)
if (d2d_vertex_type_is_bezier(type))
{
p1 = figure->original_bezier_controls[bezier_idx++];
d2d_point_transform(&p1, transform, p1.x, p1.y);
@ -3436,7 +3440,7 @@ static HRESULT STDMETHODCALLTYPE d2d_path_geometry_Simplify(ID2D1PathGeometry *i
type = figure->vertex_types[j];
}
if (type == D2D_VERTEX_TYPE_BEZIER)
if (d2d_vertex_type_is_bezier(type))
{
p1 = figure->original_bezier_controls[bezier_idx++];
if (transform)