X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Flyric-combine-music-iterator.cc;h=5855ebc8f84bd26573d0032c9a7abe6c458722b4;hb=634ad74db688a5305f001917453c5cd15305c539;hp=4715b76998932167d4e52fcf01443b9e0e53e020;hpb=26633bbfbf821a7cfdfe7a0367d1ea94a440be2e;p=lilypond.git diff --git a/lily/lyric-combine-music-iterator.cc b/lily/lyric-combine-music-iterator.cc index 4715b76998..5855ebc8f8 100644 --- a/lily/lyric-combine-music-iterator.cc +++ b/lily/lyric-combine-music-iterator.cc @@ -1,14 +1,13 @@ /* - lyric-combine-music-iterator.cc -- implement Lyric_combine_music_iterator + lyric-combine-music-iterator.cc -- implement Lyric_combine_music_iterator source file of the GNU LilyPond music typesetter - (c) 1999--2003 Han-Wen Nienhuys + (c) 1999--2005 Han-Wen Nienhuys */ -#include "translator-group.hh" -#include "lyric-combine-music.hh" +#include "context.hh" #include "event.hh" #include "note-head.hh" #include "grob.hh" @@ -17,28 +16,45 @@ class Lyric_combine_music_iterator : public Music_iterator { public: - VIRTUAL_COPY_CONS (Music_iterator); Lyric_combine_music_iterator (); Lyric_combine_music_iterator (Lyric_combine_music_iterator const&src); - DECLARE_SCHEME_CALLBACK(constructor, ()); + DECLARE_SCHEME_CALLBACK (constructor, ()); protected: virtual void construct_children (); virtual Moment pending_moment () const; - virtual void do_quit(); + virtual void do_quit (); virtual void process (Moment); virtual Music_iterator *try_music_in_children (Music *) const; virtual bool ok () const; virtual void derived_mark () const; + virtual void derived_substitute (Context *, Context *) ; private: bool get_busy_status ()const ; bool melisma_busy (); + Music* get_combine_lyrics () const; + Music* get_combine_music () const; + Music_iterator * music_iter_; Music_iterator * lyric_iter_; }; +bool +melisma_busy (Context* tr) +{ + SCM melisma_properties = tr->get_property ("melismaBusyProperties"); + bool busy = false; + + for (; scm_is_pair (melisma_properties); + melisma_properties = scm_cdr (melisma_properties)) + busy = busy || to_boolean (tr->internal_get_property (scm_car (melisma_properties))); + + return busy; +} + + /* Ugh, why static? @@ -48,8 +64,8 @@ Music *melisma_playing_req; Lyric_combine_music_iterator::Lyric_combine_music_iterator () { - music_iter_ =0; - lyric_iter_ =0; + music_iter_ = 0; + lyric_iter_ = 0; if (!busy_req) { @@ -74,21 +90,50 @@ Lyric_combine_music_iterator::ok () const } void -Lyric_combine_music_iterator::derived_mark()const +Lyric_combine_music_iterator::derived_mark ()const { if (music_iter_) - scm_gc_mark (music_iter_->self_scm()); + scm_gc_mark (music_iter_->self_scm ()); if (lyric_iter_) - scm_gc_mark (lyric_iter_->self_scm()); + scm_gc_mark (lyric_iter_->self_scm ()); } +void +Lyric_combine_music_iterator::derived_substitute (Context *f, Context * t) +{ + if (music_iter_) + music_iter_->substitute_outlet (f, t); + if (lyric_iter_) + lyric_iter_->substitute_outlet (f, t); +} + +Music* +Lyric_combine_music_iterator::get_combine_music () const +{ + SCM l = get_music ()->get_property ("elements"); + if (!scm_is_pair (l)) + return 0; + return unsmob_music (scm_car (l)); +} + +Music* +Lyric_combine_music_iterator::get_combine_lyrics () const +{ + SCM l = get_music ()->get_property ("elements"); + if (!scm_is_pair (l)) + return 0; + l = scm_cdr (l); + if (!scm_is_pair (l)) + return 0; + return unsmob_music (scm_car (l)); +} + + void Lyric_combine_music_iterator::construct_children () { - Lyric_combine_music const * m = dynamic_cast (get_music ()); - - music_iter_ = unsmob_iterator (get_iterator (m->get_music ())); - lyric_iter_ = unsmob_iterator (get_iterator (m->get_lyrics ())); + music_iter_ = unsmob_iterator (get_iterator (get_combine_music ())); + lyric_iter_ = unsmob_iterator (get_iterator (get_combine_lyrics ())); } bool @@ -101,14 +146,14 @@ Lyric_combine_music_iterator::get_busy_status () const if (try_music (busy_req)) return true; - Translator_group * tr = music_iter_->report_to (); + Context * tr = music_iter_->get_outlet (); SCM grobs = tr->get_property ("busyGrobs"); - Moment now = tr->now_mom(); - for (; gh_pair_p (grobs); grobs = gh_cdr (grobs)) + Moment now = tr->now_mom (); + for (; scm_is_pair (grobs); grobs = scm_cdr (grobs)) { - SCM grob = gh_cdar (grobs); - Moment end =*unsmob_moment (gh_caar (grobs)); + SCM grob = scm_cdar (grobs); + Moment end =*unsmob_moment (scm_caar (grobs)); /* @@ -127,7 +172,7 @@ bool Lyric_combine_music_iterator::melisma_busy () { /* - We can not read the property, since music_iter_->report_to() might + We can not read the property, since music_iter_->get_outlet () might not be the context that sets the melisma properties, but rather a parent context. */ @@ -145,7 +190,7 @@ Lyric_combine_music_iterator::process (Moment m) if (get_busy_status () && !melisma_busy () && lyric_iter_->ok ()) { - Moment m= lyric_iter_->pending_moment (); + Moment m = lyric_iter_->pending_moment (); lyric_iter_->process (m); } } @@ -154,26 +199,9 @@ void Lyric_combine_music_iterator::do_quit () { if (music_iter_) - music_iter_->quit(); - if (lyric_iter_) - lyric_iter_->quit(); -} - -Lyric_combine_music_iterator::Lyric_combine_music_iterator (Lyric_combine_music_iterator const & src) - : Music_iterator (src) -{ - lyric_iter_ = 0; - music_iter_ = 0; - - if (src.lyric_iter_) - lyric_iter_ = src.lyric_iter_->clone (); - if (src.music_iter_) - music_iter_ = src.music_iter_->clone (); - + music_iter_->quit (); if (lyric_iter_) - scm_gc_unprotect_object (lyric_iter_->self_scm()); - if (music_iter_) - scm_gc_unprotect_object (music_iter_->self_scm()); + lyric_iter_->quit (); } Music_iterator*