X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fconstrained-breaking.cc;h=3a56aa47541190b7bd2f6e2669d5292f7e4d1fac;hb=840936be1b28526ef292b5dae8ae031b4fa587f9;hp=c688be6a1b54237b859f52375f086e9e9275da07;hpb=a3765e1d290e5e49093e7ca7791bf3fe20be1726;p=lilypond.git diff --git a/lily/constrained-breaking.cc b/lily/constrained-breaking.cc index c688be6a1b..3a56aa4754 100644 --- a/lily/constrained-breaking.cc +++ b/lily/constrained-breaking.cc @@ -4,7 +4,7 @@ source file of the GNU LilyPond music typesetter - (c) 2006--2007 Joe Neeman + (c) 2006--2009 Joe Neeman */ #include "constrained-breaking.hh" @@ -123,6 +123,15 @@ Constrained_breaking::space_line (vsize i, vsize j) bool last = j == breaks_.size () - 1; bool ragged = ragged_right || (last && ragged_last); + /* As a special case, if there is only one line in the score and ragged-right + hasn't been specifically forbidden and the line is stretched, use + ragged spacing. */ + if (last && i == 0 + && lines_.at (i, j).force_ >= 0 + && !scm_is_bool (pscore_->layout ()->c_variable ("ragged-right")) + && !scm_is_bool (pscore_->layout ()->c_variable ("ragged-last"))) + ragged = true; + return get_line_configuration (line, line_dims[RIGHT] - line_dims[LEFT], line_dims[LEFT], ragged); } @@ -189,7 +198,7 @@ Constrained_breaking::solve (vsize start, vsize end, vsize sys_count) vector Constrained_breaking::best_solution (vsize start, vsize end) { - vsize min_systems = min_system_count (start, end); + vsize min_systems = min_system_count (start, end); vsize max_systems = max_system_count (start, end); Real best_demerits = infinity_f; vector best_so_far; @@ -265,7 +274,7 @@ Constrained_breaking::min_system_count (vsize start, vsize end) int Constrained_breaking::max_system_count (vsize start, vsize end) { - vsize brk = (end >= start_.size ()) ? breaks_.size () : starting_breakpoints_[end]; + vsize brk = (end >= start_.size ()) ? breaks_.size () - 1 : starting_breakpoints_[end]; return brk - starting_breakpoints_[start]; } @@ -342,7 +351,6 @@ Constrained_breaking::initialize () ragged_right_); for (vsize i = 0; i + 1 < breaks_.size (); i++) { - Real max_ext = 0; for (vsize j = i + 1; j < breaks_.size (); j++) { int start = Paper_column::get_rank (all_[breaks_[i]]); @@ -354,7 +362,7 @@ Constrained_breaking::initialize () line.force_ = forces[i*breaks_.size () + j]; if (ragged && last && !isinf (line.force_)) - line.force_ = (line.force_ < 0) ? infinity_f : 0; + line.force_ = (line.force_ < 0 && j > i + 1) ? infinity_f : 0; if (isinf (line.force_)) break; @@ -373,8 +381,10 @@ Constrained_breaking::initialize () line.turn_permission_ = min_permission (line.page_permission_, line.turn_permission_); - max_ext = max (max_ext, extent.length ()); - line.extent_ = extent; + line.extent_ = (extent.is_empty () + || isnan (extent[LEFT]) + || isnan (extent[RIGHT])) + ? Interval (0, 0) : extent; line.padding_ = padding; line.space_ = space; line.inverse_hooke_ = extent.length () + space;