]> git.donarmstrong.com Git - lilypond.git/commitdiff
Fix #136.
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Mon, 1 Jan 2007 15:14:47 +0000 (16:14 +0100)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Mon, 1 Jan 2007 15:15:28 +0000 (16:15 +0100)
Take original offset into account when returning new shift
in rest-beam collision callback.

input/regression/rest-collision-beam-quantized.ly [new file with mode: 0644]
input/regression/rest-collision-beam-restdir.ly [new file with mode: 0644]
input/regression/rest-collision-beam.ly
lily/beam-engraver.cc
lily/beam.cc

diff --git a/input/regression/rest-collision-beam-quantized.ly b/input/regression/rest-collision-beam-quantized.ly
new file mode 100644 (file)
index 0000000..95f1e85
--- /dev/null
@@ -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' {
+  <a c e>8[
+    r <c e a> r <e a c> r <a c e>]
+    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 (file)
index 0000000..cd595d8
--- /dev/null
@@ -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]
+}
+
index 7e0e2f5fffe902ed69665cb7e71acfb4fa9c34aa..6a38e581bd564144e990bde0b9e176a918d7f05a 100644 (file)
@@ -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' {
-  <a c e>8[ r <c e a> r <e a c> r <a c e>]
-           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] 
+}
 
index cad443299c789b79f8402e937238e6a28d80c20c..2e5bf81a2084fa91064535ceb1ec3fdd535d72ad 100644 (file)
@@ -27,6 +27,7 @@ class Beam_engraver : public Engraver
 public:
   DECLARE_ACKNOWLEDGER (stem);
   DECLARE_ACKNOWLEDGER (rest);
+
 protected:
   Stream_event *start_ev_;
 
index 224ba1a3f4b1cabb2f82df80aeb7352efde191ca..51ce0967ea0a48c8ca1369c062478c679321e1bd 100644 (file)
@@ -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<Real> 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<Real> pos (robust_scm2drul (beam->get_property ("positions"),
+                                        Drul_array<Real> (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