Index: ChangeLog =================================================================== RCS file: /sources/lilypond/lilypond/ChangeLog,v retrieving revision 1.5202 diff -u -r1.5202 ChangeLog --- ChangeLog 25 Jul 2006 01:16:05 -0000 1.5202 +++ ChangeLog 25 Jul 2006 01:34:03 -0000 @@ -1,5 +1,19 @@ 2006-07-25 Joe Neeman
+ * scm/page.scm (make-page): make it friendlier to call (esp. from C++) + + * scm/layout-page-layout.scm (make-page-from-systems): new function + (optimal-page-breaks): use the new page-breaking calling convention + + * scm/define-context-properties.scm (all-user-translation-properties): + add revokePageTurns + + * lily/paper-column-engraver.cc (stop_translation_timestep): add + revokePageTurns functionality. If there is a special barline within + the breakable region, break there instead of at the end of the region. + + * lily/paper-book.cc (pages): use the new page-breaking calling convention + * lily/grob.cc: * lily/gourlay-breaking.cc: Oops, these should have been included in my last commit Index: lily/paper-book.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/paper-book.cc,v retrieving revision 1.132 diff -u -r1.132 paper-book.cc --- lily/paper-book.cc 15 Feb 2006 13:02:17 -0000 1.132 +++ lily/paper-book.cc 25 Jul 2006 01:24:47 -0000 @@ -381,7 +381,7 @@ pages_ = SCM_EOL; SCM proc = paper_->c_variable ("page-breaking"); - pages_ = scm_apply_0 (proc, scm_list_2 (systems (), self_scm ())); + pages_ = scm_apply_0 (proc, scm_list_1(self_scm ())); return pages_; } Index: lily/paper-column-engraver.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/paper-column-engraver.cc,v retrieving revision 1.19 diff -u -r1.19 paper-column-engraver.cc --- lily/paper-column-engraver.cc 11 Jul 2006 05:58:00 -0000 1.19 +++ lily/paper-column-engraver.cc 25 Jul 2006 01:24:47 -0000 @@ -8,6 +8,7 @@ #include "paper-column-engraver.hh" #include "system.hh" +#include "international.hh" #include "item.hh" #include "paper-column.hh" #include "staff-spacing.hh" @@ -26,9 +27,9 @@ musical_column_ = 0; breaks_ = 0; system_ = 0; - first_ = true; + last_special_barline_column_ = 0; last_breakable_column_ = 0; - last_breakable_moment_ = Moment (-1); + first_ = true; } void @@ -84,6 +85,7 @@ ly_symbol2scm ("spacing-wishes"), gi.grob ()); } + void Paper_column_engraver::acknowledge_note_spacing (Grob_info gi) { @@ -169,6 +171,56 @@ } } +/* return either + - the last column with a special (ie. not "|" or "") barline + - the last column + after the given moment +*/ +Paper_column* +Paper_column_engraver::find_turnable_column (Moment after_this) +{ + if (last_special_barline_column_) + { + Moment m = *unsmob_moment (last_special_barline_column_->get_property ("when")); + if (m >= after_this) + return last_special_barline_column_; + } + if (last_breakable_column_) + { + Moment m = *unsmob_moment (last_breakable_column_->get_property ("when")); + if (m >= after_this) + return last_breakable_column_; + } + return 0; +} + +void +Paper_column_engraver::revoke_page_turns (Moment after_this, Real new_penalty) +{ + if (!page_turnable_columns_.size ()) + return; + + for (vsize i = page_turnable_columns_.size () - 1; i--;) + { + Paper_column *col = page_turnable_columns_[i]; + Moment mom = *unsmob_moment (col->get_property ("when")); + if (mom >= after_this) + { + if (isinf (new_penalty)) + { + col->del_property ( ly_symbol2scm ("page-turn-permission")); + page_turnable_columns_.erase (page_turnable_columns_.begin () + i); + } + else + { + Real prev_pen = robust_scm2double (col->get_property ("page-turn-penalty"), 0); + if (new_penalty > prev_pen) + col->set_property ("page-turn-penalty", scm_from_double (new_penalty)); + } + } + } +} + void Paper_column_engraver::stop_translation_timestep () { @@ -194,25 +246,50 @@ { breaks_++; last_breakable_column_ = command_column_; - last_breakable_moment_ = now_mom (); + + SCM which_bar = get_property ("whichBar"); + if (scm_is_string (which_bar)) + { + string bar = ly_scm2string (which_bar); + if (bar != "" && bar != "|") + last_special_barline_column_ = command_column_; + } + if (! (breaks_%8)) progress_indication ("[" + to_string (breaks_) + "]"); } SCM page_br = get_property ("allowPageTurn"); - if (scm_is_pair (page_br) && last_breakable_moment_ >= Rational (0)) + if (scm_is_pair (page_br) && last_breakable_column_) { SCM pen = scm_cdr (page_br); Moment *m = unsmob_moment (scm_car (page_br)); - if (m && scm_is_number (pen) && *m <= last_breakable_moment_) + if (m) { - last_breakable_column_->set_property ("page-turn-permission", ly_symbol2scm ("allow")); - last_breakable_column_->set_property ("page-turn-penalty", pen); + Paper_column *turn = find_turnable_column (*m); + if (turn) + { + turn->set_property ("page-turn-permission", ly_symbol2scm ("allow")); + turn->set_property ("page-turn-penalty", pen); + page_turnable_columns_.push_back (turn); + } } } + /* The page-turn-engraver is allowed to change its mind and revoke previously-allowed + page turns (for example if there is a volta repeat where a turn is inconvenient) */ + SCM revokes = get_property ("revokePageTurns"); + if (scm_is_pair (revokes)) + { + Moment *start = unsmob_moment (scm_car (revokes)); + Real pen = robust_scm2double (scm_cdr (revokes), infinity_f); + if (start) + revoke_page_turns (*start, pen); + } + context ()->get_score_context ()->unset_property (ly_symbol2scm ("forbidBreak")); context ()->get_score_context ()->unset_property (ly_symbol2scm ("allowPageTurn")); + context ()->get_score_context ()->unset_property (ly_symbol2scm ("revokePageTurns")); first_ = false; break_events_.clear (); @@ -249,9 +326,13 @@ /* accept */ "break-event", /* read */ "forbidBreak " - "allowPageTurn", + "allowPageTurn " + "revokePageTurns " + , /* write */ "forbidBreak " "allowPageTurn " + "revokePageTurns " "currentCommandColumn " - "currentMusicalColumn"); + "currentMusicalColumn " + ); Index: lily/include/paper-column-engraver.hh =================================================================== RCS file: /sources/lilypond/lilypond/lily/include/paper-column-engraver.hh,v retrieving revision 1.9 diff -u -r1.9 paper-column-engraver.hh --- lily/include/paper-column-engraver.hh 9 May 2006 02:15:56 -0000 1.9 +++ lily/include/paper-column-engraver.hh 25 Jul 2006 01:24:49 -0000 @@ -17,6 +17,9 @@ void set_columns (Paper_column *, Paper_column *); TRANSLATOR_DECLARATIONS (Paper_column_engraver); + Paper_column *find_turnable_column (Moment after_this); + void revoke_page_turns (Moment after_this, Real new_penalty); + protected: void stop_translation_timestep (); void start_translation_timestep (); @@ -38,8 +41,9 @@ bool first_; Moment last_moment_; - Moment last_breakable_moment_; + Paper_column *last_special_barline_column_; Paper_column *last_breakable_column_; + vector