diff options
-rw-r--r-- | gtk2_ardour/audio_region_view.cc | 11 | ||||
-rw-r--r-- | gtk2_ardour/audio_region_view.h | 3 | ||||
-rw-r--r-- | libs/canvas/curve.cc | 8 |
3 files changed, 18 insertions, 4 deletions
diff --git a/gtk2_ardour/audio_region_view.cc b/gtk2_ardour/audio_region_view.cc index da07c9f324..b85706ec4b 100644 --- a/gtk2_ardour/audio_region_view.cc +++ b/gtk2_ardour/audio_region_view.cc @@ -91,6 +91,7 @@ AudioRegionView::AudioRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView , _end_xfade_visible (false) , _amplitude_above_axis(1.0) , fade_color(0) + , curve_surface(new ArdourCanvas::SurfaceGroup(group)) { Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&AudioRegionView::parameter_changed, this, _1), gui_context()); } @@ -111,6 +112,7 @@ AudioRegionView::AudioRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView , _end_xfade_visible (false) , _amplitude_above_axis(1.0) , fade_color(0) + , curve_surface(new ArdourCanvas::SurfaceGroup(group)) { Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&AudioRegionView::parameter_changed, this, _1), gui_context()); } @@ -129,6 +131,7 @@ AudioRegionView::AudioRegionView (const AudioRegionView& other, boost::shared_pt , _end_xfade_visible (false) , _amplitude_above_axis (other._amplitude_above_axis) , fade_color(0) + , curve_surface(new ArdourCanvas::SurfaceGroup(group)) { Gdk::Color c; int r,g,b,a; @@ -690,7 +693,7 @@ AudioRegionView::redraw_start_xfade_to (boost::shared_ptr<AudioRegion> ar, frame } if (!start_xfade_out) { - start_xfade_out = new ArdourCanvas::Curve (group); + start_xfade_out = new ArdourCanvas::Curve (curve_surface); CANVAS_DEBUG_NAME (start_xfade_out, string_compose ("xfade start out line for %1", region()->name())); start_xfade_out->set_fill_color (UINT_RGBA_CHANGE_A (ARDOUR_UI::config()->get_canvasvar_ActiveCrossfade(), 32)); start_xfade_out->set_fill_mode (ArdourCanvas::Curve::Inside); @@ -700,7 +703,7 @@ AudioRegionView::redraw_start_xfade_to (boost::shared_ptr<AudioRegion> ar, frame } if (!start_xfade_in) { - start_xfade_in = new ArdourCanvas::Curve (group); + start_xfade_in = new ArdourCanvas::Curve (curve_surface); CANVAS_DEBUG_NAME (start_xfade_in, string_compose ("xfade start in line for %1", region()->name())); start_xfade_in->set_fill_color (UINT_RGBA_CHANGE_A (ARDOUR_UI::config()->get_canvasvar_CrossfadeLine(), 96)); start_xfade_in->set_fill_mode (ArdourCanvas::Curve::Outside); @@ -795,7 +798,7 @@ AudioRegionView::redraw_end_xfade_to (boost::shared_ptr<AudioRegion> ar, framecn } if (!end_xfade_out) { - end_xfade_out = new ArdourCanvas::Curve (group); + end_xfade_out = new ArdourCanvas::Curve (curve_surface); CANVAS_DEBUG_NAME (end_xfade_out, string_compose ("xfade end out line for %1", region()->name())); end_xfade_out->set_fill_color (UINT_RGBA_CHANGE_A (ARDOUR_UI::config()->get_canvasvar_ActiveCrossfade(), 32)); end_xfade_out->set_fill_mode (ArdourCanvas::Curve::Inside); @@ -805,7 +808,7 @@ AudioRegionView::redraw_end_xfade_to (boost::shared_ptr<AudioRegion> ar, framecn } if (!end_xfade_in) { - end_xfade_in = new ArdourCanvas::Curve (group); + end_xfade_in = new ArdourCanvas::Curve (curve_surface); CANVAS_DEBUG_NAME (end_xfade_in, string_compose ("xfade end in line for %1", region()->name())); end_xfade_in->set_fill_color (UINT_RGBA_CHANGE_A (ARDOUR_UI::config()->get_canvasvar_CrossfadeLine(), 96)); end_xfade_in->set_fill_mode (ArdourCanvas::Curve::Outside); diff --git a/gtk2_ardour/audio_region_view.h b/gtk2_ardour/audio_region_view.h index 3c6b675692..5444b1b569 100644 --- a/gtk2_ardour/audio_region_view.h +++ b/gtk2_ardour/audio_region_view.h @@ -30,6 +30,7 @@ #include "canvas/fwd.h" #include "canvas/wave_view.h" +#include "canvas/surface_group.h" #include "region_view.h" #include "time_axis_view_item.h" @@ -204,6 +205,8 @@ class AudioRegionView : public RegionView AutomationLine::VisibleAspects automation_line_visibility () const; private: + ArdourCanvas::SurfaceGroup *curve_surface; + void setup_fade_handle_positions (); void parameter_changed (std::string const &); diff --git a/libs/canvas/curve.cc b/libs/canvas/curve.cc index e5db740d66..4f8ac3c125 100644 --- a/libs/canvas/curve.cc +++ b/libs/canvas/curve.cc @@ -318,8 +318,10 @@ Curve::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) const window_space = item_to_window (Duple(_points.front().x, draw.height())); context->line_to (window_space.x, window_space.y); context->close_path(); + context->set_operator(Cairo::OPERATOR_SOURCE); setup_fill_context(context); context->fill (); + context->set_operator(Cairo::OPERATOR_OVER); break; case Outside: context->stroke_preserve (); @@ -328,8 +330,10 @@ Curve::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) const window_space = item_to_window (Duple(_points.front().x, 0.0)); context->line_to (window_space.x, window_space.y); context->close_path(); + context->set_operator(Cairo::OPERATOR_SOURCE); setup_fill_context(context); context->fill (); + context->set_operator(Cairo::OPERATOR_OVER); break; } @@ -403,7 +407,9 @@ Curve::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) const context->line_to (window_space.x, window_space.y); context->close_path(); setup_fill_context(context); + context->set_operator(Cairo::OPERATOR_SOURCE); context->fill (); + context->set_operator(Cairo::OPERATOR_OVER); break; case Outside: context->stroke_preserve (); @@ -412,8 +418,10 @@ Curve::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) const window_space = item_to_window (Duple (samples[left].x, 0.0)); context->line_to (window_space.x, window_space.y); context->close_path(); + context->set_operator(Cairo::OPERATOR_SOURCE); setup_fill_context(context); context->fill (); + context->set_operator(Cairo::OPERATOR_OVER); break; } context->restore (); |