From 01f24004c5a9984eaa6c644881505349e49b3a4a Mon Sep 17 00:00:00 2001 From: Joe Neeman Date: Wed, 17 Aug 2011 22:56:02 -0700 Subject: [PATCH] Fix 1286. --- .../regression/page-breaking-end-of-score.ly | 19 ++++++++++++++++++ lily/include/paper-column-engraver.hh | 1 + lily/paper-column-engraver.cc | 20 +++++++++++++++++-- 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 input/regression/page-breaking-end-of-score.ly diff --git a/input/regression/page-breaking-end-of-score.ly b/input/regression/page-breaking-end-of-score.ly new file mode 100644 index 0000000000..b949b02680 --- /dev/null +++ b/input/regression/page-breaking-end-of-score.ly @@ -0,0 +1,19 @@ +\version "2.14.1" + +\header { + texidoc = "Page breaks are allowed by default at the end of the score, +but the user can override them. There should be one line on the first +page and two (colliding) lines on the second page." +} + +\paper { + paper-height = 4\cm +} + +\book { +{ c'4 } + +{ c'4 } \noPageBreak + +{ c'4 } +} diff --git a/lily/include/paper-column-engraver.hh b/lily/include/paper-column-engraver.hh index edb6ad8d59..7b6690db8b 100644 --- a/lily/include/paper-column-engraver.hh +++ b/lily/include/paper-column-engraver.hh @@ -38,6 +38,7 @@ protected: void stop_translation_timestep (); void start_translation_timestep (); void process_music (); + void handle_manual_breaks (bool); virtual void initialize (); virtual void finalize (); diff --git a/lily/paper-column-engraver.cc b/lily/paper-column-engraver.cc index 31b8023bef..3d4ee9fd95 100644 --- a/lily/paper-column-engraver.cc +++ b/lily/paper-column-engraver.cc @@ -61,8 +61,18 @@ Paper_column_engraver::finalize () if (command_column_) { + // At the end of the score, allow page breaks and turns by default, but... + command_column_->set_property ("page-break-permission", ly_symbol2scm ("allow")); + command_column_->set_property ("page-turn-permission", ly_symbol2scm ("allow")); + + // ...allow the user to override them. + handle_manual_breaks (true); + + // On the other hand, line breaks are always allowed at the end of a score, + // even if they try to stop us. if (!scm_is_symbol (command_column_->get_property ("line-break-permission"))) command_column_->set_property ("line-break-permission", ly_symbol2scm ("allow")); + system_->set_bound (RIGHT, command_column_); } } @@ -147,7 +157,7 @@ Paper_column_engraver::listen_label (Stream_event *ev) } void -Paper_column_engraver::process_music () +Paper_column_engraver::handle_manual_breaks (bool only_do_permissions) { for (vsize i = 0; i < break_events_.size (); i++) { @@ -170,7 +180,7 @@ Paper_column_engraver::process_music () SCM pen = break_events_[i]->get_property ("break-penalty"); SCM perm = break_events_[i]->get_property ("break-permission"); - if (scm_is_number (pen)) + if (!only_do_permissions && scm_is_number (pen)) { Real new_pen = robust_scm2double (cur_pen, 0.0) + scm_to_double (pen); command_column_->set_property (pen_str.c_str (), scm_from_double (new_pen)); @@ -179,6 +189,12 @@ Paper_column_engraver::process_music () else command_column_->set_property (perm_str.c_str (), perm); } +} + +void +Paper_column_engraver::process_music () +{ + handle_manual_breaks (false); for (vsize i = 0; i < label_events_.size (); i++) { -- 2.39.2