diff options
author | nick_m <mainsbridge@gmail.com> | 2016-10-19 03:56:43 +1100 |
---|---|---|
committer | nick_m <mainsbridge@gmail.com> | 2016-10-19 03:56:43 +1100 |
commit | 715b17813026c6baf8a4adb4442c8586e114452c (patch) | |
tree | e75622cb7aaf71514518fbaf463735afa5d3b56c /gtk2_ardour/editor_tempodisplay.cc | |
parent | 208cb967e579d9177dce92086103c50f00b45b34 (diff) |
Improve bbt ruler drawing performance for large time ranges.
- when the timeline displays many bars, zoom/autoscroll
speed is improved by calculating the bbt ruler scale first
then requesting a suitably scaled grid.
Diffstat (limited to 'gtk2_ardour/editor_tempodisplay.cc')
-rw-r--r-- | gtk2_ardour/editor_tempodisplay.cc | 55 |
1 files changed, 48 insertions, 7 deletions
diff --git a/gtk2_ardour/editor_tempodisplay.cc b/gtk2_ardour/editor_tempodisplay.cc index 727473e22e..41d19ca794 100644 --- a/gtk2_ardour/editor_tempodisplay.cc +++ b/gtk2_ardour/editor_tempodisplay.cc @@ -166,11 +166,14 @@ Editor::tempo_map_changed (const PropertyChange& /*ignored*/) tempo_lines->tempo_map_changed(); } + compute_bbt_ruler_scale (leftmost_frame, leftmost_frame + current_page_samples()); std::vector<TempoMap::BBTPoint> grid; - compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples()); + if (bbt_ruler_scale != bbt_show_many) { + compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples()); + } _session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks); // redraw metric markers draw_measures (grid); - update_tempo_based_rulers (grid); + update_tempo_based_rulers (); } struct CurveComparator { @@ -249,10 +252,15 @@ Editor::marker_position_changed () } } + compute_bbt_ruler_scale (leftmost_frame, leftmost_frame + current_page_samples()); std::vector<TempoMap::BBTPoint> grid; - compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples()); + + if (bbt_ruler_scale != bbt_show_many) { + compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples()); + } + draw_measures (grid); - update_tempo_based_rulers (grid); + update_tempo_based_rulers (); } void @@ -263,11 +271,15 @@ Editor::redisplay_tempo (bool immediate_redraw) } if (immediate_redraw) { + compute_bbt_ruler_scale (leftmost_frame, leftmost_frame + current_page_samples()); std::vector<TempoMap::BBTPoint> grid; - compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples()); + if (bbt_ruler_scale != bbt_show_many) { + compute_current_bbt_points (grid, leftmost_frame, leftmost_frame + current_page_samples()); + } + draw_measures (grid); - update_tempo_based_rulers (grid); // redraw rulers and measure lines + update_tempo_based_rulers (); // redraw rulers and measure lines } else { Glib::signal_idle().connect (sigc::bind_return (sigc::bind (sigc::mem_fun (*this, &Editor::redisplay_tempo), true), false)); @@ -285,7 +297,36 @@ Editor::compute_current_bbt_points (std::vector<TempoMap::BBTPoint>& grid, frame /* prevent negative values of leftmost from creeping into tempomap */ const double lower_beat = floor (max (0.0, _session->tempo_map().beat_at_frame (leftmost))) - 1.0; - _session->tempo_map().get_grid (grid, max (_session->tempo_map().frame_at_beat (lower_beat), (framepos_t) 0), rightmost); + switch (bbt_ruler_scale) { + + case bbt_show_beats: + case bbt_show_ticks: + case bbt_show_ticks_detail: + case bbt_show_ticks_super_detail: + _session->tempo_map().get_grid (grid, max (_session->tempo_map().frame_at_beat (lower_beat), (framepos_t) 0), rightmost); + break; + + case bbt_show_1: + _session->tempo_map().get_grid (grid, max (_session->tempo_map().frame_at_beat (lower_beat), (framepos_t) 0), rightmost, 1); + break; + + case bbt_show_4: + _session->tempo_map().get_grid (grid, max (_session->tempo_map().frame_at_beat (lower_beat), (framepos_t) 0), rightmost, 4); + break; + + case bbt_show_16: + _session->tempo_map().get_grid (grid, max (_session->tempo_map().frame_at_beat (lower_beat), (framepos_t) 0), rightmost, 16); + break; + + case bbt_show_64: + _session->tempo_map().get_grid (grid, max (_session->tempo_map().frame_at_beat (lower_beat), (framepos_t) 0), rightmost, 64); + break; + + default: + /* bbt_show_many */ + _session->tempo_map().get_grid (grid, max (_session->tempo_map().frame_at_beat (lower_beat), (framepos_t) 0), rightmost, 128); + break; + } } void |