From: Neil Puttock Date: Sat, 11 Apr 2009 12:15:08 +0000 (+0100) Subject: Fix #670: Chained trills X-Git-Tag: release/2.12.3-1~136 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=d8a4403504782d5532c685cae0c77fa93e3a93f6;p=lilypond.git Fix #670: Chained trills - if trill spanner isn't stopped using \stopTrillSpan, make next start-span right bound. - for trill spans on last note of final system, don't end on final musical column, since it will extend beyond the last breakable column. (cherry picked from commit 3b6df457322096b87cf6af599cf2c6e04989e94d) --- diff --git a/input/regression/trill-spanner-auto-stop.ly b/input/regression/trill-spanner-auto-stop.ly new file mode 100644 index 0000000000..cda0cc23a2 --- /dev/null +++ b/input/regression/trill-spanner-auto-stop.ly @@ -0,0 +1,15 @@ +\version "2.13.1" +\header { + texidoc = "Consecutive trill spans work without explicit +@code{\\stopTrillSpan} commands, since successive trill spanners +will automatically become the right bound of the previous trill. +" +} + +\paper { ragged-right = ##f } + +\relative c'' { + c1\startTrillSpan + c1\startTrillSpan + c2\stopTrillSpan r +} diff --git a/input/regression/trill-spanner-chained.ly b/input/regression/trill-spanner-chained.ly new file mode 100644 index 0000000000..3e756ce38d --- /dev/null +++ b/input/regression/trill-spanner-chained.ly @@ -0,0 +1,20 @@ +\version "2.13.1" +\header { + texidoc = "Chained trills end at the next trill or barline. +Collisions can be prevented by overriding @code{bound-details}. +" +} + +\paper { ragged-right = ##f } + +\relative c'' { + g8 f\startTrillSpan ~ + f8 g\stopTrillSpan \startTrillSpan ~ + g8 r\stopTrillSpan r4 + \once \override TrillSpanner #'to-barline = ##t + c1\startTrillSpan ~ + c1 + \once \override TrillSpanner #'(bound-details right padding) = #1.2 + c1\stopTrillSpan \startTrillSpan + c1\stopTrillSpan\startTrillSpan +} diff --git a/lily/trill-spanner-engraver.cc b/lily/trill-spanner-engraver.cc index 513a2ae605..94554b790b 100644 --- a/lily/trill-spanner-engraver.cc +++ b/lily/trill-spanner-engraver.cc @@ -49,8 +49,7 @@ Trill_spanner_engraver::Trill_spanner_engraver () finished_ = 0; current_event_ = 0; span_ = 0; - event_drul_[START] = 0; - event_drul_[STOP] = 0; + event_drul_.set (0, 0); } IMPLEMENT_TRANSLATOR_LISTENER (Trill_spanner_engraver, trill_span); @@ -64,45 +63,43 @@ Trill_spanner_engraver::listen_trill_span (Stream_event *ev) void Trill_spanner_engraver::acknowledge_note_column (Grob_info info) { - if (span_) { - Pointer_group_interface::add_grob (span_, - ly_symbol2scm ("note-columns"), - info.grob()); - add_bound_item (span_, info.grob ()); - } else if (finished_) { - Pointer_group_interface::add_grob (finished_, ly_symbol2scm ("note-columns"), - info.grob()); - add_bound_item (finished_, info.grob ()); - } + if (span_) + { + Pointer_group_interface::add_grob (span_, + ly_symbol2scm ("note-columns"), + info.grob()); + if (!span_->get_bound (LEFT)) + add_bound_item (span_, info.grob ()); + } + else if (finished_) + { + Pointer_group_interface::add_grob (finished_, ly_symbol2scm ("note-columns"), + info.grob()); + if (!finished_->get_bound (RIGHT)) + add_bound_item (finished_, info.grob ()); + } } void Trill_spanner_engraver::process_music () { - if (event_drul_[STOP]) + if (span_ + && (event_drul_[STOP] || event_drul_[START])) { - if (!span_) - event_drul_[STOP]->origin ()->warning (_ ("cannot find start of trill spanner")); - else - { - finished_ = span_; - announce_end_grob (finished_, SCM_EOL); - span_ = 0; - current_event_ = 0; - } + Stream_event *ender = event_drul_[STOP]; + if (!ender) + ender = event_drul_[START]; + finished_ = span_; + announce_end_grob (finished_, ender->self_scm ()); + span_ = 0; + current_event_ = 0; } if (event_drul_[START]) { - if (current_event_) - event_drul_[START]->origin ()->warning (_ ("already have a trill spanner")); - else - { - current_event_ = event_drul_[START]; - span_ = make_spanner ("TrillSpanner", event_drul_[START]->self_scm ()); - Side_position_interface::set_axis (span_, Y_AXIS); - event_drul_[START] = 0; - } + current_event_ = event_drul_[START]; + span_ = make_spanner ("TrillSpanner", event_drul_[START]->self_scm ()); + Side_position_interface::set_axis (span_, Y_AXIS); } } @@ -130,8 +127,7 @@ Trill_spanner_engraver::stop_translation_timestep () } typeset_all (); - event_drul_[START] = 0; - event_drul_[STOP] = 0; + event_drul_.set (0, 0); } void @@ -140,8 +136,8 @@ Trill_spanner_engraver::finalize () typeset_all (); if (span_) { - finished_ = span_; - typeset_all (); + Grob *e = unsmob_grob (get_property ("currentCommandColumn")); + span_->set_bound (RIGHT, e); } } @@ -155,7 +151,8 @@ ADD_TRANSLATOR (Trill_spanner_engraver, "TrillSpanner ", /* read */ - "", + "currentCommandColumn " + "currentMusicalColumn ", /* write */ ""