]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/page-layout-problem.cc
Run grand-replace (issue 3765)
[lilypond.git] / lily / page-layout-problem.cc
index c3cd382d41bf491a02fdf0eb921f30631d33fdf3..52720d54490738c1579e09d218b0a6cf688f786b 100644 (file)
@@ -1,7 +1,7 @@
 /*
   This file is part of LilyPond, the GNU music typesetter.
 
-  Copyright (C) 2009--2012 Joe Neeman <joeneeman@gmail.com>
+  Copyright (C) 2009--2014 Joe Neeman <joeneeman@gmail.com>
 
   LilyPond is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -161,8 +161,10 @@ Page_layout_problem::add_footnotes_to_lines (SCM lines, int counter, Paper_book
     in duplicated work, either by making this process less complicated or (preferably)
     by passing its results downstream.
   */
-  vector<SCM> footnote_number_markups; // Holds the numbering markups.
-  vector<Stencil> footnote_number_stencils; // Holds translated versions of the stencilized numbering markups.
+
+  // find the maximum X_AXIS length
+  Real max_length = -infinity_f;
+
   for (vsize i = 0; i < fn_count; i++)
     {
       if (fn_grobs[i])
@@ -172,43 +174,40 @@ Page_layout_problem::add_footnotes_to_lines (SCM lines, int counter, Paper_book
             (void) scm_call_1 (assertion_function, scm_from_int (counter));
         }
       SCM markup = scm_call_1 (numbering_function, scm_from_int (counter));
-      Stencil *s = unsmob_stencil (Text_interface::interpret_markup (layout, props, markup));
-      if (!s)
+      SCM stencil = Text_interface::interpret_markup (layout, props, markup);
+      Stencil *st = unsmob_stencil (stencil);
+      if (!st)
         {
           programming_error ("Your numbering function needs to return a stencil.");
-          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);
+          markup = SCM_EOL;
+          stencil = Stencil (Box (Interval (0, 0), Interval (0, 0)), SCM_EOL).smobbed_copy ();
+          st = unsmob_stencil (stencil);
         }
+      in_text_numbers = scm_cons (markup, in_text_numbers);
+      numbers = scm_cons (stencil, numbers);
+
+      if (!st->extent (X_AXIS).is_empty ())
+        max_length = max (max_length, st->extent (X_AXIS)[RIGHT]);
+
       counter++;
     }
 
-  // find the maximum X_AXIS length
-  Real max_length = -infinity_f;
-  for (vsize i = 0; i < fn_count; i++)
-    max_length = max (max_length, footnote_number_stencils[i].extent (X_AXIS).length ());
+  in_text_numbers = scm_reverse_x (in_text_numbers, SCM_EOL);
+  numbers = scm_reverse_x (numbers, SCM_EOL);
 
   /*
     translate each stencil such that it attains the correct maximum length and bundle the
     footnotes into a scheme object.
   */
 
-  for (vsize i = 0; i < fn_count; i++)
+  for (SCM p = numbers; scm_is_pair (p); p = scm_cdr (p))
     {
-      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);
-      numbers = scm_cons (footnote_number_stencils[i].smobbed_copy (), numbers);
+      Stencil *st = unsmob_stencil (scm_car (p));
+      if (!st->extent (X_AXIS).is_empty ())
+        st->translate_axis ((max_length - st->extent (X_AXIS)[RIGHT]),
+                            X_AXIS);
     }
 
-  in_text_numbers = scm_reverse_x (in_text_numbers, SCM_EOL);
-  numbers = scm_reverse_x (numbers, SCM_EOL);
-
   // build the footnotes
 
   for (SCM s = lines; scm_is_pair (s); s = scm_cdr (s))
@@ -653,8 +652,6 @@ Page_layout_problem::append_system (System *sys, Spring const &spring, Real inde
                            : 0;
 
   // Corner case: there was only one staff, and it wasn't spaceable.
-  // Mark it spaceable, because we do not allow non-spaceable staves
-  // to be at the top or bottom of a system.
   if (!found_spaceable_staff && elts.size ())
     mark_as_spaceable (elts[0]);
 }
@@ -668,7 +665,8 @@ Page_layout_problem::append_prob (Prob *prob, Spring const &spring, Real padding
 
   if (sky)
     {
-      minimum_distance = (*sky)[UP].distance (bottom_skyline_);
+      minimum_distance = max ((*sky)[UP].distance (bottom_skyline_),
+                              bottom_loose_baseline_);
       bottom_skyline_ = (*sky)[DOWN];
     }
   else if (Stencil *sten = unsmob_stencil (prob->get_property ("stencil")))
@@ -679,6 +677,7 @@ Page_layout_problem::append_prob (Prob *prob, Spring const &spring, Real padding
       bottom_skyline_.clear ();
       bottom_skyline_.set_minimum_height (iv[DOWN]);
     }
+  bottom_loose_baseline_ = 0.0;
 
   Spring spring_copy = spring;
   if (tight_spacing)
@@ -729,12 +728,12 @@ Page_layout_problem::solve_rod_spring_problem (bool ragged, Real fixed_force)
       Real overflow = spacer.configuration_length (spacer.force ())
                       - page_height_;
       if (ragged && overflow < 1e-6)
-        warning (_ ("cannot fit music on page: ragged-spacing was requested, but page was compressed"));
+        warning (_ ("ragged-bottom was specified, but page must be compressed"));
       else
         {
-          warning (_f ("cannot fit music on page: overflow is %f",
+          warning (_f ("compressing over-full page by %.1f staff-spaces",
                        overflow));
-          warning (_ ("compressing music to fit"));
+          force_ = -infinity_f;
           vsize space_count = solution_.size ();
           Real spacing_increment = overflow / (space_count - 2);
           for (vsize i = 2; i < space_count; i++)