From b8a93d7a86bf8939a91c61d0dee05206d2ce2638 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 9 Jan 2012 18:03:49 +0000 Subject: Don't redraw the summary every time the playhead moves (if it hasn't moved visibly on the summary), and only redraw the bit that has changed when it does happen. git-svn-id: svn://localhost/ardour2/branches/3.0@11208 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/editor_summary.cc | 27 +++++++++++++++++++++++---- gtk2_ardour/editor_summary.h | 2 ++ 2 files changed, 25 insertions(+), 4 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/editor_summary.cc b/gtk2_ardour/editor_summary.cc index 8de492ddec..57a08caf88 100644 --- a/gtk2_ardour/editor_summary.cc +++ b/gtk2_ardour/editor_summary.cc @@ -120,7 +120,7 @@ EditorSummary::on_expose_event (GdkEventExpose* event) /* XXX: colour should be set from configuration file */ cairo_set_source_rgba (cr, 1, 0, 0, 1); - double const p = (_editor->playhead_cursor->current_frame - _start) * _x_scale; + double const p = playhead_frame_to_position (_editor->playhead_cursor->current_frame); cairo_move_to (cr, p, 0); cairo_line_to (cr, p, get_height()); cairo_stroke (cr); @@ -251,10 +251,19 @@ EditorSummary::render_region (RegionView* r, cairo_t* cr, double y) const void EditorSummary::set_overlays_dirty () { - ENSURE_GUI_THREAD (*this, &EditorSummary::set_overlays_dirty) + ENSURE_GUI_THREAD (*this, &EditorSummary::set_overlays_dirty); queue_draw (); } +/** Set the summary so that just the overlays (viewbox, playhead etc.) in a given area will be re-rendered */ +void +EditorSummary::set_overlays_dirty (int x, int y, int w, int h) +{ + ENSURE_GUI_THREAD (*this, &EditorSummary::set_overlays_dirty); + queue_draw_area (x, y, w, h); +} + + /** Handle a size request. * @param req GTK requisition */ @@ -859,8 +868,12 @@ EditorSummary::set_editor_y (pair const y) void EditorSummary::playhead_position_changed (framepos_t p) { - if (_session && int (p * _x_scale) != int (_last_playhead)) { - set_overlays_dirty (); + int const o = int (_last_playhead); + int const n = int (playhead_frame_to_position (p)); + if (_session && o != n) { + int a = min (o, n); + int b = max (o, n); + set_overlays_dirty (a - 1, 0, b + 1, get_height ()); } } @@ -928,3 +941,9 @@ EditorSummary::route_gui_changed (string c) set_dirty (); } } + +double +EditorSummary::playhead_frame_to_position (framepos_t t) const +{ + return (t - _start) * _x_scale; +} diff --git a/gtk2_ardour/editor_summary.h b/gtk2_ardour/editor_summary.h index 6746849fe3..0af8be5c91 100644 --- a/gtk2_ardour/editor_summary.h +++ b/gtk2_ardour/editor_summary.h @@ -83,6 +83,8 @@ private: void set_cursor (Position); void route_gui_changed (std::string); bool suspending_editor_updates () const; + double playhead_frame_to_position (framepos_t) const; + void set_overlays_dirty (int, int, int, int); framepos_t _start; ///< start frame of the overview framepos_t _end; ///< end frame of the overview -- cgit v1.2.3