int
Page_breaking::max_systems_per_page () const
{
+ if (systems_per_page_)
+ return systems_per_page_;
return max_systems_per_page_;
}
int
Page_breaking::min_systems_per_page () const
{
+ if (systems_per_page_)
+ return systems_per_page_;
return min_systems_per_page_;
}
->get_broken_system_grobs ();
ret = scm_cons (lines, ret);
}
- else
+ else if (Prob *pb = system_specs_[sys].prob_)
{
- Prob *pb = system_specs_[sys].prob_;
ret = scm_cons (scm_list_1 (pb->self_scm ()), ret);
pb->unprotect ();
}
SCM
Page_breaking::make_pages (vector<vsize> lines_per_page, SCM systems)
{
+ if (scm_is_null (systems))
+ return SCM_EOL;
+
int first_page_number
= robust_scm2int (book_->paper_->c_variable ("first-page-number"), 1);
SCM ret = SCM_EOL;
system_specs_.push_back (System_spec (pb));
}
}
+ if (!system_specs_.size ())
+ system_specs_.push_back (System_spec ());
}
void
}
line_breaking_.push_back (Constrained_breaking (system_specs_[i].pscore_, line_breaker_columns));
}
- else
+ else if (system_specs_[i].prob_)
{
bool break_point = prob_is_break && prob_is_break (system_specs_[i].prob_);
if (break_point || i == system_specs_.size () - 1)
else
{
assert (div[i] == 1);
- uncompressed_line_details_.push_back (Line_details (system_specs_[sys].prob_, book_->paper_));
+ uncompressed_line_details_.push_back (system_specs_[sys].prob_
+ ? Line_details (system_specs_[sys].prob_, book_->paper_)
+ : Line_details ());
}
}
cached_line_details_ = compress_lines (uncompressed_line_details_);
for (vsize i = 0; i < cached_line_details_.size (); i++)
{
+ Line_details const &cur = cached_line_details_[i];
+ Line_details const *const prev = (i > 0) ? &cached_line_details_[i-1] : 0;
Real ext_len;
if (cur_rod_height > 0)
- ext_len = cached_line_details_[i].tallness_;
+ ext_len = cur.tallness_;
else
- ext_len = cached_line_details_[i].full_height();
+ ext_len = cur.full_height();
+ Real spring_len = (i > 0) ? prev->spring_length (cur) : 0;
Real next_rod_height = cur_rod_height + ext_len;
- Real next_spring_height = cur_spring_height + cached_line_details_[i].space_;
+ Real next_spring_height = cur_spring_height + spring_len;
Real next_height = next_rod_height + (ragged () ? next_spring_height : 0)
- + min_whitespace_at_bottom_of_page (cached_line_details_[i]);
- int next_line_count = line_count + cached_line_details_[i].compressed_nontitle_lines_count_;
+ + min_whitespace_at_bottom_of_page (cur);
+ int next_line_count = line_count + cur.compressed_nontitle_lines_count_;
if ((!too_few_lines (line_count) && (next_height > cur_page_height && cur_rod_height > 0))
|| too_many_lines (next_line_count)
- || (i > 0
- && cached_line_details_[i-1].page_permission_ == ly_symbol2scm ("force")))
+ || (prev && prev->page_permission_ == ly_symbol2scm ("force")))
{
- line_count = cached_line_details_[i].compressed_nontitle_lines_count_;
- cur_rod_height = cached_line_details_[i].full_height();
- cur_spring_height = cached_line_details_[i].space_;
+ line_count = cur.compressed_nontitle_lines_count_;
+ cur_rod_height = cur.full_height();
+ cur_spring_height = 0;
page_starter = i;
cur_page_height = page_height (first_page_num + ret, false);
- cur_page_height -= min_whitespace_at_top_of_page (cached_line_details_[i]);
+ cur_page_height -= min_whitespace_at_top_of_page (cur);
ret++;
}
Page_spacing_result
Page_breaking::space_systems_on_best_pages (vsize configuration, vsize first_page_num)
{
+ if (systems_per_page_ > 0)
+ return space_systems_with_fixed_number_per_page (configuration, first_page_num);
+
cache_line_details (configuration);
Page_spacer ps (cached_line_details_, first_page_num, this);
res.penalty_ += cached_line_details_[line-1].page_penalty_;
if (system_count_on_this_page != systems_per_page_)
{
- res.penalty_ += TERRIBLE_SPACING_PENALTY;
+ res.penalty_ += abs (system_count_on_this_page - systems_per_page_) * TERRIBLE_SPACING_PENALTY;
res.system_count_status_ |= ((system_count_on_this_page < systems_per_page_))
? SYSTEM_COUNT_TOO_FEW : SYSTEM_COUNT_TOO_MANY;
}