From f6a16c04e64fae51640df0f920f3d35396527591 Mon Sep 17 00:00:00 2001 From: johanengelen Date: Sun, 19 Aug 2007 13:18:04 +0000 Subject: [PATCH] * Fixed path-along-path with correct filling now! (2geom fix) * sp_shape_update_effect is now called much less than before. --- src/2geom/sbasis-to-bezier.cpp | 30 +++++++++++++++++++++++++++++- src/sp-shape.cpp | 12 +++++------- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/2geom/sbasis-to-bezier.cpp b/src/2geom/sbasis-to-bezier.cpp index e823b29ca..613c39288 100644 --- a/src/2geom/sbasis-to-bezier.cpp +++ b/src/2geom/sbasis-to-bezier.cpp @@ -184,7 +184,7 @@ path_from_sbasis(D2 const &B, double tol) { //TODO: some of this logic should be lifted into svg-path std::vector path_from_piecewise(Geom::Piecewise > const &B, double tol) { - +/* Geom::PathBuilder pb; if(B.size() == 0) return pb.peek(); Geom::Point start = B[0].at0(); @@ -205,11 +205,39 @@ path_from_piecewise(Geom::Piecewise > const &B, double to if(i+1 >= B.size()) break; start = B[i+1].at0(); pb.moveTo(start); + i++; } build_from_sbasis(pb, B[i], tol); } pb.finish(); return pb.peek(); +*/ + Geom::PathBuilder pb; + if(B.size() == 0) return pb.peek(); + Geom::Point start = B[0].at0(); + pb.moveTo(start); + for(unsigned i = 0; ; i++) { + if(i+1 == B.size() || !near(B[i+1].at0(), B[i].at1(), tol)) { + //start of a new path + if(near(start, B[i].at1())) { + //it's closed + pb.closePath(); + if(sbasis_size(B[i]) <= 1) { + //last line seg already there + goto no_add; + } + } + build_from_sbasis(pb, B[i], tol); + no_add: + if(i+1 >= B.size()) break; + start = B[i+1].at0(); + pb.moveTo(start); + } else { + build_from_sbasis(pb, B[i], tol); + } + } + pb.finish(); + return pb.peek(); } }; diff --git a/src/sp-shape.cpp b/src/sp-shape.cpp index 9d08fc58d..76fd37af1 100644 --- a/src/sp-shape.cpp +++ b/src/sp-shape.cpp @@ -234,7 +234,6 @@ static void sp_shape_set(SPObject *object, unsigned int key, gchar const *value) { SPShape *shape = (SPShape *) object; - bool path_effect_changed = false; switch (key) { case SP_ATTR_INKSCAPE_PATH_EFFECT: @@ -256,10 +255,10 @@ sp_shape_set(SPObject *object, unsigned int key, gchar const *value) shape->path_effect_ref->detach(); } } else { + // Detach, which emits the changed signal. shape->path_effect_ref->detach(); } } - path_effect_changed = true; // updated twice now when connected to changed signal?? break; default: if (((SPObjectClass *) parent_class)->set) { @@ -267,9 +266,6 @@ sp_shape_set(SPObject *object, unsigned int key, gchar const *value) } break; } - - if (path_effect_changed) - sp_shape_update_patheffect ((SPShape *) object, false); } static Inkscape::XML::Node * @@ -1138,6 +1134,9 @@ sp_shape_get_livepatheffectobject(SPShape *shape) { void sp_shape_update_patheffect (SPShape *shape, bool write) { +#ifdef SHAPE_VERBOSE + g_message("sp_shape_update_patheffect"); +#endif g_return_if_fail (shape != NULL); g_return_if_fail (SP_IS_SHAPE (shape)); @@ -1168,9 +1167,8 @@ lpeobject_ref_changed(SPObject *old_ref, SPObject *ref, SPShape *shape) if ( IS_LIVEPATHEFFECT(ref) && ref != shape ) { ref->connectModified(sigc::bind(sigc::ptr_fun(&lpeobject_ref_modified), shape)); + lpeobject_ref_modified(ref, 0, shape); } - - lpeobject_ref_modified(ref, 0, shape); } /** -- 2.30.2