X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fhorizontal-bracket-engraver.cc;h=d7e453da1f1323d8777ab649418c9bb00484f654;hb=2ae38516beda96b730aae513053789f3fa699b46;hp=176b5d56efd179068a2e8fa2323a486afad31836;hpb=b37e3f652677ae0298423db9fa0e552e5fce0c92;p=lilypond.git diff --git a/lily/horizontal-bracket-engraver.cc b/lily/horizontal-bracket-engraver.cc index 176b5d56ef..d7e453da1f 100644 --- a/lily/horizontal-bracket-engraver.cc +++ b/lily/horizontal-bracket-engraver.cc @@ -4,7 +4,7 @@ source file of the GNU LilyPond music typesetter - (c) 2002--2006 Han-Wen Nienhuys + (c) 2002--2007 Han-Wen Nienhuys */ #include "engraver.hh" @@ -12,6 +12,9 @@ #include "note-column.hh" #include "pointer-group-interface.hh" #include "side-position-interface.hh" +#include "stream-event.hh" +#include "spanner.hh" +#include "item.hh" #include "translator.icc" @@ -19,22 +22,21 @@ class Horizontal_bracket_engraver : public Engraver { public: TRANSLATOR_DECLARATIONS (Horizontal_bracket_engraver); - Link_array bracket_stack_; - Link_array events_; - int pop_count_; - int push_count_; + vector bracket_stack_; + vector events_; + vsize pop_count_; + vsize push_count_; - virtual bool try_music (Music *); void stop_translation_timestep (); void process_music (); DECLARE_ACKNOWLEDGER (note_column); + DECLARE_TRANSLATOR_LISTENER (note_grouping); }; ADD_ACKNOWLEDGER (Horizontal_bracket_engraver, note_column); ADD_TRANSLATOR (Horizontal_bracket_engraver, "Create horizontal brackets over notes for musical analysis purposes.", "HorizontalBracket", - "note-grouping-event", "", ""); @@ -44,37 +46,32 @@ Horizontal_bracket_engraver::Horizontal_bracket_engraver () push_count_ = 0; } -bool -Horizontal_bracket_engraver::try_music (Music *m) +IMPLEMENT_TRANSLATOR_LISTENER (Horizontal_bracket_engraver, note_grouping); +void +Horizontal_bracket_engraver::listen_note_grouping (Stream_event *ev) { - if (m->is_mus_type ("note-grouping-event")) + Direction d = to_dir (ev->get_property ("span-direction")); + + if (d == STOP) + { + pop_count_++; + if (pop_count_ > bracket_stack_.size ()) + ev->origin ()->warning (_ ("do not have that many brackets")); + } + else { - Direction d = to_dir (m->get_property ("span-direction")); - - if (d == STOP) - { - pop_count_++; - if (pop_count_ > bracket_stack_.size ()) - m->origin ()->warning (_ ("don't have that many brackets")); - } - else - { - push_count_++; - events_.push (m); - } - - if (pop_count_ && push_count_) - m->origin ()->warning (_ ("conflicting note group events")); - - return true; + push_count_++; + events_.push_back (ev); } - return false; + + if (pop_count_ && push_count_) + ev->origin ()->warning (_ ("conflicting note group events")); } void Horizontal_bracket_engraver::acknowledge_note_column (Grob_info gi) { - for (int i = 0; i < bracket_stack_.size (); i++) + for (vsize i = 0; i < bracket_stack_.size (); i++) { Side_position_interface::add_support (bracket_stack_[i], gi.grob ()); Pointer_group_interface::add_grob (bracket_stack_[i], @@ -87,18 +84,14 @@ Horizontal_bracket_engraver::acknowledge_note_column (Grob_info gi) void Horizontal_bracket_engraver::process_music () { - for (int k = 0; k < push_count_; k++) + for (vsize k = 0; k < push_count_; k++) { Spanner *sp = make_spanner ("HorizontalBracket", events_[k]->self_scm ()); - for (int i = 0; i < bracket_stack_.size (); i++) - { - /* - sp is the smallest, it should be added to the bigger brackets. - */ - Side_position_interface::add_support (bracket_stack_[i], sp); - } - bracket_stack_.push (sp); + for (vsize i = 0; i < bracket_stack_.size (); i++) + /* sp is the smallest, it should be added to the bigger brackets. */ + Side_position_interface::add_support (bracket_stack_[i], sp); + bracket_stack_.push_back (sp); } } @@ -106,10 +99,8 @@ void Horizontal_bracket_engraver::stop_translation_timestep () { for (int i = pop_count_; i--;) - { - if (bracket_stack_.size ()) - bracket_stack_.pop (); - } + if (bracket_stack_.size ()) + bracket_stack_.pop_back (); pop_count_ = 0; push_count_ = 0; }