diff options
author | Mike Solomon <mike@apollinemike.com> | 2011-11-10 02:19:13 +0100 |
---|---|---|
committer | Mike Solomon <mike@apollinemike.com> | 2011-11-10 02:19:13 +0100 |
commit | 96f03c80a17fb0f6971ef695a77d134eb938e42a (patch) | |
tree | c56bb40784bdfe54aefb6b4e2c7141980a0b8b40 /lily/spanner.cc | |
parent | 408475516f7db93450e45c7e1b4a2660a4fa96c0 (diff) |
Standardizes X extents of beams across beam calculations.
This code makes sure that the same X extent is used for all beam
calculations via the X-positions property, including in spanner_length.
Diffstat (limited to 'lily/spanner.cc')
-rw-r--r-- | lily/spanner.cc | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/lily/spanner.cc b/lily/spanner.cc index 822a7203aa..ba44e83e19 100644 --- a/lily/spanner.cc +++ b/lily/spanner.cc @@ -233,22 +233,39 @@ Spanner::Spanner (Spanner const &s) pure_property_cache_ = SCM_UNDEFINED; } +/* + Certain spanners have pre-computed X values that lie either in + X-positions or the X key of the alists returned for left-bound-info + and right-bound-info. These are calculated to give the real length + of a spanner (which, because of various padding or overhang properties, + can extend pass or arrive short of a given bound). If possible, we + use these to calculate the spanner's length, and otherwise, we use + the bound. + + For those writing a new spanner, DO NOT use both X-positions and + left-bound-info/right-bound-info. +*/ Real Spanner::spanner_length () const { - Interval lr; + Interval lr = robust_scm2interval (get_property ("X-positions"), + Interval (1,-1)); - Drul_array<SCM> bounds (get_property ("left-bound-info"), - get_property ("right-bound-info")); + if (lr.is_empty ()) + { + 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"), + Direction d = LEFT; + do + lr[d] = robust_scm2double (ly_assoc_get (ly_symbol2scm ("X"), bounds[d], SCM_BOOL_F), -d); - while (flip (&d) != LEFT); + while (flip (&d) != LEFT); + } if (lr.is_empty ()) { + Direction d = LEFT; do lr[d] = spanned_drul_[d]->relative_coordinate (0, X_AXIS); while (flip (&d) != LEFT); |