/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 1996--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ Copyright (C) 1996--2012 Han-Wen Nienhuys <hanwen@xs4all.nl>
LilyPond is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
/*
If we have a spanner spanning one column, we must break it
anyway because it might provide a parent for another item. */
- Direction d = LEFT;
- do
+ for (LEFT_and_RIGHT (d))
{
Item *bound = left->find_prebroken_piece (d);
if (!bound)
broken_intos_.push_back (span);
}
}
- while ((flip (&d)) != LEFT);
}
else
{
Drul_array<Item *> bounds;
bounds[LEFT] = break_points[i - 1];
bounds[RIGHT] = break_points[i];
- Direction d = LEFT;
- do
+ for (LEFT_and_RIGHT (d))
{
if (!bounds[d]->get_system ())
bounds[d] = bounds[d]->find_prebroken_piece (- d);
}
- while ((flip (&d)) != LEFT);
if (!bounds[LEFT] || ! bounds[RIGHT])
{
void
Spanner::set_my_columns ()
{
- Direction i = (Direction) LEFT;
- do
+ for (LEFT_and_RIGHT (d))
{
- if (!spanned_drul_[i]->get_system ())
- set_bound (i, spanned_drul_[i]->find_prebroken_piece ((Direction) - i));
+ if (!spanned_drul_[d]->get_system ())
+ set_bound (d, spanned_drul_[d]->find_prebroken_piece ((Direction) - d));
}
- while (flip (&i) != LEFT);
}
Interval_t<int>
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"),
- bounds[d], SCM_BOOL_F), -d);
- while (flip (&d) != LEFT);
+ for (LEFT_and_RIGHT (d))
+ lr[d] = robust_scm2double (ly_assoc_get (ly_symbol2scm ("X"),
+ bounds[d], SCM_BOOL_F), -d);
+ }
if (lr.is_empty ())
{
- do
+ for (LEFT_and_RIGHT (d))
lr[d] = spanned_drul_[d]->relative_coordinate (0, X_AXIS);
- while (flip (&d) != LEFT);
}
if (lr.is_empty ())
{
scm_gc_mark (pure_property_cache_);
- Direction d = LEFT;
- do
+ for (LEFT_and_RIGHT (d))
if (spanned_drul_[d])
scm_gc_mark (spanned_drul_[d]->self_scm ());
- while (flip (&d) != LEFT)
;
for (vsize i = broken_intos_.size (); i--;)