X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fspanner.cc;h=92cb9cdf14b102875d0977938f862197ef828a58;hb=313d8aee251fb0aa89dfc3b23abeb869fdd1355a;hp=822a7203aa427d62d92cdc93e66497a7dd4a2746;hpb=4a401ca1c60f428daa242dbdd102fdb3f327ebfb;p=lilypond.git diff --git a/lily/spanner.cc b/lily/spanner.cc index 822a7203aa..92cb9cdf14 100644 --- a/lily/spanner.cc +++ b/lily/spanner.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2011 Han-Wen Nienhuys + Copyright (C) 1996--2012 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -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 bounds (get_property ("left-bound-info"), - get_property ("right-bound-info")); + if (lr.is_empty ()) + { + 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); + 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 ()) { + Direction d = LEFT; do lr[d] = spanned_drul_[d]->relative_coordinate (0, X_AXIS); while (flip (&d) != LEFT);