Add a splitting limit for cubic bezier overlap splitting, otherwise certain cubic beziers will indefinitely continue splitting.
Signed-off-by: Connor McAdams conmanx360@gmail.com --- dlls/d2d1/geometry.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/dlls/d2d1/geometry.c b/dlls/d2d1/geometry.c index 3f57cc1852..7296aee8bf 100644 --- a/dlls/d2d1/geometry.c +++ b/dlls/d2d1/geometry.c @@ -3369,7 +3369,7 @@ static HRESULT d2d_geometry_resolve_beziers(struct d2d_geometry *geometry) struct d2d_curve_vertex *b; const D2D1_POINT_2F *p[3]; struct d2d_figure *figure; - size_t bezier_idx, i; + size_t bezier_idx, i, split_count; D2D1_POINT_2F tmp;
if (!d2d_geometry_get_first_bezier_segment_idx(geometry, &idx_p)) @@ -3383,7 +3383,8 @@ static HRESULT d2d_geometry_resolve_beziers(struct d2d_geometry *geometry) d2d_geometry_get_first_bezier_segment_idx(geometry, &idx_q); while (idx_q.figure_idx < idx_p.figure_idx || idx_q.vertex_idx < idx_p.vertex_idx) { - while (d2d_geometry_check_bezier_overlap(geometry, &idx_p, &idx_q)) + split_count = 0; + while (d2d_geometry_check_bezier_overlap(geometry, &idx_p, &idx_q) && split_count < 2) { if (fabsf(d2d_geometry_bezier_ccw(geometry, &idx_q)) > fabsf(d2d_geometry_bezier_ccw(geometry, &idx_p))) { @@ -3397,11 +3398,15 @@ static HRESULT d2d_geometry_resolve_beziers(struct d2d_geometry *geometry) ++idx_p.vertex_idx; ++idx_p.control_idx; } + if (d2d_vertex_type_is_cubic_bezier(figure->vertex_types[idx_q.vertex_idx])) + split_count++; } else { if (!d2d_geometry_split_bezier(geometry, &idx_p)) return E_OUTOFMEMORY; + if (d2d_vertex_type_is_cubic_bezier(figure->vertex_types[idx_p.vertex_idx])) + split_count++; } } d2d_geometry_get_next_bezier_segment_idx(geometry, &idx_q);