return tallness_;
}
+Real
+Line_details::spring_length (Line_details const &next_line) const
+{
+ // space_ measures the spring which goes from the bottom refpoint
+ // of this to the top refpoint of next_line. We want to return
+ // the stretchable space between the bottom of this's extent to
+ // the top of next_line's extent.
+ Real refpoint_dist = tallness_ + refpoint_extent_[DOWN] - next_line.refpoint_extent_[UP];
+ Real space = next_line.title_ ? title_space_ : space_;
+ return max (0.0, space - refpoint_dist);
+}
+
Line_shape::Line_shape (Interval begin, Interval rest)
{
begin_ = begin;
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_;
}
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++;
}
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;
}
if (rod_height_)
{
rod_height_ += line.tallness_;
+ spring_len_ += last_line_.spring_length (line);
+
}
else
{
first_line_ = line;
}
- // line.space_ measures the spring which goes from the bottom refpoint
- // of one system to the top refpoint of the next. spring_len_ measures
- // how much of that is stretchable.
- Real refpoint_dist = last_line_.tallness_
- + last_line_.refpoint_extent_[DOWN]
- - line.refpoint_extent_[UP];
- Real space = line.title_ ? last_line_.title_space_ : last_line_.space_;
- spring_len_ += max (0.0, space - refpoint_dist);
inverse_spring_k_ += line.inverse_hooke_;
last_line_ = line;
void
Page_spacing::prepend_system (const Line_details &line)
{
- if (!rod_height_)
+ if (rod_height_)
+ spring_len_ += line.spring_length (first_line_);
+ else
last_line_ = line;
rod_height_ -= first_line_.full_height ();
rod_height_ += first_line_.tallness_;
rod_height_ += line.full_height();
- Real refpoint_dist = line.tallness_
- + line.refpoint_extent_[DOWN]
- - first_line_.refpoint_extent_[UP];
- Real space = first_line_.title_ ? line.title_space_ : line.space_;
- spring_len_ += max (0.0, space - refpoint_dist);
inverse_spring_k_ += line.inverse_hooke_;
first_line_ = line;