From 4f87506e5caf6ee069d0a7364a9497e0b200f48f Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sun, 9 Apr 2023 14:34:22 -0600 Subject: [PATCH] do not sort lineset every time a coord is added; use RAII to create scope and sort at end --- gtk2_ardour/grid_lines.cc | 10 +++++----- gtk2_ardour/midi_streamview.cc | 2 +- libs/canvas/canvas/line_set.h | 9 +++++++++ libs/canvas/line_set.cc | 17 ++++++++++++++--- 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/gtk2_ardour/grid_lines.cc b/gtk2_ardour/grid_lines.cc index 978c3c51df..6fed78ccb0 100644 --- a/gtk2_ardour/grid_lines.cc +++ b/gtk2_ardour/grid_lines.cc @@ -55,19 +55,19 @@ GridLines::hide () void GridLines::draw (std::vector const & marks) { - lines.clear(); + LineSet::ResetRAII lr (lines); const uint32_t major_color = UIConfiguration::instance().color_mod("grid line major", "grid line"); const uint32_t minor_color = UIConfiguration::instance().color_mod("grid line minor", "grid line"); const uint32_t micro_color = UIConfiguration::instance().color_mod("grid line micro", "grid line"); - for (vector::const_iterator m = marks.begin(); m != marks.end(); ++m) { + for (auto const & m : marks) { - samplepos_t s = m->position; + samplepos_t s = m.position; - if ((*m).style == ArdourCanvas::Ruler::Mark::Major) { + if (m.style == ArdourCanvas::Ruler::Mark::Major) { lines.add_coord (PublicEditor::instance().sample_to_pixel_unrounded (s), 1.0, major_color); - } else if ((*m).style == ArdourCanvas::Ruler::Mark::Minor) { + } else if (m.style == ArdourCanvas::Ruler::Mark::Minor) { lines.add_coord (PublicEditor::instance().sample_to_pixel_unrounded (s), 1.0, minor_color); } else { lines.add_coord (PublicEditor::instance().sample_to_pixel_unrounded (s), 1.0, micro_color); diff --git a/gtk2_ardour/midi_streamview.cc b/gtk2_ardour/midi_streamview.cc index d2e264a814..f0da7c0a81 100644 --- a/gtk2_ardour/midi_streamview.cc +++ b/gtk2_ardour/midi_streamview.cc @@ -339,7 +339,7 @@ MidiStreamView::draw_note_lines() double prev_y = .5; uint32_t color; - _note_lines->clear(); + ArdourCanvas::LineSet::ResetRAII lr (*_note_lines); if (child_height() < 140 || note_height() < 3) { /* track is too small for note lines, or there are too many */ diff --git a/libs/canvas/canvas/line_set.h b/libs/canvas/canvas/line_set.h index 6752f5ac3f..2f5b977b64 100644 --- a/libs/canvas/canvas/line_set.h +++ b/libs/canvas/canvas/line_set.h @@ -47,6 +47,15 @@ public: void set_extent (Distance); Distance extent() const { return _extent; } + void begin_add (); + void end_add (); + + struct ResetRAII { + ResetRAII (LineSet& l) : lines (l) { lines.clear(); lines.begin_add(); } + ~ResetRAII () { lines.end_add (); } + LineSet& lines; + }; + void add_coord (Coord, Distance, Gtkmm2ext::Color); void clear (); diff --git a/libs/canvas/line_set.cc b/libs/canvas/line_set.cc index bf2b130a6b..0fd1656485 100644 --- a/libs/canvas/line_set.cc +++ b/libs/canvas/line_set.cc @@ -131,12 +131,23 @@ LineSet::render (Rect const & area, Cairo::RefPtr context) const } void -LineSet::add_coord (Coord y, Distance width, Gtkmm2ext::Color color) +LineSet::add_coord (Coord pos, Distance width, Gtkmm2ext::Color color) +{ + _lines.push_back (Line (pos, width, color)); +} + +void +LineSet::begin_add () { begin_change (); +} - _lines.push_back (Line (y, width, color)); - sort (_lines.begin(), _lines.end(), LineSorter()); +void +LineSet::end_add () +{ + if (!_lines.empty()) { + sort (_lines.begin(), _lines.end(), LineSorter()); + } set_bbox_dirty (); end_change ();