change implementation of ArdourCanvas::Curve to use GIMP-inspired ideas.
[ardour.git] / libs / canvas / canvas / curve.h
index 93c14386dc9794f31e165a844559156cfc7765d2..5a4210e7bc60f672fabaad988c5af9013ec4f697 100644 (file)
 #include "canvas/visibility.h"
 
 #include "canvas/poly_item.h"
+#include "canvas/fill.h"
 
 namespace ArdourCanvas {
 
-class LIBCANVAS_API Curve : public PolyItem
+class LIBCANVAS_API Curve : public PolyItem, public Fill
 {
 public:
     Curve (Group *);
@@ -34,20 +35,20 @@ public:
     void render (Rect const & area, Cairo::RefPtr<Cairo::Context>) const;
     void set (Points const &);
 
+    void set_n_segments (uint32_t n);
+    void set_n_samples (Points::size_type);
+
     bool covers (Duple const &) const;
 
-  protected:
-    void render_path (Rect const &, Cairo::RefPtr<Cairo::Context>) const;
-    void render_curve (Rect const &, Cairo::RefPtr<Cairo::Context>) const;
-    
   private:
-    Points first_control_points;
-    Points second_control_points;
-
-    
-    static void compute_control_points (Points const &,
-                                       Points&, Points&);
-    static double* solve (std::vector<double> const&);
+    Points samples;
+    Points::size_type n_samples;
+    uint32_t n_segments;
+
+    void smooth (Points::size_type p1, Points::size_type p2, Points::size_type p3, Points::size_type p4, 
+                double xfront, double xextent);
+    double map_value (double) const;
+    void interpolate ();
 };
        
 }