X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fspanner.cc;h=18a7e645f524bffc80adb2a2fab35709161c927b;hb=d959f8d548dc073c162c4599cfef2a596f9b66db;hp=1f77c8e2572a4a408cc9686f017fd029960976ba;hpb=2aa1d6f450a7f051aa4b0ddcaf89593f7ff23a60;p=lilypond.git diff --git a/lily/spanner.cc b/lily/spanner.cc index 1f77c8e257..18a7e645f5 100644 --- a/lily/spanner.cc +++ b/lily/spanner.cc @@ -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 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 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 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 " );