X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpage-breaking.cc;h=b6951925ad7ce7cc518b6b68f90efc225201eb78;hb=8f2493cf80f90a12938c305c5fcb01de7e9a03fc;hp=2c137e36842f108b22da3b7583a4a0f67bf38611;hpb=4720c6db726f01da800fb1295a2b072ca931efc4;p=lilypond.git diff --git a/lily/page-breaking.cc b/lily/page-breaking.cc index 2c137e3684..b6951925ad 100644 --- a/lily/page-breaking.cc +++ b/lily/page-breaking.cc @@ -526,6 +526,7 @@ Page_breaking::cache_line_details (vsize configuration_index) { if (cached_configuration_index_ != configuration_index) { + cached_configuration_index_ = configuration_index; SCM padding_scm = book_->paper_->c_variable ("page-breaking-between-system-padding"); if (!scm_is_number (padding_scm)) padding_scm = book_->paper_->c_variable ("between-system-padding"); @@ -549,7 +550,9 @@ Page_breaking::cache_line_details (vsize configuration_index) { assert (div[i] == 1); uncompressed_line_details_.push_back (Line_details (system_specs_[sys].prob_)); - uncompressed_line_details_.back ().padding_ = padding; + uncompressed_line_details_.back ().padding_ = + robust_scm2double (system_specs_[sys].prob_->get_property ("next-padding"), + padding); } } cached_line_details_ = compress_lines (uncompressed_line_details_); @@ -617,7 +620,7 @@ Page_breaking::min_page_count (vsize configuration, vsize first_page_num) Real ext_len = cached_line_details_[i].extent_.length (); Real next_rod_height = cur_rod_height + ext_len + ((cur_rod_height > 0) ? cached_line_details_[i].padding_: 0); - Real next_spring_height = cur_spring_height + line_space (cached_line_details_[i]); + Real next_spring_height = cur_spring_height + cached_line_details_[i].space_; Real next_height = next_rod_height + (ragged () ? next_spring_height : 0); @@ -626,7 +629,7 @@ Page_breaking::min_page_count (vsize configuration, vsize first_page_num) && cached_line_details_[i-1].page_permission_ == ly_symbol2scm ("force"))) { cur_rod_height = ext_len; - cur_spring_height = line_space (cached_line_details_[i]); + cur_spring_height = cached_line_details_[i].space_; cur_page_height = page_height (first_page_num + ret, false); ret++; } @@ -726,7 +729,9 @@ Page_breaking::space_systems_on_n_or_one_more_pages (vsize configuration, vsize Real penalty = blank_page_penalty (); n_res.demerits_ += penalty; - n_res.force_.back () += penalty; + + if (n_res.force_.size ()) + n_res.force_.back () += penalty; return (m_res.demerits_ < n_res.demerits_) ? m_res : n_res; } @@ -754,11 +759,73 @@ Page_breaking::space_systems_on_best_pages (vsize configuration, vsize first_pag return finalize_spacing_result (configuration, best); } +Page_spacing_result +Page_breaking::pack_systems_on_least_pages (vsize configuration, vsize first_page_num) +{ + Page_spacing_result res; + vsize page = 0; + vsize page_first_line = 0; + Page_spacing space (page_height (first_page_num, false)); + + cache_line_details (configuration); + for (vsize line = 0; line < cached_line_details_.size (); line++) + { + Real prev_force = space.force_; + space.append_system (cached_line_details_[line]); + if ((line > page_first_line) + && (isinf (space.force_) + || ((line > 0) + && (cached_line_details_[line-1].page_permission_ == ly_symbol2scm ("force"))))) + { + res.systems_per_page_.push_back (line - page_first_line); + res.force_.push_back (prev_force); + res.penalty_ += cached_line_details_[line-1].page_penalty_; + page++; + space.resize (page_height (first_page_num + page, false)); + space.clear (); + space.append_system (cached_line_details_[line]); + page_first_line = line; + } + + if (line == cached_line_details_.size () - 1) + { + /* This is the last line */ + /* When the last page height was computed, we did not know yet that it + * was the last one. If the systems put on it don't fit anymore, the last + * system is moved to a new page */ + space.resize (page_height (first_page_num + page, true)); + if ((line > page_first_line) && (isinf (space.force_))) + { + res.systems_per_page_.push_back (line - page_first_line); + res.force_.push_back (prev_force); + /* the last page containing the last line */ + space.resize (page_height (first_page_num + page + 1, true)); + space.clear (); + space.append_system (cached_line_details_[line]); + res.systems_per_page_.push_back (1); + res.force_.push_back (space.force_); + res.penalty_ += cached_line_details_[line-1].page_penalty_; + res.penalty_ += cached_line_details_[line].page_penalty_; + } + else + { + res.systems_per_page_.push_back (line + 1 - page_first_line); + res.force_.push_back (space.force_); + res.penalty_ += cached_line_details_[line].page_penalty_; + } + } + } + return finalize_spacing_result (configuration, res); +} + /* Calculate demerits and fix res.systems_per_page_ so that it refers to the original line numbers, not the ones given by compress_lines (). */ Page_spacing_result Page_breaking::finalize_spacing_result (vsize configuration, Page_spacing_result res) { + if (res.force_.empty ()) + return res; + cache_line_details (configuration); res.systems_per_page_ = uncompress_solution (res.systems_per_page_, cached_line_details_);