[RFC PATCH 6/8] d2d1: Add cubic bezier overlap splitting limit.
Connor McAdams
conmanx360 at gmail.com
Mon May 4 14:44:52 CDT 2020
Add a splitting limit for cubic bezier overlap splitting, otherwise
certain cubic beziers will indefinitely continue splitting.
Signed-off-by: Connor McAdams <conmanx360 at 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);
--
2.20.1
More information about the wine-devel
mailing list