more note performance work (dereference less).
[ardour.git] / gtk2_ardour / ghostregion.cc
index e024a1a6e7ecc4e39ac3be4f0404336d76a90655..bc286598ecb1035c66386020af160e5d9aadd5b0 100644 (file)
@@ -179,6 +179,7 @@ MidiGhostRegion::MidiGhostRegion(RegionView& rv,
                                  TimeAxisView& source_tv,
                                  double initial_unit_pos)
     : GhostRegion(rv, tv.ghost_group(), tv, source_tv, initial_unit_pos)
+    , _note_group (new ArdourCanvas::Container (group))
     , _optimization_iterator(events.end())
 {
        _outline = UIConfiguration::instance().color ("ghost track midi outline");
@@ -200,6 +201,7 @@ MidiGhostRegion::MidiGhostRegion(RegionView& rv,
                   msv.trackview(),
                   source_tv,
                   initial_unit_pos)
+    , _note_group (new ArdourCanvas::Container (group))
     , _optimization_iterator(events.end())
 {
        _outline = UIConfiguration::instance().color ("ghost track midi outline");
@@ -210,6 +212,7 @@ MidiGhostRegion::MidiGhostRegion(RegionView& rv,
 MidiGhostRegion::~MidiGhostRegion()
 {
        clear_events ();
+       delete _note_group;
 }
 
 MidiGhostRegion::GhostEvent::GhostEvent (NoteBase* e, ArdourCanvas::Container* g)
@@ -270,8 +273,8 @@ MidiGhostRegion::set_colors()
        _outline = UIConfiguration::instance().color ("ghost track midi outline");
 
        for (EventList::iterator it = events.begin(); it != events.end(); ++it) {
-               (*it).second->item->set_fill_color (UIConfiguration::instance().color_mod((*it).second->event->base_color(), "ghost track midi fill"));
-               (*it).second->item->set_outline_color (_outline);
+               it->second->item->set_fill_color (UIConfiguration::instance().color_mod((*it).second->event->base_color(), "ghost track midi fill"));
+               it->second->item->set_outline_color (_outline);
        }
 }
 
@@ -306,13 +309,13 @@ MidiGhostRegion::update_contents_height ()
        double const h = note_height(trackview, mv);
 
        for (EventList::iterator it = events.begin(); it != events.end(); ++it) {
-               uint8_t const note_num = (*it).second->event->note()->note();
+               uint8_t const note_num = it->second->event->note()->note();
 
                double const y = note_y(trackview, mv, note_num);
 
-               if ((_tmp_rect = dynamic_cast<ArdourCanvas::Rectangle*>((*it).second->item))) {
+               if ((_tmp_rect = dynamic_cast<ArdourCanvas::Rectangle*>(it->second->item))) {
                        _tmp_rect->set (ArdourCanvas::Rect (_tmp_rect->x0(), y, _tmp_rect->x1(), y + h));
-               } else if ((_tmp_poly = dynamic_cast<ArdourCanvas::Polygon*>((*it).second->item))) {
+               } else if ((_tmp_poly = dynamic_cast<ArdourCanvas::Polygon*>(it->second->item))) {
                        Duple position = _tmp_poly->position();
                        position.y = y;
                        _tmp_poly->set_position(position);
@@ -324,7 +327,7 @@ MidiGhostRegion::update_contents_height ()
 void
 MidiGhostRegion::add_note (NoteBase* n)
 {
-       GhostEvent* event = new GhostEvent (n, group);
+       GhostEvent* event = new GhostEvent (n, _note_group);
        events.insert (make_pair (n->note(), event));
 
        event->item->set_fill_color (UIConfiguration::instance().color_mod(n->base_color(), "ghost track midi fill"));
@@ -356,12 +359,9 @@ MidiGhostRegion::add_note (NoteBase* n)
 void
 MidiGhostRegion::clear_events()
 {
-       _optimization_iterator = events.begin();
-
-       while (_optimization_iterator != events.end()) {
-               delete (*_optimization_iterator).second;
-               _optimization_iterator = events.erase (_optimization_iterator);
-       }
+       _note_group->clear (true);
+       events.clear ();
+       _optimization_iterator = events.end();
 }
 
 /** Update the x positions of our representation of a parent's note.
@@ -442,7 +442,7 @@ MidiGhostRegion::remove_note (NoteBase* note)
                return;
        }
 
-       delete (*f).second;
+       delete f->second;
        events.erase (f);
 
        _optimization_iterator = events.end ();
@@ -462,15 +462,14 @@ MidiGhostRegion::find_event (NoteBase* parent)
 
        if (_optimization_iterator != events.end()) {
                ++_optimization_iterator;
-       }
-
-       if (_optimization_iterator != events.end() && (*_optimization_iterator).second->event == parent) {
-               return (*_optimization_iterator).second;
+               if (_optimization_iterator != events.end() && _optimization_iterator->second->event == parent) {
+                       return _optimization_iterator->second;
+               }
        }
 
        _optimization_iterator = events.find (parent->note());
        if (_optimization_iterator != events.end()) {
-               return (*_optimization_iterator).second;
+               return _optimization_iterator->second;
        }
 
        return 0;