]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/rest.cc
Release: update news.
[lilypond.git] / lily / rest.cc
index a25e6a93198298ef4d8ca778dbded2379e583365..9057e45af1bd90deaf29c0419ac2a2b2233ee8a9 100644 (file)
@@ -26,6 +26,7 @@
 #include "output-def.hh"
 #include "paper-score.hh"
 #include "staff-symbol-referencer.hh"
+#include "staff-symbol.hh"
 #include "stencil.hh"
 #include "grob.hh"
 
@@ -44,11 +45,11 @@ Rest::y_offset_callback (SCM smob)
 
   if (position_override)
     {
-      amount =
-        robust_scm2double (me->get_property ("staff-position"), 0) * 0.5 * ss;
+      amount
+        robust_scm2double (me->get_property ("staff-position"), 0) * 0.5 * ss;
 
       /*
-        semibreve rests were always positioned one off
+        semibreve rests are positioned one staff line off
       */
       if (duration_log == 0)
         amount += ss;
@@ -66,17 +67,25 @@ Rest::y_offset_callback (SCM smob)
 
       /*
         make a semibreve rest hang from the next line,
-        except for a single line staff;
-        assume the next line being integer steps away
+        except for a single line staff
       */
       if (duration_log == 0 && line_count > 1)
-        ++pos;
+        pos += 2;
 
       /*
         make sure rest is aligned to a staff line
       */
-      while (!Staff_symbol_referencer::on_line (me, pos))
-        ++pos;
+      if (Grob *staff = Staff_symbol_referencer::get_staff_symbol (me))
+        {
+          std::vector<Real> linepos = Staff_symbol::line_positions (staff);
+          std::sort (linepos.begin (), linepos.end ());
+          std::vector<Real>::const_iterator it
+            = std::lower_bound (linepos.begin (), linepos.end (), pos);
+          if (it != linepos.end ())
+            {
+              pos = (int)ceil (*it);
+            }
+        }
 
       amount = ss * 0.5 * pos;
     }
@@ -112,14 +121,14 @@ Rest::glyph_name (Grob *me, int durlog, string style, bool try_ledgers)
       int const pos = int (Staff_symbol_referencer::get_position (me));
 
       /*
-       half rests need ledger if not lying on a staff line,
-       whole rests need ledger if not hanging from a staff line,
-       breve rests need ledger if neither lying on nor hanging from a staff line
+        half rests need ledger if not lying on a staff line,
+        whole rests need ledger if not hanging from a staff line,
+        breve rests need ledger if neither lying on nor hanging from a staff line
       */
       if (-1 <= durlog && durlog <= 1)
         is_ledgered = !Staff_symbol_referencer::on_staff_line (me, pos)
-         && !(durlog == -1
-              && Staff_symbol_referencer::on_staff_line (me, pos + 2));
+                      && !(durlog == -1
+                           && Staff_symbol_referencer::on_staff_line (me, pos + 2));
     }
 
   string actual_style (style.c_str ());