From: Keith OHara Date: Tue, 24 May 2011 01:49:23 +0000 (-0700) Subject: Loose lines honor padding between systems X-Git-Tag: release/2.13.62-1~1 X-Git-Url: https://git.donarmstrong.com/lilypond.git?a=commitdiff_plain;h=75d9336b83e91fa3bbab43b31099f3d5d00f8b47;p=lilypond.git Loose lines honor padding between systems When placing a loose line (e.g. Lyrics) at the top or bottom of a system, include as a constraint the padding to the neighboring system or markup. Fix 1654. --- diff --git a/input/regression/page-spacing-nonstaff-lines-between-systems.ly b/input/regression/page-spacing-nonstaff-lines-between-systems.ly index da6600e9c8..20aeb6eae6 100644 --- a/input/regression/page-spacing-nonstaff-lines-between-systems.ly +++ b/input/regression/page-spacing-nonstaff-lines-between-systems.ly @@ -15,8 +15,9 @@ next system." \score { << \chords { s1 \break d1 } - \relative c { c1 c1 } + \new Staff = "s" { c1 c1 } \addlyrics { word } + \addlyrics { \set alignAboveContext = "s" _ up } >> } } diff --git a/lily/include/page-layout-problem.hh b/lily/include/page-layout-problem.hh index fb1c7c373d..ff6fcece22 100644 --- a/lily/include/page-layout-problem.hh +++ b/lily/include/page-layout-problem.hh @@ -57,17 +57,22 @@ protected: Prob *prob; vector staves; vector min_offsets; + // Store the appropriate '*-*-spacing 'padding, + // for spacing any adjacent loose line + Real padding; - Element (vector const& a, vector const& o) + Element (vector const& a, vector const& o, Real p) { staves = a; min_offsets = o; + padding = p; prob = 0; } - Element (Prob *p) + Element (Prob *p, Real pad) { prob = p; + padding = pad; } } Element; diff --git a/lily/page-layout-problem.cc b/lily/page-layout-problem.cc index fa4bd9c7b4..51cec86b14 100644 --- a/lily/page-layout-problem.cc +++ b/lily/page-layout-problem.cc @@ -312,7 +312,7 @@ Page_layout_problem::append_system (System *sys, Spring const& spring, Real inde springs_.push_back (spring_copy); bottom_skyline_ = down_skyline; - elements_.push_back (Element (elts, minimum_offsets)); + elements_.push_back (Element (elts, minimum_offsets, padding)); // Add the springs for the VerticalAxisGroups in this system. @@ -398,7 +398,7 @@ Page_layout_problem::append_prob (Prob *prob, Spring const& spring, Real padding spring_copy.ensure_min_distance (minimum_distance + padding); springs_.push_back (spring_copy); - elements_.push_back (Element (prob)); + elements_.push_back (Element (prob, padding)); } void @@ -462,7 +462,8 @@ Page_layout_problem::find_system_offsets () if (loose_lines.size ()) { Interval loose_extent = loose_lines.back ()->extent (loose_lines.back (), Y_AXIS); - Real min_distance = -loose_extent[DOWN] + prob_extent[UP]; // TODO: include padding/minimum-distance + Real min_distance = (-loose_extent[DOWN] + prob_extent[UP] + + elements_[i].padding); loose_line_min_distances.push_back (min_distance); loose_lines.push_back (0); @@ -513,7 +514,10 @@ Page_layout_problem::find_system_offsets () // the last one. if (loose_lines.size ()) { - loose_line_min_distances.push_back (min_offsets[staff_idx-1] - min_offsets[staff_idx]); + if (staff_idx) + loose_line_min_distances.push_back (min_offsets[staff_idx-1] - min_offsets[staff_idx]); + else + loose_line_min_distances.push_back (elements_[i].padding - min_offsets[staff_idx]); loose_lines.push_back (staff); distribute_loose_lines (loose_lines, loose_line_min_distances, @@ -536,18 +540,20 @@ Page_layout_problem::find_system_offsets () if (staff_idx) loose_line_min_distances.push_back (min_offsets[staff_idx-1] - min_offsets[staff_idx]); else - { + { // this is the first line in a system Real min_dist = 0; if (loose_lines.back ()) - min_dist = Axis_group_interface::minimum_distance (loose_lines.back (), - staff, - Y_AXIS); + // distance to the final line in the preceding system, + // including 'system-system-spacing 'padding + min_dist = (Axis_group_interface::minimum_distance (loose_lines.back (), + staff, + Y_AXIS) + + elements_[i].padding); else if (!last_title_extent.is_empty ()) - { // distance to the preceding title - // TODO: add options for controlling the space between a loose line - // and a title/markup preceding it. - min_dist = staff->extent (staff, Y_AXIS)[UP] - last_title_extent[DOWN]; - } + // distance to the preceding title, + // including 'markup-system-spacing 'padding + min_dist = (staff->extent (staff, Y_AXIS)[UP] - last_title_extent[DOWN] + + elements_[i].padding); else // distance to the top margin min_dist = header_padding_ + header_height_ + staff->extent (staff, Y_AXIS)[UP];