diff options
author | David Kastrup <dak@gnu.org> | 2012-04-21 22:31:51 +0200 |
---|---|---|
committer | David Kastrup <dak@gnu.org> | 2012-04-21 22:31:51 +0200 |
commit | 57c0a284da0de2f89674bfa1cbae8159944b8f5a (patch) | |
tree | cbad27dbaca945b39f455f75a51150e6a965664a /lily/beam.cc | |
parent | 0b4452964cd127b0907094fdd2bcd88f88e6a598 (diff) |
Revert "pure-rest-collision-callback: Remain on staff lines; issue 2468"
This reverts commit f5abf75fb0a62527ea1c6339861aee34b210cc24.
Diffstat (limited to 'lily/beam.cc')
-rw-r--r-- | lily/beam.cc | 39 |
1 files changed, 16 insertions, 23 deletions
diff --git a/lily/beam.cc b/lily/beam.cc index d9be082b90..0cfc3e193c 100644 --- a/lily/beam.cc +++ b/lily/beam.cc @@ -1306,39 +1306,36 @@ Beam::rest_collision_callback (SCM smob, SCM prev_offset) return scm_from_double (offset + staff_space * shift); } -/* - Estimate the position of a rest under a beam, - as the average position of its neighboring heads. -*/ MAKE_SCHEME_CALLBACK_WITH_OPTARGS (Beam, pure_rest_collision_callback, 4, 1, ""); SCM Beam::pure_rest_collision_callback (SCM smob, - SCM prev_offset, + SCM, /* prev_offset */ SCM, /* start */ SCM /* end */) { - Real previous = robust_scm2double (prev_offset, 0.0); + Real amount = 0.0; Grob *me = unsmob_grob (smob); Grob *stem = unsmob_grob (me->get_object ("stem")); if (!stem) - return scm_from_double (previous); + return scm_from_double (amount); Grob *beam = unsmob_grob (stem->get_object ("beam")); if (!beam || !Beam::normal_stem_count (beam) || !is_direction (beam->get_property_data ("direction"))) - return scm_from_double (previous); + return scm_from_double (amount); 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. + In general, beams are never typeset more than one staff space away + from the staff in either direction. */ 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); + rest_max_pos.widen (1); + rest_max_pos *= ss / 2; extract_grob_set (beam, "stems", stems); vector<Grob *> my_stems; @@ -1359,7 +1356,7 @@ Beam::pure_rest_collision_callback (SCM smob, Grob *right; if (idx == (vsize) - 1 || my_stems.size () == 1) - return scm_from_double (previous); + return scm_from_double (amount); else if (idx == 0) left = right = my_stems[1]; else if (idx == my_stems.size () - 1) @@ -1370,18 +1367,14 @@ Beam::pure_rest_collision_callback (SCM smob, right = my_stems[idx + 1]; } Direction beamdir = get_grob_direction (beam); + /* + Take the position between the two bounding head_positions, + then bound it by the minimum and maximum positions outside the staff. + 4.0 = 2.0 to get out of staff space * 2.0 for the average + */ + amount = min (max ((Stem::head_positions (left)[beamdir] + Stem::head_positions (right)[beamdir]) / 4.0, rest_max_pos[DOWN]), rest_max_pos[UP]); - /* In stems with several heads, use the one closest to the 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; - /* Always move by a whole number of staff spaces */ - shift = ceil (fabs (shift / ss)) * ss * sign (shift); - - return scm_from_double (previous + shift); + return scm_from_double (amount); } bool |