X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmulti-measure-rest-engraver.cc;h=609cf8c72058ec5d5d0026f2a6dc108215ed03b4;hb=refs%2Ftags%2Frelease%2F1.3.10;hp=d72da1d4f0e545863f2bb217a95893583c893c09;hpb=31653bf1d61a33ef8bc8c871d60c6b3452d04d28;p=lilypond.git diff --git a/lily/multi-measure-rest-engraver.cc b/lily/multi-measure-rest-engraver.cc index d72da1d4f0..609cf8c720 100644 --- a/lily/multi-measure-rest-engraver.cc +++ b/lily/multi-measure-rest-engraver.cc @@ -1,7 +1,7 @@ /* multi_measure_rest-engraver.cc -- implement Multi_measure_rest_engraver - (c) 1998 Jan Nieuwenhuizen + (c) 1998--1999 Jan Nieuwenhuizen Han-Wen Nienhuys */ @@ -10,36 +10,61 @@ #include "multi-measure-rest.hh" #include "multi-measure-rest-engraver.hh" #include "score-column.hh" -#include "time-description.hh" +#include "engraver-group-engraver.hh" +#include "timing-translator.hh" +#include "bar.hh" + -IMPLEMENT_IS_TYPE_B1 (Multi_measure_rest_engraver, Engraver); ADD_THIS_TRANSLATOR (Multi_measure_rest_engraver); Multi_measure_rest_engraver::Multi_measure_rest_engraver () { start_measure_i_ = 0; - rest_item_creation_mom_ = rest_req_stop_mom_ =0; + rest_moments_[START] = + rest_moments_[STOP] =0; multi_measure_req_l_ = 0; + + lastrest_p_ =0; mmrest_p_ = 0; } +void +Multi_measure_rest_engraver::acknowledge_element (Score_element_info i) +{ + if (Bar *c = dynamic_cast (i.elem_l_)) + { + if (mmrest_p_) + mmrest_p_->add_column (c); + if (lastrest_p_) + lastrest_p_->add_column (c); + } +} + bool -Multi_measure_rest_engraver::do_try_request (Request* req_l) +Multi_measure_rest_engraver::do_try_music (Music* req_l) { - if (Multi_measure_rest_req *mr = dynamic_cast (req_l)) - { - if (multi_measure_req_l_) - if (!multi_measure_req_l_->equal_b (req_l) - || req_start_mom_ != now_moment ()) - return false; - - multi_measure_req_l_ = mr; - req_start_mom_ = now_moment (); - - rest_req_stop_mom_ = req_start_mom_ + multi_measure_req_l_->duration_.length (); - return true; - } - return false; + Rhythmic_req *r=0; + if (Multi_measure_rest_req *mr = + dynamic_cast (req_l)) + r=mr; + else if (Repetitions_req *rr = + dynamic_cast (req_l)) + r=rr; + if (r) + { + if (multi_measure_req_l_) + if (!multi_measure_req_l_->equal_b (r) + || rest_moments_[START] != now_mom ()) + return false; + + multi_measure_req_l_ = r; + rest_moments_[START] = now_mom (); + + rest_moments_[STOP] = rest_moments_[START] + + multi_measure_req_l_->duration_.length_mom (); + return true; + } + return false; } void @@ -47,36 +72,63 @@ Multi_measure_rest_engraver::do_process_requests () { if (multi_measure_req_l_ && !mmrest_p_) { - Time_description const *time = get_staff_info().time_C_; + + Translator * tr = daddy_grav_l()->get_simple_translator ("Timing_engraver"); // ugh + Timing_translator * time = dynamic_cast (tr); + mmrest_p_ = new Multi_measure_rest; - rest_item_creation_mom_ = time->when_mom (); + if(dynamic_cast (multi_measure_req_l_)) + mmrest_p_->set_elt_property ("alt-symbol", + ly_str02scm ("scripts-repeatsign")); announce_element (Score_element_info (mmrest_p_, multi_measure_req_l_)); - start_measure_i_ = time->bars_i_; + start_measure_i_ = time->bars_i (); } } void Multi_measure_rest_engraver::do_pre_move_processing () { - Moment now (now_moment ()); - if (mmrest_p_ && rest_item_creation_mom_ == now) + Moment now (now_mom ()); + Translator * tr = daddy_grav_l()->get_simple_translator ("Timing_engraver"); // ugh + Timing_translator * time = dynamic_cast (tr); + + + if (mmrest_p_ && (now >= rest_moments_[START]) + && !time->measure_position () + && (scm_ilength (mmrest_p_->get_elt_property ("columns")) >= 2)) { typeset_element (mmrest_p_); + /* + must keep mmrest_p_ around to set measures_i_ + */ + } + if (lastrest_p_) + { + typeset_element (lastrest_p_); + lastrest_p_ = 0; } } void Multi_measure_rest_engraver::do_post_move_processing () { - Time_description const *time = get_staff_info().time_C_; - Moment now (now_moment ()); - if (rest_req_stop_mom_ <= now) - multi_measure_req_l_ = 0; + Translator * tr = daddy_grav_l()->get_simple_translator ("Timing_engraver"); // ugh + Timing_translator * time = dynamic_cast (tr); + + Moment now (now_mom ()); - if (mmrest_p_ && (!time->whole_in_measure_ || !multi_measure_req_l_)) + if (mmrest_p_ && !time->measure_position ()) { - assert (rest_item_creation_mom_ < now); - mmrest_p_->measures_i_ = time->bars_i_ - start_measure_i_; + lastrest_p_ = mmrest_p_; + lastrest_p_->measures_i_ = time->bars_i () - start_measure_i_; + mmrest_p_ = 0; + } + + if (now >= rest_moments_[STOP]) + { + multi_measure_req_l_ = 0; mmrest_p_ = 0; } } + +