X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fstaff-symbol.cc;h=0697085e114b7fb7811c65a71947e6c61052d9c3;hb=HEAD;hp=f4b18dfd78ad67e5e2c067332f36b0c130cd5605;hpb=ccb42361aa4ad49c07d5c76b1feab3d6647dc159;p=lilypond.git diff --git a/lily/staff-symbol.cc b/lily/staff-symbol.cc index f4b18dfd78..0697085e11 100644 --- a/lily/staff-symbol.cc +++ b/lily/staff-symbol.cc @@ -33,7 +33,7 @@ MAKE_SCHEME_CALLBACK (Staff_symbol, print, 1); SCM Staff_symbol::print (SCM smob) { - Grob *me = Grob::unsmob (smob); + Grob *me = unsmob (smob); Spanner *sp = dynamic_cast (me); Grob *common = sp->get_bound (LEFT)->common_refpoint (sp->get_bound (RIGHT), X_AXIS); @@ -135,8 +135,27 @@ Staff_symbol::line_positions (Grob *me) } vector -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 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; @@ -247,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 final_values; + for (vector::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 @@ -289,7 +321,7 @@ MAKE_SCHEME_CALLBACK (Staff_symbol, height, 1); SCM Staff_symbol::height (SCM smob) { - Grob *me = Grob::unsmob (smob); + Grob *me = unsmob (smob); Real t = me->layout ()->get_dimension (ly_symbol2scm ("line-thickness")); t *= robust_scm2double (me->get_property ("thickness"), 1.0); @@ -389,6 +421,7 @@ ADD_INTERFACE (Staff_symbol, "ledger-extra " "ledger-line-thickness " "ledger-positions " + "ledger-positions-function " "line-count " "line-positions " "staff-space "