X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpage-layout-problem.cc;h=23069add37372d4d1040923e9cab4ec83541a1f4;hb=29bd6abd1fdc4926f017d8c8825e3be72c6b0b85;hp=f1bbed8e5eb6d35b195b0dd34ba95f5ba5e377ff;hpb=e18531db1f79fb685fbd16d6a2a67bf4b6c09915;p=lilypond.git diff --git a/lily/page-layout-problem.cc b/lily/page-layout-problem.cc index f1bbed8e5e..23069add37 100644 --- a/lily/page-layout-problem.cc +++ b/lily/page-layout-problem.cc @@ -305,7 +305,8 @@ Page_layout_problem::solve_rod_spring_problem (bool ragged) solution_ = spacer.spring_positions (); if (!spacer.fits ()) - warning (_ ("couldn't fit music on page")); + warning (_f ("couldn't fit music on page: overflow is %f", + spacer.configuration_length(spacer.force()) - page_height_)); } // The solution_ vector stores the position of every live VerticalAxisGroup @@ -325,19 +326,20 @@ Page_layout_problem::find_system_offsets () vector loose_line_min_distances; Grob *last_spaceable_line = 0; Real last_spaceable_line_translation = 0; + Interval last_title_extent; for (vsize i = 0; i < elements_.size (); ++i) { if (elements_[i].prob) { *tail = scm_cons (scm_from_double (solution_[spring_idx]), SCM_EOL); tail = SCM_CDRLOC (*tail); + Interval prob_extent = unsmob_stencil (elements_[i].prob->get_property ("stencil"))->extent (Y_AXIS); // Lay out any non-spaceable lines between this line and // the last one. if (loose_lines.size ()) { Interval loose_extent = loose_lines.back ()->extent (loose_lines.back (), Y_AXIS); - Interval prob_extent = unsmob_stencil (elements_[i].prob->get_property ("stencil"))->extent (Y_AXIS); Real min_distance = -loose_extent[DOWN] + prob_extent[UP]; // TODO: include padding/minimum-distance loose_line_min_distances.push_back (min_distance); @@ -351,6 +353,7 @@ Page_layout_problem::find_system_offsets () last_spaceable_line = 0; last_spaceable_line_translation = -solution_[spring_idx]; + last_title_extent = prob_extent; spring_idx++; } else @@ -417,6 +420,12 @@ Page_layout_problem::find_system_offsets () min_dist = Axis_group_interface::minimum_distance (loose_lines.back (), staff, Y_AXIS); + 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]; + } else // distance to the top margin min_dist = header_padding_ + header_height_ + staff->extent (staff, Y_AXIS)[UP]; @@ -465,7 +474,7 @@ Page_layout_problem::distribute_loose_lines (vector const &loose_lines, Simple_spacer spacer; for (vsize i = 0; i + 1 < loose_lines.size (); ++i) { - SCM spec = get_spacing_spec (loose_lines[i], loose_lines[i+1]); + SCM spec = get_spacing_spec (loose_lines[i], loose_lines[i+1], false, 0, INT_MAX); Spring spring (1.0, 0.0); alter_spring_from_spacing_spec (spec, &spring); spring.ensure_min_distance (min_distances[i]); @@ -637,7 +646,7 @@ const double HUGE_STRETCH = 10e7; // Returns the spacing spec connecting BEFORE to AFTER. SCM -Page_layout_problem::get_spacing_spec (Grob *before, Grob *after) +Page_layout_problem::get_spacing_spec (Grob *before, Grob *after, bool pure, int start, int end) { // If there are no spacing wishes, return a very flexible spring. // This will occur, for example, if there are lyrics at the bottom of @@ -649,38 +658,41 @@ Page_layout_problem::get_spacing_spec (Grob *before, Grob *after) if (is_spaceable (before)) { if (is_spaceable (after)) - return before->get_property ("next-staff-spacing"); + return before->get_maybe_pure_property ("next-staff-spacing", pure, start, end); else { - Direction affinity = to_dir (after->get_property ("staff-affinity")); + Direction affinity = to_dir (after->get_maybe_pure_property ("staff-affinity", pure, start, end)); return (affinity == DOWN) - ? add_stretchability (after->get_property ("non-affinity-spacing"), LARGE_STRETCH) - : after->get_property ("inter-staff-spacing"); + ? add_stretchability (after->get_maybe_pure_property ("non-affinity-spacing", pure, start, end), + LARGE_STRETCH) + : after->get_maybe_pure_property ("inter-staff-spacing", pure, start, end); } } else { if (is_spaceable (after)) { - Direction affinity = to_dir (before->get_property ("staff-affinity")); + Direction affinity = to_dir (before->get_maybe_pure_property ("staff-affinity", pure, start, end)); return (affinity == UP) - ? add_stretchability (before->get_property ("non-affinity-spacing"), LARGE_STRETCH) - : before->get_property ("inter-staff-spacing"); + ? add_stretchability (before->get_maybe_pure_property ("non-affinity-spacing", pure, start, end), + LARGE_STRETCH) + : before->get_maybe_pure_property ("inter-staff-spacing", pure, start, end); } else { - Direction before_affinity = to_dir (before->get_property ("staff-affinity")); - Direction after_affinity = to_dir (after->get_property ("staff-affinity")); + Direction before_affinity = to_dir (before->get_maybe_pure_property ("staff-affinity", pure, start, end)); + Direction after_affinity = to_dir (after->get_maybe_pure_property ("staff-affinity", pure, start, end)); if (after_affinity > before_affinity) { warning (_ ("staff-affinities should only decrease")); after_affinity = before_affinity; } if (before_affinity != UP) - return before->get_property ("inter-loose-line-spacing"); + return before->get_maybe_pure_property ("inter-loose-line-spacing", pure, start, end); else if (after_affinity != DOWN) - return before->get_property ("inter-loose-line-spacing"); - return add_stretchability (before->get_property ("non-affinity-spacing"), LARGE_STRETCH); + return before->get_maybe_pure_property ("inter-loose-line-spacing", pure, start, end); + return add_stretchability (before->get_maybe_pure_property ("non-affinity-spacing", pure, start, end), + LARGE_STRETCH); } }