/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 1997--2014 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ Copyright (C) 1997--2015 Han-Wen Nienhuys <hanwen@xs4all.nl>
LilyPond is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
SCM
Rest::y_offset_callback (SCM smob)
{
- Grob *me = unsmob_grob (smob);
+ Grob *me = unsmob<Grob> (smob);
int duration_log = scm_to_int (me->get_property ("duration-log"));
Real ss = Staff_symbol_referencer::staff_space (me);
return pos;
}
- pos = 4 * dir;
+ Real vpos = dir * robust_scm2int (me->get_property ("voiced-position"), 0);
+ pos = vpos;
if (duration_log > 1)
/* Only half notes or longer want alignment with staff lines */
return pos;
-
+
/*
We need a staff symbol for actually aligning anything
*/
if (linepos.empty ())
return pos;
-
+
std::sort (linepos.begin (), linepos.end ());
-
+
if (duration_log == 0)
{
/*
make a semibreve rest hang from the next available line,
except when there is none.
*/
-
+
std::vector<Real>::const_iterator it
= std::upper_bound (linepos.begin (), linepos.end (), pos);
if (it != linepos.end ())
return pos;
/* If we have a voiced position, make sure that it's on the
- proper side of neutral before using it. If it isn't, we fall
- back to a constant offset from neutral position.
+ proper side of neutral before using it.
*/
Real neutral = staff_position_internal (me, duration_log, 0);
if (dir * (pos - neutral) > 0)
return pos;
-
- return neutral + 4 * dir;
+ else
+ return neutral + vpos;
}
/* A rest might lie under a beam, in which case it should be cross-staff if
SCM
Rest::calc_cross_staff (SCM smob)
{
- Grob *me = unsmob_grob (smob);
- Grob *stem = unsmob_grob (me->get_object ("stem"));
+ Grob *me = unsmob<Grob> (smob);
+ Grob *stem = unsmob<Grob> (me->get_object ("stem"));
if (!stem)
return SCM_BOOL_F;
actual_style = "";
}
- if ((style == "classical") && (durlog != 2))
+ if (((style == "classical") || (style == "z")) && (durlog != 2))
{
/*
- classical style: revert back to default style for any rest other
- than quarter rest
+ these styles differ from the default in quarter rests only
*/
actual_style = "";
}
SCM
Rest::print (SCM smob)
{
- return brew_internal_stencil (unsmob_grob (smob), true);
+ return brew_internal_stencil (unsmob<Grob> (smob), true);
}
MAKE_SCHEME_CALLBACK (Rest, width, 1);
SCM
Rest::width (SCM smob)
{
- return generic_extent_callback (unsmob_grob (smob), X_AXIS);
+ return generic_extent_callback (unsmob<Grob> (smob), X_AXIS);
}
MAKE_SCHEME_CALLBACK (Rest, height, 1);
SCM
Rest::height (SCM smob)
{
- return generic_extent_callback (unsmob_grob (smob), Y_AXIS);
+ return generic_extent_callback (unsmob<Grob> (smob), Y_AXIS);
}
/*
with ledgered rests.
*/
SCM m = brew_internal_stencil (me, a != X_AXIS);
- return ly_interval2scm (unsmob_stencil (m)->extent (a));
+ return ly_interval2scm (unsmob<Stencil> (m)->extent (a));
}
MAKE_SCHEME_CALLBACK (Rest, pure_height, 3);
SCM /* start */,
SCM /* end */)
{
- Grob *me = unsmob_grob (smob);
+ Grob *me = unsmob<Grob> (smob);
SCM m = brew_internal_stencil (me, false);
- return ly_interval2scm (unsmob_stencil (m)->extent (Y_AXIS));
+ return ly_interval2scm (unsmob<Stencil> (m)->extent (Y_AXIS));
}
ADD_INTERFACE (Rest,
"direction "
"minimum-distance "
"style "
+ "voiced-position "
);