]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/page-spacing.cc
Fix regressions in page breaking.
[lilypond.git] / lily / page-spacing.cc
index 1a3c39cfbf709d88de4725c6238fe8636141eb15..00ffcc44585ddd78bb722a319498f0f6da782664 100644 (file)
@@ -111,6 +111,10 @@ Page_spacer::solve ()
     }
 
   Page_spacing_result ret;
+  ret.penalty_ = simple_state_.back ().penalty_
+    + lines_.back ().page_penalty_ + lines_.back ().turn_penalty_;
+  ret.system_count_status_ = simple_state_.back ().system_count_status_;
+
   vsize system = lines_.size () - 1;
   while (system != VPOS)
     {
@@ -176,6 +180,7 @@ Page_spacer::solve (vsize page_count)
 
   ret.force_.resize (page_count);
   ret.systems_per_page_.resize (page_count);
+  ret.system_count_status_ = state_.at (system, page_count-1).system_count_status_;
   ret.penalty_ = state_.at (system, page_count-1).penalty_
     + lines_.back ().page_penalty_ + lines_.back ().turn_penalty_;
 
@@ -247,6 +252,7 @@ Page_spacer::calc_subproblem (vsize page, vsize line)
   // we need to look ahead a few systems in order to find the best solution.  But
   // we won't, because we stop once we overfill the page with the large header.
   vsize page_num = page == VPOS ? 0 : page;
+  Real paper_height = breaker_->paper_height ();
   Page_spacing space (breaker_->page_height (page_num + first_page_num_, last),
                      breaker_);
   Page_spacing_node &cur = page == VPOS ? simple_state_[line] : state_.at (line, page);
@@ -272,13 +278,16 @@ Page_spacer::calc_subproblem (vsize page, vsize line)
 
       space.prepend_system (lines_[page_start]);
 
+      bool overfull = (space.rod_height_ > paper_height
+                      || (ragged
+                          && (space.rod_height_ + space.spring_len_ > paper_height)));
       // This 'if' statement is a little hard to parse. It won't consider this configuration
       // if it is overfull unless the current configuration is the first one with this start
       // point. We also make an exception (and consider this configuration) if the previous
       // configuration we tried had fewer lines than min-systems-per-page.
       if (!breaker_->too_few_lines (line_count)
          && page_start < line
-         && (isinf (space.force_) || (space.force_ < 0 && ragged)))
+         && overfull)
        break;
 
       line_count += lines_[page_start].compressed_nontitle_lines_count_;