]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/page-layout-problem.cc
Improvements in vertical skyline approximations (issue 2148).
[lilypond.git] / lily / page-layout-problem.cc
index 376716929cd6b2804c5f739cb0dc3471e48fbb16..11177be03a461e4b736f7e06772380910237d01a 100644 (file)
@@ -176,14 +176,14 @@ Page_layout_problem::add_footnotes_to_lines (SCM lines, int counter, Paper_book
       if (!s)
         {
           programming_error ("Your numbering function needs to return a stencil.");
-         footnote_number_markups.push_back (SCM_EOL);
+          footnote_number_markups.push_back (SCM_EOL);
           footnote_number_stencils.push_back (Stencil (Box (Interval (0, 0), Interval (0, 0)), SCM_EOL));
         }
       else
-       {
-         footnote_number_markups.push_back (markup);
-         footnote_number_stencils.push_back (*s);
-       }
+        {
+          footnote_number_markups.push_back (markup);
+          footnote_number_stencils.push_back (*s);
+        }
       counter++;
     }
 
@@ -201,8 +201,8 @@ Page_layout_problem::add_footnotes_to_lines (SCM lines, int counter, Paper_book
     {
       in_text_numbers = scm_cons (footnote_number_markups[i], in_text_numbers);
       footnote_number_stencils[i].translate_axis ((max_length
-                                                    - footnote_number_stencils[i].extent (X_AXIS).length ()),
-                                                   X_AXIS);
+                                                   - footnote_number_stencils[i].extent (X_AXIS).length ()),
+                                                  X_AXIS);
       numbers = scm_cons (footnote_number_stencils[i].smobbed_copy (), numbers);
     }
 
@@ -262,9 +262,9 @@ Page_layout_problem::add_footnotes_to_lines (SCM lines, int counter, Paper_book
 
                   Stencil annotation = *unsmob_stencil (scm_car (numbers));
                   annotation.translate_axis ((footnote_stencil.extent (Y_AXIS)[UP]
-                                             + number_raise
-                                             - annotation.extent (Y_AXIS)[UP]),
-                                              Y_AXIS);
+                                              + number_raise
+                                              - annotation.extent (Y_AXIS)[UP]),
+                                             Y_AXIS);
                   footnote_stencil.add_at_edge (X_AXIS, LEFT, annotation, 0.0);
                   numbers = scm_cdr (numbers);
                   in_text_numbers = scm_cdr (in_text_numbers);
@@ -301,9 +301,9 @@ Page_layout_problem::add_footnotes_to_lines (SCM lines, int counter, Paper_book
                   if (!unsmob_stencil (in_text_stencil))
                     in_text_stencil = SCM_EOL;
                   annotation.translate_axis ((footnote_stencil.extent (Y_AXIS)[UP]
-                                             + number_raise
-                                             - annotation.extent (Y_AXIS)[UP]),
-                                            Y_AXIS);
+                                              + number_raise
+                                              - annotation.extent (Y_AXIS)[UP]),
+                                             Y_AXIS);
                   footnote_stencil.add_at_edge (X_AXIS, LEFT, annotation, 0.0);
                   numbers = scm_cdr (numbers);
                   in_text_numbers = scm_cdr (in_text_numbers);
@@ -400,7 +400,7 @@ Page_layout_problem::Page_layout_problem (Paper_book *pb, SCM page_scm, SCM syst
           foot_stencil = add_footnotes_to_footer (footnotes, foot_stencil, pb);
         }
       else
-        warning ("A page layout problem has been initiated that cannot accommodate footnotes.");
+        warning (_ ("A page layout problem has been initiated that cannot accommodate footnotes."));
 
       header_height_ = head ? head->extent (Y_AXIS).length () : 0;
       footer_height_ = foot_stencil.extent (Y_AXIS).length ();
@@ -539,7 +539,7 @@ Page_layout_problem::set_footer_height (Real height)
 void
 Page_layout_problem::append_system (System *sys, Spring const &spring, Real indent, Real padding)
 {
-  Grob *align = sys->get_vertical_alignment ();
+  Grob *align = unsmob_grob (sys->get_object ("vertical-alignment"));
   if (!align)
     return;
 
@@ -583,8 +583,19 @@ Page_layout_problem::append_system (System *sys, Spring const &spring, Real inde
   spring_copy.ensure_min_distance (minimum_distance);
   springs_.push_back (spring_copy);
 
+  if (elts.size () && !is_spaceable (elts[0]))
+    {
+      // store the minimum distance, considering relative indents,
+      // for a loose line
+      Skyline first_skyline (UP);
+      Skyline_pair *sky = Skyline_pair::unsmob (elts[0]->get_property ("vertical-skylines"));
+      if (sky)
+        first_skyline.merge ((*sky)[UP]);
+      first_skyline.shift (indent);
+      minimum_distance = first_skyline.distance (bottom_skyline_) - bottom_loose_baseline_;
+    }
   bottom_skyline_ = down_skyline;
-  elements_.push_back (Element (elts, minimum_offsets, padding));
+  elements_.push_back (Element (elts, minimum_offsets, minimum_distance, padding));
 
   // Add the springs for the VerticalAxisGroups in this system.
 
@@ -840,7 +851,7 @@ Page_layout_problem::find_system_offsets ()
                   found_spaceable_staff = true;
                   spring_idx++;
                 }
-              else
+              else // ! is_spaceable
                 {
                   if (loose_lines.empty ())
                     loose_lines.push_back (last_spaceable_line);
@@ -859,16 +870,14 @@ Page_layout_problem::find_system_offsets ()
                         {
                           // 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);
+                          min_dist = elements_[i].min_distance + elements_[i].padding;
                           // A null line to break any staff-affinity for the previous system
                           loose_line_min_distances.push_back (0.0);
                           loose_lines.push_back (0);
                         }
                       else if (!last_title_extent.is_empty ())
                         // distance to the preceding title,
-                        //  including 'markup-system-spacing 'padding
+                        //  including 'markup-system-wg 'padding
                         min_dist = (staff->extent (staff, Y_AXIS)[UP] - last_title_extent[DOWN]
                                     + elements_[i].padding);
                       else // distance to the top margin