Don't redraw the summary every time the playhead moves (if it hasn't moved visibly...
authorCarl Hetherington <carl@carlh.net>
Mon, 9 Jan 2012 18:03:49 +0000 (18:03 +0000)
committerCarl Hetherington <carl@carlh.net>
Mon, 9 Jan 2012 18:03:49 +0000 (18:03 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@11208 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/editor_summary.cc
gtk2_ardour/editor_summary.h

index 8de492ddec5e61efeae862bd28186e1dfda9dda8..57a08caf88903a03a94c142da9e441566e795c43 100644 (file)
@@ -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<double, double> 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;
+}
index 6746849fe3700c3d60143a54569ba369ddfbc70b..0af8be5c9160fb3e8423e3c86eddddca69186b70 100644 (file)
@@ -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