X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpercent-repeat-engraver.cc;h=7e0bec50e1b68d60b442f6d221efbca1fdecaa5c;hb=332da9f4d25f9f63a3222efc87fae06b0c7abbdd;hp=f818eb9e33398fbf029f4829546c28e6e3bd15b7;hpb=d9b43b93f2c885409bafdb157138158f65cc49aa;p=lilypond.git diff --git a/lily/percent-repeat-engraver.cc b/lily/percent-repeat-engraver.cc index f818eb9e33..7e0bec50e1 100644 --- a/lily/percent-repeat-engraver.cc +++ b/lily/percent-repeat-engraver.cc @@ -3,23 +3,19 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2002 Han-Wen Nienhuys + (c) 2000--2004 Han-Wen Nienhuys */ -#include "engraver.hh" #include "repeated-music.hh" -#include "engraver-group-engraver.hh" -#include "global-translator.hh" +#include "global-context.hh" #include "warn.hh" #include "misc.hh" #include "spanner.hh" #include "item.hh" #include "percent-repeat-iterator.hh" -#include "bar.hh" - +#include "bar-line.hh" #include "score-engraver.hh" -#include "translator-group.hh" /** This acknowledges repeated music with "percent" style. It typesets @@ -36,7 +32,7 @@ class Percent_repeat_engraver : public Engraver { void typeset_perc (); public: - TRANSLATOR_DECLARATIONS(Percent_repeat_engraver); + TRANSLATOR_DECLARATIONS (Percent_repeat_engraver); protected: Repeated_music * repeat_; @@ -51,16 +47,13 @@ protected: enum { UNKNOWN, - BEAT, MEASURE, DOUBLE_MEASURE, } repeat_sign_type_ ; - Item * beat_slash_; Item * double_percent_; - Spanner * perc_p_; - Spanner * finished_perc_p_; - Item * stem_tremolo_; + Spanner * perc_; + Spanner * finished_perc_; protected: virtual void finalize (); virtual bool try_music (Music*); @@ -71,11 +64,10 @@ protected: Percent_repeat_engraver::Percent_repeat_engraver () { - perc_p_ = finished_perc_p_ = 0; - repeat_ =0; - stem_tremolo_ = 0; + perc_ = 0; + finished_perc_ = 0; + repeat_ = 0; - beat_slash_ = 0; double_percent_ = 0; } @@ -84,11 +76,11 @@ Percent_repeat_engraver::try_music (Music * m) { Repeated_music * rp = dynamic_cast (m); if (rp - && rp->get_mus_property ("iterator-ctor") - == Percent_repeat_iterator::constructor_cxx_function + && rp->get_property ("iterator-ctor") + == Percent_repeat_iterator::constructor_proc && !repeat_) { - body_length_ = rp->body_length_mom (); + body_length_ = rp->body_get_length (); int count = rp->repeat_count (); Moment now = now_mom (); @@ -96,15 +88,8 @@ Percent_repeat_engraver::try_music (Music * m) stop_mom_ = start_mom_ + Moment (count) * body_length_; next_moment_ = start_mom_ + body_length_; - SCM m = get_property ("measureLength"); - Moment meas_len; - if (unsmob_moment (m)) - meas_len = *unsmob_moment (m); - - if (body_length_ < meas_len && - meas_len.main_part_.mod_rat (body_length_.main_part_) == Moment (Rational (0,0))) - repeat_sign_type_ = BEAT; - else if (meas_len == body_length_) + Moment meas_len (robust_scm2moment (get_property ("measureLength"), Moment (1))); + if (meas_len == body_length_) repeat_sign_type_ = MEASURE; else if (Moment (2)* meas_len == body_length_) { @@ -120,17 +105,18 @@ Percent_repeat_engraver::try_music (Music * m) repeat_ = rp; - Global_translator *global_l =0; - Translator *t = this; - do + Global_context *global = get_global_context (); + for (int i = 0; i < count; i++) { - t = t->daddy_trans_l_ ; - global_l = dynamic_cast (t); + global->add_moment_to_process (next_moment_ + Moment (i) * body_length_); + + /* + bars between % too. + */ + if (repeat_sign_type_ == DOUBLE_MEASURE) + global->add_moment_to_process (next_moment_ + meas_len + Moment (i) * body_length_); + } - while (!global_l); - - for (int i = 0; i < count; i++) - global_l->add_moment_to_process (now + Moment (1+i) * body_length_); return true; } @@ -143,33 +129,26 @@ Percent_repeat_engraver::process_music () { if (repeat_ && now_mom () == next_moment_) { - if (repeat_sign_type_ == BEAT) - { - beat_slash_ = new Item (get_property ("RepeatSlash")); - announce_grob (beat_slash_, repeat_); - } - else if (repeat_sign_type_ == MEASURE) + if (repeat_sign_type_ == MEASURE) { - finished_perc_p_ = perc_p_; + finished_perc_ = perc_; typeset_perc (); - perc_p_ = new Spanner (get_property ("PercentRepeat")); - SCM col =get_property ("currentCommandColumn"); - perc_p_->set_bound (LEFT, unsmob_grob (col)); - announce_grob (perc_p_, repeat_); + perc_ = make_spanner ("PercentRepeat", repeat_->self_scm ()); + SCM col = get_property ("currentCommandColumn"); + perc_->set_bound (LEFT, unsmob_grob (col)); } else if (repeat_sign_type_ == DOUBLE_MEASURE) - { - double_percent_ = new Item (get_property ("DoublePercentRepeat")); - announce_grob (double_percent_, repeat_); - + double_percent_ = make_item ("DoublePercentRepeat", repeat_->self_scm ()); /* forbid breaks on a % line. Should forbid all breaks, really. */ - top_engraver()->forbid_breaks (); // guh. Use properties! + get_score_engraver ()->forbid_breaks (); // guh. Use properties! } next_moment_ = next_moment_ + body_length_; + + get_global_context ()->add_moment_to_process (next_moment_); } } @@ -177,35 +156,24 @@ void Percent_repeat_engraver::finalize () { typeset_perc (); - if (perc_p_) + if (perc_) { - repeat_->origin ()->warning (_ ("unterminated chord tremolo")); - perc_p_->suicide (); + repeat_->origin ()->warning (_ ("unterminated percent repeat")); + perc_->suicide (); } } void Percent_repeat_engraver::typeset_perc () { - if (finished_perc_p_) - { - SCM col =get_property ("currentCommandColumn"); - finished_perc_p_->set_bound (RIGHT, unsmob_grob (col)); - typeset_grob (finished_perc_p_); - finished_perc_p_ = 0; - } - - if (beat_slash_) + if (finished_perc_) { - typeset_grob (beat_slash_); - beat_slash_ = 0; + SCM col = get_property ("currentCommandColumn"); + finished_perc_->set_bound (RIGHT, unsmob_grob (col)); + finished_perc_ = 0; } - if (double_percent_) - { - typeset_grob (double_percent_); - double_percent_ = 0; - } + double_percent_ = 0; } @@ -216,13 +184,13 @@ Percent_repeat_engraver::start_translation_timestep () { if (stop_mom_ == now_mom ()) { - if (perc_p_) + if (perc_) { - finished_perc_p_ = perc_p_; + finished_perc_ = perc_; typeset_perc (); } repeat_ = 0; - perc_p_ = 0; + perc_ = 0; repeat_sign_type_ = UNKNOWN; } } @@ -237,9 +205,10 @@ Percent_repeat_engraver::stop_translation_timestep () -ENTER_DESCRIPTION(Percent_repeat_engraver, -/* descr */ "Make beat, whole bar and double bar repeats.", -/* creats*/ "PercentRepeat RepeatSlash DoublePercentRepeat", -/* acks */ "", +ENTER_DESCRIPTION (Percent_repeat_engraver, +/* descr */ "Make whole bar and double bar repeats.", +/* creats*/ "PercentRepeat DoublePercentRepeat", +/* accepts */ "repeated-music", +/* acks */ "", /* reads */ "measureLength currentCommandColumn", /* write */ "");