Reviewers: ,
Message:
Consider each minimum-distance and padding constraint, and choose
spacing that meets the most demanding constraint.
Previously some distances were added together by mistake in the
within-system spacing; disagreeing with the documentation and with
behavior for system-system spacing. Thus the Lyrics minimum-distance is
bumped up to 3.0, to match previous behavior when the old
minimum-distance=2.8 was always augmented by padding=0.2.
Other small changes in regression tests are due to getting exactly the
spacing the input files asked for.
Description:
Spacing staves with loose lines between; issue 1442
Distinguish the minimum distances between 'spaceable' staves
from those between lines such as Lyrics.
Please review this at http://codereview.appspot.com/4536088/
Affected files:
M input/regression/lyrics-bar.ly
A input/regression/page-spacing-nonstaff-lines-independent.ly
M lily/align-interface.cc
M lily/page-layout-problem.cc
M ly/engraver-init.ly
Index: input/regression/lyrics-bar.ly
diff --git a/input/regression/lyrics-bar.ly b/input/regression/lyrics-bar.ly
index
d8a596b2e652e6c76b598f9da5d3a385972f1be8..c3f8cdd30258960ce4407596d71f23db98230349
100644
--- a/input/regression/lyrics-bar.ly
+++ b/input/regression/lyrics-bar.ly
@@ -31,7 +31,7 @@ lyrics do not collide with barlines.
\layout {
\context {
\Lyrics
- \override VerticalAxisGroup #'nonstaff-nonstaff-spacing
#'minimum-distance = #4
+ \override VerticalAxisGroup #'nonstaff-nonstaff-spacing
#'minimum-distance = #4.2
\override LyricText #'Y-offset = #-0.7
\override BarLine #'bar-extent = #'(-2 . 2)
}
Index: input/regression/page-spacing-nonstaff-lines-independent.ly
diff --git a/input/regression/page-spacing-nonstaff-lines-independent.ly
b/input/regression/page-spacing-nonstaff-lines-independent.ly
new file mode 100644
index
0000000000000000000000000000000000000000..26d7a9d1ff24d64b6dd40cde2c680dbcc05ec2cb
--- /dev/null
+++ b/input/regression/page-spacing-nonstaff-lines-independent.ly
@@ -0,0 +1,25 @@
+\version "2.13.39"
+
+\header {
+ texidoc = "Spacing rules between Staves coexist with rules affecting
+non-staff lines. Here, the @code{padding} separating items on different
+staves is larger than the @code{padding} for associated lyrics."
+}
+
+<<
+ \new Staff { c''2 c }
+ \addlyrics { high \skip2 }
+ \new Staff = "bass" \new Voice = "b" { \clef bass c2 c' }
+ \new Lyrics \with {
+ alignAboveContext = "bass"
+ } \lyricsto "b" \lyricmode { bass \skip2 }
+>>
+\layout {
+ \context {
+ \Lyrics
+ \override VerticalAxisGroup #'nonstaff-relatedstaff-spacing =
#'((padding . 0.2))
+ } \context {
+ \Staff
+ \override VerticalAxisGroup #'default-staff-staff-spacing =
#'((padding . 4))
+ }
+}
Index: lily/align-interface.cc
diff --git a/lily/align-interface.cc b/lily/align-interface.cc
index
cb876f5bbf1de0297f590d7e79c3902a26af3ebe..01dcc3f80f33bccc53c3e99dd4d2bfe3145d091d
100644
--- a/lily/align-interface.cc
+++ b/lily/align-interface.cc
@@ -167,12 +167,14 @@
Align_interface::get_minimum_translations_without_min_dist (Grob *me,
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 true, include space required by
+// required by stretchable=0, by alignment-distances, and spacing
+// requirements betwen non-adjacent staves (e.g., minimum-distnace
+// between spaceable staves with Lyrics in between).
+// If you want to find the minimum height of a system, or the minimum
+// separations of spaceable staves, include_fixed_spacing should be true.
+// If you need minimum distances between adjacent staves only (e.g., when
+// when distributing loose lines) include_fixed_spacing should be false.
vector<Real>
Align_interface::internal_get_minimum_translations (Grob *me,
vector<Grob*> const
&all_grobs,
@@ -196,6 +198,7 @@ Align_interface::internal_get_minimum_translations
(Grob *me,
Skyline down_skyline (stacking_dir);
Real last_spaceable_element_pos = 0;
Grob *last_spaceable_element = 0;
+ Skyline last_spaceable_skyline (stacking_dir);
int spaceable_count = 0;
for (vsize j = 0; j < elems.size (); j++)
{
@@ -203,15 +206,14 @@ Align_interface::internal_get_minimum_translations
(Grob *me,
Real padding = default_padding;
if (j == 0)
- dy = skylines[j][-stacking_dir].max_height ();
+ dy = skylines[j][-stacking_dir].max_height () + padding;
else
{
- down_skyline.merge (skylines[j-1][stacking_dir]);
- dy = down_skyline.distance (skylines[j][-stacking_dir]);
-
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"));
+ dy = down_skyline.distance (skylines[j][-stacking_dir]) + padding;
+
Real min_distance = 0;
if (Page_layout_problem::read_spacing_spec (spec, &min_distance,
ly_symbol2scm ("minimum-distance")))
dy = max (dy, min_distance);
@@ -219,7 +221,7 @@ Align_interface::internal_get_minimum_translations
(Grob *me,
if (include_fixed_spacing)
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)
+ if (include_fixed_spacing && Page_layout_problem::is_spaceable
(elems[j]) && last_spaceable_element)
{
// Spaceable staves may have
// constraints coming from the previous spaceable staff
@@ -229,25 +231,25 @@ Align_interface::internal_get_minimum_translations
(Grob *me,
Page_layout_problem::read_spacing_spec (spec,
&spaceable_padding,
ly_symbol2scm
("padding"));
- padding = max (padding, spaceable_padding);
+ dy = max(dy, (last_spaceable_skyline.distance
(skylines[j][-stacking_dir])
+ + stacking_dir*(last_spaceable_element_pos - where) +
spaceable_padding));
- Real min_distance = 0;
+ Real spaceable_min_distance = 0;
if (Page_layout_problem::read_spacing_spec (spec,
- &min_distance,
+
&spaceable_min_distance,
ly_symbol2scm
("minimum-distance")))
- dy = max (dy, min_distance + stacking_dir*(last_spaceable_element_pos -
where));
+ dy = max (dy, spaceable_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));
+ dy = max (dy, Page_layout_problem::get_fixed_spacing
(last_spaceable_element, elems[j], spaceable_count,
+ pure,
start, end));
}
}
if (isinf (dy)) /* if the skyline is empty, maybe max_height is
infinity_f */
dy = 0.0;
- dy = max (0.0, dy + padding);
down_skyline.raise (-stacking_dir * dy);
+ down_skyline.merge (skylines[j][stacking_dir]);
where += stacking_dir * dy;
translates.push_back (where);
@@ -256,6 +258,7 @@ Align_interface::internal_get_minimum_translations
(Grob *me,
spaceable_count++;
last_spaceable_element = elems[j];
last_spaceable_element_pos = where;
+ last_spaceable_skyline = down_skyline;
}
}
Index: lily/page-layout-problem.cc
diff --git a/lily/page-layout-problem.cc b/lily/page-layout-problem.cc
index
51cec86b142a6c0928da0c386b3cf0f4d6959204..3c0011d63acab80a5c7a973d443988060f289ec9
100644
--- a/lily/page-layout-problem.cc
+++ b/lily/page-layout-problem.cc
@@ -340,7 +340,9 @@ Page_layout_problem::append_system (System *sys, Spring
const& spring, Real inde
alter_spring_from_spacing_spec (spec, &spring);
springs_.push_back (spring);
- Real min_distance = (found_spaceable_staff ?
minimum_offsets[last_spaceable_staff] : 0) - minimum_offsets[i];
+ Real min_distance = ((found_spaceable_staff ?
+
minimum_offsets_with_min_dist[last_spaceable_staff] : 0)
+ - minimum_offsets_with_min_dist[i]);
springs_.back ().ensure_min_distance (min_distance);
if (scm_is_pair (manual_dists))
@@ -496,7 +498,6 @@ Page_layout_problem::find_system_offsets ()
Real system_position = first_staff_position +
first_staff_min_translation;
// Position the staves within this system.
- Real translation = 0;
vector<Real> const& min_offsets = elements_[i].min_offsets;
bool found_spaceable_staff = false;
for (vsize staff_idx = 0; staff_idx < elements_[i].staves.size ();
++staff_idx)
@@ -507,8 +508,7 @@ Page_layout_problem::find_system_offsets ()
if (is_spaceable (staff))
{
// this is relative to the system: negative numbers are down.
- translation = system_position - solution_[spring_idx];
- spring_idx++;
+ staff->translate_axis (system_position - solution_[spring_idx],
Y_AXIS);
// Lay out any non-spaceable lines between this line and
// the last one.
@@ -521,16 +521,14 @@ Page_layout_problem::find_system_offsets ()
loose_lines.push_back (staff);
distribute_loose_lines (loose_lines,
loose_line_min_distances,
- last_spaceable_line_translation,
translation - system_position);
+ last_spaceable_line_translation,
-solution_[spring_idx]);
loose_lines.clear ();
loose_line_min_distances.clear ();
}
last_spaceable_line = staff;
- // Negative is down but the translation is relative to the
whole page.
- last_spaceable_line_translation = -system_position +
translation;
-
- staff->translate_axis (translation, Y_AXIS);
+ last_spaceable_line_translation = -solution_[spring_idx];
found_spaceable_staff = true;
+ spring_idx++;
}
else
{
Index: ly/engraver-init.ly
diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly
index
6fccc5d134631328abaf0e4efe3292a8a7b712ed..a96f329cc8366f106b6f5f0e5f795ae37fa8b824
100644
--- a/ly/engraver-init.ly
+++ b/ly/engraver-init.ly
@@ -442,7 +442,7 @@ printing of a single line of lyrics."
(stretchability . 1))
\override VerticalAxisGroup #'nonstaff-nonstaff-spacing =
#'((basic-distance . 0)
- (minimum-distance . 2.8)
+ (minimum-distance . 3.0)
(padding . 0.2)
(stretchability . 0))
\override VerticalAxisGroup #'nonstaff-unrelatedstaff-spacing #'padding
= #1.5
@@ -466,7 +466,7 @@ printing of a single line of lyrics."
\override VerticalAxisGroup #'staff-affinity = #UP
\override VerticalAxisGroup #'nonstaff-nonstaff-spacing =
#'((basic-distance . 0)
- (minimum-distance . 2.8)
+ (minimum-distance . 3.0)
(padding . 0.2)
(stretchability . 0))
\override VerticalAxisGroup #'nonstaff-relatedstaff-spacing =
_______________________________________________
lilypond-devel mailing list
lilypond-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-devel