X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fconstrained-breaking.cc;h=1efae87e125047bdd317595a6124408fc5c98e4f;hb=e7f6416d7f3379d5b64f9e783cd519acc5482546;hp=714f8ce6eed9dc5332489d3513918fe03f591121;hpb=3f8485925e8c879fe4c9ae86acef9804126c3b91;p=lilypond.git diff --git a/lily/constrained-breaking.cc b/lily/constrained-breaking.cc index 714f8ce6ee..1efae87e12 100644 --- a/lily/constrained-breaking.cc +++ b/lily/constrained-breaking.cc @@ -189,7 +189,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 +265,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]; } @@ -301,6 +301,17 @@ Constrained_breaking::Constrained_breaking (Paper_score *ps, vector const initialize (); } +static SCM +min_permission (SCM perm1, SCM perm2) +{ + if (perm1 == ly_symbol2scm ("force")) + return perm2; + if (perm1 == ly_symbol2scm ("allow") + && perm2 != ly_symbol2scm ("force")) + return perm2; + return SCM_EOL; +} + /* find the forces for all possible lines and cache ragged_ and ragged_right_ */ void Constrained_breaking::initialize () @@ -331,7 +342,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]]); @@ -343,7 +353,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; @@ -354,9 +364,18 @@ Constrained_breaking::initialize () line.break_permission_ = c->get_property ("line-break-permission"); line.page_permission_ = c->get_property ("page-break-permission"); line.turn_permission_ = c->get_property ("page-turn-permission"); - - max_ext = max (max_ext, extent.length ()); - line.extent_ = extent; + + /* turn permission should always be stricter than page permission + and page permission should always be stricter than line permission */ + line.page_permission_ = min_permission (line.break_permission_, + line.page_permission_); + line.turn_permission_ = min_permission (line.page_permission_, + line.turn_permission_); + + 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;