From: Neil Puttock <n.puttock@gmail.com>
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 */
 		""