X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpage-breaking.cc;h=a111d933e5ed27e25dccce1096df5cdbd14e2034;hb=f420654e26a36d5f70580490d42ad3063ab2dba7;hp=d3a2762bbb350285dd3d00141976c9c235e793e8;hpb=5003ea937ca2d718fbbfb8479457d6b68f10f122;p=lilypond.git diff --git a/lily/page-breaking.cc b/lily/page-breaking.cc index d3a2762bbb..a111d933e5 100644 --- a/lily/page-breaking.cc +++ b/lily/page-breaking.cc @@ -212,6 +212,7 @@ Page_breaking::systems () Real Page_breaking::page_height (int page_num, bool last) const { + bool last_part = ly_scm2bool (book_->paper_->c_variable ("is-last-bookpart")); SCM mod = scm_c_resolve_module ("scm page"); SCM calc_height = scm_c_module_lookup (mod, "calc-printable-height"); SCM make_page = scm_c_module_lookup (mod, "make-page"); @@ -222,7 +223,8 @@ Page_breaking::page_height (int page_num, bool last) const SCM page = scm_apply_0 (make_page, scm_list_n ( book_->self_scm (), ly_symbol2scm ("page-number"), scm_from_int (page_num), - ly_symbol2scm ("is-last"), scm_from_bool (last), + ly_symbol2scm ("is-last-bookpart"), scm_from_bool (last_part), + ly_symbol2scm ("is-bookpart-last-page"), scm_from_bool (last), SCM_UNDEFINED)); SCM height = scm_apply_1 (calc_height, page, SCM_EOL); return scm_to_double (height) - page_top_space_; @@ -254,21 +256,24 @@ Page_breaking::make_pages (vector lines_per_page, SCM systems) SCM book = book_->self_scm (); int first_page_number = robust_scm2int (book_->paper_->c_variable ("first-page-number"), 1); + bool last_bookpart = ly_scm2bool (book_->paper_->c_variable ("is-last-bookpart")); SCM ret = SCM_EOL; - SCM label_page_table = SCM_EOL; + SCM label_page_table = book_->top_paper ()->c_variable ("label-page-table"); + if (label_page_table == SCM_UNDEFINED) + label_page_table = SCM_EOL; for (vsize i = 0; i < lines_per_page.size (); i++) { SCM page_num = scm_from_int (i + first_page_number); - SCM last = scm_from_bool (i == lines_per_page.size () - 1); - SCM rag = scm_from_bool (ragged () || (to_boolean (last) - && ragged_last ())); + bool partbook_last_page = (i == lines_per_page.size () - 1); + SCM rag = scm_from_bool (ragged () || ( partbook_last_page && ragged_last ())); SCM line_count = scm_from_int (lines_per_page[i]); SCM lines = scm_list_head (systems, line_count); SCM page = scm_apply_0 (make_page, - scm_list_n (book, lines, page_num, - rag, last, SCM_UNDEFINED)); - + scm_list_n (book, lines, page_num, rag, + scm_from_bool (last_bookpart), + scm_from_bool (partbook_last_page), + SCM_UNDEFINED)); /* collect labels */ for (SCM l = lines ; scm_is_pair (l) ; l = scm_cdr (l)) { @@ -290,7 +295,7 @@ Page_breaking::make_pages (vector lines_per_page, SCM systems) ret = scm_cons (page, ret); systems = scm_list_tail (systems, line_count); } - book_->paper_->set_variable (ly_symbol2scm ("label-page-table"), label_page_table); + book_->top_paper ()->set_variable (ly_symbol2scm ("label-page-table"), label_page_table); ret = scm_reverse (ret); return ret; } @@ -713,7 +718,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); } @@ -1008,6 +1025,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 {