#include "output-def.hh"
#include "paper-score.hh"
#include "staff-symbol-referencer.hh"
+#include "staff-symbol.hh"
#include "stencil.hh"
#include "grob.hh"
if (position_override)
{
- amount =
- robust_scm2double (me->get_property ("staff-position"), 0) * 0.5 * ss;
+ amount
+ = robust_scm2double (me->get_property ("staff-position"), 0) * 0.5 * ss;
/*
- semibreve rests were always positioned one off
+ semibreve rests are positioned one staff line off
*/
if (duration_log == 0)
amount += ss;
/*
make a semibreve rest hang from the next line,
- except for a single line staff;
- assume the next line being integer steps away
+ except for a single line staff
*/
if (duration_log == 0 && line_count > 1)
- ++pos;
+ pos += 2;
/*
make sure rest is aligned to a staff line
*/
- while (!Staff_symbol_referencer::on_line (me, pos))
- ++pos;
+ if (Grob *staff = Staff_symbol_referencer::get_staff_symbol (me))
+ {
+ std::vector<Real> linepos = Staff_symbol::line_positions (staff);
+ std::sort (linepos.begin (), linepos.end ());
+ std::vector<Real>::const_iterator it
+ = std::lower_bound (linepos.begin (), linepos.end (), pos);
+ if (it != linepos.end ())
+ {
+ pos = (int)ceil (*it);
+ }
+ }
amount = ss * 0.5 * pos;
}
int const pos = int (Staff_symbol_referencer::get_position (me));
/*
- half rests need ledger if not lying on a staff line,
- whole rests need ledger if not hanging from a staff line,
- breve rests need ledger if neither lying on nor hanging from a staff line
+ half rests need ledger if not lying on a staff line,
+ whole rests need ledger if not hanging from a staff line,
+ breve rests need ledger if neither lying on nor hanging from a staff line
*/
if (-1 <= durlog && durlog <= 1)
is_ledgered = !Staff_symbol_referencer::on_staff_line (me, pos)
- && !(durlog == -1
- && Staff_symbol_referencer::on_staff_line (me, pos + 2));
+ && !(durlog == -1
+ && Staff_symbol_referencer::on_staff_line (me, pos + 2));
}
string actual_style (style.c_str ());