From: Joe Neeman Date: Mon, 12 Nov 2007 11:45:31 +0000 (+1100) Subject: Add support for manually specifying page count. X-Git-Tag: release/2.11.35-1~4^2~2^2~5 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=85902ccc9c481c2f992676ecff060e05caffef8f;p=lilypond.git Add support for manually specifying page count. --- diff --git a/lily/include/page-breaking.hh b/lily/include/page-breaking.hh index 18704fd36b..b14c780ba5 100644 --- a/lily/include/page-breaking.hh +++ b/lily/include/page-breaking.hh @@ -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 current_configurations_; vector current_chunks_; diff --git a/lily/optimal-page-breaking.cc b/lily/optimal-page-breaking.cc index 34ff7f1b18..8335a2376f 100644 --- a/lily/optimal-page-breaking.cc +++ b/lily/optimal-page-breaking.cc @@ -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)); diff --git a/lily/page-breaking.cc b/lily/page-breaking.cc index be11ffa3ea..c728208c37 100644 --- a/lily/page-breaking.cc +++ b/lily/page-breaking.cc @@ -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);