]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/spanner.cc
Fix 1111: Break dynamic line spanner if different direction is explicitly given
[lilypond.git] / lily / spanner.cc
index 1f77c8e2572a4a408cc9686f017fd029960976ba..18a7e645f524bffc80adb2a2fab35709161c927b 100644 (file)
@@ -239,13 +239,28 @@ Spanner::Spanner (Spanner const &s)
 Real
 Spanner::spanner_length () const
 {
-  Real l = spanned_drul_[LEFT]->relative_coordinate (0, X_AXIS);
-  Real r = spanned_drul_[RIGHT]->relative_coordinate (0, X_AXIS);
+  Interval lr;
 
-  if (r < l)
+  Drul_array<SCM> bounds (get_property ("left-bound-info"),
+                          get_property ("right-bound-info"));
+
+  Direction d =  LEFT;
+  do
+    lr[d] = robust_scm2double (ly_assoc_get (ly_symbol2scm ("X"),
+                                             bounds[d], SCM_BOOL_F), -d);
+  while (flip (&d) != LEFT);
+
+  if (lr.is_empty ())
+    {
+      do
+        lr[d] = spanned_drul_[d]->relative_coordinate (0, X_AXIS);
+      while (flip (&d) != LEFT);
+    }
+
+  if (lr.is_empty ())
     programming_error ("spanner with negative length");
 
-  return r - l;
+  return lr.length ();
 }
 
 System *
@@ -472,7 +487,6 @@ SCM
 Spanner::kill_zero_spanned_time (SCM grob)
 {
   Spanner *me = unsmob_spanner (grob);
-  Interval_t<Moment> moments = me->spanned_time ();
   /*
     Remove the line or hairpin at the start of the line.  For
     piano voice indicators, it makes no sense to have them at
@@ -488,9 +502,13 @@ Spanner::kill_zero_spanned_time (SCM grob)
     --hwn.
 
   */
-  moments [LEFT].grace_part_ = 0;
-  if (moments.length () == Moment (0, 0))
-    me->suicide ();
+  if (me->get_bound (LEFT)->break_status_dir ())
+    {
+      Interval_t<Moment> moments = me->spanned_time ();
+      moments [LEFT].grace_part_ = 0;
+      if (moments.length () == Moment (0, 0))
+        me->suicide ();
+    }
 
   return SCM_UNSPECIFIED;
 }
@@ -529,5 +547,7 @@ ADD_INTERFACE (Spanner,
               /* properties */
               "normalized-endpoints "
               "minimum-length "
+               "spanner-broken "
+               "spanner-id "
               "to-barline "
               );