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 *
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
--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;
}