X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fquote-iterator.cc;h=35ecbca4c8cd244c3d5a55300fb662d72cbef3cd;hb=f2a614956b218b9e500020ac45a0c17301968428;hp=44266a6bc469b703f2b206fd13e4d00547e20030;hpb=57be7394ffa2e7d7ba6d60548dba563f3409d472;p=lilypond.git diff --git a/lily/quote-iterator.cc b/lily/quote-iterator.cc index 44266a6bc4..35ecbca4c8 100644 --- a/lily/quote-iterator.cc +++ b/lily/quote-iterator.cc @@ -1,16 +1,31 @@ /* - quote-iterator.cc -- implement Quote_iterator + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 2004--2010 Han-Wen Nienhuys - (c) 2004--2005 Han-Wen Nienhuys + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ +#include "music-wrapper-iterator.hh" + #include "context.hh" -#include "event.hh" -#include "music-sequence.hh" +#include "dispatcher.hh" +#include "input.hh" +#include "international.hh" #include "lily-guile.hh" -#include "music-wrapper-iterator.hh" +#include "music-sequence.hh" +#include "music.hh" #include "warn.hh" class Quote_iterator : public Music_wrapper_iterator @@ -18,19 +33,19 @@ class Quote_iterator : public Music_wrapper_iterator public: Quote_iterator (); Moment vector_moment (int idx) const; - Interpretation_context_handle quote_outlet_; + Context_handle quote_outlet_; Moment start_moment_; Moment stop_moment_; SCM event_vector_; int event_idx_; int end_idx_; - + SCM transposed_musics_; DECLARE_SCHEME_CALLBACK (constructor, ()); bool quote_ok () const; - bool accept_music_type (Music *) const; + bool accept_music_type (Stream_event *, bool is_cue = true) const; protected: virtual void derived_mark () const; @@ -49,16 +64,21 @@ Quote_iterator::do_quit () } bool -Quote_iterator::accept_music_type (Music *mus) const +Quote_iterator::accept_music_type (Stream_event *ev, bool is_cue) const { - SCM accept = get_outlet ()->get_property ("quotedEventTypes"); - for (SCM s = mus->get_property ("types"); - scm_is_pair (s); s = scm_cdr (s)) + SCM accept = SCM_EOL; + // Cue notes use the quotedCueEventTypes property, otherwise (and as fallback + // for cue notes if quotedCueEventTypes is not set) use quotedEventTypes + if (is_cue) + accept = get_outlet ()->get_property ("quotedCueEventTypes"); + if (accept == SCM_EOL) + accept = get_outlet ()->get_property ("quotedEventTypes"); + + for (; scm_is_pair (accept); accept = scm_cdr (accept)) { - if (scm_memq (scm_car (s), accept) != SCM_BOOL_F) + if (ev->internal_in_event_class (scm_car (accept))) return true; } - return false; } @@ -104,7 +124,7 @@ void Quote_iterator::construct_children () { Music_wrapper_iterator::construct_children (); - + SCM name = get_music ()->get_property ("quoted-context-type"); SCM id = get_music ()->get_property ("quoted-context-id"); @@ -116,9 +136,7 @@ Quote_iterator::construct_children () quote_outlet_.set_context (cue_context); } else - { - quote_outlet_.set_context (get_outlet ()); - } + quote_outlet_.set_context (get_outlet ()); event_vector_ = get_music ()->get_property ("quoted-events"); @@ -159,14 +177,14 @@ Quote_iterator::pending_moment () const Moment m (infty); if (Music_wrapper_iterator::ok ()) - m = m get_property ("instrumentTransposition")); + Pitch *me_pitch = unsmob_pitch (get_music ()->get_property ("quoted-transposition")); + if (!me_pitch) + me_pitch = unsmob_pitch (get_outlet ()->get_property ("instrumentTransposition")); + SCM cid = get_music ()->get_property ("quoted-context-id"); + bool is_cue = scm_is_string (cid) && (ly_scm2string (cid) == "cue"); for (SCM s = scm_cdr (entry); scm_is_pair (s); s = scm_cdr (s)) { SCM ev_acc = scm_car (s); - Music *mus = unsmob_music (scm_car (ev_acc)); - if (!mus) + Stream_event *ev = unsmob_stream_event (scm_car (ev_acc)); + if (!ev) programming_error ("no music found in quote"); - else if (accept_music_type (mus)) + else if (accept_music_type (ev, is_cue)) { + /* create a transposed copy if necessary */ if (quote_pitch || me_pitch) { Pitch qp, mp; @@ -241,18 +264,12 @@ Quote_iterator::process (Moment m) mp = *me_pitch; Pitch diff = pitch_interval (qp, mp); - - SCM copy = ly_music_deep_copy (mus->self_scm ()); - mus = unsmob_music (copy); - - transposed_musics_ = scm_cons (copy, transposed_musics_); - mus->transpose (diff); + ev = ev->clone (); + + transpose_mutable (ev->get_property_alist (true), diff); + transposed_musics_ = scm_cons (ev->unprotect (), transposed_musics_); } - - bool b = quote_outlet_.get_outlet ()->try_music (mus); - if (!b) - mus->origin ()->warning (_f ("in quotation: junking event %s", - mus->name ())); + quote_outlet_.get_outlet ()->event_source ()->broadcast (ev); } }