do not sort lineset every time a coord is added; use RAII to create scope and sort at end

This commit is contained in:
Paul Davis 2023-04-09 14:34:22 -06:00
parent d4bca18108
commit 4f87506e5c
4 changed files with 29 additions and 9 deletions

View file

@ -55,19 +55,19 @@ GridLines::hide ()
void void
GridLines::draw (std::vector<Ruler::Mark> const & marks) GridLines::draw (std::vector<Ruler::Mark> 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 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 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"); const uint32_t micro_color = UIConfiguration::instance().color_mod("grid line micro", "grid line");
for (vector<Ruler::Mark>::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); 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); lines.add_coord (PublicEditor::instance().sample_to_pixel_unrounded (s), 1.0, minor_color);
} else { } else {
lines.add_coord (PublicEditor::instance().sample_to_pixel_unrounded (s), 1.0, micro_color); lines.add_coord (PublicEditor::instance().sample_to_pixel_unrounded (s), 1.0, micro_color);

View file

@ -339,7 +339,7 @@ MidiStreamView::draw_note_lines()
double prev_y = .5; double prev_y = .5;
uint32_t color; uint32_t color;
_note_lines->clear(); ArdourCanvas::LineSet::ResetRAII lr (*_note_lines);
if (child_height() < 140 || note_height() < 3) { if (child_height() < 140 || note_height() < 3) {
/* track is too small for note lines, or there are too many */ /* track is too small for note lines, or there are too many */

View file

@ -47,6 +47,15 @@ public:
void set_extent (Distance); void set_extent (Distance);
Distance extent() const { return _extent; } 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 add_coord (Coord, Distance, Gtkmm2ext::Color);
void clear (); void clear ();

View file

@ -131,12 +131,23 @@ LineSet::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) const
} }
void 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 (); begin_change ();
}
_lines.push_back (Line (y, width, color)); void
sort (_lines.begin(), _lines.end(), LineSorter()); LineSet::end_add ()
{
if (!_lines.empty()) {
sort (_lines.begin(), _lines.end(), LineSorter());
}
set_bbox_dirty (); set_bbox_dirty ();
end_change (); end_change ();