From 1297fadcbb013180eb30b4a647725377ef1226ae Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Mon, 1 Jan 2007 16:14:47 +0100 Subject: [PATCH] Fix #136. Take original offset into account when returning new shift in rest-beam collision callback. --- .../rest-collision-beam-quantized.ly | 19 ++++++++ .../regression/rest-collision-beam-restdir.ly | 18 ++++++++ input/regression/rest-collision-beam.ly | 44 +++++-------------- lily/beam-engraver.cc | 1 + lily/beam.cc | 17 +++---- 5 files changed, 57 insertions(+), 42 deletions(-) create mode 100644 input/regression/rest-collision-beam-quantized.ly create mode 100644 input/regression/rest-collision-beam-restdir.ly diff --git a/input/regression/rest-collision-beam-quantized.ly b/input/regression/rest-collision-beam-quantized.ly new file mode 100644 index 0000000000..95f1e851fe --- /dev/null +++ b/input/regression/rest-collision-beam-quantized.ly @@ -0,0 +1,19 @@ +\header { + texidoc = "Rests under beams moved by whole staff spaces." +} + +\layout { + ragged-right = ##t +} + +\version "2.10.0" + +fig = \relative c' { + 8[ + r r r ] + r | +} + +\relative c' \new Staff { + \transpose c c, \fig +} diff --git a/input/regression/rest-collision-beam-restdir.ly b/input/regression/rest-collision-beam-restdir.ly new file mode 100644 index 0000000000..cd595d865d --- /dev/null +++ b/input/regression/rest-collision-beam-restdir.ly @@ -0,0 +1,18 @@ +\header { + texidoc = "Beam/rest collision takes offset due to @code{Rest #'direction} into +account properly." +} + +\version "2.10.7" +\paper { + ragged-right = ##t +} + + +\relative c''' { + \override Rest #'direction = #UP + \stemDown b8[ r b] + \override Rest #'direction = #DOWN + \stemDown b8[ r b] +} + diff --git a/input/regression/rest-collision-beam.ly b/input/regression/rest-collision-beam.ly index 7e0e2f5fff..6a38e581bd 100644 --- a/input/regression/rest-collision-beam.ly +++ b/input/regression/rest-collision-beam.ly @@ -1,40 +1,16 @@ \header { - texidoc = "Rests under beams are only moved if necessary." -} - -\layout { - ragged-right = ##t -} -\version "2.10.0" + texidoc = "Rests under beams are shifted upon +collision." -fig = \relative c' { - 8[ r r r ] - r | } - +\version "2.10.7" +\paper { + ragged-right = ##t +} - - \relative c' \new Staff { - \fig - \transpose c c, \fig - \new Voice { \stemUp \transpose c f \fig } - << - \\ - \transpose f c \fig - >> - - << - { \transpose c c' \fig } - \\ - {} - >> - - << \transpose c c' \fig \\ - \transpose f c \fig - >> - } - - - +\relative c''' { + \stemDown b8[ r b] + \stemUp b,,8[ r b] +} diff --git a/lily/beam-engraver.cc b/lily/beam-engraver.cc index cad443299c..2e5bf81a20 100644 --- a/lily/beam-engraver.cc +++ b/lily/beam-engraver.cc @@ -27,6 +27,7 @@ class Beam_engraver : public Engraver public: DECLARE_ACKNOWLEDGER (stem); DECLARE_ACKNOWLEDGER (rest); + protected: Stream_event *start_ev_; diff --git a/lily/beam.cc b/lily/beam.cc index 224ba1a3f4..51ce0967ea 100644 --- a/lily/beam.cc +++ b/lily/beam.cc @@ -1332,12 +1332,8 @@ Beam::rest_collision_callback (SCM smob, SCM prev_offset) || !Beam::visible_stem_count (beam)) return scm_from_double (0.0); - Drul_array pos (0, 0); - SCM s = beam->get_property ("positions"); - if (scm_is_pair (s) && scm_is_number (scm_car (s))) - pos = ly_scm2interval (s); - else - programming_error ("positions property should always be pair of numbers."); + Drul_array pos (robust_scm2drul (beam->get_property ("positions"), + Drul_array (0,0))); Real staff_space = Staff_symbol_referencer::staff_space (rest); @@ -1373,6 +1369,11 @@ Beam::rest_collision_callback (SCM smob, SCM prev_offset) Real beam_y = stem_y - d * height_of_my_beams; Grob *common_y = rest->common_refpoint (beam, Y_AXIS); + + /* + TODO: this is dubious, because this call needs the info we're + computing right now. + */ Interval rest_extent = rest->extent (common_y, Y_AXIS); rest_extent.translate (offset); @@ -1381,7 +1382,7 @@ Beam::rest_collision_callback (SCM smob, SCM prev_offset) = staff_space * (robust_scm2double (stem->get_property ("stemlet-length"), 0.0) + robust_scm2double (rest->get_property ("minimum-distance"), 0.0)); - Real shift = d * min (((beam_y - d * minimum_distance) - rest_dim) * d, 0.0); + Real shift = d * min (d * (beam_y - d * minimum_distance - rest_dim), 0.0); shift /= staff_space; Real rad = Staff_symbol_referencer::line_count (rest) * staff_space / 2; @@ -1396,7 +1397,7 @@ Beam::rest_collision_callback (SCM smob, SCM prev_offset) < rad) shift = ceil (fabs (shift)) * sign (shift); - return scm_from_double (staff_space * shift); + return scm_from_double (offset + staff_space * shift); } bool -- 2.39.5