]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/page-layout-problem.cc
Fix 1442.
[lilypond.git] / lily / page-layout-problem.cc
index c9512fcca83a9d6908ae8237a048f47985a1fc98..4c3e14c7d26e4eb4df23404eebd249085e83deea 100644 (file)
@@ -71,7 +71,7 @@ Page_layout_problem::get_footnotes_from_lines (SCM lines, Real padding)
 
   if (!scm_is_pair (footnotes))
     return SCM_EOL;
-    
+
   return scm_reverse (footnotes);
 }
 
@@ -99,8 +99,10 @@ Page_layout_problem::add_footnotes_to_footer (SCM footnotes, Stencil *foot, Pape
 {
   bool footnotes_found = false;
   Real footnote_padding = robust_scm2double (pb->paper_->c_variable ("footnote-padding"), 0.0);
+  Real footnote_footer_padding = robust_scm2double (pb->paper_->c_variable ("footnote-footer-padding"), 0.0);
   
   footnotes = scm_reverse (footnotes);
+
   for (SCM s = footnotes; scm_is_pair (s); s = scm_cdr (s))
     {
       Stencil *stencil = unsmob_stencil (scm_car (s));
@@ -110,7 +112,7 @@ Page_layout_problem::add_footnotes_to_footer (SCM footnotes, Stencil *foot, Pape
 
       if (!stencil->is_empty ())
         {
-          foot->add_at_edge (Y_AXIS, UP, *stencil, footnote_padding);
+          foot->add_at_edge (Y_AXIS, UP, *stencil, (!footnotes_found ? footnote_footer_padding : footnote_padding));
           footnotes_found = true;
         }
     }
@@ -310,7 +312,7 @@ Page_layout_problem::append_system (System *sys, Spring const& spring, Real inde
   springs_.push_back (spring_copy);
 
   bottom_skyline_ = down_skyline;
-  elements_.push_back (Element (elts, minimum_offsets));
+  elements_.push_back (Element (elts, minimum_offsets, padding));
 
   // Add the springs for the VerticalAxisGroups in this system.
 
@@ -338,7 +340,7 @@ Page_layout_problem::append_system (System *sys, Spring const& spring, Real inde
          alter_spring_from_spacing_spec (spec, &spring);
 
          springs_.push_back (spring);
-         Real min_distance = (found_spaceable_staff ? minimum_offsets[last_spaceable_staff] : 0) - minimum_offsets[i];
+         Real min_distance = (found_spaceable_staff ? minimum_offsets_with_min_dist[last_spaceable_staff] : 0) - minimum_offsets_with_min_dist[i];
          springs_.back ().ensure_min_distance (min_distance);
 
          if (scm_is_pair (manual_dists))
@@ -396,7 +398,7 @@ Page_layout_problem::append_prob (Prob *prob, Spring const& spring, Real padding
     spring_copy.ensure_min_distance (minimum_distance + padding);
 
   springs_.push_back (spring_copy);
-  elements_.push_back (Element (prob));
+  elements_.push_back (Element (prob, padding));
 }
 
 void
@@ -460,7 +462,8 @@ Page_layout_problem::find_system_offsets ()
          if (loose_lines.size ())
            {
              Interval loose_extent = loose_lines.back ()->extent (loose_lines.back (), Y_AXIS);
-             Real min_distance = -loose_extent[DOWN] + prob_extent[UP]; // TODO: include padding/minimum-distance
+             Real min_distance = (-loose_extent[DOWN] + prob_extent[UP]
+                                  + elements_[i].padding);
 
              loose_line_min_distances.push_back (min_distance);
              loose_lines.push_back (0);
@@ -511,7 +514,10 @@ Page_layout_problem::find_system_offsets ()
                  // the last one.
                  if (loose_lines.size ())
                    {
-                     loose_line_min_distances.push_back (min_offsets[staff_idx-1] - min_offsets[staff_idx]);
+                     if (staff_idx)
+                       loose_line_min_distances.push_back (min_offsets[staff_idx-1] - min_offsets[staff_idx]);
+                     else
+                       loose_line_min_distances.push_back (elements_[i].padding - min_offsets[staff_idx]);
                      loose_lines.push_back (staff);
 
                      distribute_loose_lines (loose_lines, loose_line_min_distances,
@@ -520,8 +526,7 @@ Page_layout_problem::find_system_offsets ()
                      loose_line_min_distances.clear ();
                    }
                  last_spaceable_line = staff;
-                 // Negative is down but the translation is relative to the whole page.
-                 last_spaceable_line_translation = -system_position + translation;
+                 last_spaceable_line_translation = -solution_[spring_idx - 1];
 
                  staff->translate_axis (translation, Y_AXIS);
                  found_spaceable_staff = true;
@@ -532,20 +537,26 @@ Page_layout_problem::find_system_offsets ()
                    loose_lines.push_back (last_spaceable_line);
 
                  if (staff_idx)
+                   // NOTE: the way we do distances between loose lines (and other lines too, actually)
+                   // is not the most accurate way possible: we only insert rods between adjacent
+                   // lines.  To be more accurate, we could insert rods between non-adjacent lines
+                   // using a scheme similar to the one in set_column_rods.
                    loose_line_min_distances.push_back (min_offsets[staff_idx-1] - min_offsets[staff_idx]);
                  else
-                   {
+                   { // this is the first line in a system
                      Real min_dist = 0;
                      if (loose_lines.back ())
-                       min_dist = Axis_group_interface::minimum_distance (loose_lines.back (),
-                                                                          staff,
-                                                                          Y_AXIS);
+                       // distance to the final line in the preceding system,
+                       // including 'system-system-spacing 'padding
+                       min_dist = (Axis_group_interface::minimum_distance (loose_lines.back (),
+                                                                           staff,
+                                                                           Y_AXIS)
+                                   + elements_[i].padding);
                      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];
-                       }
+                       // distance to the preceding title,
+                       //  including 'markup-system-spacing 'padding
+                       min_dist = (staff->extent (staff, Y_AXIS)[UP] - last_title_extent[DOWN]
+                                   + elements_[i].padding);
                      else // distance to the top margin
                        min_dist = header_padding_ + header_height_ + staff->extent (staff, Y_AXIS)[UP];
 
@@ -853,10 +864,12 @@ Page_layout_problem::get_spacing_spec (Grob *before, Grob *after, bool pure, int
        {
          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)
+         static bool warned = false;
+         if (after_affinity > before_affinity
+             && !warned && !pure)
            {
              warning (_ ("staff-affinities should only decrease"));
-             after_affinity = before_affinity;
+             warned = true;
            }
          if (before_affinity != UP)
            return before->get_maybe_pure_property ("nonstaff-nonstaff-spacing", pure, start, end);