X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpartial-iterator.cc;h=80048d827c87bcec64bdefc0615e041d93409533;hb=90e4d7057f3857da049dfda3d130017d4719bd6b;hp=723391020913a08dab5785a36ca4acde7759d83e;hpb=d935a5a0fac63dc0dcd8197d4d2286d235fe617c;p=lilypond.git diff --git a/lily/partial-iterator.cc b/lily/partial-iterator.cc index 7233910209..80048d827c 100644 --- a/lily/partial-iterator.cc +++ b/lily/partial-iterator.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2010--2014 Neil Puttock + Copyright (C) 2010--2015 Neil Puttock LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ #include "moment.hh" #include "music.hh" #include "simple-music-iterator.hh" +#include "lily-imports.hh" class Partial_iterator : public Simple_music_iterator { @@ -38,11 +39,29 @@ void Partial_iterator::process (Moment m) { if (Duration * dur - = Duration::unsmob (get_music ()->get_property ("duration"))) + = unsmob (get_music ()->get_property ("duration"))) { Moment length = Moment (dur->get_length ()); - if (get_outlet ()->now_mom () > 0) + + // Partial_iterator is an iterator rather than an engraver, + // so the active context it is getting called in does not + // depend on which context definition the engraver might be + // defined. + // + // Using where_defined to find the context where + // measurePosition should be overwritten does not actually + // work since the Timing_translator does not set + // measurePosition when initializing. + + Context *timing = unsmob + (Lily::ly_context_find (get_outlet ()->self_scm (), + ly_symbol2scm ("Timing"))); + + if (!timing) + programming_error ("missing Timing in \\partial"); + else if (get_outlet ()->now_mom () > 0) { + timing->set_property ("partialBusy", ly_bool2scm (true)); Global_context *tg = get_outlet ()->get_global_context (); tg->add_finalization (scm_list_3 (finalization_proc, get_outlet ()->self_scm (), @@ -50,31 +69,12 @@ Partial_iterator::process (Moment m) } else { - // Partial_iterator is an iterator rather than an engraver, - // so the active context it is getting called in does not - // depend on which context definition the engraver might be - // defined. - // - // Using where_defined to find the context where - // measurePosition should be overwritten does not actually - // work since the Timing_translator does not set - // measurePosition when initializing. - - Context *timing = Context::unsmob - (scm_call_2 (ly_lily_module_constant ("ly:context-find"), - get_outlet ()->self_scm (), - ly_symbol2scm ("Timing"))); - if (!timing) - programming_error ("missing Timing in \\partial"); - else - { - Moment mp = robust_scm2moment - (timing->get_property ("measurePosition"), - Rational (0)); - mp.main_part_ = 0; - timing->set_property - ("measurePosition", (mp - length).smobbed_copy ()); - } + Moment mp = robust_scm2moment + (timing->get_property ("measurePosition"), + Rational (0)); + mp.main_part_ = 0; + timing->set_property + ("measurePosition", (mp - length).smobbed_copy ()); } } else @@ -91,10 +91,8 @@ Partial_iterator::finalization (SCM ctx, SCM length) { LY_ASSERT_SMOB (Context, ctx, 1); LY_ASSERT_SMOB (Moment, length, 2); - Context *timing = Context::unsmob - (scm_call_2 (ly_lily_module_constant ("ly:context-find"), - ctx, - ly_symbol2scm ("Timing"))); + Context *timing = unsmob + (Lily::ly_context_find (ctx, ly_symbol2scm ("Timing"))); if (!timing) { programming_error ("missing Timing in \\partial"); return SCM_UNSPECIFIED; @@ -103,6 +101,8 @@ Partial_iterator::finalization (SCM ctx, SCM length) Rational (0)); mp.main_part_ = measure_length (timing); timing->set_property ("measurePosition", - (mp - *Moment::unsmob (length)).smobbed_copy ()); + (mp - *unsmob (length)).smobbed_copy ()); + timing->unset_property (ly_symbol2scm ("partialBusy")); + return SCM_UNSPECIFIED; }