Index: ChangeLog =================================================================== RCS file: /sources/lilypond/lilypond/ChangeLog,v retrieving revision 1.5076 diff -u -r1.5076 ChangeLog --- ChangeLog 5 Jun 2006 00:52:53 -0000 1.5076 +++ ChangeLog 5 Jun 2006 01:38:33 -0000 @@ -1,3 +1,11 @@ +2006-06-05 Joe Neeman + + * lily/simple-spacer.cc (get_line_configuration): add the + keep-inside-line rods. + + * lily/simple-spacer.cc (get_line_forces): check for forced + line-breaks here also. + 2006-06-05 Han-Wen Nienhuys * buildscripts/output-distance.py (main): use compare-XXX for Index: lily/simple-spacer.cc =================================================================== RCS file: /sources/lilypond/lilypond/lily/simple-spacer.cc,v retrieving revision 1.98 diff -u -r1.98 simple-spacer.cc --- lily/simple-spacer.cc 9 May 2006 02:15:56 -0000 1.98 +++ lily/simple-spacer.cc 5 Jun 2006 01:38:33 -0000 @@ -305,6 +305,7 @@ Real inverse_hooke_; Real end_ideal_; Real end_inverse_hooke_; + SCM break_permission_; Interval keep_inside_line_; }; @@ -401,6 +402,7 @@ } if (!line_starter && to_boolean (col->get_property ("keep-inside-line"))) desc.keep_inside_line_ = col->extent (col, X_AXIS); + desc.break_permission_ = col->get_property ("line-break-permission"); return desc; } @@ -409,10 +411,12 @@ Real line_len, Real indent, bool ragged) { vector force; - force.resize (breaks.size () * breaks.size ()); + force.resize (breaks.size () * breaks.size (), infinity_f); vector cols; vsize b = 1; + SCM force_break = ly_symbol2scm ("force"); + cols.push_back (Column_desc ()); for (vsize i = 1; i < icols.size () - 1; i++) { @@ -457,6 +461,9 @@ } spacer.solve ((b == 0) ? line_len - indent : line_len, ragged); force[b * breaks.size () + c] = spacer.force (); + + if (cols[end].break_permission_ == force_break) + break; if (!spacer.fits ()) { force[b * breaks.size () + c] = infinity_f; @@ -497,8 +504,15 @@ spacer.add_spring (cols[i].ideal_, cols[i].inverse_hooke_); } for (vsize i = 0; i < cols.size (); i++) - for (vsize r = 0; r < cols[i].rods_.size (); r++) - spacer.add_rod (i, cols[i].rods_[r].r_, cols[i].rods_[r].dist_); + { + for (vsize r = 0; r < cols[i].rods_.size (); r++) + spacer.add_rod (i, cols[i].rods_[r].r_, cols[i].rods_[r].dist_); + if (!cols[i].keep_inside_line_.is_empty ()) + { + spacer.add_rod (i, cols.size (), cols[i].keep_inside_line_[RIGHT]); + spacer.add_rod (0, i, cols[i].keep_inside_line_[LEFT]); + } + } spacer.solve (line_len, ragged); ret.force_ = spacer.force ();