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
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 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<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);
} 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);

View File

@ -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 */

View File

@ -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 ();

View File

@ -131,12 +131,23 @@ LineSet::render (Rect const & area, Cairo::RefPtr<Cairo::Context> 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 ();