-vsize
-min_page_count (vector<Line_details> const &uncompressed_lines,
- Real page_height, bool ragged, bool ragged_last)
-{
- vsize ret = 1;
- Real cur_rod_height = 0;
- vector<Line_details> lines = compress_lines (uncompressed_lines);
-
- 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 < lines.size () - 1 && lines[i].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_n_pages (vector<Line_details> const &lines,
- vsize n,
- Real page_height,
- bool ragged,
- bool ragged_last)
-{
- vector<Line_details> compressed_lines = compress_lines (lines);
- Spacing_result ret;
- assert (n >= min_page_count (lines, page_height, ragged, ragged_last));
-
- if (n > compressed_lines.size ())
- return Spacing_result ();
- if (n == 1)
- ret = space_systems_on_1_page (compressed_lines, page_height, ragged || ragged_last);
- else if (n == 2)
- ret = space_systems_on_2_pages (compressed_lines, page_height, ragged, ragged_last);
-
- Page_spacer ps (compressed_lines, page_height, ragged, ragged_last);
- ret = ps.solve (n);
-
- ret.systems_per_page_ = uncompress_solution (ret.systems_per_page_, compressed_lines);
- return ret;
-}
-
-Spacing_result
-space_systems_on_n_or_one_more_pages (vector<Line_details> const &lines,
- vsize n,
- Real page_height,
- Real odd_pages_penalty,
- bool ragged,
- bool ragged_last)
-{
- Spacing_result n_res = space_systems_on_n_pages (lines, n, page_height, ragged, ragged_last);
- Spacing_result m_res = space_systems_on_n_pages (lines, n+1, page_height, ragged, ragged_last);
- n_res.demerits_ += odd_pages_penalty;
- n_res.force_.back () += odd_pages_penalty;
-
- if (n_res.demerits_ < m_res.demerits_)
- return n_res;
- return m_res;
-}
-
-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;
-}