/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 2000--2010 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ Copyright (C) 2000--2011 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
return internal_get_minimum_translations (me, all_grobs, a, false, false, 0, 0);
}
-// If include_fixed_spacing is true, the manually fixed spacings
-// induced by stretchable=0 or alignment-distances are included
-// in the minimum translations here. If you want to find the minimum
-// height of a system, include_fixed_spacing should be true. If you
-// want to actually lay out the page, then it should be false (or
-// else centered dynamics will break when there is a fixed alignment).
+// If include_fixed_spacing is false, the only constraints that will be measured
+// here are those that result from collisions (+ padding). That is, all
+// minimum-distances, line-break-system-details, basic-distance+stretchable=0
+// constraints will be ignored.
+// - If you want to find the minimum height of a system, include_fixed_spacing should be true.
+// - If you're going to actually lay out the page, then it should be false (or
+// else centered dynamics will break when there is a fixed alignment).
vector<Real>
Align_interface::internal_get_minimum_translations (Grob *me,
vector<Grob*> const &all_grobs,
{
if (!pure && a == Y_AXIS && dynamic_cast<Spanner*> (me) && !me->get_system ())
me->programming_error ("vertical alignment called before line-breaking");
+
+ // If include_fixed_spacing is true, we look at things like system-system-spacing
+ // and alignment-distances, which only make sense for the toplevel VerticalAlignment.
+ // If we aren't toplevel, we're working on something like BassFigureAlignment
+ // and so we definitely don't want to include alignment-distances!
+ if (!dynamic_cast<System*> (me->get_parent (Y_AXIS)))
+ include_fixed_spacing = false;
Direction stacking_dir = robust_scm2dir (me->get_property ("stacking-dir"),
DOWN);
SCM spec = Page_layout_problem::get_spacing_spec (elems[j-1], elems[j], pure, start, end);
Page_layout_problem::read_spacing_spec (spec, &padding, ly_symbol2scm ("padding"));
- Real min_distance = 0;
- if (Page_layout_problem::read_spacing_spec (spec, &min_distance, ly_symbol2scm ("minimum-distance")))
- dy = max (dy, min_distance);
-
if (include_fixed_spacing)
- dy = max (dy, Page_layout_problem::get_fixed_spacing (elems[j-1], elems[j], spaceable_count, pure, start, end));
+ {
+ Real min_distance = 0;
+ if (Page_layout_problem::read_spacing_spec (spec, &min_distance, ly_symbol2scm ("minimum-distance")))
+ dy = max (dy, min_distance);
+
+ dy = max (dy, Page_layout_problem::get_fixed_spacing (elems[j-1], elems[j], spaceable_count, pure, start, end));
+ }
if (Page_layout_problem::is_spaceable (elems[j]) && last_spaceable_element)
{
ly_symbol2scm ("padding"));
padding = max (padding, spaceable_padding);
- Real min_distance = 0;
- if (Page_layout_problem::read_spacing_spec (spec,
- &min_distance,
- ly_symbol2scm ("minimum-distance")))
- dy = max (dy, min_distance + stacking_dir*(last_spaceable_element_pos - where));
-
if (include_fixed_spacing)
- dy = max (dy, Page_layout_problem::get_fixed_spacing (last_spaceable_element, elems[j], spaceable_count,
- pure, start, end));
+ {
+ Real min_distance = 0;
+ if (Page_layout_problem::read_spacing_spec (spec,
+ &min_distance,
+ ly_symbol2scm ("minimum-distance")))
+ dy = max (dy, min_distance + stacking_dir*(last_spaceable_element_pos - where));
+
+ dy = max (dy, Page_layout_problem::get_fixed_spacing (last_spaceable_element, elems[j], spaceable_count,
+ pure, start, end));
+ }
}
}