#include "output-def.hh"
#include "paper-score.hh"
#include "staff-symbol-referencer.hh"
+#include "staff-symbol.hh"
#include "stencil.hh"
#include "grob.hh"
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 ());