From: Joe Neeman Date: Mon, 28 Feb 2011 00:25:12 +0000 (+1100) Subject: Fix 1442. X-Git-Tag: release/2.15.0-1~27 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=717f02443c1b93426f4f5d3b18fc8c5045b89a03;p=lilypond.git Fix 1442. When include_fixed_spacing is false, also exclude minimum-distance from consideration. --- diff --git a/lily/align-interface.cc b/lily/align-interface.cc index 5741a44272..bfda43ed43 100644 --- a/lily/align-interface.cc +++ b/lily/align-interface.cc @@ -167,12 +167,13 @@ 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 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 Align_interface::internal_get_minimum_translations (Grob *me, vector const &all_grobs, @@ -219,12 +220,14 @@ Align_interface::internal_get_minimum_translations (Grob *me, 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) { @@ -238,15 +241,17 @@ Align_interface::internal_get_minimum_translations (Grob *me, 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)); + } } } diff --git a/lily/page-layout-problem.cc b/lily/page-layout-problem.cc index 51cec86b14..4c3e14c7d2 100644 --- a/lily/page-layout-problem.cc +++ b/lily/page-layout-problem.cc @@ -340,7 +340,7 @@ 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)) @@ -526,8 +526,7 @@ Page_layout_problem::find_system_offsets () 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; + last_spaceable_line_translation = -solution_[spring_idx - 1]; staff->translate_axis (translation, Y_AXIS); found_spaceable_staff = true; @@ -538,6 +537,10 @@ Page_layout_problem::find_system_offsets () loose_lines.push_back (last_spaceable_line); if (staff_idx) + // NOTE: the way we do distances between loose lines (and other lines too, actually) + // is not the most accurate way possible: we only insert rods between adjacent + // lines. To be more accurate, we could insert rods between non-adjacent lines + // using a scheme similar to the one in set_column_rods. loose_line_min_distances.push_back (min_offsets[staff_idx-1] - min_offsets[staff_idx]); else { // this is the first line in a system