[PATCH 06/12] d2d1: Update path geometry Simplify for cubic beziers.

Connor McAdams conmanx360 at gmail.com
Mon Feb 24 20:32:17 CST 2020


Update the Simplify method for path geometries to handle cubic bezier
curves.

Signed-off-by: Connor McAdams <conmanx360 at gmail.com>
---
 dlls/d2d1/geometry.c | 33 ++++++++++++++++++++-------------
 1 file changed, 20 insertions(+), 13 deletions(-)

diff --git a/dlls/d2d1/geometry.c b/dlls/d2d1/geometry.c
index 5e62ea8422..0e2ceb1875 100644
--- a/dlls/d2d1/geometry.c
+++ b/dlls/d2d1/geometry.c
@@ -3577,15 +3577,16 @@ static void d2d_geometry_flatten_cubic(ID2D1SimplifiedGeometrySink *sink, const
     ID2D1SimplifiedGeometrySink_SetSegmentFlags(sink, D2D1_PATH_SEGMENT_NONE);
 }
 
-static void d2d_geometry_simplify_quadratic(ID2D1SimplifiedGeometrySink *sink,
+static void d2d_geometry_simplify_bezier(ID2D1SimplifiedGeometrySink *sink,
         D2D1_GEOMETRY_SIMPLIFICATION_OPTION option, const D2D1_POINT_2F *p0,
-        const D2D1_POINT_2F *p1, const D2D1_POINT_2F *p2, float tolerance)
+        const D2D1_POINT_2F *p1, const D2D1_POINT_2F *p2,
+        const D2D1_POINT_2F *p3, float tolerance)
 {
     D2D1_BEZIER_SEGMENT b;
 
-    d2d_point_lerp(&b.point1, p0, p1, 2.0f / 3.0f);
-    d2d_point_lerp(&b.point2, p2, p1, 2.0f / 3.0f);
-    b.point3 = *p2;
+    b.point1 = *p1;
+    b.point2 = *p2;
+    b.point3 = *p3;
 
     if (option == D2D1_GEOMETRY_SIMPLIFICATION_OPTION_LINES)
         d2d_geometry_flatten_cubic(sink, p0, &b, tolerance);
@@ -3601,7 +3602,7 @@ static HRESULT STDMETHODCALLTYPE d2d_path_geometry_Simplify(ID2D1PathGeometry *i
     enum d2d_vertex_type type = D2D_VERTEX_TYPE_NONE;
     unsigned int i, j, bezier_idx;
     D2D1_FIGURE_BEGIN begin;
-    D2D1_POINT_2F p, p1, p2;
+    D2D1_POINT_2F p, p1, p2, p3;
     D2D1_FIGURE_END end;
 
     TRACE("iface %p, option %#x, transform %p, tolerance %.8e, sink %p.\n",
@@ -3642,14 +3643,17 @@ static HRESULT STDMETHODCALLTYPE d2d_path_geometry_Simplify(ID2D1PathGeometry *i
                     break;
 
                 case D2D_VERTEX_TYPE_BEZIER:
-                    p1 = figure->original_bezier_controls[bezier_idx++].cq0;
+                    p1 = figure->original_bezier_controls[bezier_idx].c0;
                     if (transform)
                         d2d_point_transform(&p1, transform, p1.x, p1.y);
-                    p2 = figure->vertices[j];
+                    p2 = figure->original_bezier_controls[bezier_idx++].c1;
                     if (transform)
                         d2d_point_transform(&p2, transform, p2.x, p2.y);
-                    d2d_geometry_simplify_quadratic(sink, option, &p, &p1, &p2, tolerance);
-                    p = p2;
+                    p3 = figure->vertices[j];
+                    if (transform)
+                        d2d_point_transform(&p3, transform, p3.x, p3.y);
+                    d2d_geometry_simplify_bezier(sink, option, &p, &p1, &p2, &p3, tolerance);
+                    p = p3;
                     break;
 
                 default:
@@ -3666,13 +3670,16 @@ static HRESULT STDMETHODCALLTYPE d2d_path_geometry_Simplify(ID2D1PathGeometry *i
 
         if (type == D2D_VERTEX_TYPE_BEZIER)
         {
-            p1 = figure->original_bezier_controls[bezier_idx++].cq0;
+            p1 = figure->original_bezier_controls[bezier_idx].c0;
             if (transform)
                 d2d_point_transform(&p1, transform, p1.x, p1.y);
-            p2 = figure->vertices[0];
+            p2 = figure->original_bezier_controls[bezier_idx++].c1;
             if (transform)
                 d2d_point_transform(&p2, transform, p2.x, p2.y);
-            d2d_geometry_simplify_quadratic(sink, option, &p, &p1, &p2, tolerance);
+            p3 = figure->vertices[0];
+            if (transform)
+                d2d_point_transform(&p3, transform, p3.x, p3.y);
+            d2d_geometry_simplify_bezier(sink, option, &p, &p1, &p2, &p3, tolerance);
         }
 
         end = figure->flags & D2D_FIGURE_FLAG_CLOSED ? D2D1_FIGURE_END_CLOSED : D2D1_FIGURE_END_OPEN;
-- 
2.20.1




More information about the wine-devel mailing list