[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