]> git.donarmstrong.com Git - lilypond.git/commitdiff
Add regression tests and extra robustness if the user requests too many pages.
authorJoe Neeman <joeneeman@gmail.com>
Thu, 15 Nov 2007 05:36:01 +0000 (16:36 +1100)
committerJoe Neeman <joeneeman@gmail.com>
Sat, 17 Nov 2007 22:59:37 +0000 (09:59 +1100)
input/regression/page-breaking-page-count1.ly [new file with mode: 0644]
input/regression/page-breaking-page-count2.ly [new file with mode: 0644]
lily/optimal-page-breaking.cc
lily/page-breaking.cc
lily/page-spacing.cc

diff --git a/input/regression/page-breaking-page-count1.ly b/input/regression/page-breaking-page-count1.ly
new file mode 100644 (file)
index 0000000..ecbfcbb
--- /dev/null
@@ -0,0 +1,13 @@
+\version "2.11.34"
+
+\header {
+  texidoc = "The number of pages in a score can be forced by setting
+@code{page-count} in the (book-level) paper block."
+}
+
+#(set-default-paper-size "a6")
+
+\book {
+  \paper { page-count = 2}
+  \score { {c'1 c'1} }
+}
\ No newline at end of file
diff --git a/input/regression/page-breaking-page-count2.ly b/input/regression/page-breaking-page-count2.ly
new file mode 100644 (file)
index 0000000..645243a
--- /dev/null
@@ -0,0 +1,13 @@
+\version "2.11.34"
+
+\header {
+  texidoc = "The number of pages in a score can be forced by setting
+@code{page-count} in the (book-level) paper block."
+}
+
+#(set-default-paper-size "a6")
+
+\book {
+  \paper { page-count = 3}
+  \score { {c'1 c'1} }
+}
\ No newline at end of file
index 8335a2376fee8b9e5bbc23edbc48528228638bc8..4aa8bececc6ea328384e9bcb5462aef6b33ea381 100644 (file)
@@ -47,7 +47,7 @@ Optimal_page_breaking::solve ()
   vsize page_count = robust_scm2int (forced_page_count, 1);
   Line_division ideal_line_division;
   Line_division best_division;
-  vsize min_sys_count = 0;
+  vsize min_sys_count = 1;
   vsize ideal_sys_count = system_count ();
   
   if (!scm_is_integer (forced_page_count))
index c728208c37c082539a92dc73dbcf727799559179..46e0caf90c1248c4f211c8c218e5905606e1acab 100644 (file)
@@ -690,13 +690,12 @@ Page_breaking::space_systems_on_n_pages (vsize configuration, vsize n, vsize fir
   assert (n >= min_page_count (configuration, first_page_num));
 
   cache_line_details (configuration);
-  if (n > cached_line_details_.size ())
-    return Page_spacing_result ();
-  if (n == 1)
+
+  if (n == 1 && n <= cached_line_details_.size ())
     ret = space_systems_on_1_page (cached_line_details_,
                                   page_height (first_page_num, is_last ()),
                                   ragged () || (is_last () && ragged_last ()));
-  else if (n == 2)
+  else if (n == 2 && n <= cached_line_details_.size ())
     ret = space_systems_on_2_pages (configuration, first_page_num);
   else
     {
index 384ce440222a95cc1f5901dd0cdd54113e779eda..19129b3c175a0024dc157aebdcee31b8034e52a7 100644 (file)
@@ -92,11 +92,10 @@ Page_spacer::solve (vsize page_count)
     resize (page_count);
 
   Page_spacing_result ret;
-  ret.force_.resize (page_count);
-  ret.systems_per_page_.resize (page_count);
 
   vsize system = lines_.size () - 1;
-  vsize tack_onto_the_end = 0;
+  vsize extra_systems = 0;
+  vsize extra_pages = 0;
 
   if (isinf (state_.at (system, page_count-1).demerits_))
     {
@@ -112,13 +111,28 @@ Page_spacer::solve (vsize page_count)
 
       if (i)
        {
-         tack_onto_the_end = system - i;
+         extra_systems = system - i;
          system = i;
        }
       else
-       return Page_spacing_result (); /* couldn't salvage it -- probably going to crash */
+       {
+         /* try chopping off pages from the end */
+         vsize j;
+         for (j = page_count; j && isinf (state_.at (system, j-1).demerits_); j--)
+           ;
+
+         if (j)
+           {
+             extra_pages = page_count - j;
+             page_count = j;
+           }
+         else
+           return Page_spacing_result (); /* couldn't salvage it -- probably going to crash */
+       }
     }
 
+  ret.force_.resize (page_count);
+  ret.systems_per_page_.resize (page_count);
   ret.penalty_ = state_.at (system, page_count-1).penalty_
     + lines_.back ().page_penalty_ + lines_.back ().turn_penalty_;
 
@@ -133,9 +147,23 @@ Page_spacer::solve (vsize page_count)
       if (p == 0)
        ret.systems_per_page_[p] = system + 1;
       else
-       ret.systems_per_page_[p] = system - ps.prev_ + tack_onto_the_end;
+       ret.systems_per_page_[p] = system - ps.prev_;
       system = ps.prev_;
     }
+
+  if (extra_systems)
+    {
+      ret.systems_per_page_.back () += extra_systems;
+      ret.demerits_ += 200000;
+    }
+  if (extra_pages)
+    {
+      ret.force_.insert (ret.force_.end (), extra_pages, 200000);
+      ret.systems_per_page_.insert (ret.systems_per_page_.end (), extra_pages, 0);
+      ret.demerits_ += 200000;
+    }
+
+
   ret.demerits_ += ret.penalty_;
   return ret;
 }