From ccb42361aa4ad49c07d5c76b1feab3d6647dc159 Mon Sep 17 00:00:00 2001 From: Paul Morris Date: Fri, 20 Mar 2015 00:27:20 -0400 Subject: [PATCH] staff-symbol.cc: on_line and custom ledger lines Issue 4040 (Patch 1 of 2) make Staff_symbol::on_line work properly with custom ledger line positions --- lily/staff-symbol.cc | 59 +++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/lily/staff-symbol.cc b/lily/staff-symbol.cc index 6ae66d85c1..f4b18dfd78 100644 --- a/lily/staff-symbol.cc +++ b/lily/staff-symbol.cc @@ -316,34 +316,9 @@ Staff_symbol::height (SCM smob) bool Staff_symbol::on_line (Grob *me, int pos, bool allow_ledger) { - SCM line_positions = me->get_property ("line-positions"); - if (scm_is_pair (line_positions)) - { - Real min_line = HUGE_VAL; - Real max_line = -HUGE_VAL; - for (SCM s = line_positions; scm_is_pair (s); s = scm_cdr (s)) - { - Real current_line = scm_to_double (scm_car (s)); - if (pos == current_line) - return true; - if (current_line > max_line) - max_line = current_line; - if (current_line < min_line) - min_line = current_line; - - } - - if (allow_ledger) - { - if (pos < min_line) - return (( (int) (rint (pos - min_line)) % 2) == 0); - if (pos > max_line) - return (( (int) (rint (pos - max_line)) % 2) == 0); - } - - return false; - } - else + // standard staff lines (any line count) and standard ledger lines + if (!scm_is_pair (me->get_property ("line-positions")) + && !scm_is_pair (me->get_property ("ledger-positions"))) { int const line_cnt = line_count (me); bool result = abs (pos + line_cnt) % 2 == 1; @@ -353,6 +328,34 @@ Staff_symbol::on_line (Grob *me, int pos, bool allow_ledger) } return result; } + + // staff lines (custom or standard) + vector lines = Staff_symbol::line_positions (me); + for (vector::const_iterator i = lines.begin (), + e = lines.end (); + i != e; + ++i) + { + if (pos == *i) + return true; + } + + // ledger lines (custom or standard) + if (allow_ledger) + { + vector ledgers = Staff_symbol::ledger_positions (me, pos); + if (ledgers.empty ()) + return false; + for (vector::const_iterator i = ledgers.begin (), + e = ledgers.end (); + i != e; + ++i) + { + if (pos == *i) + return true; + } + } + return false; } Interval -- 2.39.2