summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJohan B. C. Engelen <jbc.engelen@swissonline.ch>2010-07-28 22:13:19 +0000
committerJohan Engelen <goejendaagh@zonnet.nl>2010-07-28 22:13:19 +0000
commit7db5211b131348ff4929579301725eac217c99bc (patch)
treeae1c8fcf462cb150bf08e6d8a3051fb3bc005dea /src
parentpowerstroke: fix terrible bug, clean up code, add interpolator framework (diff)
downloadinkscape-7db5211b131348ff4929579301725eac217c99bc.tar.gz
inkscape-7db5211b131348ff4929579301725eac217c99bc.zip
powerstroke: code only, added bad interpolator
(bzr r9668)
Diffstat (limited to 'src')
-rw-r--r--src/live_effects/lpe-powerstroke.cpp49
1 files changed, 45 insertions, 4 deletions
diff --git a/src/live_effects/lpe-powerstroke.cpp b/src/live_effects/lpe-powerstroke.cpp
index 447b85664..af5739b32 100644
--- a/src/live_effects/lpe-powerstroke.cpp
+++ b/src/live_effects/lpe-powerstroke.cpp
@@ -19,6 +19,7 @@
#include <2geom/piecewise.h>
#include <2geom/sbasis-geometric.h>
#include <2geom/transforms.h>
+#include <2geom/bezier-utils.h>
/// @TODO Move this to 2geom
@@ -44,12 +45,12 @@ public:
virtual ~Linear() {};
virtual Path interpolateToPath(std::vector<Point> points) {
- Path strokepath;
- strokepath.start( points.at(0) );
+ Path path;
+ path.start( points.at(0) );
for (unsigned int i = 1 ; i < points.size(); ++i) {
- strokepath.appendNew<Geom::LineSegment>(points.at(i));
+ path.appendNew<Geom::LineSegment>(points.at(i));
}
- return strokepath;
+ return path;
};
private:
@@ -57,6 +58,46 @@ private:
Linear& operator=(const Linear&);
};
+// this class is terrible
+class CubicBezierFit : public Interpolator {
+public:
+ CubicBezierFit() {};
+ virtual ~CubicBezierFit() {};
+
+ virtual Path interpolateToPath(std::vector<Point> points) {
+ unsigned int n_points = points.size();
+ // worst case gives us 2 segment per point
+ int max_segs = 8*n_points;
+ Geom::Point * b = g_new(Geom::Point, max_segs);
+ Geom::Point * points_array = g_new(Geom::Point, 4*n_points);
+ for (unsigned i = 0; i < n_points; ++i) {
+ points_array[i] = points.at(i);
+ }
+
+ double tolerance_sq = 0; // this value is just a random guess
+
+ int const n_segs = Geom::bezier_fit_cubic_r(b, points_array, n_points,
+ tolerance_sq, max_segs);
+
+ Geom::Path fit;
+ if ( n_segs > 0)
+ {
+ fit.start(b[0]);
+ for (int c = 0; c < n_segs; c++) {
+ fit.appendNew<Geom::CubicBezier>(b[4*c+1], b[4*c+2], b[4*c+3]);
+ }
+ }
+ g_free(b);
+ g_free(points_array);
+ return fit;
+ };
+
+private:
+ CubicBezierFit(const CubicBezierFit&);
+ CubicBezierFit& operator=(const CubicBezierFit&);
+};
+
+
} //namespace Interpolate
} //namespace Geom