X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpage-breaking.cc;h=1ae769e82d641d79145e53491bd77795baf2d4a4;hb=997f899fa8184636570db2cb661cc8a8a5953bd6;hp=b6951925ad7ce7cc518b6b68f90efc225201eb78;hpb=298ee5a34af5f84b903e8d5b11854148e117af81;p=lilypond.git diff --git a/lily/page-breaking.cc b/lily/page-breaking.cc index b6951925ad..1ae769e82d 100644 --- a/lily/page-breaking.cc +++ b/lily/page-breaking.cc @@ -36,6 +36,7 @@ compress_lines (const vector &orig) compressed.extent_[UP] = old.extent_[UP] + orig[i].extent_.length () + old.padding_; compressed.space_ += old.space_; compressed.inverse_hooke_ += old.inverse_hooke_; + compressed.title_ = old.title_; /* we don't need the force_ field for the vertical spacing, so we use force_ = n to signal that the line was compressed, @@ -97,8 +98,10 @@ Page_breaking::next_system (Break_position const &break_pos) const Page_breaking::Page_breaking (Paper_book *pb, Break_predicate is_break) { book_ = pb; + system_count_ = 0; ragged_ = to_boolean (pb->paper_->c_variable ("ragged-bottom")); ragged_last_ = to_boolean (pb->paper_->c_variable ("ragged-last-bottom")); + page_top_space_ = robust_scm2double (pb->paper_->c_variable ("page-top-space"), 0); create_system_list (); find_chunks_and_breaks (is_break); } @@ -119,6 +122,18 @@ Page_breaking::ragged_last () const return ragged_last_; } +Real +Page_breaking::page_top_space () const +{ + return page_top_space_; +} + +vsize +Page_breaking::system_count () const +{ + return system_count_; +} + /* translate indices into breaks_ into start-end parameters for the line breaker */ void Page_breaking::line_breaker_args (vsize sys, @@ -210,7 +225,7 @@ Page_breaking::page_height (int page_num, bool last) const ly_symbol2scm ("is-last"), scm_from_bool (last), SCM_UNDEFINED)); SCM height = scm_apply_1 (calc_height, page, SCM_EOL); - return scm_to_double (height) - scm_to_double (book_->paper_->c_variable ("page-top-space")); + return scm_to_double (height) - page_top_space_; } SCM @@ -443,6 +458,7 @@ Page_breaking::set_current_breakpoints (vsize start, Line_division lower_bound, Line_division upper_bound) { + system_count_ = system_count; current_chunks_ = chunk_list (start, end); current_start_breakpoint_ = start; current_end_breakpoint_ = end; @@ -498,6 +514,7 @@ Page_breaking::set_to_ideal_line_configuration (vsize start, vsize end) current_start_breakpoint_ = start; current_end_breakpoint_ = end; clear_line_details_cache (); + system_count_ = 0; Line_division div; for (vsize i = 0; i+1 < current_chunks_.size (); i++) @@ -510,6 +527,8 @@ Page_breaking::set_to_ideal_line_configuration (vsize start, vsize end) } else div.push_back (1); + + system_count_ += div.back (); } current_configurations_.clear (); current_configurations_.push_back (div); @@ -668,16 +687,19 @@ Page_spacing_result Page_breaking::space_systems_on_n_pages (vsize configuration, vsize n, vsize first_page_num) { Page_spacing_result ret; - assert (n >= min_page_count (configuration, first_page_num)); cache_line_details (configuration); - if (n > cached_line_details_.size ()) - return Page_spacing_result (); - if (n == 1) + bool valid_n = (n >= min_page_count (configuration, first_page_num) + && n <= cached_line_details_.size ()); + + if (!valid_n) + programming_error ("number of pages is out of bounds"); + + if (n == 1 && valid_n) ret = space_systems_on_1_page (cached_line_details_, page_height (first_page_num, is_last ()), ragged () || (is_last () && ragged_last ())); - else if (n == 2) + else if (n == 2 && valid_n) ret = space_systems_on_2_pages (configuration, first_page_num); else { @@ -691,7 +713,19 @@ Page_breaking::space_systems_on_n_pages (vsize configuration, vsize n, vsize fir Real Page_breaking::blank_page_penalty () const { - SCM penalty_sym = is_last () ? ly_symbol2scm ("blank-last-page-force") : ly_symbol2scm ("blank-page-force"); + SCM penalty_sym; + + if (is_last ()) + penalty_sym = ly_symbol2scm ("blank-last-page-force"); + else if (ends_score ()) + penalty_sym = ly_symbol2scm ("blank-after-score-page-force"); + else + penalty_sym = ly_symbol2scm ("blank-page-force"); + + Break_position const &pos = breaks_[current_end_breakpoint_]; + if (Paper_score *ps = system_specs_[pos.system_spec_index_].pscore_) + return robust_scm2double (ps->layout ()->lookup_variable (penalty_sym), 0.0); + return robust_scm2double (book_->paper_->lookup_variable (penalty_sym), 0.0); } @@ -703,8 +737,12 @@ Page_breaking::space_systems_on_n_or_one_more_pages (vsize configuration, vsize cache_line_details (configuration); vsize min_p_count = min_page_count (configuration, first_page_num); + bool valid_n = n >= min_p_count || n <= cached_line_details_.size (); - if (n == 1) + if (!valid_n) + programming_error ("both page counts are out of bounds"); + + if (n == 1 && valid_n) { bool rag = ragged () || (is_last () && ragged_last ()); Real height = page_height (first_page_num, is_last ()); @@ -718,9 +756,9 @@ Page_breaking::space_systems_on_n_or_one_more_pages (vsize configuration, vsize { Page_spacer ps (cached_line_details_, first_page_num, this); - if (n >= min_p_count) + if (n >= min_p_count || !valid_n) n_res = ps.solve (n); - if (n < cached_line_details_.size ()) + if (n < cached_line_details_.size () || !valid_n) m_res = ps.solve (n+1); } @@ -765,7 +803,7 @@ Page_breaking::pack_systems_on_least_pages (vsize configuration, vsize first_pag Page_spacing_result res; vsize page = 0; vsize page_first_line = 0; - Page_spacing space (page_height (first_page_num, false)); + Page_spacing space (page_height (first_page_num, false), page_top_space_); cache_line_details (configuration); for (vsize line = 0; line < cached_line_details_.size (); line++) @@ -869,7 +907,7 @@ Page_breaking::finalize_spacing_result (vsize configuration, Page_spacing_result Page_spacing_result Page_breaking::space_systems_on_1_page (vector const &lines, Real page_height, bool ragged) { - Page_spacing space (page_height); + Page_spacing space (page_height, page_top_space_); Page_spacing_result ret; for (vsize i = 0; i < lines.size (); i++) @@ -909,8 +947,8 @@ Page_breaking::space_systems_on_2_pages (vsize configuration, vsize first_page_n vector page1_force; vector page2_force; - Page_spacing page1 (page1_height); - Page_spacing page2 (page2_height); + Page_spacing page1 (page1_height, page_top_space_); + Page_spacing page2 (page2_height, page_top_space_); page1_force.resize (cached_line_details_.size () - 1, infinity_f); page2_force.resize (cached_line_details_.size () - 1, infinity_f); @@ -982,6 +1020,12 @@ Page_breaking::is_last () const return current_end_breakpoint_ == last_break_position (); } +bool +Page_breaking::ends_score () const +{ + return breaks_[current_end_breakpoint_].score_ender_; +} + vsize Page_breaking::last_break_position () const {