From 2fab58f39ab5d5188c69af3500ffd4072031ea92 Mon Sep 17 00:00:00 2001 From: Joe Neeman Date: Mon, 10 Aug 2009 11:50:52 +1000 Subject: [PATCH] Fix minimum distance between loose lines and headers/footers. --- lily/axis-group-interface.cc | 12 ++++++++++++ lily/include/axis-group-interface.hh | 1 + lily/page-layout-problem.cc | 19 +++++++++++++++---- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/lily/axis-group-interface.cc b/lily/axis-group-interface.cc index 4de8b6cf90..00a8219ec0 100644 --- a/lily/axis-group-interface.cc +++ b/lily/axis-group-interface.cc @@ -691,6 +691,18 @@ Axis_group_interface::calc_next_staff_spacing (SCM smob) return me->get_property ("default-next-staff-spacing"); } +Real +Axis_group_interface::minimum_distance (Grob *g1, Grob *g2, Axis a) +{ + SCM sym = ly_symbol2scm ((a == Y_AXIS) ? "vertical-skylines" : "horizontal-skylines"); + + Skyline_pair *s1 = Skyline_pair::unsmob (g1->get_property (sym)); + Skyline_pair *s2 = Skyline_pair::unsmob (g2->get_property (sym)); + if (s1 && s2) + return (*s1)[DOWN].distance ((*s2)[UP]); + return 0; +} + ADD_INTERFACE (Axis_group_interface, "An object that groups other layout objects.", diff --git a/lily/include/axis-group-interface.hh b/lily/include/axis-group-interface.hh index b147896b05..95aa9f3bc5 100644 --- a/lily/include/axis-group-interface.hh +++ b/lily/include/axis-group-interface.hh @@ -43,6 +43,7 @@ struct Axis_group_interface static void get_children (Grob *, vector *); static Interval staff_extent (Grob *me, Grob *ref, Axis, Grob *staff, Axis); static SCM calc_common (Grob *, Axis); + static Real minimum_distance (Grob*, Grob*, Axis); DECLARE_GROB_INTERFACE(); }; diff --git a/lily/page-layout-problem.cc b/lily/page-layout-problem.cc index b4bb60b03d..87d6f94756 100644 --- a/lily/page-layout-problem.cc +++ b/lily/page-layout-problem.cc @@ -10,6 +10,7 @@ #include "page-layout-problem.hh" #include "align-interface.hh" +#include "axis-group-interface.hh" #include "hara-kiri-group-spanner.hh" #include "international.hh" #include "item.hh" @@ -389,9 +390,17 @@ 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 - // FIXME: this should reflect the min distance from the last staff - // to the first loose line of this staff. - loose_line_min_distances.push_back (0); + { + Real min_dist = 0; + if (last_spaceable_line) + min_dist = Axis_group_interface::minimum_distance (last_spaceable_line, + staff, + Y_AXIS); + else // distance to the top margin + min_dist = header_height_ + staff->extent (staff, Y_AXIS)[UP]; + + loose_line_min_distances.push_back (min_dist); + } } } @@ -408,7 +417,9 @@ Page_layout_problem::find_system_offsets () if (loose_lines.size ()) { - loose_line_min_distances.push_back (0); // FIXME: should be the min distance to the footer. + Grob *last = loose_lines.back (); + Interval last_ext = last->extent (last, Y_AXIS); + loose_line_min_distances.push_back (-last_ext[DOWN] + footer_height_); loose_lines.push_back (0); distribute_loose_lines (loose_lines, loose_line_min_distances, -- 2.39.2