Add Zoom/Expand icon
[ardour.git] / libs / canvas / framed_curve.cc
index b1e0952b1f8abc9d92dbc5f5f5fc91f27886fa1c..d8ba2e92c0b7f085d584bd9e92282c411f1add1c 100644 (file)
@@ -90,7 +90,6 @@ FramedCurve::interpolate ()
                samples.push_back (curve_points.back());
                n_samples = 2;
        } else {
-
                InterpolatedCurve::interpolate (curve_points, points_per_segment, CatmullRomCentripetal, false, samples);
                n_samples = samples.size();
        }
@@ -143,20 +142,40 @@ FramedCurve::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) c
        }
 
        setup_outline_context (context);
-
        if (_points.size() == 3) {
 
                /* straight line */
 
                Duple window_space;
                Points::const_iterator it = _points.begin();
+
+               Duple first_point = Duple (0.0, 0.0);
+               Duple last_point = Duple (0.0, 0.0);
+
                window_space = item_to_window (*it);
-               context->move_to (window_space.x, window_space.y);
+               if (window_space.x <= draw.x0) {
+                       first_point = Duple (draw.x0, window_space.y);
+               } else {
+                       first_point = Duple (window_space.x, window_space.y);
+               }
+               context->move_to (first_point.x, first_point.y);
+
                ++it;
                window_space = item_to_window (*it, false);
-               context->line_to (window_space.x, window_space.y);
+               if (window_space.x <= draw.x0) {
+                       context->line_to (draw.x0, window_space.y);
+               } else {
+                       context->line_to (window_space.x, window_space.y);
+               }
+
                window_space = item_to_window (_points.back(), false);
-               context->line_to (window_space.x, window_space.y);
+               if (window_space.x >= draw.x1) {
+                       last_point = Duple (draw.x1, window_space.y);
+               } else {
+                       last_point = Duple (window_space.x, window_space.y);
+               }
+
+               context->line_to (last_point.x, last_point.y);
 
                switch (curve_fill) {
                        case None:
@@ -164,10 +183,10 @@ FramedCurve::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) c
                                break;
                        case Inside:
                                context->stroke_preserve ();
-                               window_space = item_to_window (Duple(_points.back().x, draw.height()));
-                               context->line_to (window_space.x, window_space.y);
-                               window_space = item_to_window (Duple(_points.front().x, draw.height()));
-                               context->line_to (window_space.x, window_space.y);
+                               window_space = item_to_window (Duple(0.0, draw.height()));
+                               context->line_to (last_point.x, window_space.y);
+                               window_space = item_to_window (Duple(0.0, draw.height()));
+                               context->line_to (first_point.x, window_space.y);
                                context->close_path();
                                setup_fill_context(context);
                                context->fill ();
@@ -175,16 +194,15 @@ FramedCurve::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) c
                        case Outside:
                                context->stroke_preserve ();
                                window_space = item_to_window (Duple(_points.back().x, 0.0));
-                               context->line_to (window_space.x, window_space.y);
+                               context->line_to (last_point.x, window_space.y);
                                window_space = item_to_window (Duple(_points.front().x, 0.0));
-                               context->line_to (window_space.x, window_space.y);
+                               context->line_to (first_point.x, window_space.y);
                                context->close_path();
                                setup_fill_context(context);
                                context->fill ();
                                break;
                }
        } else {
-
                /* curve of at least 3 points */
 
                /* find left and right-most sample */