]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/staff-symbol.cc
Web-ja: update introduction
[lilypond.git] / lily / staff-symbol.cc
index e9ad096326465b9fb514eb67ce80feea972b7d17..0697085e114b7fb7811c65a71947e6c61052d9c3 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,27 @@ 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 override of ledger positions via note head grob...
+  if (head)
+    {
+      SCM posns = head->get_property ("ledger-positions");
+      if (scm_is_pair (posns))
+        return ly_scm2floatvector (posns);
+    }
+
+  // ...or via custom ledger positions function
+  SCM lp_function = me->get_property ("ledger-positions-function");
+  if (scm_is_pair (lp_function))
+    {
+      SCM func = scm_eval (lp_function, scm_interaction_environment ());
+      if (ly_is_procedure (func))
+        return ly_scm2floatvector (scm_call_2 (func,
+                                               me->self_scm (),
+                                               scm_from_int (pos)));
+    }
+
   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);
@@ -168,7 +185,7 @@ Staff_symbol::ledger_positions (Grob *me, int pos)
   Direction dir = (Direction)sign (pos - nearest_line);
 
   if (scm_is_pair (ledger_positions))
-    // custom ledger line positions
+    // custom ledger positions via StaffSymbol.ledger-positions
     {
       Real min_pos = HUGE_VAL;
       Real max_pos = -HUGE_VAL;
@@ -249,7 +266,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
@@ -391,6 +421,7 @@ ADD_INTERFACE (Staff_symbol,
                "ledger-extra "
                "ledger-line-thickness "
                "ledger-positions "
+               "ledger-positions-function "
                "line-count "
                "line-positions "
                "staff-space "