X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Falign-interface.cc;h=403f903e490ccea3d811be8b1f99f6b0c341b960;hb=cf3642858a2340bb39ee56739f34c799946d4454;hp=cabce9e97464f81e607b3ae2098e9f359d459ca6;hpb=c49d47e3859b857885408a9deda16a9973eb1e21;p=lilypond.git diff --git a/lily/align-interface.cc b/lily/align-interface.cc index cabce9e974..403f903e49 100644 --- a/lily/align-interface.cc +++ b/lily/align-interface.cc @@ -168,9 +168,11 @@ Align_interface::get_minimum_translations_without_min_dist (Grob *me, } // 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. +// here are those that result from collisions (+ padding) and minimum-distance +// between adjacent staves. +// If include_fixed_spacing is true, constraints from line-break-system-details, +// basic-distance+stretchable=0, and staff-staff-spacing of spaceable staves +// with loose lines in between, are included as well. // - 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). @@ -183,6 +185,13 @@ Align_interface::internal_get_minimum_translations (Grob *me, { if (!pure && a == Y_AXIS && dynamic_cast (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 (me->get_parent (Y_AXIS))) + include_fixed_spacing = false; Direction stacking_dir = robust_scm2dir (me->get_property ("stacking-dir"), DOWN); @@ -197,6 +206,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++) { @@ -204,25 +214,19 @@ 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")); - if (include_fixed_spacing) - { - Real min_distance = 0; - if (Page_layout_problem::read_spacing_spec (spec, &min_distance, ly_symbol2scm ("minimum-distance"))) - dy = max (dy, min_distance); + dy = down_skyline.distance (skylines[j][-stacking_dir]) + padding; - 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); - 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 @@ -232,27 +236,26 @@ 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)); - if (include_fixed_spacing) - { - 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)); - } + Real spaceable_min_distance = 0; + if (Page_layout_problem::read_spacing_spec (spec, + &spaceable_min_distance, + ly_symbol2scm ("minimum-distance"))) + dy = max (dy, spaceable_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)); } } if (isinf (dy)) /* if the skyline is empty, maybe max_height is infinity_f */ dy = 0.0; - dy = max (0.0, dy + padding); + dy = max (0.0, dy); down_skyline.raise (-stacking_dir * dy); + down_skyline.merge (skylines[j][stacking_dir]); where += stacking_dir * dy; translates.push_back (where); @@ -261,6 +264,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; } }