X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpercent-repeat-engraver.cc;h=a27eef826b9163f94168cec7e6ea92d630adc49e;hb=b8f8b574e67eca24e4719ebb3100649cf5c3de08;hp=af00fa6f2c35aad83fd56095116dbe8175f9331d;hpb=a75654d172ef664caf56ed0e291648caf231a64d;p=lilypond.git diff --git a/lily/percent-repeat-engraver.cc b/lily/percent-repeat-engraver.cc index af00fa6f2c..a27eef826b 100644 --- a/lily/percent-repeat-engraver.cc +++ b/lily/percent-repeat-engraver.cc @@ -3,24 +3,31 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2005 Han-Wen Nienhuys + (c) 2000--2006 Han-Wen Nienhuys , Erik Sandberg */ #include "score-engraver.hh" -#include "repeated-music.hh" +#include "bar-line.hh" #include "global-context.hh" -#include "warn.hh" -#include "misc.hh" -#include "spanner.hh" +#include "international.hh" #include "item.hh" +#include "misc.hh" #include "percent-repeat-iterator.hh" -#include "bar-line.hh" +#include "repeated-music.hh" #include "side-position-interface.hh" +#include "spanner.hh" +#include "stream-event.hh" +#include "warn.hh" #include "translator.icc" +/* +* TODO: Create separate Double_percent_repeat_engraver? +* Or, at least move double percent handling to Slash_repeat_engraver +*/ + class Percent_repeat_engraver : public Engraver { void typeset_perc (); @@ -28,16 +35,11 @@ public: TRANSLATOR_DECLARATIONS (Percent_repeat_engraver); protected: - Music *repeat_; + Stream_event *percent_event_; - /// moment (global time) where beam started. - Moment start_mom_; + /// moment (global time) where percent started. Moment stop_mom_; - - /// location within measure where beam started. - Moment beam_start_location_; - Moment next_moment_; - Moment body_length_; + Moment start_mom_; enum Repeat_sign_type { @@ -47,19 +49,12 @@ protected: }; Repeat_sign_type repeat_sign_type_; - Item *double_percent_; - Item *double_percent_counter_; - Spanner *percent_; Spanner *percent_counter_; - Spanner *finished_percent_; - Spanner *finished_percent_counter_; - int count_; - int total_count_; protected: virtual void finalize (); - virtual bool try_music (Music *); + DECLARE_TRANSLATOR_LISTENER (percent); void stop_translation_timestep (); void start_translation_timestep (); @@ -71,141 +66,106 @@ Percent_repeat_engraver::Percent_repeat_engraver () percent_ = 0; percent_counter_ = 0; - finished_percent_ = 0; - finished_percent_counter_ = 0; - - double_percent_ = 0; - double_percent_counter_ = 0; - - repeat_ = 0; - count_ = 0; - total_count_ = 0; + percent_event_ = 0; } -bool -Percent_repeat_engraver::try_music (Music *m) +IMPLEMENT_TRANSLATOR_LISTENER (Percent_repeat_engraver, percent); +void +Percent_repeat_engraver::listen_percent (Stream_event *ev) { - if (m->is_mus_type ("repeated-music") - && m->get_property ("iterator-ctor") - == Percent_repeat_iterator::constructor_proc - && !repeat_) + if (!percent_event_) { - body_length_ = Repeated_music::body_get_length (m); - total_count_ = Repeated_music::repeat_count (m); - - Moment now = now_mom (); - start_mom_ = now; - stop_mom_ = start_mom_ + Moment (total_count_) * body_length_; - next_moment_ = start_mom_; - next_moment_ += body_length_; - + Moment body_length = get_event_length (ev); Moment meas_len (robust_scm2moment (get_property ("measureLength"), Moment (1))); - - if (meas_len == body_length_) + + if (meas_len == body_length) + { repeat_sign_type_ = MEASURE; - else if (Moment (2) * meas_len == body_length_) + start_mom_ = now_mom (); + stop_mom_ = now_mom () + body_length; + get_global_context ()->add_moment_to_process (stop_mom_); + } + else if (Moment (2) * meas_len == body_length) + { repeat_sign_type_ = DOUBLE_MEASURE; + start_mom_ = now_mom () + meas_len; + stop_mom_ = now_mom () + body_length; /* never used */ + get_global_context ()->add_moment_to_process (start_mom_); + } else - return false; - - - repeat_ = m; + return; - Global_context *global = get_global_context (); - for (int i = 1; i < total_count_; i++) - { - Moment m = next_moment_ + Moment (i) * body_length_; - global->add_moment_to_process (m); - - /* bars between % too. */ - if (repeat_sign_type_ == DOUBLE_MEASURE) - global->add_moment_to_process (m - meas_len); - } - - if (repeat_sign_type_ == DOUBLE_MEASURE) - next_moment_ += meas_len; - - count_ = 1; - return true; + percent_event_ = ev; } - - return false; } void Percent_repeat_engraver::process_music () { - if (repeat_ && now_mom () == next_moment_) + if (percent_event_ && now_mom ().main_part_ == start_mom_.main_part_) { - count_ ++; if (repeat_sign_type_ == MEASURE) { - finished_percent_ = percent_; - finished_percent_counter_ = percent_counter_; - - typeset_perc (); - percent_ = make_spanner ("PercentRepeat", repeat_->self_scm ()); + if (percent_) + typeset_perc (); + percent_ = make_spanner ("PercentRepeat", percent_event_->self_scm ()); Grob *col = unsmob_grob (get_property ("currentCommandColumn")); percent_->set_bound (LEFT, col); - if (total_count_ > 2 - && to_boolean (get_property ("countPercentRepeats"))) + SCM count = percent_event_->get_property ("repeat-count"); + if (count != SCM_EOL && to_boolean (get_property ("countPercentRepeats"))) { percent_counter_ - = make_spanner ("PercentRepeatCounter", repeat_->self_scm ()); - + = make_spanner ("PercentRepeatCounter", percent_event_->self_scm ()); - SCM text = scm_number_to_string (scm_from_int (count_), - scm_from_int (10)); + SCM text = scm_number_to_string (count, scm_from_int (10)); percent_counter_->set_property ("text", text); percent_counter_->set_bound (LEFT, col); Side_position_interface::add_support (percent_counter_, percent_); percent_counter_->set_parent (percent_, Y_AXIS); - } + } + else + percent_counter_ = 0; } else if (repeat_sign_type_ == DOUBLE_MEASURE) { - double_percent_ = make_item ("DoublePercentRepeat", repeat_->self_scm ()); + Item *double_percent = make_item ("DoublePercentRepeat", percent_event_->self_scm ()); - if (total_count_ > 2 + SCM count = percent_event_->get_property ("repeat-count"); + if (count != SCM_EOL && to_boolean (get_property ("countPercentRepeats"))) { - double_percent_counter_ - = make_item ("DoublePercentRepeatCounter", - repeat_->self_scm()); + Item *double_percent_counter = make_item ("DoublePercentRepeatCounter", + percent_event_->self_scm()); - SCM text = scm_number_to_string (scm_from_int (count_), + SCM text = scm_number_to_string (count, scm_from_int (10)); - double_percent_counter_->set_property ("text", text); + double_percent_counter->set_property ("text", text); - Side_position_interface::add_support (double_percent_counter_, - double_percent_); - double_percent_counter_->set_parent (double_percent_, Y_AXIS); - double_percent_counter_->set_parent (double_percent_, X_AXIS); + Side_position_interface::add_support (double_percent_counter, + double_percent); + double_percent_counter->set_parent (double_percent, Y_AXIS); + double_percent_counter->set_parent (double_percent, X_AXIS); } - /* - forbid breaks on a % line. Should forbid all breaks, really. + /* forbid breaks on a % line. Should forbid all breaks, really. */ + context ()->get_score_context ()->set_property ("forbidBreak", SCM_BOOL_T); - Ugh. Why can't this be regular communication between - contexts? - */ - get_score_engraver ()->forbid_breaks (); + /* No more processing needed. */ + repeat_sign_type_ = UNKNOWN; } - next_moment_ = next_moment_ + body_length_; } } void Percent_repeat_engraver::finalize () { - typeset_perc (); if (percent_) { - repeat_->origin ()->warning (_ ("unterminated percent repeat")); + percent_event_->origin ()->warning (_ ("unterminated percent repeat")); percent_->suicide (); percent_counter_->suicide(); } @@ -214,39 +174,27 @@ Percent_repeat_engraver::finalize () void Percent_repeat_engraver::typeset_perc () { - if (finished_percent_) + if (percent_) { Grob *col = unsmob_grob (get_property ("currentCommandColumn")); - finished_percent_->set_bound (RIGHT, col); - finished_percent_ = 0; + percent_->set_bound (RIGHT, col); + percent_ = 0; - if (finished_percent_counter_) - finished_percent_counter_->set_bound (RIGHT, col); - - finished_percent_counter_ = 0; + if (percent_counter_) + percent_counter_->set_bound (RIGHT, col); + percent_counter_ = 0; } - - double_percent_ = 0; - double_percent_counter_ = 0; } void Percent_repeat_engraver::start_translation_timestep () { - if (stop_mom_ == now_mom ()) + if (stop_mom_.main_part_ == now_mom ().main_part_) { if (percent_) - { - finished_percent_ = percent_; - finished_percent_counter_ = percent_counter_; - - typeset_perc (); - } - repeat_ = 0; - percent_ = 0; - - percent_counter_ = 0; + typeset_perc (); + percent_event_ = 0; repeat_sign_type_ = UNKNOWN; } } @@ -254,7 +202,6 @@ Percent_repeat_engraver::start_translation_timestep () void Percent_repeat_engraver::stop_translation_timestep () { - typeset_perc (); } ADD_TRANSLATOR (Percent_repeat_engraver, @@ -262,17 +209,19 @@ ADD_TRANSLATOR (Percent_repeat_engraver, "Make whole bar and double bar repeats.", /* create */ - "PercentRepeat " "DoublePercentRepeat " - "PercentRepeatCounter " - "DoublePercentRepeatCounter", + "DoublePercentRepeatCounter " + "PercentRepeat " + "PercentRepeatCounter ", /* accept */ - "repeated-music", + "percent-event ", /* read */ - "measureLength " + "countPercentRepeats " "currentCommandColumn " - "countPercentRepeats", + "measureLength ", - /* write */ ""); + /* write */ + "forbidBreak " + );