From c22459d1b551be2f48d2e60f76e4efb3196de269 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 7 Jan 2014 20:55:04 -0500 Subject: [PATCH] fix a whole set of errors in the placement of xfade visual elements (not 100% finished) --- gtk2_ardour/audio_region_view.cc | 66 ++++++++++++++++++-------------- gtk2_ardour/audio_region_view.h | 4 +- 2 files changed, 40 insertions(+), 30 deletions(-) diff --git a/gtk2_ardour/audio_region_view.cc b/gtk2_ardour/audio_region_view.cc index 6bf76c84e8..217c7e8ff0 100644 --- a/gtk2_ardour/audio_region_view.cc +++ b/gtk2_ardour/audio_region_view.cc @@ -503,8 +503,13 @@ AudioRegionView::set_height (gdouble height) float pos_x = trackview.editor().sample_to_pixel((*l).first); - (*l).second->set (ArdourCanvas::Duple (pos_x, 2.0), - ArdourCanvas::Duple (pos_x, _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1)); + if (height >= NAME_HIGHLIGHT_THRESH) { + (*l).second->set (ArdourCanvas::Duple (pos_x, 2.0), + ArdourCanvas::Duple (pos_x, _height - TimeAxisViewItem::NAME_HIGHLIGHT_SIZE - 1)); + } else { + (*l).second->set (ArdourCanvas::Duple (pos_x, 2.0), + ArdourCanvas::Duple (pos_x, _height - 1)); + } } if (name_text) { @@ -561,7 +566,7 @@ AudioRegionView::reset_fade_in_shape_width (boost::shared_ptr ar, f audio_region()->fade_in()->curve().get_vector (0, audio_region()->fade_in()->back()->when, curve, npoints); if (_height >= NAME_HIGHLIGHT_THRESH) { - effective_height = _height - NAME_HIGHLIGHT_SIZE - 2; + effective_height = _height - NAME_HIGHLIGHT_SIZE - 1; } else { effective_height = _height - 2; } @@ -576,15 +581,15 @@ AudioRegionView::reset_fade_in_shape_width (boost::shared_ptr ar, f double xdelta = pwidth/npoints; for (pi = 0, pc = 0; pc < npoints; ++pc) { - points[pi].x = 1 + (pc * xdelta); - points[pi++].y = 2 + (effective_height - (curve[pc] * effective_height)); + points[pi].x = 1.0 + (pc * xdelta); + points[pi++].y = effective_height - (curve[pc] * effective_height); } /* draw the line */ - redraw_start_xfade_to (ar, width, points, effective_height); + redraw_start_xfade_to (ar, width, points, effective_height, handle_left); - fade_in_shape->set (points); + // fade_in_shape->set (points); /* ensure trim handle stays on top */ if (frame_handle_start) { @@ -618,7 +623,7 @@ AudioRegionView::reset_fade_out_shape_width (boost::shared_ptr ar, /* Put the fade out handle so that its right side is at the end-of-fade line; */ fade_out_handle->set_x0 (handle_right - handle_size); - fade_out_handle->set_x1 (handle_right); + fade_out_handle->set_x1 (handle_right - 1); /* don't show shape if its too small */ @@ -639,30 +644,30 @@ AudioRegionView::reset_fade_out_shape_width (boost::shared_ptr ar, audio_region()->fade_out()->curve().get_vector (0, audio_region()->fade_out()->back()->when, curve, npoints); if (_height >= NAME_HIGHLIGHT_THRESH) { - effective_height = _height - NAME_HIGHLIGHT_SIZE - 2; + effective_height = _height - (NAME_HIGHLIGHT_SIZE + 1); /* skip the top pixel that shows the frame of this regionview */ } else { - effective_height = _height - 2; + effective_height = _height - 2; /* skip the top and bottom pixel that are the frame of this regionview */ } /* points *MUST* be in anti-clockwise order */ - + Points points; - + uint32_t pi, pc; double xdelta = pwidth/npoints; - + points.assign (npoints, Duple ()); - + for (pi = 0, pc = 0; pc < npoints; ++pc, ++pi) { - points[pi].x = _pixel_width - pwidth + (pc * xdelta); - points[pi].y = 2 + (effective_height - (curve[pc] * effective_height)); + points[pi].x = 1.0 + _pixel_width - pwidth + (pc * xdelta); + points[pi].y = effective_height - (curve[pc] * effective_height); } /* draw the line */ - redraw_end_xfade_to (ar, width, points, effective_height); + redraw_end_xfade_to (ar, width, points, effective_height, handle_right+1, pwidth-1); - fade_out_shape->set (points); + // fade_out_shape->set (points); /* ensure trim handle stays on top */ if (frame_handle_end) { @@ -698,7 +703,8 @@ AudioRegionView::redraw_start_xfade () } void -AudioRegionView::redraw_start_xfade_to (boost::shared_ptr ar, framecnt_t /*width*/, Points& points, double effective_height) +AudioRegionView::redraw_start_xfade_to (boost::shared_ptr ar, framecnt_t /*width*/, Points& points, double effective_height, + double rect_width) { if (points.size() < 3) { return; @@ -729,7 +735,7 @@ AudioRegionView::redraw_start_xfade_to (boost::shared_ptr ar, frame start_xfade_rect->set_data ("regionview", this); } - start_xfade_rect->set (ArdourCanvas::Rect (points.front().x, 1.0, points.back().x, effective_height)); + start_xfade_rect->set (ArdourCanvas::Rect (1.0, 2.0, rect_width, effective_height)); start_xfade_rect->show (); start_xfade_in->set (points); @@ -745,9 +751,12 @@ AudioRegionView::redraw_start_xfade_to (boost::shared_ptr ar, frame if (!inverse) { + /* no inverse curve defined, show the inverse of the normal one */ + for (Points::size_type i = 0, pci = 0; i < npoints; ++i, ++pci) { ArdourCanvas::Duple &p (ipoints[pci]); - p.x = i; + p.x = 1.0 + i; + /* invert with respect to y-axis */ p.y = effective_height - points[pci].y; } @@ -758,8 +767,8 @@ AudioRegionView::redraw_start_xfade_to (boost::shared_ptr ar, frame for (Points::size_type i = 0, pci = 0; i < npoints; ++i, ++pci) { ArdourCanvas::Duple &p (ipoints[pci]); - p.x = i; - p.y = 1.0 + effective_height - (effective_height * vec[i]); + p.x = 1.0 + i; + p.y = effective_height - (effective_height * vec[i]); } } @@ -784,7 +793,8 @@ AudioRegionView::redraw_end_xfade () } void -AudioRegionView::redraw_end_xfade_to (boost::shared_ptr ar, framecnt_t width, Points& points, double effective_height) +AudioRegionView::redraw_end_xfade_to (boost::shared_ptr ar, framecnt_t width, Points& points, double effective_height, + double rect_edge, double rect_width) { if (points.size() < 3) { return; @@ -815,7 +825,7 @@ AudioRegionView::redraw_end_xfade_to (boost::shared_ptr ar, framecn end_xfade_rect->set_data ("regionview", this); } - end_xfade_rect->set (ArdourCanvas::Rect (points.front().x, 1.0, points.back().x, effective_height)); + end_xfade_rect->set (ArdourCanvas::Rect (rect_edge, 2.0, rect_edge + rect_width, effective_height)); end_xfade_rect->show (); end_xfade_in->set (points); @@ -836,7 +846,7 @@ AudioRegionView::redraw_end_xfade_to (boost::shared_ptr ar, framecn for (Points::size_type i = 0, pci = 0; i < npoints; ++i, ++pci) { ArdourCanvas::Duple &p (ipoints[pci]); - p.x = rend + i; + p.x = 1.0 + rend + i; p.y = effective_height - points[pci].y; } @@ -851,8 +861,8 @@ AudioRegionView::redraw_end_xfade_to (boost::shared_ptr ar, framecn for (Points::size_type i = 0, pci = 0; i < npoints; ++i) { ArdourCanvas::Duple& p (ipoints[pci++]); - p.x = rend + i; - p.y = 1.0 + effective_height - (effective_height * vp[i]); + p.x = 1.0 + rend + i; + p.y = effective_height - (effective_height * vp[i]); } } diff --git a/gtk2_ardour/audio_region_view.h b/gtk2_ardour/audio_region_view.h index bb5cbf29c4..e00c98d20f 100644 --- a/gtk2_ardour/audio_region_view.h +++ b/gtk2_ardour/audio_region_view.h @@ -112,8 +112,8 @@ class AudioRegionView : public RegionView void drag_start (); void drag_end (); - void redraw_start_xfade_to (boost::shared_ptr, framecnt_t, ArdourCanvas::Points&, double); - void redraw_end_xfade_to (boost::shared_ptr, framecnt_t, ArdourCanvas::Points&, double); + void redraw_start_xfade_to (boost::shared_ptr, framecnt_t, ArdourCanvas::Points&, double, double); + void redraw_end_xfade_to (boost::shared_ptr, framecnt_t, ArdourCanvas::Points&, double, double, double); void redraw_start_xfade (); void redraw_end_xfade ();