Index: ChangeLog =================================================================== RCS file: /sources/lilypond/lilypond/ChangeLog,v retrieving revision 1.4932 diff -u -r1.4932 ChangeLog --- ChangeLog 6 May 2006 12:17:37 -0000 1.4932 +++ ChangeLog 7 May 2006 06:05:08 -0000 @@ -1,3 +1,41 @@ +2006-05-07 Joe Neeman + + * scm/define-context-properties.scm: + * scm/define-grob-properties.scm: + * scm/define-grobs.scm: + * scm/define-music-display-methods.scm: + * scm/define-music-properties.scm: + * scm/define-music-types.scm: + * scm/music-functions.scm: + * ly/declarations-init.ly: + * lily/include/constrained-breaking.hh: + * lily/system.cc: + * lily/spaceable-grob.cc: + * lily/simple-spacer.cc: + * lily/paper-score.cc: + * lily/paper-column.cc: + * lily/paper-column-engraver.cc: + * lily/item.cc: + * lily/gourlay-breaking.cc: + * lily/constrained-breaking.cc: + * python/convertrules.py: + Change "penalty", "page-penalty" and "breakable" to "line-break-penalty", + "page-break-penalty" and "line-break-permission". + Add "page-break-permission", "page-turn-permission" and "page-turn-penalty". + Replace BreakEvent with LineBreakEvent, PageBreakEvent and PageTurnEvent. + + * lily/bar-engraver.cc: + * lily/beam-engraver.cc: + * lily/forbid-break-engraver.cc: + * lily/ligature-engraver.cc: + * lily/paper-column-engraver.cc: + * lily/percent-repeat-engraver.cc: + * lily/score-engraver.cc: + * lily/score-engraver.hh: + * lily/paper-column-engraver.hh: + Inter-engraver communication regarding line breaks is done through context + properties (Score.forbidBreak) instead of function calls. + 2006-05-06 Graham Percival * Documentation/user/putting.itely: proofreading from Dave Index: scm/define-context-properties.scm =================================================================== RCS file: /sources/lilypond/lilypond/scm/define-context-properties.scm,v retrieving revision 1.74 diff -u -r1.74 define-context-properties.scm --- scm/define-context-properties.scm 12 Apr 2006 23:26:55 -0000 1.74 +++ scm/define-context-properties.scm 7 May 2006 06:05:09 -0000 @@ -32,6 +32,8 @@ "If true, then the accidentals are aligned in bass figure context.") (allowBeamBreak ,boolean? "If true allow line breaks for beams over bar lines.") + (allowPageTurn ,pair? "In the form (moment-start . penalty). Allow a page turn +at the most recent breakpoint if it was after moment-start.") (associatedVoice ,string? "Name of the @code{Voice} that has the melody for this @code{Lyrics} line.") (autoBeamSettings ,list? "Specifies @@ -220,6 +222,8 @@ (fontSize ,number? "The relative size of all grobs in a context. ") + (forbidBreak ,boolean? "If set to ##t, prevent a line break at this point.") + (fingeringOrientations ,list? "List of symbols, containing @samp{left}, @samp{right}, @samp{up} and/or @samp{down}. This list Index: scm/define-grob-properties.scm =================================================================== RCS file: /sources/lilypond/lilypond/scm/define-grob-properties.scm,v retrieving revision 1.160 diff -u -r1.160 define-grob-properties.scm --- scm/define-grob-properties.scm 1 May 2006 19:17:57 -0000 1.160 +++ scm/define-grob-properties.scm 7 May 2006 06:05:09 -0000 @@ -111,8 +111,6 @@ (break-visibility ,vector? "A vector of 3 booleans, #(end-of-line unbroken begin-of-line). #t means visible, #f means killed.") - (breakable ,boolean? "Can this object appear at a line break, -like clefs and bar lines?") (c0-position ,integer? "An integer indicating the position of middle C.") (cautionary-style ,symbol? "How to print cautionary @@ -323,15 +321,24 @@ tightly as possible.") (padding ,ly:dimension? "Add this much extra space between objects that are next to each other.") - (page-penalty ,number? "Penalty for page break at -this column. 10000 or more means forbid linebreak, -10000 or less -means force page break. Other values influence page breaking decisions -as a real penalty.") - (penalty ,number? "Penalty for line break at -this column. 10000 or more means forbid line break, -10000 or less -means force line break. Other values influence line breaking decisions -as a real penalty.") - + (page-break-permission ,symbol? "Instructs the page breaker on whether to +put a page break at this column. Can be 'force, or 'allow.") + (page-turn-permission ,symbol? "Instructs the page breaker on whether to +put a page turn at this column. Can be 'force, or 'allow.") + (line-break-permission ,symbol? "Instructs the line breaker on whether to +put a line break at this column. Can be 'force, or 'allow.") + (page-break-penalty ,number? "Penalty for page break at +this column. This affects the choices of the page breaker; it will avoid a page +break at a column with a positive penalty and prefer a page break at a column +with a negative penalty.") + (page-turn-penalty ,number? "Penalty for a page turn at this column. +This affects the choices of the page breaker; it will avoid a page +turn at a column with a positive penalty and prefer a page turn at a column +with a negative penalty.") + (line-break-penalty ,number? "Penalty for a line break at this column. +This affects the choices of the line breaker; it will avoid a line +break at a column with a positive penalty and prefer a line break at a column +with a negative penalty.") (positions ,pair? "Pair of staff coordinates @code{(@var{left} . @var{right})}, where both @var{left} and @var{right} are in the Index: scm/define-grobs.scm =================================================================== RCS file: /sources/lilypond/lilypond/scm/define-grobs.scm,v retrieving revision 1.330 diff -u -r1.330 define-grobs.scm --- scm/define-grobs.scm 17 Apr 2006 00:30:19 -0000 1.330 +++ scm/define-grobs.scm 7 May 2006 06:05:09 -0000 @@ -74,7 +74,7 @@ (staff-bar . (extra-space . 0.0)) (time-signature . (extra-space . 0.0)) (first-note . (fixed-space . 0.0)))) - (breakable . #t) + (line-break-permission . allow) (break-align-symbol . ambitus) (break-visibility . ,begin-of-line-visible) (meta . ((class . Item) @@ -144,7 +144,7 @@ (glyph . "|") (layer . 0) (break-visibility . ,all-visible) - (breakable . #t) + (line-break-permission . allow) (stencil . ,ly:bar-line::print) (glyph-name . ,bar-line::calc-glyph-name) @@ -177,7 +177,7 @@ (BarNumber . ( (stencil . ,ly:text-interface::print) - (breakable . #t) + (line-break-permission . allow) (break-visibility . ,begin-of-line-visible) (padding . 1.0) (direction . ,UP) @@ -299,7 +299,7 @@ (BreakAlignment . ( - (breakable . #t) + (line-break-permission . allow) (stacking-dir . 1) (positioning-done . ,ly:break-align-interface::calc-positioning-done) (X-extent . ,ly:axis-group-interface::width) @@ -354,7 +354,7 @@ (BreathingSign . ( (break-align-symbol . breathing-sign) - (breakable . #t) + (line-break-permission . allow) (space-alist . ( (ambitus . (extra-space . 2.0)) (custos . (minimum-space . 1.0)) @@ -378,7 +378,7 @@ . ( (stencil . ,ly:clef::print) (glyph-name . ,ly:clef::calc-glyph-name) - (breakable . #t) + (line-break-permission . allow) (font-family . music) (break-align-symbol . clef) (break-visibility . ,begin-of-line-visible) @@ -450,7 +450,7 @@ (Custos . ( (break-align-symbol . custos) - (breakable . #t) + (line-break-permission . allow) (stencil . ,ly:custos::print) (break-visibility . ,end-of-line-visible) (style . vaticana) @@ -489,7 +489,7 @@ (DoublePercentRepeat . ( (stencil . ,ly:percent-repeat-item-interface::double-percent) - (breakable . #t) + (line-break-permission . allow) (slope . 1.0) (font-encoding . fetaMusic) (width . 2.0) @@ -616,7 +616,7 @@ (style . line) (gap . 0.5) (zigzag-width . 0.75) - (breakable . #t) + (line-break-permission . allow) (X-extent . #f) (Y-extent . #f) (stencil . ,ly:line-spanner::print) @@ -705,7 +705,7 @@ (Y-offset . ,ly:staff-symbol-referencer::callback) (break-align-symbol . key-cancellation) (break-visibility . ,begin-of-line-invisible) - (breakable . #t) + (line-break-permission . allow) (meta . ((class . Item) (interfaces . (key-signature-interface font-interface @@ -721,7 +721,7 @@ (Y-offset . ,ly:staff-symbol-referencer::callback) (break-align-symbol . key-signature) (break-visibility . ,begin-of-line-visible) - (breakable . #t) + (line-break-permission . allow) (meta . ((class . Item) (interfaces . (key-signature-interface font-interface @@ -768,7 +768,7 @@ . ( (break-align-symbol . left-edge) (X-extent . (0 . 0)) - (breakable . #t) + (line-break-permission . allow) (break-visibility . ,center-invisible) (space-alist . ( (custos . (extra-space . 0.0)) @@ -1101,7 +1101,7 @@ (X-extent . ,ly:axis-group-interface::width) ;; (stencil . ,ly:paper-column::print) - (breakable . #t) + (line-break-permission . allow) ;; debugging stuff: print column number. ;; (font-size . -6) (font-name . "sans") (Y-extent . #f) @@ -1171,7 +1171,7 @@ (Y-offset . ,ly:side-position-interface::y-aligned-side) (self-alignment-X . 0) (direction . ,UP) - (breakable . #t) + (line-break-permission . allow) (font-size . 2) (baseline-skip . 2) (break-visibility . ,end-of-line-invisible) @@ -1341,7 +1341,7 @@ (break-align-symbol . staff-bar) (Y-extent . ()) (layer . 0) - (breakable . #t) + (line-break-permission . allow) (stencil . ,ly:span-bar::print) (bar-size . ,ly:span-bar::calc-bar-size) (X-extent . ,ly:span-bar::width) @@ -1379,7 +1379,7 @@ (StaffSpacing . ( - (breakable . #t) + (line-break-permission . allow) (stem-spacing-correction . 0.4) (meta . ((class . Item) (interfaces . (spacing-interface @@ -1678,7 +1678,7 @@ (first-note . (fixed-space . 2.0)) (right-edge . (extra-space . 0.5)) (staff-bar . (minimum-space . 2.0)))) - (breakable . #t) + (line-break-permission . allow) (style . C) (meta . ((class . Item) (interfaces . (time-signature-interface @@ -1860,7 +1860,7 @@ . ( (style . line) (gap . 0.5) - (breakable . #t) + (line-break-permission . allow) (X-extent . #f) (Y-extent . #f) (stencil . ,ly:line-spanner::print) Index: scm/define-music-properties.scm =================================================================== RCS file: /sources/lilypond/lilypond/scm/define-music-properties.scm,v retrieving revision 1.50 diff -u -r1.50 define-music-properties.scm --- scm/define-music-properties.scm 12 Feb 2006 16:40:03 -0000 1.50 +++ scm/define-music-properties.scm 7 May 2006 06:05:09 -0000 @@ -32,6 +32,8 @@ (augmented ,boolean? "This figure is for an augmented figured bass (with +) sign.") (associated-context ,string? "Name of the Voice context associated with this \\newaddlyrics section") (bass ,boolean? "Set if this note is a bass note in a chord") + (break-penalty ,number? "Penalty for line break hint.") + (break-permission ,symbol? "Whether to allow, forbid or force a line break.") (cautionary ,boolean? "If set, this alteration needs cautionary accidental") (change-to-id ,string? "name of the context to change to ") (change-to-type ,symbol? "type of the context to change to.") @@ -39,8 +41,7 @@ (context-id ,string? "name of context") (context-type ,symbol? "type of context") (create-new ,boolean? "Create a fresh context.") - (descend-only ,boolean? "If set, this @code{\\context} will only -descend in the context tree.") + (descend-only ,boolean? "If set, this @code{\\context} will only descend in the context tree.") (denominator ,integer? "denominator in a time signature") (digit ,integer? "digit for fingering") (diminished ,boolean? "This bass figure should be slashed.") @@ -58,19 +59,14 @@ (label ,markup? "label of a mark.") (last-pitch ,ly:pitch? "The last pitch after relativization.") (length ,ly:moment? "The duration of this music") - (length-callback ,procedure? "How to compute the duration of this music. This property -can only be defined as initializer in @file{define-music-types.scm}.") + (length-callback ,procedure? "How to compute the duration of this music. This property can only be defined as initializer in @file{define-music-types.scm}.") (name ,symbol? "Name of this music object") (no-continuation ,boolean? "If set, disallow continuation lines") (numerator ,integer? "numerator of a time signature") (once ,boolean? "Apply this operation only during one time step?") - (octavation ,integer? - "This pitch was octavated by how many octaves? -For chord inversions, this is negative.") + (octavation ,integer? "This pitch was octavated by how many octaves? For chord inversions, this is negative.") (origin ,ly:input-location? "where was this piece of music defined?") (parenthesize ,boolean? "Enclose resulting objects in parentheses?") - (page-penalty ,number? "Penalty for page break hint.") - (penalty ,number? "Penalty for line break hint.") (pitch ,ly:pitch? "the pitch of this note") (pitch-alist ,list? "list of pitches jointly forming the scale of a key signature") (pop-first ,boolean? "Do a revert before we try to do a override on some grob property.") Index: scm/music-functions.scm =================================================================== RCS file: /sources/lilypond/lilypond/scm/music-functions.scm,v retrieving revision 1.167 diff -u -r1.167 music-functions.scm --- scm/music-functions.scm 2 Apr 2006 23:36:51 -0000 1.167 +++ scm/music-functions.scm 7 May 2006 06:05:09 -0000 @@ -472,11 +472,6 @@ (define-public (set-time-signature num den . rest) (ly:export (apply make-time-signature-set `(,num ,den . ,rest)))) -(define-safe-public (make-penalty-music pen page-pen) - (make-music 'BreakEvent - 'penalty pen - 'page-penalty page-pen)) - (define-safe-public (make-articulation name) (make-music 'ArticulationEvent 'articulation-type name)) Index: scm/define-music-types.scm =================================================================== RCS file: /sources/lilypond/lilypond/scm/define-music-types.scm,v retrieving revision 1.77 diff -u -r1.77 define-music-types.scm --- scm/define-music-types.scm 21 Apr 2006 13:38:46 -0000 1.77 +++ scm/define-music-types.scm 7 May 2006 06:05:09 -0000 @@ -94,7 +94,7 @@ (BreakEvent . ( (description . "Create a line break, Syntax: \\break or page break, Syntax: \\pagebreak.") - + (types . (general-music break-event event)) )) (BreathingSignEvent @@ -233,7 +233,11 @@ (span-type . ligature) (types . (general-music span-event ligature-event event)) )) - + (LineBreakEvent + . ( + (description . "Allow, forbid or force a line break.") + (types . (general-music break-event event)) + )) (OldLyricCombineMusic . ( (description . "Align lyrics to the start of notes. @@ -350,6 +354,16 @@ (types . (general-music layout-instruction)) (iterator-ctor . ,ly:push-property-iterator::constructor) )) + (PageBreakEvent + . ( + (description . "Allow, forbid or force a page break.") + (types . (general-music break-event event)) + )) + (PageTurnEvent + . ( + (description . "Allow, forbid or force a page turn.") + (types . (general-music break-event event)) + )) (PartCombineMusic . ( (description . "Combine two parts on a staff, either merged or Index: scm/define-music-display-methods.scm =================================================================== RCS file: /sources/lilypond/lilypond/scm/define-music-display-methods.scm,v retrieving revision 1.8 diff -u -r1.8 define-music-display-methods.scm --- scm/define-music-display-methods.scm 23 Feb 2006 20:53:58 -0000 1.8 +++ scm/define-music-display-methods.scm 7 May 2006 06:05:11 -0000 @@ -585,8 +585,21 @@ (define-display-method BarCheck (check) (format #f "|~a" (new-line->lily-string))) -(define-display-method BreakEvent (br) - "\\break") ;; TODO: use page-penalty, penalty properties? +;; TODO: also display something when there is a penalty? +(define-display-method LineBreakEvent (br) + (if (eq? (ly:music-property br 'break-permission) 'forbid) + ("\\noBreak") + ("\\break"))) + +(define-display-method PageBreakEvent (br) + (if (eq? (ly:music-property br 'break-permission) 'forbid) + ("\\noPageBreak") + ("\\pageBreak"))) + +(define-display-method PageTurnEvent (br) + (if (eq? (ly:music-property br 'break-permission) 'forbid) + ("\\noPageTurn") + ("\\pageTurn"))) (define-display-method PesOrFlexaEvent (expr) "\\~") Index: ly/declarations-init.ly =================================================================== RCS file: /sources/lilypond/lilypond/ly/declarations-init.ly,v retrieving revision 1.99 diff -u -r1.99 declarations-init.ly --- ly/declarations-init.ly 6 Apr 2006 00:23:02 -0000 1.99 +++ ly/declarations-init.ly 7 May 2006 06:05:11 -0000 @@ -35,10 +35,18 @@ %% try \once \set Score.allowBeamBreak = ##t %% rather name \newline, \pageBreak ? -break = #(make-event-chord (list (make-penalty-music -10001 0))) -noBreak = #(make-event-chord (list (make-penalty-music 10001 0))) -pageBreak = #(make-event-chord (list (make-penalty-music -10001 -10001))) -noPageBreak = #(make-event-chord (list (make-penalty-music 0 10001))) +break = #(make-event-chord (list (make-music 'LineBreakEvent 'break-permission 'force))) +noBreak = #(make-event-chord (list (make-music 'LineBreakEvent 'break-permission '()))) +pageBreak = #(make-event-chord (list + (make-music 'LineBreakEvent 'break-permission 'force) + (make-music 'PageBreakEvent 'break-permission 'force))) +noPageBreak = #(make-event-chord (list (make-music 'PageBreakEvent 'break-permission '()))) +pageTurn = #(make-event-chord (list + (make-music 'LineBreakEvent 'break-permission 'force) + (make-music 'PageBreakEvent 'break-permission 'force) + (make-music 'PageTurnEvent 'break-permission 'force))) +noPageTurn = #(make-event-chord (list (make-music 'PageTurnEvent 'break-permission '()))) + stopStaff = #(make-event-chord (list (make-span-event 'StaffSpanEvent STOP))) startStaff = #(make-event-chord (list (make-span-event 'StaffSpanEvent START))) Index: lily/include/score-engraver.hh =================================================================== RCS file: /sources/lilypond/lilypond/lily/include/score-engraver.hh,v retrieving revision 1.41 diff -u -r1.41 score-engraver.hh --- lily/include/score-engraver.hh 11 Feb 2006 11:35:16 -0000 1.41 +++ lily/include/score-engraver.hh 7 May 2006 06:05:11 -0000 @@ -42,7 +42,6 @@ public: Score_engraver (); - void forbid_breaks (); virtual SCM get_output (); }; Index: lily/include/paper-column-engraver.hh =================================================================== RCS file: /sources/lilypond/lilypond/lily/include/paper-column-engraver.hh,v retrieving revision 1.8 diff -u -r1.8 paper-column-engraver.hh --- lily/include/paper-column-engraver.hh 11 Feb 2006 11:35:16 -0000 1.8 +++ lily/include/paper-column-engraver.hh 7 May 2006 06:05:11 -0000 @@ -30,16 +30,17 @@ DECLARE_ACKNOWLEDGER (staff_spacing); System *system_; - Music *break_event_; + vector break_events_; int breaks_; // used for stat printing Paper_column *command_column_; Paper_column *musical_column_; vector items_; bool first_; Moment last_moment_; + + Moment last_breakable_moment_; + Paper_column *last_breakable_column_; public: - // ug.h - void forbid_breaks (); }; #endif /* PAPER_COLUMN_ENGRAVER_HH */ Index: lily/include/constrained-breaking.hh =================================================================== RCS file: /sources/lilypond/lilypond/lily/include/constrained-breaking.hh,v retrieving revision 1.6 diff -u -r1.6 constrained-breaking.hh --- lily/include/constrained-breaking.hh 4 May 2006 11:15:12 -0000 1.6 +++ lily/include/constrained-breaking.hh 7 May 2006 06:05:11 -0000 @@ -11,12 +11,7 @@ #define CONSTRAINED_BREAKING_HH #include "break-algorithm.hh" - -enum Fordfor { - FORBID = -1, - DEFAULT = 0, - FORCE = 1 -}; +#include "lily-guile.hh" struct Line_details { Real force_; @@ -25,9 +20,9 @@ Real space_; /* spring length (stretches over extent_ but not over padding_) */ Real inverse_hooke_; - Fordfor line_break_; - Fordfor page_break_; - Fordfor page_turn_; + SCM break_permission_; + SCM page_permission_; + SCM turn_permission_; Real break_penalty_; Real page_penalty_; Real turn_penalty_; @@ -39,9 +34,9 @@ padding_ = 0; space_ = 0; inverse_hooke_ = 1; - line_break_ = DEFAULT; - page_break_ = DEFAULT; - page_turn_ = DEFAULT; + break_permission_ = ly_symbol2scm ("allow"); + page_permission_ = ly_symbol2scm ("allow"); + turn_permission_ = ly_symbol2scm ("allow"); break_penalty_ = 0; page_penalty_ = 0; turn_penalty_ = 0; Index: lily/include/engraver.hh =================================================================== RCS file: /sources/lilypond/lilypond/lily/include/engraver.hh,v retrieving revision 1.59 diff -u -r1.59 engraver.hh --- lily/include/engraver.hh 6 Jan 2006 09:13:24 -0000 1.59 +++ lily/include/engraver.hh 7 May 2006 06:05:11 -0000 @@ -38,7 +38,6 @@ */ void announce_grob (Grob *, SCM cause); - Score_engraver *get_score_engraver () const; /** override other ctor */ Index: lily/system.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/system.cc,v retrieving revision 1.140 diff -u -r1.140 system.cc --- lily/system.cc 4 May 2006 09:49:37 -0000 1.140 +++ lily/system.cc 7 May 2006 06:05:11 -0000 @@ -375,8 +375,15 @@ SCM prop_init = left_bound->get_property ("line-break-system-details"); Prob *pl = make_paper_system (prop_init); paper_system_set_stencil (pl, sys_stencil); - pl->set_property ("penalty", - left_bound->get_property ("page-penalty")); + + /* backwards-compatibility hack for the old page-breaker */ + SCM turn_perm = left_bound->get_property ("page-break-permission"); + if (!scm_is_symbol (turn_perm)) + pl->set_property ("penalty", scm_from_double (10001.0)); + else if (turn_perm == ly_symbol2scm ("force")) + pl->set_property ("penalty", scm_from_double (-10001.0)); + else + pl->set_property ("penalty", scm_from_double (0.0)); if (!scm_is_pair (pl->get_property ("refpoint-Y-extent"))) { Index: lily/spaceable-grob.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/spaceable-grob.cc,v retrieving revision 1.51 diff -u -r1.51 spaceable-grob.cc --- lily/spaceable-grob.cc 6 Jan 2006 09:13:25 -0000 1.51 +++ lily/spaceable-grob.cc 7 May 2006 06:05:11 -0000 @@ -122,6 +122,14 @@ ADD_INTERFACE (Spaceable_grob, "spaceable-grob-interface", "A layout object that takes part in the spacing problem. ", - "measure-length spacing-wishes penalty minimum-distances ideal-distances " - "keep-inside-line left-neighbors right-neighbors"); + /* properties */ + "ideal-distances " + "keep-inside-line " + "left-neighbors " + "line-break-penalty " + "line-break-permission " + "measure-length " + "minimum-distances " + "right-neighbors " + "spacing-wishes"); Index: lily/simple-spacer.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/simple-spacer.cc,v retrieving revision 1.97 diff -u -r1.97 simple-spacer.cc --- lily/simple-spacer.cc 4 May 2006 09:49:37 -0000 1.97 +++ lily/simple-spacer.cc 7 May 2006 06:05:11 -0000 @@ -519,12 +519,12 @@ int sz = ret.cols_.size (); for (int i = sz; i--;) { - SCM p = ret.cols_[i]->get_property ("penalty"); - if (scm_is_number (p)) + SCM p = ret.cols_[i]->get_property ("line-break-permission"); + if (scm_is_symbol (p)) { - if (scm_to_double (p) < -9999) + if (p == ly_symbol2scm ("force")) ret.satisfies_constraints_ = ret.satisfies_constraints_ && (i == 0 || i == sz -1); - if (scm_to_double (p) > 9999) + if (!scm_is_symbol (p)) ret.satisfies_constraints_ = ret.satisfies_constraints_ && ! (i == 0 || i == sz -1); } } Index: lily/separating-line-group-engraver.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/separating-line-group-engraver.cc,v retrieving revision 1.95 diff -u -r1.95 separating-line-group-engraver.cc --- lily/separating-line-group-engraver.cc 11 Feb 2006 11:35:17 -0000 1.95 +++ lily/separating-line-group-engraver.cc 7 May 2006 06:05:11 -0000 @@ -133,7 +133,7 @@ if (ib) { - p_ref_->set_property ("breakable", SCM_BOOL_T); + p_ref_->set_property ("line-break-permission", ly_symbol2scm ("allow")); context ()->set_property ("breakableSeparationItem", p_ref_->self_scm ()); } Index: lily/score-engraver.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/score-engraver.cc,v retrieving revision 1.163 diff -u -r1.163 score-engraver.cc --- lily/score-engraver.cc 21 Mar 2006 12:21:43 -0000 1.163 +++ lily/score-engraver.cc 7 May 2006 06:05:11 -0000 @@ -136,20 +136,6 @@ return o->self_scm (); } -/* - UGH UGH -*/ -void -Score_engraver::forbid_breaks () -{ - for (SCM s = simple_trans_list_; scm_is_pair (s); s = scm_cdr (s)) - { - Translator *tr = unsmob_translator (scm_car (s)); - if (Paper_column_engraver *pce = dynamic_cast (tr)) - pce->forbid_breaks (); - } -} - bool Score_engraver::try_music (Music *m) { @@ -163,9 +149,9 @@ /* doc */ "Top level engraver. Takes care of generating columns and the complete system (ie. System) " "\n\n " "This engraver decides whether a column is breakable. The default is " - "that a column is always breakable. However, when every Bar_engraver " - "that does not have a barline at a certain point will call " - "Score_engraver::forbid_breaks to stop linebreaks. In practice, this " + "that a column is always breakable. However, every Bar_engraver " + "that does not have a barline at a certain point will set " + "forbidBreaks to stop linebreaks. In practice, this " "means that you can make a breakpoint by creating a barline (assuming " "that there are no beams or notes that prevent a breakpoint.) ", /* create */ Index: lily/percent-repeat-engraver.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/percent-repeat-engraver.cc,v retrieving revision 1.54 diff -u -r1.54 percent-repeat-engraver.cc --- lily/percent-repeat-engraver.cc 10 Feb 2006 01:22:12 -0000 1.54 +++ lily/percent-repeat-engraver.cc 7 May 2006 06:05:11 -0000 @@ -16,6 +16,7 @@ #include "misc.hh" #include "percent-repeat-iterator.hh" #include "repeated-music.hh" +#include "score-context.hh" #include "side-position-interface.hh" #include "spanner.hh" #include "warn.hh" @@ -193,7 +194,7 @@ Ugh. Why can't this be regular communication between contexts? */ - get_score_engraver ()->forbid_breaks (); + context ()->get_score_context ()->set_property ("forbidBreak", SCM_BOOL_T); } next_moment_ = next_moment_ + body_length_; next_moment_.grace_part_ = Rational (0); @@ -276,4 +277,5 @@ "currentCommandColumn " "countPercentRepeats", - /* write */ ""); + /* write */ + "forbidBreak"); Index: lily/paper-score.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/paper-score.cc,v retrieving revision 1.101 diff -u -r1.101 paper-score.cc --- lily/paper-score.cc 4 May 2006 09:49:37 -0000 1.101 +++ lily/paper-score.cc 7 May 2006 06:05:11 -0000 @@ -119,8 +119,8 @@ doubly, also done in Score_engraver */ vector pc (system_->columns ()); - pc[0]->set_property ("breakable", SCM_BOOL_T); - pc.back ()->set_property ("breakable", SCM_BOOL_T); + pc[0]->set_property ("line-break-permission", ly_symbol2scm ("allow")); + pc.back ()->set_property ("line-break-permission", ly_symbol2scm ("allow")); system_->pre_processing (); } Index: lily/paper-column.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/paper-column.cc,v retrieving revision 1.93 diff -u -r1.93 paper-column.cc --- lily/paper-column.cc 11 Feb 2006 11:35:17 -0000 1.93 +++ lily/paper-column.cc 7 May 2006 06:05:11 -0000 @@ -193,7 +193,10 @@ "between-cols " "bounded-by-me " "line-break-system-details " - "page-penalty " + "page-break-penalty " + "page-break-permission " + "page-turn-penalty " + "page-turn-permission " "shortest-playing-duration " "shortest-starter-duration " "used " Index: lily/paper-column-engraver.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/paper-column-engraver.cc,v retrieving revision 1.13 diff -u -r1.13 paper-column-engraver.cc --- lily/paper-column-engraver.cc 7 Mar 2006 16:08:39 -0000 1.13 +++ lily/paper-column-engraver.cc 7 May 2006 06:05:11 -0000 @@ -14,6 +14,7 @@ #include "note-spacing.hh" #include "pointer-group-interface.hh" #include "context.hh" +#include "score-context.hh" #include "axis-group-interface.hh" #include "warn.hh" @@ -25,9 +26,10 @@ command_column_ = 0; musical_column_ = 0; breaks_ = 0; - break_event_ = 0; system_ = 0; first_ = true; + last_breakable_column_ = 0; + last_breakable_moment_ = Moment (-1); } void @@ -38,7 +40,7 @@ if (command_column_) { - command_column_->set_property ("breakable", SCM_BOOL_T); + command_column_->set_property ("line-break-permission", ly_symbol2scm ("allow")); system_->set_bound (RIGHT, command_column_); } } @@ -66,7 +68,7 @@ make_columns (); system_->set_bound (LEFT, command_column_); - command_column_->set_property ("breakable", SCM_BOOL_T); + command_column_->set_property ("line-break-permission", ly_symbol2scm ("allow")); } void @@ -106,17 +108,10 @@ system_->add_column (musical_column_); } -void -Paper_column_engraver::forbid_breaks () -{ - if (command_column_ && !first_) - command_column_->set_property ("breakable", SCM_EOL); -} - bool Paper_column_engraver::try_music (Music *m) { - break_event_ = m; + break_events_.push_back (m); return true; } @@ -124,28 +119,36 @@ void Paper_column_engraver::process_music () { - if (break_event_) + for (vsize i = 0; i < break_events_.size (); i++) { - SCM pen = command_column_->get_property ("penalty"); - Real total_penalty = scm_is_number (pen) ? scm_to_double (pen) : 0.0; - - SCM mpen = break_event_->get_property ("penalty"); - if (scm_is_number (mpen)) - total_penalty += scm_to_double (mpen); - - command_column_->set_property ("penalty", scm_from_double (total_penalty)); - - /* ugh. arbitrary, hardcoded */ - if (total_penalty > 10000.0) - forbid_breaks (); + string prefix; + SCM name = break_events_[i]->get_property ("name"); + if (name == ly_symbol2scm ("LineBreakEvent")) + prefix = "line-break"; + else if (name == ly_symbol2scm ("PageBreakEvent")) + prefix = "page-break"; + else if (name == ly_symbol2scm ("PageTurnEvent")) + prefix = "page-turn"; + else + { + programming_error ("Paper_column_engraver doesn't know about this break-event"); + return; + } + string perm_str = prefix + "-permission"; + string pen_str = prefix + "-penalty"; - SCM page_pen = command_column_->get_property ("page-penalty"); - Real total_pp = scm_is_number (page_pen) ? scm_to_double (page_pen) : 0.0; - SCM mpage_pen = break_event_->get_property ("page-penalty"); - if (scm_is_number (mpage_pen)) - total_pp += scm_to_double (mpage_pen); + SCM cur_pen = command_column_->get_property (pen_str.c_str ()); + SCM pen = break_events_[i]->get_property ("break-penalty"); + SCM perm = break_events_[i]->get_property ("break-permission"); - command_column_->set_property ("page-penalty", scm_from_double (total_pp)); + if (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)); + command_column_->set_property (perm_str.c_str (), ly_symbol2scm ("allow")); + } + else + command_column_->set_property (perm_str.c_str (), perm); } bool start_of_measure = (last_moment_.main_part_ != now_mom ().main_part_ @@ -175,21 +178,40 @@ if (!elem->get_parent (X_AXIS) || !unsmob_grob (elem->get_object ("axis-group-parent-X"))) { - bool br = to_boolean (elem->get_property ("breakable")); + bool br = Item::is_breakable (elem); Axis_group_interface::add_element (br ? command_column_ : musical_column_, elem); } } items_.clear (); - if (to_boolean (command_column_->get_property ("breakable"))) + if (to_boolean (get_property ("forbidBreak"))) + command_column_->set_property ("line-break-permission", SCM_EOL); + else if (Item::is_breakable (command_column_)) { breaks_++; + last_breakable_column_ = command_column_; + last_breakable_moment_ = now_mom (); 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)) + { + SCM pen = scm_cdr (page_br); + Moment *m = unsmob_moment (scm_car (page_br)); + if (m && scm_is_number (pen) && *m <= last_breakable_moment_) + { + last_breakable_column_->set_property ("page-turn-permission", ly_symbol2scm ("allow")); + last_breakable_column_->set_property ("page-turn-penalty", pen); + } + } + + context ()->get_score_context ()->unset_property ( ly_symbol2scm ("forbidBreak")); + context ()->get_score_context ()->unset_property ( ly_symbol2scm ("allowPageTurn")); + first_ = false; - break_event_ = 0; + break_events_.clear (); } void @@ -210,9 +232,9 @@ /* doc */ "Takes care of generating columns." "\n\n " "This engraver decides whether a column is breakable. The default is " - "that a column is always breakable. However, when every Bar_engraver " - "that does not have a barline at a certain point will call " - "Score_engraver::forbid_breaks to stop linebreaks. In practice, this " + "that a column is always breakable. However, every Bar_engraver " + "that does not have a barline at a certain point will set forbidBreaks " + "in the score context to stop linebreaks. In practice, this " "means that you can make a breakpoint by creating a barline (assuming " "that there are no beams or notes that prevent a breakpoint.) ", @@ -221,7 +243,11 @@ "NonMusicalPaperColumn", /* accept */ "break-event", - /* read */ "", + /* read */ + "forbidBreak " + "allowPageTurn", /* write */ + "forbidBreak " + "allowPageTurn " "currentCommandColumn " "currentMusicalColumn"); Index: lily/ligature-engraver.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/ligature-engraver.cc,v retrieving revision 1.59 diff -u -r1.59 ligature-engraver.cc --- lily/ligature-engraver.cc 11 Feb 2006 11:35:17 -0000 1.59 +++ lily/ligature-engraver.cc 7 May 2006 06:05:11 -0000 @@ -12,7 +12,7 @@ #include "international.hh" #include "note-head.hh" #include "rest.hh" -#include "score-engraver.hh" +#include "score-context.hh" #include "spanner.hh" #include "warn.hh" @@ -117,7 +117,7 @@ if (ligature_) { // TODO: maybe forbid breaks only if not transcribing - get_score_engraver ()->forbid_breaks (); + context ()->get_score_context ()->set_property ("forbidBreak", SCM_BOOL_T); } if (events_drul_[START]) Index: lily/item.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/item.cc,v retrieving revision 1.123 diff -u -r1.123 item.cc --- lily/item.cc 6 Jan 2006 09:13:26 -0000 1.123 +++ lily/item.cc 7 May 2006 06:05:11 -0000 @@ -46,7 +46,9 @@ me->programming_error ("only items can be breakable."); Item *i = dynamic_cast (me->get_parent (X_AXIS)); - return (i) ? Item::is_breakable (i) : to_boolean (me->get_property ("breakable")); + if (!i) + return scm_is_symbol (me->get_property ("line-break-permission")); + return Item::is_breakable (i); } Paper_column * @@ -210,4 +212,8 @@ " end-of-line-invisible no yes yes\n" " center-invisible yes no yes\n" "@end example\n", - "no-spacing-rods break-visibility breakable") + + /* properties */ + "no-spacing-rods " + "break-visibility " + "line-break-penalty line-break-permission") Index: lily/gourlay-breaking.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/gourlay-breaking.cc,v retrieving revision 1.96 diff -u -r1.96 gourlay-breaking.cc --- lily/gourlay-breaking.cc 4 May 2006 09:49:37 -0000 1.96 +++ lily/gourlay-breaking.cc 7 May 2006 06:05:11 -0000 @@ -226,7 +226,7 @@ Grob *pc = this_one.cols_.back (); if (pc->original ()) { - SCM pen = pc->get_property ("penalty"); + SCM pen = pc->get_property ("line-break-penalty"); if (scm_is_number (pen) && fabs (scm_to_double (pen)) < 10000) break_penalties += scm_to_double (pen); } Index: lily/forbid-break-engraver.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/forbid-break-engraver.cc,v retrieving revision 1.26 diff -u -r1.26 forbid-break-engraver.cc --- lily/forbid-break-engraver.cc 12 Aug 2005 00:04:47 -0000 1.26 +++ lily/forbid-break-engraver.cc 7 May 2006 06:05:11 -0000 @@ -5,13 +5,14 @@ (c) 2002--_2005 Han-Wen Nienhuys */ -#include "rhythmic-head.hh" +#include "duration.hh" #include "grob.hh" -#include "score-engraver.hh" +#include "engraver.hh" #include "input.hh" -#include "pitch.hh" -#include "duration.hh" #include "moment.hh" +#include "pitch.hh" +#include "rhythmic-head.hh" +#include "score-context.hh" #include "translator.icc" @@ -42,7 +43,7 @@ { Grob *g = unsmob_grob (scm_cdar (busy)); if (g->internal_has_interface (ly_symbol2scm ("rhythmic-grob-interface"))) - get_score_engraver ()->forbid_breaks (); + context ()->get_score_context ()->set_property ("forbidBreak", SCM_BOOL_T); busy = scm_cdr (busy); } } @@ -53,4 +54,4 @@ /* create */ "", /* accept */ "", /* read */ "busyGrobs", - /* write */ ""); + /* write */ "forbidBreak"); Index: lily/constrained-breaking.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/constrained-breaking.cc,v retrieving revision 1.5 diff -u -r1.5 constrained-breaking.cc --- lily/constrained-breaking.cc 4 May 2006 09:49:37 -0000 1.5 +++ lily/constrained-breaking.cc 7 May 2006 06:05:12 -0000 @@ -172,7 +172,7 @@ bool last = j == breaks_.size () - 1; bool ragged = ragged_right || (last && ragged_last); int k = i*lines_rank_ + j; - SCM pen = all_[breaks_[j]]->get_property ("penalty"); + SCM pen = all_[breaks_[j]]->get_property ("line-break-penalty"); if (scm_is_number (pen)) lines_[k].break_penalty_ = scm_to_double (pen); Index: lily/break-align-engraver.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/break-align-engraver.cc,v retrieving revision 1.77 diff -u -r1.77 break-align-engraver.cc --- lily/break-align-engraver.cc 6 Jan 2006 09:13:27 -0000 1.77 +++ lily/break-align-engraver.cc 7 May 2006 06:05:12 -0000 @@ -63,9 +63,7 @@ if (item->get_parent (X_AXIS)) return; - SCM bp = item->get_property ("breakable"); - bool breakable = (to_boolean (bp)); - if (!breakable) + if (!Item::is_breakable (item)) return; SCM align_name = item->get_property ("break-align-symbol"); Index: lily/beam-engraver.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/beam-engraver.cc,v retrieving revision 1.135 diff -u -r1.135 beam-engraver.cc --- lily/beam-engraver.cc 11 Feb 2006 11:35:18 -0000 1.135 +++ lily/beam-engraver.cc 7 May 2006 06:05:12 -0000 @@ -15,7 +15,7 @@ #include "international.hh" #include "item.hh" #include "rest.hh" -#include "score-engraver.hh" +#include "score-context.hh" #include "spanner.hh" #include "stem.hh" #include "warn.hh" @@ -127,7 +127,7 @@ Beam_engraver::process_music () { if (beam_ && !to_boolean (get_property ("allowBeamBreak"))) - get_score_engraver ()->forbid_breaks (); + context ()->get_score_context ()->set_property ("forbidBreak", SCM_BOOL_T); if (start_ev_) { @@ -282,7 +282,7 @@ /* create */ "Beam", /* accept */ "beam-event", /* read */ "beamMelismaBusy beatLength subdivideBeams", - /* write */ ""); + /* write */ "forbidBreak"); class Grace_beam_engraver : public Beam_engraver { Index: lily/bar-engraver.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/bar-engraver.cc,v retrieving revision 1.86 diff -u -r1.86 bar-engraver.cc --- lily/bar-engraver.cc 11 Feb 2006 11:35:18 -0000 1.86 +++ lily/bar-engraver.cc 7 May 2006 06:05:12 -0000 @@ -8,6 +8,8 @@ */ #include "bar-line.hh" +#include "context.hh" +#include "score-context.hh" #include "score-engraver.hh" #include "warn.hh" #include "item.hh" @@ -89,8 +91,7 @@ Bar_engraver::stop_translation_timestep () { if (!bar_) - /* guh. Use properties! */ - get_score_engraver ()->forbid_breaks (); + context ()->get_score_context ()->set_property ("forbidBreak", SCM_BOOL_T); else typeset_bar (); } @@ -101,4 +102,4 @@ /* create */ "BarLine", /* accept */ "", /* read */ "whichBar", - /* write */ ""); + /* write */ "forbidBreak"); Index: lily/engraver.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/engraver.cc,v retrieving revision 1.77 diff -u -r1.77 engraver.cc --- lily/engraver.cc 6 Jan 2006 09:13:27 -0000 1.77 +++ lily/engraver.cc 7 May 2006 06:05:12 -0000 @@ -50,12 +50,6 @@ { } -Score_engraver * -Engraver::get_score_engraver () const -{ - return dynamic_cast (get_score_context ()->implementation ()); -} - #include "translator.icc" ADD_TRANSLATOR (Engraver, Index: python/convertrules.py =================================================================== RCS file: /sources/lilypond/lilypond/python/convertrules.py,v retrieving revision 1.48 diff -u -r1.48 convertrules.py --- python/convertrules.py 30 Apr 2006 20:18:53 -0000 1.48 +++ python/convertrules.py 7 May 2006 06:05:13 -0000 @@ -2781,3 +2781,11 @@ conversions.append (((2, 7, 40), conv, "rehearsalMarkAlignSymbol/barNumberAlignSymbol -> break-align-symbol")) + + +def conv (str): + str = re.sub ('page-penalty', 'page-break-penalty') + str = re.sub ('([^-])penalty', '\1break-penalty') + return str + +conversions.append (((2, 9, 4), conv, """(page-)penalty -> (page-)break-penalty"""))