]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/staff-symbol.cc
Issue 4828/1: Allow override of NoteHead.ledger-positions
[lilypond.git] / lily / staff-symbol.cc
index e9ad096326465b9fb514eb67ce80feea972b7d17..527a5c7baf726b2a0d04d7e4e1c841777ea9fa0f 100644 (file)
@@ -28,8 +28,6 @@
 #include "staff-symbol-referencer.hh"
 #include "spanner.hh"
 
-using std::vector;
-
 MAKE_SCHEME_CALLBACK (Staff_symbol, print, 1);
 
 SCM
@@ -137,8 +135,16 @@ Staff_symbol::line_positions (Grob *me)
 }
 
 vector<Real>
-Staff_symbol::ledger_positions (Grob *me, int pos)
+Staff_symbol::ledger_positions (Grob *me, int pos, Item const *head)
 {
+  // allow the option to override ledger positions via note head grob
+  if (head)
+    {
+      SCM posns = head->get_property ("ledger-positions");
+      if (scm_is_pair (posns))
+        return ly_scm2floatvector (posns);
+    }
+
   SCM ledger_positions = me->get_property ("ledger-positions");
   Real ledger_extra = robust_scm2double (me->get_property ("ledger-extra"), 0);
   vector<Real> line_positions = Staff_symbol::line_positions (me);
@@ -249,7 +255,20 @@ Staff_symbol::ledger_positions (Grob *me, int pos)
           values[i] = nearest_line + dir * (ledger_count - i) * 2;
         }
     }
-  return values;
+  // remove any ledger lines that would fall on staff lines,
+  // which can happen when ledger-extra > 0
+  vector<Real> final_values;
+  for (vector<Real>::const_iterator i = values.begin (),
+       e = values.end ();
+       i != e;
+       ++i)
+    {
+      if (find (line_positions.begin (), line_positions.end (), *i) == line_positions.end ())
+        {
+          final_values.push_back (*i);
+        }
+    }
+  return final_values;
 }
 
 int