source file of the GNU LilyPond music typesetter
- (c) 2005--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ (c) 2005--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
*/
#include "system.hh"
#include "staff-spacing.hh"
#include "note-spacing.hh"
#include "spacing-spanner.hh"
-
+#include "warn.hh"
#include "moment.hh"
+#include "spacing-options.hh"
/* Find the loose columns in POSNS, and drape them around the columns
specified in BETWEEN-COLS. */
loose = right = re->get_column ();
}
- if (!right->get_system ())
+ if (right->get_system ())
+ ; /* do nothing */
+ else if (right->find_prebroken_piece (LEFT)
+ && right->find_prebroken_piece (LEFT)->get_system () == which)
right = right->find_prebroken_piece (LEFT);
+ else if (Paper_column::get_rank (which->get_bound (RIGHT)) < Paper_column::get_rank (right))
+
+ right = which->get_bound (RIGHT);
+ else
+ {
+ clique.back ()->programming_error ("Loose column does not have right side to attach to.");
+ System *base_system = dynamic_cast<System*> (which->original ());
+ int j = Paper_column::get_rank (clique.back ()) + 1;
+ int end_rank = Paper_column::get_rank (which->get_bound (RIGHT));
+ extract_grob_set (base_system, "columns", base_cols);
+ for (; j < end_rank; j++)
+ {
+ if (base_cols[j]->get_system () == which)
+ right = dynamic_cast<Item*> ((Grob*)base_cols[j]);
+ }
+ }
+
+ if (!right)
+ {
+ programming_error ("Can't attach loose column sensibly. Attaching to end of system.");
+ right = which->get_bound (RIGHT);
+ }
Grob *common = right->common_refpoint (left, X_AXIS);
clique.push_back (right);
vector<Real> clique_spacing;
clique_spacing.push_back (0.0);
- for (vsize j = 1; j < clique.size () - 1; j ++)
+ for (vsize j = 1; j + 1 < clique.size (); j ++)
{
Grob *clique_col = clique[j];
Paper_column *loose_col = dynamic_cast<Paper_column *> (clique[j]);
- Paper_column *last_col = dynamic_cast<Paper_column *> (clique[j-1]);
+ Paper_column *next_col = dynamic_cast<Paper_column *> (clique[j + 1]);
Grob *spacing = unsmob_grob (clique_col->get_object ("spacing"));
if (Grob *grace_spacing = unsmob_grob (clique_col->get_object ("grace-spacing")))
}
Spacing_options options;
- options.init_from_grob (spacing);
+ if (spacing)
+ options.init_from_grob (spacing);
+ else
+ programming_error ("Column without spacing object");
- bool expand_only = false;
Real base_note_space = 0.0;
- if (Paper_column::is_musical (last_col)
+ if (Paper_column::is_musical (next_col)
&& Paper_column::is_musical (loose_col))
- base_note_space = Spacing_spanner::note_spacing (spacing, last_col, loose_col,
- &options, &expand_only);
+ base_note_space = Spacing_spanner::note_spacing (spacing, loose_col, next_col,
+ &options);
else
{
- Real fixed, space;
-
- Spacing_spanner::standard_breakable_column_spacing (spacing, last_col,
- loose_col, &fixed, &space,
- &options);
+ Spring spring = Spacing_spanner::standard_breakable_column_spacing (spacing,
+ loose_col, next_col,
+ &options);
- base_note_space = space;
+ base_note_space = spring.distance ();
}
base_note_space = max (base_note_space,
- robust_relative_extent (last_col, last_col, X_AXIS)[RIGHT]
- - robust_relative_extent (loose_col, loose_col, X_AXIS)[LEFT]);
+ robust_relative_extent (loose_col, loose_col, X_AXIS)[RIGHT]
+ - robust_relative_extent (next_col, next_col, X_AXIS)[LEFT]);
clique_spacing.push_back (base_note_space);
}