Code

rename LPESkeletalStrokes -> LPEPatternAlongPath
authorjohanengelen <johanengelen@users.sourceforge.net>
Tue, 8 Apr 2008 18:02:31 +0000 (18:02 +0000)
committerjohanengelen <johanengelen@users.sourceforge.net>
Tue, 8 Apr 2008 18:02:31 +0000 (18:02 +0000)
src/live_effects/CMakeLists.txt
src/live_effects/Makefile_insert
src/live_effects/effect.cpp
src/live_effects/effect.h
src/live_effects/lpe-patternalongpath.cpp [new file with mode: 0644]
src/live_effects/lpe-patternalongpath.h [new file with mode: 0644]
src/live_effects/lpe-skeletalstrokes.cpp [deleted file]
src/live_effects/lpe-skeletalstrokes.h [deleted file]

index d437e40f9779ace709d39d131990ad75c70b8de3..f88e965311d0ece284e1b5baf4d2d31c90f78981 100644 (file)
@@ -15,8 +15,8 @@ lpeobject-reference.cpp
 lpeobject-reference.h
 lpe-bendpath.cpp
 lpe-bendpath.h
-lpe-skeletalstrokes.cpp
-lpe-skeletalstrokes.h
+lpe-patternalongpath.cpp
+lpe-patternalongpath.h
 lpe-skeleton.cpp
 lpe-skeleton.h
 lpe-sketch.cpp
index 7d2121c1267bda9e40073d0bfa1492adda66d2b5..798ad5496ff102df7932f4e815c9d20facbe2e9b 100644 (file)
@@ -16,8 +16,8 @@ live_effects_liblive_effects_a_SOURCES = \
        live_effects/lpeobject-reference.h      \
        live_effects/n-art-bpath-2geom.cpp      \
        live_effects/n-art-bpath-2geom.h        \
-       live_effects/lpe-skeletalstrokes.cpp    \
-       live_effects/lpe-skeletalstrokes.h      \
+       live_effects/lpe-patternalongpath.cpp   \
+       live_effects/lpe-patternalongpath.h     \
        live_effects/lpe-bendpath.cpp   \
        live_effects/lpe-bendpath.h     \
        live_effects/lpe-sketch.cpp     \
index 4b3ee5b0fbec7aa308d7b7e70c0bbf5afc4a96a2..51a59f1a1d4cc02ea28ed8edfc3ae177ae06b7f1 100644 (file)
@@ -32,7 +32,7 @@
 
 
 // include effects:
-#include "live_effects/lpe-skeletalstrokes.h"
+#include "live_effects/lpe-patternalongpath.h"
 #include "live_effects/lpe-bendpath.h"
 #include "live_effects/lpe-sketch.h"
 #include "live_effects/lpe-vonkoch.h"
@@ -53,7 +53,7 @@ namespace LivePathEffect {
 const Util::EnumData<EffectType> LPETypeData[INVALID_LPE] = {
     // {constant defined in effect.h, N_("name of your effect"), "name of your effect in SVG"}
     {BEND_PATH,             N_("Bend"),                  "bend_path"},
-    {SKELETAL_STROKES,      N_("Pattern Along Path"),    "skeletal"},
+    {PATTERN_ALONG_PATH,    N_("Pattern Along Path"),    "skeletal"},   // for historic reasons, this effect is called skeletal(strokes) in Inkscape:SVG
     {SKETCH,                N_("Sketch"),                "sketch"},
     {VONKOCH,               N_("VonKoch"),               "vonkoch"},
     {KNOT,                  N_("Knot"),                  "knot"},
@@ -73,8 +73,8 @@ Effect::New(EffectType lpenr, LivePathEffectObject *lpeobj)
 {
     Effect* neweffect = NULL;
     switch (lpenr) {
-        case SKELETAL_STROKES:
-            neweffect = (Effect*) new LPESkeletalStrokes(lpeobj);
+        case PATTERN_ALONG_PATH:
+            neweffect = (Effect*) new LPEPatternAlongPath(lpeobj);
             break;
         case BEND_PATH:
             neweffect = (Effect*) new LPEBendPath(lpeobj);
index 2f8014cc6ba5056836ff9a0c08ac01ae63c0fd72..be3cefecf035816ae22525673aea68720e4ba492 100644 (file)
@@ -52,7 +52,7 @@ namespace LivePathEffect {
 
 enum EffectType {
     BEND_PATH = 0,
-    SKELETAL_STROKES,
+    PATTERN_ALONG_PATH,
     SKETCH,
     VONKOCH,
     KNOT,
diff --git a/src/live_effects/lpe-patternalongpath.cpp b/src/live_effects/lpe-patternalongpath.cpp
new file mode 100644 (file)
index 0000000..9b28192
--- /dev/null
@@ -0,0 +1,244 @@
+#define INKSCAPE_LPE_PATTERN_ALONG_PATH_CPP
+
+/*
+ * Copyright (C) Johan Engelen 2007 <j.b.c.engelen@utwente.nl>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "live_effects/lpe-patternalongpath.h"
+#include "sp-shape.h"
+#include "display/curve.h"
+#include <libnr/n-art-bpath.h>
+#include "live_effects/n-art-bpath-2geom.h"
+#include "svg/svg.h"
+#include "ui/widget/scalar.h"
+
+#include <2geom/sbasis.h>
+#include <2geom/sbasis-geometric.h>
+#include <2geom/bezier-to-sbasis.h>
+#include <2geom/sbasis-to-bezier.h>
+#include <2geom/d2.h>
+#include <2geom/piecewise.h>
+
+#include <algorithm>
+using std::vector;
+
+
+/* Theory in e-mail from J.F. Barraud
+Let B be the skeleton path, and P the pattern (the path to be deformed).
+
+P is a map t --> P(t) = ( x(t), y(t) ).
+B is a map t --> B(t) = ( a(t), b(t) ).
+
+The first step is to re-parametrize B by its arc length: this is the parametrization in which a point p on B is located by its distance s from start. One obtains a new map s --> U(s) = (a'(s),b'(s)), that still describes the same path B, but where the distance along B from start to
+U(s) is s itself.
+
+We also need a unit normal to the path. This can be obtained by computing a unit tangent vector, and rotate it by 90°. Call this normal vector N(s).
+
+The basic deformation associated to B is then given by:
+
+   (x,y) --> U(x)+y*N(x)
+
+(i.e. we go for distance x along the path, and then for distance y along the normal)
+
+Of course this formula needs some minor adaptations (as is it depends on the absolute position of P for instance, so a little translation is needed
+first) but I think we can first forget about them.
+*/
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+static const Util::EnumData<PAPCopyType> PAPCopyTypeData[PAPCT_END] = {
+    {PAPCT_SINGLE,               N_("Single"),               "single"},
+    {PAPCT_SINGLE_STRETCHED,     N_("Single, stretched"),    "single_stretched"},
+    {PAPCT_REPEATED,             N_("Repeated"),             "repeated"},
+    {PAPCT_REPEATED_STRETCHED,   N_("Repeated, stretched"),  "repeated_stretched"}
+};
+static const Util::EnumDataConverter<PAPCopyType> PAPCopyTypeConverter(PAPCopyTypeData, PAPCT_END);
+
+LPEPatternAlongPath::LPEPatternAlongPath(LivePathEffectObject *lpeobject) :
+    Effect(lpeobject),
+    pattern(_("Pattern source"), _("Path to put along the skeleton path"), "pattern", &wr, this, "M0,0 L1,0"),
+    copytype(_("Pattern copies"), _("How many pattern copies to place along the skeleton path"), "copytype", PAPCopyTypeConverter, &wr, this, PAPCT_SINGLE_STRETCHED),
+    prop_scale(_("Width"), _("Width of the pattern"), "prop_scale", &wr, this, 1),
+    scale_y_rel(_("Width in units of length"), _("Scale the width of the pattern in units of its length"), "scale_y_rel", &wr, this, false),
+    spacing(_("Spacing"), _("Space between copies of the pattern. Negative values allowed, but are limited to -90% of pattern width."), "spacing", &wr, this, 0),
+    normal_offset(_("Normal offset"), "", "normal_offset", &wr, this, 0),
+    tang_offset(_("Tangential offset"), "", "tang_offset", &wr, this, 0),
+    prop_units(_("Offsets in unit of pattern size"), "Spacing, tangential and normal offset are expressed as a ratio of width/height", "prop_units", &wr, this, false),
+    vertical_pattern(_("Pattern is vertical"), "Rotate pattern 90 deg before applying", "vertical_pattern", &wr, this, false)
+{
+    registerParameter( dynamic_cast<Parameter *>(&pattern) );
+    registerParameter( dynamic_cast<Parameter *>(&copytype) );
+    registerParameter( dynamic_cast<Parameter *>(&prop_scale) );
+    registerParameter( dynamic_cast<Parameter *>(&scale_y_rel) );
+    registerParameter( dynamic_cast<Parameter *>(&spacing) );
+    registerParameter( dynamic_cast<Parameter *>(&normal_offset) );
+    registerParameter( dynamic_cast<Parameter *>(&tang_offset) );
+    registerParameter( dynamic_cast<Parameter *>(&prop_units) );
+    registerParameter( dynamic_cast<Parameter *>(&vertical_pattern) );
+
+    prop_scale.param_set_digits(3);
+    prop_scale.param_set_increments(0.01, 0.10);
+}
+
+LPEPatternAlongPath::~LPEPatternAlongPath()
+{
+
+}
+
+
+//TODO: does this already exist in 2Geom? if not, move this there...
+static
+std::vector<Geom::Piecewise<Geom::D2<Geom::SBasis> > > 
+split_at_discontinuities (Geom::Piecewise<Geom::D2<Geom::SBasis> > & pwsbin, double tol = .0001)
+{
+    using namespace Geom;
+    std::vector<Piecewise<D2<SBasis> > > ret;
+    unsigned piece_start = 0;
+    for (unsigned i=0; i<pwsbin.segs.size(); i++){
+        if (i==(pwsbin.segs.size()-1) || L2(pwsbin.segs[i].at1()- pwsbin.segs[i+1].at0()) > tol){
+            Piecewise<D2<SBasis> > piece;
+            piece.cuts.push_back(pwsbin.cuts[piece_start]);
+            for (unsigned j = piece_start; j<i+1; j++){
+                piece.segs.push_back(pwsbin.segs[j]);
+                piece.cuts.push_back(pwsbin.cuts[j+1]);                
+            }
+            ret.push_back(piece);
+            piece_start = i+1;
+        }
+    }
+    return ret;
+}
+
+
+Geom::Piecewise<Geom::D2<Geom::SBasis> >
+LPEPatternAlongPath::doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > & pwd2_in)
+{
+    using namespace Geom;
+
+/* Much credit should go to jfb and mgsloan of lib2geom development for the code below! */
+    Piecewise<D2<SBasis> > output;
+
+    PAPCopyType type = copytype.get_value();
+
+    D2<Piecewise<SBasis> > patternd2 = make_cuts_independant(pattern.get_pwd2());
+    Piecewise<SBasis> x0 = vertical_pattern.get_value() ? Piecewise<SBasis>(patternd2[1]) : Piecewise<SBasis>(patternd2[0]);
+    Piecewise<SBasis> y0 = vertical_pattern.get_value() ? Piecewise<SBasis>(patternd2[0]) : Piecewise<SBasis>(patternd2[1]);
+    Interval pattBndsX = bounds_exact(x0);
+    x0 -= pattBndsX.min();
+    Interval pattBndsY = bounds_exact(y0);
+    y0 -= pattBndsY.middle();
+
+    double xspace  = spacing;
+    double noffset = normal_offset;
+    double toffset = tang_offset;
+    if (prop_units.get_value()){
+        xspace  *= pattBndsX.extent();
+        noffset *= pattBndsY.extent();
+        toffset *= pattBndsX.extent();
+    }
+
+    //Prevent more than 90% overlap...
+    if (xspace < -pattBndsX.extent()*.9) {
+        xspace = -pattBndsX.extent()*.9;
+    }
+    //TODO: dynamical update of parameter ranges?
+    //if (prop_units.get_value()){
+    //        spacing.param_set_range(-.9, NR_HUGE);
+    //    }else{
+    //        spacing.param_set_range(-pattBndsX.extent()*.9, NR_HUGE);
+    //    }
+
+    y0+=noffset;
+
+    std::vector<Geom::Piecewise<Geom::D2<Geom::SBasis> > > paths_in;
+    paths_in = split_at_discontinuities(pwd2_in);
+
+    for (unsigned idx = 0; idx < paths_in.size(); idx++){
+        Geom::Piecewise<Geom::D2<Geom::SBasis> > path_i = paths_in[idx];
+        Piecewise<SBasis> x = x0;
+        Piecewise<SBasis> y = y0;
+        Piecewise<D2<SBasis> > uskeleton = arc_length_parametrization(path_i,2,.1);
+        uskeleton = remove_short_cuts(uskeleton,.01);
+        Piecewise<D2<SBasis> > n = rot90(derivative(uskeleton));
+        n = force_continuity(remove_short_cuts(n,.1));
+        
+        int nbCopies = 0;
+        double scaling = 1;
+        switch(type) {
+            case PAPCT_REPEATED:
+                nbCopies = floor((uskeleton.domain().extent() - toffset + xspace)/(pattBndsX.extent()+xspace));
+                pattBndsX = Interval(pattBndsX.min(),pattBndsX.max()+xspace);
+                break;
+                
+            case PAPCT_SINGLE:
+                nbCopies = (toffset + pattBndsX.extent() < uskeleton.domain().extent()) ? 1 : 0;
+                break;
+                
+            case PAPCT_SINGLE_STRETCHED:
+                nbCopies = 1;
+                scaling = (uskeleton.domain().extent() - toffset)/pattBndsX.extent();
+                break;
+                
+            case PAPCT_REPEATED_STRETCHED:
+                // if uskeleton is closed:
+                if(path_i.segs.front().at0() == path_i.segs.back().at1()){
+                    nbCopies = std::floor((uskeleton.domain().extent() - toffset)/(pattBndsX.extent()+xspace));
+                    pattBndsX = Interval(pattBndsX.min(),pattBndsX.max()+xspace);
+                    scaling = (uskeleton.domain().extent() - toffset)/(((double)nbCopies)*pattBndsX.extent());
+                    // if not closed: no space at the end
+                }else{
+                    nbCopies = std::floor((uskeleton.domain().extent() - toffset + xspace)/(pattBndsX.extent()+xspace));
+                    pattBndsX = Interval(pattBndsX.min(),pattBndsX.max()+xspace);
+                    scaling = (uskeleton.domain().extent() - toffset)/(((double)nbCopies)*pattBndsX.extent() - xspace);
+                }
+                break;
+                
+            default:
+                return pwd2_in;
+        };
+        
+        double pattWidth = pattBndsX.extent() * scaling;
+        
+        if (scaling != 1.0) {
+            x*=scaling;
+        }
+        if ( scale_y_rel.get_value() ) {
+            y*=(scaling*prop_scale);
+        } else {
+            if (prop_scale != 1.0) y *= prop_scale;
+        }
+        x += toffset;
+        
+        double offs = 0;
+        for (int i=0; i<nbCopies; i++){
+            output.concat(compose(uskeleton,x+offs)+y*compose(n,x+offs));
+            offs+=pattWidth;
+        }
+    }
+    return output;
+}
+
+void
+LPEPatternAlongPath::transform_multiply(Geom::Matrix const& postmul, bool set)
+{
+    // TODO: implement correct transformation instead of this default behavior
+    Effect::transform_multiply(postmul, set);
+}
+
+
+} // namespace LivePathEffect
+} /* namespace Inkscape */
+
+/*
+  Local Variables:
+  mode:c++
+  c-file-style:"stroustrup"
+  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+  indent-tabs-mode:nil
+  fill-column:99
+  End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/live_effects/lpe-patternalongpath.h b/src/live_effects/lpe-patternalongpath.h
new file mode 100644 (file)
index 0000000..2909ab0
--- /dev/null
@@ -0,0 +1,57 @@
+#ifndef INKSCAPE_LPE_PATTERN_ALONG_PATH_H
+#define INKSCAPE_LPE_PATTERN_ALONG_PATH_H
+
+/*
+ * Inkscape::LPEPatternAlongPath
+ *
+* Copyright (C) Johan Engelen 2007 <j.b.c.engelen@utwente.nl>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "live_effects/effect.h"
+#include "live_effects/parameter/path.h"
+#include "live_effects/parameter/enum.h"
+#include "live_effects/parameter/bool.h"
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+enum PAPCopyType {
+    PAPCT_SINGLE = 0,
+    PAPCT_SINGLE_STRETCHED,
+    PAPCT_REPEATED,
+    PAPCT_REPEATED_STRETCHED,
+    PAPCT_END // This must be last
+};
+
+class LPEPatternAlongPath : public Effect {
+public:
+    LPEPatternAlongPath(LivePathEffectObject *lpeobject);
+    virtual ~LPEPatternAlongPath();
+
+    virtual Geom::Piecewise<Geom::D2<Geom::SBasis> > doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > & pwd2_in);
+
+    virtual void transform_multiply(Geom::Matrix const& postmul, bool set);
+
+private:
+    PathParam  pattern;
+    EnumParam<PAPCopyType> copytype;
+    ScalarParam  prop_scale;
+    BoolParam scale_y_rel;
+    ScalarParam  spacing;
+    ScalarParam  normal_offset;
+    ScalarParam  tang_offset;
+    BoolParam    prop_units;
+    BoolParam    vertical_pattern;
+
+    void on_pattern_pasted();
+
+    LPEPatternAlongPath(const LPEPatternAlongPath&);
+    LPEPatternAlongPath& operator=(const LPEPatternAlongPath&);
+};
+
+}; //namespace LivePathEffect
+}; //namespace Inkscape
+
+#endif
diff --git a/src/live_effects/lpe-skeletalstrokes.cpp b/src/live_effects/lpe-skeletalstrokes.cpp
deleted file mode 100644 (file)
index 677aa15..0000000
+++ /dev/null
@@ -1,244 +0,0 @@
-#define INKSCAPE_LPE_SKELETAL_STROKES_CPP
-
-/*
- * Copyright (C) Johan Engelen 2007 <j.b.c.engelen@utwente.nl>
- *
- * Released under GNU GPL, read the file 'COPYING' for more information
- */
-
-#include "live_effects/lpe-skeletalstrokes.h"
-#include "sp-shape.h"
-#include "display/curve.h"
-#include <libnr/n-art-bpath.h>
-#include "live_effects/n-art-bpath-2geom.h"
-#include "svg/svg.h"
-#include "ui/widget/scalar.h"
-
-#include <2geom/sbasis.h>
-#include <2geom/sbasis-geometric.h>
-#include <2geom/bezier-to-sbasis.h>
-#include <2geom/sbasis-to-bezier.h>
-#include <2geom/d2.h>
-#include <2geom/piecewise.h>
-
-#include <algorithm>
-using std::vector;
-
-
-/* Theory in e-mail from J.F. Barraud
-Let B be the skeleton path, and P the pattern (the path to be deformed).
-
-P is a map t --> P(t) = ( x(t), y(t) ).
-B is a map t --> B(t) = ( a(t), b(t) ).
-
-The first step is to re-parametrize B by its arc length: this is the parametrization in which a point p on B is located by its distance s from start. One obtains a new map s --> U(s) = (a'(s),b'(s)), that still describes the same path B, but where the distance along B from start to
-U(s) is s itself.
-
-We also need a unit normal to the path. This can be obtained by computing a unit tangent vector, and rotate it by 90°. Call this normal vector N(s).
-
-The basic deformation associated to B is then given by:
-
-   (x,y) --> U(x)+y*N(x)
-
-(i.e. we go for distance x along the path, and then for distance y along the normal)
-
-Of course this formula needs some minor adaptations (as is it depends on the absolute position of P for instance, so a little translation is needed
-first) but I think we can first forget about them.
-*/
-
-namespace Inkscape {
-namespace LivePathEffect {
-
-static const Util::EnumData<SkelCopyType> SkelCopyTypeData[SSCT_END] = {
-    {SSCT_SINGLE,               N_("Single"),               "single"},
-    {SSCT_SINGLE_STRETCHED,     N_("Single, stretched"),    "single_stretched"},
-    {SSCT_REPEATED,             N_("Repeated"),             "repeated"},
-    {SSCT_REPEATED_STRETCHED,   N_("Repeated, stretched"),  "repeated_stretched"}
-};
-static const Util::EnumDataConverter<SkelCopyType> SkelCopyTypeConverter(SkelCopyTypeData, SSCT_END);
-
-LPESkeletalStrokes::LPESkeletalStrokes(LivePathEffectObject *lpeobject) :
-    Effect(lpeobject),
-    pattern(_("Pattern source"), _("Path to put along the skeleton path"), "pattern", &wr, this, "M0,0 L1,0"),
-    copytype(_("Pattern copies"), _("How many pattern copies to place along the skeleton path"), "copytype", SkelCopyTypeConverter, &wr, this, SSCT_SINGLE_STRETCHED),
-    prop_scale(_("Width"), _("Width of the pattern"), "prop_scale", &wr, this, 1),
-    scale_y_rel(_("Width in units of length"), _("Scale the width of the pattern in units of its length"), "scale_y_rel", &wr, this, false),
-    spacing(_("Spacing"), _("Space between copies of the pattern. Negative values allowed, but are limited to -90% of pattern width."), "spacing", &wr, this, 0),
-    normal_offset(_("Normal offset"), "", "normal_offset", &wr, this, 0),
-    tang_offset(_("Tangential offset"), "", "tang_offset", &wr, this, 0),
-    prop_units(_("Offsets in unit of pattern size"), "Spacing, tangential and normal offset are expressed as a ratio of width/height", "prop_units", &wr, this, false),
-    vertical_pattern(_("Pattern is vertical"), "Rotate pattern 90 deg before applying", "vertical_pattern", &wr, this, false)
-{
-    registerParameter( dynamic_cast<Parameter *>(&pattern) );
-    registerParameter( dynamic_cast<Parameter *>(&copytype) );
-    registerParameter( dynamic_cast<Parameter *>(&prop_scale) );
-    registerParameter( dynamic_cast<Parameter *>(&scale_y_rel) );
-    registerParameter( dynamic_cast<Parameter *>(&spacing) );
-    registerParameter( dynamic_cast<Parameter *>(&normal_offset) );
-    registerParameter( dynamic_cast<Parameter *>(&tang_offset) );
-    registerParameter( dynamic_cast<Parameter *>(&prop_units) );
-    registerParameter( dynamic_cast<Parameter *>(&vertical_pattern) );
-
-    prop_scale.param_set_digits(3);
-    prop_scale.param_set_increments(0.01, 0.10);
-}
-
-LPESkeletalStrokes::~LPESkeletalStrokes()
-{
-
-}
-
-
-//TODO: does this already exist in 2Geom? if not, move this there...
-static
-std::vector<Geom::Piecewise<Geom::D2<Geom::SBasis> > > 
-split_at_discontinuities (Geom::Piecewise<Geom::D2<Geom::SBasis> > & pwsbin, double tol = .0001)
-{
-    using namespace Geom;
-    std::vector<Piecewise<D2<SBasis> > > ret;
-    unsigned piece_start = 0;
-    for (unsigned i=0; i<pwsbin.segs.size(); i++){
-        if (i==(pwsbin.segs.size()-1) || L2(pwsbin.segs[i].at1()- pwsbin.segs[i+1].at0()) > tol){
-            Piecewise<D2<SBasis> > piece;
-            piece.cuts.push_back(pwsbin.cuts[piece_start]);
-            for (unsigned j = piece_start; j<i+1; j++){
-                piece.segs.push_back(pwsbin.segs[j]);
-                piece.cuts.push_back(pwsbin.cuts[j+1]);                
-            }
-            ret.push_back(piece);
-            piece_start = i+1;
-        }
-    }
-    return ret;
-}
-
-
-Geom::Piecewise<Geom::D2<Geom::SBasis> >
-LPESkeletalStrokes::doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > & pwd2_in)
-{
-    using namespace Geom;
-
-/* Much credit should go to jfb and mgsloan of lib2geom development for the code below! */
-    Piecewise<D2<SBasis> > output;
-
-    SkelCopyType type = copytype.get_value();
-
-    D2<Piecewise<SBasis> > patternd2 = make_cuts_independant(pattern.get_pwd2());
-    Piecewise<SBasis> x0 = vertical_pattern.get_value() ? Piecewise<SBasis>(patternd2[1]) : Piecewise<SBasis>(patternd2[0]);
-    Piecewise<SBasis> y0 = vertical_pattern.get_value() ? Piecewise<SBasis>(patternd2[0]) : Piecewise<SBasis>(patternd2[1]);
-    Interval pattBndsX = bounds_exact(x0);
-    x0 -= pattBndsX.min();
-    Interval pattBndsY = bounds_exact(y0);
-    y0 -= pattBndsY.middle();
-
-    double xspace  = spacing;
-    double noffset = normal_offset;
-    double toffset = tang_offset;
-    if (prop_units.get_value()){
-        xspace  *= pattBndsX.extent();
-        noffset *= pattBndsY.extent();
-        toffset *= pattBndsX.extent();
-    }
-
-    //Prevent more than 90% overlap...
-    if (xspace < -pattBndsX.extent()*.9) {
-        xspace = -pattBndsX.extent()*.9;
-    }
-    //TODO: dynamical update of parameter ranges?
-    //if (prop_units.get_value()){
-    //        spacing.param_set_range(-.9, NR_HUGE);
-    //    }else{
-    //        spacing.param_set_range(-pattBndsX.extent()*.9, NR_HUGE);
-    //    }
-
-    y0+=noffset;
-
-    std::vector<Geom::Piecewise<Geom::D2<Geom::SBasis> > > paths_in;
-    paths_in = split_at_discontinuities(pwd2_in);
-
-    for (unsigned idx = 0; idx < paths_in.size(); idx++){
-        Geom::Piecewise<Geom::D2<Geom::SBasis> > path_i = paths_in[idx];
-        Piecewise<SBasis> x = x0;
-        Piecewise<SBasis> y = y0;
-        Piecewise<D2<SBasis> > uskeleton = arc_length_parametrization(path_i,2,.1);
-        uskeleton = remove_short_cuts(uskeleton,.01);
-        Piecewise<D2<SBasis> > n = rot90(derivative(uskeleton));
-        n = force_continuity(remove_short_cuts(n,.1));
-        
-        int nbCopies = 0;
-        double scaling = 1;
-        switch(type) {
-            case SSCT_REPEATED:
-                nbCopies = floor((uskeleton.domain().extent() - toffset + xspace)/(pattBndsX.extent()+xspace));
-                pattBndsX = Interval(pattBndsX.min(),pattBndsX.max()+xspace);
-                break;
-                
-            case SSCT_SINGLE:
-                nbCopies = (toffset + pattBndsX.extent() < uskeleton.domain().extent()) ? 1 : 0;
-                break;
-                
-            case SSCT_SINGLE_STRETCHED:
-                nbCopies = 1;
-                scaling = (uskeleton.domain().extent() - toffset)/pattBndsX.extent();
-                break;
-                
-            case SSCT_REPEATED_STRETCHED:
-                // if uskeleton is closed:
-                if(path_i.segs.front().at0() == path_i.segs.back().at1()){
-                    nbCopies = std::floor((uskeleton.domain().extent() - toffset)/(pattBndsX.extent()+xspace));
-                    pattBndsX = Interval(pattBndsX.min(),pattBndsX.max()+xspace);
-                    scaling = (uskeleton.domain().extent() - toffset)/(((double)nbCopies)*pattBndsX.extent());
-                    // if not closed: no space at the end
-                }else{
-                    nbCopies = std::floor((uskeleton.domain().extent() - toffset + xspace)/(pattBndsX.extent()+xspace));
-                    pattBndsX = Interval(pattBndsX.min(),pattBndsX.max()+xspace);
-                    scaling = (uskeleton.domain().extent() - toffset)/(((double)nbCopies)*pattBndsX.extent() - xspace);
-                }
-                break;
-                
-            default:
-                return pwd2_in;
-        };
-        
-        double pattWidth = pattBndsX.extent() * scaling;
-        
-        if (scaling != 1.0) {
-            x*=scaling;
-        }
-        if ( scale_y_rel.get_value() ) {
-            y*=(scaling*prop_scale);
-        } else {
-            if (prop_scale != 1.0) y *= prop_scale;
-        }
-        x += toffset;
-        
-        double offs = 0;
-        for (int i=0; i<nbCopies; i++){
-            output.concat(compose(uskeleton,x+offs)+y*compose(n,x+offs));
-            offs+=pattWidth;
-        }
-    }
-    return output;
-}
-
-void
-LPESkeletalStrokes::transform_multiply(Geom::Matrix const& postmul, bool set)
-{
-    // TODO: implement correct transformation instead of this default behavior
-    Effect::transform_multiply(postmul, set);
-}
-
-
-} // namespace LivePathEffect
-} /* namespace Inkscape */
-
-/*
-  Local Variables:
-  mode:c++
-  c-file-style:"stroustrup"
-  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
-  indent-tabs-mode:nil
-  fill-column:99
-  End:
-*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/live_effects/lpe-skeletalstrokes.h b/src/live_effects/lpe-skeletalstrokes.h
deleted file mode 100644 (file)
index bab2239..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-#ifndef INKSCAPE_LPE_SKELETAL_STROKES_H
-#define INKSCAPE_LPE_SKELETAL_STROKES_H
-
-/*
- * Inkscape::LPESkeletalStrokes
- *
-* Copyright (C) Johan Engelen 2007 <j.b.c.engelen@utwente.nl>
- *
- * Released under GNU GPL, read the file 'COPYING' for more information
- */
-
-#include "live_effects/effect.h"
-#include "live_effects/parameter/path.h"
-#include "live_effects/parameter/enum.h"
-#include "live_effects/parameter/bool.h"
-
-namespace Inkscape {
-namespace LivePathEffect {
-
-enum SkelCopyType {
-    SSCT_SINGLE = 0,
-    SSCT_SINGLE_STRETCHED,
-    SSCT_REPEATED,
-    SSCT_REPEATED_STRETCHED,
-    SSCT_END // This must be last
-};
-
-class LPESkeletalStrokes : public Effect {
-public:
-    LPESkeletalStrokes(LivePathEffectObject *lpeobject);
-    virtual ~LPESkeletalStrokes();
-
-    virtual Geom::Piecewise<Geom::D2<Geom::SBasis> > doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > & pwd2_in);
-
-    virtual void transform_multiply(Geom::Matrix const& postmul, bool set);
-
-private:
-    PathParam  pattern;
-    EnumParam<SkelCopyType> copytype;
-    ScalarParam  prop_scale;
-    BoolParam scale_y_rel;
-    ScalarParam  spacing;
-    ScalarParam  normal_offset;
-    ScalarParam  tang_offset;
-    BoolParam    prop_units;
-    BoolParam    vertical_pattern;
-
-    void on_pattern_pasted();
-
-    LPESkeletalStrokes(const LPESkeletalStrokes&);
-    LPESkeletalStrokes& operator=(const LPESkeletalStrokes&);
-};
-
-}; //namespace LivePathEffect
-}; //namespace Inkscape
-
-#endif