X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmulti-measure-rest.cc;h=c0f26f5c857c394f1db2de658594919de77e5414;hb=31ae5880931a923a88c3a12a66d113436dfb97af;hp=d6142b1890b257a97fb42e1f284fcec1a19581bd;hpb=a066a93ee74edebb9d238a1bac93c3bc7e8e6e4a;p=lilypond.git diff --git a/lily/multi-measure-rest.cc b/lily/multi-measure-rest.cc index d6142b1890..c0f26f5c85 100644 --- a/lily/multi-measure-rest.cc +++ b/lily/multi-measure-rest.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2011 Jan Nieuwenhuizen + Copyright (C) 1998--2012 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,6 +19,7 @@ #include "multi-measure-rest.hh" +#include "duration.hh" #include "font-interface.hh" #include "international.hh" #include "lookup.hh" @@ -29,6 +30,7 @@ #include "percent-repeat-item.hh" #include "rest.hh" #include "separation-item.hh" +#include "spacing-options.hh" #include "spanner.hh" #include "staff-symbol-referencer.hh" #include "system.hh" @@ -40,8 +42,7 @@ Multi_measure_rest::bar_width (Spanner *me) { SCM spacing_pair = me->get_property ("spacing-pair"); Interval iv; - Direction d = LEFT; - do + for (LEFT_and_RIGHT (d)) { Item *col = me->get_bound (d)->get_column (); SCM align_sym @@ -52,7 +53,6 @@ Multi_measure_rest::bar_width (Spanner *me) iv[d] = coldim[-d]; } - while (flip (&d) != LEFT); return iv; } @@ -116,7 +116,7 @@ Multi_measure_rest::print (SCM smob) } int -calc_closest_duration_log (Grob *me, double duration, bool force_round_up) +calc_closest_duration_log (Grob *me, double duration, bool force_round_up, bool paranoid) { bool round_up = force_round_up || to_boolean (me->get_property ("round-up-to-longer-rest")); @@ -131,8 +131,9 @@ calc_closest_duration_log (Grob *me, double duration, bool force_round_up) int maximum_usable_duration_log = 15; SCM duration_logs_list = me->get_property ("usable-duration-logs"); - if (to_boolean (scm_null_p (duration_logs_list)) - || !to_boolean (scm_list_p (duration_logs_list))) + if (paranoid + && (to_boolean (scm_null_p (duration_logs_list)) + || !to_boolean (scm_list_p (duration_logs_list)))) { warning (_ ("usable-duration-logs must be a non-empty list. Falling back to whole rests.")); closest_usable_duration_log = 0; @@ -169,20 +170,18 @@ calc_closest_duration_log (Grob *me, double duration, bool force_round_up) } int -calc_measure_duration_log (Grob *me) +calc_measure_duration_log (Grob *me, bool paranoid) { SCM sml = dynamic_cast (me)->get_bound (LEFT) - ->get_property ("measure-length"); + ->get_property ("measure-length"); Rational ml = (unsmob_moment (sml)) ? unsmob_moment (sml)->main_part_ - : Rational (1); + : Rational (1); double measure_duration = ml.Rational::to_double (); - bool force_round_up = to_boolean ( - scm_list_p ( - scm_member ( - scm_cons (scm_from_int64 (ml.numerator ()), - scm_from_int64 (ml.denominator ())), - me->get_property ("round-up-exceptions")))); - return calc_closest_duration_log (me, measure_duration, force_round_up); + bool force_round_up = to_boolean (scm_list_p (scm_member (scm_cons (scm_from_int64 (ml.numerator ()), + scm_from_int64 (ml.denominator ())), + me->get_property ("round-up-exceptions")))); + + return calc_closest_duration_log (me, measure_duration, force_round_up, paranoid); } Stencil @@ -204,16 +203,20 @@ Multi_measure_rest::symbol_stencil (Grob *me, Real space) return s; } - Real staff_space = Staff_symbol_referencer::staff_space (me); - Font_metric *musfont = Font_interface::get_default_font (me); - int mdl = calc_measure_duration_log (me); + int mdl = calc_measure_duration_log (me, true); if (measure_count == 1) { - Stencil s = musfont->find_by_name (Rest::glyph_name (me, mdl, "", true)); if (mdl == 0 && me->get_property ("staff-position") == SCM_EOL) - s.translate_axis (staff_space, Y_AXIS); + { + if (Staff_symbol_referencer::on_staff_line (me, 2)) + me->set_property ("staff-position", scm_from_int (2)); + else if (Staff_symbol_referencer::on_staff_line (me, 3)) + me->set_property ("staff-position", scm_from_int (3)); + } + + Stencil s = musfont->find_by_name (Rest::glyph_name (me, mdl, "", true)); s.translate_axis ((space - s.extent (X_AXIS).length ()) / 2, X_AXIS); return s; @@ -260,11 +263,11 @@ Multi_measure_rest::church_rest (Grob *me, Font_metric *musfont, int measure_cou SCM mols = SCM_EOL; int symbol_count = 0; Real symbols_width = 0.0; - double total_duration = measure_count * pow (2.0, -calc_measure_duration_log (me)); + double total_duration = measure_count * pow (2.0, -calc_measure_duration_log (me, true)); while (total_duration > 0) { - int dl = calc_closest_duration_log (me, total_duration, false); + int dl = calc_closest_duration_log (me, total_duration, false, true); double duration = pow (2.0, -dl); total_duration -= duration; @@ -317,6 +320,20 @@ Multi_measure_rest::calculate_spacing_rods (Grob *me, Real length) Item *ri = sp->get_bound (RIGHT)->get_column (); Item *lb = li->find_prebroken_piece (RIGHT); Item *rb = ri->find_prebroken_piece (LEFT); + Grob *spacing = unsmob_grob (li->get_object ("spacing")); + if (!spacing) + spacing = unsmob_grob (ri->get_object ("spacing")); + if (!spacing) + me->warning ("Using naive multi measure rest spacing."); + else + { + Spacing_options options; + options.init_from_grob (me); + int dl = calc_measure_duration_log (me, false); + Duration dur = Duration (dl, 0); + Rational rat = dur.get_length (); + length = max (length, options.get_duration_space (rat)); + } Item *combinations[4][2] = {{li, ri}, {lb, ri},