]> git.donarmstrong.com Git - lilypond.git/commitdiff
Add support for manually specifying page count.
authorJoe Neeman <joeneeman@gmail.com>
Mon, 12 Nov 2007 11:45:31 +0000 (22:45 +1100)
committerJoe Neeman <joeneeman@gmail.com>
Sat, 17 Nov 2007 22:59:36 +0000 (09:59 +1100)
lily/include/page-breaking.hh
lily/optimal-page-breaking.cc
lily/page-breaking.cc

index 18704fd36b61f68a25ee50858983078ebcc1c9c8..b14c780ba5fdf4db3101ec511608f4ae92f6073f 100644 (file)
@@ -102,6 +102,7 @@ public:
   bool is_last () const;
   Real page_height (int page_number, bool last) const;
   Real page_top_space () const;
+  vsize system_count () const;
 
 protected:
   Paper_book *book_;
@@ -149,6 +150,7 @@ private:
   bool ragged_;
   bool ragged_last_;
   Real page_top_space_;
+  vsize system_count_;
 
   vector<Line_division> current_configurations_;
   vector<Break_position> current_chunks_;
index 34ff7f1b184cb519b418c2b44f53417599a31b4d..8335a2376fee8b9e5bbc23edbc48528228638bc8 100644 (file)
@@ -39,24 +39,38 @@ Optimal_page_breaking::solve ()
   vsize end = last_break_position ();
   vsize max_sys_count = max_system_count (0, end);
   vsize first_page_num = robust_scm2int (book_->paper_->c_variable ("first-page-number"), 1);
+  SCM forced_page_count = book_->paper_->c_variable ("page-count");
 
-  /* find out the ideal number of pages */
-  message (_ ("Finding the ideal number of pages..."));
   set_to_ideal_line_configuration (0, end);
+
+  Page_spacing_result best;
+  vsize page_count = robust_scm2int (forced_page_count, 1);
+  Line_division ideal_line_division;
+  Line_division best_division;
+  vsize min_sys_count = 0;
+  vsize ideal_sys_count = system_count ();
+  
+  if (!scm_is_integer (forced_page_count))
+    {
+      /* find out the ideal number of pages */
+      message (_ ("Finding the ideal number of pages..."));
   
-  Page_spacing_result best = space_systems_on_best_pages (0, first_page_num);
-  vsize page_count = best.systems_per_page_.size ();
-  Line_division ideal_line_division = current_configuration (0);
-  Line_division best_division = ideal_line_division;
+      best = space_systems_on_best_pages (0, first_page_num);
+      page_count = best.systems_per_page_.size ();
+      ideal_line_division = current_configuration (0);
+      best_division = ideal_line_division;
 
-  vsize ideal_sys_count = best.system_count ();
-  vsize min_sys_count = ideal_sys_count - best.systems_per_page_.back ();
+      ideal_sys_count = best.system_count ();
+      min_sys_count = ideal_sys_count - best.systems_per_page_.back ();
   
-  if (page_count > 1 && best.systems_per_page_[page_count - 2] > 1)
-    min_sys_count -= best.systems_per_page_[page_count - 2];
+      if (page_count > 1 && best.systems_per_page_[page_count - 2] > 1)
+       min_sys_count -= best.systems_per_page_[page_count - 2];
+    }
 
   if (page_count == 1)
     message (_ ("Fitting music on 1 page..."));
+  else if (scm_is_integer (forced_page_count))
+    message (_f ("Fitting music on %d pages...", (int)page_count));
   else
     message (_f ("Fitting music on %d or %d pages...", (int)page_count-1, (int)page_count));
 
index be11ffa3eaf45790b4182c8ace501426c43e64ad..c728208c37c082539a92dc73dbcf727799559179 100644 (file)
@@ -98,6 +98,7 @@ Page_breaking::next_system (Break_position const &break_pos) const
 Page_breaking::Page_breaking (Paper_book *pb, Break_predicate is_break)
 {
   book_ = pb;
+  system_count_ = 0;
   ragged_ = to_boolean (pb->paper_->c_variable ("ragged-bottom"));
   ragged_last_ = to_boolean (pb->paper_->c_variable ("ragged-last-bottom"));
   page_top_space_ = robust_scm2double (pb->paper_->c_variable ("page-top-space"), 0);
@@ -127,6 +128,12 @@ Page_breaking::page_top_space () const
   return page_top_space_;
 }
 
+vsize
+Page_breaking::system_count () const
+{
+  return system_count_;
+}
+
 /* translate indices into breaks_ into start-end parameters for the line breaker */
 void
 Page_breaking::line_breaker_args (vsize sys,
@@ -451,6 +458,7 @@ Page_breaking::set_current_breakpoints (vsize start,
                                        Line_division lower_bound,
                                        Line_division upper_bound)
 {
+  system_count_ = system_count;
   current_chunks_ = chunk_list (start, end);
   current_start_breakpoint_ = start;
   current_end_breakpoint_ = end;
@@ -506,6 +514,7 @@ Page_breaking::set_to_ideal_line_configuration (vsize start, vsize end)
   current_start_breakpoint_ = start;
   current_end_breakpoint_ = end;
   clear_line_details_cache ();
+  system_count_ = 0;
 
   Line_division div;
   for (vsize i = 0; i+1 < current_chunks_.size (); i++)
@@ -518,6 +527,8 @@ Page_breaking::set_to_ideal_line_configuration (vsize start, vsize end)
        }
       else
        div.push_back (1);
+
+      system_count_ += div.back ();
     }
   current_configurations_.clear ();
   current_configurations_.push_back (div);