]> 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:14:47 +0000 (16:14 +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 53d123454777fd33d071200132ee8e2abb75861a..b0d640a62b77811f427ae0a5fe79698b533b98ef 100644 (file)
@@ -27,6 +27,7 @@ class Beam_engraver : public Engraver
 public:
   DECLARE_ACKNOWLEDGER (stem);
   DECLARE_ACKNOWLEDGER (rest);
+
 protected:
   Stream_event *start_ev_;
 
index 77953070c91192eb47af325d7ad013c44530c4c1..58fd432493f3db625afa4a27138d6e3af7c05a93 100644 (file)
@@ -1336,12 +1336,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);
 
@@ -1377,6 +1373,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);
   
@@ -1385,7 +1386,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;
@@ -1400,7 +1401,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