]> git.donarmstrong.com Git - lilypond.git/commitdiff
Merge remote branch 'origin/release/unstable' into HEAD
authorPhil Holmes <mail@philholmes.net>
Mon, 2 May 2016 08:21:48 +0000 (09:21 +0100)
committerPhil Holmes <mail@philholmes.net>
Mon, 2 May 2016 08:21:48 +0000 (09:21 +0100)
input/regression/ledger-positions-customization.ly [new file with mode: 0644]
lily/include/staff-symbol.hh
lily/ledger-line-spanner.cc
lily/note-head.cc
lily/staff-symbol.cc
scm/define-grob-properties.scm

diff --git a/input/regression/ledger-positions-customization.ly b/input/regression/ledger-positions-customization.ly
new file mode 100644 (file)
index 0000000..9fd2fc0
--- /dev/null
@@ -0,0 +1,27 @@
+
+\header {
+
+texidoc = "3 ways to customize ledger line positions."
+
+}
+
+\version "2.19.41"
+\paper { ragged-right = ##t }
+
+\relative {
+  \override Staff.StaffSymbol.ledger-positions = #'(7 10)
+  f''4 g a b c d e f g a b c
+}
+
+\relative {
+  % note: the scheme procedure (lambda expression) is quoted
+  \override Staff.StaffSymbol.ledger-positions-function =
+    #'(lambda (staff-symbol-grob pos) (list pos))
+  c'''4 d e f
+}
+
+\relative {
+  c'''4
+  \once \override NoteHead.ledger-positions = #'(8 10 12 14)
+  d e f
+}
index 9454ebe7f445a53c72f7284c1e7bfb5a6cd9280e..28b30244c7a87316721b913655aab890b5157cfe 100644 (file)
@@ -34,7 +34,7 @@ public:
   static Real get_ledger_line_thickness (Grob *);
 
   static vector<Real> line_positions (Grob *);
-  static vector<Real> ledger_positions (Grob *me, int pos);
+  static vector<Real> ledger_positions (Grob *me, int pos, Item const *head = 0);
   static int line_count (Grob *);
   static bool on_line (Grob *me, int pos, bool allow_ledger = true);
   static Interval line_span (Grob *);
index 42d32b496af7bb5ec7a15f1b52cdbc4ea84959c8..2fe2d7d9c3896e0b627dccc8f78ab51444007006 100644 (file)
@@ -211,10 +211,9 @@ Ledger_line_spanner::print (SCM smob)
   for (vsize i = heads.size (); i--;)
     {
       Item *h = dynamic_cast<Item *> (heads[i]);
-
       int pos = Staff_symbol_referencer::get_rounded_position (h);
       vector<Real> ledger_positions =
-        Staff_symbol::ledger_positions (staff, pos);
+        Staff_symbol::ledger_positions (staff, pos, h);
 
       // We work with all notes that produce ledgers and any notes that
       // fall outside the staff that do not produce ledgers, such as
index 33bbf339cafd9b431b83d2955522c2c8f91c1379..73a2255d9040a91199e994cf05c2fe0e6f9a74b5 100644 (file)
@@ -211,5 +211,6 @@ ADD_INTERFACE (Note_head,
                "glyph-name "
                "stem-attachment "
                "style "
+               "ledger-positions "
               );
 
index 256a9bdd0d24687ac26a63cc8cbc9a7ca2c7159e..0697085e114b7fb7811c65a71947e6c61052d9c3 100644 (file)
@@ -135,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);
@@ -166,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;
@@ -402,6 +421,7 @@ ADD_INTERFACE (Staff_symbol,
                "ledger-extra "
                "ledger-line-thickness "
                "ledger-positions "
+               "ledger-positions-function "
                "line-count "
                "line-positions "
                "staff-space "
index e54bdaf18386363be5afb59c7016051dedf88af2..60b9d5b000c2e6896237aac6c9404857610719ac 100644 (file)
@@ -575,8 +575,13 @@ lines for.")
 lines.  It is the sum of 2@tie{}numbers: The first is the factor for
 line thickness, and the second for staff space.  Both contributions
 are added.")
-     (ledger-positions ,list? "Repeating pattern for the vertical positions
-of ledger lines.  Bracketed groups are always shown together.")
+     (ledger-positions ,list? "Vertical positions of ledger lines.
+When set on a @code{StaffSymbol} grob it defines a repeating
+pattern of ledger lines and any parenthesized groups will always be
+shown together.")
+     (ledger-positions-function ,scheme? "A quoted Scheme procedure that
+takes a @code{StaffSymbol} grob and the vertical position of a note head
+as arguments and returns a list of ledger line positions.")
      (left-bound-info ,list? "An alist of properties for determining
 attachments of spanners to edges.")
      (left-padding ,ly:dimension? "The amount of space that is put