From 77706635f33adff837dc7af0482f51ff3f0f5cb1 Mon Sep 17 00:00:00 2001 From: Joe Neeman Date: Fri, 31 Dec 2010 12:43:20 +0700 Subject: [PATCH] Fix page-count with systems-per-page. --- lily/include/page-breaking.hh | 9 +++++---- lily/optimal-page-breaking.cc | 28 ++++++++++++++++++++++++---- lily/page-breaking.cc | 13 +++++++++---- 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/lily/include/page-breaking.hh b/lily/include/page-breaking.hh index 45ec467dc2..9f226ebafd 100644 --- a/lily/include/page-breaking.hh +++ b/lily/include/page-breaking.hh @@ -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_; diff --git a/lily/optimal-page-breaking.cc b/lily/optimal-page-breaking.cc index 65663798b3..bf10cfa143 100644 --- a/lily/optimal-page-breaking.cc +++ b/lily/optimal-page-breaking.cc @@ -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); diff --git a/lily/page-breaking.cc b/lily/page-breaking.cc index 993bfa4592..7e58ec4285 100644 --- a/lily/page-breaking.cc +++ b/lily/page-breaking.cc @@ -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 const &chunks, bool min) @@ -702,7 +707,7 @@ Page_breaking::system_count_bounds (vector 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 -- 2.39.2