summaryrefslogtreecommitdiff
path: root/lily/spanner.cc
diff options
context:
space:
mode:
authorMike Solomon <mike@apollinemike.com>2011-11-10 02:19:13 +0100
committerMike Solomon <mike@apollinemike.com>2011-11-10 02:19:13 +0100
commit96f03c80a17fb0f6971ef695a77d134eb938e42a (patch)
treec56bb40784bdfe54aefb6b4e2c7141980a0b8b40 /lily/spanner.cc
parent408475516f7db93450e45c7e1b4a2660a4fa96c0 (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.cc31
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);