Fix possible crash when removing ports with jack1
[ardour.git] / libs / canvas / framed_curve.cc
index 6cb2aa9d1879c81f98d6b9e074885fceaba2becc..7a4046a6862475c07a8dc7dce80c85bbea27a3d8 100644 (file)
@@ -31,7 +31,7 @@ FramedCurve::FramedCurve (Canvas* c)
        : PolyItem (c)
        , n_samples (0)
        , points_per_segment (16)
-       , curve_fill (None)
+       , curve_fill (Inside)
 {
 }
 
@@ -39,7 +39,7 @@ FramedCurve::FramedCurve (Item* parent)
        : PolyItem (parent)
        , n_samples (0)
        , points_per_segment (16)
-       , curve_fill (None)
+       , curve_fill (Inside)
 {
 }
 
@@ -201,21 +201,26 @@ FramedCurve::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) c
                        }
                }
 
-               /* a redraw may have been requested between the last sample and the last point.*/
+               const Duple first_sample = Duple (samples[left].x, samples[left].y);
 
-               const Duple first_point = Duple (samples[left].x, samples[left].y);
-               Duple last_point = Duple (samples[right].x, samples[right].y);
+               /* move to the first sample's x and the draw height */
+               window_space = item_to_window (Duple (first_sample.x, draw.height()));
+               context->move_to (window_space.x, window_space.y);
 
-               if (draw.x1 > last_point.x) {
-                       last_point = Duple (_points.back().x, _points.back().y);
+               /* draw line to first sample and then between samples */
+               for (uint32_t idx = left; idx <= right; ++idx) {
+                       window_space = item_to_window (Duple (samples[idx].x, samples[idx].y), false);
+                       context->line_to (window_space.x, window_space.y);
                }
 
-               window_space = item_to_window (first_point);
-               context->move_to (window_space.x, window_space.y);
+               /* a redraw may have been requested between the last sample and the last point.
+                  if so, draw a line to the last _point.
+               */
+               Duple last_sample = Duple (samples[right].x, samples[right].y);
 
-               /* draw line between samples */
-               for (uint32_t idx = left + 1; idx <= right; ++idx) {
-                       window_space = item_to_window (Duple (samples[idx].x, samples[idx].y), false);
+               if (draw.x1 > last_sample.x) {
+                       last_sample = Duple (_points.back().x, _points.back().y);
+                       window_space = item_to_window (last_sample, false);
                        context->line_to (window_space.x, window_space.y);
                }
 
@@ -225,21 +230,20 @@ FramedCurve::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) c
                                break;
                        case Inside:
                                context->stroke_preserve ();
-
-                               window_space = item_to_window (Duple (last_point.x, draw.height()));
+                               /* close the frame, possibly using the last _point's x rather than samples[right].x */
+                               window_space = item_to_window (Duple (last_sample.x, draw.height()));
                                context->line_to (window_space.x, window_space.y);
-                               window_space = item_to_window (Duple (first_point.x, draw.height()));
+                               window_space = item_to_window (Duple (first_sample.x, draw.height()));
                                context->line_to (window_space.x, window_space.y);
-
                                context->close_path();
                                setup_fill_context(context);
                                context->fill ();
                                break;
                        case Outside:
                                context->stroke_preserve ();
-                               window_space = item_to_window (last_point);
+                               window_space = item_to_window (Duple (last_sample.x, 0.0));
                                context->line_to (window_space.x, window_space.y);
-                               window_space = item_to_window (first_point);
+                               window_space = item_to_window (Duple (first_sample.x, 0.0));
                                context->line_to (window_space.x, window_space.y);
                                context->close_path();
                                setup_fill_context(context);