X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fvolta-engraver.cc;h=9fe3ee9bb22a314071e668b592111bd4bf59705c;hb=32b02b2642bd132a548afc163c28667aff074829;hp=e95718b12156e896dcb099de6bea87095dd9e991;hpb=5bda59b7c7c09e4418872f1f40b9f7ae219ff5fc;p=lilypond.git diff --git a/lily/volta-engraver.cc b/lily/volta-engraver.cc index e95718b121..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--2003 Han-Wen Nienhuys - - */ + + (c) 2000--2005 Han-Wen Nienhuys +*/ #include "engraver.hh" -#include "translator-group.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,24 +18,25 @@ /* Create Volta spanners, by reading repeatCommands property, usually set by Unfolded_repeat_iterator. - */ +*/ class Volta_engraver : public Engraver { public: - TRANSLATOR_DECLARATIONS(Volta_engraver); + TRANSLATOR_DECLARATIONS (Volta_engraver); protected: virtual void acknowledge_grob (Grob_info); virtual void finalize (); virtual void stop_translation_timestep (); virtual void process_music (); - virtual void process_acknowledged_grobs (); - + Moment started_mom_; Spanner *volta_span_; Spanner *end_volta_span_; SCM staff_; SCM start_string_; + + bool staff_eligible (); }; Volta_engraver::Volta_engraver () @@ -47,67 +46,88 @@ Volta_engraver::Volta_engraver () end_volta_span_ = 0; } - -void -Volta_engraver::process_music () +/* + 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 () { - if (unsmob_grob (staff_) - && !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 (!gh_pair_p (staffs)) - programming_error ("Huh? Volta engraver can't find staffs?"); - else if (ly_car (scm_last_pair (staffs)) != staff_) - return ; + 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; +} + +void +Volta_engraver::process_music () +{ SCM cs = get_property ("repeatCommands"); - bool end = false; + if (!staff_eligible ()) + return; + + bool end = false; start_string_ = SCM_EOL; - while (gh_pair_p (cs)) + while (scm_is_pair (cs)) { - SCM c = ly_car (cs); + SCM c = scm_car (cs); - if (gh_pair_p (c) - && ly_car (c) == ly_symbol2scm ("volta") - && gh_pair_p (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. @@ -115,59 +135,51 @@ Volta_engraver::process_music () else if (end) { end_volta_span_ = volta_span_; - volta_span_ =0; + volta_span_ = 0; } - if (volta_span_ && - (gh_string_p (start_string_) || gh_pair_p (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; } -} -/* - this could just as well be done in process_music (), but what the hack. - */ -void -Volta_engraver::process_acknowledged_grobs () -{ - if (!volta_span_ && - (gh_string_p (start_string_) || gh_pair_p (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_ = new Spanner (get_property ("VoltaBracket")); + volta_span_ = make_spanner ("VoltaBracket", SCM_EOL); - announce_grob (volta_span_, SCM_EOL); - volta_span_->set_grob_property ("text", start_string_); + 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_)) @@ -179,43 +191,56 @@ Volta_engraver::acknowledge_grob (Grob_info i) staff_ = SCM_UNDEFINED; if (staff_ != SCM_UNDEFINED) - staff_ = i.grob_->self_scm(); + staff_ = i.grob_->self_scm (); } } void Volta_engraver::finalize () { - if (volta_span_) +} + +void +Volta_engraver::stop_translation_timestep () +{ + if (volta_span_ && !staff_eligible ()) { - typeset_grob (volta_span_); + /* + THIS IS A KLUDGE. + + we need to do this here, because STAFF_ is not initialized yet + in the 1st call of process_music () + */ + + volta_span_->suicide (); + volta_span_ = 0; } - if (end_volta_span_) + + if (end_volta_span_ && !end_volta_span_->get_bound (RIGHT)) { - typeset_grob (end_volta_span_); + Grob *cc = unsmob_grob (get_property ("currentCommandColumn")); + Item *ci = dynamic_cast (cc); + end_volta_span_->set_bound (RIGHT, ci); } -} - + end_volta_span_ = 0; -void -Volta_engraver::stop_translation_timestep () -{ - if (end_volta_span_) + 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 */ "");