]> git.donarmstrong.com Git - lilypond.git/commitdiff
Fix page-count with systems-per-page.
authorJoe Neeman <joeneeman@gmail.com>
Fri, 31 Dec 2010 05:43:20 +0000 (12:43 +0700)
committerJoe Neeman <joeneeman@gmail.com>
Fri, 31 Dec 2010 05:43:20 +0000 (12:43 +0700)
lily/include/page-breaking.hh
lily/optimal-page-breaking.cc
lily/page-breaking.cc

index 45ec467dc23f6daed3aca01416012f1137217708..9f226ebafdcba931b3804bfaa9185e1396650f0b 100644 (file)
@@ -52,15 +52,16 @@ struct System_spec
 struct Break_position
 {
   /*
-    index in system_spec_index_, if VPOS start of book. 
+    index into system_specs_, if this is VPOS, the Break_position represents the
+    start of the book. 
    */
   vsize system_spec_index_;
 
-  /* if system_spec_index_ is a score, then we start at the score_brk_'th possible
-     page-break in the score */
+  /* if system_spec_index_ indexes a score, then we start at the score_brk_'th
+     possible page-break in the score */
   vsize score_break_; 
 
-  /* if system_spec_index_ is a score, this points to the broken column */
+  /* if system_spec_index_ indexes a score, this points to the broken column */
   Grob *col_;  
   bool score_ender_;
 
index 65663798b3ae2b3de61bb04c143f85853da39bc7..bf10cfa14341b808a1100e785041c43f85ff1925 100644 (file)
@@ -72,12 +72,32 @@ Optimal_page_breaking::solve ()
     }
   else
     {
+      /* If systems-per-page and page-count are both specified, we know exactly
+        how many systems should be present. */
+      if (systems_per_page () > 0)
+       {
+         ideal_sys_count = systems_per_page () * page_count;
+
+         if (ideal_sys_count > max_system_count (0, end)
+             || ideal_sys_count < min_system_count (0, end))
+           {
+             warning (_ ("could not satisfy systems-per-page and page-count at the same time, ignoring systems-per-page"));
+             ideal_sys_count = best.system_count ();
+             min_sys_count = page_count;
+           }
+         else
+           {
+             set_current_breakpoints (0, end, ideal_sys_count);
+             min_sys_count = max_sys_count = ideal_sys_count;
+             ideal_line_division = best_division = current_configuration (0);
+           }
+       }
+      else
+       min_sys_count = page_count;
+
       /* TODO: the following line will spit out programming errors if the
         ideal line spacing doesn't fit on PAGE_COUNT pages */
-      /* TODO: the interaction between systems_per_page and page_count needs to
-        be considered. */
       best = space_systems_on_n_pages (0, page_count, first_page_num);
-      min_sys_count = page_count;
     }
 
   if (page_count == 1)
@@ -89,7 +109,7 @@ Optimal_page_breaking::solve ()
 
   /* try a smaller number of systems than the ideal number for line breaking */
   Line_division bound = ideal_line_division;
-  for (vsize sys_count = ideal_sys_count; --sys_count >= min_sys_count;)
+  for (vsize sys_count = ideal_sys_count + 1; --sys_count >= min_sys_count;)
     {
       Page_spacing_result best_for_this_sys_count;
       set_current_breakpoints (0, end, sys_count, Line_division (), bound);
index 993bfa459256c51c10fa57cb03678a018b103983..7e58ec42854b8a9629d725461e0a869347e352d5 100644 (file)
@@ -671,6 +671,7 @@ Page_breaking::chunk_list (vsize start_index, vsize end_index)
   return ret;
 }
 
+// Returns the minimum number of _non-title_ lines.
 vsize
 Page_breaking::min_system_count (vsize start, vsize end)
 {
@@ -683,6 +684,7 @@ Page_breaking::min_system_count (vsize start, vsize end)
   return ret;
 }
 
+// Returns the maximum number of _non-title_ lines.
 vsize
 Page_breaking::max_system_count (vsize start, vsize end)
 {
@@ -695,6 +697,9 @@ Page_breaking::max_system_count (vsize start, vsize end)
   return ret;
 }
 
+// The numbers returned by this function represent either
+// the maximum or minimum number of _non-title_ lines
+// per chunk.
 Page_breaking::Line_division
 Page_breaking::system_count_bounds (vector<Break_position> const &chunks,
                                    bool min)
@@ -702,7 +707,7 @@ Page_breaking::system_count_bounds (vector<Break_position> const &chunks,
   assert (chunks.size () >= 2);
 
   Line_division ret;
-  ret.resize (chunks.size () - 1, 1);
+  ret.resize (chunks.size () - 1, 0);
 
   for (vsize i = 0; i + 1 < chunks.size (); i++)
     {
@@ -802,7 +807,7 @@ Page_breaking::set_to_ideal_line_configuration (vsize start, vsize end)
          div.push_back (line_breaking_[sys].best_solution (start, end).size ());
        }
       else
-       div.push_back (1);
+       div.push_back (0);
 
       system_count_ += div.back ();
     }
@@ -839,7 +844,7 @@ Page_breaking::cache_line_details (vsize configuration_index)
            }
          else
            {
-             assert (div[i] == 1);
+             assert (div[i] == 0);
              uncompressed_line_details_.push_back (system_specs_[sys].prob_
                                                    ? Line_details (system_specs_[sys].prob_, book_->paper_)
                                                    : Line_details ());
@@ -877,7 +882,7 @@ Page_breaking::line_divisions_rec (vsize system_count,
   int real_min = max ((int) min_sys[my_index], (int) system_count - others_max);
   int real_max = min ((int) max_sys[my_index], (int) system_count - others_min);
 
-  if (real_min > real_max || real_min <= 0)
+  if (real_min > real_max || real_min < 0)
     {
       /* this should never happen within a recursive call. If it happens
         at all, it means that we were called with an unsolvable problem