From c925ad2a0e5cd93bcd24200dbb8accd8b6daed1f Mon Sep 17 00:00:00 2001 From: "Johan B. C. Engelen" Date: Tue, 2 Oct 2012 22:45:27 +0200 Subject: fix for bug 310206: although the path is made with only cubic beziers (bezier_fit_cubic...), the closing path segment is still a linearbezier so original code will bug for closed paths. made the code more general by standard 2geom code to determine the curvature of the end of a curve without knowing its type. Fixed bugs: - https://launchpad.net/bugs/310206 (bzr r11723) --- src/pencil-context.cpp | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/pencil-context.cpp b/src/pencil-context.cpp index d5b61e1f0..19a040b24 100644 --- a/src/pencil-context.cpp +++ b/src/pencil-context.cpp @@ -789,11 +789,13 @@ interpolate(SPPencilContext *pc) /* Set up direction of next curve. */ { - Geom::CubicBezier const * last_seg = dynamic_cast(pc->green_curve->last_segment()); - g_assert( last_seg ); // Relevance: validity of (*last_seg)[2] + Geom::Curve const * last_seg = pc->green_curve->last_segment(); + g_assert( last_seg ); // Relevance: validity of (*last_seg) pc->p[0] = last_seg->finalPoint(); pc->npoints = 1; - Geom::Point const req_vec( pc->p[0] - (*last_seg)[2] ); + Geom::Curve *last_seg_reverse = last_seg->reverse(); + Geom::Point const req_vec( -last_seg_reverse->unitTangentAt(0) ); + delete last_seg_reverse; pc->req_tangent = ( ( Geom::is_zero(req_vec) || !in_svg_plane(req_vec) ) ? Geom::Point(0, 0) : Geom::unit_vector(req_vec) ); @@ -881,11 +883,13 @@ sketch_interpolate(SPPencilContext *pc) /* Set up direction of next curve. */ { - Geom::CubicBezier const * last_seg = dynamic_cast(pc->green_curve->last_segment()); - g_assert( last_seg ); // Relevance: validity of (*last_seg)[2] + Geom::Curve const * last_seg = pc->green_curve->last_segment(); + g_assert( last_seg ); // Relevance: validity of (*last_seg) pc->p[0] = last_seg->finalPoint(); pc->npoints = 1; - Geom::Point const req_vec( pc->p[0] - (*last_seg)[2] ); + Geom::Curve *last_seg_reverse = last_seg->reverse(); + Geom::Point const req_vec( -last_seg_reverse->unitTangentAt(0) ); + delete last_seg_reverse; pc->req_tangent = ( ( Geom::is_zero(req_vec) || !in_svg_plane(req_vec) ) ? Geom::Point(0, 0) : Geom::unit_vector(req_vec) ); @@ -926,16 +930,19 @@ fit_and_split(SPPencilContext *pc) /* Set up direction of next curve. */ { - Geom::CubicBezier const * last_seg = dynamic_cast(pc->red_curve->last_segment()); - g_assert( last_seg ); // Relevance: validity of (*last_seg)[2] + Geom::Curve const * last_seg = pc->red_curve->last_segment(); + g_assert( last_seg ); // Relevance: validity of (*last_seg) pc->p[0] = last_seg->finalPoint(); pc->npoints = 1; - Geom::Point const req_vec( pc->p[0] - (*last_seg)[2] ); + Geom::Curve *last_seg_reverse = last_seg->reverse(); + Geom::Point const req_vec( -last_seg_reverse->unitTangentAt(0) ); + delete last_seg_reverse; pc->req_tangent = ( ( Geom::is_zero(req_vec) || !in_svg_plane(req_vec) ) ? Geom::Point(0, 0) : Geom::unit_vector(req_vec) ); } + pc->green_curve->append_continuous(pc->red_curve, 0.0625); SPCurve *curve = pc->red_curve->copy(); -- cgit v1.2.3