summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 072916d)
raw | patch | inline | side by side (parent: 072916d)
author | johanengelen <johanengelen@users.sourceforge.net> | |
Tue, 8 Apr 2008 18:02:31 +0000 (18:02 +0000) | ||
committer | johanengelen <johanengelen@users.sourceforge.net> | |
Tue, 8 Apr 2008 18:02:31 +0000 (18:02 +0000) |
src/live_effects/CMakeLists.txt | patch | blob | history | |
src/live_effects/Makefile_insert | patch | blob | history | |
src/live_effects/effect.cpp | patch | blob | history | |
src/live_effects/effect.h | patch | blob | history | |
src/live_effects/lpe-patternalongpath.cpp | [new file with mode: 0644] | patch | blob |
src/live_effects/lpe-patternalongpath.h | [new file with mode: 0644] | patch | blob |
src/live_effects/lpe-skeletalstrokes.cpp | [deleted file] | patch | blob | history |
src/live_effects/lpe-skeletalstrokes.h | [deleted file] | patch | blob | history |
index d437e40f9779ace709d39d131990ad75c70b8de3..f88e965311d0ece284e1b5baf4d2d31c90f78981 100644 (file)
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)
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)
// 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"
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"},
{
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)
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
--- /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 *>(©type) );
+ 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
--- /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
+++ /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 *>(©type) );
- 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
+++ /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