/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 2006--2009 Joe Neeman <joeneeman@gmail.com>
+ Copyright (C) 2006--2010 Joe Neeman <joeneeman@gmail.com>
LilyPond is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
{
}
+extern bool debug_page_breaking_scoring;
+
// Solves the subproblem betwen the (END-1)th \pageBreak and the
// ENDth \pageBreak.
// Returns a vector of systems per page for the pages within this chunk.
vector<vsize>
-Optimal_page_breaking::solve_chunk (vsize end)
+Optimal_page_breaking::solve_chunk (vsize end, SCM forced_page_count)
{
vsize max_sys_count = max_system_count (end-1, 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");
set_to_ideal_line_configuration (end-1, end);
Page_spacing_result best_for_this_sys_count;
set_current_breakpoints (end-1, end, sys_count, Line_division (), bound);
+ if (debug_page_breaking_scoring)
+ message (_f ("trying %d systems", (int)sys_count));
+
for (vsize i = 0; i < current_configuration_count (); i++)
{
vsize min_p_count = min_page_count (i, first_page_num);
if (min_p_count == page_count || scm_is_integer (forced_page_count))
cur = space_systems_on_n_pages (i, page_count, first_page_num);
else
- cur = space_systems_on_n_or_one_more_pages (i, page_count-1, first_page_num);
+ cur = space_systems_on_n_or_one_more_pages (i, page_count-1, first_page_num, 0);
if (cur.demerits_ < best_for_this_sys_count.demerits_)
{
}
}
+ if (debug_page_breaking_scoring)
+ message (_f ("best score for this sys-count: %f", best_for_this_sys_count.demerits_));
+
if (best_for_this_sys_count.demerits_ < best.demerits_)
{
best = best_for_this_sys_count;
Real best_demerits_for_this_sys_count = infinity_f;
set_current_breakpoints (end-1, end, sys_count, bound);
+ if (debug_page_breaking_scoring)
+ message (_f ("trying %d systems", (int)sys_count));
+
for (vsize i = 0; i < current_configuration_count (); i++)
{
vsize min_p_count = min_page_count (i, first_page_num);
bound = current_configuration (i);
}
}
+
+ if (debug_page_breaking_scoring)
+ message (_f ("best score for this sys-count: %f", best_demerits_for_this_sys_count));
+
if (best_demerits_for_this_sys_count >= BAD_SPACING_PENALTY
&& !(best.system_count_status_ & SYSTEM_COUNT_TOO_FEW))
break;
{
vector<vsize> systems_per_page;
+ SCM forced_page_counts = book_->paper_->c_variable ("page-count");
+ if (scm_is_integer (forced_page_counts))
+ forced_page_counts = scm_list_1 (forced_page_counts);
+
+ bool is_forced_page_counts = false;
+ if (scm_to_bool (scm_list_p (forced_page_counts)))
+ {
+ int len = scm_to_int (scm_length (forced_page_counts));
+ if (len != (int)last_break_position ())
+ {
+ warning (_f ("page-count has length %d, but it should have length %d "
+ "(one more than the number of forced page breaks)",
+ len, (int)last_break_position ()));
+ }
+ else
+ is_forced_page_counts = true;
+ }
+
+
message (_f ("Solving %d page-breaking chunks...", last_break_position ()));
for (vsize end = 1; end <= last_break_position (); ++end)
{
- vector<vsize> chunk_systems = solve_chunk (end);
+ SCM page_count = SCM_EOL;
+ if (is_forced_page_counts)
+ {
+ page_count = scm_car (forced_page_counts);
+ forced_page_counts = scm_cdr (forced_page_counts);
+ }
+
+ vector<vsize> chunk_systems = solve_chunk (end, page_count);
systems_per_page.insert (systems_per_page.end (), chunk_systems.begin (), chunk_systems.end ());
}