From: Joe Neeman Date: Thu, 23 Dec 2010 00:18:38 +0000 (+0700) Subject: Fix Page_breaking::min_page_count on ragged pages. X-Git-Tag: release/2.13.44-1~7 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=bd5233c02b1ba97029810ced58b8ea2c8ea0e759;p=lilypond.git Fix Page_breaking::min_page_count on ragged pages. --- diff --git a/lily/constrained-breaking.cc b/lily/constrained-breaking.cc index 29c00e1b03..ec8ce472fa 100644 --- a/lily/constrained-breaking.cc +++ b/lily/constrained-breaking.cc @@ -589,6 +589,18 @@ Line_details::tallness () const 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; diff --git a/lily/include/constrained-breaking.hh b/lily/include/constrained-breaking.hh index 4bfdde23fa..216ecc881f 100644 --- a/lily/include/constrained-breaking.hh +++ b/lily/include/constrained-breaking.hh @@ -112,6 +112,7 @@ struct Line_details { Line_details (Prob *pb, Output_def *paper); Real full_height () const; Real tallness () const; + Real spring_length (Line_details const &next_line) const; }; /* diff --git a/lily/page-breaking.cc b/lily/page-breaking.cc index 3272e02eef..993bfa4592 100644 --- a/lily/page-breaking.cc +++ b/lily/page-breaking.cc @@ -229,12 +229,16 @@ Page_breaking::systems_per_page () const 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_; } @@ -957,30 +961,32 @@ Page_breaking::min_page_count (vsize configuration, vsize first_page_num) 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++; } @@ -1182,7 +1188,7 @@ Page_breaking::space_systems_with_fixed_number_per_page (vsize configuration, 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; } diff --git a/lily/page-spacing.cc b/lily/page-spacing.cc index 76ef484b14..4e987e6998 100644 --- a/lily/page-spacing.cc +++ b/lily/page-spacing.cc @@ -50,6 +50,8 @@ Page_spacing::append_system (const Line_details &line) if (rod_height_) { rod_height_ += line.tallness_; + spring_len_ += last_line_.spring_length (line); + } else { @@ -57,14 +59,6 @@ Page_spacing::append_system (const Line_details &line) 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; @@ -75,18 +69,15 @@ Page_spacing::append_system (const Line_details &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;