]> git.donarmstrong.com Git - lilypond.git/commitdiff
Fix minimum distance between loose lines and headers/footers.
authorJoe Neeman <joeneeman@gmail.com>
Mon, 10 Aug 2009 01:50:52 +0000 (11:50 +1000)
committerJoe Neeman <joeneeman@gmail.com>
Mon, 10 Aug 2009 03:31:40 +0000 (13:31 +1000)
lily/axis-group-interface.cc
lily/include/axis-group-interface.hh
lily/page-layout-problem.cc

index 4de8b6cf900565301e64b5c021687490eb336b35..00a8219ec044ee526a36b3f075c90485a79d82e4 100644 (file)
@@ -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.",
 
index b147896b05dab1c132e8bb2bc6e36b7d959652ea..95aa9f3bc555c2e5695445df70bd5fe1c736ae79 100644 (file)
@@ -43,6 +43,7 @@ struct Axis_group_interface
   static void get_children (Grob *, vector<Grob*> *);
   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();
 };
 
index b4bb60b03d8cee68ef5b9042d8c9315d26d71240..87d6f9475687bf66082db8285205a15dd60f962e 100644 (file)
@@ -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,