From: Keith OHara Date: Mon, 17 Nov 2014 06:13:24 +0000 (-0800) Subject: improve initial estimate of beamed-rest position; issue 472 X-Git-Tag: release/2.19.16-1~2^2~54^2~28 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=51e44f41ba70013bf389c5dabe1e1f16f76564df;p=lilypond.git improve initial estimate of beamed-rest position; issue 472 --- diff --git a/input/regression/beam-rest-extreme.ly b/input/regression/beam-rest-extreme.ly index 9c7d5df3b9..4dccd6b394 100644 --- a/input/regression/beam-rest-extreme.ly +++ b/input/regression/beam-rest-extreme.ly @@ -10,5 +10,5 @@ that gets their spacing correct in the majority of circumstances. 16[ r ] 16[ r ] 16[ r ] - 16[ r ] + 16[ r ] } diff --git a/lily/beam.cc b/lily/beam.cc index 3d9db72501..548daf612e 100644 --- a/lily/beam.cc +++ b/lily/beam.cc @@ -1301,7 +1301,7 @@ Beam::rest_collision_callback (SCM smob, SCM prev_offset) /* Estimate the position of a rest under a beam, - as the average position of its neighboring heads. + using the average position of its neighboring heads. */ MAKE_SCHEME_CALLBACK_WITH_OPTARGS (Beam, pure_rest_collision_callback, 4, 1, ""); SCM @@ -1324,15 +1324,6 @@ Beam::pure_rest_collision_callback (SCM smob, Real ss = Staff_symbol_referencer::staff_space (me); - /* - This gives the extrema of rest positions. - Even with noteheads on ledgers, beams typically remain within the staff, - and push rests at most one staff-space (2 positions) from the staff. - */ - Grob *staff = Staff_symbol_referencer::get_staff_symbol (me); - Interval rest_max_pos = staff ? Staff_symbol::line_span (staff) : Interval (0.0, 0.0); - rest_max_pos.widen (2); - extract_grob_set (beam, "stems", stems); vector my_stems; @@ -1363,24 +1354,26 @@ Beam::pure_rest_collision_callback (SCM smob, right = my_stems[idx + 1]; } - /* In stems with several heads, use the one closest to the beam. */ + /* Estimate the closest beam to be four positions away from the heads, */ Direction beamdir = get_grob_direction (beam); - Real shift = min (max ( (Stem::head_positions (left)[beamdir] - + Stem::head_positions (right)[beamdir]) / 2.0, - rest_max_pos[DOWN]), - rest_max_pos[UP] - ) * ss / 2.0 - - previous; - - // So that ceil below kicks in for rests that would otherwise brush - // up against a beam quanted to a ledger line, add a bit of space - // between the beam and the rest. - shift += (0.01 * beamdir); - - /* Always move by a whole number of staff spaces */ - shift = ceil (fabs (shift / ss)) * ss * sign (shift); - - return scm_from_double (previous + shift); + Real beam_pos = (Stem::head_positions (left)[beamdir] + + Stem::head_positions (right)[beamdir]) / 2.0 + + 4.0 * beamdir; // four staff-positions + /* and that the closest beam never crosses staff center by more than two positions */ + beam_pos = max (-2.0, beam_pos * beamdir) * beamdir; + + Real minimum_distance + = ss * (robust_scm2double (stem->get_property ("stemlet-length"), 0.0) + + robust_scm2double (me->get_property ("minimum-distance"), 0.0)); + Real offset = beam_pos * ss / 2.0 + - minimum_distance * beamdir + - me->extent (me, Y_AXIS)[beamdir]; + + /* Always move by a whole number of staff spaces, always away from the beam */ + offset = floor (min (0.0, (offset - previous) / ss * beamdir)) + * ss * beamdir + previous; + + return scm_from_double (offset); } bool