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));
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);
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,
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;
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++)
}
else
div.push_back (1);
+
+ system_count_ += div.back ();
}
current_configurations_.clear ();
current_configurations_.push_back (div);