From: Joe Neeman Date: Sun, 2 Aug 2009 02:51:27 +0000 (-0700) Subject: Add min-distance and padding for unspaced lines. X-Git-Tag: release/2.13.4-1~217 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=039bfe9e53dc94ce234b737383f54c3d0409099e;p=lilypond.git Add min-distance and padding for unspaced lines. --- diff --git a/lily/align-interface.cc b/lily/align-interface.cc index d77b642726..8fe151b337 100644 --- a/lily/align-interface.cc +++ b/lily/align-interface.cc @@ -154,9 +154,8 @@ Align_interface::get_minimum_translations (Grob *me, Real default_padding = robust_scm2double (me->get_property ("padding"), 0.0); vector translates; Skyline down_skyline (stacking_dir); - SCM last_spaceable_element_details = SCM_EOL; Real last_spaceable_element_pos = 0; - bool found_spaceable_element = false; + Grob *last_spaceable_element = 0; for (vsize j = 0; j < elems.size (); j++) { Real dy = 0; @@ -168,45 +167,56 @@ Align_interface::get_minimum_translations (Grob *me, { down_skyline.merge (skylines[j-1][stacking_dir]); dy = down_skyline.distance (skylines[j][-stacking_dir]); - } - if (isinf (dy)) /* if the skyline is empty, maybe max_height is infinity_f */ - dy = 0.0; + SCM spec = Page_layout_problem::get_spacing_spec (elems[j-1], elems[j]); + Page_layout_problem::read_spacing_spec (spec, &padding, ly_symbol2scm ("padding")); - if (Page_layout_problem::is_spaceable (elems[j])) - { Real min_distance = 0; - Page_layout_problem::read_spacing_spec (last_spaceable_element_details, - &padding, - ly_symbol2scm ("padding")); - if (Page_layout_problem::read_spacing_spec (last_spaceable_element_details, - &min_distance, - ly_symbol2scm ("minimum-distance"))) - dy = max (dy, min_distance + stacking_dir*(last_spaceable_element_pos - where)); - - if (found_spaceable_element && scm_is_pair (forced_distances)) + 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) { - SCM forced_dist = scm_car (forced_distances); - forced_distances = scm_cdr (forced_distances); + // Spaceable staves may have min-distance and padding + // constraints coming from the previous spaceable staff + // as well as from the previous staff. + spec = Page_layout_problem::get_spacing_spec (last_spaceable_element, elems[j]); + Real spaceable_padding = 0; + Page_layout_problem::read_spacing_spec (spec, + &spaceable_padding, + 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 (scm_is_pair (forced_distances)) + { + SCM forced_dist = scm_car (forced_distances); + forced_distances = scm_cdr (forced_distances); - if (scm_is_number (forced_dist)) - dy = scm_to_double (forced_dist) + stacking_dir * (last_spaceable_element_pos - where); + if (scm_is_number (forced_dist)) + dy = scm_to_double (forced_dist) + stacking_dir * (last_spaceable_element_pos - where); + } } - last_spaceable_element_details = elems[j]->get_property ("next-staff-spacing"); - found_spaceable_element = true; - } - else - { - // TODO: provide support for min-distance and padding for non-spaceable elements also. } + 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); where += stacking_dir * dy; translates.push_back (where); if (Page_layout_problem::is_spaceable (elems[j])) - last_spaceable_element_pos = where; + { + last_spaceable_element = elems[j]; + last_spaceable_element_pos = where; + } } // So far, we've computed the translates for all the non-empty elements.