[PATCH 05/12] d2d1: Update apply_intersections for cubic beziers.
Connor McAdams
conmanx360 at gmail.com
Mon Feb 24 20:32:16 CST 2020
Update d2d_geometry_apply_intersections to now handle cubic beziers.
Signed-off-by: Connor McAdams <conmanx360 at gmail.com>
---
dlls/d2d1/geometry.c | 26 ++++++++++++++------------
1 file changed, 14 insertions(+), 12 deletions(-)
diff --git a/dlls/d2d1/geometry.c b/dlls/d2d1/geometry.c
index 05b1d10ed8..5e62ea8422 100644
--- a/dlls/d2d1/geometry.c
+++ b/dlls/d2d1/geometry.c
@@ -2112,9 +2112,10 @@ static BOOL d2d_geometry_apply_intersections(struct d2d_geometry *geometry,
size_t vertex_offset, control_offset, next, i;
struct d2d_geometry_intersection *inter;
enum d2d_vertex_type vertex_type;
- const D2D1_POINT_2F *p[3];
+ const D2D1_POINT_2F *p[4];
+ D2D1_POINT_2F cq0;
struct d2d_figure *figure;
- D2D1_POINT_2F q[2], c[2];
+ D2D1_BEZIER_SEGMENT b[2];
float t, t_prev;
for (i = 0; i < intersections->intersection_count; ++i)
@@ -2148,22 +2149,23 @@ static BOOL d2d_geometry_apply_intersections(struct d2d_geometry *geometry,
}
p[0] = &figure->vertices[inter->vertex_idx + vertex_offset];
- p[1] = &figure->bezier_controls[inter->control_idx + control_offset].cq0;
+ p[1] = &figure->bezier_controls[inter->control_idx + control_offset].c0;
+ p[2] = &figure->bezier_controls[inter->control_idx + control_offset].c1;
next = inter->vertex_idx + vertex_offset + 1;
if (next == figure->vertex_count)
next = 0;
- p[2] = &figure->vertices[next];
+ p[3] = &figure->vertices[next];
- d2d_point_lerp(&q[0], p[0], p[1], t);
- d2d_point_lerp(&q[1], p[1], p[2], t);
+ d2d_cubic_bezier_split(p[0], p[1], p[2], p[3], t, &b[0], &b[1], NULL);
- d2d_bezier_quad_to_cubic(p[0], &q[0], &inter->p, &c[0], &c[1]);
- figure->bezier_controls[inter->control_idx + control_offset].cq0 = q[0];
- figure->bezier_controls[inter->control_idx + control_offset].c0 = c[0];
- figure->bezier_controls[inter->control_idx + control_offset].c1 = c[1];
+ d2d_bezier_cubic_to_quad(p[0], &b[0].point1, &b[0].point2, &inter->p, &cq0);
+ figure->bezier_controls[inter->control_idx + control_offset].c0 = b[0].point1;
+ figure->bezier_controls[inter->control_idx + control_offset].c1 = b[0].point2;
+ figure->bezier_controls[inter->control_idx + control_offset].cq0 = cq0;
- d2d_bezier_quad_to_cubic(&inter->p, &q[1], p[2], &c[0], &c[1]);
- if (!(d2d_figure_insert_bezier_control(figure, inter->control_idx + control_offset + 1, &c[0], &c[1], &q[1])))
+ d2d_bezier_cubic_to_quad(&inter->p, &b[1].point1, &b[1].point2, p[3], &cq0);
+ if (!(d2d_figure_insert_bezier_control(figure, inter->control_idx + control_offset + 1, &b[1].point1,
+ &b[1].point2, &cq0)))
return FALSE;
++control_offset;
--
2.20.1
More information about the wine-devel
mailing list