-static vsize
-min_page_count (vector<Line_details> const &lines, Real page_height, bool ragged, bool ragged_last)
-{
- vsize ret = 1;
- Real cur_rod_height = 0;
-
- assert (lines.size ());
- for (vsize i = lines.size (); i--;)
- {
- bool rag = ragged || (ragged_last && ret == 1);
- Real ext_len = lines[i].extent_.length ();
- Real next_height = cur_rod_height + ext_len
- + (rag ? lines[i].space_ : 0)
- + ((cur_rod_height > 0) ? lines[i].padding_: 0);
-
- if ((next_height > page_height && cur_rod_height > 0)
- || (i > 0 && lines[i-1].page_permission_ == ly_symbol2scm ("force")))
- {
- ret++;
- cur_rod_height = ext_len + (rag ? lines[i].space_ : 0);
- }
- else
- cur_rod_height = next_height;
- }
-
- return ret;
-}
-
-Spacing_result
-space_systems_on_min_pages (vector<Line_details> const &lines,
- Real page_height,
- Real odd_pages_penalty,
- bool ragged,
- bool ragged_last)
-{
- vector<Line_details> compressed_lines = compress_lines (lines);
- vsize min_p_count = min_page_count (compressed_lines, page_height, ragged, ragged_last);
- Spacing_result ret;
-
- if (min_p_count == 1)
- {
- Spacing_result candidate1 = space_systems_on_1_page (compressed_lines, page_height, ragged || ragged_last);
- candidate1.force_.back () += odd_pages_penalty;
- candidate1.demerits_ += odd_pages_penalty;
- if (compressed_lines.size () == 1)
- ret = candidate1;
- else
- {
- Spacing_result candidate2 = space_systems_on_2_pages (compressed_lines, page_height, ragged, ragged_last);
- ret = (candidate1.demerits_ < candidate2.demerits_) ?
- candidate1 : candidate2;
- }
- }
- else if (min_p_count == 2)
- ret = space_systems_on_2_pages (compressed_lines, page_height, ragged, ragged_last);
- else
- {
- Page_spacer ps (compressed_lines, page_height, ragged, ragged_last);
- Spacing_result candidate1 = ps.solve (min_p_count);
- if (min_p_count % 2 == 0)
- ret = candidate1;
- else
- {
- candidate1.force_.back () += odd_pages_penalty;
- candidate1.demerits_ += odd_pages_penalty;
-
- if (min_p_count == compressed_lines.size ())
- ret = candidate1;
- else
- {
- Spacing_result candidate2 = ps.solve (min_p_count + 1);
- ret = (candidate1.demerits_ < candidate2.demerits_) ?
- candidate1 : candidate2;
- }
- }
- }
- ret.systems_per_page_ = uncompress_solution (ret.systems_per_page_, compressed_lines);
- return ret;
-}
-
-Spacing_result
-space_systems_on_best_pages (vector<Line_details> const &lines,
- Real page_height,
- Real odd_pages_penalty,
- bool ragged,
- bool ragged_last)
-{
- vector<Line_details> compressed_lines = compress_lines (lines);
- vsize min_p_count = min_page_count (compressed_lines, page_height, ragged, ragged_last);
-
- Page_spacer ps (compressed_lines, page_height, ragged, ragged_last);
- Spacing_result best = ps.solve (min_p_count);
- best.force_.back () += (min_p_count % 2) ? odd_pages_penalty : 0;
- best.demerits_ += (min_p_count % 2) ? odd_pages_penalty : 0;
-
- for (vsize i = min_p_count+1; i <= compressed_lines.size (); i++)
- {
- Spacing_result cur = ps.solve (i);
- cur.demerits_ += (i % 2) ? odd_pages_penalty : 0;
- if (cur.demerits_ < best.demerits_)
- best = cur;
- }
-
- best.systems_per_page_ = uncompress_solution (best.systems_per_page_, compressed_lines);
- return best;
-}