summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJohan B. C. Engelen <jbc.engelen@swissonline.ch>2012-10-02 20:45:27 +0000
committerJohan B. C. Engelen <j.b.c.engelen@alumnus.utwente.nl>2012-10-02 20:45:27 +0000
commitc925ad2a0e5cd93bcd24200dbb8accd8b6daed1f (patch)
tree11bf03d7342c1b5f8ebd9feca66bf5bb47e27f31 /src
parentfix layout of object properties dialog (Bug #1050938 ; input fields in object... (diff)
downloadinkscape-c925ad2a0e5cd93bcd24200dbb8accd8b6daed1f.tar.gz
inkscape-c925ad2a0e5cd93bcd24200dbb8accd8b6daed1f.zip
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)
Diffstat (limited to 'src')
-rw-r--r--src/pencil-context.cpp25
1 files changed, 16 insertions, 9 deletions
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<Geom::CubicBezier const *>(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<Geom::CubicBezier const *>(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<Geom::CubicBezier const *>(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();