X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fvolta-engraver.cc;h=9fe3ee9bb22a314071e668b592111bd4bf59705c;hb=9bea477a992947adbbba48bc479c3f551cde8225;hp=7a9cbe25f4cad7c3ceb2711b18092e0c007be2ba;hpb=28976d28a04cfb9abe97af7214d7dce11f732604;p=lilypond.git diff --git a/lily/volta-engraver.cc b/lily/volta-engraver.cc index 7a9cbe25f4..9fe3ee9bb2 100644 --- a/lily/volta-engraver.cc +++ b/lily/volta-engraver.cc @@ -1,16 +1,14 @@ -/* - volta-engraver.cc -- implement Volta_engraver - +/* + volta-engraver.cc -- implement Volta_engraver + source file of the GNU LilyPond music typesetter - - (c) 2000--2004 Han-Wen Nienhuys - - */ + + (c) 2000--2005 Han-Wen Nienhuys +*/ #include "engraver.hh" #include "context.hh" #include "volta-bracket.hh" -#include "item.hh" #include "note-column.hh" #include "bar-line.hh" #include "side-position-interface.hh" @@ -20,7 +18,7 @@ /* Create Volta spanners, by reading repeatCommands property, usually set by Unfolded_repeat_iterator. - */ +*/ class Volta_engraver : public Engraver { public: @@ -31,7 +29,7 @@ protected: virtual void finalize (); virtual void stop_translation_timestep (); virtual void process_music (); - + Moment started_mom_; Spanner *volta_span_; Spanner *end_volta_span_; @@ -39,7 +37,6 @@ protected: SCM start_string_; bool staff_eligible (); - }; Volta_engraver::Volta_engraver () @@ -49,48 +46,46 @@ Volta_engraver::Volta_engraver () end_volta_span_ = 0; } - /* TODO: this logic should be rewritten, it is buggy. One of the problems is that we can't determine wether or not to print the volta bracket during the first step, since that requires acknowledging the staff. - */ +*/ bool Volta_engraver::staff_eligible () { - /* - UGH. - */ - if (!unsmob_grob (staff_)) - return true; - - if (!to_boolean (get_property ("voltaOnThisStaff"))) + SCM doit = get_property ("voltaOnThisStaff"); + if (scm_is_bool (doit)) { - /* - TODO: this does weird things when you open a piece with a - volta spanner. - - */ - SCM staffs = get_property ("stavesFound"); + return to_boolean (doit); + } - /* - only put a volta on the top staff. - - May be this is a bit convoluted, and we should have a single - volta engraver in score context or somesuch. - - */ - if (!is_pair (staffs)) - { - programming_error ("Huh? Volta engraver can't find staffs?"); - return false; - } - else if (ly_car (scm_last_pair (staffs)) != staff_) - { - return false; - } + if (!unsmob_grob (staff_)) + return false; + + /* + TODO: this does weird things when you open a piece with a + volta spanner. + */ + SCM staffs = get_property ("stavesFound"); + + /* + only put a volta on the top staff. + + May be this is a bit convoluted, and we should have a single + volta engraver in score context or somesuch. + + */ + if (!scm_is_pair (staffs)) + { + programming_error ("Huh? Volta engraver can't find staffs?"); + return false; + } + else if (scm_car (scm_last_pair (staffs)) != staff_) + { + return false; } return true; } @@ -101,40 +96,38 @@ Volta_engraver::process_music () SCM cs = get_property ("repeatCommands"); if (!staff_eligible ()) - return ; + return; - - bool end = false; + bool end = false; start_string_ = SCM_EOL; - while (is_pair (cs)) + while (scm_is_pair (cs)) { - SCM c = ly_car (cs); + SCM c = scm_car (cs); - if (is_pair (c) - && ly_car (c) == ly_symbol2scm ("volta") - && is_pair (ly_cdr (c))) + if (scm_is_pair (c) + && scm_car (c) == ly_symbol2scm ("volta") + && scm_is_pair (scm_cdr (c))) { - if (ly_cadr (c) == SCM_BOOL_F) + if (scm_cadr (c) == SCM_BOOL_F) end = true; else - start_string_ = ly_cadr (c); + start_string_ = scm_cadr (c); } - - cs = ly_cdr (cs); + + cs = scm_cdr (cs); } if (volta_span_) { SCM l (get_property ("voltaSpannerDuration")); Moment now = now_mom (); - + bool early_stop = unsmob_moment (l) && *unsmob_moment (l) <= now - started_mom_; - + end = end || early_stop; } - if (end && !volta_span_) { warning (_ ("No volta spanner to end")); // fixme: be more verbose. @@ -142,53 +135,51 @@ Volta_engraver::process_music () else if (end) { end_volta_span_ = volta_span_; - volta_span_ =0; + volta_span_ = 0; } - if (volta_span_ && - (is_string (start_string_) || is_pair (start_string_))) + if (volta_span_ + && (scm_is_string (start_string_) || scm_is_pair (start_string_))) { warning (_ ("Already have a volta spanner. Stopping that one prematurely.")); - + if (end_volta_span_) { warning (_ ("Also have a stopped spanner. Giving up.")); - return ; + return; } end_volta_span_ = volta_span_; volta_span_ = 0; } - if (!volta_span_ && - (is_string (start_string_) || is_pair (start_string_))) + if (!volta_span_ + && (scm_is_string (start_string_) || scm_is_pair (start_string_))) { - started_mom_ = now_mom () ; + started_mom_ = now_mom (); - volta_span_ = make_spanner ("VoltaBracket"); + volta_span_ = make_spanner ("VoltaBracket", SCM_EOL); - announce_grob (volta_span_, SCM_EOL); volta_span_->set_property ("text", start_string_); } } - void Volta_engraver::acknowledge_grob (Grob_info i) { - if (Item* item = dynamic_cast (i.grob_)) + if (Item *item = dynamic_cast (i.grob_)) { if (Note_column::has_interface (item)) { if (volta_span_) - Volta_bracket_interface::add_column (volta_span_,item); + Volta_bracket_interface::add_column (volta_span_, item); } if (Bar_line::has_interface (item)) { if (volta_span_) Volta_bracket_interface::add_bar (volta_span_, item); if (end_volta_span_) - Volta_bracket_interface::add_bar (end_volta_span_ , item); + Volta_bracket_interface::add_bar (end_volta_span_, item); } } else if (Staff_symbol::has_interface (i.grob_)) @@ -207,19 +198,9 @@ Volta_engraver::acknowledge_grob (Grob_info i) void Volta_engraver::finalize () { - if (volta_span_) - { - typeset_grob (volta_span_); - } - if (end_volta_span_) - { - typeset_grob (end_volta_span_); - } } - - -void +void Volta_engraver::stop_translation_timestep () { if (volta_span_ && !staff_eligible ()) @@ -230,26 +211,36 @@ Volta_engraver::stop_translation_timestep () we need to do this here, because STAFF_ is not initialized yet in the 1st call of process_music () */ - - volta_span_->suicide ( ); + + volta_span_->suicide (); volta_span_ = 0; } - - if (end_volta_span_) + + if (end_volta_span_ && !end_volta_span_->get_bound (RIGHT)) + { + Grob *cc = unsmob_grob (get_property ("currentCommandColumn")); + Item *ci = dynamic_cast (cc); + end_volta_span_->set_bound (RIGHT, ci); + } + + end_volta_span_ = 0; + + if (volta_span_ && !volta_span_->get_bound (LEFT)) { - typeset_grob (end_volta_span_); - end_volta_span_ =0; + Grob *cc = unsmob_grob (get_property ("currentCommandColumn")); + Item *ci = dynamic_cast (cc); + volta_span_->set_bound (LEFT, ci); } } /* TODO: should attach volta to paper-column if no bar is found. - */ - -ENTER_DESCRIPTION (Volta_engraver, -/* descr */ "Make volta brackets", -/* creats*/ "VoltaBracket", -/* accepts */ "", -/* acks */ "bar-line-interface staff-symbol-interface note-column-interface", -/* reads */ "repeatCommands voltaSpannerDuration stavesFound", -/* write */ ""); +*/ + +ADD_TRANSLATOR (Volta_engraver, + /* descr */ "Make volta brackets.", + /* creats*/ "VoltaBracket", + /* accepts */ "", + /* acks */ "bar-line-interface staff-symbol-interface note-column-interface", + /* reads */ "repeatCommands voltaSpannerDuration stavesFound", + /* write */ "");