From: Joe Neeman Date: Sun, 24 Sep 2006 06:21:56 +0000 (+0000) Subject: * lily/paper-book.cc (get_system_specs): X-Git-Tag: cvs/HEAD~63 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=928398cf62c41729bf75e957a8f7a5b145b7d5ff;p=lilypond.git * lily/paper-book.cc (get_system_specs): (set_system_penalty): fix breakbefore. We used to set a penalty on the system after the break, now we set a permission on the system before the break --- diff --git a/ChangeLog b/ChangeLog index 1b710a699f..f8beb8bc6c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,10 @@ 2006-09-24 Joe Neeman + + * lily/paper-book.cc (get_system_specs): + (set_system_penalty): fix breakbefore. + We used to set a penalty on the system after the break, now we + set a permission on the system before the break + * lily/grob-property.cc: add scm debugging hooks into property modification diff --git a/lily/paper-book.cc b/lily/paper-book.cc index c16870f30d..168d19b92e 100644 --- a/lily/paper-book.cc +++ b/lily/paper-book.cc @@ -8,6 +8,7 @@ #include "paper-book.hh" +#include "grob.hh" #include "main.hh" #include "output-def.hh" #include "paper-score.hh" @@ -215,8 +216,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 +229,17 @@ 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 ()) + cols.back ()->set_property ("page-break-permission", sym); + } + else if (Prob *pb = unsmob_prob (sys)) + pb->set_property ("page-break-permission", sym); } } } @@ -248,7 +260,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 +279,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 +302,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);