X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmulti-measure-rest.cc;h=e823c298e319ee2dc47b95f0d77cde384465a748;hb=43f119f9f2eedeecfecb8f8a8f090f54073b9b84;hp=34f6bb6e687b2649a77c750d55b14010521c8475;hpb=9214fc9912ee14c29aa523f880c97b12bf5a2d17;p=lilypond.git diff --git a/lily/multi-measure-rest.cc b/lily/multi-measure-rest.cc index 34f6bb6e68..e823c298e3 100644 --- a/lily/multi-measure-rest.cc +++ b/lily/multi-measure-rest.cc @@ -19,6 +19,7 @@ #include "multi-measure-rest.hh" +#include "directional-element-interface.hh" #include "duration.hh" #include "font-interface.hh" #include "international.hh" @@ -224,13 +225,14 @@ Multi_measure_rest::symbol_stencil (Grob *me, Real space) if (measure_count == 1) { - if (mdl == 0 && me->get_property ("staff-position") == SCM_EOL) + if (me->get_property ("staff-position") == SCM_EOL) { - Real pos = Rest::staff_position_internal (me, mdl, 0); + int dir = get_grob_direction (me); + Real pos = Rest::staff_position_internal (me, mdl, dir); me->set_property ("staff-position", scm_from_double (pos)); } - - Stencil s = musfont->find_by_name (Rest::glyph_name (me, mdl, "", true)); + + Stencil s = musfont->find_by_name (Rest::glyph_name (me, mdl, "", true, 0.0)); s.translate_axis ((space - s.extent (X_AXIS).length ()) / 2, X_AXIS); return s; @@ -279,6 +281,22 @@ Multi_measure_rest::church_rest (Grob *me, Font_metric *musfont, int measure_cou Real symbols_width = 0.0; double total_duration = measure_count * pow (2.0, -calc_measure_duration_log (me, true)); + SCM staff_position = me->get_property ("staff-position"); + + if (!scm_is_number (staff_position)) + { + // Staff position is somewhat icky regarding its definition for + // compatibility reasons. It is intended to be the baseline of + // a breve rest. However, when the staff space is more than + // single space (like with tablature), it looks better if all + // rests are actually hanging. So staff position, in reality, + // is the semi-breve position - 2. Everything else is + // calculated from there. + int dir = get_grob_direction (me); + Real pos = Rest::staff_position_internal (me, 0, dir); + me->set_property ("staff-position", scm_from_double (pos - 2)); + } + while (total_duration > 0) { int dl = calc_closest_duration_log (me, total_duration, false, true); @@ -286,12 +304,17 @@ Multi_measure_rest::church_rest (Grob *me, Font_metric *musfont, int measure_cou total_duration -= duration; - Stencil r = musfont->find_by_name (Rest::glyph_name (me, dl, "", true)); + Stencil r = musfont->find_by_name (Rest::glyph_name (me, dl, "", true, 2)); + + Real staff_space = Staff_symbol_referencer::staff_space (me); if (dl == 0) { - Real staff_space = Staff_symbol_referencer::staff_space (me); r.translate_axis (staff_space, Y_AXIS); } + else + { + r.translate_axis (staff_space-r.extent (Y_AXIS).at (UP), Y_AXIS); + } symbols_width += r.extent (X_AXIS).length (); mols = scm_cons (r.smobbed_copy (), mols); symbol_count++;