X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpaper-book.cc;h=c66d1d6ae989cda7c6392a49a3096a9efea068f8;hb=af770f3440264c18ce01525dce1aa76b86ace0d5;hp=c16870f30db900c3bfed889cb8ef1b9c9cfdc6d8;hpb=1bf2062b6126102e7e66ed954a3be9906894ec1b;p=lilypond.git diff --git a/lily/paper-book.cc b/lily/paper-book.cc index c16870f30d..c66d1d6ae9 100644 --- a/lily/paper-book.cc +++ b/lily/paper-book.cc @@ -8,8 +8,10 @@ #include "paper-book.hh" +#include "grob.hh" #include "main.hh" #include "output-def.hh" +#include "paper-column.hh" #include "paper-score.hh" #include "paper-system.hh" #include "text-interface.hh" @@ -89,9 +91,9 @@ Paper_book::output (SCM output_channel) { if (scm_is_pair (performances_)) { - SCM proc = ly_lily_module_constant ("paper-book-write-midis"); - - scm_call_2 (proc, self_scm (), output_channel); + SCM proc = ly_lily_module_constant ("write-performances-midis"); + + scm_call_2 (proc, performances (), output_channel); } if (scores_ == SCM_EOL) @@ -215,8 +217,12 @@ Paper_book::score_title (SCM header) return title; } +/* read the breakbefore property of a score block and set up the preceding + system-spec to honour it. That is, SYM should be the system spec that + immediately precedes the score (from which HEADER is taken) + in the get_system_specs() list */ void -set_system_penalty (Prob *ps, SCM header) +set_system_penalty (SCM sys, SCM header) { if (ly_is_module (header)) { @@ -224,10 +230,21 @@ set_system_penalty (Prob *ps, SCM header) if (SCM_VARIABLEP (force) && scm_is_bool (SCM_VARIABLE_REF (force))) { - ps->set_property ("penalty", - scm_from_int(to_boolean (SCM_VARIABLE_REF (force)) - ? -10000 - : 10000)); + bool b = to_boolean (SCM_VARIABLE_REF (force)); + SCM sym = b ? ly_symbol2scm ("force") : SCM_EOL; + + if (Paper_score *ps = dynamic_cast (unsmob_music_output (sys))) + { + vector cols = ps->get_columns (); + if (cols.size ()) + { + Paper_column *col = dynamic_cast (cols.back ()); + col->set_property ("page-break-permission", sym); + col->find_prebroken_piece (LEFT)->set_property ("page-break-permission", sym); + } + } + else if (Prob *pb = unsmob_prob (sys)) + pb->set_property ("page-break-permission", sym); } } } @@ -248,7 +265,6 @@ Paper_book::get_score_title (SCM header) SCM props = paper_->lookup_variable (ly_symbol2scm ("score-title-properties")); Prob *ps = make_paper_system (props); paper_system_set_stencil (ps, title); - set_system_penalty (ps, header); return ps->self_scm(); } @@ -268,7 +284,6 @@ Paper_book::get_system_specs () SCM props = paper_->lookup_variable (ly_symbol2scm ("book-title-properties")); Prob *ps = make_paper_system (props); paper_system_set_stencil (ps, title); - set_system_penalty (ps, header_); system_specs = scm_cons (ps->self_scm (), system_specs); ps->unprotect (); @@ -292,6 +307,10 @@ Paper_book::get_system_specs () if (Paper_score *pscore = dynamic_cast (mop)) { SCM title = get_score_title (header); + + if (scm_is_pair (system_specs)) + set_system_penalty (scm_car (system_specs), header); + if (unsmob_prob (title)) { system_specs = scm_cons (title, system_specs); @@ -356,6 +375,7 @@ Paper_book::systems () systems_ = scm_reverse (systems_); + /* backwards compatibility for the old page breaker */ int i = 0; Prob *last = 0; for (SCM s = systems_; scm_is_pair (s); s = scm_cdr (s)) @@ -368,6 +388,16 @@ Paper_book::systems () && !scm_is_number (ps->get_property ("penalty"))) ps->set_property ("penalty", scm_from_int (10000)); last = ps; + + if (scm_is_pair (scm_cdr (s))) + { + SCM perm = ps->get_property ("page-break-permission"); + Prob *next = unsmob_prob (scm_cadr (s)); + if (perm == SCM_EOL) + next->set_property ("penalty", scm_from_int (10001)); + else if (perm == ly_symbol2scm ("force")) + next->set_property ("penalty", scm_from_int (-10001)); + } } return systems_; @@ -380,8 +410,8 @@ Paper_book::pages () return pages_; pages_ = SCM_EOL; - SCM proc = paper_->c_variable ("page-breaking"); - pages_ = scm_apply_0 (proc, scm_list_1(self_scm ())); + SCM proc = paper_->c_variable ("page-breaking-wrapper"); + pages_ = scm_apply_0 (proc, scm_list_1 (self_scm ())); /* set systems_ from the pages */ if (systems_ == SCM_BOOL_F)